mongoid 7.2.1 → 9.0.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 +20 -20
- data/LICENSE +1 -1
- data/README.md +7 -12
- data/Rakefile +58 -1
- data/lib/config/locales/en.yml +191 -60
- data/lib/mongoid/association/accessors.rb +67 -53
- data/lib/mongoid/association/bindable.rb +77 -31
- data/lib/mongoid/association/builders.rb +8 -14
- data/lib/mongoid/association/constrainable.rb +2 -5
- data/lib/mongoid/association/depending.rb +20 -12
- data/lib/mongoid/association/eager.rb +160 -0
- data/lib/mongoid/association/eager_loadable.rb +41 -11
- data/lib/mongoid/association/embedded/batchable.rb +63 -52
- data/lib/mongoid/association/embedded/cyclic.rb +4 -12
- data/lib/mongoid/association/embedded/eager.rb +23 -0
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +29 -13
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +3 -5
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +25 -23
- data/lib/mongoid/association/embedded/embedded_in.rb +11 -26
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +4 -9
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +5 -6
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +226 -203
- data/lib/mongoid/association/embedded/embeds_many.rb +3 -33
- data/lib/mongoid/association/embedded/embeds_one/binding.rb +3 -9
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +20 -8
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +131 -42
- data/lib/mongoid/association/embedded/embeds_one.rb +4 -30
- data/lib/mongoid/association/embedded.rb +2 -1
- data/lib/mongoid/association/macros.rb +47 -16
- data/lib/mongoid/association/many.rb +12 -24
- data/lib/mongoid/association/marshalable.rb +4 -5
- data/lib/mongoid/association/nested/many.rb +14 -19
- data/lib/mongoid/association/nested/nested_buildable.rb +36 -13
- data/lib/mongoid/association/nested/one.rb +54 -26
- data/lib/mongoid/association/nested.rb +1 -3
- data/lib/mongoid/association/one.rb +3 -11
- data/lib/mongoid/association/options.rb +18 -44
- data/lib/mongoid/association/proxy.rb +49 -42
- data/lib/mongoid/association/referenced/auto_save.rb +11 -15
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +2 -7
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +6 -6
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +2 -2
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +23 -32
- data/lib/mongoid/association/referenced/belongs_to.rb +13 -37
- data/lib/mongoid/association/referenced/counter_cache.rb +18 -26
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +15 -8
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +1 -3
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +191 -123
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +23 -42
- data/lib/mongoid/association/referenced/has_many/binding.rb +1 -5
- data/lib/mongoid/association/referenced/has_many/buildable.rb +1 -3
- data/lib/mongoid/association/referenced/has_many/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +471 -496
- data/lib/mongoid/association/referenced/has_many/proxy.rb +182 -179
- data/lib/mongoid/association/referenced/has_many.rb +17 -43
- data/lib/mongoid/association/referenced/has_one/binding.rb +1 -7
- data/lib/mongoid/association/referenced/has_one/buildable.rb +5 -5
- data/lib/mongoid/association/referenced/has_one/eager.rb +3 -4
- data/lib/mongoid/association/referenced/has_one/proxy.rb +38 -41
- data/lib/mongoid/association/referenced/has_one.rb +17 -36
- data/lib/mongoid/association/referenced/syncable.rb +11 -27
- data/lib/mongoid/association/referenced.rb +1 -1
- data/lib/mongoid/association/reflections.rb +9 -9
- data/lib/mongoid/association/relatable.rb +55 -74
- data/lib/mongoid/association.rb +10 -22
- data/lib/mongoid/atomic/modifiers.rb +7 -53
- data/lib/mongoid/atomic/paths/embedded/many.rb +20 -5
- data/lib/mongoid/atomic/paths/embedded/one.rb +1 -5
- data/lib/mongoid/atomic/paths/embedded.rb +1 -3
- data/lib/mongoid/atomic/paths/root.rb +1 -5
- data/lib/mongoid/atomic/paths.rb +1 -1
- data/lib/mongoid/atomic.rb +39 -86
- data/lib/mongoid/atomic_update_preparer.rb +88 -0
- data/lib/mongoid/attributes/dynamic.rb +5 -21
- data/lib/mongoid/attributes/embedded.rb +34 -0
- data/lib/mongoid/attributes/nested.rb +9 -13
- data/lib/mongoid/attributes/processing.rb +43 -28
- data/lib/mongoid/attributes/projector.rb +120 -0
- data/lib/mongoid/attributes/readonly.rb +4 -8
- data/lib/mongoid/attributes.rb +85 -89
- data/lib/mongoid/cacheable.rb +5 -9
- data/lib/mongoid/changeable.rb +183 -97
- data/lib/mongoid/clients/factory.rb +58 -15
- data/lib/mongoid/clients/options.rb +117 -8
- data/lib/mongoid/clients/sessions.rb +246 -84
- data/lib/mongoid/clients/storage_options.rb +37 -11
- data/lib/mongoid/clients/validators/storage.rb +4 -24
- data/lib/mongoid/clients/validators.rb +1 -1
- data/lib/mongoid/clients.rb +37 -14
- data/lib/mongoid/collection_configurable.rb +59 -0
- data/lib/mongoid/composable.rb +7 -7
- data/lib/mongoid/config/defaults.rb +40 -0
- data/lib/mongoid/config/encryption.rb +213 -0
- data/lib/mongoid/config/environment.rb +25 -5
- data/lib/mongoid/config/introspection.rb +152 -0
- data/lib/mongoid/config/options.rb +11 -14
- data/lib/mongoid/config/validators/async_query_executor.rb +34 -0
- data/lib/mongoid/config/validators/client.rb +7 -23
- data/lib/mongoid/config/validators/option.rb +1 -3
- data/lib/mongoid/config/validators.rb +2 -1
- data/lib/mongoid/config.rb +183 -46
- data/lib/mongoid/contextual/aggregable/memory.rb +38 -26
- data/lib/mongoid/contextual/aggregable/mongo.rb +26 -32
- data/lib/mongoid/contextual/aggregable/none.rb +66 -0
- data/lib/mongoid/contextual/aggregable.rb +18 -0
- data/lib/mongoid/contextual/atomic.rb +97 -30
- data/lib/mongoid/contextual/command.rb +3 -5
- data/lib/mongoid/contextual/map_reduce.rb +8 -33
- data/lib/mongoid/contextual/memory.rb +396 -89
- data/lib/mongoid/contextual/mongo/documents_loader.rb +178 -0
- data/lib/mongoid/contextual/mongo.rb +640 -311
- data/lib/mongoid/contextual/none.rb +244 -30
- data/lib/mongoid/contextual/queryable.rb +5 -4
- data/lib/mongoid/contextual.rb +18 -7
- data/lib/mongoid/copyable.rb +34 -14
- data/lib/mongoid/criteria/findable.rb +52 -22
- data/lib/mongoid/criteria/includable.rb +31 -34
- data/lib/mongoid/criteria/inspectable.rb +4 -3
- data/lib/mongoid/criteria/marshalable.rb +14 -7
- data/lib/mongoid/criteria/modifiable.rb +5 -19
- data/lib/mongoid/criteria/options.rb +1 -3
- data/lib/mongoid/criteria/permission.rb +6 -2
- data/lib/mongoid/criteria/queryable/aggregable.rb +3 -15
- data/lib/mongoid/criteria/queryable/expandable.rb +1 -25
- data/lib/mongoid/criteria/queryable/extensions/array.rb +6 -41
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -9
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -7
- data/lib/mongoid/criteria/queryable/extensions/date.rb +10 -11
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +8 -7
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -41
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +2 -14
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -21
- data/lib/mongoid/criteria/queryable/extensions/object.rb +7 -30
- data/lib/mongoid/criteria/queryable/extensions/range.rb +48 -17
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +10 -13
- data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -5
- data/lib/mongoid/criteria/queryable/extensions/string.rb +19 -34
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +6 -22
- data/lib/mongoid/criteria/queryable/extensions/time.rb +8 -9
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +9 -9
- data/lib/mongoid/criteria/queryable/extensions.rb +1 -5
- data/lib/mongoid/criteria/queryable/key.rb +15 -18
- data/lib/mongoid/criteria/queryable/macroable.rb +1 -3
- data/lib/mongoid/criteria/queryable/mergeable.rb +69 -50
- data/lib/mongoid/criteria/queryable/optional.rb +12 -62
- data/lib/mongoid/criteria/queryable/options.rb +3 -21
- data/lib/mongoid/criteria/queryable/pipeline.rb +2 -14
- data/lib/mongoid/criteria/queryable/selectable.rb +87 -124
- data/lib/mongoid/criteria/queryable/selector.rb +96 -25
- data/lib/mongoid/criteria/queryable/smash.rb +41 -18
- data/lib/mongoid/criteria/queryable/storable.rb +14 -9
- data/lib/mongoid/criteria/queryable.rb +12 -13
- data/lib/mongoid/criteria/scopable.rb +32 -21
- data/lib/mongoid/criteria/translator.rb +46 -0
- data/lib/mongoid/criteria.rb +60 -109
- data/lib/mongoid/deprecable.rb +38 -0
- data/lib/mongoid/deprecation.rb +29 -0
- data/lib/mongoid/document.rb +263 -173
- data/lib/mongoid/encryptable.rb +53 -0
- data/lib/mongoid/equality.rb +22 -25
- data/lib/mongoid/errors/ambiguous_relationship.rb +3 -5
- data/lib/mongoid/errors/attribute_not_loaded.rb +34 -0
- data/lib/mongoid/errors/callback.rb +1 -3
- data/lib/mongoid/errors/create_collection_failure.rb +34 -0
- data/lib/mongoid/errors/criteria_argument_required.rb +1 -1
- data/lib/mongoid/errors/delete_restriction.rb +9 -12
- data/lib/mongoid/errors/document_not_destroyed.rb +3 -7
- data/lib/mongoid/errors/document_not_found.rb +34 -21
- data/lib/mongoid/errors/drop_collection_failure.rb +28 -0
- data/lib/mongoid/errors/empty_config_file.rb +26 -0
- data/lib/mongoid/errors/immutable_attribute.rb +27 -0
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -3
- data/lib/mongoid/errors/invalid_async_query_executor.rb +26 -0
- data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +33 -0
- data/lib/mongoid/errors/invalid_collection.rb +1 -1
- data/lib/mongoid/errors/invalid_config_file.rb +26 -0
- data/lib/mongoid/errors/invalid_config_option.rb +2 -4
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -4
- data/lib/mongoid/errors/invalid_discriminator_key_target.rb +1 -1
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +24 -0
- data/lib/mongoid/errors/invalid_elem_match_operator.rb +1 -1
- data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +6 -5
- data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +27 -0
- data/lib/mongoid/errors/invalid_expression_operator.rb +1 -1
- data/lib/mongoid/errors/invalid_field.rb +7 -7
- data/lib/mongoid/errors/invalid_field_operator.rb +1 -1
- data/lib/mongoid/errors/invalid_field_option.rb +1 -3
- data/lib/mongoid/errors/invalid_field_type.rb +27 -0
- data/lib/mongoid/errors/invalid_find.rb +1 -3
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +23 -0
- data/lib/mongoid/errors/invalid_includes.rb +1 -3
- data/lib/mongoid/errors/invalid_index.rb +1 -3
- data/lib/mongoid/errors/invalid_options.rb +1 -3
- data/lib/mongoid/errors/invalid_path.rb +1 -3
- data/lib/mongoid/errors/invalid_persistence_option.rb +1 -5
- data/lib/mongoid/errors/invalid_query.rb +1 -1
- data/lib/mongoid/errors/invalid_relation.rb +2 -8
- data/lib/mongoid/errors/invalid_relation_option.rb +2 -4
- data/lib/mongoid/errors/invalid_scope.rb +1 -3
- data/lib/mongoid/errors/invalid_session_nesting.rb +17 -0
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +1 -2
- data/lib/mongoid/errors/invalid_storage_options.rb +2 -4
- data/lib/mongoid/errors/invalid_time.rb +1 -3
- data/lib/mongoid/errors/invalid_transaction_nesting.rb +17 -0
- data/lib/mongoid/errors/inverse_not_found.rb +1 -3
- data/lib/mongoid/errors/mixed_client_configuration.rb +1 -3
- data/lib/mongoid/errors/mixed_relations.rb +1 -3
- data/lib/mongoid/errors/mongoid_error.rb +8 -16
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +2 -4
- data/lib/mongoid/errors/no_client_config.rb +1 -3
- data/lib/mongoid/errors/no_client_database.rb +2 -4
- data/lib/mongoid/errors/no_client_hosts.rb +2 -4
- data/lib/mongoid/errors/no_clients_config.rb +1 -3
- data/lib/mongoid/errors/no_default_client.rb +1 -3
- data/lib/mongoid/errors/no_environment.rb +1 -3
- data/lib/mongoid/errors/no_map_reduce_output.rb +1 -3
- data/lib/mongoid/errors/no_metadata.rb +1 -3
- data/lib/mongoid/errors/no_parent.rb +1 -3
- data/lib/mongoid/errors/readonly_attribute.rb +2 -4
- data/lib/mongoid/errors/readonly_document.rb +2 -6
- data/lib/mongoid/errors/rollback.rb +15 -0
- data/lib/mongoid/errors/scope_overwrite.rb +1 -1
- data/lib/mongoid/errors/sessions_not_supported.rb +17 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -2
- data/lib/mongoid/errors/transaction_error.rb +25 -0
- data/lib/mongoid/errors/transactions_not_supported.rb +17 -0
- data/lib/mongoid/errors/unknown_attribute.rb +2 -4
- data/lib/mongoid/errors/unknown_model.rb +1 -3
- data/lib/mongoid/errors/unsaved_document.rb +2 -2
- data/lib/mongoid/errors/unsupported_javascript.rb +1 -3
- data/lib/mongoid/errors/validations.rb +1 -1
- data/lib/mongoid/errors.rb +18 -5
- data/lib/mongoid/evolvable.rb +2 -4
- data/lib/mongoid/extensions/array.rb +20 -58
- data/lib/mongoid/extensions/big_decimal.rb +44 -24
- data/lib/mongoid/extensions/binary.rb +45 -0
- data/lib/mongoid/extensions/boolean.rb +11 -6
- data/lib/mongoid/extensions/date.rb +31 -29
- data/lib/mongoid/extensions/date_time.rb +5 -16
- data/lib/mongoid/extensions/decimal128.rb +3 -5
- data/lib/mongoid/extensions/false_class.rb +8 -10
- data/lib/mongoid/extensions/float.rb +11 -12
- data/lib/mongoid/extensions/hash.rb +28 -148
- data/lib/mongoid/extensions/integer.rb +13 -14
- data/lib/mongoid/extensions/module.rb +5 -5
- data/lib/mongoid/extensions/nil_class.rb +5 -7
- data/lib/mongoid/extensions/object.rb +32 -81
- data/lib/mongoid/extensions/object_id.rb +3 -7
- data/lib/mongoid/extensions/range.rb +47 -24
- data/lib/mongoid/extensions/raw_value.rb +34 -0
- data/lib/mongoid/extensions/regexp.rb +14 -7
- data/lib/mongoid/extensions/set.rb +24 -13
- data/lib/mongoid/extensions/string.rb +30 -62
- data/lib/mongoid/extensions/symbol.rb +9 -22
- data/lib/mongoid/extensions/time.rb +30 -40
- data/lib/mongoid/extensions/time_with_zone.rb +18 -11
- data/lib/mongoid/extensions/true_class.rb +8 -10
- data/lib/mongoid/extensions.rb +3 -20
- data/lib/mongoid/factory.rb +178 -37
- data/lib/mongoid/fields/encrypted.rb +48 -0
- data/lib/mongoid/fields/foreign_key.rb +39 -27
- data/lib/mongoid/fields/localized.rb +25 -15
- data/lib/mongoid/fields/standard.rb +22 -40
- data/lib/mongoid/fields/validators/macro.rb +6 -19
- data/lib/mongoid/fields/validators.rb +1 -1
- data/lib/mongoid/fields.rb +354 -76
- data/lib/mongoid/findable.rb +62 -22
- data/lib/mongoid/indexable/specification.rb +55 -34
- data/lib/mongoid/indexable/validators/options.rb +7 -9
- data/lib/mongoid/indexable.rb +2 -18
- data/lib/mongoid/inspectable.rb +34 -11
- data/lib/mongoid/interceptable.rb +197 -41
- data/lib/mongoid/loadable.rb +83 -0
- data/lib/mongoid/loggable.rb +1 -9
- data/lib/mongoid/matchable.rb +2 -6
- data/lib/mongoid/matcher/all.rb +15 -0
- data/lib/mongoid/matcher/and.rb +14 -0
- data/lib/mongoid/matcher/bits.rb +60 -0
- data/lib/mongoid/matcher/bits_all_clear.rb +41 -0
- data/lib/mongoid/matcher/bits_all_set.rb +41 -0
- data/lib/mongoid/matcher/bits_any_clear.rb +41 -0
- data/lib/mongoid/matcher/bits_any_set.rb +41 -0
- data/lib/mongoid/matcher/elem_match.rb +17 -1
- data/lib/mongoid/matcher/elem_match_expression.rb +14 -2
- data/lib/mongoid/matcher/eq.rb +15 -0
- data/lib/mongoid/matcher/eq_impl.rb +54 -2
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +18 -1
- data/lib/mongoid/matcher/exists.rb +15 -0
- data/lib/mongoid/matcher/expression.rb +22 -14
- data/lib/mongoid/matcher/expression_operator.rb +14 -0
- data/lib/mongoid/matcher/field_expression.rb +19 -5
- data/lib/mongoid/matcher/field_operator.rb +30 -0
- data/lib/mongoid/matcher/gt.rb +15 -0
- data/lib/mongoid/matcher/gte.rb +15 -0
- data/lib/mongoid/matcher/in.rb +15 -0
- data/lib/mongoid/matcher/lt.rb +15 -0
- data/lib/mongoid/matcher/lte.rb +15 -0
- data/lib/mongoid/matcher/mod.rb +33 -0
- data/lib/mongoid/matcher/ne.rb +15 -0
- data/lib/mongoid/matcher/nin.rb +15 -0
- data/lib/mongoid/matcher/nor.rb +14 -0
- data/lib/mongoid/matcher/not.rb +16 -0
- data/lib/mongoid/matcher/or.rb +14 -0
- data/lib/mongoid/matcher/regex.rb +24 -0
- data/lib/mongoid/matcher/size.rb +16 -0
- data/lib/mongoid/matcher/type.rb +124 -0
- data/lib/mongoid/matcher.rb +59 -52
- data/lib/mongoid/persistable/creatable.rb +25 -29
- data/lib/mongoid/persistable/deletable.rb +10 -23
- data/lib/mongoid/persistable/destroyable.rb +37 -11
- data/lib/mongoid/persistable/incrementable.rb +2 -6
- data/lib/mongoid/persistable/logical.rb +1 -5
- data/lib/mongoid/persistable/maxable.rb +37 -0
- data/lib/mongoid/persistable/minable.rb +37 -0
- data/lib/mongoid/persistable/multipliable.rb +36 -0
- data/lib/mongoid/persistable/poppable.rb +1 -5
- data/lib/mongoid/persistable/pullable.rb +1 -7
- data/lib/mongoid/persistable/pushable.rb +1 -7
- data/lib/mongoid/persistable/renamable.rb +1 -5
- data/lib/mongoid/persistable/savable.rb +14 -8
- data/lib/mongoid/persistable/settable.rb +1 -5
- data/lib/mongoid/persistable/unsettable.rb +3 -7
- data/lib/mongoid/persistable/updatable.rb +114 -28
- data/lib/mongoid/persistable/upsertable.rb +33 -8
- data/lib/mongoid/persistable.rb +17 -27
- data/lib/mongoid/persistence_context.rb +111 -43
- data/lib/mongoid/positional.rb +1 -5
- data/lib/mongoid/railtie.rb +23 -15
- data/lib/mongoid/railties/bson_object_id_serializer.rb +39 -0
- data/lib/mongoid/railties/console_sandbox.rb +42 -0
- data/lib/mongoid/railties/controller_runtime.rb +21 -6
- data/lib/mongoid/railties/database.rake +19 -2
- data/lib/mongoid/reloadable.rb +45 -42
- data/lib/mongoid/scopable.rb +25 -53
- data/lib/mongoid/search_indexable.rb +167 -0
- data/lib/mongoid/selectable.rb +6 -17
- data/lib/mongoid/serializable.rb +11 -21
- data/lib/mongoid/shardable.rb +50 -16
- data/lib/mongoid/stateful.rb +66 -22
- data/lib/mongoid/stringified_symbol.rb +19 -7
- data/lib/mongoid/tasks/database.rake +25 -0
- data/lib/mongoid/tasks/database.rb +84 -8
- data/lib/mongoid/tasks/encryption.rake +59 -0
- data/lib/mongoid/tasks/encryption.rb +108 -0
- data/lib/mongoid/threaded/lifecycle.rb +6 -26
- data/lib/mongoid/threaded.rb +131 -92
- data/lib/mongoid/timestamps/created/short.rb +1 -1
- data/lib/mongoid/timestamps/created.rb +4 -4
- data/lib/mongoid/timestamps/short.rb +1 -1
- data/lib/mongoid/timestamps/timeless.rb +29 -7
- data/lib/mongoid/timestamps/updated/short.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +3 -5
- data/lib/mongoid/timestamps.rb +1 -1
- data/lib/mongoid/touchable.rb +155 -29
- data/lib/mongoid/traversable.rb +180 -125
- data/lib/mongoid/utils.rb +52 -0
- data/lib/mongoid/validatable/associated.rb +97 -21
- data/lib/mongoid/validatable/format.rb +1 -1
- data/lib/mongoid/validatable/length.rb +1 -1
- data/lib/mongoid/validatable/localizable.rb +2 -4
- data/lib/mongoid/validatable/macros.rb +10 -14
- data/lib/mongoid/validatable/presence.rb +7 -13
- data/lib/mongoid/validatable/queryable.rb +9 -3
- data/lib/mongoid/validatable/uniqueness.rb +26 -39
- data/lib/mongoid/validatable.rb +20 -29
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/warnings.rb +37 -0
- data/lib/mongoid.rb +56 -22
- data/lib/rails/generators/mongoid/config/config_generator.rb +25 -5
- data/lib/rails/generators/mongoid/config/templates/mongoid.rb +25 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +44 -64
- data/lib/rails/generators/mongoid/model/model_generator.rb +4 -1
- data/lib/rails/generators/mongoid_generator.rb +13 -1
- data/lib/rails/mongoid.rb +4 -32
- data/spec/config/mongoid.yml +16 -1
- data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
- data/spec/integration/active_job_spec.rb +32 -0
- data/spec/integration/app_spec.rb +180 -89
- data/spec/integration/associations/belongs_to_spec.rb +19 -1
- data/spec/integration/associations/embedded_dirty_spec.rb +58 -0
- data/spec/integration/associations/embedded_spec.rb +90 -7
- data/spec/integration/associations/embeds_many_spec.rb +197 -1
- data/spec/integration/associations/embeds_one_spec.rb +19 -1
- data/spec/integration/associations/foreign_key_spec.rb +10 -1
- data/spec/integration/associations/foreign_key_spec_models.rb +1 -1
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +62 -0
- data/spec/integration/associations/has_many_spec.rb +1 -1
- data/spec/integration/associations/has_one_spec.rb +145 -1
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +1 -1
- data/spec/integration/associations/reverse_population_spec.rb +1 -1
- data/spec/integration/associations/reverse_population_spec_models.rb +1 -1
- data/spec/integration/associations/scope_option_spec.rb +102 -0
- data/spec/integration/atomic/modifiers_spec.rb +1 -1
- data/spec/integration/bson_regexp_raw_spec.rb +1 -1
- data/spec/integration/callbacks_models.rb +147 -3
- data/spec/integration/callbacks_spec.rb +398 -8
- data/spec/integration/contextual/empty_spec.rb +142 -0
- data/spec/integration/criteria/alias_query_spec.rb +98 -0
- data/spec/integration/criteria/date_field_spec.rb +2 -2
- data/spec/integration/criteria/default_scope_spec.rb +52 -0
- data/spec/integration/criteria/logical_spec.rb +12 -0
- data/spec/integration/criteria/range_spec.rb +358 -0
- data/spec/integration/criteria/raw_value_spec.rb +525 -0
- data/spec/integration/criteria/time_with_zone_spec.rb +126 -15
- data/spec/integration/discriminator_key_spec.rb +119 -81
- data/spec/integration/discriminator_value_spec.rb +1 -1
- data/spec/integration/document_spec.rb +31 -1
- data/spec/integration/dots_and_dollars_spec.rb +278 -0
- data/spec/integration/encryption_spec.rb +100 -0
- data/spec/integration/i18n_fallbacks_spec.rb +10 -52
- data/spec/integration/matcher_examples_spec.rb +21 -14
- data/spec/integration/matcher_operator_data/bits_all_clear.yml +144 -0
- data/spec/integration/matcher_operator_data/bits_all_set.yml +144 -0
- data/spec/integration/matcher_operator_data/bits_any_clear.yml +144 -0
- data/spec/integration/matcher_operator_data/bits_any_set.yml +144 -0
- data/spec/integration/matcher_operator_data/comment.yml +22 -0
- data/spec/integration/matcher_operator_data/elem_match.yml +46 -0
- data/spec/integration/matcher_operator_data/implicit_traversal.yml +96 -0
- data/spec/integration/matcher_operator_data/in.yml +16 -0
- data/spec/integration/matcher_operator_data/mod.yml +55 -0
- data/spec/integration/matcher_operator_data/size.yml +0 -3
- data/spec/integration/matcher_operator_data/type.yml +64 -0
- data/spec/integration/matcher_operator_data/type_array.yml +15 -0
- data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
- data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
- data/spec/integration/matcher_operator_data/type_code.yml +26 -0
- data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
- data/spec/integration/matcher_operator_data/type_date.yml +39 -0
- data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
- data/spec/integration/matcher_operator_data/type_decimal.yml +37 -0
- data/spec/integration/matcher_operator_data/type_double.yml +15 -0
- data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
- data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
- data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_null.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
- data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
- data/spec/integration/matcher_operator_data/type_string.yml +15 -0
- data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
- data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
- data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
- data/spec/integration/matcher_operator_spec.rb +26 -3
- data/spec/integration/matcher_spec.rb +50 -1
- data/spec/integration/persistence/range_field_spec.rb +351 -0
- data/spec/integration/server_query_spec.rb +1 -1
- data/spec/integration/shardable_spec.rb +1 -1
- data/spec/integration/stringified_symbol_field_spec.rb +17 -3
- data/spec/lite_spec_helper.rb +47 -14
- data/spec/mongoid/association/accessors_spec.rb +31 -19
- data/spec/mongoid/association/auto_save_spec.rb +73 -34
- data/spec/mongoid/association/builders_spec.rb +2 -2
- data/spec/mongoid/association/constrainable_spec.rb +1 -1
- data/spec/mongoid/association/counter_cache_spec.rb +34 -34
- data/spec/mongoid/association/depending_spec.rb +397 -358
- data/spec/mongoid/association/eager_spec.rb +56 -6
- data/spec/mongoid/association/embedded/cyclic_spec.rb +3 -3
- data/spec/mongoid/association/embedded/dirty_spec.rb +3 -3
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +3 -2
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +55 -1
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +110 -23
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +19 -8
- data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +1 -1
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +113 -1
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +712 -203
- data/spec/mongoid/association/embedded/embeds_many_models.rb +189 -1
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +14 -2
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +69 -1
- data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +1 -1
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +26 -1
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +37 -24
- data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +1 -1
- data/spec/mongoid/association/embedded/embeds_one_models.rb +25 -2
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +2 -2
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +29 -1
- data/spec/mongoid/association/macros_spec.rb +10 -10
- data/spec/mongoid/association/nested/many_spec.rb +1 -1
- data/spec/mongoid/association/nested/one_spec.rb +17 -13
- data/spec/mongoid/association/options_spec.rb +1 -1
- data/spec/mongoid/association/polymorphic_spec.rb +1 -1
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +3 -2
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +110 -17
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +51 -15
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +113 -59
- data/spec/mongoid/association/referenced/belongs_to_models.rb +12 -0
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +22 -2
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +27 -22
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -3
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +32 -3
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +386 -376
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +44 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +57 -3
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +131 -1
- data/spec/mongoid/association/referenced/has_many/eager_spec.rb +24 -7
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +313 -134
- data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +1313 -2109
- data/spec/mongoid/association/referenced/has_many_models.rb +39 -2
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_many_spec.rb +47 -1
- data/spec/mongoid/association/referenced/has_one/binding_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +54 -10
- data/spec/mongoid/association/referenced/has_one/eager_spec.rb +18 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +134 -28
- data/spec/mongoid/association/referenced/has_one_models.rb +43 -1
- data/spec/mongoid/association/referenced/has_one_query_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_one_spec.rb +22 -1
- data/spec/mongoid/association/reflections_spec.rb +1 -1
- data/spec/mongoid/association/syncable_spec.rb +47 -33
- data/spec/mongoid/association_spec.rb +1 -1
- data/spec/mongoid/atomic/modifiers_spec.rb +1 -1
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +1 -1
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +1 -1
- data/spec/mongoid/atomic/paths/root_spec.rb +1 -1
- data/spec/mongoid/atomic/paths_spec.rb +65 -27
- data/spec/mongoid/atomic_spec.rb +29 -7
- data/spec/mongoid/atomic_update_preparer_spec.rb +83 -0
- data/spec/mongoid/attributes/dynamic_spec.rb +1 -1
- data/spec/mongoid/attributes/embedded_spec.rb +118 -0
- data/spec/mongoid/attributes/nested_spec.rb +147 -78
- data/spec/mongoid/attributes/nested_spec_models.rb +49 -0
- data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
- data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
- data/spec/mongoid/attributes/projector_spec.rb +41 -0
- data/spec/mongoid/attributes/readonly_spec.rb +23 -23
- data/spec/mongoid/attributes_spec.rb +921 -69
- data/spec/mongoid/cacheable_spec.rb +5 -5
- data/spec/mongoid/changeable_spec.rb +468 -76
- data/spec/mongoid/clients/factory_spec.rb +152 -30
- data/spec/mongoid/clients/options_spec.rb +24 -12
- data/spec/mongoid/clients/sessions_spec.rb +49 -71
- data/spec/mongoid/clients/transactions_spec.rb +971 -176
- data/spec/mongoid/clients/transactions_spec_models.rb +159 -0
- data/spec/mongoid/clients_spec.rb +230 -22
- data/spec/mongoid/collection_configurable_spec.rb +159 -0
- data/spec/mongoid/composable_spec.rb +1 -1
- data/spec/mongoid/config/defaults_spec.rb +99 -0
- data/spec/mongoid/config/encryption_spec.rb +152 -0
- data/spec/mongoid/config/environment_spec.rb +126 -39
- data/spec/mongoid/config/introspection_spec.rb +114 -0
- data/spec/mongoid/config/options_spec.rb +1 -1
- data/spec/mongoid/config_spec.rb +375 -43
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +432 -154
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +63 -0
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +95 -20
- data/spec/mongoid/contextual/aggregable/none_spec.rb +49 -0
- data/spec/mongoid/contextual/atomic_spec.rb +329 -87
- data/spec/mongoid/contextual/map_reduce_spec.rb +5 -19
- data/spec/mongoid/contextual/memory_spec.rb +1479 -127
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +194 -0
- data/spec/mongoid/contextual/mongo_spec.rb +3374 -1254
- data/spec/mongoid/contextual/none_spec.rb +79 -68
- data/spec/mongoid/copyable_spec.rb +465 -23
- data/spec/mongoid/copyable_spec_models.rb +1 -1
- data/spec/mongoid/criteria/findable_spec.rb +295 -229
- data/spec/mongoid/criteria/includable_spec.rb +1493 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +55 -0
- data/spec/mongoid/criteria/inspectable_spec.rb +1 -1
- data/spec/mongoid/criteria/marshalable_spec.rb +19 -2
- data/spec/mongoid/criteria/modifiable_spec.rb +38 -38
- data/spec/mongoid/criteria/options_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/expandable_spec.rb +1 -74
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +8 -20
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +135 -27
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +32 -12
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +12 -1
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +1 -16
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +74 -8
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +238 -179
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -12
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +1 -12
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +48 -132
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +5 -60
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +12 -1
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +12 -1
- data/spec/mongoid/criteria/queryable/key_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +106 -8
- data/spec/mongoid/criteria/queryable/optional_spec.rb +17 -486
- data/spec/mongoid/criteria/queryable/options_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +700 -26
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +149 -683
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +186 -6
- data/spec/mongoid/criteria/queryable/smash_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/storable_spec.rb +87 -1
- data/spec/mongoid/criteria/scopable_spec.rb +128 -1
- data/spec/mongoid/criteria/translator_spec.rb +133 -0
- data/spec/mongoid/criteria_projection_spec.rb +407 -0
- data/spec/mongoid/criteria_spec.rb +1029 -1806
- data/spec/mongoid/document_fields_spec.rb +180 -5
- data/spec/mongoid/document_persistence_context_spec.rb +77 -1
- data/spec/mongoid/document_query_spec.rb +55 -4
- data/spec/mongoid/document_spec.rb +43 -172
- data/spec/mongoid/equality_spec.rb +7 -8
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +1 -1
- data/spec/mongoid/errors/attribute_not_loaded_spec.rb +32 -0
- data/spec/mongoid/errors/callback_spec.rb +1 -1
- data/spec/mongoid/errors/delete_restriction_spec.rb +2 -2
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +1 -1
- data/spec/mongoid/errors/document_not_found_spec.rb +77 -1
- data/spec/mongoid/errors/invalid_collection_spec.rb +1 -1
- data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +6 -6
- data/spec/mongoid/errors/invalid_config_option_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_option_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_spec.rb +2 -2
- data/spec/mongoid/errors/invalid_field_type_spec.rb +56 -0
- data/spec/mongoid/errors/invalid_find_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_includes_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_index_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_options_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_path_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_relation_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_scope_spec.rb +2 -2
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_time_spec.rb +1 -1
- data/spec/mongoid/errors/inverse_not_found_spec.rb +1 -1
- data/spec/mongoid/errors/mixed_client_configuration_spec.rb +1 -1
- data/spec/mongoid/errors/mixed_relations_spec.rb +1 -1
- data/spec/mongoid/errors/mongoid_error_spec.rb +4 -4
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_config_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_database_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_hosts_spec.rb +1 -1
- data/spec/mongoid/errors/no_clients_config_spec.rb +1 -1
- data/spec/mongoid/errors/no_environment_spec.rb +4 -4
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +1 -1
- data/spec/mongoid/errors/no_metadata_spec.rb +1 -1
- data/spec/mongoid/errors/no_parent_spec.rb +1 -1
- data/spec/mongoid/errors/readonly_attribute_spec.rb +1 -1
- data/spec/mongoid/errors/readonly_document_spec.rb +3 -3
- data/spec/mongoid/errors/scope_overwrite_spec.rb +1 -1
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -2
- data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -3
- data/spec/mongoid/errors/unsaved_document_spec.rb +1 -1
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +1 -1
- data/spec/mongoid/errors/validations_spec.rb +1 -1
- data/spec/mongoid/extensions/array_spec.rb +19 -265
- data/spec/mongoid/extensions/big_decimal_spec.rb +713 -213
- data/spec/mongoid/extensions/binary_spec.rb +45 -10
- data/spec/mongoid/extensions/boolean_spec.rb +69 -83
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +15 -11
- data/spec/mongoid/extensions/date_spec.rb +74 -22
- data/spec/mongoid/extensions/date_time_spec.rb +18 -19
- data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
- data/spec/mongoid/extensions/false_class_spec.rb +2 -9
- data/spec/mongoid/extensions/float_spec.rb +56 -84
- data/spec/mongoid/extensions/hash_spec.rb +45 -219
- data/spec/mongoid/extensions/integer_spec.rb +53 -73
- data/spec/mongoid/extensions/module_spec.rb +1 -1
- data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
- data/spec/mongoid/extensions/object_id_spec.rb +1 -1
- data/spec/mongoid/extensions/object_spec.rb +1 -177
- data/spec/mongoid/extensions/range_spec.rb +254 -64
- data/spec/mongoid/extensions/raw_value_spec.rb +67 -0
- data/spec/mongoid/extensions/regexp_spec.rb +59 -34
- data/spec/mongoid/extensions/set_spec.rb +105 -1
- data/spec/mongoid/extensions/string_spec.rb +21 -104
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +1 -1
- data/spec/mongoid/extensions/symbol_spec.rb +15 -53
- data/spec/mongoid/extensions/time_spec.rb +345 -131
- data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -107
- data/spec/mongoid/extensions/true_class_spec.rb +2 -9
- data/spec/mongoid/factory_spec.rb +63 -2
- data/spec/mongoid/fields/foreign_key_spec.rb +282 -120
- data/spec/mongoid/fields/localized_spec.rb +85 -42
- data/spec/mongoid/fields/standard_spec.rb +1 -1
- data/spec/mongoid/fields_spec.rb +826 -121
- data/spec/mongoid/findable_spec.rb +442 -80
- data/spec/mongoid/indexable/specification_spec.rb +132 -14
- data/spec/mongoid/indexable_spec.rb +361 -23
- data/spec/mongoid/inspectable_spec.rb +93 -5
- data/spec/mongoid/interceptable_spec.rb +926 -116
- data/spec/mongoid/interceptable_spec_models.rb +236 -4
- data/spec/mongoid/loading_spec.rb +110 -0
- data/spec/mongoid/loggable_spec.rb +1 -1
- data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
- data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +68 -88
- data/spec/mongoid/matcher/extract_attribute_spec.rb +5 -15
- data/spec/mongoid/mongoizable_spec.rb +286 -0
- data/spec/mongoid/monkey_patches_spec.rb +211 -0
- data/spec/mongoid/persistable/creatable_spec.rb +5 -5
- data/spec/mongoid/persistable/deletable_spec.rb +267 -27
- data/spec/mongoid/persistable/destroyable_spec.rb +409 -24
- data/spec/mongoid/persistable/incrementable_spec.rb +46 -9
- data/spec/mongoid/persistable/logical_spec.rb +42 -5
- data/spec/mongoid/persistable/maxable_spec.rb +147 -0
- data/spec/mongoid/persistable/minable_spec.rb +147 -0
- data/spec/mongoid/persistable/multipliable_spec.rb +227 -0
- data/spec/mongoid/persistable/poppable_spec.rb +41 -5
- data/spec/mongoid/persistable/pullable_spec.rb +81 -9
- data/spec/mongoid/persistable/pushable_spec.rb +81 -9
- data/spec/mongoid/persistable/renamable_spec.rb +40 -4
- data/spec/mongoid/persistable/savable_spec.rb +114 -20
- data/spec/mongoid/persistable/settable_spec.rb +77 -10
- data/spec/mongoid/persistable/unsettable_spec.rb +41 -5
- data/spec/mongoid/persistable/updatable_spec.rb +64 -52
- data/spec/mongoid/persistable/upsertable_spec.rb +124 -4
- data/spec/mongoid/persistable_spec.rb +4 -4
- data/spec/mongoid/persistence_context_spec.rb +58 -59
- data/spec/mongoid/positional_spec.rb +1 -1
- data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +24 -0
- data/spec/mongoid/railties/console_sandbox_spec.rb +44 -0
- data/spec/mongoid/relations/proxy_spec.rb +7 -7
- data/spec/mongoid/reloadable_spec.rb +255 -30
- data/spec/mongoid/scopable_spec.rb +198 -58
- data/spec/mongoid/search_indexable_spec.rb +147 -0
- data/spec/mongoid/selectable_spec.rb +7 -7
- data/spec/mongoid/serializable_spec.rb +19 -40
- data/spec/mongoid/shardable_models.rb +15 -0
- data/spec/mongoid/shardable_spec.rb +181 -31
- data/spec/mongoid/stateful_spec.rb +152 -10
- data/spec/mongoid/tasks/database_rake_spec.rb +193 -42
- data/spec/mongoid/tasks/database_spec.rb +175 -2
- data/spec/mongoid/tasks/encryption_spec.rb +187 -0
- data/spec/mongoid/threaded_spec.rb +40 -3
- data/spec/mongoid/timestamps/created/short_spec.rb +2 -2
- data/spec/mongoid/timestamps/created_spec.rb +2 -2
- data/spec/mongoid/timestamps/timeless_spec.rb +3 -3
- data/spec/mongoid/timestamps/updated/short_spec.rb +4 -4
- data/spec/mongoid/timestamps/updated_spec.rb +4 -4
- data/spec/mongoid/timestamps_spec.rb +399 -11
- data/spec/mongoid/timestamps_spec_models.rb +68 -0
- data/spec/mongoid/touchable_spec.rb +971 -54
- data/spec/mongoid/touchable_spec_models.rb +154 -0
- data/spec/mongoid/traversable_spec.rb +79 -37
- data/spec/mongoid/validatable/associated_spec.rb +14 -31
- data/spec/mongoid/validatable/format_spec.rb +1 -1
- data/spec/mongoid/validatable/length_spec.rb +1 -1
- data/spec/mongoid/validatable/numericality_spec.rb +1 -1
- data/spec/mongoid/validatable/presence_spec.rb +27 -23
- data/spec/mongoid/validatable/uniqueness_spec.rb +170 -99
- data/spec/mongoid/validatable_spec.rb +4 -4
- data/spec/mongoid/warnings_spec.rb +36 -0
- data/spec/mongoid_spec.rb +61 -11
- data/spec/rails/controller_extension/controller_runtime_spec.rb +3 -3
- data/spec/rails/mongoid_spec.rb +28 -132
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/bin/s3-copy +45 -0
- data/spec/shared/bin/s3-upload +69 -0
- data/spec/shared/lib/mrss/cluster_config.rb +24 -4
- data/spec/shared/lib/mrss/constraints.rb +77 -29
- data/spec/shared/lib/mrss/docker_runner.rb +40 -4
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +64 -1
- data/spec/shared/lib/mrss/server_version_registry.rb +78 -34
- data/spec/shared/lib/mrss/session_registry.rb +69 -0
- data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
- data/spec/shared/lib/mrss/utils.rb +37 -0
- data/spec/shared/share/Dockerfile.erb +123 -71
- data/spec/shared/share/haproxy-1.conf +16 -0
- data/spec/shared/share/haproxy-2.conf +17 -0
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/distro.sh +2 -1
- data/spec/shared/shlib/server.sh +187 -40
- data/spec/shared/shlib/set_env.sh +49 -31
- data/spec/spec_helper.rb +46 -49
- data/spec/support/authorization.rb +1 -1
- data/spec/support/client_registry.rb +10 -0
- data/spec/support/constraints.rb +25 -1
- data/spec/support/crypt/models.rb +50 -0
- data/spec/support/crypt.rb +80 -0
- data/spec/support/expectations.rb +1 -1
- data/spec/support/feature_sandbox.rb +72 -0
- data/spec/support/helpers.rb +1 -0
- data/spec/support/immutable_ids.rb +119 -0
- data/spec/support/macros.rb +107 -1
- data/spec/support/models/account.rb +2 -2
- data/spec/support/models/acolyte.rb +1 -1
- data/spec/support/models/actor.rb +1 -1
- data/spec/support/models/actress.rb +1 -1
- data/spec/support/models/address.rb +7 -1
- data/spec/support/models/address_component.rb +1 -1
- data/spec/support/models/address_number.rb +1 -1
- data/spec/support/models/agency.rb +1 -1
- data/spec/support/models/agent.rb +1 -1
- data/spec/support/models/album.rb +1 -1
- data/spec/support/models/alert.rb +1 -1
- data/spec/support/models/animal.rb +1 -1
- data/spec/support/models/answer.rb +1 -1
- data/spec/support/models/appointment.rb +1 -1
- data/spec/support/models/armrest.rb +1 -1
- data/spec/support/models/array_field.rb +1 -1
- data/spec/support/models/article.rb +1 -1
- data/spec/support/models/artist.rb +3 -2
- data/spec/support/models/artwork.rb +1 -1
- data/spec/support/models/audible_sound.rb +4 -0
- data/spec/support/models/audio.rb +1 -1
- data/spec/support/models/augmentation.rb +13 -1
- data/spec/support/models/author.rb +1 -1
- data/spec/support/models/baby.rb +1 -1
- data/spec/support/models/band.rb +13 -1
- data/spec/support/models/bar.rb +1 -1
- data/spec/support/models/basic.rb +1 -1
- data/spec/support/models/bed.rb +1 -1
- data/spec/support/models/big_palette.rb +1 -1
- data/spec/support/models/birthday.rb +1 -1
- data/spec/support/models/bolt.rb +8 -0
- data/spec/support/models/bomb.rb +1 -1
- data/spec/support/models/book.rb +2 -1
- data/spec/support/models/breed.rb +1 -1
- data/spec/support/models/browser.rb +1 -1
- data/spec/support/models/building.rb +3 -1
- data/spec/support/models/building_address.rb +1 -1
- data/spec/support/models/bus.rb +1 -1
- data/spec/support/models/business.rb +1 -1
- data/spec/support/models/callback_test.rb +1 -1
- data/spec/support/models/canvas.rb +1 -1
- data/spec/support/models/car.rb +1 -1
- data/spec/support/models/cat.rb +1 -1
- data/spec/support/models/catalog.rb +25 -0
- data/spec/support/models/category.rb +1 -1
- data/spec/support/models/child.rb +1 -1
- data/spec/support/models/child_doc.rb +4 -4
- data/spec/support/models/church.rb +1 -1
- data/spec/support/models/circle.rb +1 -1
- data/spec/support/models/circuit.rb +1 -1
- data/spec/support/models/circus.rb +4 -1
- data/spec/support/models/code.rb +3 -1
- data/spec/support/models/coding/pull_request.rb +1 -1
- data/spec/support/models/coding.rb +1 -1
- data/spec/support/models/comment.rb +1 -1
- data/spec/support/models/company.rb +1 -1
- data/spec/support/models/consumption_period.rb +1 -1
- data/spec/support/models/contextable_item.rb +1 -1
- data/spec/support/models/contractor.rb +1 -1
- data/spec/support/models/cookie.rb +1 -1
- data/spec/support/models/country_code.rb +3 -1
- data/spec/support/models/courier_job.rb +1 -1
- data/spec/support/models/cover.rb +11 -0
- data/spec/support/models/crate.rb +1 -1
- data/spec/support/models/customer.rb +1 -1
- data/spec/support/models/customer_address.rb +1 -1
- data/spec/support/models/deed.rb +1 -1
- data/spec/support/models/definition.rb +1 -1
- data/spec/support/models/delegating_patient.rb +1 -1
- data/spec/support/models/description.rb +1 -1
- data/spec/support/models/dictionary.rb +1 -1
- data/spec/support/models/division.rb +1 -1
- data/spec/support/models/doctor.rb +1 -1
- data/spec/support/models/dog.rb +1 -1
- data/spec/support/models/dokument.rb +1 -1
- data/spec/support/models/draft.rb +1 -1
- data/spec/support/models/dragon.rb +1 -1
- data/spec/support/models/driver.rb +1 -1
- data/spec/support/models/drug.rb +1 -1
- data/spec/support/models/dungeon.rb +1 -1
- data/spec/support/models/edit.rb +1 -1
- data/spec/support/models/email.rb +1 -1
- data/spec/support/models/employer.rb +1 -1
- data/spec/support/models/entry.rb +1 -1
- data/spec/support/models/eraser.rb +1 -1
- data/spec/support/models/even.rb +1 -1
- data/spec/support/models/event.rb +1 -1
- data/spec/support/models/exhibition.rb +1 -1
- data/spec/support/models/exhibitor.rb +1 -1
- data/spec/support/models/explosion.rb +1 -1
- data/spec/support/models/eye.rb +1 -1
- data/spec/support/models/eye_bowl.rb +1 -1
- data/spec/support/models/face.rb +1 -1
- data/spec/support/models/fanatic.rb +9 -0
- data/spec/support/models/favorite.rb +8 -2
- data/spec/support/models/filesystem.rb +1 -1
- data/spec/support/models/fire_hydrant.rb +1 -1
- data/spec/support/models/firefox.rb +1 -1
- data/spec/support/models/fish.rb +1 -1
- data/spec/support/models/folder.rb +1 -1
- data/spec/support/models/folder_item.rb +1 -1
- data/spec/support/models/fruits.rb +1 -1
- data/spec/support/models/game.rb +1 -1
- data/spec/support/models/ghost.rb +1 -1
- data/spec/support/models/guitar.rb +1 -1
- data/spec/support/models/hole.rb +13 -0
- data/spec/support/models/home.rb +1 -1
- data/spec/support/models/house.rb +1 -1
- data/spec/support/models/html_writer.rb +1 -1
- data/spec/support/models/id_key.rb +1 -1
- data/spec/support/models/idnodef.rb +1 -1
- data/spec/support/models/image.rb +1 -1
- data/spec/support/models/implant.rb +10 -1
- data/spec/support/models/instrument.rb +1 -1
- data/spec/support/models/item.rb +1 -1
- data/spec/support/models/jar.rb +1 -1
- data/spec/support/models/kaleidoscope.rb +1 -1
- data/spec/support/models/kangaroo.rb +1 -1
- data/spec/support/models/label.rb +5 -2
- data/spec/support/models/language.rb +1 -1
- data/spec/support/models/lat_lng.rb +1 -1
- data/spec/support/models/league.rb +1 -1
- data/spec/support/models/learner.rb +1 -1
- data/spec/support/models/line_item.rb +1 -1
- data/spec/support/models/location.rb +1 -1
- data/spec/support/models/login.rb +1 -1
- data/spec/support/models/manufacturer.rb +1 -1
- data/spec/support/models/meat.rb +1 -1
- data/spec/support/models/membership.rb +2 -1
- data/spec/support/models/message.rb +1 -1
- data/spec/support/models/minim.rb +1 -1
- data/spec/support/models/mixed_drink.rb +1 -1
- data/spec/support/models/mop.rb +10 -1
- data/spec/support/models/movie.rb +1 -1
- data/spec/support/models/my_hash.rb +1 -1
- data/spec/support/models/name.rb +11 -1
- data/spec/support/models/name_only.rb +1 -1
- data/spec/support/models/node.rb +1 -1
- data/spec/support/models/note.rb +1 -1
- data/spec/support/models/nut.rb +8 -0
- data/spec/support/models/odd.rb +1 -1
- data/spec/support/models/order.rb +3 -1
- data/spec/support/models/ordered_post.rb +2 -2
- data/spec/support/models/ordered_preference.rb +1 -1
- data/spec/support/models/oscar.rb +1 -1
- data/spec/support/models/other_owner_object.rb +1 -1
- data/spec/support/models/override.rb +1 -1
- data/spec/support/models/ownable.rb +1 -1
- data/spec/support/models/owner.rb +1 -1
- data/spec/support/models/pack.rb +1 -1
- data/spec/support/models/page.rb +1 -1
- data/spec/support/models/page_question.rb +1 -1
- data/spec/support/models/palette.rb +1 -1
- data/spec/support/models/parent.rb +1 -1
- data/spec/support/models/parent_doc.rb +1 -1
- data/spec/support/models/passport.rb +15 -1
- data/spec/support/models/patient.rb +1 -1
- data/spec/support/models/pdf_writer.rb +1 -1
- data/spec/support/models/pencil.rb +1 -1
- data/spec/support/models/person.rb +19 -1
- data/spec/support/models/pet.rb +1 -1
- data/spec/support/models/pet_owner.rb +1 -1
- data/spec/support/models/phone.rb +3 -2
- data/spec/support/models/piano.rb +1 -1
- data/spec/support/models/pizza.rb +1 -1
- data/spec/support/models/player.rb +3 -1
- data/spec/support/models/post.rb +1 -1
- data/spec/support/models/post_genre.rb +1 -1
- data/spec/support/models/powerup.rb +13 -1
- data/spec/support/models/preference.rb +1 -1
- data/spec/support/models/princess.rb +1 -1
- data/spec/support/models/product.rb +2 -1
- data/spec/support/models/profile.rb +1 -1
- data/spec/support/models/pronunciation.rb +1 -1
- data/spec/support/models/pub.rb +1 -1
- data/spec/support/models/publication/encyclopedia.rb +1 -1
- data/spec/support/models/publication/review.rb +1 -1
- data/spec/support/models/publication.rb +1 -1
- data/spec/support/models/purchase.rb +1 -1
- data/spec/support/models/purchased_item.rb +11 -0
- data/spec/support/models/purse.rb +9 -0
- data/spec/support/models/question.rb +1 -1
- data/spec/support/models/quiz.rb +1 -1
- data/spec/support/models/rating.rb +1 -1
- data/spec/support/models/record.rb +1 -1
- data/spec/support/models/registry.rb +2 -1
- data/spec/support/models/role.rb +1 -1
- data/spec/support/models/root_category.rb +1 -1
- data/spec/support/models/sandbox/app/models/app_models_message.rb +4 -0
- data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
- data/spec/support/models/sandbox/sandbox_message.rb +4 -0
- data/spec/support/models/sandbox/sandbox_user.rb +4 -0
- data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
- data/spec/support/models/sandwich.rb +1 -1
- data/spec/support/models/scheduler.rb +1 -1
- data/spec/support/models/school.rb +15 -0
- data/spec/support/models/scribe.rb +1 -1
- data/spec/support/models/sealer.rb +8 -0
- data/spec/support/models/seat.rb +1 -1
- data/spec/support/models/seo.rb +1 -1
- data/spec/support/models/series.rb +1 -1
- data/spec/support/models/server.rb +1 -1
- data/spec/support/models/service.rb +1 -1
- data/spec/support/models/shape.rb +1 -1
- data/spec/support/models/shelf.rb +1 -1
- data/spec/support/models/shield.rb +19 -0
- data/spec/support/models/shipment_address.rb +1 -1
- data/spec/support/models/shipping_container.rb +1 -1
- data/spec/support/models/shipping_pack.rb +1 -1
- data/spec/support/models/shirt.rb +12 -0
- data/spec/support/models/shop.rb +1 -1
- data/spec/support/models/short_agent.rb +1 -1
- data/spec/support/models/short_quiz.rb +1 -1
- data/spec/support/models/simple.rb +1 -1
- data/spec/support/models/slave.rb +1 -1
- data/spec/support/models/song.rb +1 -1
- data/spec/support/models/sound.rb +1 -1
- data/spec/support/models/spacer.rb +8 -0
- data/spec/support/models/square.rb +1 -1
- data/spec/support/models/staff.rb +1 -1
- data/spec/support/models/store_as_dup_test1.rb +1 -1
- data/spec/support/models/store_as_dup_test2.rb +1 -1
- data/spec/support/models/store_as_dup_test3.rb +1 -1
- data/spec/support/models/store_as_dup_test4.rb +1 -1
- data/spec/support/models/strategy.rb +1 -1
- data/spec/support/models/student.rb +15 -0
- data/spec/support/models/sub_item.rb +1 -1
- data/spec/support/models/subscription.rb +1 -1
- data/spec/support/models/survey.rb +1 -1
- data/spec/support/models/symptom.rb +1 -1
- data/spec/support/models/system_role.rb +1 -0
- data/spec/support/models/tag.rb +1 -1
- data/spec/support/models/target.rb +1 -1
- data/spec/support/models/template.rb +1 -1
- data/spec/support/models/thing.rb +1 -1
- data/spec/support/models/threadlocker.rb +8 -0
- data/spec/support/models/title.rb +1 -1
- data/spec/support/models/tool.rb +1 -1
- data/spec/support/models/topping.rb +1 -1
- data/spec/support/models/toy.rb +1 -1
- data/spec/support/models/track.rb +1 -1
- data/spec/support/models/translation.rb +1 -1
- data/spec/support/models/tree.rb +1 -1
- data/spec/support/models/truck.rb +1 -1
- data/spec/support/models/updatable.rb +1 -1
- data/spec/support/models/user.rb +1 -1
- data/spec/support/models/user_account.rb +1 -1
- data/spec/support/models/validation_callback.rb +1 -1
- data/spec/support/models/vehicle.rb +1 -1
- data/spec/support/models/version.rb +1 -1
- data/spec/support/models/vertex.rb +1 -1
- data/spec/support/models/vet_visit.rb +1 -1
- data/spec/support/models/video.rb +1 -1
- data/spec/support/models/video_game.rb +1 -1
- data/spec/support/models/washer.rb +8 -0
- data/spec/support/models/weapon.rb +13 -1
- data/spec/support/models/wiki_page.rb +1 -1
- data/spec/support/models/word.rb +1 -1
- data/spec/support/models/word_origin.rb +1 -1
- data/spec/support/models/writer.rb +1 -1
- data/spec/support/rails_mock.rb +32 -0
- data/spec/support/schema_maps/schema_map_aws.json +17 -0
- data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_azure.json +17 -0
- data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_gcp.json +17 -0
- data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_kmip.json +17 -0
- data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_local.json +18 -0
- data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/shared/time.rb +3 -22
- data/spec/support/sinatra_mock.rb +7 -0
- data/spec/support/spec_config.rb +42 -7
- data.tar.gz.sig +0 -0
- metadata +883 -562
- metadata.gz.sig +0 -0
- data/lib/mongoid/association/referenced/eager.rb +0 -184
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -128
- data/lib/mongoid/contextual/geo_near.rb +0 -269
- data/lib/mongoid/errors/eager_load.rb +0 -26
- data/lib/mongoid/errors/invalid_session_use.rb +0 -26
- data/lib/mongoid/errors/invalid_storage_parent.rb +0 -28
- data/lib/mongoid/errors/invalid_value.rb +0 -18
- data/lib/mongoid/query_cache.rb +0 -333
- data/lib/support/ruby_version.rb +0 -29
- data/spec/mongoid/contextual/geo_near_spec.rb +0 -472
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -61
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -61
- data/spec/mongoid/extensions_spec.rb +0 -32
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -61
- data/spec/mongoid/query_cache_spec.rb +0 -978
- data/spec/support/cluster_config.rb +0 -158
- data/spec/support/session_registry.rb +0 -50
data/lib/mongoid/fields.rb
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
#
|
|
2
|
+
# rubocop:todo all
|
|
3
3
|
|
|
4
4
|
require "mongoid/fields/standard"
|
|
5
|
+
require "mongoid/fields/encrypted"
|
|
5
6
|
require "mongoid/fields/foreign_key"
|
|
6
7
|
require "mongoid/fields/localized"
|
|
7
8
|
require "mongoid/fields/validators"
|
|
@@ -13,10 +14,9 @@ module Mongoid
|
|
|
13
14
|
extend ActiveSupport::Concern
|
|
14
15
|
|
|
15
16
|
StringifiedSymbol = Mongoid::StringifiedSymbol
|
|
17
|
+
Boolean = Mongoid::Boolean
|
|
16
18
|
|
|
17
19
|
# For fields defined with symbols use the correct class.
|
|
18
|
-
#
|
|
19
|
-
# @since 4.0.0
|
|
20
20
|
TYPE_MAPPINGS = {
|
|
21
21
|
array: Array,
|
|
22
22
|
big_decimal: BigDecimal,
|
|
@@ -37,10 +37,89 @@ module Mongoid
|
|
|
37
37
|
time: Time
|
|
38
38
|
}.with_indifferent_access
|
|
39
39
|
|
|
40
|
-
# Constant for all names of the
|
|
40
|
+
# Constant for all names of the _id field in a document.
|
|
41
|
+
#
|
|
42
|
+
# This does not include aliases of _id field.
|
|
43
|
+
#
|
|
44
|
+
# @api private
|
|
45
|
+
IDS = [ :_id, '_id', ].freeze
|
|
46
|
+
|
|
47
|
+
# BSON classes that are not supported as field types
|
|
41
48
|
#
|
|
42
|
-
# @
|
|
43
|
-
|
|
49
|
+
# @api private
|
|
50
|
+
INVALID_BSON_CLASSES = [ BSON::Decimal128, BSON::Int32, BSON::Int64 ].freeze
|
|
51
|
+
|
|
52
|
+
module ClassMethods
|
|
53
|
+
# Returns the list of id fields for this model class, as both strings
|
|
54
|
+
# and symbols.
|
|
55
|
+
#
|
|
56
|
+
# @return [ Array<Symbol | String> ] List of id fields.
|
|
57
|
+
#
|
|
58
|
+
# @api private
|
|
59
|
+
def id_fields
|
|
60
|
+
IDS.dup.tap do |id_fields|
|
|
61
|
+
aliased_fields.each do |k, v|
|
|
62
|
+
if v == '_id'
|
|
63
|
+
id_fields << k.to_sym
|
|
64
|
+
id_fields << k
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Extracts the id field from the specified attributes hash based on
|
|
71
|
+
# aliases defined in this class.
|
|
72
|
+
#
|
|
73
|
+
# @param [ Hash ] attributes The attributes to inspect.
|
|
74
|
+
#
|
|
75
|
+
# @return [ Object ] The id value.
|
|
76
|
+
#
|
|
77
|
+
# @api private
|
|
78
|
+
def extract_id_field(attributes)
|
|
79
|
+
id_fields.each do |k|
|
|
80
|
+
if v = attributes[k]
|
|
81
|
+
return v
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
nil
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Removes the _translations from the given field name. This is done only
|
|
88
|
+
# when there doesn't already exist a field name or relation with the
|
|
89
|
+
# same name (i.e. with the _translations suffix). This check for an
|
|
90
|
+
# existing field is done recursively
|
|
91
|
+
#
|
|
92
|
+
# @param [ String | Symbol ] name The name of the field to cleanse.
|
|
93
|
+
#
|
|
94
|
+
# @return [ Field ] The field name without _translations
|
|
95
|
+
def cleanse_localized_field_names(name)
|
|
96
|
+
name = database_field_name(name.to_s)
|
|
97
|
+
|
|
98
|
+
klass = self
|
|
99
|
+
[].tap do |res|
|
|
100
|
+
ar = name.split('.')
|
|
101
|
+
ar.each_with_index do |fn, i|
|
|
102
|
+
key = fn
|
|
103
|
+
unless klass.fields.key?(fn) || klass.relations.key?(fn)
|
|
104
|
+
if tr = fn.match(/(.*)_translations\z/)&.captures&.first
|
|
105
|
+
key = tr
|
|
106
|
+
else
|
|
107
|
+
key = fn
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
end
|
|
111
|
+
res.push(key)
|
|
112
|
+
|
|
113
|
+
if klass.fields.key?(fn)
|
|
114
|
+
res.push(ar.drop(i+1).join('.')) unless i == ar.length - 1
|
|
115
|
+
break
|
|
116
|
+
elsif klass.relations.key?(fn)
|
|
117
|
+
klass = klass.relations[key].klass
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end.join('.')
|
|
121
|
+
end
|
|
122
|
+
end
|
|
44
123
|
|
|
45
124
|
included do
|
|
46
125
|
class_attribute :aliased_fields
|
|
@@ -62,8 +141,7 @@ module Mongoid
|
|
|
62
141
|
type: BSON::ObjectId
|
|
63
142
|
)
|
|
64
143
|
|
|
65
|
-
|
|
66
|
-
alias :id= :_id=
|
|
144
|
+
alias_attribute(:id, :_id)
|
|
67
145
|
end
|
|
68
146
|
|
|
69
147
|
# Apply all default values to the document which are not procs.
|
|
@@ -71,9 +149,7 @@ module Mongoid
|
|
|
71
149
|
# @example Apply all the non-proc defaults.
|
|
72
150
|
# model.apply_pre_processed_defaults
|
|
73
151
|
#
|
|
74
|
-
# @return [ Array<String ] The names of the non-proc defaults.
|
|
75
|
-
#
|
|
76
|
-
# @since 2.4.0
|
|
152
|
+
# @return [ Array<String> ] The names of the non-proc defaults.
|
|
77
153
|
def apply_pre_processed_defaults
|
|
78
154
|
pre_processed_defaults.each do |name|
|
|
79
155
|
apply_default(name)
|
|
@@ -85,10 +161,9 @@ module Mongoid
|
|
|
85
161
|
# @example Apply all the proc defaults.
|
|
86
162
|
# model.apply_post_processed_defaults
|
|
87
163
|
#
|
|
88
|
-
# @return [ Array<String ] The names of the proc defaults.
|
|
89
|
-
#
|
|
90
|
-
# @since 2.4.0
|
|
164
|
+
# @return [ Array<String> ] The names of the proc defaults.
|
|
91
165
|
def apply_post_processed_defaults
|
|
166
|
+
pending_callbacks.delete(:apply_post_processed_defaults)
|
|
92
167
|
post_processed_defaults.each do |name|
|
|
93
168
|
apply_default(name)
|
|
94
169
|
end
|
|
@@ -100,8 +175,6 @@ module Mongoid
|
|
|
100
175
|
# model.apply_default("name")
|
|
101
176
|
#
|
|
102
177
|
# @param [ String ] name The name of the field.
|
|
103
|
-
#
|
|
104
|
-
# @since 2.4.0
|
|
105
178
|
def apply_default(name)
|
|
106
179
|
unless attributes.key?(name)
|
|
107
180
|
if field = fields[name]
|
|
@@ -118,9 +191,8 @@ module Mongoid
|
|
|
118
191
|
#
|
|
119
192
|
# @example Apply all the defaults.
|
|
120
193
|
# model.apply_defaults
|
|
121
|
-
#
|
|
122
|
-
# @since 2.4.0
|
|
123
194
|
def apply_defaults
|
|
195
|
+
pending_callbacks.delete(:apply_defaults)
|
|
124
196
|
apply_pre_processed_defaults
|
|
125
197
|
apply_post_processed_defaults
|
|
126
198
|
end
|
|
@@ -131,11 +203,9 @@ module Mongoid
|
|
|
131
203
|
# method to automatically wrap params in JSON requests.
|
|
132
204
|
#
|
|
133
205
|
# @example Get the field names
|
|
134
|
-
#
|
|
206
|
+
# document.attribute_names
|
|
135
207
|
#
|
|
136
208
|
# @return [ Array<String> ] The field names
|
|
137
|
-
#
|
|
138
|
-
# @since 3.0.0
|
|
139
209
|
def attribute_names
|
|
140
210
|
self.class.attribute_names
|
|
141
211
|
end
|
|
@@ -146,11 +216,9 @@ module Mongoid
|
|
|
146
216
|
# @example Get the database field name.
|
|
147
217
|
# model.database_field_name(:authorization)
|
|
148
218
|
#
|
|
149
|
-
# @param [ String
|
|
219
|
+
# @param [ String | Symbol ] name The name to get.
|
|
150
220
|
#
|
|
151
221
|
# @return [ String ] The name of the field as it's stored in the db.
|
|
152
|
-
#
|
|
153
|
-
# @since 3.0.7
|
|
154
222
|
def database_field_name(name)
|
|
155
223
|
self.class.database_field_name(name)
|
|
156
224
|
end
|
|
@@ -163,9 +231,7 @@ module Mongoid
|
|
|
163
231
|
# @param [ Field ] field The field.
|
|
164
232
|
# @param [ Object ] value The current value.
|
|
165
233
|
#
|
|
166
|
-
# @return [ true
|
|
167
|
-
#
|
|
168
|
-
# @since 3.1.0
|
|
234
|
+
# @return [ true | false ] If we set the field lazily.
|
|
169
235
|
def lazy_settable?(field, value)
|
|
170
236
|
!frozen? && value.nil? && field.lazy?
|
|
171
237
|
end
|
|
@@ -177,17 +243,43 @@ module Mongoid
|
|
|
177
243
|
# @example Is the document using object ids?
|
|
178
244
|
# model.using_object_ids?
|
|
179
245
|
#
|
|
180
|
-
# @return [ true
|
|
246
|
+
# @return [ true | false ] Using object ids.
|
|
181
247
|
def using_object_ids?
|
|
182
248
|
self.class.using_object_ids?
|
|
183
249
|
end
|
|
184
250
|
|
|
251
|
+
# Does this field start with a dollar sign ($) or contain a dot/period (.)?
|
|
252
|
+
#
|
|
253
|
+
# @api private
|
|
254
|
+
#
|
|
255
|
+
# @param [ String ] name The field name.
|
|
256
|
+
#
|
|
257
|
+
# @return [ true | false ] If this field is dotted or dollared.
|
|
258
|
+
def dot_dollar_field?(name)
|
|
259
|
+
n = aliased_fields[name] || name
|
|
260
|
+
fields.key?(n) && (n.include?('.') || n.start_with?('$'))
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
# Validate whether or not the field starts with a dollar sign ($) or
|
|
264
|
+
# contains a dot/period (.).
|
|
265
|
+
#
|
|
266
|
+
# @api private
|
|
267
|
+
#
|
|
268
|
+
# @raise [ InvalidDotDollarAssignment ] If contains dots or starts with a dollar.
|
|
269
|
+
#
|
|
270
|
+
# @param [ String ] name The field name.
|
|
271
|
+
def validate_writable_field_name!(name)
|
|
272
|
+
if dot_dollar_field?(name)
|
|
273
|
+
raise Errors::InvalidDotDollarAssignment.new(self.class, name)
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
|
|
185
277
|
class << self
|
|
186
278
|
|
|
187
279
|
# Stores the provided block to be run when the option name specified is
|
|
188
280
|
# defined on a field.
|
|
189
281
|
#
|
|
190
|
-
# No assumptions are made about what
|
|
282
|
+
# No assumptions are made about what functionality the handler might
|
|
191
283
|
# perform, so it will always be called if the `option_name` key is
|
|
192
284
|
# provided in the field definition -- even if it is false or nil.
|
|
193
285
|
#
|
|
@@ -197,10 +289,7 @@ module Mongoid
|
|
|
197
289
|
# end
|
|
198
290
|
#
|
|
199
291
|
# @param [ Symbol ] option_name the option name to match against
|
|
200
|
-
# @param
|
|
201
|
-
# provided.
|
|
202
|
-
#
|
|
203
|
-
# @since 2.1.0
|
|
292
|
+
# @param &block the handler to execute when the option is provided.
|
|
204
293
|
def option(option_name, &block)
|
|
205
294
|
options[option_name] = block
|
|
206
295
|
end
|
|
@@ -212,11 +301,137 @@ module Mongoid
|
|
|
212
301
|
# # => { :required => #<Proc:0x00000100976b38> }
|
|
213
302
|
#
|
|
214
303
|
# @return [ Hash ] the option map
|
|
215
|
-
#
|
|
216
|
-
# @since 2.1.0
|
|
217
304
|
def options
|
|
218
305
|
@options ||= {}
|
|
219
306
|
end
|
|
307
|
+
|
|
308
|
+
# Traverse down the association tree and search for the field for the
|
|
309
|
+
# given key. To do this, split the key by '.' and for each part (meth) of
|
|
310
|
+
# the key:
|
|
311
|
+
#
|
|
312
|
+
# - If the meth is a field, yield the meth, field, and is_field as true.
|
|
313
|
+
# - If the meth is an association, update the klass to the association's
|
|
314
|
+
# klass, and yield the meth, klass, and is_field as false.
|
|
315
|
+
#
|
|
316
|
+
# The next iteration will use klass's fields and associations to continue
|
|
317
|
+
# traversing the tree.
|
|
318
|
+
#
|
|
319
|
+
# @param [ String ] key The key used to search the association tree.
|
|
320
|
+
# @param [ Hash ] fields The fields to begin the search with.
|
|
321
|
+
# @param [ Hash ] associations The associations to begin the search with.
|
|
322
|
+
# @param [ Hash ] aliased_associations The alaised associations to begin
|
|
323
|
+
# the search with.
|
|
324
|
+
# @param &block The block.
|
|
325
|
+
# @yieldparam [ Symbol ] The current method.
|
|
326
|
+
# @yieldparam [ Symbol | String ] The field or the relation.
|
|
327
|
+
# @yieldparam [ true | false ] Whether the second yield parameter is a
|
|
328
|
+
# field or not.
|
|
329
|
+
#
|
|
330
|
+
# @return [ Field ] The field found for the given key at the end of the
|
|
331
|
+
# search. This will return nil if the last thing found is an association
|
|
332
|
+
# or no field was found for the given key.
|
|
333
|
+
#
|
|
334
|
+
# @api private
|
|
335
|
+
def traverse_association_tree(key, fields, associations, aliased_associations)
|
|
336
|
+
klass = nil
|
|
337
|
+
field = nil
|
|
338
|
+
key.split('.').each_with_index do |meth, i|
|
|
339
|
+
fs = i == 0 ? fields : klass&.fields
|
|
340
|
+
rs = i == 0 ? associations : klass&.relations
|
|
341
|
+
as = i == 0 ? aliased_associations : klass&.aliased_associations
|
|
342
|
+
|
|
343
|
+
# Associations can possibly have two "keys", their name and their alias.
|
|
344
|
+
# The fields name is what is used to store it in the klass's relations
|
|
345
|
+
# and field hashes, and the alias is what's used to store that field
|
|
346
|
+
# in the database. The key inputted to this function is the aliased
|
|
347
|
+
# key. We can convert them back to their names by looking in the
|
|
348
|
+
# aliased_associations hash.
|
|
349
|
+
aliased = meth
|
|
350
|
+
if as && a = as.fetch(meth, nil)
|
|
351
|
+
aliased = a.to_s
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
field = nil
|
|
355
|
+
klass = nil
|
|
356
|
+
if fs && f = fs[aliased]
|
|
357
|
+
field = f
|
|
358
|
+
yield(meth, f, true) if block_given?
|
|
359
|
+
elsif rs && rel = rs[aliased]
|
|
360
|
+
klass = rel.klass
|
|
361
|
+
yield(meth, rel, false) if block_given?
|
|
362
|
+
else
|
|
363
|
+
yield(meth, nil, false) if block_given?
|
|
364
|
+
end
|
|
365
|
+
end
|
|
366
|
+
field
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
# Get the name of the provided field as it is stored in the database.
|
|
370
|
+
# Used in determining if the field is aliased or not. Recursively
|
|
371
|
+
# finds aliases for embedded documents and fields, delimited with
|
|
372
|
+
# period "." character.
|
|
373
|
+
#
|
|
374
|
+
# Note that this method returns the name of associations as they're
|
|
375
|
+
# stored in the database, whereas the `relations` hash uses their in-code
|
|
376
|
+
# aliases. In order to check for membership in the relations hash, you
|
|
377
|
+
# would first have to look up the string returned from this method in
|
|
378
|
+
# the aliased_associations hash.
|
|
379
|
+
#
|
|
380
|
+
# This method will not expand the alias of a belongs_to association that
|
|
381
|
+
# is not the last item. For example, if we had a School that has_many
|
|
382
|
+
# Students, and the field name passed was (from the Student's perspective):
|
|
383
|
+
#
|
|
384
|
+
# school._id
|
|
385
|
+
#
|
|
386
|
+
# The alias for a belongs_to association is that association's _id field.
|
|
387
|
+
# Therefore, expanding out this association would yield:
|
|
388
|
+
#
|
|
389
|
+
# school_id._id
|
|
390
|
+
#
|
|
391
|
+
# This is not the correct field name, because the intention here was not
|
|
392
|
+
# to get a property of the _id field. The intention was to get a property
|
|
393
|
+
# of the referenced document. Therefore, if a part of the name passed is
|
|
394
|
+
# a belongs_to association that is not the last part of the name, we
|
|
395
|
+
# won't expand its alias, and return:
|
|
396
|
+
#
|
|
397
|
+
# school._id
|
|
398
|
+
#
|
|
399
|
+
# If the belongs_to association is the last part of the name, we will
|
|
400
|
+
# pass back the _id field.
|
|
401
|
+
#
|
|
402
|
+
# @param [ String | Symbol ] name The name to get.
|
|
403
|
+
# @param [ Hash ] relations The associations.
|
|
404
|
+
# @param [ Hash ] aliased_fields The aliased fields.
|
|
405
|
+
# @param [ Hash ] aliased_associations The aliased associations.
|
|
406
|
+
#
|
|
407
|
+
# @return [ String ] The name of the field as stored in the database.
|
|
408
|
+
#
|
|
409
|
+
# @api private
|
|
410
|
+
def database_field_name(name, relations, aliased_fields, aliased_associations)
|
|
411
|
+
return nil unless name.present?
|
|
412
|
+
key = name.to_s
|
|
413
|
+
segment, remaining = key.split('.', 2)
|
|
414
|
+
|
|
415
|
+
# Don't get the alias for the field when a belongs_to association
|
|
416
|
+
# is not the last item. Therefore, get the alias when one of the
|
|
417
|
+
# following is true:
|
|
418
|
+
# 1. This is the last item, i.e. there is no remaining.
|
|
419
|
+
# 2. It is not an association.
|
|
420
|
+
# 3. It is not a belongs association
|
|
421
|
+
if !remaining || !relations.key?(segment) || !relations[segment].is_a?(Association::Referenced::BelongsTo)
|
|
422
|
+
segment = aliased_fields[segment]&.dup || segment
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
return segment unless remaining
|
|
426
|
+
|
|
427
|
+
relation = relations[aliased_associations[segment] || segment]
|
|
428
|
+
if relation
|
|
429
|
+
k = relation.klass
|
|
430
|
+
"#{segment}.#{database_field_name(remaining, k.relations, k.aliased_fields, k.aliased_associations)}"
|
|
431
|
+
else
|
|
432
|
+
"#{segment}.#{remaining}"
|
|
433
|
+
end
|
|
434
|
+
end
|
|
220
435
|
end
|
|
221
436
|
|
|
222
437
|
module ClassMethods
|
|
@@ -230,8 +445,6 @@ module Mongoid
|
|
|
230
445
|
# Model.attribute_names
|
|
231
446
|
#
|
|
232
447
|
# @return [ Array<String> ] The field names
|
|
233
|
-
#
|
|
234
|
-
# @since 3.0.0
|
|
235
448
|
def attribute_names
|
|
236
449
|
fields.keys
|
|
237
450
|
end
|
|
@@ -239,18 +452,11 @@ module Mongoid
|
|
|
239
452
|
# Get the name of the provided field as it is stored in the database.
|
|
240
453
|
# Used in determining if the field is aliased or not.
|
|
241
454
|
#
|
|
242
|
-
# @
|
|
243
|
-
# Model.database_field_name(:authorization)
|
|
244
|
-
#
|
|
245
|
-
# @param [ String, Symbol ] name The name to get.
|
|
455
|
+
# @param [ String | Symbol ] name The name to get.
|
|
246
456
|
#
|
|
247
457
|
# @return [ String ] The name of the field as it's stored in the db.
|
|
248
|
-
#
|
|
249
|
-
# @since 3.0.7
|
|
250
458
|
def database_field_name(name)
|
|
251
|
-
|
|
252
|
-
normalized = name.to_s
|
|
253
|
-
aliased_fields[normalized] || normalized
|
|
459
|
+
Fields.database_field_name(name, relations, aliased_fields, aliased_associations)
|
|
254
460
|
end
|
|
255
461
|
|
|
256
462
|
# Defines all the fields that are accessible on the Document
|
|
@@ -258,14 +464,14 @@ module Mongoid
|
|
|
258
464
|
# added as an instance method to the Document.
|
|
259
465
|
#
|
|
260
466
|
# @example Define a field.
|
|
261
|
-
# field :score, :
|
|
467
|
+
# field :score, type: Integer, default: 0
|
|
262
468
|
#
|
|
263
469
|
# @param [ Symbol ] name The name of the field.
|
|
264
470
|
# @param [ Hash ] options The options to pass to the field.
|
|
265
471
|
#
|
|
266
|
-
# @option options [ Class ] :type The type of the field.
|
|
472
|
+
# @option options [ Class | Symbol | String ] :type The type of the field.
|
|
267
473
|
# @option options [ String ] :label The label for the field.
|
|
268
|
-
# @option options [ Object
|
|
474
|
+
# @option options [ Object | Proc ] :default The field's default.
|
|
269
475
|
#
|
|
270
476
|
# @return [ Field ] The generated field
|
|
271
477
|
def field(name, options = {})
|
|
@@ -287,8 +493,6 @@ module Mongoid
|
|
|
287
493
|
# @param [ Class ] type The new type of field.
|
|
288
494
|
#
|
|
289
495
|
# @return [ Serializable ] The new field.
|
|
290
|
-
#
|
|
291
|
-
# @since 2.1.0
|
|
292
496
|
def replace_field(name, type)
|
|
293
497
|
remove_defaults(name)
|
|
294
498
|
add_field(name, fields[name].options.merge(type: type))
|
|
@@ -300,13 +504,30 @@ module Mongoid
|
|
|
300
504
|
# @example Does this class use object ids?
|
|
301
505
|
# person.using_object_ids?
|
|
302
506
|
#
|
|
303
|
-
# @return [ true
|
|
304
|
-
#
|
|
305
|
-
# @since 1.0.0
|
|
507
|
+
# @return [ true | false ] If the class uses BSON::ObjectIds for the id.
|
|
306
508
|
def using_object_ids?
|
|
307
509
|
fields["_id"].object_id_field?
|
|
308
510
|
end
|
|
309
511
|
|
|
512
|
+
# Traverse down the association tree and search for the field for the
|
|
513
|
+
# given key.
|
|
514
|
+
#
|
|
515
|
+
# @param [ String ] key The key used to search the association tree.
|
|
516
|
+
# @param &block The block.
|
|
517
|
+
# @yieldparam [ Symbol ] The current method.
|
|
518
|
+
# @yieldparam [ Symbol | String ] The field or the relation.
|
|
519
|
+
# @yieldparam [ true | false ] Whether the second yield parameter is a
|
|
520
|
+
# field or not.
|
|
521
|
+
#
|
|
522
|
+
# @return [ Field ] The field found for the given key at the end of the
|
|
523
|
+
# search. This will return nil if the last thing found is an association
|
|
524
|
+
# or no field was found for the given key.
|
|
525
|
+
#
|
|
526
|
+
# @api private
|
|
527
|
+
def traverse_association_tree(key, &block)
|
|
528
|
+
Fields.traverse_association_tree(key, fields, relations, aliased_associations, &block)
|
|
529
|
+
end
|
|
530
|
+
|
|
310
531
|
protected
|
|
311
532
|
|
|
312
533
|
# Add the defaults to the model. This breaks them up between ones that
|
|
@@ -317,7 +538,7 @@ module Mongoid
|
|
|
317
538
|
#
|
|
318
539
|
# @param [ Field ] field The field to add for.
|
|
319
540
|
#
|
|
320
|
-
# @
|
|
541
|
+
# @api private
|
|
321
542
|
def add_defaults(field)
|
|
322
543
|
default, name = field.default_val, field.name.to_s
|
|
323
544
|
remove_defaults(name)
|
|
@@ -337,6 +558,8 @@ module Mongoid
|
|
|
337
558
|
#
|
|
338
559
|
# @param [ Symbol ] name The name of the field.
|
|
339
560
|
# @param [ Hash ] options The hash of options.
|
|
561
|
+
#
|
|
562
|
+
# @api private
|
|
340
563
|
def add_field(name, options = {})
|
|
341
564
|
aliased = options[:as]
|
|
342
565
|
aliased_fields[aliased.to_s] = name if aliased
|
|
@@ -364,6 +587,8 @@ module Mongoid
|
|
|
364
587
|
# # => "called"
|
|
365
588
|
#
|
|
366
589
|
# @param [ Field ] field the field to process
|
|
590
|
+
#
|
|
591
|
+
# @api private
|
|
367
592
|
def process_options(field)
|
|
368
593
|
field_options = field.options
|
|
369
594
|
|
|
@@ -387,7 +612,7 @@ module Mongoid
|
|
|
387
612
|
# @param [ Symbol ] meth The name of the accessor.
|
|
388
613
|
# @param [ Hash ] options The options.
|
|
389
614
|
#
|
|
390
|
-
# @
|
|
615
|
+
# @api private
|
|
391
616
|
def create_accessors(name, meth, options = {})
|
|
392
617
|
field = fields[name]
|
|
393
618
|
|
|
@@ -412,7 +637,7 @@ module Mongoid
|
|
|
412
637
|
# @param [ String ] meth The name of the method.
|
|
413
638
|
# @param [ Field ] field The field.
|
|
414
639
|
#
|
|
415
|
-
# @
|
|
640
|
+
# @api private
|
|
416
641
|
def create_field_getter(name, meth, field)
|
|
417
642
|
generated_methods.module_eval do
|
|
418
643
|
re_define_method(meth) do
|
|
@@ -420,9 +645,7 @@ module Mongoid
|
|
|
420
645
|
if lazy_settable?(field, raw)
|
|
421
646
|
write_attribute(name, field.eval_default(self))
|
|
422
647
|
else
|
|
423
|
-
|
|
424
|
-
attribute_will_change!(name) if value.resizable?
|
|
425
|
-
value
|
|
648
|
+
process_raw_attribute(name.to_s, raw, field)
|
|
426
649
|
end
|
|
427
650
|
end
|
|
428
651
|
end
|
|
@@ -438,7 +661,7 @@ module Mongoid
|
|
|
438
661
|
# @param [ String ] name The name of the attribute.
|
|
439
662
|
# @param [ String ] meth The name of the method.
|
|
440
663
|
#
|
|
441
|
-
# @
|
|
664
|
+
# @api private
|
|
442
665
|
def create_field_getter_before_type_cast(name, meth)
|
|
443
666
|
generated_methods.module_eval do
|
|
444
667
|
re_define_method("#{meth}_before_type_cast") do
|
|
@@ -460,7 +683,7 @@ module Mongoid
|
|
|
460
683
|
# @param [ String ] meth The name of the method.
|
|
461
684
|
# @param [ Field ] field The field.
|
|
462
685
|
#
|
|
463
|
-
# @
|
|
686
|
+
# @api private
|
|
464
687
|
def create_field_setter(name, meth, field)
|
|
465
688
|
generated_methods.module_eval do
|
|
466
689
|
re_define_method("#{meth}=") do |value|
|
|
@@ -481,7 +704,7 @@ module Mongoid
|
|
|
481
704
|
# @param [ String ] name The name of the attribute.
|
|
482
705
|
# @param [ String ] meth The name of the method.
|
|
483
706
|
#
|
|
484
|
-
# @
|
|
707
|
+
# @api private
|
|
485
708
|
def create_field_check(name, meth)
|
|
486
709
|
generated_methods.module_eval do
|
|
487
710
|
re_define_method("#{meth}?") do
|
|
@@ -499,7 +722,7 @@ module Mongoid
|
|
|
499
722
|
# @param [ String ] name The name of the attribute.
|
|
500
723
|
# @param [ String ] meth The name of the method.
|
|
501
724
|
#
|
|
502
|
-
# @
|
|
725
|
+
# @api private
|
|
503
726
|
def create_translations_getter(name, meth)
|
|
504
727
|
generated_methods.module_eval do
|
|
505
728
|
re_define_method("#{meth}_translations") do
|
|
@@ -519,15 +742,13 @@ module Mongoid
|
|
|
519
742
|
# @param [ String ] meth The name of the method.
|
|
520
743
|
# @param [ Field ] field The field.
|
|
521
744
|
#
|
|
522
|
-
# @
|
|
745
|
+
# @api private
|
|
523
746
|
def create_translations_setter(name, meth, field)
|
|
524
747
|
generated_methods.module_eval do
|
|
525
748
|
re_define_method("#{meth}_translations=") do |value|
|
|
526
749
|
attribute_will_change!(name)
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
field.type.mongoize(_value)
|
|
530
|
-
end
|
|
750
|
+
value&.transform_values! do |_value|
|
|
751
|
+
field.type.mongoize(_value)
|
|
531
752
|
end
|
|
532
753
|
attributes[name] = value
|
|
533
754
|
end
|
|
@@ -542,7 +763,7 @@ module Mongoid
|
|
|
542
763
|
#
|
|
543
764
|
# @return [ Module ] The module of generated methods.
|
|
544
765
|
#
|
|
545
|
-
# @
|
|
766
|
+
# @api private
|
|
546
767
|
def generated_methods
|
|
547
768
|
@generated_methods ||= begin
|
|
548
769
|
mod = Module.new
|
|
@@ -558,28 +779,85 @@ module Mongoid
|
|
|
558
779
|
#
|
|
559
780
|
# @param [ String ] name The field name.
|
|
560
781
|
#
|
|
561
|
-
# @
|
|
782
|
+
# @api private
|
|
562
783
|
def remove_defaults(name)
|
|
563
784
|
pre_processed_defaults.delete_one(name)
|
|
564
785
|
post_processed_defaults.delete_one(name)
|
|
565
786
|
end
|
|
566
787
|
|
|
788
|
+
# Create a field for the given name and options.
|
|
789
|
+
#
|
|
790
|
+
# @param [ Symbol ] name The name of the field.
|
|
791
|
+
# @param [ Hash ] options The hash of options.
|
|
792
|
+
#
|
|
793
|
+
# @return [ Field ] The created field.
|
|
794
|
+
#
|
|
795
|
+
# @api private
|
|
567
796
|
def field_for(name, options)
|
|
568
797
|
opts = options.merge(klass: self)
|
|
569
|
-
|
|
570
|
-
opts[:type] = type_mapping || unmapped_type(options)
|
|
798
|
+
opts[:type] = retrieve_and_validate_type(name, options[:type])
|
|
571
799
|
return Fields::Localized.new(name, opts) if options[:localize]
|
|
572
800
|
return Fields::ForeignKey.new(name, opts) if options[:identity]
|
|
801
|
+
return Fields::Encrypted.new(name, opts) if options[:encrypt]
|
|
573
802
|
Fields::Standard.new(name, opts)
|
|
574
803
|
end
|
|
575
804
|
|
|
576
|
-
|
|
577
|
-
|
|
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
|
+
# @raise [ Mongoid::Errors::InvalidFieldType ] if given an invalid field
|
|
813
|
+
# type.
|
|
814
|
+
#
|
|
815
|
+
# @api private
|
|
816
|
+
def retrieve_and_validate_type(name, type)
|
|
817
|
+
result = TYPE_MAPPINGS[type] || unmapped_type(type)
|
|
818
|
+
raise Errors::InvalidFieldType.new(self, name, type) if !result.is_a?(Class)
|
|
819
|
+
|
|
820
|
+
if unsupported_type?(result)
|
|
821
|
+
warn_message = "Using #{result} as the field type is not supported. "
|
|
822
|
+
if result == BSON::Decimal128
|
|
823
|
+
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+. To use literal BSON::Decimal128 fields with BSON 5, set Mongoid.allow_bson5_decimal128 to true.'
|
|
824
|
+
else
|
|
825
|
+
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.'
|
|
826
|
+
end
|
|
827
|
+
Mongoid.logger.warn(warn_message)
|
|
828
|
+
end
|
|
829
|
+
|
|
830
|
+
result
|
|
831
|
+
end
|
|
832
|
+
|
|
833
|
+
# Returns the type of the field if the type was not in the TYPE_MAPPINGS
|
|
834
|
+
# hash.
|
|
835
|
+
#
|
|
836
|
+
# @param [ Symbol | Class ] type The type of the field.
|
|
837
|
+
#
|
|
838
|
+
# @return [ Class ] The type of the field.
|
|
839
|
+
#
|
|
840
|
+
# @api private
|
|
841
|
+
def unmapped_type(type)
|
|
842
|
+
if "Boolean" == type.to_s
|
|
578
843
|
Mongoid::Boolean
|
|
579
844
|
else
|
|
580
|
-
|
|
845
|
+
type || Object
|
|
581
846
|
end
|
|
582
847
|
end
|
|
848
|
+
|
|
849
|
+
# Queries whether or not the given type is permitted as a declared field
|
|
850
|
+
# type.
|
|
851
|
+
#
|
|
852
|
+
# @param [ Class ] type The type to query
|
|
853
|
+
#
|
|
854
|
+
# @return [ true | false ] whether or not the type is supported
|
|
855
|
+
#
|
|
856
|
+
# @api private
|
|
857
|
+
def unsupported_type?(type)
|
|
858
|
+
return !Mongoid::Config.allow_bson5_decimal128? if type == BSON::Decimal128
|
|
859
|
+
INVALID_BSON_CLASSES.include?(type)
|
|
860
|
+
end
|
|
583
861
|
end
|
|
584
862
|
end
|
|
585
863
|
end
|