mongoo 0.5.5 → 0.5.6
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/VERSION +1 -1
- data/lib/mongoo/core.rb +5 -0
- data/lib/mongoo/modifiers.rb +10 -5
- data/lib/mongoo/persistence.rb +34 -2
- data/mongoo.gemspec +2 -2
- data/test/test_embedded.rb +54 -0
- metadata +25 -25
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.6
|
data/lib/mongoo/core.rb
CHANGED
data/lib/mongoo/modifiers.rb
CHANGED
@@ -27,7 +27,11 @@ module Mongoo
|
|
27
27
|
def cast_value(v)
|
28
28
|
if v.is_a?(Mongoo::Embedded::Base)
|
29
29
|
return v.to_hash
|
30
|
-
|
30
|
+
elsif v.is_a?(Array)
|
31
|
+
v.collect { |e| e.is_a?(Mongoo::Embedded::Base) ? e.to_hash : e }
|
32
|
+
else
|
33
|
+
v
|
34
|
+
end
|
31
35
|
end
|
32
36
|
|
33
37
|
def inc(k, v=1)
|
@@ -106,6 +110,7 @@ module Mongoo
|
|
106
110
|
if !ret.is_a?(Hash) || (ret["err"] == nil && ret["n"] == 1)
|
107
111
|
@queue.each do |op, op_queue|
|
108
112
|
op_queue.each do |k, v|
|
113
|
+
duped_v = Marshal.load(Marshal.dump(v))
|
109
114
|
case op
|
110
115
|
when "$inc" then
|
111
116
|
new_val = @doc.persisted_mongohash.dot_get(k).to_i + v
|
@@ -113,7 +118,7 @@ module Mongoo
|
|
113
118
|
@doc.persisted_mongohash.dot_set( k, new_val )
|
114
119
|
when "$set" then
|
115
120
|
@doc.mongohash.dot_set( k, v )
|
116
|
-
@doc.persisted_mongohash.dot_set( k,
|
121
|
+
@doc.persisted_mongohash.dot_set( k, duped_v )
|
117
122
|
when "$unset" then
|
118
123
|
@doc.mongohash.dot_delete( k )
|
119
124
|
@doc.persisted_mongohash.dot_delete( k )
|
@@ -125,7 +130,7 @@ module Mongoo
|
|
125
130
|
@doc.mongohash.dot_set(k, [])
|
126
131
|
end
|
127
132
|
|
128
|
-
@doc.persisted_mongohash.dot_get(k) <<
|
133
|
+
@doc.persisted_mongohash.dot_get(k) << duped_v
|
129
134
|
@doc.mongohash.dot_get(k) << v
|
130
135
|
when "$pushAll" then
|
131
136
|
unless @doc.persisted_mongohash.dot_get(k)
|
@@ -135,7 +140,7 @@ module Mongoo
|
|
135
140
|
@doc.mongohash.dot_set(k, [])
|
136
141
|
end
|
137
142
|
|
138
|
-
@doc.persisted_mongohash.dot_get(k).concat(
|
143
|
+
@doc.persisted_mongohash.dot_get(k).concat(duped_v)
|
139
144
|
@doc.mongohash.dot_get(k).concat(v)
|
140
145
|
when "$addToSet" then
|
141
146
|
unless @doc.persisted_mongohash.dot_get(k)
|
@@ -146,7 +151,7 @@ module Mongoo
|
|
146
151
|
end
|
147
152
|
|
148
153
|
unless @doc.persisted_mongohash.dot_get(k).include?(v)
|
149
|
-
@doc.persisted_mongohash.dot_get(k) <<
|
154
|
+
@doc.persisted_mongohash.dot_get(k) << duped_v
|
150
155
|
end
|
151
156
|
unless @doc.mongohash.dot_get(k).include?(v)
|
152
157
|
@doc.mongohash.dot_get(k) << v
|
data/lib/mongoo/persistence.rb
CHANGED
@@ -12,6 +12,33 @@ module Mongoo
|
|
12
12
|
|
13
13
|
module Persistence
|
14
14
|
|
15
|
+
class RawUpdate
|
16
|
+
attr_accessor :criteria, :updates, :opts
|
17
|
+
|
18
|
+
def initialize(doc)
|
19
|
+
@doc = doc
|
20
|
+
@criteria ||= {}
|
21
|
+
@updates ||= {}
|
22
|
+
@opts ||= {}
|
23
|
+
end
|
24
|
+
|
25
|
+
def will_change(&block)
|
26
|
+
@will_change_block = block
|
27
|
+
end
|
28
|
+
|
29
|
+
def run
|
30
|
+
@criteria.stringify_keys!
|
31
|
+
@criteria["_id"] = @doc.id
|
32
|
+
ret = @doc.collection.update(self.criteria, self.updates, self.opts)
|
33
|
+
if !ret.is_a?(Hash) || (ret["updatedExisting"] && ret["n"] == 1)
|
34
|
+
if @will_change_block
|
35
|
+
@will_change_block.call(@doc, ret)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
ret
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
15
42
|
def self.included(base)
|
16
43
|
base.extend(ClassMethods)
|
17
44
|
end
|
@@ -210,6 +237,12 @@ module Mongoo
|
|
210
237
|
insert(opts.merge(:safe => true))
|
211
238
|
end
|
212
239
|
|
240
|
+
def raw_update(&block)
|
241
|
+
raw = RawUpdate.new(self)
|
242
|
+
block.call(raw)
|
243
|
+
raw.run
|
244
|
+
end
|
245
|
+
|
213
246
|
def update(opts={})
|
214
247
|
_run_update_callbacks do
|
215
248
|
unless persisted?
|
@@ -240,8 +273,7 @@ module Mongoo
|
|
240
273
|
else
|
241
274
|
ret = self.collection.update(update_query_hash, update_hash, opts)
|
242
275
|
if !ret.is_a?(Hash) || (ret["updatedExisting"] && ret["n"] == 1)
|
243
|
-
|
244
|
-
@persisted = true
|
276
|
+
reset_persisted_mongohash
|
245
277
|
true
|
246
278
|
else
|
247
279
|
if opts[:only_if_current]
|
data/mongoo.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{mongoo}
|
8
|
-
s.version = "0.5.
|
8
|
+
s.version = "0.5.6"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Ben Myles"]
|
12
|
-
s.date = %q{2011-06-
|
12
|
+
s.date = %q{2011-06-20}
|
13
13
|
s.description = %q{Simple object mapper for MongoDB}
|
14
14
|
s.email = %q{ben.myles@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
data/test/test_embedded.rb
CHANGED
@@ -240,4 +240,58 @@ class TestEmbedded < Test::Unit::TestCase
|
|
240
240
|
assert_equal 1, c.addresses.size
|
241
241
|
assert_equal [address], c.addresses.to_a
|
242
242
|
end
|
243
|
+
|
244
|
+
should "be able to change an element in an embedded array doc" do
|
245
|
+
c = Customer.new(name: "Ben")
|
246
|
+
c.insert!
|
247
|
+
|
248
|
+
address = c.addresses.build(street: "123 Street", city: "Metropolis")
|
249
|
+
c.mod! do |m|
|
250
|
+
m.push 'addresses', address
|
251
|
+
end
|
252
|
+
|
253
|
+
assert_equal address, c.addresses.first
|
254
|
+
assert_equal address, c.addresses[0]
|
255
|
+
assert_equal 1, c.addresses.size
|
256
|
+
|
257
|
+
addr = c.addresses[0]
|
258
|
+
addr.street = "456 Street"
|
259
|
+
|
260
|
+
assert_equal [[:set, "addresses", [{"street"=>"456 Street", "city"=>"Metropolis"}]]], c.changelog
|
261
|
+
end
|
262
|
+
|
263
|
+
should "be able to do a custom update with modifiers" do
|
264
|
+
c = Customer.new(name: "Ben")
|
265
|
+
c.insert!
|
266
|
+
|
267
|
+
addresses = []
|
268
|
+
%w(123 456 789).each do |s|
|
269
|
+
addresses << c.addresses.build(street: "123 Street", city: "Metropolis")
|
270
|
+
end
|
271
|
+
c.mod! do |m|
|
272
|
+
m.push_all 'addresses', addresses
|
273
|
+
end
|
274
|
+
|
275
|
+
2.times do
|
276
|
+
assert_equal addresses[0], c.addresses.first
|
277
|
+
assert_equal addresses[2], c.addresses.last
|
278
|
+
assert_equal 3, c.addresses.size
|
279
|
+
c = Customer.find_one(c.id)
|
280
|
+
end
|
281
|
+
|
282
|
+
resp = c.raw_update do |u|
|
283
|
+
u.updates = { "$push" => { "addresses" => { "street" => "1 E Main St", "city" => "NY" } } }
|
284
|
+
u.opts = { safe: true }
|
285
|
+
u.will_change do |doc, res|
|
286
|
+
doc.addresses.raw << { "street" => "1 E Main St", "city" => "NY" }
|
287
|
+
doc.persisted_mongohash["addresses"] = doc.addresses.raw
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
2.times do
|
292
|
+
assert_equal 4, c.addresses.size
|
293
|
+
assert_equal "NY", c.addresses.last.city
|
294
|
+
c = Customer.find_one(c.id)
|
295
|
+
end
|
296
|
+
end
|
243
297
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,12 +9,12 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-06-
|
12
|
+
date: 2011-06-20 00:00:00.000000000 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: i18n
|
17
|
-
requirement: &
|
17
|
+
requirement: &2151897000 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: 0.4.1
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *2151897000
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: activesupport
|
28
|
-
requirement: &
|
28
|
+
requirement: &2151895180 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: 3.0.3
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *2151895180
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: activemodel
|
39
|
-
requirement: &
|
39
|
+
requirement: &2151893580 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ! '>='
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: 3.0.3
|
45
45
|
type: :runtime
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *2151893580
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: mongo
|
50
|
-
requirement: &
|
50
|
+
requirement: &2151891620 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ~>
|
@@ -55,10 +55,10 @@ dependencies:
|
|
55
55
|
version: 1.3.1
|
56
56
|
type: :runtime
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *2151891620
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: ruby-debug19
|
61
|
-
requirement: &
|
61
|
+
requirement: &2151889100 !ruby/object:Gem::Requirement
|
62
62
|
none: false
|
63
63
|
requirements:
|
64
64
|
- - ! '>='
|
@@ -66,10 +66,10 @@ dependencies:
|
|
66
66
|
version: '0'
|
67
67
|
type: :development
|
68
68
|
prerelease: false
|
69
|
-
version_requirements: *
|
69
|
+
version_requirements: *2151889100
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: shoulda
|
72
|
-
requirement: &
|
72
|
+
requirement: &2151887680 !ruby/object:Gem::Requirement
|
73
73
|
none: false
|
74
74
|
requirements:
|
75
75
|
- - ! '>='
|
@@ -77,10 +77,10 @@ dependencies:
|
|
77
77
|
version: '0'
|
78
78
|
type: :development
|
79
79
|
prerelease: false
|
80
|
-
version_requirements: *
|
80
|
+
version_requirements: *2151887680
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
82
|
name: bundler
|
83
|
-
requirement: &
|
83
|
+
requirement: &2151885300 !ruby/object:Gem::Requirement
|
84
84
|
none: false
|
85
85
|
requirements:
|
86
86
|
- - ~>
|
@@ -88,10 +88,10 @@ dependencies:
|
|
88
88
|
version: 1.0.0
|
89
89
|
type: :development
|
90
90
|
prerelease: false
|
91
|
-
version_requirements: *
|
91
|
+
version_requirements: *2151885300
|
92
92
|
- !ruby/object:Gem::Dependency
|
93
93
|
name: jeweler
|
94
|
-
requirement: &
|
94
|
+
requirement: &2151882720 !ruby/object:Gem::Requirement
|
95
95
|
none: false
|
96
96
|
requirements:
|
97
97
|
- - ~>
|
@@ -99,10 +99,10 @@ dependencies:
|
|
99
99
|
version: 1.5.1
|
100
100
|
type: :development
|
101
101
|
prerelease: false
|
102
|
-
version_requirements: *
|
102
|
+
version_requirements: *2151882720
|
103
103
|
- !ruby/object:Gem::Dependency
|
104
104
|
name: rcov
|
105
|
-
requirement: &
|
105
|
+
requirement: &2151880160 !ruby/object:Gem::Requirement
|
106
106
|
none: false
|
107
107
|
requirements:
|
108
108
|
- - ! '>='
|
@@ -110,10 +110,10 @@ dependencies:
|
|
110
110
|
version: '0'
|
111
111
|
type: :development
|
112
112
|
prerelease: false
|
113
|
-
version_requirements: *
|
113
|
+
version_requirements: *2151880160
|
114
114
|
- !ruby/object:Gem::Dependency
|
115
115
|
name: perftools.rb
|
116
|
-
requirement: &
|
116
|
+
requirement: &2151877020 !ruby/object:Gem::Requirement
|
117
117
|
none: false
|
118
118
|
requirements:
|
119
119
|
- - ! '>='
|
@@ -121,10 +121,10 @@ dependencies:
|
|
121
121
|
version: '0'
|
122
122
|
type: :development
|
123
123
|
prerelease: false
|
124
|
-
version_requirements: *
|
124
|
+
version_requirements: *2151877020
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: bson_ext
|
127
|
-
requirement: &
|
127
|
+
requirement: &2151876040 !ruby/object:Gem::Requirement
|
128
128
|
none: false
|
129
129
|
requirements:
|
130
130
|
- - ~>
|
@@ -132,7 +132,7 @@ dependencies:
|
|
132
132
|
version: 1.3.1
|
133
133
|
type: :development
|
134
134
|
prerelease: false
|
135
|
-
version_requirements: *
|
135
|
+
version_requirements: *2151876040
|
136
136
|
description: Simple object mapper for MongoDB
|
137
137
|
email: ben.myles@gmail.com
|
138
138
|
executables: []
|
@@ -197,7 +197,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
197
197
|
version: '0'
|
198
198
|
segments:
|
199
199
|
- 0
|
200
|
-
hash:
|
200
|
+
hash: -2464241099549832500
|
201
201
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
202
202
|
none: false
|
203
203
|
requirements:
|