candy 0.1.0 → 0.2.1
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/HISTORY.markdown +27 -0
- data/LICENSE.markdown +110 -0
- data/README.markdown +269 -41
- data/Rakefile +7 -9
- data/VERSION +1 -1
- data/candy.gemspec +35 -21
- data/lib/candy.rb +11 -138
- data/lib/candy/array.rb +74 -0
- data/lib/candy/collection.rb +151 -0
- data/lib/candy/crunch.rb +85 -44
- data/lib/candy/embeddable.rb +34 -0
- data/lib/candy/factory.rb +30 -0
- data/lib/candy/hash.rb +30 -0
- data/lib/candy/piece.rb +210 -0
- data/lib/candy/wrapper.rb +39 -13
- data/spec/candy/array_spec.rb +50 -0
- data/spec/candy/collection_spec.rb +102 -0
- data/spec/candy/crunch_spec.rb +17 -36
- data/spec/candy/hash_spec.rb +38 -0
- data/spec/candy/piece_spec.rb +259 -0
- data/spec/candy/wrapper_spec.rb +5 -12
- data/spec/candy_spec.rb +1 -191
- data/spec/spec_helper.rb +5 -1
- data/spec/support/kitkat_fixture.rb +10 -0
- data/spec/support/zagnuts_fixture.rb +10 -0
- metadata +62 -36
- data/LICENSE +0 -20
data/spec/candy/wrapper_spec.rb
CHANGED
@@ -84,23 +84,19 @@ module Candy
|
|
84
84
|
Wrapper.wrap(c).should == c
|
85
85
|
end
|
86
86
|
|
87
|
-
it "can wrap a symbol in a way that preserves its symbolic nature" do
|
88
|
-
Wrapper.wrap(:oldglory).should == "__sym_oldglory"
|
89
|
-
end
|
90
|
-
|
91
87
|
it "wraps an array recursively" do
|
92
88
|
a = [5, 'hi', [':symbol', 0], nil]
|
93
89
|
Wrapper.wrap(a).should == a
|
94
90
|
end
|
95
91
|
|
96
|
-
it "wraps
|
92
|
+
it "wraps keys lightly" do
|
97
93
|
h = {"foo" => "bar", :yoo => "yar"}
|
98
|
-
Wrapper.wrap(h).keys.should == ["foo", "
|
94
|
+
Wrapper.wrap(h).keys.should == ["'foo'", "yoo"]
|
99
95
|
end
|
100
96
|
|
101
97
|
it "wraps a hash's values" do
|
102
98
|
h = {:foo => :bar, :yoo => [:yar, 5]}
|
103
|
-
Wrapper.wrap(h).values.should == [
|
99
|
+
Wrapper.wrap(h).values.should == [:bar, [:yar, 5]]
|
104
100
|
end
|
105
101
|
|
106
102
|
it "rejects procs" do
|
@@ -161,9 +157,6 @@ module Candy
|
|
161
157
|
Wrapper.unwrap(5).should == 5
|
162
158
|
end
|
163
159
|
|
164
|
-
it "turns symbolized strings back into symbols" do
|
165
|
-
Wrapper.unwrap("__sym_blah").should == :blah
|
166
|
-
end
|
167
160
|
|
168
161
|
it "turns hashed objects back into objects" do
|
169
162
|
obj = Wrapper.unwrap(@wrapped)
|
@@ -174,14 +167,14 @@ module Candy
|
|
174
167
|
end
|
175
168
|
|
176
169
|
it "traverses a hash and unwraps whatever it needs to" do
|
177
|
-
hash = {"
|
170
|
+
hash = {"foo" => :bar, "'missile'" => @wrapped}
|
178
171
|
unwrapped = Wrapper.unwrap(hash)
|
179
172
|
unwrapped[:foo].should == :bar
|
180
173
|
unwrapped["missile"].should be_a(Missile)
|
181
174
|
end
|
182
175
|
|
183
176
|
it "traverses an array and unwraps whatever it needs to" do
|
184
|
-
array = [
|
177
|
+
array = [:foo, 5, @wrapped, nil, "hi"]
|
185
178
|
unwrapped = Wrapper.unwrap(array)
|
186
179
|
unwrapped[0].should == :foo
|
187
180
|
unwrapped[1].should == 5
|
data/spec/candy_spec.rb
CHANGED
@@ -1,201 +1,11 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
3
|
describe "Candy" do
|
4
|
-
# An example class to contain our methods
|
5
|
-
class Zagnut
|
6
|
-
include Candy
|
7
|
-
end
|
8
|
-
|
9
|
-
before(:all) do
|
10
|
-
@verifier = Zagnut.collection
|
11
|
-
end
|
12
4
|
|
13
5
|
before(:each) do
|
14
6
|
@this = Zagnut.new
|
15
|
-
end
|
16
|
-
|
17
|
-
|
18
|
-
it "inserts a document immediately" do
|
19
|
-
@this.id.should be_a(Mongo::ObjectID)
|
20
|
-
end
|
21
|
-
|
22
|
-
it "saves any attribute it doesn't already handle to the database" do
|
23
|
-
@this.bite = "Tasty!"
|
24
|
-
@verifier.find_one["bite"].should == "Tasty!"
|
25
|
-
end
|
26
|
-
|
27
|
-
it "retrieves any attribute it doesn't already know about from the database" do
|
28
|
-
@verifier.update({:_id => @this.id}, {:chew => "Yummy!", :bite => "Ouch."})
|
29
|
-
@this.chew.should == "Yummy!"
|
30
|
-
end
|
31
|
-
|
32
|
-
it "can roundtrip effectively" do
|
33
|
-
@this.swallow = "Gulp."
|
34
|
-
@this.swallow.should == "Gulp."
|
35
|
-
end
|
36
|
-
|
37
|
-
it "handles missing attributes gracefully" do
|
38
|
-
@this.licks.should == nil
|
39
|
-
end
|
40
|
-
|
41
|
-
it "allows multiple attributes to be set" do
|
42
|
-
@this.licks = 7
|
43
|
-
@this.center = 0.5
|
44
|
-
@this.licks.should == 7
|
45
|
-
end
|
7
|
+
end
|
46
8
|
|
47
|
-
it "can set properties explicity" do
|
48
|
-
@this.set(:licks, 17)
|
49
|
-
@this.licks.should == 17
|
50
|
-
end
|
51
|
-
|
52
|
-
it "can set properties from a hash" do
|
53
|
-
@this.set(:licks => 19, :center => -2.5)
|
54
|
-
@this.licks.should == 19
|
55
|
-
@this.center.should == -2.5
|
56
|
-
end
|
57
|
-
|
58
|
-
it "wraps objects" do
|
59
|
-
o = Object.new
|
60
|
-
@this.object = o
|
61
|
-
@verifier.find_one["object"]["__object_"]["class"].should == "Object"
|
62
|
-
end
|
63
|
-
|
64
|
-
it "unwraps objects" do
|
65
|
-
@verifier.update({:_id => @this.id}, {:center => {"__object_" => {:class => "Object", :ivars => {"@foo" => "bar"}}}})
|
66
|
-
@this.center.should be_an(Object)
|
67
|
-
@this.center.instance_variable_get(:@foo).should == "bar"
|
68
|
-
end
|
69
|
-
|
70
|
-
describe "retrieval" do
|
71
|
-
it "can find a record by its ID" do
|
72
|
-
@this.licks = 10
|
73
|
-
that = Zagnut.find(@this.id)
|
74
|
-
that.licks.should == 10
|
75
|
-
end
|
76
|
-
|
77
|
-
it "roundtrips across identical objects" do
|
78
|
-
that = Zagnut.find(@this.id)
|
79
|
-
@this.calories = 7500
|
80
|
-
that.calories.should == 7500
|
81
|
-
end
|
82
|
-
|
83
|
-
it "returns nil on an object that can't be found" do
|
84
|
-
id = Mongo::ObjectID.new
|
85
|
-
Zagnut.find(id).should be_nil
|
86
|
-
end
|
87
|
-
|
88
|
-
it "can get a single object by attributes" do
|
89
|
-
@this.pieces = 7.5
|
90
|
-
@this.color = "red"
|
91
|
-
that = Zagnut.first("pieces" => 7.5)
|
92
|
-
that.color.should == "red"
|
93
|
-
end
|
94
|
-
|
95
|
-
it "returns nil if a first object can't be found" do
|
96
|
-
@this.pieces = 11
|
97
|
-
Zagnut.first("pieces" => 5).should be_nil
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
describe "collections" do
|
102
|
-
before(:each) do
|
103
|
-
@this.color = "red"
|
104
|
-
@this.weight = 11.8
|
105
|
-
@that = Zagnut.new
|
106
|
-
@that.color = "red"
|
107
|
-
@that.pieces = 6
|
108
|
-
@that.weight = -5
|
109
|
-
@the_other = Zagnut.new
|
110
|
-
@the_other.color = "blue"
|
111
|
-
@the_other.pieces = 7
|
112
|
-
@the_other.weight = 0
|
113
|
-
end
|
114
|
-
|
115
|
-
it "can get all objects in a collection" do
|
116
|
-
those = Zagnut.all
|
117
|
-
those.count.should == 3
|
118
|
-
end
|
119
|
-
|
120
|
-
it "can get all objects matching a search condition" do
|
121
|
-
those = Zagnut.all(:color => "red")
|
122
|
-
those.count.should == 2
|
123
|
-
end
|
124
|
-
|
125
|
-
it "still returns if nothing matches" do
|
126
|
-
Zagnut.all(:color => "green").to_a.should == []
|
127
|
-
end
|
128
|
-
|
129
|
-
it "can take options" do
|
130
|
-
those = Zagnut.all(:color => "red", :sort => ["weight", :asc])
|
131
|
-
those.collect{|z| z.weight}.should == [-5, 11.8]
|
132
|
-
end
|
133
|
-
|
134
|
-
end
|
135
|
-
|
136
|
-
describe "arrays" do
|
137
|
-
it "can push items" do
|
138
|
-
@this.push(:colors, 'red')
|
139
|
-
@this.colors.should == ['red']
|
140
|
-
end
|
141
|
-
|
142
|
-
it "can push an array of items" do
|
143
|
-
@this.push(:potpourri, 'red', 75, nil)
|
144
|
-
@this.potpourri.should == ['red', 75, nil]
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
describe "numbers" do
|
149
|
-
it "can be incremented by 1 when not set" do
|
150
|
-
@this.inc(:bites)
|
151
|
-
@this.bites.should == 1
|
152
|
-
end
|
153
|
-
|
154
|
-
it "can be incremented by 1 when set" do
|
155
|
-
@this.bites = 11
|
156
|
-
@this.inc(:bites)
|
157
|
-
@this.bites.should == 12
|
158
|
-
end
|
159
|
-
|
160
|
-
it "can be incremented by any number" do
|
161
|
-
@this.bites = -6
|
162
|
-
@this.inc(:bites, 15)
|
163
|
-
@this.bites.should == 9
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
describe "timestamp" do
|
168
|
-
it "can be set on creation" do
|
169
|
-
Zagnut.class_eval("timestamp :create")
|
170
|
-
z = Zagnut.new
|
171
|
-
z.created_at.should be_a(Time)
|
172
|
-
z.updated_at.should be_nil
|
173
|
-
end
|
174
|
-
|
175
|
-
it "can be set on modification" do
|
176
|
-
Zagnut.class_eval("timestamp :update")
|
177
|
-
z = Zagnut.new
|
178
|
-
z.created_at.should be_nil
|
179
|
-
z.updated_at.should be_nil
|
180
|
-
z.bites = 11
|
181
|
-
z.created_at.should be_nil
|
182
|
-
z.updated_at.should be_a(Time)
|
183
|
-
end
|
184
|
-
|
185
|
-
it "sets both by default" do
|
186
|
-
Zagnut.class_eval("timestamp")
|
187
|
-
z = Zagnut.new
|
188
|
-
z.bites = 11
|
189
|
-
z.created_at.should be_a(Time)
|
190
|
-
z.updated_at.should be_a(Time)
|
191
|
-
end
|
192
|
-
|
193
|
-
|
194
|
-
after(:each) do
|
195
|
-
Zagnut.class_eval("timestamp nil")
|
196
|
-
end
|
197
|
-
|
198
|
-
end
|
199
9
|
|
200
10
|
after(:each) do
|
201
11
|
Zagnut.collection.remove
|
data/spec/spec_helper.rb
CHANGED
@@ -5,11 +5,15 @@ require 'spec'
|
|
5
5
|
require 'spec/autorun'
|
6
6
|
require 'mocha'
|
7
7
|
|
8
|
+
|
9
|
+
# Support methods
|
10
|
+
Candy.db = 'candy_test'
|
11
|
+
Dir[File.join(File.dirname(__FILE__), 'support', '*.rb')].each {|f| require f}
|
12
|
+
|
8
13
|
Spec::Runner.configure do |config|
|
9
14
|
config.mock_with :mocha
|
10
15
|
|
11
16
|
config.before(:all) do
|
12
|
-
$MONGO_DB = 'candy_test'
|
13
17
|
end
|
14
18
|
|
15
19
|
config.after(:all) do
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: candy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 2
|
8
|
+
- 1
|
9
|
+
version: 0.2.1
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Stephen Eley
|
@@ -9,56 +14,56 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date: 2010-
|
17
|
+
date: 2010-04-05 00:00:00 -04:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
21
|
name: mongo
|
17
|
-
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
24
|
requirements:
|
21
25
|
- - ">="
|
22
26
|
- !ruby/object:Gem::Version
|
23
|
-
|
24
|
-
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
- 19
|
30
|
+
- 1
|
31
|
+
version: 0.19.1
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
25
34
|
- !ruby/object:Gem::Dependency
|
26
35
|
name: rspec
|
27
|
-
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
38
|
requirements:
|
31
39
|
- - ">="
|
32
40
|
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 1
|
43
|
+
- 2
|
44
|
+
- 9
|
33
45
|
version: 1.2.9
|
34
|
-
version:
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: yard
|
37
46
|
type: :development
|
38
|
-
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
40
|
-
requirements:
|
41
|
-
- - ">="
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: "0"
|
44
|
-
version:
|
47
|
+
version_requirements: *id002
|
45
48
|
- !ruby/object:Gem::Dependency
|
46
49
|
name: mocha
|
47
|
-
|
48
|
-
|
49
|
-
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
50
52
|
requirements:
|
51
53
|
- - ">="
|
52
54
|
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 0
|
57
|
+
- 9
|
58
|
+
- 8
|
53
59
|
version: 0.9.8
|
54
|
-
|
60
|
+
type: :development
|
61
|
+
version_requirements: *id003
|
55
62
|
description: |
|
56
|
-
Candy
|
57
|
-
|
58
|
-
and
|
59
|
-
|
60
|
-
Mongo's atomic operators are used whenever possible, and a smart serializer (Candy::Wrapper)
|
61
|
-
converts almost any object for assignment to any attribute.
|
63
|
+
Candy provides simple, transparent object persistence for the MongoDB database. Classes that
|
64
|
+
include Candy modules save all properties to Mongo automatically, can be recursively embedded,
|
65
|
+
and can retrieve records with chainable open-ended class methods, eliminating the need for
|
66
|
+
method calls like 'save' and 'find.'
|
62
67
|
|
63
68
|
email: sfeley@gmail.com
|
64
69
|
executables: []
|
@@ -66,27 +71,40 @@ executables: []
|
|
66
71
|
extensions: []
|
67
72
|
|
68
73
|
extra_rdoc_files:
|
69
|
-
- LICENSE
|
74
|
+
- LICENSE.markdown
|
70
75
|
- README.markdown
|
71
76
|
files:
|
72
77
|
- .document
|
73
78
|
- .gitignore
|
74
|
-
-
|
79
|
+
- HISTORY.markdown
|
80
|
+
- LICENSE.markdown
|
75
81
|
- README.markdown
|
76
82
|
- Rakefile
|
77
83
|
- VERSION
|
78
84
|
- candy.gemspec
|
79
85
|
- lib/candy.rb
|
86
|
+
- lib/candy/array.rb
|
87
|
+
- lib/candy/collection.rb
|
80
88
|
- lib/candy/crunch.rb
|
89
|
+
- lib/candy/embeddable.rb
|
81
90
|
- lib/candy/exceptions.rb
|
91
|
+
- lib/candy/factory.rb
|
92
|
+
- lib/candy/hash.rb
|
93
|
+
- lib/candy/piece.rb
|
82
94
|
- lib/candy/qualified_const_get.rb
|
83
95
|
- lib/candy/wrapper.rb
|
96
|
+
- spec/candy/array_spec.rb
|
97
|
+
- spec/candy/collection_spec.rb
|
84
98
|
- spec/candy/crunch_spec.rb
|
99
|
+
- spec/candy/hash_spec.rb
|
100
|
+
- spec/candy/piece_spec.rb
|
85
101
|
- spec/candy/wrapper_spec.rb
|
86
102
|
- spec/candy_spec.rb
|
87
103
|
- spec/spec.opts
|
88
104
|
- spec/spec.watchr
|
89
105
|
- spec/spec_helper.rb
|
106
|
+
- spec/support/kitkat_fixture.rb
|
107
|
+
- spec/support/zagnuts_fixture.rb
|
90
108
|
has_rdoc: true
|
91
109
|
homepage: http://github.com/SFEley/candy
|
92
110
|
licenses: []
|
@@ -100,23 +118,31 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
100
118
|
requirements:
|
101
119
|
- - ">="
|
102
120
|
- !ruby/object:Gem::Version
|
121
|
+
segments:
|
122
|
+
- 0
|
103
123
|
version: "0"
|
104
|
-
version:
|
105
124
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
125
|
requirements:
|
107
126
|
- - ">="
|
108
127
|
- !ruby/object:Gem::Version
|
128
|
+
segments:
|
129
|
+
- 0
|
109
130
|
version: "0"
|
110
|
-
version:
|
111
131
|
requirements: []
|
112
132
|
|
113
133
|
rubyforge_project:
|
114
|
-
rubygems_version: 1.3.
|
134
|
+
rubygems_version: 1.3.6
|
115
135
|
signing_key:
|
116
136
|
specification_version: 3
|
117
|
-
summary:
|
137
|
+
summary: Transparent persistence for MongoDB
|
118
138
|
test_files:
|
139
|
+
- spec/candy/array_spec.rb
|
140
|
+
- spec/candy/collection_spec.rb
|
119
141
|
- spec/candy/crunch_spec.rb
|
142
|
+
- spec/candy/hash_spec.rb
|
143
|
+
- spec/candy/piece_spec.rb
|
120
144
|
- spec/candy/wrapper_spec.rb
|
121
145
|
- spec/candy_spec.rb
|
122
146
|
- spec/spec_helper.rb
|
147
|
+
- spec/support/kitkat_fixture.rb
|
148
|
+
- spec/support/zagnuts_fixture.rb
|