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.
- data/HISTORY +39 -0
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/mongoid.rb +3 -1
- data/lib/mongoid/associations.rb +5 -5
- data/lib/mongoid/associations/has_many.rb +8 -2
- data/lib/mongoid/associations/has_many_related.rb +10 -4
- data/lib/mongoid/attributes.rb +19 -13
- data/lib/mongoid/commands.rb +12 -6
- data/lib/mongoid/commands/create.rb +2 -2
- data/lib/mongoid/commands/delete_all.rb +1 -1
- data/lib/mongoid/commands/save.rb +2 -2
- data/lib/mongoid/components.rb +1 -0
- data/lib/mongoid/contexts.rb +4 -0
- data/lib/mongoid/contexts/enumerable.rb +105 -0
- data/lib/mongoid/contexts/mongo.rb +228 -0
- data/lib/mongoid/contexts/paging.rb +42 -0
- data/lib/mongoid/criteria.rb +42 -191
- data/lib/mongoid/document.rb +19 -13
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/extensions/array/accessors.rb +3 -1
- data/lib/mongoid/extensions/float/conversions.rb +1 -1
- data/lib/mongoid/extensions/hash/accessors.rb +1 -1
- data/lib/mongoid/extensions/integer/conversions.rb +1 -0
- data/lib/mongoid/fields.rb +6 -5
- data/lib/mongoid/matchers.rb +36 -0
- data/lib/mongoid/matchers/all.rb +11 -0
- data/lib/mongoid/matchers/default.rb +20 -0
- data/lib/mongoid/matchers/exists.rb +13 -0
- data/lib/mongoid/matchers/gt.rb +11 -0
- data/lib/mongoid/matchers/gte.rb +11 -0
- data/lib/mongoid/matchers/in.rb +11 -0
- data/lib/mongoid/matchers/lt.rb +11 -0
- data/lib/mongoid/matchers/lte.rb +11 -0
- data/lib/mongoid/matchers/ne.rb +11 -0
- data/lib/mongoid/matchers/nin.rb +11 -0
- data/lib/mongoid/matchers/size.rb +11 -0
- data/lib/mongoid/scope.rb +17 -1
- data/mongoid.gemspec +51 -5
- data/spec/integration/mongoid/associations_spec.rb +67 -5
- data/spec/integration/mongoid/attributes_spec.rb +22 -0
- data/spec/integration/mongoid/commands_spec.rb +51 -12
- data/spec/integration/mongoid/criteria_spec.rb +3 -3
- data/spec/integration/mongoid/document_spec.rb +8 -8
- data/spec/integration/mongoid/finders_spec.rb +1 -1
- data/spec/integration/mongoid/inheritance_spec.rb +6 -0
- data/spec/integration/mongoid/named_scope_spec.rb +1 -1
- data/spec/spec_helper.rb +47 -6
- data/spec/unit/mongoid/associations/has_many_related_spec.rb +42 -0
- data/spec/unit/mongoid/associations/has_many_spec.rb +40 -1
- data/spec/unit/mongoid/attributes_spec.rb +1 -1
- data/spec/unit/mongoid/commands/create_spec.rb +3 -3
- data/spec/unit/mongoid/commands/delete_all_spec.rb +2 -2
- data/spec/unit/mongoid/commands/save_spec.rb +2 -2
- data/spec/unit/mongoid/commands_spec.rb +12 -12
- data/spec/unit/mongoid/contexts/enumerable_spec.rb +208 -0
- data/spec/unit/mongoid/contexts/mongo_spec.rb +370 -0
- data/spec/unit/mongoid/criteria_spec.rb +182 -21
- data/spec/unit/mongoid/extensions/array/accessors_spec.rb +9 -9
- data/spec/unit/mongoid/extensions/date/conversions_spec.rb +2 -1
- data/spec/unit/mongoid/extensions/float/conversions_spec.rb +4 -4
- data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +1 -1
- data/spec/unit/mongoid/fields_spec.rb +3 -3
- data/spec/unit/mongoid/identity_spec.rb +2 -2
- data/spec/unit/mongoid/matchers/all_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/default_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/exists_spec.rb +56 -0
- data/spec/unit/mongoid/matchers/gt_spec.rb +39 -0
- data/spec/unit/mongoid/matchers/gte_spec.rb +49 -0
- data/spec/unit/mongoid/matchers/in_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/lt_spec.rb +39 -0
- data/spec/unit/mongoid/matchers/lte_spec.rb +49 -0
- data/spec/unit/mongoid/matchers/ne_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/nin_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/size_spec.rb +27 -0
- data/spec/unit/mongoid/matchers_spec.rb +329 -0
- data/spec/unit/mongoid/scope_spec.rb +70 -0
- data/spec/unit/mongoid/timestamps_spec.rb +2 -2
- metadata +50 -4
@@ -7,6 +7,111 @@ describe Mongoid::Criteria do
|
|
7
7
|
@canvas_criteria = Mongoid::Criteria.new(Canvas)
|
8
8
|
end
|
9
9
|
|
10
|
+
describe "#+" do
|
11
|
+
|
12
|
+
before do
|
13
|
+
@sir = Person.new(:title => "Sir")
|
14
|
+
@madam = Person.new(:title => "Madam")
|
15
|
+
@canvas = Canvas.new
|
16
|
+
end
|
17
|
+
|
18
|
+
context "when the criteria has not been executed" do
|
19
|
+
|
20
|
+
before do
|
21
|
+
@collection = mock
|
22
|
+
@cursor = stub(:count => 1, :collect => [ @sir, @madam ])
|
23
|
+
Person.expects(:collection).returns(@collection)
|
24
|
+
@collection.expects(:find).returns(@cursor)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "executes the criteria and concats the results" do
|
28
|
+
results = @criteria + [ @canvas ]
|
29
|
+
results.should == [ @sir, @madam, @canvas ]
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
context "when the criteria has been executed" do
|
35
|
+
|
36
|
+
before do
|
37
|
+
@criteria.instance_variable_set(:@collection, [ @sir, @madam ])
|
38
|
+
end
|
39
|
+
|
40
|
+
it "concats the results" do
|
41
|
+
results = @criteria + [ @canvas ]
|
42
|
+
results.should == [ @sir, @madam, @canvas ]
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
context "when the other is a criteria" do
|
48
|
+
|
49
|
+
before do
|
50
|
+
@criteria.instance_variable_set(:@collection, [ @sir, @madam ])
|
51
|
+
@canvas_criteria.instance_variable_set(:@collection, [ @canvas ])
|
52
|
+
end
|
53
|
+
|
54
|
+
it "concats the results" do
|
55
|
+
results = @criteria + @canvas_criteria
|
56
|
+
results.should == [ @sir, @madam, @canvas ]
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "#-" do
|
64
|
+
|
65
|
+
before do
|
66
|
+
@sir = Person.new(:title => "Sir")
|
67
|
+
@madam = Person.new(:title => "Madam")
|
68
|
+
end
|
69
|
+
|
70
|
+
context "when the criteria has not been executed" do
|
71
|
+
|
72
|
+
before do
|
73
|
+
@collection = mock
|
74
|
+
@cursor = stub(:count => 1, :collect => [ @sir, @sir, @madam ])
|
75
|
+
Person.expects(:collection).returns(@collection)
|
76
|
+
@collection.expects(:find).returns(@cursor)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "executes the criteria and returns the difference" do
|
80
|
+
results = @criteria - [ @sir ]
|
81
|
+
results.should == [ @madam ]
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
context "when the criteria has been executed" do
|
87
|
+
|
88
|
+
before do
|
89
|
+
@criteria.instance_variable_set(:@collection, [@sir, @sir, @madam])
|
90
|
+
end
|
91
|
+
|
92
|
+
it "returns the difference" do
|
93
|
+
results = @criteria - [ @sir ]
|
94
|
+
results.should == [ @madam ]
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
context "when the other is a criteria" do
|
100
|
+
|
101
|
+
before do
|
102
|
+
@criteria.instance_variable_set(:@collection, [@sir, @sir, @madam])
|
103
|
+
@canvas_criteria.instance_variable_set(:@collection, [@sir])
|
104
|
+
end
|
105
|
+
|
106
|
+
it "returns the difference" do
|
107
|
+
results = @criteria - @canvas_criteria
|
108
|
+
results.should == [ @madam ]
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
10
115
|
describe "#[]" do
|
11
116
|
|
12
117
|
before do
|
@@ -89,7 +194,59 @@ describe Mongoid::Criteria do
|
|
89
194
|
|
90
195
|
end
|
91
196
|
|
92
|
-
describe "#
|
197
|
+
describe "#context" do
|
198
|
+
|
199
|
+
context "when the context has been set" do
|
200
|
+
|
201
|
+
before do
|
202
|
+
@context = stub
|
203
|
+
@criteria.instance_variable_set(:@context, @context)
|
204
|
+
end
|
205
|
+
|
206
|
+
it "returns the memoized context" do
|
207
|
+
@criteria.context.should == @context
|
208
|
+
end
|
209
|
+
|
210
|
+
end
|
211
|
+
|
212
|
+
context "when the context has not been set" do
|
213
|
+
|
214
|
+
before do
|
215
|
+
@context = stub
|
216
|
+
end
|
217
|
+
|
218
|
+
it "creates a new context" do
|
219
|
+
Mongoid::Contexts::Mongo.expects(:new).with(
|
220
|
+
@criteria.selector, @criteria.options, @criteria.klass
|
221
|
+
).returns(@context)
|
222
|
+
@criteria.context.should == @context
|
223
|
+
end
|
224
|
+
|
225
|
+
end
|
226
|
+
|
227
|
+
context "when the class is embedded" do
|
228
|
+
|
229
|
+
before do
|
230
|
+
@criteria = Mongoid::Criteria.new(Address)
|
231
|
+
end
|
232
|
+
|
233
|
+
it "returns an enumerable context" do
|
234
|
+
@criteria.context.should be_a_kind_of(Mongoid::Contexts::Enumerable)
|
235
|
+
end
|
236
|
+
|
237
|
+
end
|
238
|
+
|
239
|
+
context "when the class is not embedded" do
|
240
|
+
|
241
|
+
it "returns a mongo context" do
|
242
|
+
@criteria.context.should be_a_kind_of(Mongoid::Contexts::Mongo)
|
243
|
+
end
|
244
|
+
|
245
|
+
end
|
246
|
+
|
247
|
+
end
|
248
|
+
|
249
|
+
describe "#entries" do
|
93
250
|
|
94
251
|
context "filtering" do
|
95
252
|
|
@@ -101,7 +258,7 @@ describe Mongoid::Criteria do
|
|
101
258
|
end
|
102
259
|
|
103
260
|
it "filters out unused params" do
|
104
|
-
@criteria.
|
261
|
+
@criteria.entries
|
105
262
|
@criteria.options[:page].should be_nil
|
106
263
|
@criteria.options[:per_page].should be_nil
|
107
264
|
end
|
@@ -119,7 +276,7 @@ describe Mongoid::Criteria do
|
|
119
276
|
end
|
120
277
|
|
121
278
|
it "adds the count instance variable" do
|
122
|
-
@criteria.
|
279
|
+
@criteria.entries.should == []
|
123
280
|
@criteria.count.should == 44
|
124
281
|
end
|
125
282
|
|
@@ -132,7 +289,7 @@ describe Mongoid::Criteria do
|
|
132
289
|
collection = mock
|
133
290
|
Person.expects(:collection).returns(collection)
|
134
291
|
collection.expects(:find).with(@criteria.selector, @criteria.options).returns([])
|
135
|
-
criteria.
|
292
|
+
criteria.entries.should == []
|
136
293
|
end
|
137
294
|
|
138
295
|
end
|
@@ -141,18 +298,6 @@ describe Mongoid::Criteria do
|
|
141
298
|
|
142
299
|
describe "#count" do
|
143
300
|
|
144
|
-
context "when criteria has not been executed" do
|
145
|
-
|
146
|
-
before do
|
147
|
-
@criteria.instance_variable_set(:@count, 34)
|
148
|
-
end
|
149
|
-
|
150
|
-
it "returns a count from the cursor" do
|
151
|
-
@criteria.count.should == 34
|
152
|
-
end
|
153
|
-
|
154
|
-
end
|
155
|
-
|
156
301
|
context "when criteria has been executed" do
|
157
302
|
|
158
303
|
before do
|
@@ -508,7 +653,7 @@ describe Mongoid::Criteria do
|
|
508
653
|
describe "#max" do
|
509
654
|
|
510
655
|
before do
|
511
|
-
@reduce = Mongoid::
|
656
|
+
@reduce = Mongoid::Contexts::Mongo::MAX_REDUCE.gsub("[field]", "age")
|
512
657
|
@collection = mock
|
513
658
|
Person.expects(:collection).returns(@collection)
|
514
659
|
end
|
@@ -564,6 +709,22 @@ describe Mongoid::Criteria do
|
|
564
709
|
@criteria.selector.should == @selector
|
565
710
|
@criteria.options.should == @options
|
566
711
|
end
|
712
|
+
|
713
|
+
end
|
714
|
+
|
715
|
+
context "when the other has a document collection" do
|
716
|
+
|
717
|
+
before do
|
718
|
+
@documents = [ stub ]
|
719
|
+
@other = Mongoid::Criteria.new(Person)
|
720
|
+
@other.documents = @documents
|
721
|
+
end
|
722
|
+
|
723
|
+
it "merges the documents collection in" do
|
724
|
+
@criteria.merge(@other)
|
725
|
+
@criteria.documents.should == @documents
|
726
|
+
end
|
727
|
+
|
567
728
|
end
|
568
729
|
|
569
730
|
end
|
@@ -605,7 +766,7 @@ describe Mongoid::Criteria do
|
|
605
766
|
describe "#[]" do
|
606
767
|
|
607
768
|
it "collects the criteria and calls []" do
|
608
|
-
@criteria.expects(:
|
769
|
+
@criteria.expects(:entries).returns([@document])
|
609
770
|
@criteria[0].should == @document
|
610
771
|
end
|
611
772
|
|
@@ -614,7 +775,7 @@ describe Mongoid::Criteria do
|
|
614
775
|
describe "#rand" do
|
615
776
|
|
616
777
|
it "collects the criteria and call rand" do
|
617
|
-
@criteria.expects(:
|
778
|
+
@criteria.expects(:entries).returns(@array)
|
618
779
|
@array.expects(:send).with(:rand).returns(@document)
|
619
780
|
@criteria.rand
|
620
781
|
end
|
@@ -628,7 +789,7 @@ describe Mongoid::Criteria do
|
|
628
789
|
describe "#min" do
|
629
790
|
|
630
791
|
before do
|
631
|
-
@reduce = Mongoid::
|
792
|
+
@reduce = Mongoid::Contexts::Mongo::MIN_REDUCE.gsub("[field]", "age")
|
632
793
|
@collection = mock
|
633
794
|
Person.expects(:collection).returns(@collection)
|
634
795
|
end
|
@@ -917,7 +1078,7 @@ describe Mongoid::Criteria do
|
|
917
1078
|
context "when klass not provided" do
|
918
1079
|
|
919
1080
|
before do
|
920
|
-
@reduce = Mongoid::
|
1081
|
+
@reduce = Mongoid::Contexts::Mongo::SUM_REDUCE.gsub("[field]", "age")
|
921
1082
|
@collection = mock
|
922
1083
|
Person.expects(:collection).returns(@collection)
|
923
1084
|
end
|
@@ -7,12 +7,12 @@ describe Mongoid::Extensions::Array::Accessors do
|
|
7
7
|
context "when the attributes exist" do
|
8
8
|
|
9
9
|
before do
|
10
|
-
@array = [{
|
10
|
+
@array = [{ "_id" => 1, "name" => "James T. Kirk" }]
|
11
11
|
end
|
12
12
|
|
13
13
|
it "overwrites with the new attributes" do
|
14
|
-
@array.update({
|
15
|
-
@array.first[
|
14
|
+
@array.update({ "_id" => 1, "name" => "Spock" })
|
15
|
+
@array.first["name"].should == "Spock"
|
16
16
|
end
|
17
17
|
|
18
18
|
end
|
@@ -20,13 +20,13 @@ describe Mongoid::Extensions::Array::Accessors do
|
|
20
20
|
context "when the attributes do not exist" do
|
21
21
|
|
22
22
|
before do
|
23
|
-
@array = [{
|
23
|
+
@array = [{ "_id" => 1, "name" => "James T. Kirk" }]
|
24
24
|
end
|
25
25
|
|
26
26
|
it "appends the new attributes" do
|
27
|
-
@array.update({
|
27
|
+
@array.update({ "_id" => 2, "name" => "Scotty" })
|
28
28
|
@array.size.should == 2
|
29
|
-
@array.last[
|
29
|
+
@array.last["name"].should == "Scotty"
|
30
30
|
end
|
31
31
|
|
32
32
|
end
|
@@ -34,13 +34,13 @@ describe Mongoid::Extensions::Array::Accessors do
|
|
34
34
|
context "when the new attribtues have no id" do
|
35
35
|
|
36
36
|
before do
|
37
|
-
@array = [{
|
37
|
+
@array = [{ "_id" => 1, :name => "James T. Kirk" }]
|
38
38
|
end
|
39
39
|
|
40
40
|
it "appends the new attributes" do
|
41
|
-
@array.update({
|
41
|
+
@array.update({"name" => "Scotty" })
|
42
42
|
@array.size.should == 2
|
43
|
-
@array.last[
|
43
|
+
@array.last["name"].should == "Scotty"
|
44
44
|
end
|
45
45
|
|
46
46
|
end
|
@@ -21,7 +21,8 @@ describe Mongoid::Extensions::Date::Conversions do
|
|
21
21
|
context "when string is a date" do
|
22
22
|
|
23
23
|
it "returns a time from the string" do
|
24
|
-
|
24
|
+
date = RUBY_VERSION.start_with?("1.9") ? "15/01/2007" : "01/15/2007"
|
25
|
+
Date.set(date).should == Date.new(2007, 1, 15).at_midnight.utc
|
25
26
|
end
|
26
27
|
|
27
28
|
end
|
@@ -12,9 +12,9 @@ describe Mongoid::Extensions::Float::Conversions do
|
|
12
12
|
|
13
13
|
end
|
14
14
|
|
15
|
-
context "when the
|
15
|
+
context "when the value is not a number" do
|
16
16
|
|
17
|
-
context "when the
|
17
|
+
context "when the value is non numerical" do
|
18
18
|
|
19
19
|
it "returns the string" do
|
20
20
|
Float.set("foo").should == "foo"
|
@@ -33,7 +33,7 @@ describe Mongoid::Extensions::Float::Conversions do
|
|
33
33
|
context "when the string is empty" do
|
34
34
|
|
35
35
|
it "returns 0.0" do
|
36
|
-
Float.set("").should
|
36
|
+
Float.set("").should be_nil
|
37
37
|
end
|
38
38
|
|
39
39
|
end
|
@@ -41,7 +41,7 @@ describe Mongoid::Extensions::Float::Conversions do
|
|
41
41
|
context "when the string is nil" do
|
42
42
|
|
43
43
|
it "returns 0.0" do
|
44
|
-
Float.set(nil).should
|
44
|
+
Float.set(nil).should be_nil
|
45
45
|
end
|
46
46
|
|
47
47
|
end
|
@@ -95,17 +95,17 @@ describe Mongoid::Fields do
|
|
95
95
|
end
|
96
96
|
|
97
97
|
it "uses the alias to write the attribute" do
|
98
|
-
@person.expects(:write_attribute).with(
|
98
|
+
@person.expects(:write_attribute).with("aliased", true)
|
99
99
|
@person.alias = true
|
100
100
|
end
|
101
101
|
|
102
102
|
it "uses the alias to read the attribute" do
|
103
|
-
@person.expects(:read_attribute).with(
|
103
|
+
@person.expects(:read_attribute).with("aliased")
|
104
104
|
@person.alias
|
105
105
|
end
|
106
106
|
|
107
107
|
it "uses the alias for the query method" do
|
108
|
-
@person.expects(:read_attribute).with(
|
108
|
+
@person.expects(:read_attribute).with("aliased")
|
109
109
|
@person.alias?
|
110
110
|
end
|
111
111
|
|
@@ -19,7 +19,7 @@ describe Mongoid::Identity do
|
|
19
19
|
|
20
20
|
before do
|
21
21
|
@address = Address.allocate
|
22
|
-
@address.instance_variable_set(:@attributes, {
|
22
|
+
@address.instance_variable_set(:@attributes, { "street" => "Market St"})
|
23
23
|
end
|
24
24
|
|
25
25
|
it "sets the id to the composite key" do
|
@@ -51,7 +51,7 @@ describe Mongoid::Identity do
|
|
51
51
|
|
52
52
|
before do
|
53
53
|
@person = Person.allocate
|
54
|
-
@person.instance_variable_set(:@attributes, {
|
54
|
+
@person.instance_variable_set(:@attributes, { "_id" => "5" })
|
55
55
|
end
|
56
56
|
|
57
57
|
it "returns the existing id" do
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mongoid::Matchers::All do
|
4
|
+
|
5
|
+
let(:matcher) { Mongoid::Matchers::All.new(["first", "second"]) }
|
6
|
+
|
7
|
+
describe "#matches?" do
|
8
|
+
|
9
|
+
context "when the values are equal" do
|
10
|
+
|
11
|
+
it "returns true" do
|
12
|
+
matcher.matches?("$all" => ["first", "second"]).should be_true
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
context "when the values are not equal" do
|
18
|
+
|
19
|
+
it "returns false" do
|
20
|
+
matcher.matches?("$all" => ["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::Default do
|
4
|
+
|
5
|
+
let(:matcher) { Mongoid::Matchers::Default.new("Testing") }
|
6
|
+
|
7
|
+
describe "#matches?" do
|
8
|
+
|
9
|
+
context "when the values are equal" do
|
10
|
+
|
11
|
+
it "returns true" do
|
12
|
+
matcher.matches?("Testing").should be_true
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
context "when the values are not equal" do
|
18
|
+
|
19
|
+
it "returns false" do
|
20
|
+
matcher.matches?("Other").should be_false
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|