mongoid 8.0.4 → 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/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/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/attributes/dynamic.rb +1 -1
- data/lib/mongoid/attributes/nested.rb +2 -2
- 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 +104 -4
- 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/validators/async_query_executor.rb +24 -0
- data/lib/mongoid/config/validators.rb +1 -0
- data/lib/mongoid/config.rb +101 -0
- 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 +373 -113
- 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.rb +6 -5
- data/lib/mongoid/deprecable.rb +1 -1
- 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/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 +69 -13
- data/lib/mongoid/findable.rb +27 -3
- data/lib/mongoid/interceptable.rb +7 -6
- 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/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/macros.rb +5 -5
- data/lib/mongoid/validatable.rb +4 -1
- 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/callbacks_models.rb +37 -0
- data/spec/integration/callbacks_spec.rb +134 -0
- 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 -6
- 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 -18
- 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 +995 -36
- data/spec/mongoid/contextual/none_spec.rb +49 -2
- data/spec/mongoid/copyable_spec.rb +3 -11
- 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 +1 -1
- 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/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 -34
- data/spec/mongoid/findable_spec.rb +391 -34
- data/spec/mongoid/indexable_spec.rb +16 -10
- data/spec/mongoid/interceptable_spec.rb +15 -3
- 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 -4
- 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/uniqueness_spec.rb +2 -3
- data/spec/mongoid_spec.rb +35 -9
- data/spec/shared/lib/mrss/docker_runner.rb +7 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +15 -5
- data/spec/shared/lib/mrss/lite_constraints.rb +10 -2
- data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
- data/spec/shared/lib/mrss/utils.rb +28 -6
- data/spec/shared/share/Dockerfile.erb +36 -40
- data/spec/shared/shlib/server.sh +32 -8
- data/spec/shared/shlib/set_env.sh +4 -4
- 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/product.rb +1 -0
- data.tar.gz.sig +0 -0
- metadata +43 -7
- 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/lib/mongoid/changeable.rb
CHANGED
@@ -68,7 +68,9 @@ module Mongoid
|
|
68
68
|
# @example Move the changes to previous.
|
69
69
|
# person.move_changes
|
70
70
|
def move_changes
|
71
|
+
@changes_before_last_save = @previous_changes
|
71
72
|
@previous_changes = changes
|
73
|
+
@attributes_before_last_save = @previous_attributes
|
72
74
|
@previous_attributes = attributes.dup
|
73
75
|
Atomic::UPDATES.each do |update|
|
74
76
|
send(update).clear
|
@@ -133,6 +135,72 @@ module Mongoid
|
|
133
135
|
mods
|
134
136
|
end
|
135
137
|
|
138
|
+
# Returns the original value of an attribute before the last save.
|
139
|
+
#
|
140
|
+
# This method is useful in after callbacks to get the original value of
|
141
|
+
# an attribute before the save that triggered the callbacks to run.
|
142
|
+
#
|
143
|
+
# @param [ Symbol | String ] attr The name of the attribute.
|
144
|
+
#
|
145
|
+
# @return [ Object ] Value of the attribute before the last save.
|
146
|
+
def attribute_before_last_save(attr)
|
147
|
+
attr = database_field_name(attr)
|
148
|
+
attributes_before_last_save[attr]
|
149
|
+
end
|
150
|
+
|
151
|
+
# Returns the change to an attribute during the last save.
|
152
|
+
#
|
153
|
+
# @param [ Symbol | String ] attr The name of the attribute.
|
154
|
+
#
|
155
|
+
# @return [ Array<Object> | nil ] If the attribute was changed, returns
|
156
|
+
# an array containing the original value and the saved value, otherwise nil.
|
157
|
+
def saved_change_to_attribute(attr)
|
158
|
+
attr = database_field_name(attr)
|
159
|
+
previous_changes[attr]
|
160
|
+
end
|
161
|
+
|
162
|
+
# Returns whether this attribute changed during the last save.
|
163
|
+
#
|
164
|
+
# This method is useful in after callbacks, to see the change
|
165
|
+
# in an attribute during the save that triggered the callbacks to run.
|
166
|
+
#
|
167
|
+
# @param [ String ] attr The name of the attribute.
|
168
|
+
# @param **kwargs The optional keyword arguments.
|
169
|
+
#
|
170
|
+
# @option **kwargs [ Object ] :from The object the attribute was changed from.
|
171
|
+
# @option **kwargs [ Object ] :to The object the attribute was changed to.
|
172
|
+
#
|
173
|
+
# @return [ true | false ] Whether the attribute has changed during the last save.
|
174
|
+
def saved_change_to_attribute?(attr, **kwargs)
|
175
|
+
changes = saved_change_to_attribute(attr)
|
176
|
+
return false unless changes.is_a?(Array)
|
177
|
+
if kwargs.key?(:from) && kwargs.key?(:to)
|
178
|
+
changes.first == kwargs[:from] && changes.last == kwargs[:to]
|
179
|
+
elsif kwargs.key?(:from)
|
180
|
+
changes.first == kwargs[:from]
|
181
|
+
elsif kwargs.key?(:to)
|
182
|
+
changes.last == kwargs[:to]
|
183
|
+
else
|
184
|
+
true
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
# Returns whether this attribute change the next time we save.
|
189
|
+
#
|
190
|
+
# This method is useful in validations and before callbacks to determine
|
191
|
+
# if the next call to save will change a particular attribute.
|
192
|
+
#
|
193
|
+
# @param [ String ] attr The name of the attribute.
|
194
|
+
# @param **kwargs The optional keyword arguments.
|
195
|
+
#
|
196
|
+
# @option **kwargs [ Object ] :from The object the attribute was changed from.
|
197
|
+
# @option **kwargs [ Object ] :to The object the attribute was changed to.
|
198
|
+
#
|
199
|
+
# @return [ true | false ] Whether the attribute change the next time we save.
|
200
|
+
def will_save_change_to_attribute?(attr, **kwargs)
|
201
|
+
attribute_changed?(attr, **kwargs)
|
202
|
+
end
|
203
|
+
|
136
204
|
private
|
137
205
|
|
138
206
|
# Get attributes of the document before the document was saved.
|
@@ -142,6 +210,14 @@ module Mongoid
|
|
142
210
|
@previous_attributes ||= {}
|
143
211
|
end
|
144
212
|
|
213
|
+
def changes_before_last_save
|
214
|
+
@changes_before_last_save ||= {}
|
215
|
+
end
|
216
|
+
|
217
|
+
def attributes_before_last_save
|
218
|
+
@attributes_before_last_save ||= {}
|
219
|
+
end
|
220
|
+
|
145
221
|
# Get the old and new value for the provided attribute.
|
146
222
|
#
|
147
223
|
# @example Get the attribute change.
|
@@ -161,12 +237,24 @@ module Mongoid
|
|
161
237
|
# model.attribute_changed?("name")
|
162
238
|
#
|
163
239
|
# @param [ String ] attr The name of the attribute.
|
240
|
+
# @param **kwargs The optional keyword arguments.
|
241
|
+
#
|
242
|
+
# @option **kwargs [ Object ] :from The object the attribute was changed from.
|
243
|
+
# @option **kwargs [ Object ] :to The object the attribute was changed to.
|
164
244
|
#
|
165
245
|
# @return [ true | false ] Whether the attribute has changed.
|
166
|
-
def attribute_changed?(attr)
|
246
|
+
def attribute_changed?(attr, **kwargs)
|
167
247
|
attr = database_field_name(attr)
|
168
248
|
return false unless changed_attributes.key?(attr)
|
169
|
-
changed_attributes[attr]
|
249
|
+
return false if changed_attributes[attr] == attributes[attr]
|
250
|
+
if kwargs.key?(:from)
|
251
|
+
return false if changed_attributes[attr] != kwargs[:from]
|
252
|
+
end
|
253
|
+
if kwargs.key?(:to)
|
254
|
+
return false if attributes[attr] != kwargs[:to]
|
255
|
+
end
|
256
|
+
|
257
|
+
true
|
170
258
|
end
|
171
259
|
|
172
260
|
# Get whether or not the field has a different value from the default.
|
@@ -302,8 +390,11 @@ module Mongoid
|
|
302
390
|
# @param [ String ] meth The name of the accessor.
|
303
391
|
def create_dirty_change_check(name, meth)
|
304
392
|
generated_methods.module_eval do
|
305
|
-
re_define_method("#{meth}_changed?") do
|
306
|
-
attribute_changed?(name)
|
393
|
+
re_define_method("#{meth}_changed?") do |**kwargs|
|
394
|
+
attribute_changed?(name, **kwargs)
|
395
|
+
end
|
396
|
+
re_define_method("will_save_change_to_#{meth}?") do |**kwargs|
|
397
|
+
will_save_change_to_attribute?(name, **kwargs)
|
307
398
|
end
|
308
399
|
end
|
309
400
|
end
|
@@ -338,6 +429,15 @@ module Mongoid
|
|
338
429
|
re_define_method("#{meth}_previously_was") do
|
339
430
|
attribute_previously_was(name)
|
340
431
|
end
|
432
|
+
re_define_method("#{meth}_before_last_save") do
|
433
|
+
attribute_before_last_save(name)
|
434
|
+
end
|
435
|
+
re_define_method("saved_change_to_#{meth}") do
|
436
|
+
saved_change_to_attribute(name)
|
437
|
+
end
|
438
|
+
re_define_method("saved_change_to_#{meth}?") do |**kwargs|
|
439
|
+
saved_change_to_attribute?(name, **kwargs)
|
440
|
+
end
|
341
441
|
end
|
342
442
|
end
|
343
443
|
|
@@ -6,10 +6,7 @@ module Mongoid
|
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
8
|
included do
|
9
|
-
|
10
|
-
cattr_accessor :storage_options, instance_writer: false do
|
11
|
-
storage_options_defaults
|
12
|
-
end
|
9
|
+
class_attribute :storage_options, instance_writer: false, default: storage_options_defaults
|
13
10
|
end
|
14
11
|
|
15
12
|
module ClassMethods
|
@@ -49,7 +46,7 @@ module Mongoid
|
|
49
46
|
# @return [ Class ] The model class.
|
50
47
|
def store_in(options)
|
51
48
|
Validators::Storage.validate(self, options)
|
52
|
-
storage_options.merge
|
49
|
+
self.storage_options = self.storage_options.merge(options)
|
53
50
|
end
|
54
51
|
|
55
52
|
# Reset the store_in options
|
@@ -9,7 +9,7 @@ module Mongoid
|
|
9
9
|
extend self
|
10
10
|
|
11
11
|
# The valid options for storage.
|
12
|
-
VALID_OPTIONS = [ :collection, :database, :client ].freeze
|
12
|
+
VALID_OPTIONS = [ :collection, :collection_options, :database, :client ].freeze
|
13
13
|
|
14
14
|
# Validate the options provided to :store_in.
|
15
15
|
#
|
@@ -20,21 +20,9 @@ module Mongoid
|
|
20
20
|
# @param [ Hash | String | Symbol ] options The provided options.
|
21
21
|
def validate(klass, options)
|
22
22
|
valid_keys?(options) or raise Errors::InvalidStorageOptions.new(klass, options)
|
23
|
-
valid_parent?(klass) or raise Errors::InvalidStorageParent.new(klass)
|
24
23
|
end
|
25
24
|
|
26
25
|
private
|
27
|
-
# Determine if the current klass is valid to change store_in
|
28
|
-
# options
|
29
|
-
#
|
30
|
-
# @api private
|
31
|
-
#
|
32
|
-
# @param [ Class ] klass
|
33
|
-
#
|
34
|
-
# @return [ true | false ] If the class is valid.
|
35
|
-
def valid_parent?(klass)
|
36
|
-
!klass.superclass.include?(Mongoid::Document)
|
37
|
-
end
|
38
26
|
|
39
27
|
# Determine if all keys in the options hash are valid.
|
40
28
|
#
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
|
5
|
+
# Encapsulates behavior around defining collections.
|
6
|
+
module CollectionConfigurable
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
# Create the collection for the called upon Mongoid model.
|
11
|
+
#
|
12
|
+
# This method does not re-create existing collections.
|
13
|
+
#
|
14
|
+
# If the document includes `store_in` macro with `collection_options` key,
|
15
|
+
# these options are used when creating the collection.
|
16
|
+
#
|
17
|
+
# @param [ true | false ] force If true, the method will drop existing
|
18
|
+
# collections before creating new ones. If false, the method will create
|
19
|
+
# only new collection (that do not exist in the database).
|
20
|
+
#
|
21
|
+
# @raise [ Errors::CreateCollectionFailure ] If collection creation failed.
|
22
|
+
# @raise [ Errors::DropCollectionFailure ] If an attempt to drop collection failed.
|
23
|
+
def create_collection(force: false)
|
24
|
+
if collection_name.empty?
|
25
|
+
# This is most probably an anonymous class, we ignore them.
|
26
|
+
return
|
27
|
+
end
|
28
|
+
if collection_name.match(/^system\./)
|
29
|
+
# We do not do anything with system collections.
|
30
|
+
return
|
31
|
+
end
|
32
|
+
if force
|
33
|
+
collection.drop
|
34
|
+
end
|
35
|
+
if coll_options = collection.database.list_collections(filter: { name: collection_name.to_s }).first
|
36
|
+
if force
|
37
|
+
raise Errors::DropCollectionFailure.new(collection_name)
|
38
|
+
else
|
39
|
+
logger.debug(
|
40
|
+
"MONGOID: Collection '#{collection_name}' already exists " +
|
41
|
+
"in database '#{database_name}' with options '#{coll_options}'."
|
42
|
+
)
|
43
|
+
end
|
44
|
+
else
|
45
|
+
begin
|
46
|
+
collection.database[collection_name, storage_options.fetch(:collection_options, {})].create
|
47
|
+
rescue Mongo::Error::OperationFailure => e
|
48
|
+
raise Errors::CreateCollectionFailure.new(
|
49
|
+
collection_name,
|
50
|
+
storage_options[:collection_options],
|
51
|
+
e
|
52
|
+
)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/mongoid/composable.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "mongoid/changeable"
|
4
|
+
require "mongoid/collection_configurable"
|
4
5
|
require "mongoid/findable"
|
5
6
|
require "mongoid/indexable"
|
6
7
|
require "mongoid/inspectable"
|
@@ -36,6 +37,7 @@ module Mongoid
|
|
36
37
|
include Atomic
|
37
38
|
include Changeable
|
38
39
|
include Clients
|
40
|
+
include CollectionConfigurable
|
39
41
|
include Attributes
|
40
42
|
include Evolvable
|
41
43
|
include Fields
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
module Config
|
5
|
+
|
6
|
+
# Encapsulates logic for loading defaults.
|
7
|
+
module Defaults
|
8
|
+
|
9
|
+
# Load the defaults for the feature flags in the given Mongoid version.
|
10
|
+
# Note that this method will load the *new* functionality introduced in
|
11
|
+
# the given Mongoid version.
|
12
|
+
#
|
13
|
+
# @param [ String | Float ] The version number as X.y.
|
14
|
+
#
|
15
|
+
# raises [ ArgumentError ] if an invalid version is given.
|
16
|
+
def load_defaults(version)
|
17
|
+
# Note that for 7.x, since all of the feature flag defaults have been
|
18
|
+
# flipped to the new functionality, all of the settings for those
|
19
|
+
# versions are to give old functionality. Because of this, it is
|
20
|
+
# possible to recurse to later version to get all of the options to
|
21
|
+
# turn off. Note that this won't be true when adding feature flags to
|
22
|
+
# 9.x, since the default will be the old functionality until the next
|
23
|
+
# major version is released. More likely, the recursion will have to go
|
24
|
+
# in the other direction (towards earlier versions).
|
25
|
+
|
26
|
+
case version.to_s
|
27
|
+
when "7.3"
|
28
|
+
# flags introduced in 7.4 - old functionality
|
29
|
+
self.broken_aggregables = true
|
30
|
+
self.broken_alias_handling = true
|
31
|
+
self.broken_and = true
|
32
|
+
self.broken_scoping = true
|
33
|
+
self.broken_updates = true
|
34
|
+
self.compare_time_by_ms = false
|
35
|
+
self.legacy_pluck_distinct = true
|
36
|
+
self.legacy_triple_equals = true
|
37
|
+
self.object_id_as_json_oid = true
|
38
|
+
|
39
|
+
load_defaults "7.4"
|
40
|
+
when "7.4"
|
41
|
+
# flags introduced in 7.5 - old functionality
|
42
|
+
self.legacy_attributes = true
|
43
|
+
self.overwrite_chained_operators = true
|
44
|
+
|
45
|
+
load_defaults "7.5"
|
46
|
+
when "7.5"
|
47
|
+
# flags introduced in 8.0 - old functionality
|
48
|
+
self.map_big_decimal_to_decimal128 = false
|
49
|
+
when "8.0"
|
50
|
+
# All flag defaults currently reflect 8.0 behavior.
|
51
|
+
when "8.1"
|
52
|
+
# flags introduced in 8.1 - new functionality
|
53
|
+
self.legacy_readonly = false
|
54
|
+
else
|
55
|
+
raise ArgumentError, "Unknown version: #{version}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
module Config
|
5
|
+
module Validators
|
6
|
+
|
7
|
+
# Validator for async query executor configuration.
|
8
|
+
#
|
9
|
+
# @api private
|
10
|
+
module AsyncQueryExecutor
|
11
|
+
extend self
|
12
|
+
|
13
|
+
|
14
|
+
def validate(options)
|
15
|
+
if options.key?(:async_query_executor)
|
16
|
+
if options[:async_query_executor].to_sym == :immediate && !options[:global_executor_concurrency].nil?
|
17
|
+
raise Errors::InvalidGlobalExecutorConcurrency
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/mongoid/config.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "mongoid/config/defaults"
|
3
4
|
require "mongoid/config/environment"
|
4
5
|
require "mongoid/config/options"
|
5
6
|
require "mongoid/config/validators"
|
@@ -11,6 +12,7 @@ module Mongoid
|
|
11
12
|
module Config
|
12
13
|
extend Forwardable
|
13
14
|
extend Options
|
15
|
+
extend Defaults
|
14
16
|
extend self
|
15
17
|
|
16
18
|
def_delegators ::Mongoid, :logger, :logger=
|
@@ -70,6 +72,7 @@ module Mongoid
|
|
70
72
|
|
71
73
|
# Use ActiveSupport's time zone in time operations instead of the
|
72
74
|
# Ruby default time zone.
|
75
|
+
# @deprecated
|
73
76
|
option :use_activesupport_time_zone, default: true
|
74
77
|
|
75
78
|
# Return stored times as UTC.
|
@@ -125,6 +128,53 @@ module Mongoid
|
|
125
128
|
# always return a Hash.
|
126
129
|
option :legacy_attributes, default: false
|
127
130
|
|
131
|
+
# Sets the async_query_executor for the application. By default the thread pool executor
|
132
|
+
# is set to `:immediate. Options are:
|
133
|
+
#
|
134
|
+
# - :immediate - Initializes a single +Concurrent::ImmediateExecutor+
|
135
|
+
# - :global_thread_pool - Initializes a single +Concurrent::ThreadPoolExecutor+
|
136
|
+
# that uses the +async_query_concurrency+ for the +max_threads+ value.
|
137
|
+
option :async_query_executor, default: :immediate
|
138
|
+
|
139
|
+
# Defines how many asynchronous queries can be executed concurrently.
|
140
|
+
# This option should be set only if `async_query_executor` is set
|
141
|
+
# to `:global_thread_pool`.
|
142
|
+
option :global_executor_concurrency, default: nil
|
143
|
+
|
144
|
+
# When this flag is false, a document will become read-only only once the
|
145
|
+
# #readonly! method is called, and an error will be raised on attempting
|
146
|
+
# to save or update such documents, instead of just on delete. When this
|
147
|
+
# flag is true, a document is only read-only if it has been projected
|
148
|
+
# using #only or #without, and read-only documents will not be
|
149
|
+
# deletable/destroyable, but they will be savable/updatable.
|
150
|
+
# When this feature flag is turned on, the read-only state will be reset on
|
151
|
+
# reload, but when it is turned off, it won't be.
|
152
|
+
option :legacy_readonly, default: true
|
153
|
+
|
154
|
+
# When this flag is true, any attempt to change the _id of a persisted
|
155
|
+
# document will raise an exception (`Errors::ImmutableAttribute`).
|
156
|
+
# This will be the default in 9.0. When this flag is false (the default
|
157
|
+
# in 8.x), changing the _id of a persisted document might be ignored,
|
158
|
+
# or it might work, depending on the situation.
|
159
|
+
option :immutable_ids, default: false
|
160
|
+
|
161
|
+
# When this flag is true, callbacks for every embedded document will be
|
162
|
+
# called only once, even if the embedded document is embedded in multiple
|
163
|
+
# documents in the root document's dependencies graph.
|
164
|
+
# This will be the default in 9.0. Setting this flag to false restores the
|
165
|
+
# pre-9.0 behavior, where callbacks are called for every occurrence of an
|
166
|
+
# embedded document. The pre-9.0 behavior leads to a problem that for multi
|
167
|
+
# level nested documents callbacks are called multiple times.
|
168
|
+
# See https://jira.mongodb.org/browse/MONGOID-5542
|
169
|
+
option :prevent_multiple_calls_of_embedded_callbacks, default: false
|
170
|
+
|
171
|
+
# Returns the Config singleton, for use in the configure DSL.
|
172
|
+
#
|
173
|
+
# @return [ self ] The Config singleton.
|
174
|
+
def config
|
175
|
+
self
|
176
|
+
end
|
177
|
+
|
128
178
|
# Has Mongoid been configured? This is checking that at least a valid
|
129
179
|
# client config exists.
|
130
180
|
#
|
@@ -206,6 +256,17 @@ module Mongoid
|
|
206
256
|
end
|
207
257
|
end
|
208
258
|
|
259
|
+
# Deregister a model in the application with Mongoid.
|
260
|
+
#
|
261
|
+
# @param [ Class ] klass The model to deregister.
|
262
|
+
#
|
263
|
+
# @api private
|
264
|
+
def deregister_model(klass)
|
265
|
+
LOCK.synchronize do
|
266
|
+
models.delete(klass)
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
209
270
|
# From a hash of settings, load all the configuration.
|
210
271
|
#
|
211
272
|
# @example Load the configuration.
|
@@ -278,6 +339,7 @@ module Mongoid
|
|
278
339
|
# @param [ Hash ] options The configuration options.
|
279
340
|
def options=(options)
|
280
341
|
if options
|
342
|
+
Validators::AsyncQueryExecutor.validate(options)
|
281
343
|
options.each_pair do |option, value|
|
282
344
|
Validators::Option.validate(option)
|
283
345
|
send("#{option}=", value)
|
@@ -345,5 +407,44 @@ module Mongoid
|
|
345
407
|
client
|
346
408
|
end
|
347
409
|
end
|
410
|
+
|
411
|
+
module DeprecatedOptions
|
412
|
+
OPTIONS = %i[ use_activesupport_time_zone
|
413
|
+
broken_aggregables
|
414
|
+
broken_alias_handling
|
415
|
+
broken_and
|
416
|
+
broken_scoping
|
417
|
+
broken_updates
|
418
|
+
compare_time_by_ms
|
419
|
+
legacy_attributes
|
420
|
+
legacy_pluck_distinct
|
421
|
+
legacy_triple_equals
|
422
|
+
object_id_as_json_oid
|
423
|
+
overwrite_chained_operators ]
|
424
|
+
|
425
|
+
if RUBY_VERSION < '3.0'
|
426
|
+
def self.prepended(klass)
|
427
|
+
klass.class_eval do
|
428
|
+
OPTIONS.each do |option|
|
429
|
+
alias_method :"#{option}_without_deprecation=", :"#{option}="
|
430
|
+
|
431
|
+
define_method(:"#{option}=") do |value|
|
432
|
+
Mongoid::Warnings.send(:"warn_#{option}_deprecated")
|
433
|
+
send(:"#{option}_without_deprecation=", value)
|
434
|
+
end
|
435
|
+
end
|
436
|
+
end
|
437
|
+
end
|
438
|
+
else
|
439
|
+
OPTIONS.each do |option|
|
440
|
+
define_method(:"#{option}=") do |value|
|
441
|
+
Mongoid::Warnings.send(:"warn_#{option}_deprecated")
|
442
|
+
super(value)
|
443
|
+
end
|
444
|
+
end
|
445
|
+
end
|
446
|
+
end
|
447
|
+
|
448
|
+
prepend DeprecatedOptions
|
348
449
|
end
|
349
450
|
end
|
@@ -150,7 +150,7 @@ module Mongoid
|
|
150
150
|
# @example Unset the field on the matches.
|
151
151
|
# context.unset(:name)
|
152
152
|
#
|
153
|
-
# @param [ String | Symbol | Array<String | Symbol> | Hash ] args
|
153
|
+
# @param [ [ String | Symbol | Array<String | Symbol> | Hash ]... ] *args
|
154
154
|
# The name(s) of the field(s) to unset.
|
155
155
|
# If a Hash is specified, its keys will be used irrespective of what
|
156
156
|
# each key's value is, even if the value is nil or false.
|