mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #16938 from akshay-vishnoi/remove-deprication
Remove `.superclass_delegating_accessor`.
This commit is contained in:
commit
b8c31fd9b9
5 changed files with 5 additions and 169 deletions
|
@ -5,7 +5,6 @@ require 'active_support/dependencies'
|
||||||
require 'active_support/descendants_tracker'
|
require 'active_support/descendants_tracker'
|
||||||
require 'active_support/time'
|
require 'active_support/time'
|
||||||
require 'active_support/core_ext/module/attribute_accessors'
|
require 'active_support/core_ext/module/attribute_accessors'
|
||||||
require 'active_support/core_ext/class/delegating_attributes'
|
|
||||||
require 'active_support/core_ext/array/extract_options'
|
require 'active_support/core_ext/array/extract_options'
|
||||||
require 'active_support/core_ext/hash/deep_merge'
|
require 'active_support/core_ext/hash/deep_merge'
|
||||||
require 'active_support/core_ext/hash/slice'
|
require 'active_support/core_ext/hash/slice'
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
* Remove deprecated `Class#superclass_delegating_accessor`.
|
||||||
|
Use `Class#class_attribute` instead.
|
||||||
|
|
||||||
|
*Akshay Vishnoi*
|
||||||
|
|
||||||
* Patch `Delegator` to work with `#try`.
|
* Patch `Delegator` to work with `#try`.
|
||||||
|
|
||||||
Fixes #5790.
|
Fixes #5790.
|
||||||
|
|
|
@ -1,3 +1,2 @@
|
||||||
require 'active_support/core_ext/class/attribute'
|
require 'active_support/core_ext/class/attribute'
|
||||||
require 'active_support/core_ext/class/delegating_attributes'
|
|
||||||
require 'active_support/core_ext/class/subclasses'
|
require 'active_support/core_ext/class/subclasses'
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
require 'active_support/core_ext/kernel/singleton_class'
|
|
||||||
require 'active_support/core_ext/module/remove_method'
|
|
||||||
require 'active_support/core_ext/module/deprecation'
|
|
||||||
|
|
||||||
|
|
||||||
class Class
|
|
||||||
def superclass_delegating_accessor(name, options = {})
|
|
||||||
# Create private _name and _name= methods that can still be used if the public
|
|
||||||
# methods are overridden.
|
|
||||||
_superclass_delegating_accessor("_#{name}", options)
|
|
||||||
|
|
||||||
# Generate the public methods name, name=, and name?.
|
|
||||||
# These methods dispatch to the private _name, and _name= methods, making them
|
|
||||||
# overridable.
|
|
||||||
singleton_class.send(:define_method, name) { send("_#{name}") }
|
|
||||||
singleton_class.send(:define_method, "#{name}?") { !!send("_#{name}") }
|
|
||||||
singleton_class.send(:define_method, "#{name}=") { |value| send("_#{name}=", value) }
|
|
||||||
|
|
||||||
# If an instance_reader is needed, generate public instance methods name and name?.
|
|
||||||
if options[:instance_reader] != false
|
|
||||||
define_method(name) { send("_#{name}") }
|
|
||||||
define_method("#{name}?") { !!send("#{name}") }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
deprecate superclass_delegating_accessor: :class_attribute
|
|
||||||
|
|
||||||
private
|
|
||||||
# Take the object being set and store it in a method. This gives us automatic
|
|
||||||
# inheritance behavior, without having to store the object in an instance
|
|
||||||
# variable and look up the superclass chain manually.
|
|
||||||
def _stash_object_in_method(object, method, instance_reader = true)
|
|
||||||
singleton_class.remove_possible_method(method)
|
|
||||||
singleton_class.send(:define_method, method) { object }
|
|
||||||
remove_possible_method(method)
|
|
||||||
define_method(method) { object } if instance_reader
|
|
||||||
end
|
|
||||||
|
|
||||||
def _superclass_delegating_accessor(name, options = {})
|
|
||||||
singleton_class.send(:define_method, "#{name}=") do |value|
|
|
||||||
_stash_object_in_method(value, name, options[:instance_reader] != false)
|
|
||||||
end
|
|
||||||
send("#{name}=", nil)
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,122 +0,0 @@
|
||||||
require 'abstract_unit'
|
|
||||||
require 'active_support/core_ext/class/delegating_attributes'
|
|
||||||
|
|
||||||
module DelegatingFixtures
|
|
||||||
class Parent
|
|
||||||
end
|
|
||||||
|
|
||||||
class Child < Parent
|
|
||||||
ActiveSupport::Deprecation.silence do
|
|
||||||
superclass_delegating_accessor :some_attribute
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
class Mokopuna < Child
|
|
||||||
end
|
|
||||||
|
|
||||||
class PercysMom
|
|
||||||
ActiveSupport::Deprecation.silence do
|
|
||||||
superclass_delegating_accessor :superpower
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
class Percy < PercysMom
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
class DelegatingAttributesTest < ActiveSupport::TestCase
|
|
||||||
include DelegatingFixtures
|
|
||||||
attr_reader :single_class
|
|
||||||
|
|
||||||
def setup
|
|
||||||
@single_class = Class.new(Object)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_simple_accessor_declaration
|
|
||||||
assert_deprecated do
|
|
||||||
single_class.superclass_delegating_accessor :both
|
|
||||||
end
|
|
||||||
|
|
||||||
# Class should have accessor and mutator
|
|
||||||
# the instance should have an accessor only
|
|
||||||
assert_respond_to single_class, :both
|
|
||||||
assert_respond_to single_class, :both=
|
|
||||||
assert single_class.public_instance_methods.map(&:to_s).include?("both")
|
|
||||||
assert !single_class.public_instance_methods.map(&:to_s).include?("both=")
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_simple_accessor_declaration_with_instance_reader_false
|
|
||||||
_instance_methods = single_class.public_instance_methods
|
|
||||||
|
|
||||||
assert_deprecated do
|
|
||||||
single_class.superclass_delegating_accessor :no_instance_reader, :instance_reader => false
|
|
||||||
end
|
|
||||||
|
|
||||||
assert_respond_to single_class, :no_instance_reader
|
|
||||||
assert_respond_to single_class, :no_instance_reader=
|
|
||||||
assert !_instance_methods.include?(:no_instance_reader)
|
|
||||||
assert !_instance_methods.include?(:no_instance_reader?)
|
|
||||||
assert !_instance_methods.include?(:_no_instance_reader)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_working_with_simple_attributes
|
|
||||||
assert_deprecated do
|
|
||||||
single_class.superclass_delegating_accessor :both
|
|
||||||
end
|
|
||||||
|
|
||||||
single_class.both = "HMMM"
|
|
||||||
|
|
||||||
assert_equal "HMMM", single_class.both
|
|
||||||
assert_equal true, single_class.both?
|
|
||||||
|
|
||||||
assert_equal "HMMM", single_class.new.both
|
|
||||||
assert_equal true, single_class.new.both?
|
|
||||||
|
|
||||||
single_class.both = false
|
|
||||||
assert_equal false, single_class.both?
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_child_class_delegates_to_parent_but_can_be_overridden
|
|
||||||
parent = Class.new
|
|
||||||
|
|
||||||
assert_deprecated do
|
|
||||||
parent.superclass_delegating_accessor :both
|
|
||||||
end
|
|
||||||
|
|
||||||
child = Class.new(parent)
|
|
||||||
parent.both = "1"
|
|
||||||
assert_equal "1", child.both
|
|
||||||
|
|
||||||
child.both = "2"
|
|
||||||
assert_equal "1", parent.both
|
|
||||||
assert_equal "2", child.both
|
|
||||||
|
|
||||||
parent.both = "3"
|
|
||||||
assert_equal "3", parent.both
|
|
||||||
assert_equal "2", child.both
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_delegation_stops_at_the_right_level
|
|
||||||
assert_nil Percy.superpower
|
|
||||||
assert_nil PercysMom.superpower
|
|
||||||
|
|
||||||
PercysMom.superpower = :heatvision
|
|
||||||
assert_equal :heatvision, Percy.superpower
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_delegation_stops_for_nil
|
|
||||||
Mokopuna.some_attribute = nil
|
|
||||||
Child.some_attribute="1"
|
|
||||||
|
|
||||||
assert_equal "1", Child.some_attribute
|
|
||||||
assert_nil Mokopuna.some_attribute
|
|
||||||
ensure
|
|
||||||
Child.some_attribute=nil
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_deprecation_warning
|
|
||||||
assert_deprecated(/superclass_delegating_accessor is deprecated/) do
|
|
||||||
single_class.superclass_delegating_accessor :test_attribute
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
Loading…
Reference in a new issue