Как выборочно отключить предупреждение об устаревании в Rails 3? - PullRequest
10 голосов
/ 04 февраля 2011

Я обновляю приложение Rails 2 до Rails 3 (код, написанный не мной). (Хорошо протестированный код) использует musta и 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 в такой блок. Поэтому мне было интересно, что существует способ полностью исключить предупреждения для определенных макросов с помощью одного параметра конфигурации?

Ответы [ 4 ]

6 голосов
/ 29 марта 2012

Старый вопрос - но если у вас есть новые амортизации, которые вы хотели бы выборочно игнорировать:

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 .

3 голосов
/ 07 февраля 2011

На самом деле у меня все еще было много других предупреждений об устаревании из кода, который был в плагинах или гемах, которые я установил.Чтобы избежать этого, я переписал метод 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 именем вашего приложения (имя папки, в которой оно находится).Возможно, есть более общий способ получить это имя, но я не смог найти его прямо сейчас.

2 голосов
/ 21 июня 2015

Могу ли я порекомендовать альтернативу?

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
0 голосов
/ 04 февраля 2011

Я думаю, что нашел решение: в 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   
...