mongoid 8.0.3 → 8.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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 +23 -21
- 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 +5 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +2 -2
- data/lib/mongoid/association/referenced/has_many/proxy.rb +7 -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/extensions/array.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +0 -8
- data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -11
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +0 -10
- 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/translator.rb +45 -0
- data/lib/mongoid/criteria.rb +7 -5
- data/lib/mongoid/deprecable.rb +1 -1
- data/lib/mongoid/document.rb +50 -13
- 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/factory.rb +21 -8
- 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/matcher.rb +21 -6
- 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/shardable.rb +35 -11
- 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/threaded.rb +30 -0
- data/lib/mongoid/traversable.rb +1 -1
- 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 +57 -57
- 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 +148 -224
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +111 -164
- data/spec/mongoid/association/syncable_spec.rb +1 -1
- data/spec/mongoid/attributes_spec.rb +5 -8
- 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 -69
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
- data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -0
- 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/translator_spec.rb +132 -0
- 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/shardable_models.rb +14 -0
- data/spec/mongoid/shardable_spec.rb +153 -61
- 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 +700 -656
- 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/deprecable.rb
CHANGED
@@ -24,7 +24,7 @@ module Mongoid
|
|
24
24
|
# #=> Mongoid.logger.warn("meow is deprecated and will be removed from Mongoid 8.0 (eat :catnip instead)")
|
25
25
|
#
|
26
26
|
# @param [ Module ] target_module The parent which contains the method.
|
27
|
-
# @param [ Symbol | Hash<Symbol, [ Symbol | String ]> ] method_descriptors
|
27
|
+
# @param [ [ Symbol | Hash<Symbol, [ Symbol | String ]> ]... ] *method_descriptors
|
28
28
|
# The methods to deprecate, with optional replacement instructions.
|
29
29
|
def deprecate(target_module, *method_descriptors)
|
30
30
|
Mongoid::Deprecation.deprecate_methods(target_module, *method_descriptors)
|
data/lib/mongoid/document.rb
CHANGED
@@ -101,7 +101,7 @@ module Mongoid
|
|
101
101
|
#
|
102
102
|
# @return [ Document ] A new document.
|
103
103
|
def initialize(attrs = nil, &block)
|
104
|
-
construct_document(attrs,
|
104
|
+
construct_document(attrs, &block)
|
105
105
|
end
|
106
106
|
|
107
107
|
# Return the model name of the document.
|
@@ -208,13 +208,22 @@ module Mongoid
|
|
208
208
|
# Does the construction of a document.
|
209
209
|
#
|
210
210
|
# @param [ Hash ] attrs The attributes to set up the document with.
|
211
|
-
# @param [
|
212
|
-
#
|
211
|
+
# @param [ Hash ] options The options to use.
|
212
|
+
#
|
213
|
+
# @option options [ true | false ] :execute_callbacks Flag specifies
|
214
|
+
# whether callbacks should be run.
|
213
215
|
#
|
214
216
|
# @return [ Document ] A new document.
|
215
217
|
#
|
218
|
+
# @note A Ruby 2.x bug prevents the options hash from being keyword
|
219
|
+
# arguments. Once we drop support for Ruby 2.x, we can reimplement
|
220
|
+
# the options hash as keyword arguments.
|
221
|
+
# See https://bugs.ruby-lang.org/issues/15753
|
222
|
+
#
|
216
223
|
# @api private
|
217
|
-
def construct_document(attrs = nil,
|
224
|
+
def construct_document(attrs = nil, options = {})
|
225
|
+
execute_callbacks = options.fetch(:execute_callbacks, Threaded.execute_callbacks?)
|
226
|
+
|
218
227
|
@__parent = nil
|
219
228
|
_building do
|
220
229
|
@new_record = true
|
@@ -281,6 +290,20 @@ module Mongoid
|
|
281
290
|
|
282
291
|
module ClassMethods
|
283
292
|
|
293
|
+
# Indicate whether callbacks should be invoked by default or not,
|
294
|
+
# within the block. Callbacks may always be explicitly invoked by passing
|
295
|
+
# `execute_callbacks: true` where available.
|
296
|
+
#
|
297
|
+
# @params execute_callbacks [ true | false ] Whether callbacks should be
|
298
|
+
# suppressed or not.
|
299
|
+
def with_callbacks(execute_callbacks)
|
300
|
+
saved, Threaded.execute_callbacks =
|
301
|
+
Threaded.execute_callbacks?, execute_callbacks
|
302
|
+
yield
|
303
|
+
ensure
|
304
|
+
Threaded.execute_callbacks = saved
|
305
|
+
end
|
306
|
+
|
284
307
|
# Instantiate a new object, only when loaded from the database or when
|
285
308
|
# the attributes have already been typecast.
|
286
309
|
#
|
@@ -295,7 +318,7 @@ module Mongoid
|
|
295
318
|
#
|
296
319
|
# @return [ Document ] A new document.
|
297
320
|
def instantiate(attrs = nil, selected_fields = nil, &block)
|
298
|
-
instantiate_document(attrs, selected_fields,
|
321
|
+
instantiate_document(attrs, selected_fields, &block)
|
299
322
|
end
|
300
323
|
|
301
324
|
# Instantiate the document.
|
@@ -303,13 +326,20 @@ module Mongoid
|
|
303
326
|
# @param [ Hash ] attrs The hash of attributes to instantiate with.
|
304
327
|
# @param [ Integer ] selected_fields The selected fields from the
|
305
328
|
# criteria.
|
306
|
-
# @param [
|
307
|
-
#
|
329
|
+
# @param [ Hash ] options The options to use.
|
330
|
+
#
|
331
|
+
# @option options [ true | false ] :execute_callbacks Flag specifies
|
332
|
+
# whether callbacks should be run.
|
308
333
|
#
|
309
334
|
# @return [ Document ] A new document.
|
310
335
|
#
|
336
|
+
# @note A Ruby 2.x bug prevents the options hash from being keyword
|
337
|
+
# arguments. Once we drop support for Ruby 2.x, we can reimplement
|
338
|
+
# the options hash as keyword arguments.
|
339
|
+
#
|
311
340
|
# @api private
|
312
|
-
def instantiate_document(attrs = nil, selected_fields = nil,
|
341
|
+
def instantiate_document(attrs = nil, selected_fields = nil, options = {})
|
342
|
+
execute_callbacks = options.fetch(:execute_callbacks, Threaded.execute_callbacks?)
|
313
343
|
attributes = if Mongoid.legacy_attributes
|
314
344
|
attrs
|
315
345
|
else
|
@@ -340,15 +370,22 @@ module Mongoid
|
|
340
370
|
# Allocates and constructs a document.
|
341
371
|
#
|
342
372
|
# @param [ Hash ] attrs The attributes to set up the document with.
|
343
|
-
# @param [
|
344
|
-
#
|
373
|
+
# @param [ Hash ] options The options to use.
|
374
|
+
#
|
375
|
+
# @option options [ true | false ] :execute_callbacks Flag specifies
|
376
|
+
# whether callbacks should be run.
|
377
|
+
#
|
378
|
+
# @note A Ruby 2.x bug prevents the options hash from being keyword
|
379
|
+
# arguments. Once we drop support for Ruby 2.x, we can reimplement
|
380
|
+
# the options hash as keyword arguments.
|
381
|
+
# See https://bugs.ruby-lang.org/issues/15753
|
345
382
|
#
|
346
383
|
# @return [ Document ] A new document.
|
347
384
|
#
|
348
385
|
# @api private
|
349
|
-
def construct_document(attrs = nil,
|
350
|
-
|
351
|
-
|
386
|
+
def construct_document(attrs = nil, options = {})
|
387
|
+
execute_callbacks = options.fetch(:execute_callbacks, Threaded.execute_callbacks?)
|
388
|
+
with_callbacks(execute_callbacks) { new(attrs) }
|
352
389
|
end
|
353
390
|
|
354
391
|
# Returns all types to query for when using this class as the base.
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
module Errors
|
5
|
+
|
6
|
+
# Raised when an attempt to create a collection failed.
|
7
|
+
class CreateCollectionFailure < MongoidError
|
8
|
+
|
9
|
+
# Instantiate the create collection error.
|
10
|
+
#
|
11
|
+
# @param [ String ] collection_name The name of the collection that
|
12
|
+
# Mongoid failed to create.
|
13
|
+
# @param [ Hash ] collection_options The options that were used when
|
14
|
+
# tried to create the collection.
|
15
|
+
# @param [ Mongo::Error::OperationFailure ] error The error raised when
|
16
|
+
# tried to create the collection.
|
17
|
+
#
|
18
|
+
# @api private
|
19
|
+
def initialize(collection_name, collection_options, error)
|
20
|
+
super(
|
21
|
+
compose_message(
|
22
|
+
"create_collection_failure",
|
23
|
+
{
|
24
|
+
collection_name: collection_name,
|
25
|
+
collection_options: collection_options,
|
26
|
+
error: "#{error.class}: #{error.message}"
|
27
|
+
}
|
28
|
+
)
|
29
|
+
)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
module Errors
|
5
|
+
|
6
|
+
# Raised when an attempt to drop a collection failed.
|
7
|
+
class DropCollectionFailure < MongoidError
|
8
|
+
|
9
|
+
# Instantiate the drop collection error.
|
10
|
+
#
|
11
|
+
# @param [ String ] collection_name The name of the collection that
|
12
|
+
# Mongoid failed to drop.
|
13
|
+
#
|
14
|
+
# @api private
|
15
|
+
def initialize(collection_name, collection_options, error)
|
16
|
+
super(
|
17
|
+
compose_message(
|
18
|
+
"drop_collection_failure",
|
19
|
+
{
|
20
|
+
collection_name: collection_name
|
21
|
+
}
|
22
|
+
)
|
23
|
+
)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
module Errors
|
5
|
+
|
6
|
+
# This error is raised when attempting the change the value of an
|
7
|
+
# immutable attribute. For example, the _id attribute is immutable,
|
8
|
+
# and attempting to change it on a document that has already been
|
9
|
+
# persisted will result in this error.
|
10
|
+
class ImmutableAttribute < MongoidError
|
11
|
+
|
12
|
+
# Create the new error.
|
13
|
+
#
|
14
|
+
# @example Create the new error.
|
15
|
+
# ImmutableAttribute.new(:_id, "1234")
|
16
|
+
#
|
17
|
+
# @param [ Symbol | String ] name The name of the attribute.
|
18
|
+
# @param [ Object ] value The attempted set value.
|
19
|
+
def initialize(name, value)
|
20
|
+
super(
|
21
|
+
compose_message("immutable_attribute", { name: name, value: value })
|
22
|
+
)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
module Errors
|
5
|
+
|
6
|
+
# This error is raised when a bad async query executor option is attempted
|
7
|
+
# to be set.
|
8
|
+
class InvalidQueryExecutor < MongoidError
|
9
|
+
|
10
|
+
# Create the new error.
|
11
|
+
#
|
12
|
+
# @param [ Symbol | String ] executor The attempted async query executor.
|
13
|
+
#
|
14
|
+
# @api private
|
15
|
+
def initialize(executor)
|
16
|
+
super(
|
17
|
+
compose_message(
|
18
|
+
"invalid_async_query_executor",
|
19
|
+
{ executor: executor, options: [:immediate, :global_thread_pool] }
|
20
|
+
)
|
21
|
+
)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
module Errors
|
5
|
+
|
6
|
+
# This error is raised when a bad global executor concurrency option is attempted
|
7
|
+
# to be set.
|
8
|
+
class InvalidGlobalExecutorConcurrency < MongoidError
|
9
|
+
|
10
|
+
# Create the new error.
|
11
|
+
#
|
12
|
+
# @api private
|
13
|
+
def initialize
|
14
|
+
super(
|
15
|
+
compose_message(
|
16
|
+
"invalid_global_executor_concurrency"
|
17
|
+
)
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/mongoid/errors.rb
CHANGED
@@ -3,11 +3,14 @@
|
|
3
3
|
require "mongoid/errors/mongoid_error"
|
4
4
|
require "mongoid/errors/ambiguous_relationship"
|
5
5
|
require "mongoid/errors/callback"
|
6
|
+
require "mongoid/errors/create_collection_failure"
|
6
7
|
require "mongoid/errors/criteria_argument_required"
|
7
8
|
require "mongoid/errors/document_not_destroyed"
|
8
9
|
require "mongoid/errors/document_not_found"
|
9
10
|
require "mongoid/errors/empty_config_file"
|
11
|
+
require "mongoid/errors/immutable_attribute"
|
10
12
|
require "mongoid/errors/in_memory_collation_not_supported"
|
13
|
+
require "mongoid/errors/invalid_async_query_executor"
|
11
14
|
require "mongoid/errors/invalid_collection"
|
12
15
|
require "mongoid/errors/invalid_config_file"
|
13
16
|
require "mongoid/errors/invalid_config_option"
|
@@ -16,6 +19,7 @@ require "mongoid/errors/invalid_field"
|
|
16
19
|
require "mongoid/errors/invalid_field_option"
|
17
20
|
require "mongoid/errors/invalid_field_type"
|
18
21
|
require "mongoid/errors/invalid_find"
|
22
|
+
require "mongoid/errors/invalid_global_executor_concurrency"
|
19
23
|
require "mongoid/errors/invalid_includes"
|
20
24
|
require "mongoid/errors/invalid_index"
|
21
25
|
require "mongoid/errors/invalid_options"
|
@@ -35,7 +39,6 @@ require "mongoid/errors/invalid_scope"
|
|
35
39
|
require "mongoid/errors/invalid_session_use"
|
36
40
|
require "mongoid/errors/invalid_set_polymorphic_relation"
|
37
41
|
require "mongoid/errors/invalid_storage_options"
|
38
|
-
require "mongoid/errors/invalid_storage_parent"
|
39
42
|
require "mongoid/errors/invalid_time"
|
40
43
|
require "mongoid/errors/inverse_not_found"
|
41
44
|
require "mongoid/errors/mixed_relations"
|
@@ -91,7 +91,7 @@ module Mongoid
|
|
91
91
|
# object.do_or_do_not(:use, "The Force")
|
92
92
|
#
|
93
93
|
# @param [ String | Symbol ] name The method name.
|
94
|
-
# @param [
|
94
|
+
# @param [ Object... ] *args The arguments.
|
95
95
|
#
|
96
96
|
# @return [ Object | nil ] The result of the method call or nil if the
|
97
97
|
# method does not exist.
|
@@ -190,7 +190,7 @@ module Mongoid
|
|
190
190
|
# object.you_must(:use, "The Force")
|
191
191
|
#
|
192
192
|
# @param [ String | Symbol ] name The method name.
|
193
|
-
# @param [
|
193
|
+
# @param [ Object... ] *args The arguments.
|
194
194
|
#
|
195
195
|
# @return [ Object | nil ] The result of the method call or nil if the
|
196
196
|
# method does not exist. Nil if the object is frozen.
|
data/lib/mongoid/factory.rb
CHANGED
@@ -25,27 +25,40 @@ module Mongoid
|
|
25
25
|
#
|
26
26
|
# @return [ Document ] The instantiated document.
|
27
27
|
def build(klass, attributes = nil)
|
28
|
-
|
28
|
+
# A bug in Ruby 2.x (including 2.7.7) causes the attributes hash to be
|
29
|
+
# interpreted as keyword arguments, because execute_build accepts
|
30
|
+
# a keyword argument. Forcing an empty set of keyword arguments works
|
31
|
+
# around the bug. Once Ruby 2.x support is dropped, this hack can be
|
32
|
+
# removed.
|
33
|
+
# See https://bugs.ruby-lang.org/issues/15753
|
34
|
+
execute_build(klass, attributes)
|
29
35
|
end
|
30
36
|
|
31
37
|
# Execute the build.
|
32
38
|
#
|
33
39
|
# @param [ Class ] klass The class to instantiate from if _type is not present.
|
34
40
|
# @param [ Hash ] attributes The document attributes.
|
35
|
-
# @param [
|
36
|
-
#
|
41
|
+
# @param [ Hash ] options The options to use.
|
42
|
+
#
|
43
|
+
# @option options [ true | false ] :execute_callbacks Flag specifies
|
44
|
+
# whether callbacks should be run.
|
45
|
+
#
|
46
|
+
# @note A Ruby 2.x bug prevents the options hash from being keyword
|
47
|
+
# arguments. Once we drop support for Ruby 2.x, we can reimplement
|
48
|
+
# the options hash as keyword arguments.
|
49
|
+
# See https://bugs.ruby-lang.org/issues/15753
|
37
50
|
#
|
38
51
|
# @return [ Document ] The instantiated document.
|
39
52
|
#
|
40
53
|
# @api private
|
41
|
-
def execute_build(klass, attributes = nil,
|
54
|
+
def execute_build(klass, attributes = nil, options = {})
|
42
55
|
attributes ||= {}
|
43
56
|
dvalue = attributes[klass.discriminator_key] || attributes[klass.discriminator_key.to_sym]
|
44
57
|
type = klass.get_discriminator_mapping(dvalue)
|
45
58
|
if type
|
46
|
-
type.construct_document(attributes,
|
59
|
+
type.construct_document(attributes, options)
|
47
60
|
else
|
48
|
-
klass.construct_document(attributes,
|
61
|
+
klass.construct_document(attributes, options)
|
49
62
|
end
|
50
63
|
end
|
51
64
|
|
@@ -76,7 +89,7 @@ module Mongoid
|
|
76
89
|
#
|
77
90
|
# @return [ Document ] The instantiated document.
|
78
91
|
def from_db(klass, attributes = nil, criteria = nil, selected_fields = nil)
|
79
|
-
execute_from_db(klass, attributes, criteria, selected_fields
|
92
|
+
execute_from_db(klass, attributes, criteria, selected_fields)
|
80
93
|
end
|
81
94
|
|
82
95
|
# Execute from_db.
|
@@ -97,7 +110,7 @@ module Mongoid
|
|
97
110
|
# @return [ Document ] The instantiated document.
|
98
111
|
#
|
99
112
|
# @api private
|
100
|
-
def execute_from_db(klass, attributes = nil, criteria = nil, selected_fields = nil, execute_callbacks:
|
113
|
+
def execute_from_db(klass, attributes = nil, criteria = nil, selected_fields = nil, execute_callbacks: Threaded.execute_callbacks?)
|
101
114
|
if criteria
|
102
115
|
selected_fields ||= criteria.options[:fields]
|
103
116
|
end
|
@@ -31,6 +31,16 @@ module Mongoid
|
|
31
31
|
true
|
32
32
|
end
|
33
33
|
|
34
|
+
# Is the localized field enforcing values to be present?
|
35
|
+
#
|
36
|
+
# @example Is the localized field enforcing values to be present?
|
37
|
+
# field.localize_present?
|
38
|
+
#
|
39
|
+
# @return [ true | false ] If the field enforces present.
|
40
|
+
def localize_present?
|
41
|
+
options[:localize] == :present
|
42
|
+
end
|
43
|
+
|
34
44
|
# Convert the provided string into a hash for the locale.
|
35
45
|
#
|
36
46
|
# @example Serialize the value.
|
@@ -97,6 +97,16 @@ module Mongoid
|
|
97
97
|
false
|
98
98
|
end
|
99
99
|
|
100
|
+
# Is the localized field enforcing values to be present?
|
101
|
+
#
|
102
|
+
# @example Is the localized field enforcing values to be present?
|
103
|
+
# field.localize_present?
|
104
|
+
#
|
105
|
+
# @return [ true | false ] If the field enforces present.
|
106
|
+
def localize_present?
|
107
|
+
false
|
108
|
+
end
|
109
|
+
|
100
110
|
# Get the metadata for the field if its a foreign key.
|
101
111
|
#
|
102
112
|
# @example Get the metadata.
|
data/lib/mongoid/fields.rb
CHANGED
@@ -538,6 +538,8 @@ module Mongoid
|
|
538
538
|
# Model.add_defaults(field)
|
539
539
|
#
|
540
540
|
# @param [ Field ] field The field to add for.
|
541
|
+
#
|
542
|
+
# @api private
|
541
543
|
def add_defaults(field)
|
542
544
|
default, name = field.default_val, field.name.to_s
|
543
545
|
remove_defaults(name)
|
@@ -557,6 +559,8 @@ module Mongoid
|
|
557
559
|
#
|
558
560
|
# @param [ Symbol ] name The name of the field.
|
559
561
|
# @param [ Hash ] options The hash of options.
|
562
|
+
#
|
563
|
+
# @api private
|
560
564
|
def add_field(name, options = {})
|
561
565
|
aliased = options[:as]
|
562
566
|
aliased_fields[aliased.to_s] = name if aliased
|
@@ -584,6 +588,8 @@ module Mongoid
|
|
584
588
|
# # => "called"
|
585
589
|
#
|
586
590
|
# @param [ Field ] field the field to process
|
591
|
+
#
|
592
|
+
# @api private
|
587
593
|
def process_options(field)
|
588
594
|
field_options = field.options
|
589
595
|
|
@@ -606,6 +612,8 @@ module Mongoid
|
|
606
612
|
# @param [ Symbol ] name The name of the field.
|
607
613
|
# @param [ Symbol ] meth The name of the accessor.
|
608
614
|
# @param [ Hash ] options The options.
|
615
|
+
#
|
616
|
+
# @api private
|
609
617
|
def create_accessors(name, meth, options = {})
|
610
618
|
field = fields[name]
|
611
619
|
|
@@ -629,6 +637,8 @@ module Mongoid
|
|
629
637
|
# @param [ String ] name The name of the attribute.
|
630
638
|
# @param [ String ] meth The name of the method.
|
631
639
|
# @param [ Field ] field The field.
|
640
|
+
#
|
641
|
+
# @api private
|
632
642
|
def create_field_getter(name, meth, field)
|
633
643
|
generated_methods.module_eval do
|
634
644
|
re_define_method(meth) do
|
@@ -651,6 +661,8 @@ module Mongoid
|
|
651
661
|
#
|
652
662
|
# @param [ String ] name The name of the attribute.
|
653
663
|
# @param [ String ] meth The name of the method.
|
664
|
+
#
|
665
|
+
# @api private
|
654
666
|
def create_field_getter_before_type_cast(name, meth)
|
655
667
|
generated_methods.module_eval do
|
656
668
|
re_define_method("#{meth}_before_type_cast") do
|
@@ -671,6 +683,8 @@ module Mongoid
|
|
671
683
|
# @param [ String ] name The name of the attribute.
|
672
684
|
# @param [ String ] meth The name of the method.
|
673
685
|
# @param [ Field ] field The field.
|
686
|
+
#
|
687
|
+
# @api private
|
674
688
|
def create_field_setter(name, meth, field)
|
675
689
|
generated_methods.module_eval do
|
676
690
|
re_define_method("#{meth}=") do |value|
|
@@ -690,6 +704,8 @@ module Mongoid
|
|
690
704
|
#
|
691
705
|
# @param [ String ] name The name of the attribute.
|
692
706
|
# @param [ String ] meth The name of the method.
|
707
|
+
#
|
708
|
+
# @api private
|
693
709
|
def create_field_check(name, meth)
|
694
710
|
generated_methods.module_eval do
|
695
711
|
re_define_method("#{meth}?") do
|
@@ -706,6 +722,8 @@ module Mongoid
|
|
706
722
|
#
|
707
723
|
# @param [ String ] name The name of the attribute.
|
708
724
|
# @param [ String ] meth The name of the method.
|
725
|
+
#
|
726
|
+
# @api private
|
709
727
|
def create_translations_getter(name, meth)
|
710
728
|
generated_methods.module_eval do
|
711
729
|
re_define_method("#{meth}_translations") do
|
@@ -724,6 +742,8 @@ module Mongoid
|
|
724
742
|
# @param [ String ] name The name of the attribute.
|
725
743
|
# @param [ String ] meth The name of the method.
|
726
744
|
# @param [ Field ] field The field.
|
745
|
+
#
|
746
|
+
# @api private
|
727
747
|
def create_translations_setter(name, meth, field)
|
728
748
|
generated_methods.module_eval do
|
729
749
|
re_define_method("#{meth}_translations=") do |value|
|
@@ -743,6 +763,8 @@ module Mongoid
|
|
743
763
|
# Person.generated_methods
|
744
764
|
#
|
745
765
|
# @return [ Module ] The module of generated methods.
|
766
|
+
#
|
767
|
+
# @api private
|
746
768
|
def generated_methods
|
747
769
|
@generated_methods ||= begin
|
748
770
|
mod = Module.new
|
@@ -757,21 +779,49 @@ module Mongoid
|
|
757
779
|
# Model.remove_defaults(name)
|
758
780
|
#
|
759
781
|
# @param [ String ] name The field name.
|
782
|
+
#
|
783
|
+
# @api private
|
760
784
|
def remove_defaults(name)
|
761
785
|
pre_processed_defaults.delete_one(name)
|
762
786
|
post_processed_defaults.delete_one(name)
|
763
787
|
end
|
764
788
|
|
789
|
+
# Create a field for the given name and options.
|
790
|
+
#
|
791
|
+
# @param [ Symbol ] name The name of the field.
|
792
|
+
# @param [ Hash ] options The hash of options.
|
793
|
+
#
|
794
|
+
# @return [ Field ] The created field.
|
795
|
+
#
|
796
|
+
# @api private
|
765
797
|
def field_for(name, options)
|
766
798
|
opts = options.merge(klass: self)
|
767
|
-
|
768
|
-
|
769
|
-
if
|
770
|
-
|
799
|
+
opts[:type] = retrieve_and_validate_type(name, options[:type])
|
800
|
+
return Fields::Localized.new(name, opts) if options[:localize]
|
801
|
+
return Fields::ForeignKey.new(name, opts) if options[:identity]
|
802
|
+
Fields::Standard.new(name, opts)
|
803
|
+
end
|
804
|
+
|
805
|
+
# Get the class for the given type.
|
806
|
+
#
|
807
|
+
# @param [ Symbol ] name The name of the field.
|
808
|
+
# @param [ Symbol | Class ] type The type of the field.
|
809
|
+
#
|
810
|
+
# @return [ Class ] The type of the field.
|
811
|
+
#
|
812
|
+
# @raises [ Mongoid::Errors::InvalidFieldType ] if given an invalid field
|
813
|
+
# type.
|
814
|
+
#
|
815
|
+
# @api private
|
816
|
+
def retrieve_and_validate_type(name, type)
|
817
|
+
type_mapping = TYPE_MAPPINGS[type]
|
818
|
+
result = type_mapping || unmapped_type(type)
|
819
|
+
if !result.is_a?(Class)
|
820
|
+
raise Errors::InvalidFieldType.new(self, name, type)
|
771
821
|
else
|
772
|
-
if INVALID_BSON_CLASSES.include?(
|
773
|
-
warn_message = "Using #{
|
774
|
-
if
|
822
|
+
if INVALID_BSON_CLASSES.include?(result)
|
823
|
+
warn_message = "Using #{result} as the field type is not supported. "
|
824
|
+
if result == BSON::Decimal128
|
775
825
|
warn_message += "In BSON <= 4, the BSON::Decimal128 type will work as expected for both storing and querying, but will return a BigDecimal on query in BSON 5+."
|
776
826
|
else
|
777
827
|
warn_message += "Saving values of this type to the database will work as expected, however, querying them will return a value of the native Ruby Integer type."
|
@@ -779,16 +829,22 @@ module Mongoid
|
|
779
829
|
Mongoid.logger.warn(warn_message)
|
780
830
|
end
|
781
831
|
end
|
782
|
-
|
783
|
-
return Fields::ForeignKey.new(name, opts) if options[:identity]
|
784
|
-
Fields::Standard.new(name, opts)
|
832
|
+
result
|
785
833
|
end
|
786
834
|
|
787
|
-
|
788
|
-
|
835
|
+
# Returns the type of the field if the type was not in the TYPE_MAPPINGS
|
836
|
+
# hash.
|
837
|
+
#
|
838
|
+
# @param [ Symbol | Class ] type The type of the field.
|
839
|
+
#
|
840
|
+
# @return [ Class ] The type of the field.
|
841
|
+
#
|
842
|
+
# @api private
|
843
|
+
def unmapped_type(type)
|
844
|
+
if "Boolean" == type.to_s
|
789
845
|
Mongoid::Boolean
|
790
846
|
else
|
791
|
-
|
847
|
+
type || Object
|
792
848
|
end
|
793
849
|
end
|
794
850
|
end
|