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
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require 'spec_helper'
5
+ require_relative '../../mongoid/association/embedded/embeds_many_models'
6
+ require_relative '../../mongoid/association/embedded/embeds_one_models'
7
+
8
+ describe 'embedded associations' do
9
+
10
+ describe 'parent association' do
11
+ let(:parent) do
12
+ parent_cls.new
13
+ end
14
+
15
+ context 'embeds_one' do
16
+
17
+ shared_examples 'is set' do
18
+ it 'is set' do
19
+ parent.child = child_cls.new
20
+ parent.child.parent.should == parent
21
+ end
22
+ end
23
+
24
+ context 'class_name set without leading ::' do
25
+ let(:parent_cls) { EomParent }
26
+ let(:child_cls) { EomChild }
27
+
28
+ it_behaves_like 'is set'
29
+ end
30
+
31
+ context 'class_name set with leading ::' do
32
+ let(:parent_cls) { EomCcParent }
33
+ let(:child_cls) { EomCcChild }
34
+
35
+ it_behaves_like 'is set'
36
+ end
37
+ end
38
+
39
+ context 'embeds_many' do
40
+
41
+ let(:child) { parent.legislators.new }
42
+
43
+ shared_examples 'is set' do
44
+ it 'is set' do
45
+ child.congress.should == parent
46
+ end
47
+ end
48
+
49
+ context 'class_name set without leading ::' do
50
+ let(:parent_cls) { EmmCongress }
51
+
52
+ it_behaves_like 'is set'
53
+ end
54
+
55
+ context 'class_name set with leading ::' do
56
+ let(:parent_cls) { EmmCcCongress }
57
+
58
+ it_behaves_like 'is set'
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require 'spec_helper'
5
+
6
+ describe Mongoid::Document do
7
+ context 'when including class uses delegate' do
8
+ let(:patient) do
9
+ DelegatingPatient.new(
10
+ email: Email.new(address: 'test@example.com'),
11
+ )
12
+ end
13
+
14
+ it 'works for instance level delegation' do
15
+ patient.address.should == 'test@example.com'
16
+ end
17
+
18
+ it 'works for class level delegation' do
19
+ DelegatingPatient.default_client.should be Mongoid.default_client
20
+ end
21
+ end
22
+ end
@@ -44,11 +44,18 @@ RSpec.configure do |config|
44
44
  end
45
45
 
46
46
  if SpecConfig.instance.ci?
47
- # Allow a max of 30 seconds per test.
48
- # Tests should take under 10 seconds ideally but it seems
49
- # we have some that run for more than 10 seconds in CI.
47
+ timeout = if SpecConfig.instance.app_tests?
48
+ # Allow 5 minutes per test for the app tests, since they install
49
+ # gems for Rails applications which can take a long time.
50
+ 300
51
+ else
52
+ # Allow a max of 30 seconds per test.
53
+ # Tests should take under 10 seconds ideally but it seems
54
+ # we have some that run for more than 10 seconds in CI.
55
+ 30
56
+ end
50
57
  config.around(:each) do |example|
51
- TimeoutInterrupt.timeout(30) do
58
+ TimeoutInterrupt.timeout(timeout) do
52
59
  example.run
53
60
  end
54
61
  end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ class EmmCongress
5
+ include Mongoid::Document
6
+
7
+ embeds_many :legislators, class_name: 'EmmLegislator'
8
+
9
+ field :name, type: String
10
+ end
11
+
12
+ class EmmLegislator
13
+ include Mongoid::Document
14
+
15
+ embedded_in :congress, class_name: 'EmmCongress'
16
+
17
+ field :a, type: Integer, default: 0
18
+ field :b, type: Integer, default: 0
19
+ end
20
+
21
+ # Models with associations with :class_name as a :: prefixed string
22
+
23
+ class EmmCcCongress
24
+ include Mongoid::Document
25
+
26
+ embeds_many :legislators, class_name: '::EmmCcLegislator'
27
+
28
+ field :name, type: String
29
+ end
30
+
31
+ class EmmCcLegislator
32
+ include Mongoid::Document
33
+
34
+ embedded_in :congress, class_name: '::EmmCcCongress'
35
+
36
+ field :a, type: Integer, default: 0
37
+ field :b, type: Integer, default: 0
38
+ end
39
+
40
+ class EmmManufactory
41
+ include Mongoid::Document
42
+
43
+ embeds_many :products, order: :id.desc, class_name: 'EmmProduct'
44
+ end
45
+
46
+
47
+ class EmmProduct
48
+ include Mongoid::Document
49
+
50
+ embedded_in :manufactory, class_name: 'EmmManufactory'
51
+
52
+ field :name, type: String
53
+ end
@@ -646,6 +646,16 @@ describe Mongoid::Association::Embedded::EmbedsMany do
646
646
  it 'returns the class name option' do
