Fix includes of deprecation proxy modules

Previously, including/prepending/extending one of these deprecated
constants would silently succeed, since it is a module.

This adds a defintion for append_features/prepend_features/extended so
that it can forward the inclusion onto the target module.
This commit is contained in:
John Hawthorn 2022-06-02 14:43:40 -07:00
parent 693c14c54d
commit 6a2393ff6b
2 changed files with 52 additions and 0 deletions

View File

@ -158,6 +158,21 @@ module ActiveSupport
target.class
end
def append_features(base)
@deprecator.warn(@message, caller_locations)
base.include(target)
end
def prepend_features(base)
@deprecator.warn(@message, caller_locations)
base.prepend(target)
end
def extended(base)
@deprecator.warn(@message, caller_locations)
base.extend(target)
end
private
def target
ActiveSupport::Inflector.constantize(@new_const.to_s)

View File

@ -7,6 +7,12 @@ class ProxyWrappersTest < ActiveSupport::TestCase
Waffles = false
NewWaffles = :hamburgers
module WaffleModule
def waffle?
true
end
end
def test_deprecated_object_proxy_doesnt_wrap_falsy_objects
proxy = ActiveSupport::Deprecation::DeprecatedObjectProxy.new(nil, "message")
assert_not proxy
@ -21,4 +27,35 @@ class ProxyWrappersTest < ActiveSupport::TestCase
proxy = ActiveSupport::Deprecation::DeprecatedConstantProxy.new(Waffles, NewWaffles)
assert_not proxy
end
def test_including_proxy_module
proxy = ActiveSupport::Deprecation::DeprecatedConstantProxy.new("OldWaffleModule", WaffleModule.name)
klass = Class.new
assert_deprecated do
klass.include proxy
end
assert klass.new.waffle?
end
def test_prepending_proxy_module
proxy = ActiveSupport::Deprecation::DeprecatedConstantProxy.new("OldWaffleModule", WaffleModule.name)
klass = Class.new do
def waffle?
false
end
end
assert_deprecated do
klass.prepend proxy
end
assert klass.new.waffle?
end
def test_extending_proxy_module
proxy = ActiveSupport::Deprecation::DeprecatedConstantProxy.new("OldWaffleModule", WaffleModule.name)
obj = Object.new
assert_deprecated do
obj.extend proxy
end
assert obj.waffle?
end
end