mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #25681 from willnet/fix-thread_mattr_accessor
Fix `thread_mattr_accessor` share variable superclass with subclass
This commit is contained in:
parent
9047d9e7a8
commit
3469a1b51e
3 changed files with 48 additions and 4 deletions
|
@ -1,3 +1,31 @@
|
|||
* Fix `thread_mattr_accessor` subclass no longer overwrites parent.
|
||||
|
||||
Assigning a value to a subclass using `thread_mattr_accessor` no
|
||||
longer changes the value of the parent class. This brings the
|
||||
behavior inline with the documentation.
|
||||
|
||||
Given:
|
||||
|
||||
class Account
|
||||
thread_mattr_accessor :user
|
||||
end
|
||||
|
||||
class Customer < Account
|
||||
end
|
||||
|
||||
Account.user = "DHH"
|
||||
Customer.user = "Rafael"
|
||||
|
||||
Before:
|
||||
|
||||
Account.user # => "Rafael"
|
||||
|
||||
After:
|
||||
|
||||
Account.user # => "DHH"
|
||||
|
||||
*Shinichi Maeshima*
|
||||
|
||||
* Since weeks are no longer converted to days, add `:weeks` to the list of
|
||||
parts that `ActiveSupport::TimeWithZone` will recognize as possibly being
|
||||
of variable duration to take account of DST transitions.
|
||||
|
|
|
@ -40,14 +40,14 @@ class Module
|
|||
raise NameError.new("invalid attribute name: #{sym}") unless sym =~ /^[_A-Za-z]\w*$/
|
||||
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
||||
def self.#{sym}
|
||||
Thread.current[:"attr_#{name}_#{sym}"]
|
||||
Thread.current["attr_"+ name + "_#{sym}"]
|
||||
end
|
||||
EOS
|
||||
|
||||
unless options[:instance_reader] == false || options[:instance_accessor] == false
|
||||
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
||||
def #{sym}
|
||||
Thread.current[:"attr_#{name}_#{sym}"]
|
||||
Thread.current["attr_"+ self.class.name + "_#{sym}"]
|
||||
end
|
||||
EOS
|
||||
end
|
||||
|
@ -79,14 +79,14 @@ class Module
|
|||
raise NameError.new("invalid attribute name: #{sym}") unless sym =~ /^[_A-Za-z]\w*$/
|
||||
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
||||
def self.#{sym}=(obj)
|
||||
Thread.current[:"attr_#{name}_#{sym}"] = obj
|
||||
Thread.current["attr_"+ name + "_#{sym}"] = obj
|
||||
end
|
||||
EOS
|
||||
|
||||
unless options[:instance_writer] == false || options[:instance_accessor] == false
|
||||
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
||||
def #{sym}=(obj)
|
||||
Thread.current[:"attr_#{name}_#{sym}"] = obj
|
||||
Thread.current["attr_"+ self.class.name + "_#{sym}"] = obj
|
||||
end
|
||||
EOS
|
||||
end
|
||||
|
|
|
@ -8,6 +8,12 @@ class ModuleAttributeAccessorPerThreadTest < ActiveSupport::TestCase
|
|||
thread_mattr_accessor :bar, instance_writer: false
|
||||
thread_mattr_reader :shaq, instance_reader: false
|
||||
thread_mattr_accessor :camp, instance_accessor: false
|
||||
|
||||
def self.name; "MyClass" end
|
||||
end
|
||||
|
||||
@subclass = Class.new(@class) do
|
||||
def self.name; "SubMyClass" end
|
||||
end
|
||||
|
||||
@object = @class.new
|
||||
|
@ -112,4 +118,14 @@ class ModuleAttributeAccessorPerThreadTest < ActiveSupport::TestCase
|
|||
|
||||
assert_equal @class.foo, @object.foo
|
||||
end
|
||||
|
||||
def test_should_not_affect_superclass_if_subclass_set_value
|
||||
@class.foo = "super"
|
||||
assert_equal @class.foo, "super"
|
||||
assert_nil @subclass.foo
|
||||
|
||||
@subclass.foo = "sub"
|
||||
assert_equal @class.foo, "super"
|
||||
assert_equal @subclass.foo, "sub"
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue