mongoid 1.0.6 → 1.1.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.
Files changed (79) hide show
  1. data/HISTORY +39 -0
  2. data/Rakefile +1 -1
  3. data/VERSION +1 -1
  4. data/lib/mongoid.rb +3 -1
  5. data/lib/mongoid/associations.rb +5 -5
  6. data/lib/mongoid/associations/has_many.rb +8 -2
  7. data/lib/mongoid/associations/has_many_related.rb +10 -4
  8. data/lib/mongoid/attributes.rb +19 -13
  9. data/lib/mongoid/commands.rb +12 -6
  10. data/lib/mongoid/commands/create.rb +2 -2
  11. data/lib/mongoid/commands/delete_all.rb +1 -1
  12. data/lib/mongoid/commands/save.rb +2 -2
  13. data/lib/mongoid/components.rb +1 -0
  14. data/lib/mongoid/contexts.rb +4 -0
  15. data/lib/mongoid/contexts/enumerable.rb +105 -0
  16. data/lib/mongoid/contexts/mongo.rb +228 -0
  17. data/lib/mongoid/contexts/paging.rb +42 -0
  18. data/lib/mongoid/criteria.rb +42 -191
  19. data/lib/mongoid/document.rb +19 -13
  20. data/lib/mongoid/extensions.rb +1 -0
  21. data/lib/mongoid/extensions/array/accessors.rb +3 -1
  22. data/lib/mongoid/extensions/float/conversions.rb +1 -1
  23. data/lib/mongoid/extensions/hash/accessors.rb +1 -1
  24. data/lib/mongoid/extensions/integer/conversions.rb +1 -0
  25. data/lib/mongoid/fields.rb +6 -5
  26. data/lib/mongoid/matchers.rb +36 -0
  27. data/lib/mongoid/matchers/all.rb +11 -0
  28. data/lib/mongoid/matchers/default.rb +20 -0
  29. data/lib/mongoid/matchers/exists.rb +13 -0
  30. data/lib/mongoid/matchers/gt.rb +11 -0
  31. data/lib/mongoid/matchers/gte.rb +11 -0
  32. data/lib/mongoid/matchers/in.rb +11 -0
  33. data/lib/mongoid/matchers/lt.rb +11 -0
  34. data/lib/mongoid/matchers/lte.rb +11 -0
  35. data/lib/mongoid/matchers/ne.rb +11 -0
  36. data/lib/mongoid/matchers/nin.rb +11 -0
  37. data/lib/mongoid/matchers/size.rb +11 -0
  38. data/lib/mongoid/scope.rb +17 -1
  39. data/mongoid.gemspec +51 -5
  40. data/spec/integration/mongoid/associations_spec.rb +67 -5
  41. data/spec/integration/mongoid/attributes_spec.rb +22 -0
  42. data/spec/integration/mongoid/commands_spec.rb +51 -12
  43. data/spec/integration/mongoid/criteria_spec.rb +3 -3
  44. data/spec/integration/mongoid/document_spec.rb +8 -8
  45. data/spec/integration/mongoid/finders_spec.rb +1 -1
  46. data/spec/integration/mongoid/inheritance_spec.rb +6 -0
  47. data/spec/integration/mongoid/named_scope_spec.rb +1 -1
  48. data/spec/spec_helper.rb +47 -6
  49. data/spec/unit/mongoid/associations/has_many_related_spec.rb +42 -0
  50. data/spec/unit/mongoid/associations/has_many_spec.rb +40 -1
  51. data/spec/unit/mongoid/attributes_spec.rb +1 -1
  52. data/spec/unit/mongoid/commands/create_spec.rb +3 -3
  53. data/spec/unit/mongoid/commands/delete_all_spec.rb +2 -2
  54. data/spec/unit/mongoid/commands/save_spec.rb +2 -2
  55. data/spec/unit/mongoid/commands_spec.rb +12 -12
  56. data/spec/unit/mongoid/contexts/enumerable_spec.rb +208 -0
  57. data/spec/unit/mongoid/contexts/mongo_spec.rb +370 -0
  58. data/spec/unit/mongoid/criteria_spec.rb +182 -21
  59. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +9 -9
  60. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +2 -1
  61. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +4 -4
  62. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +1 -1
  63. data/spec/unit/mongoid/fields_spec.rb +3 -3
  64. data/spec/unit/mongoid/identity_spec.rb +2 -2
  65. data/spec/unit/mongoid/matchers/all_spec.rb +27 -0
  66. data/spec/unit/mongoid/matchers/default_spec.rb +27 -0
  67. data/spec/unit/mongoid/matchers/exists_spec.rb +56 -0
  68. data/spec/unit/mongoid/matchers/gt_spec.rb +39 -0
  69. data/spec/unit/mongoid/matchers/gte_spec.rb +49 -0
  70. data/spec/unit/mongoid/matchers/in_spec.rb +27 -0
  71. data/spec/unit/mongoid/matchers/lt_spec.rb +39 -0
  72. data/spec/unit/mongoid/matchers/lte_spec.rb +49 -0
  73. data/spec/unit/mongoid/matchers/ne_spec.rb +27 -0
  74. data/spec/unit/mongoid/matchers/nin_spec.rb +27 -0
  75. data/spec/unit/mongoid/matchers/size_spec.rb +27 -0
  76. data/spec/unit/mongoid/matchers_spec.rb +329 -0
  77. data/spec/unit/mongoid/scope_spec.rb +70 -0
  78. data/spec/unit/mongoid/timestamps_spec.rb +2 -2
  79. metadata +50 -4
