2011-02-04 14 views
10

Estoy actualizando una aplicación de Rails 2 a Rails 3 (código no escrito por mí). El (código bien probado) usa shoulda y Test :: Unit, y usa extensamente las macros should_create y should_change.¿Cómo puedo silenciar las advertencias de depreciación de Rails 3 de forma selectiva?

Entiendo desde el this discussion que los mantenedores de shoulda quieren deshacerse de ambos métodos, pero que las personas que usan Test :: Unit no lo consideran necesario (aunque no estoy seguro de captar toda la discusión).

Anaway, ¿hay alguna forma de desactivar selectivamente las advertencias de desactivación para las macros especificadas? Ya sé de this posting que puede desactivar los avisos de obsolescencia en la salida de prueba Rake por completo mediante el establecimiento de:

ActiveSupport::Deprecation.silenced = true 

en su archivo de entorno de prueba y también sé que se puede poner piezas específicas de código en un bloque para conseguir que silenciadas:

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

Esta última es una opción, sino que me requieren para repasar todas las pruebas y adjuntar las macros should_create en un bloque de este tipo. Entonces, me preguntaba si había una manera de eliminar las advertencias para macros específicas por completo con una configuración única.

Respuesta

3

De hecho me stil tenía un montón de otras advertencias de obsolescencia de código que se encontraba en plugins o joyas que había instalados. Para evitar la mayor parte de eso, sobrescribí el método Deprecation :: warn en test_helper.rb. Así que en lugar del código anterior, utilice:

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 

cierto es necesario sustituir myrailsappname con el nombre de su aplicación (el nombre de la carpeta en la que reside en). Probablemente haya una forma más genérica de obtener ese nombre, pero no pude encontrarlo ahora.

0

Creo que he encontrado una solución: en test/test_helper.rb Volví a abrir el módulo y sobrescribí la definición de macro con una definición idéntica pero la advertencia de desactivación se comentó. Probablemente hay mucho más elegante maneras de hacer esto, sin embargo ...

# 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

vieja pregunta - pero si usted tiene nuevas depreciaciones que desea ignorar selectivamente:

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 

Esto es para ActiveSupport 3.

+2

Todavía funciona en ActiveSupport 4. –

2

¿Se puede recomendar una 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 
Cuestiones relacionadas