lib/active_support/deprecation/reporting.rb in activesupport-6.0.6.1 vs lib/active_support/deprecation/reporting.rb in activesupport-6.1.0.rc1
- old
+ new
@@ -4,11 +4,11 @@
module ActiveSupport
class Deprecation
module Reporting
# Whether to print a message (silent mode)
- attr_accessor :silenced
+ attr_writer :silenced
# Name of gem where method is deprecated
attr_accessor :gem_name
# Outputs a deprecation warning to the output configured by
# <tt>ActiveSupport::Deprecation.behavior</tt>.
@@ -18,11 +18,15 @@
def warn(message = nil, callstack = nil)
return if silenced
callstack ||= caller_locations(2)
deprecation_message(callstack, message).tap do |m|
- behavior.each { |b| b.call(m, callstack, deprecation_horizon, gem_name) }
+ if deprecation_disallowed?(message)
+ disallowed_behavior.each { |b| b.call(m, callstack, deprecation_horizon, gem_name) }
+ else
+ behavior.each { |b| b.call(m, callstack, deprecation_horizon, gem_name) }
+ end
end
end
# Silence deprecation warnings within the block.
#
@@ -31,14 +35,53 @@
#
# ActiveSupport::Deprecation.silence do
# ActiveSupport::Deprecation.warn('something broke!')
# end
# # => nil
- def silence
- old_silenced, @silenced = @silenced, true
- yield
- ensure
- @silenced = old_silenced
+ def silence(&block)
+ @silenced_thread.bind(true, &block)
+ end
+
+ # Allow previously disallowed deprecation warnings within the block.
+ # <tt>allowed_warnings</tt> can be an array containing strings, symbols, or regular
+ # expressions. (Symbols are treated as strings). These are compared against
+ # the text of deprecation warning messages generated within the block.
+ # Matching warnings will be exempt from the rules set by
+ # +ActiveSupport::Deprecation.disallowed_warnings+
+ #
+ # The optional <tt>if:</tt> argument accepts a truthy/falsy value or an object that
+ # responds to <tt>.call</tt>. If truthy, then matching warnings will be allowed.
+ # If falsey then the method yields to the block without allowing the warning.
+ #
+ # ActiveSupport::Deprecation.disallowed_behavior = :raise
+ # ActiveSupport::Deprecation.disallowed_warnings = [
+ # "something broke"
+ # ]
+ #
+ # ActiveSupport::Deprecation.warn('something broke!')
+ # # => ActiveSupport::DeprecationException
+ #
+ # ActiveSupport::Deprecation.allow ['something broke'] do
+ # ActiveSupport::Deprecation.warn('something broke!')
+ # end
+ # # => nil
+ #
+ # ActiveSupport::Deprecation.allow ['something broke'], if: Rails.env.production? do
+ # ActiveSupport::Deprecation.warn('something broke!')
+ # end
+ # # => ActiveSupport::DeprecationException for dev/test, nil for production
+ def allow(allowed_warnings = :all, if: true, &block)
+ conditional = binding.local_variable_get(:if)
+ conditional = conditional.call if conditional.respond_to?(:call)
+ if conditional
+ @explicitly_allowed_warnings.bind(allowed_warnings, &block)
+ else
+ yield
+ end
+ end
+
+ def silenced
+ @silenced || @silenced_thread.value
end
def deprecation_warning(deprecated_method_name, message = nil, caller_backtrace = nil)
caller_backtrace ||= caller_locations(2)
deprecated_method_warning(deprecated_method_name, message).tap do |msg|