mongoid 8.0.8 → 8.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +3 -3
- data/README.md +3 -3
- data/Rakefile +0 -25
- data/lib/config/locales/en.yml +46 -14
- data/lib/mongoid/association/accessors.rb +2 -2
- data/lib/mongoid/association/builders.rb +1 -1
- data/lib/mongoid/association/embedded/batchable.rb +2 -2
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -1
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +3 -2
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +6 -6
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +1 -1
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +1 -1
- data/lib/mongoid/association/macros.rb +0 -6
- data/lib/mongoid/association/nested/one.rb +40 -2
- data/lib/mongoid/association/proxy.rb +1 -1
- data/lib/mongoid/association/referenced/counter_cache.rb +2 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +2 -2
- data/lib/mongoid/association/referenced/has_many/proxy.rb +3 -3
- data/lib/mongoid/association/reflections.rb +2 -2
- data/lib/mongoid/atomic.rb +7 -16
- data/lib/mongoid/attributes/dynamic.rb +1 -1
- data/lib/mongoid/attributes/nested.rb +2 -2
- data/lib/mongoid/attributes/processing.rb +5 -29
- data/lib/mongoid/attributes/projector.rb +1 -1
- data/lib/mongoid/attributes/readonly.rb +1 -1
- data/lib/mongoid/attributes.rb +8 -2
- data/lib/mongoid/changeable.rb +107 -5
- data/lib/mongoid/clients/storage_options.rb +2 -5
- data/lib/mongoid/clients/validators/storage.rb +1 -13
- data/lib/mongoid/collection_configurable.rb +58 -0
- data/lib/mongoid/composable.rb +2 -0
- data/lib/mongoid/config/defaults.rb +60 -0
- data/lib/mongoid/config/options.rb +0 -3
- data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
- data/lib/mongoid/config/validators.rb +1 -0
- data/lib/mongoid/config.rb +99 -28
- data/lib/mongoid/contextual/atomic.rb +1 -1
- data/lib/mongoid/contextual/memory.rb +233 -33
- data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
- data/lib/mongoid/contextual/mongo.rb +370 -133
- data/lib/mongoid/contextual/none.rb +162 -7
- data/lib/mongoid/contextual.rb +12 -0
- data/lib/mongoid/criteria/findable.rb +2 -2
- data/lib/mongoid/criteria/includable.rb +4 -3
- data/lib/mongoid/criteria/queryable/key.rb +1 -1
- data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
- data/lib/mongoid/criteria/queryable/optional.rb +8 -8
- data/lib/mongoid/criteria/queryable/selectable.rb +43 -12
- data/lib/mongoid/criteria/queryable/selector.rb +1 -1
- data/lib/mongoid/criteria/queryable/storable.rb +1 -1
- data/lib/mongoid/criteria.rb +6 -5
- data/lib/mongoid/deprecable.rb +1 -2
- data/lib/mongoid/deprecation.rb +3 -3
- data/lib/mongoid/errors/create_collection_failure.rb +33 -0
- data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
- data/lib/mongoid/errors/immutable_attribute.rb +26 -0
- data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
- data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
- data/lib/mongoid/errors.rb +4 -1
- data/lib/mongoid/extensions/hash.rb +2 -24
- data/lib/mongoid/extensions/object.rb +2 -2
- data/lib/mongoid/extensions/time.rb +2 -0
- data/lib/mongoid/fields/localized.rb +10 -0
- data/lib/mongoid/fields/standard.rb +10 -0
- data/lib/mongoid/fields.rb +53 -24
- data/lib/mongoid/findable.rb +27 -3
- data/lib/mongoid/interceptable.rb +10 -118
- data/lib/mongoid/matcher/eq_impl.rb +1 -1
- data/lib/mongoid/matcher/type.rb +1 -1
- data/lib/mongoid/persistable/creatable.rb +1 -0
- data/lib/mongoid/persistable/deletable.rb +1 -1
- data/lib/mongoid/persistable/savable.rb +13 -1
- data/lib/mongoid/persistable/unsettable.rb +2 -2
- data/lib/mongoid/persistable/updatable.rb +51 -1
- data/lib/mongoid/persistable/upsertable.rb +20 -1
- data/lib/mongoid/persistable.rb +3 -0
- data/lib/mongoid/query_cache.rb +5 -1
- data/lib/mongoid/railties/database.rake +7 -2
- data/lib/mongoid/reloadable.rb +5 -3
- data/lib/mongoid/stateful.rb +22 -1
- data/lib/mongoid/tasks/database.rake +12 -0
- data/lib/mongoid/tasks/database.rb +20 -0
- data/lib/mongoid/utils.rb +22 -0
- data/lib/mongoid/validatable/associated.rb +18 -96
- data/lib/mongoid/validatable/macros.rb +5 -5
- data/lib/mongoid/validatable.rb +4 -9
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +17 -1
- data/lib/mongoid.rb +16 -3
- data/spec/integration/app_spec.rb +2 -2
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +0 -40
- data/spec/integration/callbacks_models.rb +37 -0
- data/spec/integration/callbacks_spec.rb +126 -12
- data/spec/integration/discriminator_key_spec.rb +4 -5
- data/spec/integration/i18n_fallbacks_spec.rb +3 -2
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +27 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +20 -25
- data/spec/mongoid/association/embedded/embeds_many_models.rb +1 -0
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -18
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +5 -27
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +9 -50
- data/spec/mongoid/association/syncable_spec.rb +1 -1
- data/spec/mongoid/attributes_spec.rb +3 -33
- data/spec/mongoid/changeable_spec.rb +299 -24
- data/spec/mongoid/clients_spec.rb +122 -13
- data/spec/mongoid/collection_configurable_spec.rb +158 -0
- data/spec/mongoid/config/defaults_spec.rb +160 -0
- data/spec/mongoid/config_spec.rb +154 -27
- data/spec/mongoid/contextual/memory_spec.rb +332 -76
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
- data/spec/mongoid/contextual/mongo_spec.rb +1009 -125
- data/spec/mongoid/contextual/none_spec.rb +49 -2
- data/spec/mongoid/copyable_spec.rb +2 -10
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -10
- data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +419 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/selector_spec.rb +3 -76
- data/spec/mongoid/criteria/queryable/storable_spec.rb +0 -72
- data/spec/mongoid/criteria_projection_spec.rb +1 -4
- data/spec/mongoid/criteria_spec.rb +5 -9
- data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
- data/spec/mongoid/extensions/hash_spec.rb +3 -3
- data/spec/mongoid/extensions/time_spec.rb +8 -43
- data/spec/mongoid/extensions/time_with_zone_spec.rb +7 -52
- data/spec/mongoid/fields/localized_spec.rb +46 -28
- data/spec/mongoid/fields_spec.rb +136 -77
- data/spec/mongoid/findable_spec.rb +391 -34
- data/spec/mongoid/indexable_spec.rb +16 -10
- data/spec/mongoid/interceptable_spec.rb +173 -362
- data/spec/mongoid/persistable/deletable_spec.rb +26 -6
- data/spec/mongoid/persistable/destroyable_spec.rb +26 -6
- data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
- data/spec/mongoid/persistable/logical_spec.rb +37 -0
- data/spec/mongoid/persistable/poppable_spec.rb +36 -0
- data/spec/mongoid/persistable/pullable_spec.rb +72 -0
- data/spec/mongoid/persistable/pushable_spec.rb +72 -0
- data/spec/mongoid/persistable/renamable_spec.rb +36 -0
- data/spec/mongoid/persistable/savable_spec.rb +96 -0
- data/spec/mongoid/persistable/settable_spec.rb +37 -0
- data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
- data/spec/mongoid/persistable/updatable_spec.rb +20 -28
- data/spec/mongoid/persistable/upsertable_spec.rb +80 -6
- data/spec/mongoid/persistence_context_spec.rb +7 -57
- data/spec/mongoid/query_cache_spec.rb +56 -61
- data/spec/mongoid/reloadable_spec.rb +24 -28
- data/spec/mongoid/scopable_spec.rb +70 -0
- data/spec/mongoid/serializable_spec.rb +9 -30
- data/spec/mongoid/stateful_spec.rb +122 -8
- data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
- data/spec/mongoid/tasks/database_spec.rb +127 -0
- data/spec/mongoid/timestamps_spec.rb +9 -11
- data/spec/mongoid/touchable_spec.rb +277 -5
- data/spec/mongoid/touchable_spec_models.rb +3 -1
- data/spec/mongoid/traversable_spec.rb +9 -24
- data/spec/mongoid/validatable/associated_spec.rb +30 -13
- data/spec/mongoid/validatable/uniqueness_spec.rb +2 -3
- data/spec/mongoid_spec.rb +36 -10
- data/spec/spec_helper.rb +5 -0
- data/spec/support/immutable_ids.rb +118 -0
- data/spec/support/macros.rb +47 -15
- data/spec/support/models/artist.rb +0 -1
- data/spec/support/models/band.rb +1 -0
- data/spec/support/models/book.rb +1 -0
- data/spec/support/models/building.rb +2 -0
- data/spec/support/models/cover.rb +10 -0
- data/spec/support/models/name.rb +0 -10
- data/spec/support/models/person.rb +0 -1
- data/spec/support/models/product.rb +1 -0
- data.tar.gz.sig +0 -0
- metadata +698 -664
- metadata.gz.sig +0 -0
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
- data/spec/support/models/purse.rb +0 -9
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
module Mongoid
|
|
2
|
+
module ImmutableIds
|
|
3
|
+
def immutable_id_examples_as(name)
|
|
4
|
+
shared_examples_for name do
|
|
5
|
+
shared_examples 'a persisted document' do
|
|
6
|
+
it 'should ignore the change and issue a warning' do
|
|
7
|
+
expect(Mongoid::Warnings).to receive(:warn_mutable_ids)
|
|
8
|
+
expect { invoke_operation! }.not_to raise_error
|
|
9
|
+
expect(id_is_unchanged).not_to be legacy_behavior_expects_id_to_change
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
context 'when immutable_ids is true' do
|
|
13
|
+
before { Mongoid::Config.immutable_ids = true }
|
|
14
|
+
after { Mongoid::Config.immutable_ids = false }
|
|
15
|
+
|
|
16
|
+
it 'should disallow _id to be updated' do
|
|
17
|
+
expect { invoke_operation! }
|
|
18
|
+
.to raise_error(Mongoid::Errors::ImmutableAttribute)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
context 'when id is set to the existing value' do
|
|
22
|
+
let(:new_id_value) { object._id }
|
|
23
|
+
|
|
24
|
+
it 'should allow the update to proceed' do
|
|
25
|
+
expect { invoke_operation! }
|
|
26
|
+
.not_to raise_error
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context 'when the field is _id' do
|
|
33
|
+
let(:new_id_value) { 1234 }
|
|
34
|
+
|
|
35
|
+
context 'when the document is top-level' do
|
|
36
|
+
let(:legacy_behavior_expects_id_to_change) { false }
|
|
37
|
+
|
|
38
|
+
context 'when the document is new' do
|
|
39
|
+
let(:object) { Person.new }
|
|
40
|
+
|
|
41
|
+
it 'should allow _id to be updated' do
|
|
42
|
+
invoke_operation!
|
|
43
|
+
expect(object.new_record?).to be false
|
|
44
|
+
expect(object.reload._id).to be == new_id_value
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
context 'when the document has been persisted' do
|
|
49
|
+
let(:object) { Person.create }
|
|
50
|
+
let!(:original_id) { object._id }
|
|
51
|
+
let(:id_is_unchanged) { Person.exists?(original_id) }
|
|
52
|
+
|
|
53
|
+
it_behaves_like 'a persisted document'
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
context 'when the document is embedded' do
|
|
58
|
+
let(:parent) { Person.create }
|
|
59
|
+
let(:legacy_behavior_expects_id_to_change) { true }
|
|
60
|
+
|
|
61
|
+
context 'when the document is new' do
|
|
62
|
+
let(:object) { parent.favorites.new }
|
|
63
|
+
|
|
64
|
+
it 'should allow _id to be updated' do
|
|
65
|
+
invoke_operation!
|
|
66
|
+
expect(object.new_record?).to be false
|
|
67
|
+
expect(parent.reload.favorites.first._id).to be == new_id_value
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
context 'when the document has been persisted' do
|
|
72
|
+
let(:object) { parent.favorites.create }
|
|
73
|
+
let!(:original_id) { object._id }
|
|
74
|
+
let(:id_is_unchanged) { parent.favorites.where(_id: original_id).exists? }
|
|
75
|
+
|
|
76
|
+
it_behaves_like 'a persisted document'
|
|
77
|
+
|
|
78
|
+
context 'updating embeds_one via parent' do
|
|
79
|
+
context 'when immutable_ids is false' do
|
|
80
|
+
before { expect(Mongoid::Config.immutable_ids).to be false }
|
|
81
|
+
|
|
82
|
+
it 'should ignore the change' do
|
|
83
|
+
expect(Mongoid::Warnings).to receive(:warn_mutable_ids)
|
|
84
|
+
|
|
85
|
+
parent.pet = pet = Pet.new
|
|
86
|
+
parent.save
|
|
87
|
+
|
|
88
|
+
original_id = pet._id
|
|
89
|
+
new_id = BSON::ObjectId.new
|
|
90
|
+
|
|
91
|
+
expect { parent.update(pet: { _id: new_id }) }.not_to raise_error
|
|
92
|
+
expect(parent.reload.pet._id.to_s).to be == original_id.to_s
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
context 'when immutable_ids is true' do
|
|
97
|
+
before { Mongoid::Config.immutable_ids = true }
|
|
98
|
+
after { Mongoid::Config.immutable_ids = false }
|
|
99
|
+
|
|
100
|
+
it 'should raise an exception' do
|
|
101
|
+
parent.pet = pet = Pet.new
|
|
102
|
+
parent.save
|
|
103
|
+
|
|
104
|
+
original_id = pet._id
|
|
105
|
+
new_id = BSON::ObjectId.new
|
|
106
|
+
|
|
107
|
+
expect { parent.update(pet: { _id: new_id }) }
|
|
108
|
+
.to raise_error(Mongoid::Errors::ImmutableAttribute)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
data/spec/support/macros.rb
CHANGED
|
@@ -2,9 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
module Mongoid
|
|
4
4
|
module Macros
|
|
5
|
-
class I18nBackendWithFallbacks < I18n::Backend::Simple
|
|
6
|
-
include I18n::Backend::Fallbacks
|
|
7
|
-
end
|
|
8
5
|
|
|
9
6
|
def use_spec_mongoid_config
|
|
10
7
|
around do |example|
|
|
@@ -43,18 +40,6 @@ module Mongoid
|
|
|
43
40
|
end
|
|
44
41
|
end
|
|
45
42
|
|
|
46
|
-
def with_i18n_fallbacks
|
|
47
|
-
require_fallbacks
|
|
48
|
-
|
|
49
|
-
around do |example|
|
|
50
|
-
old_backend = I18n.backend
|
|
51
|
-
I18n.backend = I18nBackendWithFallbacks.new
|
|
52
|
-
example.run
|
|
53
|
-
ensure
|
|
54
|
-
I18n.backend = old_backend
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
43
|
def driver_config_override(key, value)
|
|
59
44
|
around do |example|
|
|
60
45
|
existing = Mongo.send(key)
|
|
@@ -93,5 +78,52 @@ module Mongoid
|
|
|
93
78
|
end
|
|
94
79
|
end
|
|
95
80
|
end
|
|
81
|
+
|
|
82
|
+
def override_query_cache(enabled)
|
|
83
|
+
around do |example|
|
|
84
|
+
cache_enabled = Mongo::QueryCache.enabled?
|
|
85
|
+
Mongo::QueryCache.enabled = enabled
|
|
86
|
+
example.run
|
|
87
|
+
Mongo::QueryCache.enabled = cache_enabled
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Override the global persistence context.
|
|
92
|
+
#
|
|
93
|
+
# @param [ :client, :database ] component The component to override.
|
|
94
|
+
# @param [ Object ] value The value to override to.
|
|
95
|
+
def persistence_context_override(component, value)
|
|
96
|
+
around do |example|
|
|
97
|
+
meth = "#{component}_override"
|
|
98
|
+
old_value = Mongoid::Threaded.send(meth)
|
|
99
|
+
Mongoid::Threaded.send("#{meth}=", value)
|
|
100
|
+
example.run
|
|
101
|
+
Mongoid::Threaded.send("#{meth}=", old_value)
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def time_zone_override(tz)
|
|
106
|
+
around do |example|
|
|
107
|
+
old_tz = Time.zone
|
|
108
|
+
Time.zone = tz
|
|
109
|
+
example.run
|
|
110
|
+
Time.zone = old_tz
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def with_default_i18n_configs
|
|
115
|
+
around do |example|
|
|
116
|
+
I18n.locale = :en
|
|
117
|
+
I18n.default_locale = :en
|
|
118
|
+
I18n.try(:fallbacks=, I18n::Locale::Fallbacks.new)
|
|
119
|
+
I18n.enforce_available_locales = false
|
|
120
|
+
example.run
|
|
121
|
+
ensure
|
|
122
|
+
I18n.locale = :en
|
|
123
|
+
I18n.default_locale = :en
|
|
124
|
+
I18n.try(:fallbacks=, I18n::Locale::Fallbacks.new)
|
|
125
|
+
I18n.enforce_available_locales = false
|
|
126
|
+
end
|
|
127
|
+
end
|
|
96
128
|
end
|
|
97
129
|
end
|
data/spec/support/models/band.rb
CHANGED
data/spec/support/models/book.rb
CHANGED
data/spec/support/models/name.rb
CHANGED
|
@@ -4,8 +4,6 @@ class Name
|
|
|
4
4
|
include Mongoid::Document
|
|
5
5
|
include Mongoid::Attributes::Dynamic
|
|
6
6
|
|
|
7
|
-
validate :is_not_jamis
|
|
8
|
-
|
|
9
7
|
field :_id, type: String, overwrite: true, default: ->{
|
|
10
8
|
"#{first_name}-#{last_name}"
|
|
11
9
|
}
|
|
@@ -25,12 +23,4 @@ class Name
|
|
|
25
23
|
def set_parent=(set = false)
|
|
26
24
|
self.parent_title = namable.title if set
|
|
27
25
|
end
|
|
28
|
-
|
|
29
|
-
private
|
|
30
|
-
|
|
31
|
-
def is_not_jamis
|
|
32
|
-
if first_name == 'Jamis' && last_name == 'Buck'
|
|
33
|
-
errors.add(:base, :invalid)
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
26
|
end
|
|
@@ -70,7 +70,6 @@ class Person
|
|
|
70
70
|
embeds_many :messages, validate: false
|
|
71
71
|
|
|
72
72
|
embeds_one :passport, autobuild: true, store_as: :pass, validate: false
|
|
73
|
-
embeds_one :purse, store_as: "Purse"
|
|
74
73
|
embeds_one :pet, class_name: "Animal", validate: false
|
|
75
74
|
embeds_one :name, as: :namable, validate: false do
|
|
76
75
|
def extension
|
data.tar.gz.sig
CHANGED
|
Binary file
|