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/traversable.rb
CHANGED
|
@@ -1,32 +1,99 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# encoding: utf-8
|
|
3
2
|
|
|
4
|
-
require
|
|
3
|
+
require 'mongoid/fields/validators/macro'
|
|
5
4
|
|
|
6
5
|
module Mongoid
|
|
7
|
-
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
# @since 4.0.0
|
|
6
|
+
# Mixin module included in Mongoid::Document to provide behavior
|
|
7
|
+
# around traversing the document graph.
|
|
11
8
|
module Traversable
|
|
12
9
|
extend ActiveSupport::Concern
|
|
13
10
|
|
|
11
|
+
# Class-level methods for the Traversable behavior.
|
|
12
|
+
module ClassMethods
|
|
13
|
+
# Determines if the document is a subclass of another document.
|
|
14
|
+
#
|
|
15
|
+
# @example Check if the document is a subclass.
|
|
16
|
+
# Square.hereditary?
|
|
17
|
+
#
|
|
18
|
+
# @return [ true | false ] True if hereditary, false if not.
|
|
19
|
+
def hereditary?
|
|
20
|
+
!!(superclass < Mongoid::Document)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# When inheriting, we want to copy the fields from the parent class and
|
|
24
|
+
# set the on the child to start, mimicking the behavior of the old
|
|
25
|
+
# class_inheritable_accessor that was deprecated in Rails edge.
|
|
26
|
+
#
|
|
27
|
+
# @example Inherit from this class.
|
|
28
|
+
# Person.inherited(Doctor)
|
|
29
|
+
#
|
|
30
|
+
# @param [ Class ] subclass The inheriting class.
|
|
31
|
+
#
|
|
32
|
+
# rubocop:disable Metrics/AbcSize
|
|
33
|
+
def inherited(subclass)
|
|
34
|
+
super
|
|
35
|
+
@_type = nil
|
|
36
|
+
subclass.aliased_fields = aliased_fields.dup
|
|
37
|
+
subclass.localized_fields = localized_fields.dup
|
|
38
|
+
subclass.fields = fields.dup
|
|
39
|
+
subclass.pre_processed_defaults = pre_processed_defaults.dup
|
|
40
|
+
subclass.post_processed_defaults = post_processed_defaults.dup
|
|
41
|
+
subclass._declared_scopes = Hash.new { |_hash, key| _declared_scopes[key] }
|
|
42
|
+
subclass.discriminator_value = subclass.name
|
|
43
|
+
|
|
44
|
+
# We need to do this here because the discriminator_value method is
|
|
45
|
+
# overridden in the subclass above.
|
|
46
|
+
subclass.include DiscriminatorRetrieval
|
|
47
|
+
|
|
48
|
+
# We only need the _type field if inheritance is in play, but need to
|
|
49
|
+
# add to the root class as well for backwards compatibility.
|
|
50
|
+
return if fields.key?(discriminator_key)
|
|
51
|
+
|
|
52
|
+
default_proc = -> { self.class.discriminator_value }
|
|
53
|
+
field(discriminator_key, default: default_proc, type: String)
|
|
54
|
+
end
|
|
55
|
+
# rubocop:enable Metrics/AbcSize
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# `_parent` is intentionally not implemented via attr_accessor because
|
|
59
|
+
# of the need to use a double underscore for the instance variable.
|
|
60
|
+
# Associations automatically create backing variables prefixed with a
|
|
61
|
+
# single underscore, which would conflict with this accessor if a model
|
|
62
|
+
# were to declare a `parent` association.
|
|
63
|
+
|
|
64
|
+
# Retrieves the parent document of this document.
|
|
65
|
+
#
|
|
66
|
+
# @return [ Mongoid::Document | nil ] the parent document
|
|
67
|
+
#
|
|
68
|
+
# @api private
|
|
14
69
|
def _parent
|
|
15
|
-
@__parent
|
|
70
|
+
@__parent || nil
|
|
16
71
|
end
|
|
17
72
|
|
|
18
|
-
|
|
19
|
-
|
|
73
|
+
# Sets the parent document of this document.
|
|
74
|
+
#
|
|
75
|
+
# @param [ Mongoid::Document | nil ] document the document to set as
|
|
76
|
+
# the parent document.
|
|
77
|
+
#
|
|
78
|
+
# @returns [ Mongoid::Document ] The parent document.
|
|
79
|
+
#
|
|
80
|
+
# @api private
|
|
81
|
+
def _parent=(document)
|
|
82
|
+
@__parent = document
|
|
20
83
|
end
|
|
21
84
|
|
|
22
85
|
# Module used for prepending to the various discriminator_*= methods
|
|
23
86
|
#
|
|
24
87
|
# @api private
|
|
25
88
|
module DiscriminatorAssignment
|
|
89
|
+
# Sets the discriminator key.
|
|
90
|
+
#
|
|
91
|
+
# @param [ String ] value The discriminator key to set.
|
|
92
|
+
#
|
|
93
|
+
# @api private
|
|
94
|
+
# rubocop:disable Metrics/AbcSize
|
|
26
95
|
def discriminator_key=(value)
|
|
27
|
-
if hereditary?
|
|
28
|
-
raise Errors::InvalidDiscriminatorKeyTarget.new(self, self.superclass)
|
|
29
|
-
end
|
|
96
|
+
raise Errors::InvalidDiscriminatorKeyTarget.new(self, superclass) if hereditary?
|
|
30
97
|
|
|
31
98
|
_mongoid_clear_types
|
|
32
99
|
|
|
@@ -47,14 +114,20 @@ module Mongoid
|
|
|
47
114
|
# an existing field.
|
|
48
115
|
# This condition also checks if the class has any descendants, because
|
|
49
116
|
# if it doesn't then it doesn't need a discriminator key.
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
117
|
+
return unless !fields.key?(discriminator_key) && !descendants.empty?
|
|
118
|
+
|
|
119
|
+
default_proc = -> { self.class.discriminator_value }
|
|
120
|
+
field(discriminator_key, default: default_proc, type: String)
|
|
54
121
|
end
|
|
122
|
+
# rubocop:enable Metrics/AbcSize
|
|
55
123
|
|
|
124
|
+
# Returns the discriminator key.
|
|
125
|
+
#
|
|
126
|
+
# @return [ String ] The discriminator key.
|
|
127
|
+
#
|
|
128
|
+
# @api private
|
|
56
129
|
def discriminator_value=(value)
|
|
57
|
-
value ||=
|
|
130
|
+
value ||= name
|
|
58
131
|
_mongoid_clear_types
|
|
59
132
|
add_discriminator_mapping(value)
|
|
60
133
|
@discriminator_value = value
|
|
@@ -66,14 +139,13 @@ module Mongoid
|
|
|
66
139
|
# A separate module was needed because the subclasses of this class
|
|
67
140
|
# need to be manually prepended with the discriminator_value and can't
|
|
68
141
|
# rely on being a class_attribute because the .discriminator_value
|
|
69
|
-
# method is
|
|
142
|
+
# method is overridden by every subclass in the inherited method.
|
|
70
143
|
#
|
|
71
144
|
# @api private
|
|
72
145
|
module DiscriminatorRetrieval
|
|
73
|
-
|
|
74
146
|
# Get the name on the reading side if the discriminator_value is nil
|
|
75
147
|
def discriminator_value
|
|
76
|
-
@discriminator_value ||
|
|
148
|
+
@discriminator_value || name
|
|
77
149
|
end
|
|
78
150
|
end
|
|
79
151
|
|
|
@@ -98,7 +170,7 @@ module Mongoid
|
|
|
98
170
|
# @param [ Class ] The class the discriminator_value was set on
|
|
99
171
|
#
|
|
100
172
|
# @api private
|
|
101
|
-
def self.add_discriminator_mapping(value, klass=self)
|
|
173
|
+
def self.add_discriminator_mapping(value, klass = self)
|
|
102
174
|
self.discriminator_mapping ||= {}
|
|
103
175
|
self.discriminator_mapping[value] = klass
|
|
104
176
|
superclass.add_discriminator_mapping(value, klass) if hereditary?
|
|
@@ -118,53 +190,96 @@ module Mongoid
|
|
|
118
190
|
end
|
|
119
191
|
end
|
|
120
192
|
|
|
121
|
-
# Get all child +Documents+ to this +Document
|
|
122
|
-
#
|
|
193
|
+
# Get all child +Documents+ to this +Document+
|
|
194
|
+
#
|
|
195
|
+
# @return [ Array<Document> ] All child documents in the hierarchy.
|
|
196
|
+
#
|
|
197
|
+
# @api private
|
|
198
|
+
def _children(reset: false)
|
|
199
|
+
# See discussion above for the `_parent` method, as to why the variable
|
|
200
|
+
# here needs to have two underscores.
|
|
201
|
+
#
|
|
202
|
+
# rubocop:disable Naming/MemoizedInstanceVariableName
|
|
203
|
+
if reset
|
|
204
|
+
@__children = nil
|
|
205
|
+
else
|
|
206
|
+
@__children ||= collect_children
|
|
207
|
+
end
|
|
208
|
+
# rubocop:enable Naming/MemoizedInstanceVariableName
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
# Get all descendant +Documents+ of this +Document+ recursively.
|
|
212
|
+
# This is used when calling update persistence operations from
|
|
123
213
|
# the root document, where changes in the entire tree need to be
|
|
124
214
|
# determined. Note that persistence from the embedded documents will
|
|
125
215
|
# always be preferred, since they are optimized calls... This operation
|
|
126
216
|
# can get expensive in domains with large hierarchies.
|
|
127
217
|
#
|
|
128
|
-
# @
|
|
129
|
-
# person._children
|
|
218
|
+
# @return [ Array<Document> ] All descendant documents in the hierarchy.
|
|
130
219
|
#
|
|
131
|
-
# @
|
|
132
|
-
def
|
|
133
|
-
|
|
220
|
+
# @api private
|
|
221
|
+
def _descendants(reset: false)
|
|
222
|
+
# See discussion above for the `_parent` method, as to why the variable
|
|
223
|
+
# here needs to have two underscores.
|
|
224
|
+
#
|
|
225
|
+
# rubocop:disable Naming/MemoizedInstanceVariableName
|
|
226
|
+
if reset
|
|
227
|
+
@__descendants = nil
|
|
228
|
+
else
|
|
229
|
+
@__descendants ||= collect_descendants
|
|
230
|
+
end
|
|
231
|
+
# rubocop:enable Naming/MemoizedInstanceVariableName
|
|
134
232
|
end
|
|
135
233
|
|
|
136
234
|
# Collect all the children of this document.
|
|
137
235
|
#
|
|
138
|
-
# @example Collect all the children.
|
|
139
|
-
# document.collect_children
|
|
140
|
-
#
|
|
141
236
|
# @return [ Array<Document> ] The children.
|
|
142
237
|
#
|
|
143
|
-
# @
|
|
238
|
+
# @api private
|
|
144
239
|
def collect_children
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
children.concat(doc._children)
|
|
152
|
-
end if child
|
|
240
|
+
[].tap do |children|
|
|
241
|
+
embedded_relations.each_pair do |name, _association|
|
|
242
|
+
without_autobuild do
|
|
243
|
+
child = send(name)
|
|
244
|
+
children.concat(Array.wrap(child)) if child
|
|
245
|
+
end
|
|
153
246
|
end
|
|
154
247
|
end
|
|
155
|
-
children
|
|
156
248
|
end
|
|
157
249
|
|
|
158
|
-
#
|
|
250
|
+
# Collect all the descendants of this document.
|
|
159
251
|
#
|
|
160
|
-
# @
|
|
161
|
-
# document.flag_children_persisted
|
|
252
|
+
# @return [ Array<Document> ] The descendants.
|
|
162
253
|
#
|
|
163
|
-
# @
|
|
254
|
+
# @api private
|
|
255
|
+
def collect_descendants
|
|
256
|
+
children = []
|
|
257
|
+
to_expand = _children
|
|
258
|
+
expanded = {}
|
|
259
|
+
|
|
260
|
+
until to_expand.empty?
|
|
261
|
+
expanding = to_expand
|
|
262
|
+
to_expand = []
|
|
263
|
+
expanding.each do |child|
|
|
264
|
+
next if expanded[child]
|
|
265
|
+
|
|
266
|
+
# Don't mark expanded if _id is nil, since documents are compared by
|
|
267
|
+
# their _ids, multiple embedded documents with nil ids will compare
|
|
268
|
+
# equally, and some documents will not be expanded.
|
|
269
|
+
expanded[child] = true if child._id
|
|
270
|
+
children << child
|
|
271
|
+
to_expand += child._children
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
children
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
# Marks all descendants as being persisted.
|
|
164
279
|
#
|
|
165
|
-
# @
|
|
166
|
-
def
|
|
167
|
-
|
|
280
|
+
# @return [ Array<Document> ] The flagged descendants.
|
|
281
|
+
def flag_descendants_persisted
|
|
282
|
+
_descendants.each do |child|
|
|
168
283
|
child.new_record = false
|
|
169
284
|
end
|
|
170
285
|
end
|
|
@@ -174,7 +289,7 @@ module Mongoid
|
|
|
174
289
|
# @example Check if the document is a subclass
|
|
175
290
|
# Square.new.hereditary?
|
|
176
291
|
#
|
|
177
|
-
# @return [ true
|
|
292
|
+
# @return [ true | false ] True if hereditary, false if not.
|
|
178
293
|
def hereditary?
|
|
179
294
|
self.class.hereditary?
|
|
180
295
|
end
|
|
@@ -201,49 +316,39 @@ module Mongoid
|
|
|
201
316
|
# document.remove_child(child)
|
|
202
317
|
#
|
|
203
318
|
# @param [ Document ] child The child (embedded) document to remove.
|
|
204
|
-
#
|
|
205
|
-
# @since 2.0.0.beta.1
|
|
206
319
|
def remove_child(child)
|
|
207
320
|
name = child.association_name
|
|
208
321
|
if child.embedded_one?
|
|
322
|
+
attributes.delete(child._association.store_as)
|
|
209
323
|
remove_ivar(name)
|
|
210
324
|
else
|
|
211
325
|
relation = send(name)
|
|
212
|
-
relation.
|
|
326
|
+
relation._remove(child)
|
|
213
327
|
end
|
|
214
328
|
end
|
|
215
329
|
|
|
216
|
-
# After
|
|
217
|
-
# and flag them as persisted in one call.
|
|
218
|
-
#
|
|
219
|
-
# @example Reset the children.
|
|
220
|
-
# document.reset_persisted_children
|
|
330
|
+
# After descendants are persisted we can call this to move all their
|
|
331
|
+
# changes and flag them as persisted in one call.
|
|
221
332
|
#
|
|
222
|
-
# @return [ Array<Document> ] The
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
def reset_persisted_children
|
|
226
|
-
_children.each do |child|
|
|
333
|
+
# @return [ Array<Document> ] The descendants.
|
|
334
|
+
def reset_persisted_descendants
|
|
335
|
+
_descendants.each do |child|
|
|
227
336
|
child.move_changes
|
|
228
337
|
child.new_record = false
|
|
229
338
|
end
|
|
230
|
-
|
|
339
|
+
_reset_memoized_descendants!
|
|
231
340
|
end
|
|
232
341
|
|
|
233
|
-
# Resets the memoized
|
|
342
|
+
# Resets the memoized descendants on the object. Called internally when an
|
|
234
343
|
# embedded array changes size.
|
|
235
344
|
#
|
|
236
|
-
# @api semiprivate
|
|
237
|
-
#
|
|
238
|
-
# @example Reset the memoized children.
|
|
239
|
-
# document._reset_memoized_children!
|
|
240
|
-
#
|
|
241
345
|
# @return [ nil ] nil.
|
|
242
346
|
#
|
|
243
|
-
# @
|
|
244
|
-
def
|
|
245
|
-
_parent
|
|
246
|
-
|
|
347
|
+
# @api private
|
|
348
|
+
def _reset_memoized_descendants!
|
|
349
|
+
_parent&._reset_memoized_descendants!
|
|
350
|
+
_children reset: true
|
|
351
|
+
_descendants reset: true
|
|
247
352
|
end
|
|
248
353
|
|
|
249
354
|
# Return the root document in the object graph. If the current document
|
|
@@ -255,7 +360,7 @@ module Mongoid
|
|
|
255
360
|
# @return [ Document ] The root document in the hierarchy.
|
|
256
361
|
def _root
|
|
257
362
|
object = self
|
|
258
|
-
|
|
363
|
+
object = object._parent while object._parent
|
|
259
364
|
object
|
|
260
365
|
end
|
|
261
366
|
|
|
@@ -264,59 +369,9 @@ module Mongoid
|
|
|
264
369
|
# @example Is the document the root?
|
|
265
370
|
# document._root?
|
|
266
371
|
#
|
|
267
|
-
# @return [ true
|
|
268
|
-
#
|
|
269
|
-
# @since 3.1.0
|
|
372
|
+
# @return [ true | false ] If the document is the root.
|
|
270
373
|
def _root?
|
|
271
374
|
_parent ? false : true
|
|
272
375
|
end
|
|
273
|
-
|
|
274
|
-
module ClassMethods
|
|
275
|
-
|
|
276
|
-
# Determines if the document is a subclass of another document.
|
|
277
|
-
#
|
|
278
|
-
# @example Check if the document is a subclass.
|
|
279
|
-
# Square.hereditary?
|
|
280
|
-
#
|
|
281
|
-
# @return [ true, false ] True if hereditary, false if not.
|
|
282
|
-
def hereditary?
|
|
283
|
-
!!(Mongoid::Document > superclass)
|
|
284
|
-
end
|
|
285
|
-
|
|
286
|
-
# When inheriting, we want to copy the fields from the parent class and
|
|
287
|
-
# set the on the child to start, mimicking the behavior of the old
|
|
288
|
-
# class_inheritable_accessor that was deprecated in Rails edge.
|
|
289
|
-
#
|
|
290
|
-
# @example Inherit from this class.
|
|
291
|
-
# Person.inherited(Doctor)
|
|
292
|
-
#
|
|
293
|
-
# @param [ Class ] subclass The inheriting class.
|
|
294
|
-
#
|
|
295
|
-
# @since 2.0.0.rc.6
|
|
296
|
-
def inherited(subclass)
|
|
297
|
-
super
|
|
298
|
-
@_type = nil
|
|
299
|
-
subclass.aliased_fields = aliased_fields.dup
|
|
300
|
-
subclass.localized_fields = localized_fields.dup
|
|
301
|
-
subclass.fields = fields.dup
|
|
302
|
-
subclass.pre_processed_defaults = pre_processed_defaults.dup
|
|
303
|
-
subclass.post_processed_defaults = post_processed_defaults.dup
|
|
304
|
-
subclass._declared_scopes = Hash.new { |hash,key| self._declared_scopes[key] }
|
|
305
|
-
subclass.discriminator_value = subclass.name
|
|
306
|
-
|
|
307
|
-
# We need to do this here because the discriminator_value method is
|
|
308
|
-
# overriden in the subclass above.
|
|
309
|
-
class << subclass
|
|
310
|
-
include DiscriminatorRetrieval
|
|
311
|
-
end
|
|
312
|
-
|
|
313
|
-
# We only need the _type field if inheritance is in play, but need to
|
|
314
|
-
# add to the root class as well for backwards compatibility.
|
|
315
|
-
unless fields.has_key?(self.discriminator_key)
|
|
316
|
-
default_proc = lambda { self.class.discriminator_value }
|
|
317
|
-
field(self.discriminator_key, default: default_proc, type: String)
|
|
318
|
-
end
|
|
319
|
-
end
|
|
320
|
-
end
|
|
321
376
|
end
|
|
322
377
|
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Mongoid
|
|
4
|
+
# Utility functions for Mongoid.
|
|
5
|
+
#
|
|
6
|
+
# @api private
|
|
7
|
+
module Utils
|
|
8
|
+
extend self
|
|
9
|
+
|
|
10
|
+
# A unique placeholder value that will never accidentally collide with
|
|
11
|
+
# valid values. This is useful as a default keyword argument value when
|
|
12
|
+
# you want the argument to be optional, but you also want to be able to
|
|
13
|
+
# recognize that the caller did not provide a value for it.
|
|
14
|
+
PLACEHOLDER = Object.new.freeze
|
|
15
|
+
|
|
16
|
+
# Asks if the given value is a placeholder or not.
|
|
17
|
+
#
|
|
18
|
+
# @param [ Object ] value the value to compare
|
|
19
|
+
#
|
|
20
|
+
# @return [ true | false ] if the value is a placeholder or not.
|
|
21
|
+
def placeholder?(value)
|
|
22
|
+
value == PLACEHOLDER
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# This function should be used if you need to measure time.
|
|
26
|
+
# @example Calculate elapsed time.
|
|
27
|
+
# starting = Utils.monotonic_time
|
|
28
|
+
# # do something time consuming
|
|
29
|
+
# ending = Utils.monotonic_time
|
|
30
|
+
# puts "It took #{(ending - starting).to_i} seconds"
|
|
31
|
+
#
|
|
32
|
+
# @see https://blog.dnsimple.com/2018/03/elapsed-time-with-ruby-the-right-way/
|
|
33
|
+
#
|
|
34
|
+
# @return [Float] seconds according to monotonic clock
|
|
35
|
+
#
|
|
36
|
+
# @api private
|
|
37
|
+
def monotonic_time
|
|
38
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Returns true if the string is any of the following values: "1",
|
|
42
|
+
# "yes", "true", "on". Anything else is assumed to be false. Case is
|
|
43
|
+
# ignored, as are leading or trailing spaces.
|
|
44
|
+
#
|
|
45
|
+
# @param [ String ] string the string value to consider
|
|
46
|
+
#
|
|
47
|
+
# @return [ true | false ]
|
|
48
|
+
def truthy_string?(string)
|
|
49
|
+
%w[ 1 yes true on ].include?(string.strip.downcase)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
#
|
|
2
|
+
# rubocop:todo all
|
|
3
3
|
|
|
4
4
|
module Mongoid
|
|
5
5
|
module Validatable
|
|
@@ -16,34 +16,110 @@ module Mongoid
|
|
|
16
16
|
#
|
|
17
17
|
# validates_associated :name, :addresses
|
|
18
18
|
# end
|
|
19
|
-
class AssociatedValidator < ActiveModel::
|
|
19
|
+
class AssociatedValidator < ActiveModel::Validator
|
|
20
|
+
# Required by `validates_with` so that the validator
|
|
21
|
+
# gets added to the correct attributes.
|
|
22
|
+
def attributes
|
|
23
|
+
options[:attributes]
|
|
24
|
+
end
|
|
20
25
|
|
|
21
|
-
#
|
|
22
|
-
# valid.
|
|
23
|
-
# the
|
|
26
|
+
# Checks that the named associations of the given record
|
|
27
|
+
# (`attributes`) are valid. This does NOT load the associations
|
|
28
|
+
# from the database, and will only validate records that are dirty
|
|
29
|
+
# or unpersisted.
|
|
24
30
|
#
|
|
25
|
-
#
|
|
26
|
-
#
|
|
31
|
+
# If anything is not valid, appropriate errors will be added to
|
|
32
|
+
# the `document` parameter.
|
|
33
|
+
#
|
|
34
|
+
# @param [ Mongoid::Document ] document the document with the
|
|
35
|
+
# associations to validate.
|
|
36
|
+
def validate(document)
|
|
37
|
+
options[:attributes].each do |attr_name|
|
|
38
|
+
validate_association(document, attr_name)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
# Validates that the given association provided is either nil,
|
|
45
|
+
# persisted and unchanged, or invalid. Otherwise, the appropriate errors
|
|
46
|
+
# will be added to the parent document.
|
|
27
47
|
#
|
|
28
48
|
# @param [ Document ] document The document to validate.
|
|
29
49
|
# @param [ Symbol ] attribute The association to validate.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
50
|
+
def validate_association(document, attribute)
|
|
51
|
+
# grab the proxy from the instance variable directly; we don't want
|
|
52
|
+
# any loading logic to run; we just want to see if it's already
|
|
53
|
+
# been loaded.
|
|
54
|
+
proxy = document.ivar(attribute)
|
|
55
|
+
return unless proxy
|
|
56
|
+
|
|
57
|
+
# if the variable exists, now we see if it is a proxy, or an actual
|
|
58
|
+
# document. It might be a literal document instead of a proxy if this
|
|
59
|
+
# document was created with a Document instance as a provided attribute,
|
|
60
|
+
# e.g. "Post.new(message: Message.new)".
|
|
61
|
+
target = proxy.respond_to?(:_target) ? proxy._target : proxy
|
|
62
|
+
|
|
63
|
+
# Now, fetch the list of documents from the target. Target may be a
|
|
64
|
+
# single value, or a list of values, and in the case of HasMany,
|
|
65
|
+
# might be a rather complex collection. We need to do this without
|
|
66
|
+
# triggering a load, so it's a bit of a delicate dance.
|
|
67
|
+
list = get_target_documents(target)
|
|
68
|
+
|
|
69
|
+
valid = document.validating do
|
|
70
|
+
# Now, treating the target as an array, look at each element
|
|
71
|
+
# and see if it is valid, but only if it has already been
|
|
72
|
+
# persisted, or changed, and hasn't been flagged for destroy.
|
|
73
|
+
list.all? do |value|
|
|
74
|
+
if value && !value.flagged_for_destroy? && (!value.persisted? || value.changed?)
|
|
75
|
+
value.validated? ? true : value.valid?
|
|
39
76
|
else
|
|
40
|
-
|
|
77
|
+
true
|
|
41
78
|
end
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
document.errors.add(attribute, :invalid) unless valid
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
private
|
|
86
|
+
|
|
87
|
+
# Examine the given target object and return an array of
|
|
88
|
+
# documents (possibly empty) that the target represents.
|
|
89
|
+
#
|
|
90
|
+
# @param [ Array | Mongoid::Document | Mongoid::Association::Proxy | HasMany::Enumerable ] target
|
|
91
|
+
# the target object to examine.
|
|
92
|
+
#
|
|
93
|
+
# @return [ Array<Mongoid::Document> ] the list of documents
|
|
94
|
+
def get_target_documents(target)
|
|
95
|
+
if target.respond_to?(:_loaded?)
|
|
96
|
+
get_target_documents_for_has_many(target)
|
|
97
|
+
else
|
|
98
|
+
get_target_documents_for_other(target)
|
|
45
99
|
end
|
|
46
|
-
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Returns the list of all currently in-memory values held by
|
|
103
|
+
# the target. The target will not be loaded.
|
|
104
|
+
#
|
|
105
|
+
# @param [ HasMany::Enumerable ] target the target that will
|
|
106
|
+
# be examined for in-memory documents.
|
|
107
|
+
#
|
|
108
|
+
# @return [ Array<Mongoid::Document> ] the in-memory documents
|
|
109
|
+
# held by the target.
|
|
110
|
+
def get_target_documents_for_has_many(target)
|
|
111
|
+
[ *target._loaded.values, *target._added.values ]
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Returns the target as an array. If the target represents a single
|
|
115
|
+
# value, it is wrapped in an array.
|
|
116
|
+
#
|
|
117
|
+
# @param [ Array | Mongoid::Document | Mongoid::Association::Proxy ] target
|
|
118
|
+
# the target to return.
|
|
119
|
+
#
|
|
120
|
+
# @return [ Array<Mongoid::Document> ] the target, as an array.
|
|
121
|
+
def get_target_documents_for_other(target)
|
|
122
|
+
Array.wrap(target)
|
|
47
123
|
end
|
|
48
124
|
end
|
|
49
125
|
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
#
|
|
2
|
+
# rubocop:todo all
|
|
3
3
|
|
|
4
4
|
module Mongoid
|
|
5
5
|
module Validatable
|
|
@@ -13,10 +13,8 @@ module Mongoid
|
|
|
13
13
|
# validator.validate_each(model, :name, "value")
|
|
14
14
|
#
|
|
15
15
|
# @param [ Document ] document The document.
|
|
16
|
-
# @param [ Symbol
|
|
16
|
+
# @param [ Symbol | String ] attribute The attribute to validate.
|
|
17
17
|
# @param [ Object ] value The attribute value.
|
|
18
|
-
#
|
|
19
|
-
# @since 2.4.2
|
|
20
18
|
def validate_each(document, attribute, value)
|
|
21
19
|
field = document.fields[document.database_field_name(attribute)]
|
|
22
20
|
if field.try(:localized?) && !value.blank?
|