10

Sto aggiornando un'applicazione Rails 2 a Rails 3 (codice non scritto da me). Il (codice ben testato) utilizza shoulda e Test :: Unit e utilizza ampiamente le macro should_create e should_change.Come disattivare in modo selettivo gli avvisi di deprecazione di Rails 3?

Capisco dal this discussion che i maintainer manutentori vogliono sbarazzarsi di entrambi i metodi ma che le persone che usano Test :: Unit non lo trovano necessario (non sono sicuro di cogliere l'intera discussione).

Anaway, c'è un modo per disattivare selettivamente gli avvisi di deprecazione per le macro specificate? So già da this posting che è possibile disattivare i warning di deprecazione in uscita di test Rake interamente impostando:

ActiveSupport::Deprecation.silenced = true 

nel file di ambiente di prova e so anche che si può mettere pezzi specifici di codice in un blocco per farli tacere:

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

quest'ultima è un'opzione, ma mi richiederebbe di andare oltre tutte le prove e racchiudere le macro should_create in un tale blocco. Quindi mi chiedevo se esistesse un modo per eliminare gli avvertimenti per macro specifici interamente con una sola impostazione di configurazione?

risposta

3

In realtà io stil aveva un sacco di altri warning di deprecazione di codice che è stato in plugin o gemme avevo installato. Per evitare la maggior parte di ciò, ho sovrascritto il metodo Deprecation :: warn in test_helper.rb. Così, invece di codice precedente, l'uso:

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 è necessario sostituire myrailsappname con il nome del app (il nome della cartella risiede in). C'è probabilmente un modo più generico per ottenere quel nome, ma non riuscivo a trovarlo in questo momento.

0

Penso di aver trovato una soluzione: in test/test_helper.rb ho riaperto il modulo e ho sovrascritto la definizione della macro con una definizione identica ma l'avviso di deprecazione è stato commentato. Ci sono probabilmente molto più elegante modi per fare questo, però ...

# 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

vecchia questione - ma se avete nuove svalutazioni che desideri ignorare selettivamente:

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 

Questo è per ActiveSupport 3.

+2

Funziona ancora in ActiveSupport 4. –

2

Posso consigliare un'alternativa?

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