mongoid 7.1.0 → 7.1.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CHANGELOG.md +6 -6
- data/README.md +1 -1
- data/lib/config/locales/en.yml +4 -4
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +38 -2
- data/lib/mongoid/association/referenced/eager.rb +29 -9
- data/lib/mongoid/config.rb +39 -9
- data/lib/mongoid/criteria.rb +16 -3
- data/lib/mongoid/criteria/queryable/pipeline.rb +3 -2
- data/lib/mongoid/criteria/queryable/selectable.rb +94 -7
- data/lib/mongoid/criteria/queryable/storable.rb +104 -99
- data/lib/mongoid/errors/eager_load.rb +2 -0
- data/lib/mongoid/persistable/pushable.rb +7 -1
- data/lib/mongoid/serializable.rb +9 -3
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +32 -23
- data/spec/app/models/coding.rb +4 -0
- data/spec/app/models/coding/pull_request.rb +12 -0
- data/spec/app/models/delegating_patient.rb +16 -0
- data/spec/app/models/publication.rb +5 -0
- data/spec/app/models/publication/encyclopedia.rb +12 -0
- data/spec/app/models/publication/review.rb +14 -0
- data/spec/integration/document_spec.rb +22 -0
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +193 -10
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +504 -127
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +52 -0
- data/spec/mongoid/criteria/queryable/storable_spec.rb +80 -2
- data/spec/mongoid/criteria_spec.rb +32 -0
- data/spec/mongoid/persistable/pushable_spec.rb +55 -1
- data/spec/mongoid/serializable_spec.rb +129 -18
- data/spec/spec_helper.rb +2 -0
- data/spec/support/expectations.rb +3 -1
- data/spec/support/helpers.rb +11 -0
- metadata +504 -490
- metadata.gz.sig +0 -0
@@ -2450,6 +2450,58 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
2450
2450
|
end
|
2451
2451
|
end
|
2452
2452
|
end
|
2453
|
+
|
2454
|
+
context 'when using an MQL logical operator manually' do
|
2455
|
+
let(:base_query) do
|
2456
|
+
query.where(test: 1)
|
2457
|
+
end
|
2458
|
+
|
2459
|
+
let(:selection) do
|
2460
|
+
base_query.where(mql_operator => ['hello' => 'world'])
|
2461
|
+
end
|
2462
|
+
|
2463
|
+
shared_examples_for 'adds conditions to existing query' do
|
2464
|
+
it 'adds conditions to existing query' do
|
2465
|
+
selection.selector.should == {
|
2466
|
+
'test' => 1,
|
2467
|
+
mql_operator => ['hello' => 'world'],
|
2468
|
+
}
|
2469
|
+
end
|
2470
|
+
end
|
2471
|
+
|
2472
|
+
shared_examples_for 'adds conditions to existing query with an extra $and' do
|
2473
|
+
it 'adds conditions to existing query' do
|
2474
|
+
selection.selector.should == {
|
2475
|
+
'test' => 1,
|
2476
|
+
mql_operator => ['hello' => 'world'],
|
2477
|
+
}
|
2478
|
+
end
|
2479
|
+
end
|
2480
|
+
|
2481
|
+
context '$or' do
|
2482
|
+
let(:mql_operator) { '$or' }
|
2483
|
+
|
2484
|
+
it_behaves_like 'adds conditions to existing query with an extra $and'
|
2485
|
+
end
|
2486
|
+
|
2487
|
+
context '$nor' do
|
2488
|
+
let(:mql_operator) { '$nor' }
|
2489
|
+
|
2490
|
+
it_behaves_like 'adds conditions to existing query with an extra $and'
|
2491
|
+
end
|
2492
|
+
|
2493
|
+
context '$not' do
|
2494
|
+
let(:mql_operator) { '$not' }
|
2495
|
+
|
2496
|
+
it_behaves_like 'adds conditions to existing query'
|
2497
|
+
end
|
2498
|
+
|
2499
|
+
context '$and' do
|
2500
|
+
let(:mql_operator) { '$and' }
|
2501
|
+
|
2502
|
+
it_behaves_like 'adds conditions to existing query'
|
2503
|
+
end
|
2504
|
+
end
|
2453
2505
|
end
|
2454
2506
|
|
2455
2507
|
describe Symbol do
|
@@ -52,6 +52,22 @@ describe Mongoid::Criteria::Queryable::Storable do
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
+
context '$and to query with $and which already has the given key' do
|
56
|
+
let(:query) do
|
57
|
+
Mongoid::Query.new.where('$and' => [{foo: 'zoom'}])
|
58
|
+
end
|
59
|
+
|
60
|
+
let(:modified) do
|
61
|
+
query.send(query_method, '$and', [{'foo' => 'bar'}])
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'adds to existing $and' do
|
65
|
+
modified.selector.should == {
|
66
|
+
'$and' => [{'foo' => 'zoom'}, {'foo' => 'bar'}],
|
67
|
+
}
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
55
71
|
end
|
56
72
|
|
57
73
|
context '$or operator' do
|
@@ -74,9 +90,11 @@ describe Mongoid::Criteria::Queryable::Storable do
|
|
74
90
|
query.send(query_method, '$or', [{'foo' => 'bar'}])
|
75
91
|
end
|
76
92
|
|
77
|
-
it '
|
93
|
+
it 'adds the new conditions' do
|
78
94
|
modified.selector.should == {
|
79
|
-
'
|
95
|
+
'zoom' => 'zoom',
|
96
|
+
'$or' => ['foo' => 'bar'],
|
97
|
+
}
|
80
98
|
end
|
81
99
|
end
|
82
100
|
|
@@ -98,6 +116,66 @@ describe Mongoid::Criteria::Queryable::Storable do
|
|
98
116
|
end
|
99
117
|
end
|
100
118
|
|
119
|
+
describe '#add_field_expression' do
|
120
|
+
context 'simple field and value write' do
|
121
|
+
let(:modified) do
|
122
|
+
query.add_field_expression('foo', 'bar')
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'adds the condition' do
|
126
|
+
modified.selector.should == {
|
127
|
+
'foo' => 'bar'
|
128
|
+
}
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
context 'an operator write' do
|
133
|
+
let(:modified) do
|
134
|
+
query.add_field_expression('$eq', {'foo' => 'bar'})
|
135
|
+
end
|
136
|
+
|
137
|
+
it 'is not allowed' do
|
138
|
+
lambda do
|
139
|
+
modified
|
140
|
+
end.should raise_error(ArgumentError, /Field cannot be an operator/)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
context 'when another field exists in destination' do
|
145
|
+
let(:base) do
|
146
|
+
query.add_field_expression('foo', 'bar')
|
147
|
+
end
|
148
|
+
|
149
|
+
let(:modified) do
|
150
|
+
base.add_field_expression('zoom', 'zoom')
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'adds the condition' do
|
154
|
+
modified.selector.should == {
|
155
|
+
'foo' => 'bar',
|
156
|
+
'zoom' => 'zoom',
|
157
|
+
}
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
context 'when field being added already exists in destination' do
|
162
|
+
let(:base) do
|
163
|
+
query.add_field_expression('foo', 'bar')
|
164
|
+
end
|
165
|
+
|
166
|
+
let(:modified) do
|
167
|
+
base.add_field_expression('foo', 'zoom')
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'adds the new condition using $and' do
|
171
|
+
modified.selector.should == {
|
172
|
+
'foo' => 'bar',
|
173
|
+
'$and' => ['foo' => 'zoom'],
|
174
|
+
}
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
101
179
|
describe '#add_operator_expression' do
|
102
180
|
let(:query_method) { :add_operator_expression }
|
103
181
|
|
@@ -3428,6 +3428,38 @@ describe Mongoid::Criteria do
|
|
3428
3428
|
Band.create(name: "Tool")
|
3429
3429
|
end
|
3430
3430
|
|
3431
|
+
context 'when provided no arguments' do
|
3432
|
+
context 'on a model class' do
|
3433
|
+
it 'returns an empty criteria' do
|
3434
|
+
Band.where.selector.should == {}
|
3435
|
+
end
|
3436
|
+
end
|
3437
|
+
|
3438
|
+
context 'on an association' do
|
3439
|
+
it 'returns an empty criteria' do
|
3440
|
+
match.records.where.selector.should == {}
|
3441
|
+
end
|
3442
|
+
end
|
3443
|
+
end
|
3444
|
+
|
3445
|
+
context 'when provided multiple arguments' do
|
3446
|
+
context 'on a model class' do
|
3447
|
+
it 'raises ArgumentError' do
|
3448
|
+
lambda do
|
3449
|
+
Band.where({foo: 1}, {bar: 2})
|
3450
|
+
end.should raise_error(ArgumentError, /where requires zero or one arguments/)
|
3451
|
+
end
|
3452
|
+
end
|
3453
|
+
|
3454
|
+
context 'on an association' do
|
3455
|
+
it 'raises ArgumentError' do
|
3456
|
+
lambda do
|
3457
|
+
match.records.where({foo: 1}, {bar: 2})
|
3458
|
+
end.should raise_error(ArgumentError, /where requires zero or one arguments/)
|
3459
|
+
end
|
3460
|
+
end
|
3461
|
+
end
|
3462
|
+
|
3431
3463
|
context "when provided a string" do
|
3432
3464
|
|
3433
3465
|
context "when the criteria is embedded" do
|
@@ -7,7 +7,7 @@ describe Mongoid::Persistable::Pushable do
|
|
7
7
|
|
8
8
|
describe "#add_to_set" do
|
9
9
|
|
10
|
-
context "when the document is a
|
10
|
+
context "when the document is a top level document" do
|
11
11
|
|
12
12
|
shared_examples_for "a unique pushable root document" do
|
13
13
|
|
@@ -65,6 +65,60 @@ describe Mongoid::Persistable::Pushable do
|
|
65
65
|
|
66
66
|
it_behaves_like "a unique pushable root document"
|
67
67
|
end
|
68
|
+
|
69
|
+
context 'when the host model is not saved' do
|
70
|
+
context 'when attribute exists' do
|
71
|
+
let(:person) do
|
72
|
+
Person.new(aliases: [2])
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'records the change' do
|
76
|
+
person.add_to_set({aliases: 1})
|
77
|
+
|
78
|
+
expect(person.aliases).to eq([2, 1])
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'when attribute does not exist' do
|
83
|
+
let(:person) do
|
84
|
+
Person.new
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'records the change' do
|
88
|
+
person.add_to_set({aliases: 1})
|
89
|
+
|
90
|
+
expect(person.aliases).to eq([1])
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context 'when the host model is loaded from database' do
|
96
|
+
context 'when attribute exists' do
|
97
|
+
let(:person) do
|
98
|
+
Person.create!(aliases: [2])
|
99
|
+
person = Person.last
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'records the change' do
|
103
|
+
person.add_to_set({aliases: 1})
|
104
|
+
|
105
|
+
expect(person.aliases).to eq([2, 1])
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
context 'when attribute does not exist' do
|
110
|
+
let(:person) do
|
111
|
+
Person.create!
|
112
|
+
person = Person.last
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'records the change' do
|
116
|
+
person.add_to_set({aliases: 1})
|
117
|
+
|
118
|
+
expect(person.aliases).to eq([1])
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
68
122
|
end
|
69
123
|
|
70
124
|
context "when the document is embedded" do
|
@@ -16,31 +16,117 @@ describe Mongoid::Serializable do
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
|
19
|
+
%i(include_root_in_json include_root_in_json?).each do |meth|
|
20
|
+
describe ".#{meth}" do
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
22
|
+
before do
|
23
|
+
reload_model(:Minim)
|
24
|
+
end
|
24
25
|
|
25
|
-
|
26
|
+
after do
|
27
|
+
Mongoid.include_root_in_json = false
|
28
|
+
reload_model(:Minim)
|
29
|
+
end
|
26
30
|
|
27
|
-
|
28
|
-
|
31
|
+
context "when global config is set to true" do
|
32
|
+
|
33
|
+
before do
|
34
|
+
Mongoid.include_root_in_json = true
|
35
|
+
end
|
36
|
+
|
37
|
+
it "returns true" do
|
38
|
+
expect(Minim.public_send(meth)).to be true
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'when value is overridden to false in the model class' do
|
42
|
+
before do
|
43
|
+
Minim.include_root_in_json = false
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'returns false' do
|
47
|
+
expect(Minim.public_send(meth)).to be false
|
48
|
+
end
|
49
|
+
end
|
29
50
|
end
|
30
51
|
|
31
|
-
|
32
|
-
|
52
|
+
context "when global config set to false" do
|
53
|
+
|
54
|
+
before do
|
55
|
+
Mongoid.include_root_in_json = false
|
56
|
+
end
|
57
|
+
|
58
|
+
it "returns false" do
|
59
|
+
expect(Minim.public_send(meth)).to be false
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'when value is overridden to true in the model class' do
|
63
|
+
before do
|
64
|
+
Minim.include_root_in_json = true
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'returns true' do
|
68
|
+
expect(Minim.public_send(meth)).to be true
|
69
|
+
end
|
70
|
+
end
|
33
71
|
end
|
34
72
|
end
|
35
73
|
|
36
|
-
|
74
|
+
describe "#include_root_in_json" do
|
37
75
|
|
38
76
|
before do
|
77
|
+
reload_model(:Minim)
|
78
|
+
end
|
79
|
+
|
80
|
+
after do
|
39
81
|
Mongoid.include_root_in_json = false
|
82
|
+
reload_model(:Minim)
|
83
|
+
end
|
84
|
+
|
85
|
+
let(:minim) do
|
86
|
+
Minim.new
|
87
|
+
end
|
88
|
+
|
89
|
+
context "when global config is set to true" do
|
90
|
+
|
91
|
+
before do
|
92
|
+
Minim.include_root_in_json.should be false
|
93
|
+
Mongoid.include_root_in_json = true
|
94
|
+
end
|
95
|
+
|
96
|
+
it "returns true" do
|
97
|
+
expect(minim.public_send(meth)).to be true
|
98
|
+
end
|
99
|
+
|
100
|
+
context 'when value is overridden to false in the model class' do
|
101
|
+
before do
|
102
|
+
Minim.include_root_in_json = false
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'returns false' do
|
106
|
+
expect(minim.public_send(meth)).to be false
|
107
|
+
end
|
108
|
+
end
|
40
109
|
end
|
41
110
|
|
42
|
-
|
43
|
-
|
111
|
+
context "when global config set to false" do
|
112
|
+
|
113
|
+
before do
|
114
|
+
Mongoid.include_root_in_json = false
|
115
|
+
end
|
116
|
+
|
117
|
+
it "returns false" do
|
118
|
+
expect(minim.public_send(meth)).to be false
|
119
|
+
end
|
120
|
+
|
121
|
+
context 'when value is overridden to true in the model class' do
|
122
|
+
before do
|
123
|
+
Minim.include_root_in_json = true
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'returns true' do
|
127
|
+
expect(minim.public_send(meth)).to be true
|
128
|
+
end
|
129
|
+
end
|
44
130
|
end
|
45
131
|
end
|
46
132
|
end
|
@@ -773,32 +859,57 @@ describe Mongoid::Serializable do
|
|
773
859
|
|
774
860
|
describe "#to_json" do
|
775
861
|
|
776
|
-
let(:
|
777
|
-
|
862
|
+
let(:account) do
|
863
|
+
Account.new
|
778
864
|
end
|
779
865
|
|
780
|
-
context "when including root in json" do
|
866
|
+
context "when including root in json via Mongoid" do
|
781
867
|
|
782
868
|
before do
|
869
|
+
account.include_root_in_json.should be false
|
783
870
|
Mongoid.include_root_in_json = true
|
784
871
|
end
|
785
872
|
|
873
|
+
after do
|
874
|
+
Mongoid.include_root_in_json = false
|
875
|
+
end
|
876
|
+
|
786
877
|
it "uses the mongoid configuration" do
|
787
|
-
expect(
|
878
|
+
expect(JSON.parse(account.to_json)).to have_key("account")
|
879
|
+
end
|
880
|
+
end
|
881
|
+
|
882
|
+
context "when including root in json via class" do
|
883
|
+
|
884
|
+
before do
|
885
|
+
account.include_root_in_json.should be false
|
886
|
+
Account.include_root_in_json = true
|
887
|
+
end
|
888
|
+
|
889
|
+
after do
|
890
|
+
Account.include_root_in_json = false
|
891
|
+
end
|
892
|
+
|
893
|
+
it "uses the class configuration" do
|
894
|
+
expect(JSON.parse(account.to_json)).to have_key("account")
|
788
895
|
end
|
789
896
|
end
|
790
897
|
|
791
898
|
context "when not including root in json" do
|
792
899
|
|
793
900
|
before do
|
794
|
-
|
901
|
+
account.include_root_in_json.should be false
|
795
902
|
end
|
796
903
|
|
797
904
|
it "uses the mongoid configuration" do
|
798
|
-
expect(
|
905
|
+
expect(JSON.parse(account.to_json)).not_to have_key("account")
|
799
906
|
end
|
800
907
|
end
|
801
908
|
|
909
|
+
let(:person) do
|
910
|
+
Person.new
|
911
|
+
end
|
912
|
+
|
802
913
|
context "when serializing a relation directly" do
|
803
914
|
|
804
915
|
context "when serializing an embeds many" do
|