Как избирательно отключить предупреждения об устаревании в Rails 3?
Я обновляю приложение Rails 2 до Rails 3 (код, написанный не мной). (Хорошо протестированный код) использует shoulda и Test::Unit и широко использует макросы should_create и should_change.
Из этого обсуждения я понимаю, что сопровождающие должны быть избавлены от обоих методов, но люди, использующие Test::Unit, не считают это необходимым (хотя я не уверен, что понимаю все обсуждение).
Anaway, есть ли способ выборочно отключить предупреждения об устаревании для указанных макросов? Из этой публикации я уже знаю, что вы можете полностью отключить предупреждения об устаревании в результатах теста Rake, установив:
ActiveSupport::Deprecation.silenced = true
в вашем файле тестовой среды, и я также знаю, что вы можете поместить определенные фрагменты кода в блок, чтобы заставить их замолчать:
ActiveSupport::Deprecation.silence do
# no warnings for any use of deprecated methods here
end
Последний вариант является опцией, но он потребует, чтобы я прошел все тесты и включил в такой блок макросы should_create. Поэтому мне было интересно, есть ли способ полностью исключить предупреждения для определенных макросов с помощью одного параметра конфигурации?
5 ответов
На самом деле у меня все еще было много других предупреждений об устаревании из кода, который был в плагинах или гемах, которые я установил. Чтобы избежать этого, я переписал метод Deprecation::warn в test_helper.rb. Так что вместо предыдущего кода используйте:
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
Кстати, вам нужно заменить myrailsappname на имя вашего приложения (имя папки, в которой оно находится). Возможно, есть более общий способ получить это имя, но я не смог найти его прямо сейчас.
Старый вопрос - но если у вас есть новые амортизации, вы хотели бы выборочно игнорировать:
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.
Могу ли я порекомендовать альтернативу?
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
Я думаю, что нашел решение: в 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
Создайте файл с именем
selective_deprecation_silencer.rb
в твоей
config/initializers
папка со следующим содержимым:
#place in the following array the messages you want to silence
silenced = [/Using a dynamic :action segment in a route is deprecated/,
/Using a dynamic :controller segment in a route is deprecated/]
silenced_expr = Regexp.new(silenced.join('|'))
ActiveSupport::Deprecation.behavior = lambda do |msg, stack, deprecation_horizon, gem_name|
unless msg =~ silenced_expr
ActiveSupport::Deprecation::DEFAULT_BEHAVIORS[:stderr].call(msg, stack, deprecation_horizon, gem_name)
end
end