@@ -0,0 +1,56 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Matchers::Exists do
4
+
5
+ describe "#matches?" do
6
+
7
+ context "when checking for existence" do
8
+
9
+ context "when the value exists" do
10
+
11
+ let(:matcher) { Mongoid::Matchers::Exists.new("Test") }
12
+
13
+ it "returns true" do
14
+ matcher.matches?("$exists" => true).should be_true
15
+ end
16
+
17
+ end
18
+
19
+ context "when the value does not exist" do
20
+
21
+ let(:matcher) { Mongoid::Matchers::Exists.new(nil) }
22
+
23
+ it "returns false" do
24
+ matcher.matches?("$exists" => true).should be_false
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+
31
+ context "when checking for nonexistence" do
32
+
33
+ context "when the value exists" do
34
+
35
+ let(:matcher) { Mongoid::Matchers::Exists.new("Test") }
36
+
37
+ it "returns false" do
38
+ matcher.matches?("$exists" => false).should be_false
39
+ end
40
+
41
+ end
42
+
43
+ context "when the value does not exist" do
44
+
45
+ let(:matcher) { Mongoid::Matchers::Exists.new(nil) }
46
+
47
+ it "returns true" do
48
+ matcher.matches?("$exists" => false).should be_true
49
+ end
50
+
51
+ end
52
+ end
53
+
54
+ end
55
+
56
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Matchers::Gt do
4
+
5
+ describe "#matches?" do
6
+
7
+ context "when the value is larger" do
8
+
9
+ let(:matcher) { Mongoid::Matchers::Gt.new(5) }
10
+
11
+ it "returns true" do
12
+ matcher.matches?("$gte" => 3).should be_true
13
+ end
14
+
15
+ end
16
+
17
+ context "when the value is smaller" do
18
+
19
+ let(:matcher) { Mongoid::Matchers::Gt.new(5) }
20
+
21
+ it "returns false" do
22
+ matcher.matches?("$gte" => 10).should be_false
23
+ end
24
+
25
+ end
26
+
27
+ context "when the value is nil" do
28
+
29
+ let(:matcher) { Mongoid::Matchers::Gt.new(nil) }
30
+
31
+ it "returns false" do
32
+ matcher.matches?("$gte" => 5).should be_false
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+
39
+ end
@@ -0,0 +1,49 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Matchers::Gte do
4
+
5
+ describe "#matches?" do
6
+
7
+ context "when the value is larger" do
8
+
9
+ let(:matcher) { Mongoid::Matchers::Gte.new(5) }
10
+
11
+ it "returns true" do
12
+ matcher.matches?("$gte" => 3).should be_true
13
+ end
14
+
15
+ end
16
+
17
+ context "when the value is smaller" do
18
+
19
+ let(:matcher) { Mongoid::Matchers::Gte.new(5) }
20
+
21
+ it "returns false" do
22
+ matcher.matches?("$gte" => 10).should be_false
23
+ end
24
+
25
+ end
26
+
27
+ context "when the value is equal" do
28
+
29
+ let(:matcher) { Mongoid::Matchers::Gte.new(5) }
30
+
31
+ it "returns true" do
32
+ matcher.matches?("$gte" => 5).should be_true
33
+ end
34
+
35
+ end
36
+
37
+ context "when the value is nil" do
38
+
39
+ let(:matcher) { Mongoid::Matchers::Gte.new(nil) }
40
+
41
+ it "returns false" do
42
+ matcher.matches?("$gte" => 5).should be_false
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+
49
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Matchers::In do
4
+
5
+ let(:matcher) { Mongoid::Matchers::In.new("first") }
6
+
7
+ describe "#matches?" do
8
+
9
+ context "when the values includes the attribute" do
10
+
11
+ it "returns true" do
12
+ matcher.matches?("$in" => ["first", "second"]).should be_true
13
+ end
14
+
15
+ end
16
+
17
+ context "when the values dont include the atribute" do
18
+
19
+ it "returns false" do
20
+ matcher.matches?("$in" => ["third"]).should be_false
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Matchers::Lt do
4
+
5
+ describe "#matches?" do
6
+
7
+ context "when the value is larger" do
8
+
9
+ let(:matcher) { Mongoid::Matchers::Lt.new(5) }
10
+
11
+ it "returns false" do
12
+ matcher.matches?("$lt" => 3).should be_false
13
+ end
14
+
15
+ end
16
+
17
+ context "when the value is smaller" do
18
+
19
+ let(:matcher) { Mongoid::Matchers::Lt.new(5) }
20
+
21
+ it "returns true" do
22
+ matcher.matches?("$lt" => 10).should be_true
23
+ end
24
+
25
+ end
26
+
27
+ context "when the value is nil" do
28
+
29
+ let(:matcher) { Mongoid::Matchers::Lt.new(nil) }
30
+
31
+ it "returns false" do
32
+ matcher.matches?("$lt" => 5).should be_false
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+
39
+ end
@@ -0,0 +1,49 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Matchers::Lte do
4
+
5
+ describe "#matches?" do
6
+
7
+ context "when the value is larger" do
8
+
9
+ let(:matcher) { Mongoid::Matchers::Lte.new(5) }
10
+
11
+ it "returns false" do
12
+ matcher.matches?("$lte" => 3).should be_false
13
+ end
14
+
15
+ end
16
+
17
+ context "when the value is smaller" do
18
+
19
+ let(:matcher) { Mongoid::Matchers::Lte.new(5) }
20
+
21
+ it "returns true" do
22
+ matcher.matches?("$lte" => 10).should be_true
23
+ end
24
+
25
+ end
26
+
27
+ context "when the value is equal" do
28
+
29
+ let(:matcher) { Mongoid::Matchers::Lte.new(5) }
30
+
31
+ it "returns true" do
32
+ matcher.matches?("$lte" => 5).should be_true
33
+ end
34
+
35
+ end
36
+
37
+ context "when the value is nil" do
38
+
39
+ let(:matcher) { Mongoid::Matchers::Lte.new(nil) }
40
+
41
+ it "returns false" do
42
+ matcher.matches?("$lte" => 5).should be_false
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+
49
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Matchers::Ne do
4
+
5
+ let(:matcher) { Mongoid::Matchers::Ne.new("first") }
6
+
7
+ describe "#matches?" do
8
+
9
+ context "when the values are not equal" do
10
+
11
+ it "returns true" do
12
+ matcher.matches?("$ne" => "second").should be_true
13
+ end
14
+
15
+ end
16
+
17
+ context "when the values are equal" do
18
+
19
+ it "returns false" do
20
+ matcher.matches?("$ne" => "first").should be_false
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Matchers::Nin do
4
+
5
+ let(:matcher) { Mongoid::Matchers::Nin.new("first") }
6
+
7
+ describe "#matches?" do
8
+
9
+ context "when the values do not contain the attribute" do
10
+
11
+ it "returns true" do
12
+ matcher.matches?("$nin" => ["second", "third"]).should be_true
13
+ end
14
+
15
+ end
16
+
17
+ context "when the values contain the attribute" do
18
+
19
+ it "returns false" do
20
+ matcher.matches?("$nin" => ["first"]).should be_false
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Matchers::Size do
4
+
5
+ let(:matcher) { Mongoid::Matchers::Size.new(["first", "second"]) }
6
+
7
+ describe "#matches?" do
8
+
9
+ context "when the attribute is the same size" do
10
+
11
+ it "returns true" do
12
+ matcher.matches?("$size" => 2).should be_true
13
+ end
14
+
15
+ end
16
+
17
+ context "when the attribute is not the same size" do
18
+
19
+ it "returns false" do
20
+ matcher.matches?("$size" => 5).should be_false
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,329 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Matchers do
4
+
5
+ describe "#matches?" do
6
+
7
+ context "when performing simple matching" do
8
+
9
+ before do
10
+ @document = Address.new(:street => "Clarkenwell Road")
11
+ end
12
+
13
+ context "when the attributes match" do
14
+
15
+ before do
16
+ @selector = { :street => "Clarkenwell Road" }
17
+ end
18
+
19
+ it "returns true" do
20
+ @document.matches?(@selector).should be_true
21
+ end
22
+
23
+ end
24
+
25
+ context "when the attributes dont match" do
26
+
27
+ before do
28
+ @selector = { :street => "Broadway Ave" }
29
+ end
30
+
31
+ it "returns false" do
32
+ @document.matches?(@selector).should be_false
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+
39
+ context "when performing complex matching" do
40
+
41
+ before do
42
+ @document = Address.new(:services => ["first", "second"], :number => 100)
43
+ end
44
+
45
+ context "with an $all selector" do
46
+
47
+ context "when the attributes match" do
48
+
49
+ before do
50
+ @selector = { :services => { "$all" => [ "first", "second" ] } }
51
+ end
52
+
53
+ it "returns true" do
54
+ @document.matches?(@selector).should be_true
55
+ end
56
+
57
+ end
58
+
59
+ context "when the attributes do not match" do
60
+
61
+ before do
62
+ @selector = { :services => { "$all" => [ "first" ] } }
63
+ end
64
+
65
+ it "returns false" do
66
+ @document.matches?(@selector).should be_false
67
+ end
68
+
69
+ end
70
+
71
+ end
72
+
73
+ context "with an $exists selector" do
74
+
75
+ context "when the attributes match" do
76
+
77
+ before do
78
+ @selector = { :services => { "$exists" => true } }
79
+ end
80
+
81
+ it "returns true" do
82
+ @document.matches?(@selector).should be_true
83
+ end
84
+
85
+ end
86
+
87
+ context "when the attributes do not match" do
88
+
89
+ before do
90
+ @selector = { :services => { "$exists" => false } }
91
+ end
92
+
93
+ it "returns false" do
94
+ @document.matches?(@selector).should be_false
95
+ end
96
+
97
+ end
98
+
99
+ end
100
+
101
+ context "with a $gt selector" do
102
+
103
+ context "when the attributes match" do
104
+
105
+ before do
106
+ @selector = { :number => { "$gt" => 50 } }
107
+ end
108
+
109
+ it "returns true" do
110
+ @document.matches?(@selector).should be_true
111
+ end
112
+
113
+ end
114
+
115
+ context "when the attributes do not match" do
116
+
117
+ before do
118
+ @selector = { :number => { "$gt" => 200 } }
119
+ end
120
+
121
+ it "returns false" do
122
+ @document.matches?(@selector).should be_false
123
+ end
124
+
125
+ end
126
+
127
+ end
128
+
129
+ context "with a $gte selector" do
130
+
131
+ context "when the attributes match" do
132
+
133
+ before do
134
+ @selector = { :number => { "$gte" => 100 } }
135
+ end
136
+
137
+ it "returns true" do
138
+ @document.matches?(@selector).should be_true
139
+ end
140
+
141
+ end
142
+
143
+ context "when the attributes do not match" do
144
+
145
+ before do
146
+ @selector = { :number => { "$gte" => 200 } }
147
+ end
148
+
149
+ it "returns false" do
150
+ @document.matches?(@selector).should be_false
151
+ end
152
+
153
+ end
154
+
155
+ end
156
+
157
+ context "with an $in selector" do
158
+
159
+ context "when the attributes match" do
160
+
161
+ before do
162
+ @selector = { :number => { "$in" => [ 100, 200 ] } }
163
+ end
164
+
165
+ it "returns true" do
166
+ @document.matches?(@selector).should be_true
167
+ end
168
+
169
+ end
170
+
171
+ context "when the attributes do not match" do
172
+
173
+ before do
174
+ @selector = { :number => { "$in" => [ 200, 300 ] } }
175
+ end
176
+
177
+ it "returns false" do
178
+ @document.matches?(@selector).should be_false
179
+ end
180
+
181
+ end
182
+
183
+ end
184
+
185
+ context "with a $lt selector" do
186
+
187
+ context "when the attributes match" do
188
+
189
+ before do
190
+ @selector = { :number => { "$lt" => 200 } }
191
+ end
192
+
193
+ it "returns true" do
194
+ @document.matches?(@selector).should be_true
195
+ end
196
+
197
+ end
198
+
199
+ context "when the attributes do not match" do
200
+
201
+ before do
202
+ @selector = { :number => { "$lt" => 50 } }
203
+ end
204
+
205
+ it "returns false" do
206
+ @document.matches?(@selector).should be_false
207
+ end
208
+
209
+ end
210
+
211
+ end
212
+
213
+ context "with a $lte selector" do
214
+
215
+ context "when the attributes match" do
216
+
217
+ before do
218
+ @selector = { :number => { "$lte" => 200 } }
219
+ end
220
+
221
+ it "returns true" do
222
+ @document.matches?(@selector).should be_true
223
+ end
224
+
225
+ end
226
+
227
+ context "when the attributes do not match" do
228
+
229
+ before do
230
+ @selector = { :number => { "$lte" => 50 } }
231
+ end
232
+
233
+ it "returns false" do
234
+ @document.matches?(@selector).should be_false
235
+ end
236
+
237
+ end
238
+
239
+ end
240
+
241
+ context "with an $ne selector" do
242
+
243
+ context "when the attributes match" do
244
+
245
+ before do
246
+ @selector = { :number => { "$ne" => 200 } }
247
+ end
248
+
249
+ it "returns true" do
250
+ @document.matches?(@selector).should be_true
251
+ end
252
+
253
+ end
254
+
255
+ context "when the attributes do not match" do
256
+
257
+ before do
258
+ @selector = { :number => { "$ne" => 100 } }
259
+ end
260
+
261
+ it "returns false" do
262
+ @document.matches?(@selector).should be_false
263
+ end
264
+
265
+ end
266
+
267
+ end
268
+
269
+ context "with a $nin selector" do
270
+
271
+ context "when the attributes match" do
272
+
273
+ before do
274
+ @selector = { :number => { "$nin" => [ 1, 2, 3 ] } }
275
+ end
276
+
277
+ it "returns true" do
278
+ @document.matches?(@selector).should be_true
279
+ end
280
+
281
+ end
282
+
283
+ context "when the attributes do not match" do
284
+
285
+ before do
286
+ @selector = { :number => { "$nin" => [ 100 ] } }
287
+ end
288
+
289
+ it "returns false" do
290
+ @document.matches?(@selector).should be_false
291
+ end
292
+
293
+ end
294
+
295
+ end
296
+
297
+ context "with a $size selector" do
298
+
299
+ context "when the attributes match" do
300
+
301
+ before do
302
+ @selector = { :services => { "$size" => 2 } }
303
+ end
304
+
305
+ it "returns true" do
306
+ @document.matches?(@selector).should be_true
307
+ end
308
+
309
+ end
310
+
311
+ context "when the attributes do not match" do
312
+
313
+ before do
314
+ @selector = { :services => { "$size" => 5 } }
315
+ end
316
+
317
+ it "returns false" do
318
+ @document.matches?(@selector).should be_false
319
+ end
320
+
321
+ end
322
+
323
+ end
324
+
325
+ end
326
+
327
+ end
328
+
329
+ end