mongoid 7.0.7 → 7.0.8

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 (59) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/mongoid.rb +1 -1
  5. data/lib/mongoid/association/embedded/embeds_many.rb +2 -1
  6. data/lib/mongoid/association/embedded/embeds_one.rb +2 -1
  7. data/lib/mongoid/association/proxy.rb +1 -1
  8. data/lib/mongoid/atomic.rb +13 -3
  9. data/lib/mongoid/criteria.rb +7 -1
  10. data/lib/mongoid/criteria/modifiable.rb +2 -1
  11. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  12. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  13. data/lib/mongoid/extensions/hash.rb +4 -2
  14. data/lib/mongoid/extensions/regexp.rb +1 -1
  15. data/lib/mongoid/fields.rb +2 -1
  16. data/lib/mongoid/matchable/regexp.rb +2 -2
  17. data/lib/mongoid/persistable/pushable.rb +4 -1
  18. data/lib/mongoid/persistence_context.rb +6 -6
  19. data/lib/mongoid/query_cache.rb +2 -1
  20. data/lib/mongoid/validatable/uniqueness.rb +1 -1
  21. data/lib/mongoid/version.rb +1 -1
  22. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  23. data/spec/app/models/delegating_patient.rb +16 -0
  24. data/spec/integration/app_spec.rb +192 -0
  25. data/spec/integration/associations/embedded_spec.rb +62 -0
  26. data/spec/integration/document_spec.rb +22 -0
  27. data/spec/lite_spec_helper.rb +11 -4
  28. data/spec/mongoid/association/embedded/embeds_many_models.rb +53 -0
  29. data/spec/mongoid/association/embedded/embeds_many_spec.rb +10 -0
  30. data/spec/mongoid/association/embedded/embeds_one_spec.rb +0 -2
  31. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +2 -1
  32. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +2 -1
  33. data/spec/mongoid/clients/options_spec.rb +4 -4
  34. data/spec/mongoid/clients/sessions_spec.rb +8 -4
  35. data/spec/mongoid/clients/transactions_spec.rb +20 -8
  36. data/spec/mongoid/clients_spec.rb +2 -2
  37. data/spec/mongoid/contextual/atomic_spec.rb +20 -10
  38. data/spec/mongoid/contextual/map_reduce_spec.rb +20 -5
  39. data/spec/mongoid/contextual/mongo_spec.rb +76 -53
  40. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -7
  41. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +1 -1
  42. data/spec/mongoid/criteria_spec.rb +4 -2
  43. data/spec/mongoid/document_persistence_context_spec.rb +33 -0
  44. data/spec/mongoid/indexable_spec.rb +6 -4
  45. data/spec/mongoid/matchable/default_spec.rb +1 -1
  46. data/spec/mongoid/matchable/regexp_spec.rb +2 -2
  47. data/spec/mongoid/matchable_spec.rb +2 -2
  48. data/spec/mongoid/query_cache_spec.rb +2 -1
  49. data/spec/mongoid/relations/proxy_spec.rb +1 -1
  50. data/spec/mongoid/scopable_spec.rb +2 -1
  51. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  52. data/spec/mongoid/tasks/database_spec.rb +1 -1
  53. data/spec/spec_helper.rb +0 -31
  54. data/spec/support/child_process_helper.rb +76 -0
  55. data/spec/support/cluster_config.rb +3 -3
  56. data/spec/support/constraints.rb +29 -19
  57. data/spec/support/spec_config.rb +12 -4
  58. metadata +16 -2
  59. metadata.gz.sig +2 -2
@@ -75,6 +75,7 @@ describe Mongoid::Contextual::MapReduce do
75
75
  end
76
76
 
77
77
  describe "#counts" do
78
+ max_server_version '4.2'
78
79
 
79
80
  let(:criteria) do
80
81
  Band.all
@@ -103,7 +104,8 @@ describe Mongoid::Contextual::MapReduce do
103
104
  end
104
105
 
105
106
  it "iterates over the results" do
