diff options
Diffstat (limited to 'activesupport')
-rw-r--r-- | activesupport/CHANGELOG | 2 | ||||
-rw-r--r-- | activesupport/lib/active_support/core_ext/class/attribute_accessors.rb | 4 | ||||
-rw-r--r-- | activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb | 10 | ||||
-rw-r--r-- | activesupport/lib/active_support/core_ext/module/attribute_accessors.rb | 6 | ||||
-rw-r--r-- | activesupport/test/core_ext/class/attribute_accessor_test.rb | 31 | ||||
-rw-r--r-- | activesupport/test/core_ext/class/class_inheritable_attributes_test.rb (renamed from activesupport/test/class_inheritable_attributes_test.rb) | 40 | ||||
-rw-r--r-- | activesupport/test/core_ext/module/attr_accessor_with_default.rb | 30 | ||||
-rw-r--r-- | activesupport/test/core_ext/module/attribute_accessor_test.rb | 33 |
8 files changed, 154 insertions, 2 deletions
diff --git a/activesupport/CHANGELOG b/activesupport/CHANGELOG index 265dd53297..5c0e062403 100644 --- a/activesupport/CHANGELOG +++ b/activesupport/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Added :instance_writer option to #mattr_writer/accessor, #cattr_writer/accessor, and #class_inheritable_writer to skip the creation of the instance writer. [Rick] + * Added Hash#to_query to turn a hash of values into a form-encoded query string [Nicholas Seckar] * Increase test coverage for subclasses_of. Closes #7335. [Roman2K, Nicholas Seckar] diff --git a/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb b/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb index 93a7d48f69..79247e00cb 100644 --- a/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb +++ b/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb @@ -3,6 +3,7 @@ class Class # :nodoc: def cattr_reader(*syms) syms.flatten.each do |sym| + next if sym.is_a?(Hash) class_eval(<<-EOS, __FILE__, __LINE__) unless defined? @@#{sym} @@#{sym} = nil @@ -20,6 +21,7 @@ class Class # :nodoc: end def cattr_writer(*syms) + options = syms.last.is_a?(Hash) ? syms.pop : {} syms.flatten.each do |sym| class_eval(<<-EOS, __FILE__, __LINE__) unless defined? @@#{sym} @@ -30,9 +32,11 @@ class Class # :nodoc: @@#{sym} = obj end + #{" def #{sym}=(obj) @@#{sym} = obj end + " unless options[:instance_writer] == false } EOS end end diff --git a/activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb b/activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb index bc8bf09ab2..3c5b2b8340 100644 --- a/activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb +++ b/activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb @@ -9,6 +9,7 @@ end class Class # :nodoc: def class_inheritable_reader(*syms) syms.each do |sym| + next if sym.is_a?(Hash) class_eval <<-EOS def self.#{sym} read_inheritable_attribute(:#{sym}) @@ -22,43 +23,52 @@ class Class # :nodoc: end def class_inheritable_writer(*syms) + options = syms.last.is_a?(Hash) ? syms.pop : {} syms.each do |sym| class_eval <<-EOS def self.#{sym}=(obj) write_inheritable_attribute(:#{sym}, obj) end + #{" def #{sym}=(obj) self.class.#{sym} = obj end + " unless options[:instance_writer] == false } EOS end end def class_inheritable_array_writer(*syms) + options = syms.last.is_a?(Hash) ? syms.pop : {} syms.each do |sym| class_eval <<-EOS def self.#{sym}=(obj) write_inheritable_array(:#{sym}, obj) end + #{" def #{sym}=(obj) self.class.#{sym} = obj end + " unless options[:instance_writer] == false } EOS end end def class_inheritable_hash_writer(*syms) + options = syms.last.is_a?(Hash) ? syms.pop : {} syms.each do |sym| class_eval <<-EOS def self.#{sym}=(obj) write_inheritable_hash(:#{sym}, obj) end + #{" def #{sym}=(obj) self.class.#{sym} = obj end + " unless options[:instance_writer] == false } EOS end end diff --git a/activesupport/lib/active_support/core_ext/module/attribute_accessors.rb b/activesupport/lib/active_support/core_ext/module/attribute_accessors.rb index fe4f8a4fc0..8127150a96 100644 --- a/activesupport/lib/active_support/core_ext/module/attribute_accessors.rb +++ b/activesupport/lib/active_support/core_ext/module/attribute_accessors.rb @@ -3,6 +3,7 @@ class Module # :nodoc: def mattr_reader(*syms) syms.each do |sym| + next if sym.is_a?(Hash) class_eval(<<-EOS, __FILE__, __LINE__) unless defined? @@#{sym} @@#{sym} = nil @@ -20,6 +21,7 @@ class Module # :nodoc: end def mattr_writer(*syms) + options = syms.last.is_a?(Hash) ? syms.pop : {} syms.each do |sym| class_eval(<<-EOS, __FILE__, __LINE__) unless defined? @@#{sym} @@ -29,10 +31,12 @@ class Module # :nodoc: def self.#{sym}=(obj) @@#{sym} = obj end - + + #{" def #{sym}=(obj) @@#{sym} = obj end + " unless options[:instance_writer] == false } EOS end end diff --git a/activesupport/test/core_ext/class/attribute_accessor_test.rb b/activesupport/test/core_ext/class/attribute_accessor_test.rb new file mode 100644 index 0000000000..8104c9ce88 --- /dev/null +++ b/activesupport/test/core_ext/class/attribute_accessor_test.rb @@ -0,0 +1,31 @@ +require File.dirname(__FILE__) + '/../../abstract_unit' + +class ClassAttributeAccessorTest < Test::Unit::TestCase + def setup + @class = Class.new do + cattr_accessor :foo + cattr_accessor :bar, :instance_writer => false + end + @object = @class.new + end + + def test_should_use_mattr_default + assert_nil @class.foo + assert_nil @object.foo + end + + def test_should_set_mattr_value + @class.foo = :test + assert_equal :test, @object.foo + + @object.foo = :test2 + assert_equal :test2, @class.foo + end + + def test_should_not_create_instance_writer + assert @class.respond_to?(:foo) + assert @class.respond_to?(:foo=) + assert @object.respond_to?(:bar) + assert !@object.respond_to?(:bar=) + end +end
\ No newline at end of file diff --git a/activesupport/test/class_inheritable_attributes_test.rb b/activesupport/test/core_ext/class/class_inheritable_attributes_test.rb index f3c09f0516..8b11e680af 100644 --- a/activesupport/test/class_inheritable_attributes_test.rb +++ b/activesupport/test/core_ext/class/class_inheritable_attributes_test.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/abstract_unit' +require File.dirname(__FILE__) + '/../../abstract_unit' class ClassInheritableAttributesTest < Test::Unit::TestCase def setup @@ -20,6 +20,14 @@ class ClassInheritableAttributesTest < Test::Unit::TestCase assert_respond_to @klass.new, :a= end end + + def test_writer_declaration_without_instance_writer + assert_nothing_raised do + @klass.class_inheritable_writer :a, :instance_writer => false + assert_respond_to @klass, :a= + assert !@klass.new.respond_to?(:a=) + end + end def test_accessor_declaration assert_nothing_raised do @@ -30,6 +38,16 @@ class ClassInheritableAttributesTest < Test::Unit::TestCase assert_respond_to @klass.new, :a= end end + + def test_accessor_declaration_without_instance_writer + assert_nothing_raised do + @klass.class_inheritable_accessor :a, :instance_writer => false + assert_respond_to @klass, :a + assert_respond_to @klass.new, :a + assert_respond_to @klass, :a= + assert !@klass.new.respond_to?(:a=) + end + end def test_array_declaration assert_nothing_raised do @@ -41,6 +59,16 @@ class ClassInheritableAttributesTest < Test::Unit::TestCase end end + def test_array_declaration_without_instance_writer + assert_nothing_raised do + @klass.class_inheritable_array :a, :instance_writer => false + assert_respond_to @klass, :a + assert_respond_to @klass.new, :a + assert_respond_to @klass, :a= + assert !@klass.new.respond_to?(:a=) + end + end + def test_hash_declaration assert_nothing_raised do @klass.class_inheritable_hash :a @@ -51,6 +79,16 @@ class ClassInheritableAttributesTest < Test::Unit::TestCase end end + def test_hash_declaration_without_instance_writer + assert_nothing_raised do + @klass.class_inheritable_hash :a, :instance_writer => false + assert_respond_to @klass, :a + assert_respond_to @klass.new, :a + assert_respond_to @klass, :a= + assert !@klass.new.respond_to?(:a=) + end + end + def test_reader @klass.class_inheritable_reader :a assert_nil @klass.a diff --git a/activesupport/test/core_ext/module/attr_accessor_with_default.rb b/activesupport/test/core_ext/module/attr_accessor_with_default.rb new file mode 100644 index 0000000000..8ae52ad17a --- /dev/null +++ b/activesupport/test/core_ext/module/attr_accessor_with_default.rb @@ -0,0 +1,30 @@ +require File.dirname(__FILE__) + '/../../abstract_unit' + +class AttrWithDefaultTest < Test::Unit::TestCase + def setup + @target = Class.new do + def helper + 'helper' + end + end + @instance = @target.new + end + + def test_default_arg + @target.attr_accessor_with_default :foo, :bar + assert_equal(:bar, @instance.foo) + @instance.foo = nil + assert_nil(@instance.foo) + end + + def test_default_proc + @target.attr_accessor_with_default(:foo) {helper.upcase} + assert_equal('HELPER', @instance.foo) + @instance.foo = nil + assert_nil(@instance.foo) + end + + def test_invalid_args + assert_raise(RuntimeError) {@target.attr_accessor_with_default :foo} + end +end
\ No newline at end of file diff --git a/activesupport/test/core_ext/module/attribute_accessor_test.rb b/activesupport/test/core_ext/module/attribute_accessor_test.rb new file mode 100644 index 0000000000..c3f6575f84 --- /dev/null +++ b/activesupport/test/core_ext/module/attribute_accessor_test.rb @@ -0,0 +1,33 @@ +require File.dirname(__FILE__) + '/../../abstract_unit' + +class ModuleAttributeAccessorTest < Test::Unit::TestCase + def setup + @module = Module.new do + mattr_accessor :foo + mattr_accessor :bar, :instance_writer => false + end + @class = Class.new + @class.send :include, @module + @object = @class.new + end + + def test_should_use_mattr_default + assert_nil @module.foo + assert_nil @object.foo + end + + def test_should_set_mattr_value + @module.foo = :test + assert_equal :test, @object.foo + + @object.foo = :test2 + assert_equal :test2, @module.foo + end + + def test_should_not_create_instance_writer + assert @module.respond_to?(:foo) + assert @module.respond_to?(:foo=) + assert @object.respond_to?(:bar) + assert !@object.respond_to?(:bar=) + end +end
\ No newline at end of file |