doodle 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +36 -0
- data/examples/event-location.rb +47 -3
- data/examples/event.rb +30 -21
- data/examples/example-01.rb +1 -0
- data/examples/example-01.rdoc +3 -2
- data/examples/example-02.rb +1 -0
- data/examples/example-02.rdoc +2 -1
- data/examples/example-03.rb +45 -0
- data/examples/example-03.rdoc +55 -0
- data/lib/doodle.rb +220 -186
- data/lib/semantic.cache +8 -0
- data/spec/bugs_spec.rb +1 -1
- data/spec/class_spec.rb +2 -2
- data/spec/collector_spec.rb +49 -1
- data/spec/conversion_spec.rb +0 -8
- data/spec/doodle_context_spec.rb +46 -0
- data/spec/doodle_spec.rb +3 -3
- data/spec/extra_args_spec.rb +20 -0
- data/spec/factory_spec.rb +80 -0
- data/spec/init_spec.rb +60 -6
- data/spec/serialization_spec.rb +7 -2
- data/spec/singleton_spec.rb +63 -0
- metadata +22 -18
- data/examples/event1.rb +0 -33
- data/examples/event2.rb +0 -21
- data/examples/src/sequel_core-1.3/lib/sequel_core/exceptions.rb +0 -48
data/lib/semantic.cache
ADDED
data/spec/bugs_spec.rb
CHANGED
data/spec/class_spec.rb
CHANGED
@@ -25,7 +25,7 @@ describe Doodle, 'class attributes' do
|
|
25
25
|
Foo.metadata.should == 'Foo metadata'
|
26
26
|
end
|
27
27
|
|
28
|
-
it 'should access class attribute via self.class' do
|
28
|
+
it 'should access @foo class attribute via self.class' do
|
29
29
|
@foo.class.metadata = '@foo metadata'
|
30
30
|
@foo.class.metadata.should == '@foo metadata'
|
31
31
|
Foo.metadata.should == '@foo metadata'
|
@@ -48,7 +48,7 @@ describe Doodle, 'class attributes' do
|
|
48
48
|
Bar.metadata.should == 'Bar metadata'
|
49
49
|
end
|
50
50
|
|
51
|
-
it 'should access class attribute via self.class' do
|
51
|
+
it 'should access @bar class attribute via self.class' do
|
52
52
|
@bar.class.metadata = '@bar metadata'
|
53
53
|
@bar.class.metadata.should == '@bar metadata'
|
54
54
|
Bar.metadata.should == '@bar metadata'
|
data/spec/collector_spec.rb
CHANGED
@@ -71,7 +71,7 @@ describe Doodle, "Typed collector with specified collector name" do
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
|
-
describe Doodle, "
|
74
|
+
describe Doodle, "typed collector with specified collector name" do
|
75
75
|
temporary_constant :Location, :Event do
|
76
76
|
before :each do
|
77
77
|
class Location < Doodle::Base
|
@@ -95,3 +95,51 @@ describe Doodle, "Typed collector with specified collector name" do
|
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
|
+
describe Doodle, "typed collector with specified collector name initialized from hash (with default :init param)" do
|
99
|
+
temporary_constant :Location, :Event do
|
100
|
+
before :each do
|
101
|
+
class Location < Doodle::Base
|
102
|
+
has :name, :kind => String
|
103
|
+
has :events, :collect => :Event
|
104
|
+
end
|
105
|
+
class Event < Doodle::Base
|
106
|
+
has :name, :kind => String
|
107
|
+
has :locations, :collect => :Location
|
108
|
+
end
|
109
|
+
end
|
110
|
+
it "should collect items from hash" do
|
111
|
+
event = nil
|
112
|
+
data = {
|
113
|
+
:name => 'RAR',
|
114
|
+
:locations =>
|
115
|
+
[
|
116
|
+
{
|
117
|
+
:name => "Stage 1",
|
118
|
+
:events =>
|
119
|
+
[
|
120
|
+
{
|
121
|
+
:name => 'Foobars',
|
122
|
+
:locations =>
|
123
|
+
[
|
124
|
+
{
|
125
|
+
:name => 'Backstage'
|
126
|
+
}
|
127
|
+
]
|
128
|
+
}
|
129
|
+
]
|
130
|
+
},
|
131
|
+
{
|
132
|
+
:name => "Stage 2"
|
133
|
+
}
|
134
|
+
]
|
135
|
+
}
|
136
|
+
proc {
|
137
|
+
event = Event(data)
|
138
|
+
}.should_not raise_error
|
139
|
+
event.locations.map{|loc| loc.name}.should == ["Stage 1", "Stage 2"]
|
140
|
+
event.locations.map{|loc| loc.class}.should == [Location, Location]
|
141
|
+
event.locations[0].events[0].kind_of?(Event).should == true
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
data/spec/conversion_spec.rb
CHANGED
@@ -45,13 +45,5 @@ describe Doodle, 'defaults which have not been set' do
|
|
45
45
|
foo = Foo.from("2007-12-31")
|
46
46
|
foo.start.should == Date.new(2007, 12, 31)
|
47
47
|
end
|
48
|
-
|
49
|
-
it 'should allow factory function' do
|
50
|
-
# class Foo
|
51
|
-
# include Doodle::Factory
|
52
|
-
# end
|
53
|
-
foo = Foo("2007-12-31")
|
54
|
-
foo.start.should == Date.new(2007, 12, 31)
|
55
|
-
end
|
56
48
|
end
|
57
49
|
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
+
|
3
|
+
describe Doodle, "doodle_context" do
|
4
|
+
temporary_constants :Foo, :Bar do
|
5
|
+
before :each do
|
6
|
+
class Child < Doodle::Base
|
7
|
+
has :name
|
8
|
+
has :dad do
|
9
|
+
# there is an important difference between a block argument
|
10
|
+
# and a Proc object (proc/lambda) argument
|
11
|
+
# - a proc/lamba is treated as a literal argument, i.e. the
|
12
|
+
# - value is set to a Proc
|
13
|
+
# - a block argument, on the other hand, is instance
|
14
|
+
# - evaluated during initialization
|
15
|
+
# - consequences
|
16
|
+
# - can only be done in init block
|
17
|
+
# - somewhat subtle difference (from programmer's point of
|
18
|
+
# - view) between a proc and a block
|
19
|
+
# Also note re: Doodle.parent - its value is only valid
|
20
|
+
# during initialization - this is a way to capture that
|
21
|
+
# value for ues later
|
22
|
+
|
23
|
+
init {
|
24
|
+
Doodle.parent
|
25
|
+
}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class Parent < Child
|
30
|
+
has :children, :collect => Child
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should provide a means to find out the current parent of an item in initialization block' do
|
36
|
+
dad = Parent 'Conn' do
|
37
|
+
child 'Sean'
|
38
|
+
child 'Paul'
|
39
|
+
end
|
40
|
+
|
41
|
+
sean = dad.children[0]
|
42
|
+
sean.dad.name.should == 'Conn'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
data/spec/doodle_spec.rb
CHANGED
@@ -57,7 +57,7 @@ describe Doodle, 'class attributes(false)' do
|
|
57
57
|
Foo.metadata.should == 'Foo metadata'
|
58
58
|
end
|
59
59
|
|
60
|
-
it 'should access class attribute via self.class' do
|
60
|
+
it 'should access @foo.class attribute via self.class' do
|
61
61
|
@foo.class.metadata = '@foo metadata'
|
62
62
|
@foo.class.metadata.should == '@foo metadata'
|
63
63
|
Foo.metadata.should == '@foo metadata'
|
@@ -108,7 +108,7 @@ describe Doodle, 'inherited class attributes(false)' do
|
|
108
108
|
Foo.metadata.should == 'Foo metadata'
|
109
109
|
end
|
110
110
|
|
111
|
-
it 'should access class attribute via self.class' do
|
111
|
+
it 'should access @foo.class attribute via self.class' do
|
112
112
|
@foo.class.metadata = '@foo metadata'
|
113
113
|
@foo.class.metadata.should == '@foo metadata'
|
114
114
|
Foo.metadata.should == '@foo metadata'
|
@@ -122,7 +122,7 @@ describe Doodle, 'inherited class attributes(false)' do
|
|
122
122
|
@bar.class.metadata.should == 'Bar metadata'
|
123
123
|
end
|
124
124
|
|
125
|
-
it 'should access inherited class attribute via self.class' do
|
125
|
+
it 'should access inherited @foo.class attribute via self.class' do
|
126
126
|
@foo.class.metadata = '@foo metadata'
|
127
127
|
@foo.class.metadata.should == '@foo metadata'
|
128
128
|
Foo.metadata.should == '@foo metadata'
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe Doodle, ' unspecified attributes' do
|
4
|
+
temporary_constants :Foo do
|
5
|
+
before :each do
|
6
|
+
class Foo < Doodle::Base
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should raise Doodle::UnknownAttributeError for unspecified attributes' do
|
11
|
+
proc { foo = Foo(:name => 'foo') }.should raise_error(Doodle::UnknownAttributeError)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe Doodle::Attribute, ' unspecified attributes' do
|
17
|
+
it 'should raise Doodle::UnknownAttributeError for unspecified attributes' do
|
18
|
+
proc { foo = Doodle::Attribute(:name => 'foo', :extra => 'unwanted') }.should raise_error(Doodle::UnknownAttributeError)
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe Doodle::Factory, " as part of Doodle::Base" do
|
4
|
+
temporary_constant :Foo, :Bar do
|
5
|
+
before(:each) do
|
6
|
+
class Foo < Doodle::Base
|
7
|
+
has :var1
|
8
|
+
end
|
9
|
+
class Bar < Foo
|
10
|
+
has :var2
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should provide factory function' do
|
15
|
+
proc {
|
16
|
+
foo = Foo("abcd")
|
17
|
+
foo.var1.should == "abcd"
|
18
|
+
}.should_not raise_error
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should inherit factory function' do
|
22
|
+
proc {
|
23
|
+
bar = Bar("abcd", 1234)
|
24
|
+
bar.var1.should == "abcd"
|
25
|
+
bar.var2.should == 1234
|
26
|
+
}.should_not raise_error
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe Doodle::Factory, " included as module" do
|
32
|
+
temporary_constant :Baz, :Qux, :MyDate, :AnotherDate do
|
33
|
+
before(:each) do
|
34
|
+
class Baz
|
35
|
+
include Doodle::Helper
|
36
|
+
has :var1
|
37
|
+
end
|
38
|
+
class Qux < Baz
|
39
|
+
has :var2
|
40
|
+
end
|
41
|
+
class MyDate < Date
|
42
|
+
include Doodle::Factory
|
43
|
+
end
|
44
|
+
class AnotherDate < MyDate
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should provide factory function' do
|
49
|
+
proc {
|
50
|
+
foo = Baz("abcd")
|
51
|
+
foo.var1.should == "abcd"
|
52
|
+
}.should_not raise_error
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'should inherit factory function' do
|
56
|
+
proc {
|
57
|
+
qux = Qux("abcd", 1234)
|
58
|
+
qux.var1.should == "abcd"
|
59
|
+
qux.var2.should == 1234
|
60
|
+
}.should_not raise_error
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'should be includeable in non-doodle classes' do
|
64
|
+
proc {
|
65
|
+
qux = MyDate(2008, 01, 01)
|
66
|
+
qux.to_s.should == "2008-01-01"
|
67
|
+
}.should_not raise_error
|
68
|
+
end
|
69
|
+
|
70
|
+
# do I actually want this? should it be opt-in at each level?
|
71
|
+
# it 'should be inheritable by non-doodle classes' do
|
72
|
+
# proc {
|
73
|
+
# qux = AnotherDate(2008, 01, 01)
|
74
|
+
# qux.to_s.should == "2008-01-01"
|
75
|
+
# }.should_not raise_error
|
76
|
+
# end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
data/spec/init_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require File.dirname(__FILE__) + '/spec_helper.rb'
|
|
2
2
|
|
3
3
|
describe Doodle, 'init' do
|
4
4
|
temporary_constant :Foo do
|
5
|
-
|
5
|
+
|
6
6
|
before(:each) do
|
7
7
|
class Foo
|
8
8
|
include Doodle::Helper
|
@@ -16,7 +16,7 @@ describe Doodle, 'init' do
|
|
16
16
|
has :special, :init => 'D3'
|
17
17
|
end
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
it 'should have instance attribute init via class' do
|
21
21
|
Foo.attributes[:name].init.should == 'D1'
|
22
22
|
end
|
@@ -42,12 +42,66 @@ describe Doodle, 'init' do
|
|
42
42
|
@foo.instance_variables.include?('@name').should == true
|
43
43
|
end
|
44
44
|
it 'should have an initialized class attribute :metadata' do
|
45
|
-
pending 'deciding how this should work'
|
46
|
-
|
45
|
+
pending 'deciding how this should work' do
|
46
|
+
Foo.metadata.should == 'D2'
|
47
|
+
end
|
47
48
|
end
|
48
49
|
it 'should have an initialized singleton attribute :special' do
|
49
|
-
pending 'deciding how this should work'
|
50
|
-
|
50
|
+
pending 'deciding how this should work' do
|
51
|
+
@foo.special.should == 'D3'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe Doodle, 'init' do
|
58
|
+
temporary_constant :Foo do
|
59
|
+
it 'should accept nil as :init' do
|
60
|
+
class Foo < Doodle::Base
|
61
|
+
has :value, :init => nil
|
62
|
+
end
|
63
|
+
foo = Foo.new
|
64
|
+
foo.value.should == nil
|
65
|
+
end
|
66
|
+
end
|
67
|
+
temporary_constant :Foo do
|
68
|
+
it 'should accept true as :init' do
|
69
|
+
class Foo < Doodle::Base
|
70
|
+
has :value, :init => true
|
71
|
+
end
|
72
|
+
foo = Foo.new
|
73
|
+
foo.value.should == true
|
74
|
+
end
|
75
|
+
end
|
76
|
+
temporary_constant :Foo do
|
77
|
+
it 'should accept Fixnum as :init' do
|
78
|
+
class Foo < Doodle::Base
|
79
|
+
has :value, :init => 42
|
80
|
+
end
|
81
|
+
foo = Foo.new
|
82
|
+
foo.value.should == 42
|
83
|
+
end
|
84
|
+
end
|
85
|
+
temporary_constant :Foo do
|
86
|
+
it 'should not evaluate value when proc given as :init' do
|
87
|
+
class Foo < Doodle::Base
|
88
|
+
has :value, :init => proc { 42 }
|
89
|
+
end
|
90
|
+
foo = Foo.new
|
91
|
+
foo.value.call.should == 42
|
92
|
+
end
|
93
|
+
end
|
94
|
+
temporary_constant :Foo do
|
95
|
+
it 'should evaluate value when block given as :init' do
|
96
|
+
class Foo < Doodle::Base
|
97
|
+
has :value do
|
98
|
+
init do
|
99
|
+
42
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
foo = Foo.new
|
104
|
+
foo.value.should == 42
|
51
105
|
end
|
52
106
|
end
|
53
107
|
end
|
data/spec/serialization_spec.rb
CHANGED
@@ -14,7 +14,12 @@ describe Doodle, "Serialization" do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
it "should be serializable to yaml" do
|
17
|
-
|
17
|
+
# is this a bug in the MRI yaml implementation? why the space after Foo?
|
18
|
+
if RUBY_PLATFORM == 'java'
|
19
|
+
@foo.to_yaml.should == "--- !ruby/object:Foo\nvar: 42\n"
|
20
|
+
else
|
21
|
+
@foo.to_yaml.should == "--- !ruby/object:Foo \nvar: 42\n"
|
22
|
+
end
|
18
23
|
end
|
19
24
|
|
20
25
|
it "should be loadable from yaml" do
|
@@ -24,7 +29,7 @@ describe Doodle, "Serialization" do
|
|
24
29
|
end
|
25
30
|
|
26
31
|
it "should make it possible to validate already set instance variables" do
|
27
|
-
new_foo = YAML::load("--- !ruby/object:Foo
|
32
|
+
new_foo = YAML::load("--- !ruby/object:Foo\nvar: Hello World!\n")
|
28
33
|
proc { new_foo.validate!(true) }.should raise_error(Doodle::ValidationError)
|
29
34
|
end
|
30
35
|
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/spec_helper.rb"
|
2
|
+
|
3
|
+
describe Doodle, "singletons" do
|
4
|
+
temporary_constant :Foo do
|
5
|
+
it "should allow creating attributes on classes via inheritance" do
|
6
|
+
class Foo < Doodle::Base
|
7
|
+
class << self
|
8
|
+
has :c1
|
9
|
+
end
|
10
|
+
end
|
11
|
+
Foo.attributes.should == OrderedHash.new
|
12
|
+
Foo.singleton_class.attributes.should_not == OrderedHash.new
|
13
|
+
Foo.singleton_class.attributes.map{ |name, attr| name }.should == [:c1]
|
14
|
+
Foo.c1 = 1
|
15
|
+
Foo.c1.should == 1
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should allow creating attributes on classes via module inclusion" do
|
19
|
+
class Foo
|
20
|
+
include Doodle::Helper
|
21
|
+
class << self
|
22
|
+
has :c2
|
23
|
+
end
|
24
|
+
end
|
25
|
+
Foo.attributes.should == OrderedHash.new
|
26
|
+
Foo.singleton_class.attributes.should_not == OrderedHash.new
|
27
|
+
Foo.singleton_class.attributes.map{ |name, attr| name }.should == [:c2]
|
28
|
+
Foo.c2 = 1
|
29
|
+
Foo.c2.should == 1
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should allow creating attributes on singletons via inheritance" do
|
33
|
+
class Foo < Doodle::Base
|
34
|
+
end
|
35
|
+
foo = Foo.new
|
36
|
+
class << foo
|
37
|
+
has :i1
|
38
|
+
end
|
39
|
+
foo.attributes.should == OrderedHash.new
|
40
|
+
foo.singleton_class.attributes.should_not == OrderedHash.new
|
41
|
+
foo.singleton_class.attributes.map{ |name, attr| name }.should == [:i1]
|
42
|
+
foo.i1 = 1
|
43
|
+
foo.i1.should == 1
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should allow creating attributes on a singleton's singleton via module inclusion" do
|
47
|
+
class Foo
|
48
|
+
include Doodle::Helper
|
49
|
+
end
|
50
|
+
foo = Foo.new
|
51
|
+
class << foo
|
52
|
+
class << self
|
53
|
+
has :i2
|
54
|
+
end
|
55
|
+
end
|
56
|
+
foo.attributes.should == OrderedHash.new
|
57
|
+
foo.singleton_class.singleton_class.attributes.should_not == OrderedHash.new
|
58
|
+
foo.singleton_class.singleton_class.attributes.map{ |name, attr| name }.should == [:i2]
|
59
|
+
foo.singleton_class.i2 = 1
|
60
|
+
foo.singleton_class.i2.should == 1
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|