106
- expect(results.entries).to eq([
107
+ ordered_results = results.entries.sort_by { |doc| doc['_id'] }
108
+ expect(ordered_results.entries).to eq([
107
109
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
108
110
  { "_id" => "Tool", "value" => { "likes" => 100 }}
109
111
  ])
@@ -124,7 +126,8 @@ describe Mongoid::Contextual::MapReduce do
124
126
  end
125
127
 
126
128
  it "iterates over the results" do
127
- expect(results.entries).to eq(expected_results)
129
+ ordered_results = results.entries.sort_by { |doc| doc['_id'] }
130
+ expect(ordered_results).to eq(expected_results)
128
131
  end
129
132
 
130
133
  it 'outputs to the collection' do
@@ -144,6 +147,7 @@ describe Mongoid::Contextual::MapReduce do
144
147
  end
145
148
 
146
149
  context "when the statstics are requested" do
150
+ max_server_version '4.2'
147
151
 
148
152
  it "raises an error" do
149
153
  expect {
@@ -188,14 +192,16 @@ describe Mongoid::Contextual::MapReduce do
188
192
  Band.where(name: 'DEPECHE MODE').collation(locale: 'en_US', strength: 2)
189
193
  end
190
194
 
191
- context 'when the server supports collations', if: collation_supported? do
195
+ context 'when the server supports collations' do
196
+ min_server_version '3.4'
192
197
 
193
198
  it 'applies the collation' do
194
199
  expect(map_reduce.out(inline: 1).count).to eq(1)
195
200
  end
196
201
  end
197
202
 
198
- context 'when the server does not support collations', unless: collation_supported? do
203
+ context 'when the server does not support collations' do
204
+ max_server_version '3.2'
199
205
 
200
206
  it 'raises an exception' do
201
207
  expect {
@@ -207,6 +213,7 @@ describe Mongoid::Contextual::MapReduce do
207
213
  end
208
214
 
209
215
  describe "#emitted" do
216
+ max_server_version '4.2'
210
217
 
211
218
  let(:emitted) do
212
219
  map_reduce.out(inline: 1).emitted
@@ -258,6 +265,7 @@ describe Mongoid::Contextual::MapReduce do
258
265
  end
259
266
 
260
267
  describe "#input" do
268
+ max_server_version '4.2'
261
269
 
262
270
  let(:input) do
263
271
  map_reduce.out(inline: 1).input
@@ -308,6 +316,7 @@ describe Mongoid::Contextual::MapReduce do
308
316
  end
309
317
 
310
318
  describe "#output" do
319
+ max_server_version '4.2'
311
320
 
312
321
  let(:output) do
313
322
  map_reduce.out(inline: 1).output
@@ -340,12 +349,16 @@ describe Mongoid::Contextual::MapReduce do
340
349
  end
341
350
 
342
351
  context 'when a read preference is defined' do
352
+ require_topology :replica_set
353
+ # On 4.4 it seems the server inserts on the primary, not on the server
354
+ # that executed the map/reduce.
355
+ max_server_version '4.2'
343
356
 
344
357
  let(:criteria) do
345
358
  Band.all.read(mode: :secondary)
346
359
  end
347
360
 
348
- it "uses the read preference", if: testing_replica_set? do
361
+ it "uses the read preference" do
349
362
 
350
363
  expect {
351
364
  replace_map_reduce.raw
@@ -356,6 +369,7 @@ describe Mongoid::Contextual::MapReduce do
356
369
  end
357
370
 
358
371
  describe "#reduced" do
372
+ max_server_version '4.2'
359
373
 
360
374
  let(:reduced) do
361
375
  map_reduce.out(inline: 1).reduced
@@ -386,6 +400,7 @@ describe Mongoid::Contextual::MapReduce do
386
400
  end
387
401
 
388
402
  describe "#time" do
403
+ max_server_version '4.2'
389
404
 
390
405
  let(:time) do
391
406
  map_reduce.out(inline: 1).time
@@ -168,7 +168,8 @@ describe Mongoid::Contextual::Mongo do
168
168
  end
169
169
  end
170
170
 
171
- context 'when a collation is specified', if: collation_supported? do
171
+ context 'when a collation is specified' do
172
+ min_server_version '3.4'
172
173
 
173
174
  let(:context) do
174
175
  described_class.new(criteria)
@@ -229,7 +230,8 @@ describe Mongoid::Contextual::Mongo do
229
230
  expect(deleted).to eq(1)
230
231
  end
231
232
 
232
- context 'when the criteria has a collation', if: collation_supported? do
233
+ context 'when the criteria has a collation' do
234
+ min_server_version '3.4'
233
235
 
234
236
  let(:criteria) do
235
237
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -333,7 +335,8 @@ describe Mongoid::Contextual::Mongo do
333
335
  expect(destroyed).to eq(1)
334
336
  end
335
337
 
336
- context 'when the criteria has a collation', if: collation_supported? do
338
+ context 'when the criteria has a collation' do
339
+ min_server_version '3.4'
337
340
 
338
341
  let(:criteria) do
339
342
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -455,7 +458,8 @@ describe Mongoid::Contextual::Mongo do
455
458
  end
456
459
  end
457
460
 
458
- context 'when a collation is specified', if: collation_supported? do
461
+ context 'when a collation is specified' do
462
+ min_server_version '3.4'
459
463
 
460
464
  before do
461
465
  Band.create(name: 'DEPECHE MODE')
@@ -493,7 +497,8 @@ describe Mongoid::Contextual::Mongo do
493
497
  described_class.new(criteria)
494
498
  end
495
499
 
496
- context 'when the criteria has a collation', if: collation_supported? do
500
+ context 'when the criteria has a collation' do
501
+ min_server_version '3.4'
497
502
 
498
503
  let(:criteria) do
499
504
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -850,7 +855,8 @@ describe Mongoid::Contextual::Mongo do
850
855
  end
851
856
  end
852
857
 
853
- context 'when a collation is specified on the criteria', if: collation_supported? do
858
+ context 'when a collation is specified on the criteria' do
859
+ min_server_version '3.4'
854
860
 
855
861
  let(:criteria) do
856
862
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -1003,7 +1009,8 @@ describe Mongoid::Contextual::Mongo do
1003
1009
  end
1004
1010
  end
1005
1011
 
1006
- context 'when a collation is specified on the criteria', if: collation_supported? do
1012
+ context 'when a collation is specified on the criteria' do
1013
+ min_server_version '3.4'
1007
1014
 
1008
1015
  let(:criteria) do
1009
1016
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -1077,7 +1084,8 @@ describe Mongoid::Contextual::Mongo do
1077
1084
  }.to raise_error(Mongoid::Errors::DocumentNotFound)
1078
1085
  end
1079
1086
 
1080
- context 'when a collation is specified on the criteria', if: collation_supported? do
1087
+ context 'when a collation is specified on the criteria' do
1088
+ min_server_version '3.4'
1081
1089
 
1082
1090
  let(:criteria) do
1083
1091
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -1149,7 +1157,8 @@ describe Mongoid::Contextual::Mongo do
1149
1157
  expect(context.send(method)).to eq(depeche_mode)
1150
1158
  end
1151
1159
 
1152
- context 'when the criteria has a collation', if: collation_supported? do
1160
+ context 'when the criteria has a collation' do
1161
+ min_server_version '3.4'
1153
1162
 
1154
1163
  let(:criteria) do
1155
1164
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -1553,6 +1562,10 @@ describe Mongoid::Contextual::Mongo do
1553
1562
  }}
1554
1563
  end
1555
1564
 
1565
+ let(:ordered_results) do
1566
+ results['results'].sort_by { |doc| doc['_id'] }
1567
+ end
1568
+
1556
1569
  context "when no selection is provided" do
1557
1570
 
1558
1571
  let(:criteria) do
@@ -1584,36 +1597,40 @@ describe Mongoid::Contextual::Mongo do
1584
1597
  end
1585
1598
 
1586
1599
  it "contains the entire raw results" do
1587
- expect(results["results"]).to eq([
1600
+ expect(ordered_results).to eq([
1588
1601
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
1589
1602
  { "_id" => "Tool", "value" => { "likes" => 100 }}
1590
1603
  ])
1591
1604
  end
1592
1605
 
1593
- it "contains the execution time" do
1594
- expect(results.time).to_not be_nil
1595
- end
1606
+ context 'when statistics are available' do
1607
+ max_server_version '4.2'
1596
1608
 
1597
- it "contains the count statistics" do
1598
- expect(results["counts"]).to eq({
1599
- "input" => 2, "emit" => 2, "reduce" => 0, "output" => 2
1600
- })
1601
- end
1609
+ it "contains the execution time" do
1610
+ expect(results.time).to_not be_nil
1611
+ end
1602
1612
 
1603
- it "contains the input count" do
1604
- expect(results.input).to eq(2)
1605
- end
1613
+ it "contains the count statistics" do
1614
+ expect(results["counts"]).to eq({
1615
+ "input" => 2, "emit" => 2, "reduce" => 0, "output" => 2
1616
+ })
1617
+ end
1606
1618
 
1607
- it "contains the emitted count" do
1608
- expect(results.emitted).to eq(2)
1609
- end
1619
+ it "contains the input count" do
1620
+ expect(results.input).to eq(2)
1621
+ end
1610
1622
 
1611
- it "contains the reduced count" do
1612
- expect(results.reduced).to eq(0)
1613
- end
1623
+ it "contains the emitted count" do
1624
+ expect(results.emitted).to eq(2)
1625
+ end
1614
1626
 
1615
- it "contains the output count" do
1616
- expect(results.output).to eq(2)
1627
+ it "contains the reduced count" do
1628
+ expect(results.reduced).to eq(0)
1629
+ end
1630
+
1631
+ it "contains the output count" do
1632
+ expect(results.output).to eq(2)
1633
+ end
1617
1634
  end
1618
1635
  end
1619
1636
 
@@ -1642,35 +1659,39 @@ describe Mongoid::Contextual::Mongo do
1642
1659
  end
1643
1660
 
1644
1661
  it "contains the entire raw results" do
1645
- expect(results["results"]).to eq([
1662
+ expect(ordered_results).to eq([
1646
1663
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }}
1647
1664
  ])
1648
1665
  end
1649
1666
 
1650
- it "contains the execution time" do
1651
- expect(results.time).to_not be_nil
1652
- end
1667
+ context 'when statistics are available' do
1668
+ max_server_version '4.2'
1653
1669
 
1654
- it "contains the count statistics" do
1655
- expect(results["counts"]).to eq({
1656
- "input" => 1, "emit" => 1, "reduce" => 0, "output" => 1
1657
- })
1658
- end
1670
+ it "contains the execution time" do
1671
+ expect(results.time).to_not be_nil
1672
+ end
1659
1673
 
1660
- it "contains the input count" do
1661
- expect(results.input).to eq(1)
1662
- end
1674
+ it "contains the count statistics" do
1675
+ expect(results["counts"]).to eq({
1676
+ "input" => 1, "emit" => 1, "reduce" => 0, "output" => 1
1677
+ })
1678
+ end
1663
1679
 
1664
- it "contains the emitted count" do
1665
- expect(results.emitted).to eq(1)
1666
- end
1680
+ it "contains the input count" do
1681
+ expect(results.input).to eq(1)
1682
+ end
1667
1683
 
1668
- it "contains the reduced count" do
1669
- expect(results.reduced).to eq(0)
1670
- end
1684
+ it "contains the emitted count" do
1685
+ expect(results.emitted).to eq(1)
1686
+ end
1671
1687
 
1672
- it "contains the output count" do
1673
- expect(results.output).to eq(1)
1688
+ it "contains the reduced count" do
1689
+ expect(results.reduced).to eq(0)
1690
+ end
1691
+
1692
+ it "contains the output count" do
1693
+ expect(results.output).to eq(1)
1694
+ end
1674
1695
  end
1675
1696
  end
1676
1697
 
@@ -1710,7 +1731,7 @@ describe Mongoid::Contextual::Mongo do
1710
1731
  end
1711
1732
 
1712
1733
  it "contains the entire raw results" do
1713
- expect(results["results"]).to eq([
1734
+ expect(ordered_results).to eq([
1714
1735
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
1715
1736
  { "_id" => "Tool", "value" => { "likes" => 100 }}
1716
1737
  ])
@@ -2161,7 +2182,8 @@ describe Mongoid::Contextual::Mongo do
2161
2182
  end
2162
2183
  end
2163
2184
 
2164
- context 'when provided array filters', if: array_filters_supported? do
2185
+ context 'when provided array filters' do
2186
+ min_server_version '3.6'
2165
2187
 
2166
2188
  before do
2167
2189
  Band.delete_all
@@ -2333,7 +2355,8 @@ describe Mongoid::Contextual::Mongo do
2333
2355
  end
2334
2356
  end
2335
2357
 
2336
- context 'when provided array filters', if: array_filters_supported? do
2358
+ context 'when provided array filters' do
2359
+ min_server_version '3.6'
2337
2360
 
2338
2361
  before do
2339
2362
  Band.delete_all
@@ -2371,7 +2394,7 @@ describe Mongoid::Contextual::Mongo do
2371
2394
 
2372
2395
  describe '#pipeline' do
2373
2396
 
2374
- context 'when the criteria has a selector', if: non_legacy_server? do
2397
+ context 'when the criteria has a selector' do
2375
2398
 
2376
2399
  before do
2377
2400
  Artist.index(name: "text")
@@ -8,7 +8,7 @@ describe Mongoid::Criteria::Queryable::Extensions::Regexp do
8
8
  context "when provided a regexp" do
9
9
 
10
10
  let(:regexp) do
11
- /^[123]/
11
+ /\A[123]/
12
12
  end
13
13
 
14
14
  let(:evolved) do
@@ -23,7 +23,7 @@ describe Mongoid::Criteria::Queryable::Extensions::Regexp do
23
23
  context "when provided a string" do
24
24
 
25
25
  let(:regexp) do
26
- "^[123]"
26
+ "\\A[123]"
27
27
  end
28
28
 
29
29
  let(:evolved) do
@@ -31,7 +31,7 @@ describe Mongoid::Criteria::Queryable::Extensions::Regexp do
31
31
  end
32
32
 
33
33
  it "returns the converted regexp" do
34
- expect(evolved).to eq(/^[123]/)
34
+ expect(evolved).to eq(/\A[123]/)
35
35
  end
36
36
  end
37
37
 
@@ -40,7 +40,7 @@ describe Mongoid::Criteria::Queryable::Extensions::Regexp do
40
40
  context "when the elements are regexps" do
41
41
 
42
42
  let(:regexp) do
43
- /^[123]/
43
+ /\A[123]/
44
44
  end
45
45
 
46
46
  let(:array) do
@@ -63,7 +63,7 @@ describe Mongoid::Criteria::Queryable::Extensions::Regexp do
63
63
  context "when the elements are strings" do
64
64
 
65
65
  let(:regexp) do
66
- "^[123]"
66
+ "\\A[123]"
67
67
  end
68
68
 
69
69
  let(:evolved) do
@@ -71,7 +71,7 @@ describe Mongoid::Criteria::Queryable::Extensions::Regexp do
71
71
  end
72
72
 
73
73
  it "returns the regexps" do
74
- expect(evolved).to eq([ /^[123]/ ])
74
+ expect(evolved).to eq([ /\A[123]/ ])
75
75
  end
76
76
  end
77
77
  end
@@ -80,7 +80,7 @@ describe Mongoid::Criteria::Queryable::Extensions::Regexp do
80
80
  describe "#regexp?" do
81
81
 
82
82
  let(:regexp) do
83
- /^[123]/
83
+ /\A[123]/
84
84
  end
85
85
 
86
86
  it "returns true" do
@@ -315,7 +315,7 @@ describe String do
315
315
  context "when provided a regex" do
316
316
 
317
317
  let(:regex) do
318
- /^[123]/
318
+ /\A[123]/.freeze
319
319
  end
320
320
 
321
321
  let(:evolved) do
@@ -2334,7 +2334,7 @@ describe Mongoid::Criteria do
2334
2334
  end
2335
2335
 
2336
2336
  it "returns the map/reduce results" do
2337
- expect(map_reduce).to eq([
2337
+ expect(map_reduce.sort_by { |doc| doc['_id'] }).to eq([
2338
2338
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
2339
2339
  { "_id" => "Tool", "value" => { "likes" => 100 }}
2340
2340
  ])
@@ -3499,7 +3499,8 @@ describe Mongoid::Criteria do
3499
3499
  end
3500
3500
  end
3501
3501
 
3502
- context "when querying on a BSON::Decimal128", if: decimal128_supported? do
3502
+ context "when querying on a BSON::Decimal128" do
3503
+ min_server_version '3.4'
3503
3504
 
3504
3505
  let(:decimal) do
3505
3506
  BSON::Decimal128.new("0.0005")
@@ -3553,6 +3554,7 @@ describe Mongoid::Criteria do
3553
3554
  end
3554
3555
 
3555
3556
  context "when the code has scope" do
3557
+ max_server_version '4.2'
3556
3558
 
3557
3559
  let(:criteria) do
3558
3560
  Band.for_js("this.name == param", param: "Depeche Mode")