2011-02-04 19 views
10

मैं एक रेल 2 को रेल 3 एप्लिकेशन (मेरे द्वारा लिखित कोड) में अपग्रेड कर रहा हूं। (अच्छी तरह से परीक्षण कोड) कंधे और टेस्ट :: यूनिट का उपयोग करता है, और मैक्रोज़ का व्यापक रूप से उपयोग करता है और चाहिए_ चाहिए।मैं Rails 3 बहिष्करण चेतावनियों को चुनिंदा तरीके से कैसे म्यूट कर सकता हूं?

मैं this discussion से समझता हूं कि कंधे के रखरखाव दोनों विधियों से छुटकारा पाना चाहते हैं लेकिन टेस्ट :: यूनिट का उपयोग करने वाले लोग इसे आवश्यक नहीं पाते हैं (सुनिश्चित नहीं है कि मैं पूरी चर्चा को समझ रहा हूं)।

अनावे, निर्दिष्ट मैक्रोज़ के लिए बहिष्करण चेतावनियों को चुनिंदा रूप से बदलने का कोई तरीका है? मैं पहले से ही this posting से पता है कि तुम पूरी तरह से सेट करके रैक परीक्षण उत्पादन में समाप्त चेतावनियों को बंद कर सकते हैं:

ActiveSupport::Deprecation.silenced = true 
अपने परीक्षण वातावरण फ़ाइल में

और मुझे यह भी पता है कि आप एक ब्लॉक में कोड के विशिष्ट टुकड़े डाल सकते हैं उन्हें मिल खामोश करने के लिए:

ActiveSupport::Deprecation.silence do 
# no warnings for any use of deprecated methods here 
end 

बाद एक विकल्प है लेकिन मेरे सभी परीक्षणों पर जाने के लिए और इस तरह के एक ब्लॉक में should_create मैक्रो को संलग्न करने की आवश्यकता होगी। तो मैं सोच रहा था कि विशिष्ट मैक्रोज़ के लिए पूरी तरह से एक कॉन्फ़िगरेशन सेटिंग के साथ चेतावनियों को खत्म करने का कोई तरीका था?

उत्तर

3

वास्तव में मैं stil कोड से अन्य प्रतिवाद चेतावनी है कि प्लग इन या जवाहरात मैं स्थापित किया था में था की बहुत सारी था। उसमें से अधिकांश से बचने के लिए, मैं test_helper.rb में Deprecation :: चेतावनी विधि को ओवरराइट करता हूं। तो बजाय पिछले कोड, उपयोग की:

module ActiveSupport 
    module Deprecation 
    class << self 
     def warn(message = nil, callstack = caller) 
     # modif pvh the following lines make sure no deprecation warnings are sent 
     # for code that is 
     # not by my but in some gem or plugin... 
     return if silenced || callstack.grep(/myrailsappname/).blank? 
     # return if silenced 
     deprecation_message(callstack, message).tap do |m| 
      behavior.each { |b| b.call(m, callstack) } 
     end 
     end 
    end 
    end 
end 

BTW आप अपने ऐप का नाम (फ़ोल्डर यह में रहता है के नाम) के साथ myrailsappname को बदलने के लिए की जरूरत है। उस नाम को पाने का शायद एक और सामान्य तरीका है, लेकिन मुझे अभी यह नहीं मिला।

0

मुझे लगता है कि मुझे एक समाधान मिला है: test/test_helper.rb में मैंने मॉड्यूल को दोबारा खोल दिया और एक समान परिभाषा के साथ मैक्रो परिभाषा को ओवरराइट किया लेकिन बहिष्करण चेतावनी टिप्पणी की। वहाँ शायद और अधिक सुंदर हैं हालांकि इस करने के लिए तरीके ...

# modif pvh DEPREC 
# reopen the module and silence the deprecation statement to avoid 
# having my results overflown by these deprecation warnings... 
module Shoulda # :nodoc: 
    module Macros 
    def should_create(class_name) 
     ##::ActiveSupport::Deprecation.warn 
     should_change_record_count_of(class_name, 1, 'create') 
    end 
    end 
end 
6

पुराना सवाल - लेकिन आप नए depreciations आप चुनिंदा ध्यान नहीं देना चाहते हैं, तो:

ActiveSupport::Deprecation.behavior = lambda do |msg, stack| 
    unless /LIBRARY_NAME/ =~ msg 
    ActiveSupport::Deprecation::DEFAULT_BEHAVIORS[:stderr].call(msg,stack) # whichever handlers you want - this is the default 
    end 
end 

यह ActiveSupport 3 के लिए है।

+2

अभी भी ActiveSupport 4 में काम करता है। –

2

क्या मैं एक विकल्प की सिफारिश कर सकता हूं?

module ActiveSupport 
    class Deprecation 
    module Reporting 
     # Mute specific deprecation messages 
     def warn(message = nil, callstack = nil) 
     return if message.match(/Automatic updating of counter caches/) 

     super 
     end 
    end 
    end 
end