647
647
  expect(association.klass).to eq(_class)
648
648
  end
649
+
650
+ context 'when the class name is prefixed with ::' do
651
+ let(:options) do
652
+ { class_name: '::OtherEmbeddedObject' }
653
+ end
654
+
655
+ it 'returns the class name option' do
656
+ expect(association.klass).to eq(_class)
657
+ end
658
+ end
649
659
  end
650
660
 
651
661
  context 'when the class_name option is not specified' do
@@ -453,8 +453,6 @@ describe Mongoid::Association::Embedded::EmbedsOne do
453
453
  end
454
454
 
455
455
  it 'returns the inverse in an array' do
456
- pending 'MONGOID-4751'
457
-
458
456
  inverses = association.inverses
459
457
  expect(inverses).to eq([:parent])
460
458
  end
@@ -2686,7 +2686,8 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2686
2686
  expect(preferences).to eq([ preference_one ])
2687
2687
  end
2688
2688
 
2689
- context 'when providing a collation', if: collation_supported? do
2689
+ context 'when providing a collation' do
2690
+ min_server_version '3.4'
2690
2691
 
2691
2692
  let(:preferences) do
2692
2693
  person.preferences.where(name: "FIRST").collation(locale: 'en_US', strength: 2).to_a
@@ -2904,7 +2904,8 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2904
2904
  expect(posts).to eq([ post_one ])
2905
2905
  end
2906
2906
 
2907
- context 'when providing a collation', if: collation_supported? do
2907
+ context 'when providing a collation' do
2908
+ min_server_version '3.4'
2908
2909
 
2909
2910
  let(:posts) do
2910
2911
  person.posts.where(title: "FIRST").collation(locale: 'en_US', strength: 2)
@@ -11,7 +11,7 @@ describe Mongoid::Clients::Options do
11
11
  Mongoid::Clients.clients.clear
12
12
  end
13
13
 
14
- describe '#with', if: non_legacy_server? do
14
+ describe '#with' do
15
15
 
16
16
  context 'when passing some options' do
17
17
 
@@ -72,7 +72,7 @@ describe Mongoid::Clients::Options do
72
72
  end
73
73
  end
74
74
 
75
- context 'when passing a block', if: testing_locally? do
75
+ context 'when passing a block' do
76
76
 
77
77
  let!(:connections_before) do
78
78
  Minim.mongo_client.database.command(serverStatus: 1).first['connections']['current']
@@ -284,7 +284,7 @@ describe Mongoid::Clients::Options do
284
284
  end
285
285
  end
286
286
 
287
- describe '.with', if: non_legacy_server? do
287
+ describe '.with' do
288
288
 
289
289
  context 'when passing some options' do
290
290
 
@@ -362,7 +362,7 @@ describe Mongoid::Clients::Options do
362
362
  end
363
363
  end
364
364
 
365
- context 'when passing a block', if: testing_locally? do
365
+ context 'when passing a block' do
366
366
 
367
367
  let!(:connections_before) do
368
368
  test_model.mongo_client.database.command(serverStatus: 1).first['connections']['current']
@@ -40,7 +40,8 @@ describe Mongoid::Clients::Sessions do
40
40
 
41
41
  context 'when a session is used on a model class' do
42
42
 
43
- context 'when sessions are supported', if: sessions_supported? do
43
+ context 'when sessions are supported' do
44
+ min_server_version '3.6'
44
45
 
45
46
  around do |example|
46
47
  Mongoid::Clients.with_name(:other).database.collections.each(&:drop)
