mongoid 9.0.1 → 9.0.2
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
- data/lib/config/locales/en.yml +16 -0
- data/lib/mongoid/association/accessors.rb +7 -2
- data/lib/mongoid/association/nested/one.rb +14 -1
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +7 -1
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to.rb +15 -0
- data/lib/mongoid/association/referenced/has_many.rb +9 -8
- data/lib/mongoid/association/referenced/has_one/buildable.rb +3 -8
- data/lib/mongoid/association/referenced/with_polymorphic_criteria.rb +41 -0
- data/lib/mongoid/attributes/nested.rb +2 -1
- data/lib/mongoid/clients/sessions.rb +12 -15
- data/lib/mongoid/composable.rb +2 -0
- data/lib/mongoid/document.rb +2 -0
- data/lib/mongoid/errors/unrecognized_model_alias.rb +53 -0
- data/lib/mongoid/errors/unrecognized_resolver.rb +27 -0
- data/lib/mongoid/errors/unregistered_class.rb +47 -0
- data/lib/mongoid/errors.rb +3 -0
- data/lib/mongoid/identifiable.rb +28 -0
- data/lib/mongoid/model_resolver.rb +154 -0
- data/lib/mongoid/persistence_context.rb +2 -1
- data/lib/mongoid/traversable.rb +5 -0
- data/lib/mongoid/version.rb +1 -1
- data/spec/integration/associations/belongs_to_spec.rb +129 -0
- data/spec/integration/persistence/collection_options_spec.rb +36 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +4 -0
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +1 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +58 -21
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +4 -0
- data/spec/mongoid/attributes/nested_spec.rb +1 -0
- data/spec/mongoid/clients/transactions_spec.rb +2 -2
- data/spec/mongoid/model_resolver_spec.rb +167 -0
- data/spec/mongoid/monkey_patches_spec.rb +1 -1
- data/spec/mongoid/persistence_context_spec.rb +17 -4
- data/spec/mongoid/serializable_spec.rb +16 -9
- metadata +14 -4
@@ -0,0 +1,167 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'support/feature_sandbox'
|
5
|
+
|
6
|
+
MONGOID_MODEL_RESOLVER_KEY__ = :__separate_instance_spec_key
|
7
|
+
Mongoid::ModelResolver.register_resolver Mongoid::ModelResolver.new, MONGOID_MODEL_RESOLVER_KEY__
|
8
|
+
|
9
|
+
def quarantine(context, &block)
|
10
|
+
state = {}
|
11
|
+
|
12
|
+
context.before(:context) do
|
13
|
+
state[:quarantine] = FeatureSandbox.start_quarantine
|
14
|
+
block&.call
|
15
|
+
end
|
16
|
+
|
17
|
+
context.after(:context) do
|
18
|
+
FeatureSandbox.end_quarantine(state[:quarantine])
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe Mongoid::ModelResolver do
|
23
|
+
shared_examples 'a resolver' do |**kwargs|
|
24
|
+
it 'includes the class name when asked for all keys of the given model' do
|
25
|
+
expect(resolver.keys_for(model_class.new)).to include(model_class.name)
|
26
|
+
end
|
27
|
+
|
28
|
+
if kwargs[:with_aliases].nil?
|
29
|
+
it 'uses the class name as the default key for the given model' do
|
30
|
+
expect(resolver.default_key_for(model_class.new)).to eq model_class.name
|
31
|
+
end
|
32
|
+
elsif kwargs[:with_aliases].is_a?(Array)
|
33
|
+
it 'uses the first alias as the default key for the given model' do
|
34
|
+
expect(resolver.default_key_for(model_class.new)).to eq kwargs[:with_aliases].first
|
35
|
+
end
|
36
|
+
else
|
37
|
+
it 'uses the alias as the default key for the given model' do
|
38
|
+
expect(resolver.default_key_for(model_class.new)).to eq kwargs[:with_aliases]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'returns the model class when queried with the class name' do
|
43
|
+
expect(resolver.model_for(model_class.name)).to eq model_class
|
44
|
+
end
|
45
|
+
|
46
|
+
Array(kwargs[:with_aliases]).each do |model_alias|
|
47
|
+
it "includes the alias #{model_alias.inspect} when asked for all keys of the given model" do
|
48
|
+
expect(resolver.keys_for(model_class.new)).to include(model_alias)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "returns the model class when queried with #{model_alias.inspect}" do
|
52
|
+
expect(resolver.model_for(model_alias)).to eq model_class
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'when using the default instance' do
|
58
|
+
let(:resolver) { described_class.instance }
|
59
|
+
|
60
|
+
context 'when an alias is not specified' do
|
61
|
+
quarantine(self) do
|
62
|
+
Object.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
63
|
+
module Mongoid; module Specs; module DefaultInstance
|
64
|
+
class Vanilla; include Mongoid::Document; end
|
65
|
+
end; end; end
|
66
|
+
RUBY
|
67
|
+
end
|
68
|
+
|
69
|
+
let(:model_class) { Mongoid::Specs::DefaultInstance::Vanilla }
|
70
|
+
|
71
|
+
it_behaves_like 'a resolver'
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'when one alias is specified' do
|
75
|
+
quarantine(self) do
|
76
|
+
Object.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
77
|
+
module Mongoid; module Specs; module DefaultInstance
|
78
|
+
class Aliased
|
79
|
+
include Mongoid::Document
|
80
|
+
identify_as 'aliased'
|
81
|
+
end
|
82
|
+
end; end; end
|
83
|
+
RUBY
|
84
|
+
end
|
85
|
+
|
86
|
+
let(:model_class) { Mongoid::Specs::DefaultInstance::Aliased }
|
87
|
+
|
88
|
+
it_behaves_like 'a resolver', with_aliases: 'aliased'
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'when multiple aliases are specified' do
|
92
|
+
quarantine(self) do
|
93
|
+
Object.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
94
|
+
module Mongoid; module Specs; module DefaultInstance
|
95
|
+
class AliasedMultiple
|
96
|
+
include Mongoid::Document
|
97
|
+
identify_as 'aliased', 'alias2', 'alias3'
|
98
|
+
end
|
99
|
+
end; end; end
|
100
|
+
RUBY
|
101
|
+
end
|
102
|
+
|
103
|
+
let(:model_class) { Mongoid::Specs::DefaultInstance::AliasedMultiple }
|
104
|
+
|
105
|
+
it_behaves_like 'a resolver', with_aliases: %w[ aliased alias2 alias3 ]
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
context 'when using a separate instance' do
|
110
|
+
let(:resolver) { described_class.resolver(MONGOID_MODEL_RESOLVER_KEY__) }
|
111
|
+
|
112
|
+
it 'does not refer to the default instance' do
|
113
|
+
expect(resolver).not_to eq described_class.instance
|
114
|
+
end
|
115
|
+
|
116
|
+
context 'when an alias is not specified' do
|
117
|
+
quarantine(self) do
|
118
|
+
Object.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
119
|
+
module Mongoid; module Specs; module SeparateInstance
|
120
|
+
class Vanilla
|
121
|
+
include Mongoid::Document
|
122
|
+
identify_as resolver: MONGOID_MODEL_RESOLVER_KEY__
|
123
|
+
end
|
124
|
+
end; end; end
|
125
|
+
RUBY
|
126
|
+
end
|
127
|
+
|
128
|
+
let(:model_class) { Mongoid::Specs::SeparateInstance::Vanilla }
|
129
|
+
|
130
|
+
it_behaves_like 'a resolver'
|
131
|
+
end
|
132
|
+
|
133
|
+
context 'when one alias is specified' do
|
134
|
+
quarantine(self) do
|
135
|
+
Object.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
136
|
+
module Mongoid; module Specs; module SeparateInstance
|
137
|
+
class Aliased
|
138
|
+
include Mongoid::Document
|
139
|
+
identify_as 'aliased', resolver: MONGOID_MODEL_RESOLVER_KEY__
|
140
|
+
end
|
141
|
+
end; end; end
|
142
|
+
RUBY
|
143
|
+
end
|
144
|
+
|
145
|
+
let(:model_class) { Mongoid::Specs::SeparateInstance::Aliased }
|
146
|
+
|
147
|
+
it_behaves_like 'a resolver', with_aliases: 'aliased'
|
148
|
+
end
|
149
|
+
|
150
|
+
context 'when multiple aliases are specified' do
|
151
|
+
quarantine(self) do
|
152
|
+
Object.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
153
|
+
module Mongoid; module Specs; module SeparateInstance
|
154
|
+
class AliasedMultiple
|
155
|
+
include Mongoid::Document
|
156
|
+
identify_as 'aliased', 'alias2', 'alias3', resolver: MONGOID_MODEL_RESOLVER_KEY__
|
157
|
+
end
|
158
|
+
end; end; end
|
159
|
+
RUBY
|
160
|
+
end
|
161
|
+
|
162
|
+
let(:model_class) { Mongoid::Specs::SeparateInstance::AliasedMultiple }
|
163
|
+
|
164
|
+
it_behaves_like 'a resolver', with_aliases: %w[ aliased alias2 alias3 ]
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
@@ -5,7 +5,7 @@ require 'spec_helper'
|
|
5
5
|
# @note This test ensures that we do not inadvertently introduce new monkey patches
|
6
6
|
# to Mongoid. Existing monkey patch methods which are marked with +Mongoid.deprecated+
|
7
7
|
# are excluded from this test.
|
8
|
-
RSpec.describe('Do not add monkey patches') do
|
8
|
+
RSpec.describe('Do not add monkey patches') do
|
9
9
|
classes = [
|
10
10
|
Object,
|
11
11
|
Array,
|
@@ -206,12 +206,25 @@ describe Mongoid::PersistenceContext do
|
|
206
206
|
|
207
207
|
context 'when the options are valid extra options' do
|
208
208
|
|
209
|
-
|
210
|
-
|
209
|
+
context 'collection' do
|
210
|
+
|
211
|
+
let(:options) do
|
212
|
+
{ collection: 'other' }
|
213
|
+
end
|
214
|
+
|
215
|
+
it 'sets the options on the persistence context object' do
|
216
|
+
expect(persistence_context.collection_name).to eq(options[:collection].to_sym)
|
217
|
+
end
|
211
218
|
end
|
212
219
|
|
213
|
-
|
214
|
-
|
220
|
+
context 'collection_options' do
|
221
|
+
let(:options) do
|
222
|
+
{ collection_options: { capped: true } }
|
223
|
+
end
|
224
|
+
|
225
|
+
it 'does not propagate to client options' do
|
226
|
+
expect(persistence_context.send(:client_options).key?(:collection_options)).to eq(false)
|
227
|
+
end
|
215
228
|
end
|
216
229
|
end
|
217
230
|
|
@@ -511,13 +511,15 @@ describe Mongoid::Serializable do
|
|
511
511
|
end
|
512
512
|
|
513
513
|
it "includes the first relation" do
|
514
|
-
expect(relation_hash[0]).to include
|
514
|
+
expect(relation_hash[0]).to include(
|
515
515
|
{ "_id" => "kudamm", "street" => "Kudamm" }
|
516
|
+
)
|
516
517
|
end
|
517
518
|
|
518
519
|
it "includes the second relation" do
|
519
|
-
expect(relation_hash[1]).to include
|
520
|
+
expect(relation_hash[1]).to include(
|
520
521
|
{ "_id" => "tauentzienstr", "street" => "Tauentzienstr" }
|
522
|
+
)
|
521
523
|
end
|
522
524
|
end
|
523
525
|
|
@@ -528,13 +530,15 @@ describe Mongoid::Serializable do
|
|
528
530
|
end
|
529
531
|
|
530
532
|
it "includes the first relation" do
|
531
|
-
expect(relation_hash[0]).to include
|
533
|
+
expect(relation_hash[0]).to include(
|
532
534
|
{ "_id" => "kudamm", "street" => "Kudamm" }
|
535
|
+
)
|
533
536
|
end
|
534
537
|
|
535
538
|
it "includes the second relation" do
|
536
|
-
expect(relation_hash[1]).to include
|
539
|
+
expect(relation_hash[1]).to include(
|
537
540
|
{ "_id" => "tauentzienstr", "street" => "Tauentzienstr" }
|
541
|
+
)
|
538
542
|
end
|
539
543
|
end
|
540
544
|
|
@@ -653,8 +657,9 @@ describe Mongoid::Serializable do
|
|
653
657
|
end
|
654
658
|
|
655
659
|
it "includes the specified relation" do
|
656
|
-
expect(relation_hash).to include
|
657
|
-
{ "_id" => "
|
660
|
+
expect(relation_hash).to include(
|
661
|
+
{ "_id" => "Leo-Marvin", "first_name" => "Leo", "last_name" => "Marvin" }
|
662
|
+
)
|
658
663
|
end
|
659
664
|
end
|
660
665
|
|
@@ -665,8 +670,9 @@ describe Mongoid::Serializable do
|
|
665
670
|
end
|
666
671
|
|
667
672
|
it "includes the specified relation" do
|
668
|
-
expect(relation_hash).to include
|
669
|
-
{ "_id" => "
|
673
|
+
expect(relation_hash).to include(
|
674
|
+
{ "_id" => "Leo-Marvin", "first_name" => "Leo", "last_name" => "Marvin" }
|
675
|
+
)
|
670
676
|
end
|
671
677
|
end
|
672
678
|
|
@@ -677,8 +683,9 @@ describe Mongoid::Serializable do
|
|
677
683
|
end
|
678
684
|
|
679
685
|
it "includes the specified relation sans exceptions" do
|
680
|
-
expect(relation_hash).to include
|
686
|
+
expect(relation_hash).to include(
|
681
687
|
{ "first_name" => "Leo", "last_name" => "Marvin" }
|
688
|
+
)
|
682
689
|
end
|
683
690
|
end
|
684
691
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 9.0.
|
4
|
+
version: 9.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- The MongoDB Ruby Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: '5.1'
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '7.
|
22
|
+
version: '7.3'
|
23
23
|
- - "!="
|
24
24
|
- !ruby/object:Gem::Version
|
25
25
|
version: 7.0.0
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: '5.1'
|
33
33
|
- - "<"
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: '7.
|
35
|
+
version: '7.3'
|
36
36
|
- - "!="
|
37
37
|
- !ruby/object:Gem::Version
|
38
38
|
version: 7.0.0
|
@@ -168,6 +168,7 @@ files:
|
|
168
168
|
- lib/mongoid/association/referenced/has_one/eager.rb
|
169
169
|
- lib/mongoid/association/referenced/has_one/proxy.rb
|
170
170
|
- lib/mongoid/association/referenced/syncable.rb
|
171
|
+
- lib/mongoid/association/referenced/with_polymorphic_criteria.rb
|
171
172
|
- lib/mongoid/association/reflections.rb
|
172
173
|
- lib/mongoid/association/relatable.rb
|
173
174
|
- lib/mongoid/atomic.rb
|
@@ -335,6 +336,9 @@ files:
|
|
335
336
|
- lib/mongoid/errors/transactions_not_supported.rb
|
336
337
|
- lib/mongoid/errors/unknown_attribute.rb
|
337
338
|
- lib/mongoid/errors/unknown_model.rb
|
339
|
+
- lib/mongoid/errors/unrecognized_model_alias.rb
|
340
|
+
- lib/mongoid/errors/unrecognized_resolver.rb
|
341
|
+
- lib/mongoid/errors/unregistered_class.rb
|
338
342
|
- lib/mongoid/errors/unsaved_document.rb
|
339
343
|
- lib/mongoid/errors/unsupported_javascript.rb
|
340
344
|
- lib/mongoid/errors/validations.rb
|
@@ -373,6 +377,7 @@ files:
|
|
373
377
|
- lib/mongoid/fields/validators.rb
|
374
378
|
- lib/mongoid/fields/validators/macro.rb
|
375
379
|
- lib/mongoid/findable.rb
|
380
|
+
- lib/mongoid/identifiable.rb
|
376
381
|
- lib/mongoid/indexable.rb
|
377
382
|
- lib/mongoid/indexable/specification.rb
|
378
383
|
- lib/mongoid/indexable/validators/options.rb
|
@@ -413,6 +418,7 @@ files:
|
|
413
418
|
- lib/mongoid/matcher/regex.rb
|
414
419
|
- lib/mongoid/matcher/size.rb
|
415
420
|
- lib/mongoid/matcher/type.rb
|
421
|
+
- lib/mongoid/model_resolver.rb
|
416
422
|
- lib/mongoid/persistable.rb
|
417
423
|
- lib/mongoid/persistable/creatable.rb
|
418
424
|
- lib/mongoid/persistable/deletable.rb
|
@@ -578,6 +584,7 @@ files:
|
|
578
584
|
- spec/integration/matcher_operator_data/type_undefined.yml
|
579
585
|
- spec/integration/matcher_operator_spec.rb
|
580
586
|
- spec/integration/matcher_spec.rb
|
587
|
+
- spec/integration/persistence/collection_options_spec.rb
|
581
588
|
- spec/integration/persistence/range_field_spec.rb
|
582
589
|
- spec/integration/server_query_spec.rb
|
583
590
|
- spec/integration/shardable_spec.rb
|
@@ -828,6 +835,7 @@ files:
|
|
828
835
|
- spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml
|
829
836
|
- spec/mongoid/matcher/extract_attribute_data/traversal.yml
|
830
837
|
- spec/mongoid/matcher/extract_attribute_spec.rb
|
838
|
+
- spec/mongoid/model_resolver_spec.rb
|
831
839
|
- spec/mongoid/mongoizable_spec.rb
|
832
840
|
- spec/mongoid/monkey_patches_spec.rb
|
833
841
|
- spec/mongoid/persistable/creatable_spec.rb
|
@@ -1298,6 +1306,7 @@ test_files:
|
|
1298
1306
|
- spec/integration/matcher_operator_data/type_undefined.yml
|
1299
1307
|
- spec/integration/matcher_operator_spec.rb
|
1300
1308
|
- spec/integration/matcher_spec.rb
|
1309
|
+
- spec/integration/persistence/collection_options_spec.rb
|
1301
1310
|
- spec/integration/persistence/range_field_spec.rb
|
1302
1311
|
- spec/integration/server_query_spec.rb
|
1303
1312
|
- spec/integration/shardable_spec.rb
|
@@ -1548,6 +1557,7 @@ test_files:
|
|
1548
1557
|
- spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml
|
1549
1558
|
- spec/mongoid/matcher/extract_attribute_data/traversal.yml
|
1550
1559
|
- spec/mongoid/matcher/extract_attribute_spec.rb
|
1560
|
+
- spec/mongoid/model_resolver_spec.rb
|
1551
1561
|
- spec/mongoid/mongoizable_spec.rb
|
1552
1562
|
- spec/mongoid/monkey_patches_spec.rb
|
1553
1563
|
- spec/mongoid/persistable/creatable_spec.rb
|