candy 0.2.6 → 0.2.7
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 +8 -0
- data/VERSION +1 -1
- data/candy.gemspec +2 -2
- data/lib/candy.rb +9 -8
- data/lib/candy/array.rb +3 -3
- data/lib/candy/embeddable.rb +15 -13
- data/lib/candy/hash.rb +1 -1
- data/lib/candy/piece.rb +5 -10
- data/lib/candy/wrapper.rb +1 -0
- metadata +3 -3
data/HISTORY.markdown
CHANGED
@@ -3,6 +3,14 @@ Candy History
|
|
3
3
|
|
4
4
|
This document aims to provide only an overview. Further, we've only really been tracking things since **v0.2**. For obsessive detail, just check out the `git log`.
|
5
5
|
|
6
|
+
v0.2.7 - 2010-05-05 (the "yes, you MAY put your peanut butter in my chocolate" release)
|
7
|
+
--------------------------------------------------------------------------------------
|
8
|
+
Found and fixed a convoluted bug that was preventing embedded Candy objects from being saved properly. (It was treating them as _non_-Candy objects, which makes the world a gray and boring place.) While I was at it, refactored some methods and chipped away at some complexity.
|
9
|
+
|
10
|
+
**MODERATELY BREAKING CHANGE ALERT:** I've renamed the `to_mongo` and `from_mongo` methods to `to_candy` and `from_candy`. The initial reason for the _mongo_ names was for some vague semblance of compatibility with [MongoMapper](http://github.com/jnunemaker/mongomapper), but that doesn't make sense since we're treating serialized Candy objects completely differently and expecting them to unpack themselves. I seriously doubt anyone was using these methods yet, but just in case, now you know.
|
11
|
+
|
12
|
+
* Fixed embedding bug on Candy objects
|
13
|
+
|
6
14
|
v0.2.6 - 2010-05-03 (the "Spanish Fly" release)
|
7
15
|
-----------------------------------------------
|
8
16
|
Thanks to [xpaulbettsx](http://github.com/xpaulbettsx) for pointing out in issue \#4 that Candy was attempting to connect to localhost prematurely.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.7
|
data/candy.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{candy}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.7"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Stephen Eley"]
|
12
|
-
s.date = %q{2010-05-
|
12
|
+
s.date = %q{2010-05-05}
|
13
13
|
s.description = %q{Candy provides simple, transparent object persistence for the MongoDB database. Classes that
|
14
14
|
include Candy modules save all properties to Mongo automatically, can be recursively embedded,
|
15
15
|
and can retrieve records with chainable open-ended class methods, eliminating the need for
|
data/lib/candy.rb
CHANGED
@@ -11,13 +11,14 @@ module Candy
|
|
11
11
|
autoload :Wrapper, 'candy/wrapper'
|
12
12
|
autoload :Piece, 'candy/piece'
|
13
13
|
autoload :Collection, 'candy/collection'
|
14
|
+
|
15
|
+
# Special keys for Candy metadata in the Mongo store. We try to keep these to a minimum,
|
16
|
+
# and we're using moderately obscure Unicode symbols to reduce the odds of collisions.
|
17
|
+
# If by some strange happenstance you might have single-character keys in your Mongo
|
18
|
+
# collections that use the 'CIRCLED LATIN SMALL LETTER' Unicode set, you may need to
|
19
|
+
# change these constants. Just be consistent about it if you want to use embedded
|
20
|
+
# documents in Candy.
|
21
|
+
CLASS_KEY = 'ⓒ'.to_sym
|
22
|
+
EMBED_KEY = 'ⓔ'.to_sym
|
14
23
|
end
|
15
24
|
|
16
|
-
# Special keys for Candy metadata in the Mongo store. We try to keep these to a minimum,
|
17
|
-
# and we're using moderately obscure Unicode symbols to reduce the odds of collisions.
|
18
|
-
# If by some strange happenstance you might have single-character keys in your Mongo
|
19
|
-
# collections that use the 'CIRCLED LATIN SMALL LETTER' Unicode set, you may need to
|
20
|
-
# change these constants. Just be consistent about it if you want to use embedded
|
21
|
-
# documents in Candy.
|
22
|
-
CLASS_KEY = 'ⓒ'.to_sym
|
23
|
-
EMBED_KEY = 'ⓔ'.to_sym
|
data/lib/candy/array.rb
CHANGED
@@ -26,7 +26,7 @@ module Candy
|
|
26
26
|
# array in Mongo still matches our current state. If concurrent updates have happened, you might end up
|
27
27
|
# overwriting something other than what you thought.
|
28
28
|
def []=(index, val)
|
29
|
-
property =
|
29
|
+
property = candy_coat(@__candy_parent_key, val)
|
30
30
|
@__candy_parent.set embedded(index => property)
|
31
31
|
self.candy[index] = property
|
32
32
|
end
|
@@ -38,7 +38,7 @@ module Candy
|
|
38
38
|
|
39
39
|
# Appends a value to our array.
|
40
40
|
def <<(val)
|
41
|
-
property =
|
41
|
+
property = candy_coat(@__candy_parent_key, val)
|
42
42
|
@__candy_parent.operate :push, @__candy_parent_key => property
|
43
43
|
self.candy << property
|
44
44
|
end
|
@@ -56,7 +56,7 @@ module Candy
|
|
56
56
|
def candy
|
57
57
|
@__candy ||= []
|
58
58
|
end
|
59
|
-
alias_method :
|
59
|
+
alias_method :to_candy, :candy
|
60
60
|
alias_method :to_ary, :candy
|
61
61
|
|
62
62
|
# Array equality.
|
data/lib/candy/embeddable.rb
CHANGED
@@ -3,9 +3,9 @@ module Candy
|
|
3
3
|
# Shared methods to create associations between top-level objects and embedded objects (hashes,
|
4
4
|
# arrays, or Candy::Pieces).
|
5
5
|
module Embeddable
|
6
|
-
# Tells an embedded object
|
7
|
-
#
|
8
|
-
def
|
6
|
+
# Tells an embedded object about its parent. When its own state changes, it can use this
|
7
|
+
# information to write home and update the parent.
|
8
|
+
def candy_adopt(parent, attribute)
|
9
9
|
@__candy_parent = parent
|
10
10
|
@__candy_parent_key = attribute
|
11
11
|
end
|
@@ -18,16 +18,18 @@ module Candy
|
|
18
18
|
new_fields
|
19
19
|
end
|
20
20
|
|
21
|
-
# Convert hashes and arrays to CandyHashes and CandyArrays.
|
22
|
-
def
|
23
|
-
case value
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
21
|
+
# Convert hashes and arrays to CandyHashes and CandyArrays, and set the parent key for any Candy pieces.
|
22
|
+
def candy_coat(key, value)
|
23
|
+
piece = case value
|
24
|
+
when CandyHash then value
|
25
|
+
when Hash then CandyHash.embed(value)
|
26
|
+
when CandyArray then value
|
27
|
+
when Array then CandyArray.embed(*value) # Explode our array into separate arguments
|
28
|
+
else
|
29
|
+
value
|
30
|
+
end
|
31
|
+
piece.candy_adopt(self, key) if piece.respond_to?(:candy_adopt)
|
32
|
+
piece
|
31
33
|
end
|
32
34
|
|
33
35
|
end
|
data/lib/candy/hash.rb
CHANGED
data/lib/candy/piece.rb
CHANGED
@@ -79,7 +79,7 @@ module Candy
|
|
79
79
|
if args[-1].is_a?(Hash)
|
80
80
|
data = args.pop
|
81
81
|
if @__candy_id = data.delete('_id') # We're an existing document
|
82
|
-
@__candy = self.
|
82
|
+
@__candy = self.from_candy(Wrapper.unwrap(data))
|
83
83
|
elsif data.delete(EMBED_KEY) # We're being embedded: take any data, but don't save to Mongo
|
84
84
|
@__candy = data
|
85
85
|
else
|
@@ -134,14 +134,9 @@ module Candy
|
|
134
134
|
# Hash-like setter. Updates the object's internal state, and writes to the database if the state
|
135
135
|
# has changed. Keys should be passed in as symbols for best consistency with the database.
|
136
136
|
def []=(key, value)
|
137
|
-
property =
|
137
|
+
property = candy_coat(key, value) # Transform hashes and arrays, and communicate embedding
|
138
138
|
candy[key] = property
|
139
|
-
|
140
|
-
property.adopt(self, key)
|
141
|
-
set key => property.to_mongo
|
142
|
-
else
|
143
|
-
set key => property
|
144
|
-
end
|
139
|
+
set key => property
|
145
140
|
end
|
146
141
|
|
147
142
|
# Clears memoized data so that the next read pulls from the database.
|
@@ -170,14 +165,14 @@ module Candy
|
|
170
165
|
|
171
166
|
# Converts the object into a hash for MongoDB storage. Keep in mind that wrapping happens _after_
|
172
167
|
# this stage, so it's best to use symbols for keys and leave internal arrays and hashes alone.
|
173
|
-
def
|
168
|
+
def to_candy
|
174
169
|
candy.merge(CLASS_KEY => self.class.name)
|
175
170
|
end
|
176
171
|
|
177
172
|
# A hoook for specific object classes to set their internal state using the hash passed in by
|
178
173
|
# MongoDB. If you override this method, delete any hash keys you need for your own purposes
|
179
174
|
# and then call 'super' on the remainder.
|
180
|
-
def
|
175
|
+
def from_candy(hash)
|
181
176
|
hash
|
182
177
|
end
|
183
178
|
|
data/lib/candy/wrapper.rb
CHANGED
@@ -27,6 +27,7 @@ module Candy
|
|
27
27
|
def self.wrap(thing)
|
28
28
|
# Pass the simple cases through
|
29
29
|
return thing if BSON_SAFE.include?(thing.class)
|
30
|
+
thing = thing.to_candy if thing.respond_to?(:to_candy) # Make it sweeter if it can be sweetened
|
30
31
|
case thing
|
31
32
|
when Array
|
32
33
|
wrap_array(thing)
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 2
|
8
|
-
-
|
9
|
-
version: 0.2.
|
8
|
+
- 7
|
9
|
+
version: 0.2.7
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Stephen Eley
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-05-
|
17
|
+
date: 2010-05-05 00:00:00 -04:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|