aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport
diff options
context:
space:
mode:
Diffstat (limited to 'activesupport')
-rw-r--r--activesupport/CHANGELOG2
-rw-r--r--activesupport/lib/active_support/core_ext/class/attribute_accessors.rb4
-rw-r--r--activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb10
-rw-r--r--activesupport/lib/active_support/core_ext/module/attribute_accessors.rb6
-rw-r--r--activesupport/test/core_ext/class/attribute_accessor_test.rb31
-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.rb30
-rw-r--r--activesupport/test/core_ext/module/attribute_accessor_test.rb33
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