Added :instance_writer option to #mattr_writer/accessor, #cattr_writer/accessor, and #class_inheritable_writer to skip the creation of the instance writer. [Rick]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6050 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
parent
eca93d0970
commit
5e85a1c7f8
|
@ -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]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue