2011-02-04 20 views
10

Aktualizuję aplikację Rails 2 na Rails 3 (kod nie został napisany przeze mnie). (Dobrze przetestowany kod) używa shoulda i Test :: Unit, i intensywnie używa makr should_create i should_change.Jak selektywnie wyłączyć ostrzeżenia o wycofaniu z Rails 3?

Rozumiem z this discussion, że opiekunowie shoulda chcą pozbyć się obu metod, ale ludzie używający Test :: Unit nie uznają tego za konieczne (nie jestem pewien, czy rozumiem całą dyskusję).

Anaway, czy istnieje sposób selektywnego wyłączania ostrzeżeń o wycofaniu dla określonych makr? Już wiem od this posting że można wyłączyć ostrzeżenia amortyzację w wyjścia testowego Rake całkowicie przez ustawienie:

ActiveSupport::Deprecation.silenced = true 

w pliku środowisku testowym i wiem też, że można umieścić konkretne fragmenty kodu w bloku aby je uciszyć:

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

ten ostatni jest opcja, ale wymagałoby mi przejść wszystkie testy i załączyć makr should_create w takim bloku. Zastanawiam się, czy istnieje sposób na wyeliminowanie ostrzeżeń dotyczących określonych makr całkowicie za pomocą jednego ustawienia konfiguracyjnego?

Odpowiedz

3

W rzeczywistości stil miał wiele innych ostrzeżeń Wycofanie z kodem, który wtyczek lub klejnotów miałem zainstalowane. Aby tego uniknąć, nadpisałem metodę Deprecation :: warn w test_helper.rb. Więc zamiast poprzednim kodzie użytku:

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 trzeba zastąpić myrailsappname ze swojej aplikacji nazwy (nazwa folderu to zamieszkuje). Prawdopodobnie istnieje bardziej ogólny sposób na uzyskanie tego imienia, ale nie mogłem go teraz znaleźć.

0

Myślę, że znalazłem rozwiązanie: w test/test_helper.rb ponownie otworzyłem moduł i nadpisałem definicję makra z identyczną definicją, ale ostrzeżenie o wycofaniu zostało skomentowane. Prawdopodobnie istnieje wiele bardziej elegancki sposobów na to mimo ...

# 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

Old pytanie - ale jeśli masz nowe odpisami amortyzacyjnymi, które chcesz selektywnie ignorować:

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 

To jest dla ActiveSupport 3.

+2

Nadal działa w ActiveSupport 4. –

2

Czy mogę polecić alternatywę?

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 
Powiązane problemy