dsl_accessor 0.3.3 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/{LICENSE → MIT-LICENSE} +1 -1
- data/Rakefile +19 -41
- data/lib/dsl_accessor.rb +12 -6
- data/lib/dsl_accessor/accessor.rb +93 -0
- data/lib/dsl_accessor/stores.rb +60 -0
- data/spec/accessor_spec.rb +58 -0
- data/spec/default_spec.rb +39 -0
- data/spec/inherit_spec.rb +37 -10
- data/spec/instance_spec.rb +51 -0
- data/spec/module_spec.rb +22 -0
- data/spec/spec_helper.rb +7 -1
- data/spec/writer_spec.rb +35 -0
- metadata +38 -22
- data/core_ext/class/dsl_accessor.rb +0 -93
- data/core_ext/class/inheritable_attributes.rb +0 -140
- data/core_ext/duplicable.rb +0 -43
- data/spec/auto_declared_spec.rb +0 -106
- data/tasks/dsl_accessor_tasks.rake +0 -4
- data/test/default_test.rb +0 -64
- data/test/dsl_accessor_test.rb +0 -47
- data/test/instance_options_test.rb +0 -38
- data/test/instance_test.rb +0 -43
- data/test/test_helper.rb +0 -5
- data/test/writer_test.rb +0 -21
data/{LICENSE → MIT-LICENSE}
RENAMED
data/Rakefile
CHANGED
@@ -1,30 +1,3 @@
|
|
1
|
-
require 'rake'
|
2
|
-
require 'rake/testtask'
|
3
|
-
require 'rake/rdoctask'
|
4
|
-
|
5
|
-
desc 'Default: run unit tests.'
|
6
|
-
task :default => :test
|
7
|
-
|
8
|
-
desc 'Test the dsl_accessor plugin.'
|
9
|
-
Rake::TestTask.new(:test) do |t|
|
10
|
-
t.libs << 'lib'
|
11
|
-
t.pattern = 'test/**/*_test.rb'
|
12
|
-
t.verbose = true
|
13
|
-
end
|
14
|
-
|
15
|
-
desc 'Generate documentation for the dsl_accessor plugin.'
|
16
|
-
Rake::RDocTask.new(:rdoc) do |rdoc|
|
17
|
-
rdoc.rdoc_dir = 'rdoc'
|
18
|
-
rdoc.title = 'DslAccessor'
|
19
|
-
rdoc.options << '--line-numbers' << '--inline-source'
|
20
|
-
rdoc.rdoc_files.include('README')
|
21
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
22
|
-
end
|
23
|
-
|
24
|
-
|
25
|
-
######################################################################
|
26
|
-
### for gem
|
27
|
-
|
28
1
|
require 'rubygems'
|
29
2
|
require 'rake/gempackagetask'
|
30
3
|
|
@@ -33,22 +6,24 @@ AUTHOR = "maiha"
|
|
33
6
|
EMAIL = "maiha@wota.jp"
|
34
7
|
HOMEPAGE = "http://github.com/maiha/dsl_accessor"
|
35
8
|
SUMMARY = "This plugin gives hybrid accessor class methods to classes by DSL like definition"
|
36
|
-
GEM_VERSION = "0.
|
9
|
+
GEM_VERSION = "0.4.0"
|
37
10
|
|
38
11
|
spec = Gem::Specification.new do |s|
|
39
|
-
|
40
|
-
s.
|
41
|
-
s.
|
42
|
-
s.
|
43
|
-
s.
|
44
|
-
s.
|
45
|
-
s.
|
46
|
-
s.
|
47
|
-
s.
|
48
|
-
s.
|
49
|
-
s.
|
50
|
-
s.
|
51
|
-
s.
|
12
|
+
s.rubyforge_project = 'asakusarb'
|
13
|
+
s.executables = []
|
14
|
+
s.name = GEM_NAME
|
15
|
+
s.version = GEM_VERSION
|
16
|
+
s.platform = Gem::Platform::RUBY
|
17
|
+
s.has_rdoc = true
|
18
|
+
s.extra_rdoc_files = ["README", "MIT-LICENSE"]
|
19
|
+
s.summary = SUMMARY
|
20
|
+
s.description = s.summary
|
21
|
+
s.author = AUTHOR
|
22
|
+
s.email = EMAIL
|
23
|
+
s.homepage = HOMEPAGE
|
24
|
+
s.require_path = 'lib'
|
25
|
+
s.add_dependency('optionize', '>= 0.1.0')
|
26
|
+
s.files = %w(MIT-LICENSE README Rakefile) + Dir.glob("{lib,spec,core_ext}/**/*")
|
52
27
|
end
|
53
28
|
|
54
29
|
Rake::GemPackageTask.new(spec) do |pkg|
|
@@ -72,3 +47,6 @@ task :gemspec do
|
|
72
47
|
end
|
73
48
|
end
|
74
49
|
|
50
|
+
require 'spec/rake/spectask'
|
51
|
+
desc 'Default: run spec examples'
|
52
|
+
task :default => 'spec'
|
data/lib/dsl_accessor.rb
CHANGED
@@ -1,11 +1,17 @@
|
|
1
|
-
unless Class.new.respond_to?(:write_inheritable_attribute)
|
2
|
-
require File.dirname(__FILE__) + "/../core_ext/duplicable" unless Object.new.respond_to?(:duplicable?)
|
3
|
-
require File.dirname(__FILE__) + "/../core_ext/class/inheritable_attributes"
|
4
|
-
end
|
5
|
-
|
6
1
|
unless Module.new.respond_to?(:delegate)
|
7
2
|
require File.dirname(__FILE__) + "/../core_ext/module/delegation"
|
8
3
|
end
|
9
4
|
|
10
|
-
require File.dirname(__FILE__) + '
|
5
|
+
require File.dirname(__FILE__) + '/dsl_accessor/accessor'
|
6
|
+
require File.dirname(__FILE__) + '/dsl_accessor/stores'
|
7
|
+
|
8
|
+
class Module
|
9
|
+
include DslAccessor
|
10
|
+
include DslAccessor::Stores::Basic
|
11
|
+
end
|
12
|
+
|
13
|
+
class Class
|
14
|
+
include DslAccessor
|
15
|
+
include DslAccessor::Stores::Inherit
|
16
|
+
end
|
11
17
|
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'optionize'
|
2
|
+
|
3
|
+
module DslAccessor
|
4
|
+
def dsl_accessor_reader(key, *args)
|
5
|
+
key = key.to_s
|
6
|
+
if args.empty?
|
7
|
+
# getter method
|
8
|
+
if !dsl_accessor_key?(key)
|
9
|
+
default = dsl_accessor_get("#{key}_default")
|
10
|
+
value = default ? default.call : nil
|
11
|
+
dsl_accessor_writer(key, value)
|
12
|
+
end
|
13
|
+
dsl_accessor_get(key)
|
14
|
+
else
|
15
|
+
# setter method
|
16
|
+
dsl_accessor_writer(key, *args)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def dsl_accessor_writer(key, *args)
|
21
|
+
case args.size
|
22
|
+
when 1
|
23
|
+
writer = dsl_accessor_get("#{key}_writer")
|
24
|
+
value = writer ? writer.call(*args) : args.first
|
25
|
+
dsl_accessor_set("#{key}", value)
|
26
|
+
else
|
27
|
+
raise ArgumentError, "'#{key}=' expected one argument, but got #{args.size} args"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def dsl_accessor(*args, &block)
|
32
|
+
opts = Optionize.new(args, :name, :default)
|
33
|
+
name = opts.name
|
34
|
+
|
35
|
+
if !name and !block
|
36
|
+
raise "dsl_accessor expects at least one arg"
|
37
|
+
end
|
38
|
+
|
39
|
+
writer =
|
40
|
+
case opts.writer
|
41
|
+
when NilClass then Proc.new{|value| value}
|
42
|
+
when Symbol then Proc.new{|value| __send__(opts.writer, value)}
|
43
|
+
when Proc then opts.writer
|
44
|
+
else raise TypeError, "DSL Error: writer should be a symbol or proc. but got `#{opts.writer.class}'"
|
45
|
+
end
|
46
|
+
dsl_accessor_set("#{name}_writer", writer)
|
47
|
+
|
48
|
+
default =
|
49
|
+
case opts.default
|
50
|
+
when NilClass then nil
|
51
|
+
when [] then Proc.new{[]}
|
52
|
+
when {} then Proc.new{{}}
|
53
|
+
when Symbol then Proc.new{__send__(opts.default)}
|
54
|
+
when Proc then opts.default
|
55
|
+
else Proc.new{opts.default}
|
56
|
+
end
|
57
|
+
dsl_accessor_set("#{name}_default", default)
|
58
|
+
|
59
|
+
meta_class = (class << self; self; end)
|
60
|
+
|
61
|
+
if opts.instance and !is_a?(Class)
|
62
|
+
raise ArgumentError, ":instance option is implemented in only Class"
|
63
|
+
end
|
64
|
+
|
65
|
+
case opts.instance
|
66
|
+
when nil
|
67
|
+
# nop
|
68
|
+
when true
|
69
|
+
delegate name, :to=>"self.class"
|
70
|
+
when Symbol
|
71
|
+
module_eval(<<-EOS, "(__DSL_ACCESSOR__)", 1)
|
72
|
+
def #{ name }
|
73
|
+
@#{opts.instance} or
|
74
|
+
raise TypeError, "DSL Error: missing @#{opts.instance} for %s##{name}" % self.class.name
|
75
|
+
@#{opts.instance}.respond_to?(:[]) or
|
76
|
+
raise TypeError, "DSL Error: expected @#{opts.instance}[] is implemented (%s##{name})" % self.class.name
|
77
|
+
@#{opts.instance}[:#{ name }] || self.class.#{ name }
|
78
|
+
end
|
79
|
+
EOS
|
80
|
+
else
|
81
|
+
raise TypeError, "DSL Error: :instance should be true or Symbol, but got `%s' class" % opts.instance.class
|
82
|
+
end
|
83
|
+
|
84
|
+
instance_eval <<-EOS
|
85
|
+
def #{name}(*args)
|
86
|
+
dsl_accessor_reader("#{name}", *args)
|
87
|
+
end
|
88
|
+
def #{name}=(*args)
|
89
|
+
dsl_accessor_writer("#{name}", *args)
|
90
|
+
end
|
91
|
+
EOS
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module DslAccessor
|
2
|
+
module Stores
|
3
|
+
module Basic
|
4
|
+
# testing
|
5
|
+
def dsl_accessor_attributes
|
6
|
+
@dsl_accessor_attributes ||= {}
|
7
|
+
end
|
8
|
+
|
9
|
+
def dsl_accessor_key?(key)
|
10
|
+
dsl_accessor_attributes.has_key?(key)
|
11
|
+
end
|
12
|
+
|
13
|
+
def dsl_accessor_get(key)
|
14
|
+
dsl_accessor_attributes[key]
|
15
|
+
end
|
16
|
+
|
17
|
+
def dsl_accessor_set(key, val)
|
18
|
+
dsl_accessor_attributes[key] = val
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
module Inherit
|
23
|
+
# testing
|
24
|
+
def dsl_accessor_attributes
|
25
|
+
@dsl_accessor_attributes ||= {}
|
26
|
+
end
|
27
|
+
|
28
|
+
def dsl_accessor_key?(key)
|
29
|
+
dsl_accessor_attributes.has_key?(key)
|
30
|
+
end
|
31
|
+
|
32
|
+
def dsl_accessor_get(key)
|
33
|
+
if dsl_accessor_key?(key)
|
34
|
+
dsl_accessor_attributes[key]
|
35
|
+
else
|
36
|
+
superclass ? superclass.dsl_accessor_get(key) : nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def dsl_accessor_set(key, val)
|
41
|
+
dsl_accessor_attributes[key] = val
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
module InheritableAttributes
|
46
|
+
# testing
|
47
|
+
def dsl_accessor_key?(key)
|
48
|
+
inheritable_attributes.has_key?(key)
|
49
|
+
end
|
50
|
+
|
51
|
+
def dsl_accessor_get(key)
|
52
|
+
read_inheritable_attribute(key)
|
53
|
+
end
|
54
|
+
|
55
|
+
def dsl_accessor_set(key, val)
|
56
|
+
write_inheritable_attribute(key, val)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require File.join( File.dirname(__FILE__), "spec_helper" )
|
2
|
+
|
3
|
+
describe DslAccessor do
|
4
|
+
it "class should provide 'dsl_accessor'" do
|
5
|
+
Class.new.should respond_to(:dsl_accessor)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
describe "dsl_accessor(:foo)" do
|
11
|
+
before do
|
12
|
+
@klass = new_class { dsl_accessor :foo }
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should provide 'foo' method" do
|
16
|
+
@klass.should respond_to(:foo)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should accept nil for default value" do
|
20
|
+
@klass.foo.should == nil
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should provide 'foo=' method" do
|
24
|
+
@klass.should respond_to(:foo=)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "#foo= should raise ArgumentError" do
|
28
|
+
lambda { @klass.send(:foo=) }.should raise_error(ArgumentError)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "#foo=(1) should not raise ArgumentError" do
|
32
|
+
lambda { @klass.foo = 1 }.should_not raise_error(ArgumentError)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "#foo=(1) should set :foo to 1" do
|
36
|
+
@klass.foo = 1
|
37
|
+
@klass.foo.should == 1
|
38
|
+
end
|
39
|
+
|
40
|
+
it "#foo=(1, 2) should raise ArgumentError" do
|
41
|
+
lambda { @klass.send(:foo=,1,2) }.should raise_error(ArgumentError)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
describe "dsl_accessor(:foo, 1)" do
|
47
|
+
before do
|
48
|
+
@klass = new_class { dsl_accessor :foo, 1 }
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should provide 'foo' method" do
|
52
|
+
@klass.should respond_to(:foo)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should accept 1 for default value" do
|
56
|
+
@klass.foo.should == 1
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require File.join( File.dirname(__FILE__), "spec_helper" )
|
2
|
+
|
3
|
+
describe DslAccessor do
|
4
|
+
it "should duplicate blank array automatically" do
|
5
|
+
k1 = Class.new
|
6
|
+
|
7
|
+
array = []
|
8
|
+
k1.dsl_accessor :foo, array
|
9
|
+
|
10
|
+
k1.foo.should == array
|
11
|
+
k1.foo.should_not equal(array)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should duplicate blank hash automatically" do
|
15
|
+
k1 = Class.new
|
16
|
+
|
17
|
+
hash = {}
|
18
|
+
k1.dsl_accessor :foo, :default=>hash
|
19
|
+
|
20
|
+
k1.foo.should == hash
|
21
|
+
k1.foo.should_not equal(hash)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should call the method when symbol given" do
|
25
|
+
k1 = Class.new
|
26
|
+
def k1.construct
|
27
|
+
1
|
28
|
+
end
|
29
|
+
k1.dsl_accessor :foo, :default=>:construct
|
30
|
+
|
31
|
+
k1.foo.should == 1
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should call it when proc given" do
|
35
|
+
k1 = Class.new
|
36
|
+
k1.dsl_accessor :foo, :default=>proc{1}
|
37
|
+
k1.foo.should == 1
|
38
|
+
end
|
39
|
+
end
|
data/spec/inherit_spec.rb
CHANGED
@@ -1,21 +1,48 @@
|
|
1
1
|
require File.join( File.dirname(__FILE__), "spec_helper" )
|
2
2
|
|
3
3
|
describe DslAccessor do
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
# | foo | bar | baz | qux | quux |
|
5
|
+
# Bottom | * | * | o | o | |
|
6
|
+
# Middle | | o | | + | o |
|
7
|
+
# Top | + | | + | o | o |
|
8
|
+
#
|
9
|
+
# *) dsl_accessor :foo
|
10
|
+
# o) dsl_accessor :foo, 'val'
|
11
|
+
# +) foo 'val'
|
7
12
|
|
8
|
-
|
9
|
-
|
13
|
+
class Bottom
|
14
|
+
dsl_accessor :foo
|
15
|
+
dsl_accessor :bar
|
16
|
+
dsl_accessor :baz, 'baz1'
|
17
|
+
dsl_accessor :qux, 'qux1'
|
10
18
|
end
|
11
19
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
20
|
+
class Middle < Bottom
|
21
|
+
dsl_accessor :bar, 'bar2'
|
22
|
+
qux 'qux2'
|
23
|
+
dsl_accessor :quux, 'quux2'
|
24
|
+
end
|
25
|
+
|
26
|
+
class Top < Middle
|
27
|
+
foo 'foo3'
|
28
|
+
baz 'baz3'
|
29
|
+
dsl_accessor :qux , 'qux3'
|
30
|
+
dsl_accessor :quux, 'quux3'
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should define accessor methods" do
|
34
|
+
Bottom.foo.should == nil
|
35
|
+
Bottom.bar.should == nil
|
36
|
+
Bottom.baz.should == 'baz1'
|
37
|
+
Bottom.qux.should == 'qux1'
|
38
|
+
lambda { Bottom.quux }.should raise_error(NameError)
|
16
39
|
end
|
17
40
|
|
18
41
|
it "should inherit value" do
|
19
|
-
|
42
|
+
Middle.foo.should == nil
|
43
|
+
Middle.bar.should == 'bar2'
|
44
|
+
Middle.baz.should == 'baz1'
|
45
|
+
Middle.qux.should == 'qux2'
|
46
|
+
Middle.quux.should == 'quux2'
|
20
47
|
end
|
21
48
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require File.join( File.dirname(__FILE__), "spec_helper" )
|
2
|
+
|
3
|
+
describe "dsl_accessor(:foo, :instance=>true)" do
|
4
|
+
before do
|
5
|
+
klass = Class.new
|
6
|
+
klass.dsl_accessor :foo, :instance=>true
|
7
|
+
@klass = klass
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should provide instance method 'foo'" do
|
11
|
+
@klass.new.should respond_to(:foo)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should delegate instance method to class method about reader" do
|
15
|
+
@klass.foo 1
|
16
|
+
@klass.new.foo.should == 1
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "dsl_accessor(:foo, :instance=>:opts)" do
|
21
|
+
before do
|
22
|
+
klass = Class.new
|
23
|
+
klass.dsl_accessor :foo, :instance=>:opts
|
24
|
+
@klass = klass
|
25
|
+
@obj = @klass.new
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should raise error when @opts is not set" do
|
29
|
+
lambda {
|
30
|
+
@obj.foo
|
31
|
+
}.should raise_error(/missing @opts/)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should raise error when @opts is present but not responds to []" do
|
35
|
+
@obj.instance_eval "@opts = true"
|
36
|
+
lambda {
|
37
|
+
@obj.foo
|
38
|
+
}.should raise_error(/expected @opts\[\]/)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should read value from @opts first" do
|
42
|
+
@obj.instance_eval "@opts = {:foo=>2}"
|
43
|
+
@obj.foo.should == 2
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should read value from class when @opts value is blank" do
|
47
|
+
@klass.foo 1
|
48
|
+
@obj.instance_eval "@opts = {}"
|
49
|
+
@obj.foo.should == 1
|
50
|
+
end
|
51
|
+
end
|
data/spec/module_spec.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.join( File.dirname(__FILE__), "spec_helper" )
|
2
|
+
|
3
|
+
describe Module do
|
4
|
+
it "should provide 'dsl_accessor'" do
|
5
|
+
Module.new.should respond_to(:dsl_accessor)
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "#dsl_accessor(:foo, 1)" do
|
9
|
+
subject {
|
10
|
+
mod = Module.new
|
11
|
+
mod.dsl_accessor :foo, 1
|
12
|
+
mod
|
13
|
+
}
|
14
|
+
# default value
|
15
|
+
its(:foo) { should == 1}
|
16
|
+
|
17
|
+
it "foo(2) should update value to 2" do
|
18
|
+
subject.foo 2
|
19
|
+
subject.foo.should == 2
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
require "rubygems"
|
2
2
|
require "spec"
|
3
3
|
|
4
|
-
require File.dirname(__FILE__) + "/../
|
4
|
+
require File.dirname(__FILE__) + "/../lib/dsl_accessor"
|
5
5
|
|
6
|
+
######################################################################
|
7
|
+
### Helper methods
|
8
|
+
|
9
|
+
def new_class(&block)
|
10
|
+
Class.new(&block)
|
11
|
+
end
|
data/spec/writer_spec.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require File.join( File.dirname(__FILE__), "spec_helper" )
|
2
|
+
|
3
|
+
describe DslAccessor do
|
4
|
+
it "should call writer" do
|
5
|
+
klass = new_class
|
6
|
+
|
7
|
+
klass.dsl_accessor :key, "bar", :writer=>proc{|value| "[#{value}]"}
|
8
|
+
klass.key.should == "[bar]"
|
9
|
+
|
10
|
+
klass.key 'foo'
|
11
|
+
klass.key.should == "[foo]"
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should call writer even if no default values given" do
|
15
|
+
klass = new_class
|
16
|
+
|
17
|
+
klass.dsl_accessor :key, :writer=>proc{|value| "[#{value}]"}
|
18
|
+
klass.key.should == "[]"
|
19
|
+
|
20
|
+
klass.key 'foo'
|
21
|
+
klass.key.should == "[foo]"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should call the method when symbol given" do
|
25
|
+
klass = new_class
|
26
|
+
|
27
|
+
klass.dsl_accessor :key, :default=>"foo", :writer=>:labelize
|
28
|
+
def klass.labelize(val)
|
29
|
+
"[#{val}]"
|
30
|
+
end
|
31
|
+
|
32
|
+
klass.key.should == "[foo]"
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dsl_accessor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 4
|
8
|
+
- 0
|
9
|
+
version: 0.4.0
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- maiha
|
@@ -9,10 +14,23 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date:
|
17
|
+
date: 2010-03-23 00:00:00 +09:00
|
13
18
|
default_executable:
|
14
|
-
dependencies:
|
15
|
-
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: optionize
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
- 1
|
30
|
+
- 0
|
31
|
+
version: 0.1.0
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
16
34
|
description: This plugin gives hybrid accessor class methods to classes by DSL like definition
|
17
35
|
email: maiha@wota.jp
|
18
36
|
executables: []
|
@@ -21,26 +39,22 @@ extensions: []
|
|
21
39
|
|
22
40
|
extra_rdoc_files:
|
23
41
|
- README
|
24
|
-
- LICENSE
|
42
|
+
- MIT-LICENSE
|
25
43
|
files:
|
26
|
-
- LICENSE
|
44
|
+
- MIT-LICENSE
|
27
45
|
- README
|
28
46
|
- Rakefile
|
29
|
-
-
|
30
|
-
-
|
31
|
-
- core_ext/class/dsl_accessor.rb
|
32
|
-
- core_ext/class/inheritable_attributes.rb
|
47
|
+
- lib/dsl_accessor/stores.rb
|
48
|
+
- lib/dsl_accessor/accessor.rb
|
33
49
|
- lib/dsl_accessor.rb
|
50
|
+
- spec/accessor_spec.rb
|
51
|
+
- spec/writer_spec.rb
|
34
52
|
- spec/inherit_spec.rb
|
35
|
-
- spec/
|
53
|
+
- spec/module_spec.rb
|
54
|
+
- spec/instance_spec.rb
|
55
|
+
- spec/default_spec.rb
|
36
56
|
- spec/spec_helper.rb
|
37
|
-
-
|
38
|
-
- test/instance_test.rb
|
39
|
-
- test/default_test.rb
|
40
|
-
- test/writer_test.rb
|
41
|
-
- test/test_helper.rb
|
42
|
-
- test/dsl_accessor_test.rb
|
43
|
-
- test/instance_options_test.rb
|
57
|
+
- core_ext/module/delegation.rb
|
44
58
|
has_rdoc: true
|
45
59
|
homepage: http://github.com/maiha/dsl_accessor
|
46
60
|
licenses: []
|
@@ -54,18 +68,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
54
68
|
requirements:
|
55
69
|
- - ">="
|
56
70
|
- !ruby/object:Gem::Version
|
71
|
+
segments:
|
72
|
+
- 0
|
57
73
|
version: "0"
|
58
|
-
version:
|
59
74
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
75
|
requirements:
|
61
76
|
- - ">="
|
62
77
|
- !ruby/object:Gem::Version
|
78
|
+
segments:
|
79
|
+
- 0
|
63
80
|
version: "0"
|
64
|
-
version:
|
65
81
|
requirements: []
|
66
82
|
|
67
|
-
rubyforge_project:
|
68
|
-
rubygems_version: 1.3.
|
83
|
+
rubyforge_project: asakusarb
|
84
|
+
rubygems_version: 1.3.6
|
69
85
|
signing_key:
|
70
86
|
specification_version: 3
|
71
87
|
summary: This plugin gives hybrid accessor class methods to classes by DSL like definition
|
@@ -1,93 +0,0 @@
|
|
1
|
-
module DslAccessor
|
2
|
-
def dsl_accessor(*args)
|
3
|
-
options = args.last.is_a?(Hash) ? args.pop : {}
|
4
|
-
|
5
|
-
# mark auto_declared
|
6
|
-
name = args.shift or
|
7
|
-
return @dsl_accessor_auto_declared = true
|
8
|
-
|
9
|
-
options[:default] = args.shift unless args.empty?
|
10
|
-
|
11
|
-
case options[:instance]
|
12
|
-
when nil
|
13
|
-
# nop
|
14
|
-
when :options
|
15
|
-
module_eval(<<-EOS, "(__DSL_ACCESSOR__)", 1)
|
16
|
-
def #{ name }
|
17
|
-
unless @options
|
18
|
-
raise TypeError, "DSL Error: missing @options for %s##{name}" % self.class.name
|
19
|
-
end
|
20
|
-
@options[:#{ name }] || self.class.#{ name }
|
21
|
-
end
|
22
|
-
EOS
|
23
|
-
when true
|
24
|
-
delegate name, :to=>"self.class"
|
25
|
-
else
|
26
|
-
raise TypeError, "DSL Error: :instance should be true or :instance, but got `%s' class" % options[:instance].class
|
27
|
-
end
|
28
|
-
|
29
|
-
raise TypeError, "DSL Error: options should be a hash. but got `#{options.class}'" unless options.is_a?(Hash)
|
30
|
-
writer = options[:writer] || options[:setter]
|
31
|
-
writer =
|
32
|
-
case writer
|
33
|
-
when NilClass then Proc.new{|value| value}
|
34
|
-
when Symbol then Proc.new{|value| __send__(writer, value)}
|
35
|
-
when Proc then writer
|
36
|
-
else raise TypeError, "DSL Error: writer should be a symbol or proc. but got `#{options[:writer].class}'"
|
37
|
-
end
|
38
|
-
write_inheritable_attribute(:"#{name}_writer", writer)
|
39
|
-
|
40
|
-
default =
|
41
|
-
case options[:default]
|
42
|
-
when NilClass then nil
|
43
|
-
when [] then Proc.new{[]}
|
44
|
-
when {} then Proc.new{{}}
|
45
|
-
when Symbol then Proc.new{__send__(options[:default])}
|
46
|
-
when Proc then options[:default]
|
47
|
-
else Proc.new{options[:default]}
|
48
|
-
end
|
49
|
-
write_inheritable_attribute(:"#{name}_default", default)
|
50
|
-
|
51
|
-
(class << self; self end).class_eval do
|
52
|
-
define_method("#{name}=") do |value|
|
53
|
-
writer = read_inheritable_attribute(:"#{name}_writer")
|
54
|
-
value = writer.call(value) if writer
|
55
|
-
write_inheritable_attribute(:"#{name}", value)
|
56
|
-
end
|
57
|
-
|
58
|
-
define_method(name) do |*values|
|
59
|
-
if values.empty?
|
60
|
-
# getter method
|
61
|
-
key = :"#{name}"
|
62
|
-
if !inheritable_attributes.has_key?(key)
|
63
|
-
default = read_inheritable_attribute(:"#{name}_default")
|
64
|
-
value = default ? default.call(self) : nil
|
65
|
-
__send__("#{name}=", value)
|
66
|
-
end
|
67
|
-
read_inheritable_attribute(key)
|
68
|
-
else
|
69
|
-
# setter method
|
70
|
-
__send__("#{name}=", *values)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
private
|
77
|
-
def dsl_accessor_auto_declared?
|
78
|
-
!!@dsl_accessor_auto_declared
|
79
|
-
end
|
80
|
-
|
81
|
-
def method_missing(*args, &block)
|
82
|
-
if dsl_accessor_auto_declared? and args.size == 1 and block
|
83
|
-
define_method(*args, &block)
|
84
|
-
else
|
85
|
-
super
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
end
|
90
|
-
|
91
|
-
class Class
|
92
|
-
include DslAccessor
|
93
|
-
end
|
@@ -1,140 +0,0 @@
|
|
1
|
-
# Retain for backward compatibility. Methods are now included in Class.
|
2
|
-
module ClassInheritableAttributes # :nodoc:
|
3
|
-
end
|
4
|
-
|
5
|
-
# Allows attributes to be shared within an inheritance hierarchy, but where each descendant gets a copy of
|
6
|
-
# their parents' attributes, instead of just a pointer to the same. This means that the child can add elements
|
7
|
-
# to, for example, an array without those additions being shared with either their parent, siblings, or
|
8
|
-
# children, which is unlike the regular class-level attributes that are shared across the entire hierarchy.
|
9
|
-
class Class # :nodoc:
|
10
|
-
def class_inheritable_reader(*syms)
|
11
|
-
syms.each do |sym|
|
12
|
-
next if sym.is_a?(Hash)
|
13
|
-
class_eval <<-EOS
|
14
|
-
def self.#{sym}
|
15
|
-
read_inheritable_attribute(:#{sym})
|
16
|
-
end
|
17
|
-
|
18
|
-
def #{sym}
|
19
|
-
self.class.#{sym}
|
20
|
-
end
|
21
|
-
EOS
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def class_inheritable_writer(*syms)
|
26
|
-
options = syms.last.is_a?(::Hash) ? syms.pop : {}
|
27
|
-
syms.each do |sym|
|
28
|
-
class_eval <<-EOS
|
29
|
-
def self.#{sym}=(obj)
|
30
|
-
write_inheritable_attribute(:#{sym}, obj)
|
31
|
-
end
|
32
|
-
|
33
|
-
#{"
|
34
|
-
def #{sym}=(obj)
|
35
|
-
self.class.#{sym} = obj
|
36
|
-
end
|
37
|
-
" unless options[:instance_writer] == false }
|
38
|
-
EOS
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def class_inheritable_array_writer(*syms)
|
43
|
-
options = syms.last.is_a?(::Hash) ? syms.pop : {}
|
44
|
-
syms.each do |sym|
|
45
|
-
class_eval <<-EOS
|
46
|
-
def self.#{sym}=(obj)
|
47
|
-
write_inheritable_array(:#{sym}, obj)
|
48
|
-
end
|
49
|
-
|
50
|
-
#{"
|
51
|
-
def #{sym}=(obj)
|
52
|
-
self.class.#{sym} = obj
|
53
|
-
end
|
54
|
-
" unless options[:instance_writer] == false }
|
55
|
-
EOS
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def class_inheritable_hash_writer(*syms)
|
60
|
-
options = syms.last.is_a?(::Hash) ? syms.pop : {}
|
61
|
-
syms.each do |sym|
|
62
|
-
class_eval <<-EOS
|
63
|
-
def self.#{sym}=(obj)
|
64
|
-
write_inheritable_hash(:#{sym}, obj)
|
65
|
-
end
|
66
|
-
|
67
|
-
#{"
|
68
|
-
def #{sym}=(obj)
|
69
|
-
self.class.#{sym} = obj
|
70
|
-
end
|
71
|
-
" unless options[:instance_writer] == false }
|
72
|
-
EOS
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def class_inheritable_accessor(*syms)
|
77
|
-
class_inheritable_reader(*syms)
|
78
|
-
class_inheritable_writer(*syms)
|
79
|
-
end
|
80
|
-
|
81
|
-
def class_inheritable_array(*syms)
|
82
|
-
class_inheritable_reader(*syms)
|
83
|
-
class_inheritable_array_writer(*syms)
|
84
|
-
end
|
85
|
-
|
86
|
-
def class_inheritable_hash(*syms)
|
87
|
-
class_inheritable_reader(*syms)
|
88
|
-
class_inheritable_hash_writer(*syms)
|
89
|
-
end
|
90
|
-
|
91
|
-
def inheritable_attributes
|
92
|
-
@inheritable_attributes ||= EMPTY_INHERITABLE_ATTRIBUTES
|
93
|
-
end
|
94
|
-
|
95
|
-
def write_inheritable_attribute(key, value)
|
96
|
-
if inheritable_attributes.equal?(EMPTY_INHERITABLE_ATTRIBUTES)
|
97
|
-
@inheritable_attributes = {}
|
98
|
-
end
|
99
|
-
inheritable_attributes[key] = value
|
100
|
-
end
|
101
|
-
|
102
|
-
def write_inheritable_array(key, elements)
|
103
|
-
write_inheritable_attribute(key, []) if read_inheritable_attribute(key).nil?
|
104
|
-
write_inheritable_attribute(key, read_inheritable_attribute(key) + elements)
|
105
|
-
end
|
106
|
-
|
107
|
-
def write_inheritable_hash(key, hash)
|
108
|
-
write_inheritable_attribute(key, {}) if read_inheritable_attribute(key).nil?
|
109
|
-
write_inheritable_attribute(key, read_inheritable_attribute(key).merge(hash))
|
110
|
-
end
|
111
|
-
|
112
|
-
def read_inheritable_attribute(key)
|
113
|
-
inheritable_attributes[key]
|
114
|
-
end
|
115
|
-
|
116
|
-
def reset_inheritable_attributes
|
117
|
-
@inheritable_attributes = EMPTY_INHERITABLE_ATTRIBUTES
|
118
|
-
end
|
119
|
-
|
120
|
-
private
|
121
|
-
# Prevent this constant from being created multiple times
|
122
|
-
EMPTY_INHERITABLE_ATTRIBUTES = {}.freeze unless const_defined?(:EMPTY_INHERITABLE_ATTRIBUTES)
|
123
|
-
|
124
|
-
def inherited_with_inheritable_attributes(child)
|
125
|
-
inherited_without_inheritable_attributes(child) if respond_to?(:inherited_without_inheritable_attributes)
|
126
|
-
|
127
|
-
if inheritable_attributes.equal?(EMPTY_INHERITABLE_ATTRIBUTES)
|
128
|
-
new_inheritable_attributes = EMPTY_INHERITABLE_ATTRIBUTES
|
129
|
-
else
|
130
|
-
new_inheritable_attributes = inheritable_attributes.inject({}) do |memo, (key, value)|
|
131
|
-
memo.update(key => value.duplicable? ? value.dup : value)
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
child.instance_variable_set('@inheritable_attributes', new_inheritable_attributes)
|
136
|
-
end
|
137
|
-
|
138
|
-
alias inherited_without_inheritable_attributes inherited
|
139
|
-
alias inherited inherited_with_inheritable_attributes
|
140
|
-
end
|
data/core_ext/duplicable.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
class Object
|
2
|
-
# Can you safely .dup this object?
|
3
|
-
# False for nil, false, true, symbols, and numbers; true otherwise.
|
4
|
-
def duplicable?
|
5
|
-
true
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
class NilClass #:nodoc:
|
10
|
-
def duplicable?
|
11
|
-
false
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
class FalseClass #:nodoc:
|
16
|
-
def duplicable?
|
17
|
-
false
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
class TrueClass #:nodoc:
|
22
|
-
def duplicable?
|
23
|
-
false
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
class Symbol #:nodoc:
|
28
|
-
def duplicable?
|
29
|
-
false
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
class Numeric #:nodoc:
|
34
|
-
def duplicable?
|
35
|
-
false
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
class Class #:nodoc:
|
40
|
-
def duplicable?
|
41
|
-
false
|
42
|
-
end
|
43
|
-
end
|
data/spec/auto_declared_spec.rb
DELETED
@@ -1,106 +0,0 @@
|
|
1
|
-
require File.join( File.dirname(__FILE__), "spec_helper" )
|
2
|
-
|
3
|
-
describe DslAccessor do
|
4
|
-
before(:each) do
|
5
|
-
Object.send(:remove_const, :Foo) if Object.const_defined?(:Foo)
|
6
|
-
class Foo
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
def foo_should_not_be_defined
|
11
|
-
Foo .should_not respond_to(:foo)
|
12
|
-
Foo.new.should_not respond_to(:foo)
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should provide .dsl_accessor_auto_declared as private method" do
|
16
|
-
Class.private_methods.should include("dsl_accessor_auto_declared?")
|
17
|
-
end
|
18
|
-
|
19
|
-
it "should provide .dsl_accessor" do
|
20
|
-
Class.should respond_to(:dsl_accessor)
|
21
|
-
end
|
22
|
-
|
23
|
-
describe " should raise NoMethodError when we call a method " do
|
24
|
-
it "without arugments" do
|
25
|
-
foo_should_not_be_defined
|
26
|
-
lambda { Foo.foo }.should raise_error(NoMethodError)
|
27
|
-
foo_should_not_be_defined
|
28
|
-
end
|
29
|
-
it "with arguments" do
|
30
|
-
foo_should_not_be_defined
|
31
|
-
lambda { Foo.foo(1) }.should raise_error(NoMethodError)
|
32
|
-
lambda { Foo.foo(1, 2) }.should raise_error(NoMethodError)
|
33
|
-
foo_should_not_be_defined
|
34
|
-
end
|
35
|
-
it "with block" do
|
36
|
-
foo_should_not_be_defined
|
37
|
-
lambda { Foo.foo{} }.should raise_error(NoMethodError)
|
38
|
-
foo_should_not_be_defined
|
39
|
-
end
|
40
|
-
it "with arguments and block" do
|
41
|
-
foo_should_not_be_defined
|
42
|
-
lambda { Foo.foo(1){} }.should raise_error(NoMethodError)
|
43
|
-
foo_should_not_be_defined
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
describe ".dsl_accessor without arguments" do
|
48
|
-
it "should be accepted" do
|
49
|
-
lambda {
|
50
|
-
Foo.dsl_accessor
|
51
|
-
}.should_not raise_error
|
52
|
-
end
|
53
|
-
|
54
|
-
it "should mark auto_declared" do
|
55
|
-
Foo.send(:dsl_accessor_auto_declared?).should be_false
|
56
|
-
Foo.dsl_accessor
|
57
|
-
Foo.send(:dsl_accessor_auto_declared?).should be_true
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
describe "auto_declared" do
|
62
|
-
before(:each) do
|
63
|
-
class Foo
|
64
|
-
dsl_accessor
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
it "should raise NoMethodError if unknown method with args is called" do
|
69
|
-
lambda {
|
70
|
-
Foo.foo(1)
|
71
|
-
}.should raise_error(NoMethodError)
|
72
|
-
end
|
73
|
-
|
74
|
-
it "should raise NoMethodError when unknown method is called with args and block" do
|
75
|
-
lambda {
|
76
|
-
Foo.foo(1){}
|
77
|
-
}.should raise_error(NoMethodError)
|
78
|
-
end
|
79
|
-
|
80
|
-
describe " when unknown method is called with a block" do
|
81
|
-
it "should trap NoMethodError" do
|
82
|
-
lambda {
|
83
|
-
Foo.foo{}
|
84
|
-
}.should_not raise_error(NoMethodError)
|
85
|
-
end
|
86
|
-
|
87
|
-
it "should define its instance method automatically" do
|
88
|
-
foo_should_not_be_defined
|
89
|
-
Foo.foo{1}
|
90
|
-
Foo.new.should respond_to(:foo)
|
91
|
-
Foo.new.foo.should == 1
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
it "should affect nothing to subclasses" do
|
96
|
-
class Bar < Foo
|
97
|
-
end
|
98
|
-
|
99
|
-
lambda { Bar.bar }.should raise_error(NoMethodError)
|
100
|
-
lambda { Bar.bar(1) }.should raise_error(NoMethodError)
|
101
|
-
lambda { Bar.bar(1, 2) }.should raise_error(NoMethodError)
|
102
|
-
lambda { Bar.bar{} }.should raise_error(NoMethodError)
|
103
|
-
lambda { Bar.bar(1){} }.should raise_error(NoMethodError)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
data/test/default_test.rb
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper'
|
2
|
-
|
3
|
-
|
4
|
-
class DslDefaultAccessorTest < Test::Unit::TestCase
|
5
|
-
|
6
|
-
class CoolActiveRecord
|
7
|
-
dsl_accessor :primary_key, :default=>"id"
|
8
|
-
dsl_accessor :table_name, :default=>proc{|klass| klass.name.split(/::/).last.downcase+"s"}
|
9
|
-
end
|
10
|
-
|
11
|
-
class Item < CoolActiveRecord
|
12
|
-
end
|
13
|
-
|
14
|
-
class User < CoolActiveRecord
|
15
|
-
end
|
16
|
-
|
17
|
-
class Folder
|
18
|
-
dsl_accessor :array_folder, :default=>[]
|
19
|
-
dsl_accessor :hash_folder, :default=>{}
|
20
|
-
end
|
21
|
-
|
22
|
-
class SubFolder < Folder
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_default_accessor_with_string
|
26
|
-
assert_equal "id", Item.primary_key
|
27
|
-
assert_equal "id", User.primary_key
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_default_accessor_with_proc
|
31
|
-
assert_equal "items", Item.table_name
|
32
|
-
assert_equal "users", User.table_name
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_default_accessor_should_duplicate_empty_array_or_hash
|
36
|
-
Folder.array_folder << 1
|
37
|
-
Folder.hash_folder[:name] = "maiha"
|
38
|
-
|
39
|
-
assert_equal([1], Folder.array_folder)
|
40
|
-
assert_equal({:name=>"maiha"}, Folder.hash_folder)
|
41
|
-
|
42
|
-
assert_equal([], SubFolder.array_folder)
|
43
|
-
assert_equal({}, SubFolder.hash_folder)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
|
48
|
-
class DslOverwritenDefaultAccessorTest < Test::Unit::TestCase
|
49
|
-
class CoolActiveRecord
|
50
|
-
dsl_accessor :primary_key, :default=>"id"
|
51
|
-
dsl_accessor :table_name, :default=>proc{|klass| klass.name+"s"}
|
52
|
-
end
|
53
|
-
|
54
|
-
class Item < CoolActiveRecord
|
55
|
-
primary_key :item_id
|
56
|
-
table_name :item_table
|
57
|
-
end
|
58
|
-
|
59
|
-
def test_overwrite_default_accessor
|
60
|
-
assert_equal :item_id, Item.primary_key
|
61
|
-
assert_equal :item_table, Item.table_name
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
data/test/dsl_accessor_test.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper'
|
2
|
-
|
3
|
-
|
4
|
-
class DslAccessorTest < Test::Unit::TestCase
|
5
|
-
class CoolActiveRecord
|
6
|
-
dsl_accessor :primary_key
|
7
|
-
dsl_accessor :table_name
|
8
|
-
end
|
9
|
-
|
10
|
-
class Item < CoolActiveRecord
|
11
|
-
end
|
12
|
-
|
13
|
-
class LegacyItem < CoolActiveRecord
|
14
|
-
primary_key :itcd
|
15
|
-
table_name :item
|
16
|
-
end
|
17
|
-
|
18
|
-
class OtherClass
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_dsl_accessor_doesnt_affect_other_classes
|
22
|
-
assert !OtherClass.respond_to?(:primary_key)
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_accessor_without_initialization
|
26
|
-
assert_equal nil, Item.primary_key
|
27
|
-
assert_equal nil, Item.table_name
|
28
|
-
|
29
|
-
Item.primary_key :itcd
|
30
|
-
Item.table_name :item
|
31
|
-
|
32
|
-
assert_equal :itcd, Item.primary_key
|
33
|
-
assert_equal :item, Item.table_name
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_accessor_with_initialization
|
37
|
-
assert_equal :itcd, LegacyItem.primary_key
|
38
|
-
assert_equal :item, LegacyItem.table_name
|
39
|
-
|
40
|
-
LegacyItem.primary_key :item_id
|
41
|
-
LegacyItem.table_name :item_table
|
42
|
-
|
43
|
-
assert_equal :item_id, LegacyItem.primary_key
|
44
|
-
assert_equal :item_table, LegacyItem.table_name
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
@@ -1,38 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper'
|
2
|
-
|
3
|
-
class DefineInstanceMethodWithOptionsTest < Test::Unit::TestCase
|
4
|
-
class Window
|
5
|
-
dsl_accessor :width, :default=>640, :instance=>:options
|
6
|
-
end
|
7
|
-
|
8
|
-
class OptionedWindow
|
9
|
-
dsl_accessor :width, :default=>640, :instance=>:options
|
10
|
-
def initialize(options = {})
|
11
|
-
@options = options
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_class_method
|
16
|
-
assert_equal Window.width, 640
|
17
|
-
assert_equal OptionedWindow.width, 640
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_instance_method
|
21
|
-
assert_raises(TypeError) { Window.new.width }
|
22
|
-
assert_equal OptionedWindow.new.width, 640
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_use_options_variable_rather_than_default_value
|
26
|
-
window = OptionedWindow.new( :width => 320 )
|
27
|
-
assert_equal window.width, 320
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_instance_options_value_doesnt_affect_to_class_method
|
31
|
-
window = OptionedWindow.new( :width => 320 )
|
32
|
-
assert_equal OptionedWindow.width, 640
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
|
38
|
-
|
data/test/instance_test.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper'
|
2
|
-
|
3
|
-
class DefineInstanceMethodTest < Test::Unit::TestCase
|
4
|
-
class Item
|
5
|
-
dsl_accessor :primary_key, "code", :instance=>true
|
6
|
-
end
|
7
|
-
|
8
|
-
class OtherClass
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_dsl_accessor_doesnt_affect_other_classes
|
12
|
-
assert !OtherClass.respond_to?(:primary_key)
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_dsl_accessor_doesnt_affect_other_instances
|
16
|
-
assert !OtherClass.new.respond_to?(:primary_key)
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_class_method
|
20
|
-
assert Item.respond_to?(:primary_key)
|
21
|
-
assert_nothing_raised do
|
22
|
-
Item.primary_key
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_class_method_value
|
27
|
-
assert_equal "code", Item.primary_key
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_instance_method
|
31
|
-
assert Item.new.respond_to?(:primary_key)
|
32
|
-
assert_nothing_raised do
|
33
|
-
Item.new.primary_key
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def test_instance_method_value
|
38
|
-
assert_equal "code", Item.new.primary_key
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
|
43
|
-
|
data/test/test_helper.rb
DELETED
data/test/writer_test.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper'
|
2
|
-
|
3
|
-
|
4
|
-
class DslWriterAccessorTest < Test::Unit::TestCase
|
5
|
-
class Item
|
6
|
-
dsl_accessor :primary_key, :writer=>proc{|value| value.to_s}
|
7
|
-
end
|
8
|
-
|
9
|
-
def test_string_writer
|
10
|
-
assert_equal "", Item.primary_key
|
11
|
-
|
12
|
-
Item.primary_key :id
|
13
|
-
assert_equal "id", Item.primary_key
|
14
|
-
|
15
|
-
Item.primary_key "id"
|
16
|
-
assert_equal "id", Item.primary_key
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
|
21
|
-
|