1
0
Fork 0
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:
Yves Senn 2016-08-08 12:35:29 +02:00
parent 9047d9e7a8
commit 3469a1b51e
3 changed files with 48 additions and 4 deletions

View file

@ -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.

View file

@ -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

View file

@ -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