@@ -169,7 +170,8 @@ describe Mongoid::Clients::Sessions do
169
170
  end
170
171
  end
171
172
 
172
- context 'when sessions are not supported', unless: sessions_supported? do
173
+ context 'when sessions are not supported' do
174
+ max_server_version '3.4'
173
175
 
174
176
  let!(:error) do
175
177
  e = nil
@@ -196,7 +198,8 @@ describe Mongoid::Clients::Sessions do
196
198
  end
197
199
  end
198
200
 
199
- context 'when sessions are supported', if: sessions_supported? do
201
+ context 'when sessions are supported' do
202
+ min_server_version '3.6'
200
203
 
201
204
  around do |example|
202
205
  Mongoid::Clients.with_name(:other).database.collections.each(&:drop)
@@ -313,7 +316,8 @@ describe Mongoid::Clients::Sessions do
313
316
  end
314
317
  end
315
318
 
316
- context 'when sessions are not supported', unless: sessions_supported? do
319
+ context 'when sessions are not supported' do
320
+ max_server_version '3.4'
317
321
 
318
322
  let!(:error) do
319
323
  e = nil
@@ -52,7 +52,8 @@ describe Mongoid::Clients::Sessions do
52
52
 
53
53
  context 'when a transaction is used on a model class' do
54
54
 
55
- context 'when transactions are supported', if: testing_transactions? do
55
+ context 'when transactions are supported' do
56
+ require_transaction_support
56
57
 
57
58
  around do |example|
58
59
  Mongoid::Clients.with_name(:other).database.collections.each(&:drop)
@@ -188,7 +189,10 @@ describe Mongoid::Clients::Sessions do
188
189
  end
189
190
  end
190
191
 
191
- context 'when sessions are supported but transactions are not', if: sessions_supported? && !testing_transactions? do
192
+ context 'when sessions are supported but transactions are not' do
193
+ min_server_version '3.6'
194
+ # Could also test 4.0 in sharded cluster
195
+ max_server_version '3.6'
192
196
 
193
197
  let!(:error) do
194
198
  e = nil
@@ -219,7 +223,8 @@ describe Mongoid::Clients::Sessions do
219
223
  end
220
224
  end
221
225
 
222
- context 'when transactions are supported', if: testing_transactions? do
226
+ context 'when transactions are supported' do
227
+ require_transaction_support
223
228
 
224
229
  around do |example|
225
230
  Mongoid::Clients.with_name(:other).database.collections.each(&:drop)
@@ -342,16 +347,23 @@ describe Mongoid::Clients::Sessions do
342
347
  end
343
348
  end
344
349
 
345
- context 'when sessions are supported but transactions are not', if: sessions_supported? && !testing_transactions? do
350
+ context 'when sessions are supported but transactions are not' do
351
+ min_server_version '3.6'
352
+ # Could also test 4.0 in sharded cluster
353
+ max_server_version '3.6'
346
354
 
347
355
  around do |example|
348
356
  Mongoid::Clients.with_name(:other).database.collections.each(&:drop)
349
357
  Mongoid::Clients.with_name(:other).command(create: :people)
350
- subscriber.clear_events!
351
- person.with(client: :other) do
352
- example.run
358
+
359
+ begin
360
+ subscriber.clear_events!
361
+ person.with(client: :other) do
362
+ example.run
363
+ end
364
+ ensure
365
+ Mongoid::Clients.with_name(:other).database.collections.each(&:drop)
353
366
  end
354
- Mongoid::Clients.with_name(:other).database.collections.each(&:drop)
355
367
  end
356
368
 
357
369
  let!(:error) do
@@ -725,7 +725,7 @@ describe Mongoid::Clients do
725
725
  end
726
726
  end
727
727
 
728
- describe ".store_in", if: non_legacy_server? do
728
+ describe ".store_in" do
729
729
 
730
730
  context "when provided a non hash" do
731
731
 
@@ -762,7 +762,7 @@ describe Mongoid::Clients do
762
762
  end
763
763
  end
764
764
 
765
- describe ".with", if: non_legacy_server? do
765
+ describe ".with" do
766
766
 
767
767
  context "when changing write concern options" do
768
768
 
