mongoid 7.5.4 → 8.1.7
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
- data/CHANGELOG.md +3 -3
- data/README.md +6 -6
- data/Rakefile +44 -46
- data/lib/config/locales/en.yml +92 -43
- data/lib/mongoid/association/accessors.rb +44 -11
- data/lib/mongoid/association/bindable.rb +50 -2
- data/lib/mongoid/association/builders.rb +5 -3
- data/lib/mongoid/association/constrainable.rb +0 -1
- data/lib/mongoid/association/eager_loadable.rb +29 -7
- data/lib/mongoid/association/embedded/batchable.rb +34 -11
- data/lib/mongoid/association/embedded/cyclic.rb +1 -1
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
- data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +85 -46
- data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
- data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
- data/lib/mongoid/association/macros.rb +8 -1
- data/lib/mongoid/association/many.rb +11 -7
- data/lib/mongoid/association/nested/many.rb +5 -4
- data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
- data/lib/mongoid/association/nested/one.rb +45 -7
- data/lib/mongoid/association/one.rb +2 -2
- data/lib/mongoid/association/options.rb +9 -9
- data/lib/mongoid/association/proxy.rb +15 -4
- data/lib/mongoid/association/referenced/auto_save.rb +4 -3
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
- data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
- data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
- data/lib/mongoid/association/referenced/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
- data/lib/mongoid/association/referenced/has_many/proxy.rb +40 -21
- data/lib/mongoid/association/referenced/has_many.rb +3 -3
- data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
- data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
- data/lib/mongoid/association/referenced/has_one.rb +3 -3
- data/lib/mongoid/association/referenced/syncable.rb +4 -4
- data/lib/mongoid/association/reflections.rb +4 -4
- data/lib/mongoid/association/relatable.rb +44 -10
- data/lib/mongoid/association.rb +5 -5
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic.rb +16 -7
- data/lib/mongoid/attributes/dynamic.rb +4 -4
- data/lib/mongoid/attributes/nested.rb +6 -6
- data/lib/mongoid/attributes/processing.rb +37 -6
- data/lib/mongoid/attributes/projector.rb +2 -2
- data/lib/mongoid/attributes/readonly.rb +3 -3
- data/lib/mongoid/attributes.rb +51 -42
- data/lib/mongoid/changeable.rb +147 -14
- data/lib/mongoid/clients/options.rb +5 -1
- data/lib/mongoid/clients/sessions.rb +2 -14
- data/lib/mongoid/clients/storage_options.rb +2 -5
- data/lib/mongoid/clients/validators/storage.rb +3 -15
- data/lib/mongoid/collection_configurable.rb +58 -0
- data/lib/mongoid/composable.rb +2 -0
- data/lib/mongoid/config/defaults.rb +60 -0
- data/lib/mongoid/config/options.rb +3 -0
- data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
- data/lib/mongoid/config/validators/client.rb +6 -6
- data/lib/mongoid/config/validators.rb +1 -0
- data/lib/mongoid/config.rb +153 -18
- data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
- data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
- data/lib/mongoid/contextual/aggregable/none.rb +1 -1
- data/lib/mongoid/contextual/atomic.rb +1 -1
- data/lib/mongoid/contextual/geo_near.rb +7 -7
- data/lib/mongoid/contextual/map_reduce.rb +2 -2
- data/lib/mongoid/contextual/memory.rb +285 -58
- data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
- data/lib/mongoid/contextual/mongo.rb +540 -346
- data/lib/mongoid/contextual/none.rb +193 -20
- data/lib/mongoid/contextual/queryable.rb +1 -1
- data/lib/mongoid/contextual.rb +14 -2
- data/lib/mongoid/copyable.rb +32 -8
- data/lib/mongoid/criteria/findable.rb +8 -5
- data/lib/mongoid/criteria/includable.rb +27 -22
- data/lib/mongoid/criteria/marshalable.rb +10 -2
- data/lib/mongoid/criteria/permission.rb +1 -1
- data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
- data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
- data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +15 -9
- data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
- data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
- data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
- data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
- data/lib/mongoid/criteria/queryable/key.rb +4 -4
- data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
- data/lib/mongoid/criteria/queryable/optional.rb +11 -17
- data/lib/mongoid/criteria/queryable/options.rb +2 -2
- data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
- data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
- data/lib/mongoid/criteria/queryable/selector.rb +92 -7
- data/lib/mongoid/criteria/queryable/smash.rb +40 -7
- data/lib/mongoid/criteria/queryable.rb +12 -7
- data/lib/mongoid/criteria/scopable.rb +2 -2
- data/lib/mongoid/criteria/translator.rb +45 -0
- data/lib/mongoid/criteria.rb +20 -40
- data/lib/mongoid/deprecable.rb +37 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +127 -35
- data/lib/mongoid/equality.rb +8 -8
- data/lib/mongoid/errors/create_collection_failure.rb +33 -0
- data/lib/mongoid/errors/document_not_found.rb +10 -6
- data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
- data/lib/mongoid/errors/immutable_attribute.rb +26 -0
- data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
- data/lib/mongoid/errors/invalid_config_option.rb +1 -1
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_field.rb +6 -2
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
- data/lib/mongoid/errors/invalid_relation.rb +1 -1
- data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
- data/lib/mongoid/errors/invalid_session_use.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
- data/lib/mongoid/errors/mongoid_error.rb +3 -3
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
- data/lib/mongoid/errors/no_client_database.rb +1 -1
- data/lib/mongoid/errors/no_client_hosts.rb +1 -1
- data/lib/mongoid/errors/readonly_attribute.rb +1 -1
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
- data/lib/mongoid/errors/unknown_attribute.rb +1 -1
- data/lib/mongoid/errors.rb +6 -3
- data/lib/mongoid/extensions/array.rb +9 -7
- data/lib/mongoid/extensions/big_decimal.rb +33 -10
- data/lib/mongoid/extensions/binary.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +8 -2
- data/lib/mongoid/extensions/date.rb +26 -20
- data/lib/mongoid/extensions/date_time.rb +1 -1
- data/lib/mongoid/extensions/false_class.rb +1 -1
- data/lib/mongoid/extensions/float.rb +7 -4
- data/lib/mongoid/extensions/hash.rb +38 -9
- data/lib/mongoid/extensions/integer.rb +7 -4
- data/lib/mongoid/extensions/module.rb +1 -1
- data/lib/mongoid/extensions/object.rb +10 -8
- data/lib/mongoid/extensions/range.rb +41 -10
- data/lib/mongoid/extensions/regexp.rb +11 -4
- data/lib/mongoid/extensions/set.rb +11 -4
- data/lib/mongoid/extensions/string.rb +11 -22
- data/lib/mongoid/extensions/symbol.rb +4 -15
- data/lib/mongoid/extensions/time.rb +29 -16
- data/lib/mongoid/extensions/time_with_zone.rb +1 -2
- data/lib/mongoid/extensions/true_class.rb +1 -1
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/factory.rb +55 -7
- data/lib/mongoid/fields/foreign_key.rb +11 -4
- data/lib/mongoid/fields/localized.rb +19 -4
- data/lib/mongoid/fields/standard.rb +17 -7
- data/lib/mongoid/fields/validators/macro.rb +3 -9
- data/lib/mongoid/fields.rb +142 -28
- data/lib/mongoid/findable.rb +54 -24
- data/lib/mongoid/indexable/specification.rb +2 -2
- data/lib/mongoid/indexable/validators/options.rb +6 -2
- data/lib/mongoid/interceptable.rb +186 -16
- data/lib/mongoid/matchable.rb +1 -1
- data/lib/mongoid/matcher/eq_impl.rb +1 -1
- data/lib/mongoid/matcher/type.rb +1 -1
- data/lib/mongoid/matcher.rb +48 -14
- data/lib/mongoid/persistable/creatable.rb +19 -9
- data/lib/mongoid/persistable/deletable.rb +2 -2
- data/lib/mongoid/persistable/destroyable.rb +1 -1
- data/lib/mongoid/persistable/savable.rb +14 -2
- data/lib/mongoid/persistable/unsettable.rb +2 -2
- data/lib/mongoid/persistable/updatable.rb +69 -12
- data/lib/mongoid/persistable/upsertable.rb +21 -2
- data/lib/mongoid/persistable.rb +6 -3
- data/lib/mongoid/persistence_context.rb +6 -4
- data/lib/mongoid/query_cache.rb +13 -261
- data/lib/mongoid/railties/controller_runtime.rb +1 -1
- data/lib/mongoid/railties/database.rake +7 -2
- data/lib/mongoid/reloadable.rb +10 -8
- data/lib/mongoid/scopable.rb +15 -13
- data/lib/mongoid/selectable.rb +1 -2
- data/lib/mongoid/serializable.rb +17 -13
- data/lib/mongoid/stateful.rb +57 -10
- data/lib/mongoid/tasks/database.rake +12 -0
- data/lib/mongoid/tasks/database.rb +20 -2
- data/lib/mongoid/threaded/lifecycle.rb +5 -5
- data/lib/mongoid/threaded.rb +42 -12
- data/lib/mongoid/timestamps/created.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +2 -2
- data/lib/mongoid/touchable.rb +3 -4
- data/lib/mongoid/traversable.rb +10 -5
- data/lib/mongoid/utils.rb +22 -0
- data/lib/mongoid/validatable/associated.rb +98 -17
- data/lib/mongoid/validatable/localizable.rb +1 -1
- data/lib/mongoid/validatable/macros.rb +5 -7
- data/lib/mongoid/validatable/presence.rb +2 -2
- data/lib/mongoid/validatable/uniqueness.rb +9 -8
- data/lib/mongoid/validatable.rb +17 -6
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +19 -4
- data/lib/mongoid.rb +17 -3
- data/spec/config/mongoid.yml +16 -0
- data/spec/integration/app_spec.rb +24 -19
- data/spec/integration/associations/belongs_to_spec.rb +18 -0
- data/spec/integration/associations/embedded_spec.rb +15 -0
- data/spec/integration/associations/embeds_many_spec.rb +15 -2
- data/spec/integration/associations/embeds_one_spec.rb +18 -0
- data/spec/integration/associations/foreign_key_spec.rb +9 -0
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +61 -0
- data/spec/integration/associations/has_one_spec.rb +97 -1
- data/spec/integration/associations/scope_option_spec.rb +1 -1
- data/spec/integration/callbacks_models.rb +132 -1
- data/spec/integration/callbacks_spec.rb +381 -4
- data/spec/integration/criteria/range_spec.rb +95 -1
- data/spec/integration/discriminator_key_spec.rb +118 -80
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/i18n_fallbacks_spec.rb +3 -32
- data/spec/integration/matcher_examples_spec.rb +20 -13
- data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
- data/spec/integration/matcher_operator_spec.rb +3 -5
- data/spec/integration/persistence/range_field_spec.rb +350 -0
- data/spec/mongoid/association/counter_cache_spec.rb +1 -1
- data/spec/mongoid/association/depending_spec.rb +9 -9
- data/spec/mongoid/association/eager_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +290 -65
- data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +16 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
- data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +19 -0
- data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +215 -177
- data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
- data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
- data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
- data/spec/mongoid/association/syncable_spec.rb +15 -1
- data/spec/mongoid/atomic/paths_spec.rb +0 -14
- data/spec/mongoid/attributes/nested_spec.rb +80 -11
- data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
- data/spec/mongoid/attributes/projector_spec.rb +1 -5
- data/spec/mongoid/attributes_spec.rb +526 -33
- data/spec/mongoid/changeable_spec.rb +429 -37
- data/spec/mongoid/clients/factory_spec.rb +23 -30
- data/spec/mongoid/clients/sessions_spec.rb +0 -38
- data/spec/mongoid/clients_spec.rb +149 -15
- data/spec/mongoid/collection_configurable_spec.rb +158 -0
- data/spec/mongoid/config/defaults_spec.rb +160 -0
- data/spec/mongoid/config_spec.rb +214 -31
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
- data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
- data/spec/mongoid/contextual/memory_spec.rb +850 -88
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
- data/spec/mongoid/contextual/mongo_spec.rb +2256 -1005
- data/spec/mongoid/contextual/none_spec.rb +60 -21
- data/spec/mongoid/copyable_spec.rb +453 -11
- data/spec/mongoid/criteria/findable_spec.rb +86 -210
- data/spec/mongoid/criteria/includable_spec.rb +1492 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
- data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
- data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
- data/spec/mongoid/criteria/translator_spec.rb +132 -0
- data/spec/mongoid/criteria_projection_spec.rb +1 -5
- data/spec/mongoid/criteria_spec.rb +469 -1205
- data/spec/mongoid/document_fields_spec.rb +173 -24
- data/spec/mongoid/document_spec.rb +32 -41
- data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
- data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
- data/spec/mongoid/extensions/array_spec.rb +16 -2
- data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
- data/spec/mongoid/extensions/binary_spec.rb +44 -9
- data/spec/mongoid/extensions/boolean_spec.rb +68 -82
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
- data/spec/mongoid/extensions/date_spec.rb +71 -1
- data/spec/mongoid/extensions/date_time_spec.rb +15 -9
- data/spec/mongoid/extensions/float_spec.rb +53 -74
- data/spec/mongoid/extensions/hash_spec.rb +33 -3
- data/spec/mongoid/extensions/integer_spec.rb +50 -64
- data/spec/mongoid/extensions/range_spec.rb +255 -54
- data/spec/mongoid/extensions/regexp_spec.rb +58 -33
- data/spec/mongoid/extensions/set_spec.rb +106 -0
- data/spec/mongoid/extensions/string_spec.rb +53 -25
- data/spec/mongoid/extensions/symbol_spec.rb +18 -25
- data/spec/mongoid/extensions/time_spec.rb +639 -106
- data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
- data/spec/mongoid/factory_spec.rb +61 -1
- data/spec/mongoid/fields/localized_spec.rb +80 -37
- data/spec/mongoid/fields_spec.rb +503 -87
- data/spec/mongoid/findable_spec.rb +450 -58
- data/spec/mongoid/indexable/specification_spec.rb +2 -2
- data/spec/mongoid/indexable_spec.rb +55 -30
- data/spec/mongoid/interceptable_spec.rb +824 -22
- data/spec/mongoid/interceptable_spec_models.rb +235 -4
- data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
- data/spec/mongoid/mongoizable_spec.rb +285 -0
- data/spec/mongoid/persistable/creatable_spec.rb +2 -2
- data/spec/mongoid/persistable/deletable_spec.rb +28 -8
- data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
- data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
- data/spec/mongoid/persistable/logical_spec.rb +37 -0
- data/spec/mongoid/persistable/poppable_spec.rb +36 -0
- data/spec/mongoid/persistable/pullable_spec.rb +72 -0
- data/spec/mongoid/persistable/pushable_spec.rb +72 -0
- data/spec/mongoid/persistable/renamable_spec.rb +36 -0
- data/spec/mongoid/persistable/savable_spec.rb +96 -0
- data/spec/mongoid/persistable/settable_spec.rb +37 -0
- data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
- data/spec/mongoid/persistable/updatable_spec.rb +20 -28
- data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
- data/spec/mongoid/persistence_context_spec.rb +31 -57
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
- data/spec/mongoid/query_cache_spec.rb +56 -215
- data/spec/mongoid/reloadable_spec.rb +83 -6
- data/spec/mongoid/scopable_spec.rb +91 -1
- data/spec/mongoid/serializable_spec.rb +25 -39
- data/spec/mongoid/shardable_spec.rb +4 -4
- data/spec/mongoid/stateful_spec.rb +150 -8
- data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
- data/spec/mongoid/tasks/database_spec.rb +127 -0
- data/spec/mongoid/timestamps_spec.rb +392 -4
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +390 -2
- data/spec/mongoid/touchable_spec_models.rb +14 -8
- data/spec/mongoid/traversable_spec.rb +13 -35
- data/spec/mongoid/validatable/associated_spec.rb +27 -34
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/mongoid_spec.rb +34 -16
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
- data/spec/rails/mongoid_spec.rb +4 -16
- data/spec/spec_helper.rb +5 -0
- data/spec/support/constraints.rb +24 -0
- data/spec/support/immutable_ids.rb +118 -0
- data/spec/support/macros.rb +78 -0
- data/spec/support/models/artist.rb +0 -1
- data/spec/support/models/augmentation.rb +12 -0
- data/spec/support/models/band.rb +5 -0
- data/spec/support/models/book.rb +1 -0
- data/spec/support/models/building.rb +2 -0
- data/spec/support/models/catalog.rb +24 -0
- data/spec/support/models/circus.rb +3 -0
- data/spec/support/models/cover.rb +10 -0
- data/spec/support/models/fanatic.rb +8 -0
- data/spec/support/models/implant.rb +9 -0
- data/spec/support/models/label.rb +2 -0
- data/spec/support/models/lat_lng.rb +6 -0
- data/spec/support/models/name.rb +10 -0
- data/spec/support/models/passport.rb +9 -0
- data/spec/support/models/person.rb +2 -0
- data/spec/support/models/player.rb +2 -0
- data/spec/support/models/powerup.rb +12 -0
- data/spec/support/models/product.rb +1 -0
- data/spec/support/models/purse.rb +9 -0
- data/spec/support/models/registry.rb +1 -0
- data/spec/support/models/school.rb +14 -0
- data/spec/support/models/shield.rb +18 -0
- data/spec/support/models/student.rb +14 -0
- data/spec/support/models/weapon.rb +12 -0
- metadata +101 -96
- checksums.yaml.gz.sig +0 -0
- data/lib/mongoid/errors/eager_load.rb +0 -23
- data/lib/mongoid/errors/invalid_value.rb +0 -17
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
- data/spec/mongoid/errors/eager_load_spec.rb +0 -31
- data/spec/shared/LICENSE +0 -20
- data/spec/shared/bin/get-mongodb-download-url +0 -17
- data/spec/shared/bin/s3-copy +0 -45
- data/spec/shared/bin/s3-upload +0 -69
- data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
- data/spec/shared/lib/mrss/cluster_config.rb +0 -231
- data/spec/shared/lib/mrss/constraints.rb +0 -378
- data/spec/shared/lib/mrss/docker_runner.rb +0 -291
- data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
- data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
- data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
- data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
- data/spec/shared/lib/mrss/session_registry.rb +0 -69
- data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
- data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
- data/spec/shared/lib/mrss/utils.rb +0 -15
- data/spec/shared/share/Dockerfile.erb +0 -325
- data/spec/shared/share/haproxy-1.conf +0 -16
- data/spec/shared/share/haproxy-2.conf +0 -17
- data/spec/shared/shlib/config.sh +0 -27
- data/spec/shared/shlib/distro.sh +0 -74
- data/spec/shared/shlib/server.sh +0 -392
- data/spec/shared/shlib/set_env.sh +0 -169
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -3
@@ -15,32 +15,113 @@ module Mongoid
|
|
15
15
|
#
|
16
16
|
# validates_associated :name, :addresses
|
17
17
|
# end
|
18
|
-
class AssociatedValidator < ActiveModel::
|
18
|
+
class AssociatedValidator < ActiveModel::Validator
|
19
|
+
# Required by `validates_with` so that the validator
|
20
|
+
# gets added to the correct attributes.
|
21
|
+
def attributes
|
22
|
+
options[:attributes]
|
23
|
+
end
|
19
24
|
|
20
|
-
#
|
21
|
-
# valid.
|
22
|
-
# the
|
25
|
+
# Checks that the named associations of the given record
|
26
|
+
# (`attributes`) are valid. This does NOT load the associations
|
27
|
+
# from the database, and will only validate records that are dirty
|
28
|
+
# or unpersisted.
|
23
29
|
#
|
24
|
-
#
|
25
|
-
#
|
30
|
+
# If anything is not valid, appropriate errors will be added to
|
31
|
+
# the `document` parameter.
|
32
|
+
#
|
33
|
+
# @param [ Mongoid::Document ] document the document with the
|
34
|
+
# associations to validate.
|
35
|
+
def validate(document)
|
36
|
+
options[:attributes].each do |attr_name|
|
37
|
+
validate_association(document, attr_name)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
# Validates that the given association provided is either nil,
|
44
|
+
# persisted and unchanged, or invalid. Otherwise, the appropriate errors
|
45
|
+
# will be added to the parent document.
|
26
46
|
#
|
27
47
|
# @param [ Document ] document The document to validate.
|
28
48
|
# @param [ Symbol ] attribute The association to validate.
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
49
|
+
def validate_association(document, attribute)
|
50
|
+
# grab the proxy from the instance variable directly; we don't want
|
51
|
+
# any loading logic to run; we just want to see if it's already
|
52
|
+
# been loaded.
|
53
|
+
proxy = document.ivar(attribute)
|
54
|
+
return unless proxy
|
55
|
+
|
56
|
+
# if the variable exists, now we see if it is a proxy, or an actual
|
57
|
+
# document. It might be a literal document instead of a proxy if this
|
58
|
+
# document was created with a Document instance as a provided attribute,
|
59
|
+
# e.g. "Post.new(message: Message.new)".
|
60
|
+
target = proxy.respond_to?(:_target) ? proxy._target : proxy
|
61
|
+
|
62
|
+
# Now, fetch the list of documents from the target. Target may be a
|
63
|
+
# single value, or a list of values, and in the case of HasMany,
|
64
|
+
# might be a rather complex collection. We need to do this without
|
65
|
+
# triggering a load, so it's a bit of a delicate dance.
|
66
|
+
list = get_target_documents(target)
|
67
|
+
|
68
|
+
valid = document.validating do
|
69
|
+
# Now, treating the target as an array, look at each element
|
70
|
+
# and see if it is valid, but only if it has already been
|
71
|
+
# persisted, or changed, and hasn't been flagged for destroy.
|
72
|
+
#
|
73
|
+
# use map.all? instead of just all?, because all? will do short-circuit
|
74
|
+
# evaluation and terminate on the first failed validation.
|
75
|
+
list.map do |value|
|
76
|
+
if value && !value.flagged_for_destroy? && (!value.persisted? || value.changed?)
|
77
|
+
value.validated? ? true : value.valid?
|
36
78
|
else
|
37
|
-
|
79
|
+
true
|
38
80
|
end
|
39
81
|
end.all?
|
40
|
-
ensure
|
41
|
-
document.exit_validate
|
42
82
|
end
|
43
|
-
|
83
|
+
|
84
|
+
document.errors.add(attribute, :invalid) unless valid
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
# Examine the given target object and return an array of
|
90
|
+
# documents (possibly empty) that the target represents.
|
91
|
+
#
|
92
|
+
# @param [ Array | Mongoid::Document | Mongoid::Association::Proxy | HasMany::Enumerable ] target
|
93
|
+
# the target object to examine.
|
94
|
+
#
|
95
|
+
# @return [ Array<Mongoid::Document> ] the list of documents
|
96
|
+
def get_target_documents(target)
|
97
|
+
if target.respond_to?(:_loaded?)
|
98
|
+
get_target_documents_for_has_many(target)
|
99
|
+
else
|
100
|
+
get_target_documents_for_other(target)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# Returns the list of all currently in-memory values held by
|
105
|
+
# the target. The target will not be loaded.
|
106
|
+
#
|
107
|
+
# @param [ HasMany::Enumerable ] target the target that will
|
108
|
+
# be examined for in-memory documents.
|
109
|
+
#
|
110
|
+
# @return [ Array<Mongoid::Document> ] the in-memory documents
|
111
|
+
# held by the target.
|
112
|
+
def get_target_documents_for_has_many(target)
|
113
|
+
[ *target._loaded.values, *target._added.values ]
|
114
|
+
end
|
115
|
+
|
116
|
+
# Returns the target as an array. If the target represents a single
|
117
|
+
# value, it is wrapped in an array.
|
118
|
+
#
|
119
|
+
# @param [ Array | Mongoid::Document | Mongoid::Association::Proxy ] target
|
120
|
+
# the target to return.
|
121
|
+
#
|
122
|
+
# @return [ Array<Mongoid::Document> ] the target, as an array.
|
123
|
+
def get_target_documents_for_other(target)
|
124
|
+
Array.wrap(target)
|
44
125
|
end
|
45
126
|
end
|
46
127
|
end
|
@@ -12,7 +12,7 @@ module Mongoid
|
|
12
12
|
# validator.validate_each(model, :name, "value")
|
13
13
|
#
|
14
14
|
# @param [ Document ] document The document.
|
15
|
-
# @param [ Symbol
|
15
|
+
# @param [ Symbol | String ] attribute The attribute to validate.
|
16
16
|
# @param [ Object ] value The attribute value.
|
17
17
|
def validate_each(document, attribute, value)
|
18
18
|
field = document.fields[document.database_field_name(attribute)]
|
@@ -18,8 +18,7 @@ module Mongoid
|
|
18
18
|
# validates_associated :name, :addresses
|
19
19
|
# end
|
20
20
|
#
|
21
|
-
# @param [
|
22
|
-
#
|
21
|
+
# @param [ Object... ] *args The arguments to pass to the validator.
|
23
22
|
def validates_associated(*args)
|
24
23
|
validates_with(AssociatedValidator, _merge_attributes(args))
|
25
24
|
end
|
@@ -36,8 +35,7 @@ module Mongoid
|
|
36
35
|
# validates_uniqueness_of :title
|
37
36
|
# end
|
38
37
|
#
|
39
|
-
# @param [
|
40
|
-
#
|
38
|
+
# @param [ Object... ] *args The arguments to pass to the validator.
|
41
39
|
def validates_uniqueness_of(*args)
|
42
40
|
validates_with(UniquenessValidator, _merge_attributes(args))
|
43
41
|
end
|
@@ -52,7 +50,7 @@ module Mongoid
|
|
52
50
|
# validates_format_of :title, with: /\A[a-z0-9 \-_]*\z/i
|
53
51
|
# end
|
54
52
|
#
|
55
|
-
# @param [
|
53
|
+
# @param [ Object... ] *args The names of the field(s) to validate.
|
56
54
|
def validates_format_of(*args)
|
57
55
|
validates_with(FormatValidator, _merge_attributes(args))
|
58
56
|
end
|
@@ -67,7 +65,7 @@ module Mongoid
|
|
67
65
|
# validates_length_of :title, minimum: 100
|
68
66
|
# end
|
69
67
|
#
|
70
|
-
# @param [
|
68
|
+
# @param [ Object... ] *args The names of the field(s) to validate.
|
71
69
|
def validates_length_of(*args)
|
72
70
|
validates_with(LengthValidator, _merge_attributes(args))
|
73
71
|
end
|
@@ -82,7 +80,7 @@ module Mongoid
|
|
82
80
|
# validates_presence_of :title
|
83
81
|
# end
|
84
82
|
#
|
85
|
-
# @param [
|
83
|
+
# @param [ Object... ] *args The names of the field(s) to validate.
|
86
84
|
def validates_presence_of(*args)
|
87
85
|
validates_with(PresenceValidator, _merge_attributes(args))
|
88
86
|
end
|
@@ -56,7 +56,7 @@ module Mongoid
|
|
56
56
|
# @param [ Symbol ] attr The attribute.
|
57
57
|
# @param [ Object ] value The value.
|
58
58
|
#
|
59
|
-
# @return [ true
|
59
|
+
# @return [ true | false ] If the doc is missing.
|
60
60
|
def relation_or_fk_missing?(doc, attr, value)
|
61
61
|
return true if value.blank? && doc.send(attr).blank?
|
62
62
|
association = doc.relations[attr.to_s]
|
@@ -72,7 +72,7 @@ module Mongoid
|
|
72
72
|
#
|
73
73
|
# @param [ Object ] value The value.
|
74
74
|
#
|
75
|
-
# @return [ true
|
75
|
+
# @return [ true | false ] If the value is not present.
|
76
76
|
def not_present?(value)
|
77
77
|
value.blank? && value != false
|
78
78
|
end
|
@@ -16,7 +16,7 @@ module Mongoid
|
|
16
16
|
# end
|
17
17
|
#
|
18
18
|
# It is also possible to limit the uniqueness constraint to a set of
|
19
|
-
#
|
19
|
+
# documents matching certain conditions:
|
20
20
|
# class Person
|
21
21
|
# include Mongoid::Document
|
22
22
|
# field :title
|
@@ -74,7 +74,7 @@ module Mongoid
|
|
74
74
|
# @example Is the validation case sensitive?
|
75
75
|
# validator.case_sensitive?
|
76
76
|
#
|
77
|
-
# @return [ true
|
77
|
+
# @return [ true | false ] If the validation is case sensitive.
|
78
78
|
def case_sensitive?
|
79
79
|
!(options[:case_sensitive] == false)
|
80
80
|
end
|
@@ -86,7 +86,7 @@ module Mongoid
|
|
86
86
|
# @example Create the criteria.
|
87
87
|
# validator.create_criteria(User, user, :name, "syd")
|
88
88
|
#
|
89
|
-
# @param [ Class
|
89
|
+
# @param [ Class | Proxy ] base The base to execute the criteria from.
|
90
90
|
# @param [ Document ] document The document to validate.
|
91
91
|
# @param [ Symbol ] attribute The name of the attribute.
|
92
92
|
# @param [ Object ] value The value of the object.
|
@@ -149,7 +149,7 @@ module Mongoid
|
|
149
149
|
#
|
150
150
|
# @param [ Object ] value The value to filter.
|
151
151
|
#
|
152
|
-
# @return [ Object
|
152
|
+
# @return [ Object | Regexp ] The value, filtered or not.
|
153
153
|
def filter(value)
|
154
154
|
!case_sensitive? && value ? /\A#{Regexp.escape(value.to_s)}\z/i : value
|
155
155
|
end
|
@@ -182,7 +182,7 @@ module Mongoid
|
|
182
182
|
#
|
183
183
|
# @param [ Document ] document The embedded document.
|
184
184
|
#
|
185
|
-
# @return [ true
|
185
|
+
# @return [ true | false ] If the validation should be skipped.
|
186
186
|
def skip_validation?(document)
|
187
187
|
!document._parent || document.embedded_one?
|
188
188
|
end
|
@@ -196,7 +196,7 @@ module Mongoid
|
|
196
196
|
#
|
197
197
|
# @param [ Document ] document The embedded document.
|
198
198
|
#
|
199
|
-
# @return [ true
|
199
|
+
# @return [ true | false ] If the scope reference has changed.
|
200
200
|
def scope_value_changed?(document)
|
201
201
|
Array.wrap(options[:scope]).any? do |item|
|
202
202
|
document.send("attribute_changed?", item.to_s)
|
@@ -242,6 +242,7 @@ module Mongoid
|
|
242
242
|
relation = document._parent.send(document.association_name)
|
243
243
|
criteria = create_criteria(relation, document, attribute, value)
|
244
244
|
criteria = criteria.merge(options[:conditions].call) if options[:conditions]
|
245
|
+
criteria = criteria.limit(2)
|
245
246
|
add_error(document, attribute, value) if criteria.count > 1
|
246
247
|
end
|
247
248
|
|
@@ -277,7 +278,7 @@ module Mongoid
|
|
277
278
|
# @param [ Document ] document The document getting validated.
|
278
279
|
# @param [ Symbol ] attribute The attribute to validate.
|
279
280
|
#
|
280
|
-
# @return [ true
|
281
|
+
# @return [ true | false ] If we need to validate.
|
281
282
|
def validation_required?(document, attribute)
|
282
283
|
document.new_record? ||
|
283
284
|
document.send("attribute_changed?", attribute.to_s) ||
|
@@ -294,7 +295,7 @@ module Mongoid
|
|
294
295
|
# @param [ Document ] document The document getting validated.
|
295
296
|
# @param [ Symbol ] attribute The attribute to validate.
|
296
297
|
#
|
297
|
-
# @return [ true
|
298
|
+
# @return [ true | false ] If the attribute is localized.
|
298
299
|
def localized?(document, attribute)
|
299
300
|
document.fields[document.database_field_name(attribute)].try(:localized?)
|
300
301
|
end
|
data/lib/mongoid/validatable.rb
CHANGED
@@ -37,6 +37,14 @@ module Mongoid
|
|
37
37
|
Threaded.exit_validate(self)
|
38
38
|
end
|
39
39
|
|
40
|
+
# Perform a validation within the associated block.
|
41
|
+
def validating
|
42
|
+
begin_validate
|
43
|
+
yield
|
44
|
+
ensure
|
45
|
+
exit_validate
|
46
|
+
end
|
47
|
+
|
40
48
|
# Given the provided options, are we performing validations?
|
41
49
|
#
|
42
50
|
# @example Are we performing validations?
|
@@ -44,7 +52,9 @@ module Mongoid
|
|
44
52
|
#
|
45
53
|
# @param [ Hash ] options The options to check.
|
46
54
|
#
|
47
|
-
# @
|
55
|
+
# @option options [ true | false ] :validate Whether or not to validate.
|
56
|
+
#
|
57
|
+
# @return [ true | false ] If we are validating.
|
48
58
|
def performing_validations?(options = {})
|
49
59
|
options[:validate].nil? ? true : options[:validate]
|
50
60
|
end
|
@@ -83,7 +93,7 @@ module Mongoid
|
|
83
93
|
#
|
84
94
|
# @param [ Symbol ] context The optional validation context.
|
85
95
|
#
|
86
|
-
# @return [ true
|
96
|
+
# @return [ true | false ] True if valid, false if not.
|
87
97
|
def valid?(context = nil)
|
88
98
|
super context ? context : (new_record? ? :create : :update)
|
89
99
|
end
|
@@ -93,7 +103,7 @@ module Mongoid
|
|
93
103
|
# @example Is the document validated?
|
94
104
|
# document.validated?
|
95
105
|
#
|
96
|
-
# @return [ true
|
106
|
+
# @return [ true | false ] Has the document already been validated?
|
97
107
|
def validated?
|
98
108
|
Threaded.validated?(self)
|
99
109
|
end
|
@@ -103,7 +113,7 @@ module Mongoid
|
|
103
113
|
# @example Are we validating with a query?
|
104
114
|
# document.validating_with_query?
|
105
115
|
#
|
106
|
-
# @return [ true
|
116
|
+
# @return [ true | false ] If we are validating with a query.
|
107
117
|
def validating_with_query?
|
108
118
|
self.class.validating_with_query?
|
109
119
|
end
|
@@ -129,7 +139,8 @@ module Mongoid
|
|
129
139
|
# @example Validate with a specific validator.
|
130
140
|
# validates_with MyValidator, on: :create
|
131
141
|
#
|
132
|
-
# @param [
|
142
|
+
# @param [ ActiveModel::Validator..., Hash ] *args The validator classes
|
143
|
+
# and options hash.
|
133
144
|
#
|
134
145
|
# @note See ActiveModel::Validations::With for full options. This is
|
135
146
|
# overridden to add autosave functionality when presence validation is
|
@@ -151,7 +162,7 @@ module Mongoid
|
|
151
162
|
# @example Are we validating with a query?
|
152
163
|
# Model.validating_with_query?
|
153
164
|
#
|
154
|
-
# @return [ true
|
165
|
+
# @return [ true | false ] If we are validating with a query.
|
155
166
|
def validating_with_query?
|
156
167
|
Threaded.executing?("#{name}-validate-with-query")
|
157
168
|
end
|
data/lib/mongoid/version.rb
CHANGED
data/lib/mongoid/warnings.rb
CHANGED
@@ -21,9 +21,24 @@ module Mongoid
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
warning :
|
25
|
-
warning :
|
26
|
-
warning :
|
24
|
+
warning :geo_haystack_deprecated, 'The geoHaystack type is deprecated.'
|
25
|
+
warning :as_json_compact_deprecated, '#as_json :compact option is deprecated. Please call #compact on the returned Hash object instead.'
|
26
|
+
warning :symbol_type_deprecated, 'The BSON Symbol type is deprecated by MongoDB. Please use String or StringifiedSymbol field types instead of the Symbol field type.'
|
27
|
+
warning :legacy_readonly, 'The readonly! method will only mark the document readonly when the legacy_readonly feature flag is switched off.'
|
28
|
+
warning :use_activesupport_time_zone_deprecated, 'Config option :use_activesupport_time_zone is deprecated and should be removed from your config. It will always be true beginning in Mongoid 9.0.'
|
29
|
+
warning :broken_aggregables_deprecated, 'Config option :broken_aggregables is deprecated. It will always be false beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
|
30
|
+
warning :broken_alias_handling_deprecated, 'Config option :broken_alias_handling is deprecated. It will always be false beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
|
31
|
+
warning :broken_and_deprecated, 'Config option :broken_and is deprecated. It will always be false beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
|
32
|
+
warning :broken_scoping_deprecated, 'Config option :broken_scoping is deprecated. It will always be false beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
|
33
|
+
warning :broken_updates_deprecated, 'Config option :broken_updates is deprecated. It will always be false beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
|
34
|
+
warning :compare_time_by_ms_deprecated, 'Config option :compare_time_by_ms is deprecated. It will always be true beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
|
35
|
+
warning :legacy_attributes_deprecated, 'Config option :legacy_attributes is deprecated. It will always be false beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
|
36
|
+
warning :legacy_pluck_distinct_deprecated, 'Config option :legacy_pluck_distinct is deprecated. It will always be false beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
|
37
|
+
warning :legacy_triple_equals_deprecated, 'Config option :legacy_triple_equals is deprecated. It will always be false beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
|
38
|
+
warning :object_id_as_json_oid_deprecated, 'Config option :object_id_as_json_oid is deprecated. It will always be false beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
|
39
|
+
warning :overwrite_chained_operators_deprecated, 'Config option :overwrite_chained_operators is deprecated. It will always be false beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
|
40
|
+
warning :mutable_ids, 'In Mongoid 9.0 the _id field will be immutable. In earlier versions of 8.x, mutating the _id field was supported inconsistently. Prepare your code for 9.0 by setting Mongoid::Config.immutable_ids to true.'
|
41
|
+
warning :mongoid_query_cache, 'In Mongoid 9.0, Mongoid::QueryCache will be removed. Please replace it with Mongo::QueryCache.'
|
42
|
+
warning :mongoid_query_cache_clear, 'In Mongoid 9.0, Mongoid::QueryCache#clear_cache should be replaced it with Mongo::QueryCache#clear.'
|
27
43
|
end
|
28
44
|
end
|
29
|
-
|
data/lib/mongoid.rb
CHANGED
@@ -12,10 +12,13 @@ require "active_support/inflector"
|
|
12
12
|
require "active_support/time_with_zone"
|
13
13
|
require "active_model"
|
14
14
|
|
15
|
+
require 'concurrent-ruby'
|
16
|
+
|
15
17
|
require "mongo"
|
16
|
-
require
|
18
|
+
require "mongo/active_support"
|
17
19
|
|
18
20
|
require "mongoid/version"
|
21
|
+
require "mongoid/deprecable"
|
19
22
|
require "mongoid/config"
|
20
23
|
require "mongoid/persistence_context"
|
21
24
|
require "mongoid/loggable"
|
@@ -24,6 +27,7 @@ require "mongoid/document"
|
|
24
27
|
require "mongoid/tasks/database"
|
25
28
|
require "mongoid/query_cache"
|
26
29
|
require "mongoid/warnings"
|
30
|
+
require "mongoid/utils"
|
27
31
|
|
28
32
|
# If we are using Rails then we will include the Mongoid railtie. This has all
|
29
33
|
# the nifty initializers that Mongoid needs.
|
@@ -57,9 +61,19 @@ module Mongoid
|
|
57
61
|
# }
|
58
62
|
# end
|
59
63
|
#
|
64
|
+
# @example Using a block without an argument. Use `config` inside
|
65
|
+
# the block to perform variable assignment.
|
66
|
+
#
|
67
|
+
# Mongoid.configure do
|
68
|
+
# connect_to("mongoid_test")
|
69
|
+
#
|
70
|
+
# config.preload_models = true
|
71
|
+
#
|
60
72
|
# @return [ Config ] The configuration object.
|
61
|
-
def configure
|
62
|
-
|
73
|
+
def configure(&block)
|
74
|
+
return Config unless block_given?
|
75
|
+
|
76
|
+
block.arity == 0 ? Config.instance_exec(&block) : yield(Config)
|
63
77
|
end
|
64
78
|
|
65
79
|
# Convenience method for getting the default client.
|
data/spec/config/mongoid.yml
CHANGED
@@ -40,6 +40,22 @@ test:
|
|
40
40
|
app_name: 'testing'
|
41
41
|
background_indexing: false
|
42
42
|
join_contexts: false
|
43
|
+
driver_options:
|
44
|
+
broken_view_options: false
|
45
|
+
# Don't set validate_update_replace here, as it is used to check if the
|
46
|
+
# default driver options are kept in Mongoid.
|
47
|
+
test_nil:
|
48
|
+
clients:
|
49
|
+
default:
|
50
|
+
database: mongoid_test
|
51
|
+
hosts:
|
52
|
+
<% SpecConfig.instance.addresses.each do |address| %>
|
53
|
+
- <%= address %>
|
54
|
+
<% end %>
|
55
|
+
driver_options:
|
56
|
+
broken_view_options:
|
57
|
+
validate_update_replace: false
|
58
|
+
|
43
59
|
test_with_max_staleness:
|
44
60
|
clients:
|
45
61
|
default:
|
@@ -26,6 +26,8 @@ describe 'Mongoid application tests' do
|
|
26
26
|
context 'demo application' do
|
27
27
|
context 'sinatra' do
|
28
28
|
it 'runs' do
|
29
|
+
skip 'https://jira.mongodb.org/browse/MONGOID-5826'
|
30
|
+
|
29
31
|
clone_application(
|
30
32
|
'https://github.com/mongoid/mongoid-demo',
|
31
33
|
subdir: 'sinatra-minimal',
|
@@ -45,6 +47,8 @@ describe 'Mongoid application tests' do
|
|
45
47
|
|
46
48
|
context 'rails-api' do
|
47
49
|
it 'runs' do
|
50
|
+
skip 'https://jira.mongodb.org/browse/MONGOID-5826'
|
51
|
+
|
48
52
|
clone_application(
|
49
53
|
'https://github.com/mongoid/mongoid-demo',
|
50
54
|
subdir: 'rails-api',
|
@@ -95,7 +99,7 @@ describe 'Mongoid application tests' do
|
|
95
99
|
check_call(%w(rails new mongoid-test --skip-spring --skip-active-record), env: clean_env)
|
96
100
|
|
97
101
|
Dir.chdir('mongoid-test') do
|
98
|
-
adjust_app_gemfile
|
102
|
+
adjust_app_gemfile(add_sprockets: SpecConfig.instance.rails_version != '8.0')
|
99
103
|
check_call(%w(bundle install), env: clean_env)
|
100
104
|
|
101
105
|
check_call(%w(rails g model post), env: clean_env)
|
@@ -117,7 +121,7 @@ describe 'Mongoid application tests' do
|
|
117
121
|
check_call(%w(rails new mongoid-test-config --skip-spring --skip-active-record), env: clean_env)
|
118
122
|
|
119
123
|
Dir.chdir('mongoid-test-config') do
|
120
|
-
adjust_app_gemfile
|
124
|
+
adjust_app_gemfile(add_sprockets: SpecConfig.instance.rails_version != '8.0')
|
121
125
|
check_call(%w(bundle install), env: clean_env)
|
122
126
|
|
123
127
|
mongoid_config_file = File.join(TMP_BASE,'mongoid-test-config/config/mongoid.yml')
|
@@ -139,7 +143,7 @@ describe 'Mongoid application tests' do
|
|
139
143
|
if (rails_version = SpecConfig.instance.rails_version) == 'master'
|
140
144
|
else
|
141
145
|
check_call(%w(gem list))
|
142
|
-
check_call(%w(gem install rails --no-document -v) + ["~> #{rails_version}.0"])
|
146
|
+
check_call(%w(gem install rails --no-document --force -v) + ["~> #{rails_version}.0"])
|
143
147
|
end
|
144
148
|
end
|
145
149
|
|
@@ -163,6 +167,14 @@ describe 'Mongoid application tests' do
|
|
163
167
|
before do
|
164
168
|
Dir.chdir(APP_PATH) do
|
165
169
|
remove_bundler_req
|
170
|
+
|
171
|
+
if BSON::Environment.jruby?
|
172
|
+
# Remove existing Gemfile.lock - see
|
173
|
+
# https://github.com/rubygems/rubygems/issues/3231
|
174
|
+
require 'fileutils'
|
175
|
+
FileUtils.rm_f('Gemfile.lock')
|
176
|
+
end
|
177
|
+
|
166
178
|
check_call(%w(bundle install), env: env)
|
167
179
|
write_mongoid_yml
|
168
180
|
end
|
@@ -197,7 +209,7 @@ describe 'Mongoid application tests' do
|
|
197
209
|
FileUtils.rm_rf(File.basename(repo_url))
|
198
210
|
check_call(%w(git clone) + [repo_url])
|
199
211
|
Dir.chdir(File.join(*[File.basename(repo_url), subdir].compact)) do
|
200
|
-
adjust_app_gemfile
|
212
|
+
adjust_app_gemfile(add_sprockets: false)
|
201
213
|
adjust_rails_defaults
|
202
214
|
check_call(%w(bundle install), env: clean_env)
|
203
215
|
puts `git diff`
|
@@ -254,7 +266,7 @@ describe 'Mongoid application tests' do
|
|
254
266
|
end
|
255
267
|
end
|
256
268
|
|
257
|
-
def adjust_app_gemfile(rails_version: SpecConfig.instance.rails_version)
|
269
|
+
def adjust_app_gemfile(rails_version: SpecConfig.instance.rails_version, add_sprockets: true)
|
258
270
|
remove_bundler_req
|
259
271
|
|
260
272
|
gemfile_lines = IO.readlines('Gemfile')
|
@@ -272,12 +284,17 @@ describe 'Mongoid application tests' do
|
|
272
284
|
gemfile_lines << "gem 'rails', '~> #{rails_version}.0'\n"
|
273
285
|
end
|
274
286
|
end
|
287
|
+
gemfile_lines << "gem 'sprockets-rails'\n" if add_sprockets
|
275
288
|
File.open('Gemfile', 'w') do |f|
|
276
289
|
f << gemfile_lines.join
|
277
290
|
end
|
278
291
|
end
|
279
292
|
|
280
293
|
def adjust_rails_defaults(rails_version: SpecConfig.instance.rails_version)
|
294
|
+
if !rails_version.match?(/^\d+\.\d+$/)
|
295
|
+
# This must be pre-release version, we trim it
|
296
|
+
rails_version = rails_version.split('.')[0..1].join('.')
|
297
|
+
end
|
281
298
|
if File.exist?('config/application.rb')
|
282
299
|
lines = IO.readlines('config/application.rb')
|
283
300
|
lines.each do |line|
|
@@ -287,18 +304,6 @@ describe 'Mongoid application tests' do
|
|
287
304
|
f << lines.join
|
288
305
|
end
|
289
306
|
end
|
290
|
-
|
291
|
-
if rails_version == '5.1'
|
292
|
-
secrets = {
|
293
|
-
'development' => {
|
294
|
-
'secret_key_base' => 'abracadabra',
|
295
|
-
'my_secret_token' => 'very_secret',
|
296
|
-
},
|
297
|
-
}
|
298
|
-
File.open('config/secrets.yml', 'w') do |f|
|
299
|
-
f << YAML.dump(secrets)
|
300
|
-
end
|
301
|
-
end
|
302
307
|
end
|
303
308
|
|
304
309
|
def remove_bundler_req
|
@@ -330,7 +335,7 @@ describe 'Mongoid application tests' do
|
|
330
335
|
end
|
331
336
|
|
332
337
|
def wait_for_port(port, timeout, process)
|
333
|
-
deadline =
|
338
|
+
deadline = Mongoid::Utils.monotonic_time + timeout
|
334
339
|
loop do
|
335
340
|
begin
|
336
341
|
Socket.tcp('localhost', port, nil, nil, connect_timeout: 0.5) do |socket|
|
@@ -340,7 +345,7 @@ describe 'Mongoid application tests' do
|
|
340
345
|
unless process.alive?
|
341
346
|
raise "Process #{process} died while waiting for port #{port}"
|
342
347
|
end
|
343
|
-
if
|
348
|
+
if Mongoid::Utils.monotonic_time > deadline
|
344
349
|
raise
|
345
350
|
end
|
346
351
|
end
|
@@ -12,4 +12,22 @@ describe 'belongs_to associations' do
|
|
12
12
|
expect(child).to be_valid
|
13
13
|
end
|
14
14
|
end
|
15
|
+
|
16
|
+
context 'when an anonymous class defines a belongs_to association' do
|
17
|
+
let(:klass) do
|
18
|
+
Class.new do
|
19
|
+
include Mongoid::Document
|
20
|
+
belongs_to :movie
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'loads the association correctly' do
|
25
|
+
expect { klass }.to_not raise_error
|
26
|
+
expect { klass.new.movie }.to_not raise_error
|
27
|
+
instance = klass.new
|
28
|
+
movie = Movie.new
|
29
|
+
instance.movie = movie
|
30
|
+
expect(instance.movie).to eq movie
|
31
|
+
end
|
32
|
+
end
|
15
33
|
end
|
@@ -265,4 +265,19 @@ describe 'embedded associations' do
|
|
265
265
|
end
|
266
266
|
end
|
267
267
|
end
|
268
|
+
|
269
|
+
context "when summing properties on an embedded child" do
|
270
|
+
let(:user) { EmmUser.new }
|
271
|
+
before do
|
272
|
+
user.orders.build(amount: 200)
|
273
|
+
expect(user.orders.sum(:amount)).to eq(200)
|
274
|
+
|
275
|
+
user.orders.delete_all
|
276
|
+
user.orders.build(amount: 500)
|
277
|
+
end
|
278
|
+
|
279
|
+
it "the cache is cleared after deletion" do
|
280
|
+
expect(user.orders.sum(:amount)).to eq(500)
|
281
|
+
end
|
282
|
+
end
|
268
283
|
end
|
@@ -172,8 +172,6 @@ describe 'embeds_many associations' do
|
|
172
172
|
# Mongoid uses the new value of `x` in the $pullAll query,
|
173
173
|
# which doesn't match the document that is in the database,
|
174
174
|
# resulting in the empty array assignment not taking effect.
|
175
|
-
pending 'MONGOID-5037'
|
176
|
-
|
177
175
|
canvas.shapes.first.x = 1
|
178
176
|
canvas.shapes = []
|
179
177
|
canvas.save!
|
@@ -203,4 +201,19 @@ describe 'embeds_many associations' do
|
|
203
201
|
end
|
204
202
|
end
|
205
203
|
end
|
204
|
+
|
205
|
+
context 'when an anonymous class defines an embeds_many association' do
|
206
|
+
let(:klass) do
|
207
|
+
Class.new do
|
208
|
+
include Mongoid::Document
|
209
|
+
embeds_many :addresses
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
it 'loads the association correctly' do
|
214
|
+
expect { klass }.to_not raise_error
|
215
|
+
expect { klass.new.addresses }.to_not raise_error
|
216
|
+
expect(klass.new.addresses.build).to be_a Address
|
217
|
+
end
|
218
|
+
end
|
206
219
|
end
|