Apply instance delegators to application deprecators when available

This restores the 7.0 behavior of the instance delegator impacting all
deprecations from Rails.
This commit is contained in:
Étienne Barrié 2023-03-10 14:03:19 +01:00
parent e5af9c298a
commit 0f0aa86091
2 changed files with 72 additions and 1 deletions

@ -19,6 +19,7 @@ def method_added(method_name)
use_instead =
case method_name
when :silence, :behavior=, :disallowed_behavior=, :disallowed_warnings=, :silenced=, :debug=
target = "(defined?(Rails.application.deprecators) ? Rails.application.deprecators : ActiveSupport::Deprecation.instance)"
"Rails.application.deprecators.#{method_name}"
when :warn, :deprecate_methods, :gem_name, :gem_name=, :deprecation_horizon, :deprecation_horizon=
"your own Deprecation object"
@ -26,9 +27,10 @@ def method_added(method_name)
"Rails.application.deprecators[framework].#{method_name} where framework is for example :active_record"
end
args = /[^\]]=\z/.match?(method_name) ? "arg" : "..."
target ||= "ActiveSupport::Deprecation.instance"
singleton_class.module_eval <<~RUBY, __FILE__, __LINE__ + 1
def #{method_name}(#{args})
ActiveSupport::Deprecation.instance.#{method_name}(#{args})
#{target}.#{method_name}(#{args})
ensure
ActiveSupport.deprecator.warn("Calling #{method_name} on ActiveSupport::Deprecation is deprecated and will be removed from Rails (use #{use_instead} instead)")
end

@ -779,6 +779,18 @@ def method
end
end
test "silence delegator is deprecated and delegates to the application's deprecators when available" do
with_rails_application_deprecators do
assert_deprecated("use Rails.application.deprecators.silence instead", ActiveSupport.deprecator) do
ActiveSupport::Deprecation.silence do
assert_not_deprecated(@deprecator) do
@deprecator.warn
end
end
end
end
end
test "allow delegator is deprecated" do
assert_deprecated("use Rails.application.deprecators[framework].allow", ActiveSupport.deprecator) do
ActiveSupport::Deprecation.allow { }
@ -797,6 +809,17 @@ def method
ActiveSupport::Deprecation.instance.behavior = old_behavior
end
test "behavior= delegator is deprecated and delegates to the application's deprecators when available" do
with_rails_application_deprecators do
called = false
assert_deprecated("use Rails.application.deprecators.behavior= instead", ActiveSupport.deprecator) do
ActiveSupport::Deprecation.behavior = ->(*) { called = true }
@deprecator.warn
end
assert called
end
end
test "disallowed_behavior delegators are deprecated" do
old_behavior = ActiveSupport::Deprecation.instance.disallowed_behavior
assert_deprecated("use Rails.application.deprecators[framework].disallowed_behavior", ActiveSupport.deprecator) do
@ -809,6 +832,18 @@ def method
ActiveSupport::Deprecation.instance.disallowed_behavior = old_behavior
end
test "disallowed_behavior= delegators is deprecated and delegates to the application's deprecators when available" do
with_rails_application_deprecators do
called = false
assert_deprecated("use Rails.application.deprecators.disallowed_behavior= instead", ActiveSupport.deprecator) do
ActiveSupport::Deprecation.disallowed_behavior = ->(*) { called = true }
end
@deprecator.disallowed_warnings = :all
@deprecator.warn
assert called
end
end
test "debug delegators are deprecated" do
old_debug = ActiveSupport::Deprecation.instance.debug
assert_deprecated("use Rails.application.deprecators[framework].debug", ActiveSupport.deprecator) do
@ -821,6 +856,15 @@ def method
ActiveSupport::Deprecation.instance.debug = old_debug
end
test "debug= delegator is deprecated and delegates to the application's deprecators when available" do
with_rails_application_deprecators do
assert_deprecated("use Rails.application.deprecators.debug= instead", ActiveSupport.deprecator) do
ActiveSupport::Deprecation.debug = true
end
assert @deprecator.debug
end
end
test "silenced delegators are deprecated" do
old_silenced = ActiveSupport::Deprecation.instance.silenced
assert_deprecated("use Rails.application.deprecators[framework].silenced", ActiveSupport.deprecator) do
@ -833,6 +877,15 @@ def method
ActiveSupport::Deprecation.instance.silenced = old_silenced
end
test "silenced= delegator is deprecated and delegates to the application's deprecators when available" do
with_rails_application_deprecators do
assert_deprecated("use Rails.application.deprecators.silenced= instead", ActiveSupport.deprecator) do
ActiveSupport::Deprecation.silenced = true
end
assert @deprecator.silenced
end
end
test "disallowed_warnings delegators are deprecated" do
old_disallowed_warnings = ActiveSupport::Deprecation.instance.disallowed_warnings
assert_deprecated("use Rails.application.deprecators[framework].disallowed_warnings", ActiveSupport.deprecator) do
@ -845,6 +898,15 @@ def method
ActiveSupport::Deprecation.instance.disallowed_warnings = old_disallowed_warnings
end
test "disallowed_warnings= delegator is deprecated and delegates to the application's deprecators when available" do
with_rails_application_deprecators do
assert_deprecated("use Rails.application.deprecators.disallowed_warnings= instead", ActiveSupport.deprecator) do
ActiveSupport::Deprecation.disallowed_warnings = :all
end
assert_equal :all, @deprecator.disallowed_warnings
end
end
test "gem_name delegators are deprecated" do
old_gem_name = ActiveSupport::Deprecation.instance.gem_name
assert_deprecated("use your own Deprecation object instead", ActiveSupport.deprecator) do
@ -881,6 +943,13 @@ def method_that_emits_deprecation(deprecator)
deprecator.warn
end
def with_rails_application_deprecators(&block)
application = Struct.new(:deprecators).new(ActiveSupport::Deprecation::Deprecators.new)
rails = Struct.new(:application).new(application)
rails.application.deprecators[:deprecator] = @deprecator
stub_const(Object, :Rails, rails, &block)
end
def deprecator_with_messages
klass = Class.new(ActiveSupport::Deprecation)
deprecator = klass.new