@@ -74,7 +74,8 @@ describe Mongoid::Contextual::Atomic do
74
74
  end
75
75
  end
76
76
 
77
- context 'when the criteria has a collation', if: collation_supported? do
77
+ context 'when the criteria has a collation' do
78
+ min_server_version '3.4'
78
79
 
79
80
  let(:criteria) do
80
81
  Band.where(members: [ "DAVE" ]).collation(locale: 'en_US', strength: 2)
@@ -145,7 +146,8 @@ describe Mongoid::Contextual::Atomic do
145
146
  end
146
147
  end
147
148
 
148
- context 'when the criteria has a collation', if: collation_supported? do
149
+ context 'when the criteria has a collation' do
150
+ min_server_version '3.4'
149
151
 
150
152
  let!(:depeche_mode) do
151
153
  Band.create(members: [ "Dave" ], likes: 60)
@@ -224,7 +226,8 @@ describe Mongoid::Contextual::Atomic do
224
226
  end
225
227
  end
226
228
 
227
- context 'when the criteria has a collation', if: collation_supported? do
229
+ context 'when the criteria has a collation' do
230
+ min_server_version '3.4'
228
231
 
229
232
  let!(:depeche_mode) do
230
233
  Band.create(members: [ "Dave" ])
@@ -296,7 +299,8 @@ describe Mongoid::Contextual::Atomic do
296
299
  end
297
300
  end
298
301
 
299
- context 'when the criteria has a collation', if: collation_supported? do
302
+ context 'when the criteria has a collation' do
303
+ min_server_version '3.4'
300
304
 
301
305
  let!(:depeche_mode) do
302
306
  Band.create(members: [ "Dave" ])
@@ -350,7 +354,8 @@ describe Mongoid::Contextual::Atomic do
350
354
  expect(smiths.reload.members).to be_nil
351
355
  end
352
356
 
353
- context 'when the criteria has a collation', if: collation_supported? do
357
+ context 'when the criteria has a collation' do
358
+ min_server_version '3.4'
354
359
 
355
360
  let!(:depeche_mode) do
356
361
  Band.create(members: [ "Dave" ])
@@ -407,7 +412,8 @@ describe Mongoid::Contextual::Atomic do
407
412
  end
408
413
  end
409
414
 
410
- context 'when the criteria has a collation', if: collation_supported? do
415
+ context 'when the criteria has a collation' do
416
+ min_server_version '3.4'
411
417
 
412
418
  let!(:depeche_mode) do
413
419
  Band.create(members: [ "Dave", "Alan", "Fletch" ])
@@ -464,7 +470,8 @@ describe Mongoid::Contextual::Atomic do
464
470
  end
465
471
  end
466
472
 
467
- context 'when the criteria has a collation', if: collation_supported? do
473
+ context 'when the criteria has a collation' do
474
+ min_server_version '3.4'
468
475
 
469
476
  let!(:depeche_mode) do
470
477
  Band.create(members: [ "Dave" ])
@@ -529,7 +536,8 @@ describe Mongoid::Contextual::Atomic do
529
536
  end
530
537
  end
531
538
 
532
- context 'when the criteria has a collation', if: collation_supported? do
539
+ context 'when the criteria has a collation' do
540
+ min_server_version '3.4'
533
541
 
534
542
  let!(:depeche_mode) do
535
543
  Band.create(members: [ "Dave" ])
@@ -590,7 +598,8 @@ describe Mongoid::Contextual::Atomic do
590
598
  end
591
599
  end
592
600
 
593
- context 'when the criteria has a collation', if: collation_supported? do
601
+ context 'when the criteria has a collation' do
602
+ min_server_version '3.4'
594
603
 
595
604
  let!(:depeche_mode) do
596
605
  Band.create(members: [ "Dave" ])
@@ -749,7 +758,8 @@ describe Mongoid::Contextual::Atomic do
749
758
  end
750
759
  end
751
760
 
752
- context 'when the criteria has a collation', if: collation_supported? do
761
+ context 'when the criteria has a collation' do
762
+ min_server_version '3.4'
753
763
 
754
764
  let!(:depeche_mode) do
755
765
  Band.create(name: "Depeche Mode", years: 10)