mongoid 7.5.4 → 8.1.9
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 +32 -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 +11 -6
- 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 +48 -39
- 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 +135 -36
- data/lib/mongoid/equality.rb +9 -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 +187 -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 +9 -2
- data/lib/mongoid/timestamps/updated.rb +2 -2
- data/lib/mongoid/touchable.rb +3 -4
- data/lib/mongoid/traversable.rb +41 -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 +26 -3
- 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/association_spec.rb +60 -0
- 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/readonly_spec.rb +19 -0
- 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 +107 -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 +59 -41
- data/spec/mongoid/equality_spec.rb +6 -0
- 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 +904 -22
- data/spec/mongoid/interceptable_spec_models.rb +189 -22
- 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/created_spec.rb +23 -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 +98 -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
data/lib/mongoid/changeable.rb
CHANGED
@@ -21,7 +21,7 @@ module Mongoid
|
|
21
21
|
# @example Has the document changed?
|
22
22
|
# model.changed?
|
23
23
|
#
|
24
|
-
# @return [ true
|
24
|
+
# @return [ true | false ] If the document is changed.
|
25
25
|
def changed?
|
26
26
|
changes.values.any? { |val| val } || children_changed?
|
27
27
|
end
|
@@ -30,7 +30,7 @@ module Mongoid
|
|
30
30
|
#
|
31
31
|
# @note This intentionally only considers children and not descendants.
|
32
32
|
#
|
33
|
-
# @return [ true
|
33
|
+
# @return [ true | false ] If any children have changed.
|
34
34
|
def children_changed?
|
35
35
|
_children.any?(&:changed?)
|
36
36
|
end
|
@@ -62,16 +62,17 @@ module Mongoid
|
|
62
62
|
|
63
63
|
# Call this method after save, so the changes can be properly switched.
|
64
64
|
#
|
65
|
-
# This will unset the memoized children array, set new record to
|
65
|
+
# This will unset the memoized children array, set new record flag to
|
66
66
|
# false, set the document as validated, and move the dirty changes.
|
67
67
|
#
|
68
68
|
# @example Move the changes to previous.
|
69
69
|
# person.move_changes
|
70
70
|
def move_changes
|
71
|
+
@changes_before_last_save = @previous_changes
|
71
72
|
@previous_changes = changes
|
72
|
-
|
73
|
-
|
74
|
-
|
73
|
+
@attributes_before_last_save = @previous_attributes
|
74
|
+
@previous_attributes = attributes.dup
|
75
|
+
reset_atomic_updates!
|
75
76
|
changed_attributes.clear
|
76
77
|
end
|
77
78
|
|
@@ -81,6 +82,7 @@ module Mongoid
|
|
81
82
|
# document.post_persist
|
82
83
|
def post_persist
|
83
84
|
reset_persisted_descendants
|
85
|
+
reset_attributes_before_type_cast
|
84
86
|
move_changes
|
85
87
|
end
|
86
88
|
|
@@ -100,7 +102,7 @@ module Mongoid
|
|
100
102
|
# @example Remove a flagged change.
|
101
103
|
# model.remove_change(:field)
|
102
104
|
#
|
103
|
-
# @param [ Symbol
|
105
|
+
# @param [ Symbol | String ] name The name of the field.
|
104
106
|
def remove_change(name)
|
105
107
|
changed_attributes.delete(name.to_s)
|
106
108
|
end
|
@@ -131,8 +133,89 @@ module Mongoid
|
|
131
133
|
mods
|
132
134
|
end
|
133
135
|
|
136
|
+
# Returns the original value of an attribute before the last save.
|
137
|
+
#
|
138
|
+
# This method is useful in after callbacks to get the original value of
|
139
|
+
# an attribute before the save that triggered the callbacks to run.
|
140
|
+
#
|
141
|
+
# @param [ Symbol | String ] attr The name of the attribute.
|
142
|
+
#
|
143
|
+
# @return [ Object ] Value of the attribute before the last save.
|
144
|
+
def attribute_before_last_save(attr)
|
145
|
+
attr = database_field_name(attr)
|
146
|
+
attributes_before_last_save[attr]
|
147
|
+
end
|
148
|
+
|
149
|
+
# Returns the change to an attribute during the last save.
|
150
|
+
#
|
151
|
+
# @param [ Symbol | String ] attr The name of the attribute.
|
152
|
+
#
|
153
|
+
# @return [ Array<Object> | nil ] If the attribute was changed, returns
|
154
|
+
# an array containing the original value and the saved value, otherwise nil.
|
155
|
+
def saved_change_to_attribute(attr)
|
156
|
+
attr = database_field_name(attr)
|
157
|
+
previous_changes[attr]
|
158
|
+
end
|
159
|
+
|
160
|
+
# Returns whether this attribute changed during the last save.
|
161
|
+
#
|
162
|
+
# This method is useful in after callbacks, to see the change
|
163
|
+
# in an attribute during the save that triggered the callbacks to run.
|
164
|
+
#
|
165
|
+
# @param [ String ] attr The name of the attribute.
|
166
|
+
# @param **kwargs The optional keyword arguments.
|
167
|
+
#
|
168
|
+
# @option **kwargs [ Object ] :from The object the attribute was changed from.
|
169
|
+
# @option **kwargs [ Object ] :to The object the attribute was changed to.
|
170
|
+
#
|
171
|
+
# @return [ true | false ] Whether the attribute has changed during the last save.
|
172
|
+
def saved_change_to_attribute?(attr, **kwargs)
|
173
|
+
changes = saved_change_to_attribute(attr)
|
174
|
+
return false unless changes.is_a?(Array)
|
175
|
+
if kwargs.key?(:from) && kwargs.key?(:to)
|
176
|
+
changes.first == kwargs[:from] && changes.last == kwargs[:to]
|
177
|
+
elsif kwargs.key?(:from)
|
178
|
+
changes.first == kwargs[:from]
|
179
|
+
elsif kwargs.key?(:to)
|
180
|
+
changes.last == kwargs[:to]
|
181
|
+
else
|
182
|
+
true
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
# Returns whether this attribute change the next time we save.
|
187
|
+
#
|
188
|
+
# This method is useful in validations and before callbacks to determine
|
189
|
+
# if the next call to save will change a particular attribute.
|
190
|
+
#
|
191
|
+
# @param [ String ] attr The name of the attribute.
|
192
|
+
# @param **kwargs The optional keyword arguments.
|
193
|
+
#
|
194
|
+
# @option **kwargs [ Object ] :from The object the attribute was changed from.
|
195
|
+
# @option **kwargs [ Object ] :to The object the attribute was changed to.
|
196
|
+
#
|
197
|
+
# @return [ true | false ] Whether the attribute change the next time we save.
|
198
|
+
def will_save_change_to_attribute?(attr, **kwargs)
|
199
|
+
attribute_changed?(attr, **kwargs)
|
200
|
+
end
|
201
|
+
|
134
202
|
private
|
135
203
|
|
204
|
+
# Get attributes of the document before the document was saved.
|
205
|
+
#
|
206
|
+
# @return [ Hash ] Previous attributes
|
207
|
+
def previous_attributes
|
208
|
+
@previous_attributes ||= {}
|
209
|
+
end
|
210
|
+
|
211
|
+
def changes_before_last_save
|
212
|
+
@changes_before_last_save ||= {}
|
213
|
+
end
|
214
|
+
|
215
|
+
def attributes_before_last_save
|
216
|
+
@attributes_before_last_save ||= {}
|
217
|
+
end
|
218
|
+
|
136
219
|
# Get the old and new value for the provided attribute.
|
137
220
|
#
|
138
221
|
# @example Get the attribute change.
|
@@ -152,12 +235,24 @@ module Mongoid
|
|
152
235
|
# model.attribute_changed?("name")
|
153
236
|
#
|
154
237
|
# @param [ String ] attr The name of the attribute.
|
238
|
+
# @param **kwargs The optional keyword arguments.
|
239
|
+
#
|
240
|
+
# @option **kwargs [ Object ] :from The object the attribute was changed from.
|
241
|
+
# @option **kwargs [ Object ] :to The object the attribute was changed to.
|
155
242
|
#
|
156
|
-
# @return [ true
|
157
|
-
def attribute_changed?(attr)
|
243
|
+
# @return [ true | false ] Whether the attribute has changed.
|
244
|
+
def attribute_changed?(attr, **kwargs)
|
158
245
|
attr = database_field_name(attr)
|
159
246
|
return false unless changed_attributes.key?(attr)
|
160
|
-
changed_attributes[attr]
|
247
|
+
return false if changed_attributes[attr] == attributes[attr]
|
248
|
+
if kwargs.key?(:from)
|
249
|
+
return false if changed_attributes[attr] != kwargs[:from]
|
250
|
+
end
|
251
|
+
if kwargs.key?(:to)
|
252
|
+
return false if attributes[attr] != kwargs[:to]
|
253
|
+
end
|
254
|
+
|
255
|
+
true
|
161
256
|
end
|
162
257
|
|
163
258
|
# Get whether or not the field has a different value from the default.
|
@@ -167,7 +262,7 @@ module Mongoid
|
|
167
262
|
#
|
168
263
|
# @param [ String ] attr The name of the attribute.
|
169
264
|
#
|
170
|
-
# @return [ true
|
265
|
+
# @return [ true | false ] If the attribute differs.
|
171
266
|
def attribute_changed_from_default?(attr)
|
172
267
|
field = fields[attr]
|
173
268
|
return false unless field
|
@@ -185,6 +280,25 @@ module Mongoid
|
|
185
280
|
attribute_changed?(attr) ? changed_attributes[attr] : attributes[attr]
|
186
281
|
end
|
187
282
|
|
283
|
+
# Get the previous attribute value that was changed
|
284
|
+
# before the document was saved.
|
285
|
+
#
|
286
|
+
# It the document has not been saved yet, or was just loaded from database,
|
287
|
+
# this method returns nil for all attributes.
|
288
|
+
#
|
289
|
+
# @param [ String ] attr The attribute name.
|
290
|
+
#
|
291
|
+
# @return [ Object | nil ] Attribute value before the document was saved,
|
292
|
+
# or nil if the document has not been saved yet.
|
293
|
+
def attribute_previously_was(attr)
|
294
|
+
attr = database_field_name(attr)
|
295
|
+
if previous_changes.key?(attr)
|
296
|
+
previous_changes[attr].first
|
297
|
+
else
|
298
|
+
previous_attributes[attr]
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
188
302
|
# Flag an attribute as going to change.
|
189
303
|
#
|
190
304
|
# @example Flag the attribute.
|
@@ -221,6 +335,10 @@ module Mongoid
|
|
221
335
|
end
|
222
336
|
end
|
223
337
|
|
338
|
+
def reset_attributes_before_type_cast
|
339
|
+
@attributes_before_type_cast = @attributes.dup
|
340
|
+
end
|
341
|
+
|
224
342
|
module ClassMethods
|
225
343
|
|
226
344
|
private
|
@@ -270,8 +388,11 @@ module Mongoid
|
|
270
388
|
# @param [ String ] meth The name of the accessor.
|
271
389
|
def create_dirty_change_check(name, meth)
|
272
390
|
generated_methods.module_eval do
|
273
|
-
re_define_method("#{meth}_changed?") do
|
274
|
-
attribute_changed?(name)
|
391
|
+
re_define_method("#{meth}_changed?") do |**kwargs|
|
392
|
+
attribute_changed?(name, **kwargs)
|
393
|
+
end
|
394
|
+
re_define_method("will_save_change_to_#{meth}?") do |**kwargs|
|
395
|
+
will_save_change_to_attribute?(name, **kwargs)
|
275
396
|
end
|
276
397
|
end
|
277
398
|
end
|
@@ -291,7 +412,7 @@ module Mongoid
|
|
291
412
|
end
|
292
413
|
end
|
293
414
|
|
294
|
-
# Creates the dirty change previous value
|
415
|
+
# Creates the dirty change previous value accessors.
|
295
416
|
#
|
296
417
|
# @example Create the accessor.
|
297
418
|
# Model.create_dirty_previous_value_accessor("name", "alias")
|
@@ -303,6 +424,18 @@ module Mongoid
|
|
303
424
|
re_define_method("#{meth}_was") do
|
304
425
|
attribute_was(name)
|
305
426
|
end
|
427
|
+
re_define_method("#{meth}_previously_was") do
|
428
|
+
attribute_previously_was(name)
|
429
|
+
end
|
430
|
+
re_define_method("#{meth}_before_last_save") do
|
431
|
+
attribute_before_last_save(name)
|
432
|
+
end
|
433
|
+
re_define_method("saved_change_to_#{meth}") do
|
434
|
+
saved_change_to_attribute(name)
|
435
|
+
end
|
436
|
+
re_define_method("saved_change_to_#{meth}?") do |**kwargs|
|
437
|
+
saved_change_to_attribute?(name, **kwargs)
|
438
|
+
end
|
306
439
|
end
|
307
440
|
end
|
308
441
|
|
@@ -12,7 +12,7 @@ module Mongoid
|
|
12
12
|
# m.save
|
13
13
|
# end
|
14
14
|
#
|
15
|
-
# @param [ Hash
|
15
|
+
# @param [ Hash | Mongoid::PersistenceContext ] options_or_context
|
16
16
|
# The storage options or a persistence context.
|
17
17
|
#
|
18
18
|
# @option options [ String | Symbol ] :collection The collection name.
|
@@ -45,6 +45,10 @@ module Mongoid
|
|
45
45
|
PersistenceContext.new(self.class)
|
46
46
|
end
|
47
47
|
|
48
|
+
def persistence_context?
|
49
|
+
!!(PersistenceContext.get(self) || PersistenceContext.get(self.class))
|
50
|
+
end
|
51
|
+
|
48
52
|
private
|
49
53
|
|
50
54
|
def set_persistence_context(options_or_context)
|
@@ -43,13 +43,7 @@ module Mongoid
|
|
43
43
|
Threaded.set_session(session)
|
44
44
|
yield(session)
|
45
45
|
rescue Mongo::Error::InvalidSession => ex
|
46
|
-
if
|
47
|
-
# Driver 2.13.0+
|
48
|
-
defined?(Mongo::Error::SessionsNotSupported) &&
|
49
|
-
Mongo::Error::SessionsNotSupported === ex ||
|
50
|
-
# Legacy drivers
|
51
|
-
ex.message == Mongo::Session::SESSIONS_NOT_SUPPORTED
|
52
|
-
then
|
46
|
+
if Mongo::Error::SessionsNotSupported === ex
|
53
47
|
raise Mongoid::Errors::InvalidSessionUse.new(:sessions_not_supported)
|
54
48
|
end
|
55
49
|
raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_use)
|
@@ -100,13 +94,7 @@ module Mongoid
|
|
100
94
|
Threaded.set_session(session)
|
101
95
|
yield(session)
|
102
96
|
rescue Mongo::Error::InvalidSession => ex
|
103
|
-
if
|
104
|
-
# Driver 2.13.0+
|
105
|
-
defined?(Mongo::Error::SessionsNotSupported) &&
|
106
|
-
Mongo::Error::SessionsNotSupported === ex ||
|
107
|
-
# Legacy drivers
|
108
|
-
ex.message == Mongo::Session::SESSIONS_NOT_SUPPORTED
|
109
|
-
then
|
97
|
+
if Mongo::Error::SessionsNotSupported === ex
|
110
98
|
raise Mongoid::Errors::InvalidSessionUse.new(:sessions_not_supported)
|
111
99
|
end
|
112
100
|
raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_use)
|
@@ -6,10 +6,7 @@ module Mongoid
|
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
8
|
included do
|
9
|
-
|
10
|
-
cattr_accessor :storage_options, instance_writer: false do
|
11
|
-
storage_options_defaults
|
12
|
-
end
|
9
|
+
class_attribute :storage_options, instance_writer: false, default: storage_options_defaults
|
13
10
|
end
|
14
11
|
|
15
12
|
module ClassMethods
|
@@ -49,7 +46,7 @@ module Mongoid
|
|
49
46
|
# @return [ Class ] The model class.
|
50
47
|
def store_in(options)
|
51
48
|
Validators::Storage.validate(self, options)
|
52
|
-
storage_options.merge
|
49
|
+
self.storage_options = self.storage_options.merge(options)
|
53
50
|
end
|
54
51
|
|
55
52
|
# Reset the store_in options
|
@@ -9,7 +9,7 @@ module Mongoid
|
|
9
9
|
extend self
|
10
10
|
|
11
11
|
# The valid options for storage.
|
12
|
-
VALID_OPTIONS = [ :collection, :database, :client ].freeze
|
12
|
+
VALID_OPTIONS = [ :collection, :collection_options, :database, :client ].freeze
|
13
13
|
|
14
14
|
# Validate the options provided to :store_in.
|
15
15
|
#
|
@@ -17,24 +17,12 @@ module Mongoid
|
|
17
17
|
# Storage.validate(:collection_name)
|
18
18
|
#
|
19
19
|
# @param [ Class ] klass The model class.
|
20
|
-
# @param [ Hash
|
20
|
+
# @param [ Hash | String | Symbol ] options The provided options.
|
21
21
|
def validate(klass, options)
|
22
22
|
valid_keys?(options) or raise Errors::InvalidStorageOptions.new(klass, options)
|
23
|
-
valid_parent?(klass) or raise Errors::InvalidStorageParent.new(klass)
|
24
23
|
end
|
25
24
|
|
26
25
|
private
|
27
|
-
# Determine if the current klass is valid to change store_in
|
28
|
-
# options
|
29
|
-
#
|
30
|
-
# @api private
|
31
|
-
#
|
32
|
-
# @param [ Class ] klass
|
33
|
-
#
|
34
|
-
# @return [ true, false ] If the class is valid
|
35
|
-
def valid_parent?(klass)
|
36
|
-
!klass.superclass.include?(Mongoid::Document)
|
37
|
-
end
|
38
26
|
|
39
27
|
# Determine if all keys in the options hash are valid.
|
40
28
|
#
|
@@ -45,7 +33,7 @@ module Mongoid
|
|
45
33
|
#
|
46
34
|
# @param [ Hash ] options The options hash.
|
47
35
|
#
|
48
|
-
# @return [ true
|
36
|
+
# @return [ true | false ] If all keys are valid.
|
49
37
|
def valid_keys?(options)
|
50
38
|
return false unless options.is_a?(::Hash)
|
51
39
|
options.keys.all? do |key|
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
|
5
|
+
# Encapsulates behavior around defining collections.
|
6
|
+
module CollectionConfigurable
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
# Create the collection for the called upon Mongoid model.
|
11
|
+
#
|
12
|
+
# This method does not re-create existing collections.
|
13
|
+
#
|
14
|
+
# If the document includes `store_in` macro with `collection_options` key,
|
15
|
+
# these options are used when creating the collection.
|
16
|
+
#
|
17
|
+
# @param [ true | false ] force If true, the method will drop existing
|
18
|
+
# collections before creating new ones. If false, the method will create
|
19
|
+
# only new collection (that do not exist in the database).
|
20
|
+
#
|
21
|
+
# @raise [ Errors::CreateCollectionFailure ] If collection creation failed.
|
22
|
+
# @raise [ Errors::DropCollectionFailure ] If an attempt to drop collection failed.
|
23
|
+
def create_collection(force: false)
|
24
|
+
if collection_name.empty?
|
25
|
+
# This is most probably an anonymous class, we ignore them.
|
26
|
+
return
|
27
|
+
end
|
28
|
+
if collection_name.match(/^system\./)
|
29
|
+
# We do not do anything with system collections.
|
30
|
+
return
|
31
|
+
end
|
32
|
+
if force
|
33
|
+
collection.drop
|
34
|
+
end
|
35
|
+
if coll_options = collection.database.list_collections(filter: { name: collection_name.to_s }).first
|
36
|
+
if force
|
37
|
+
raise Errors::DropCollectionFailure.new(collection_name)
|
38
|
+
else
|
39
|
+
logger.debug(
|
40
|
+
"MONGOID: Collection '#{collection_name}' already exists " +
|
41
|
+
"in database '#{database_name}' with options '#{coll_options}'."
|
42
|
+
)
|
43
|
+
end
|
44
|
+
else
|
45
|
+
begin
|
46
|
+
collection.database[collection_name, storage_options.fetch(:collection_options, {})].create
|
47
|
+
rescue Mongo::Error::OperationFailure => e
|
48
|
+
raise Errors::CreateCollectionFailure.new(
|
49
|
+
collection_name,
|
50
|
+
storage_options[:collection_options],
|
51
|
+
e
|
52
|
+
)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/mongoid/composable.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "mongoid/changeable"
|
4
|
+
require "mongoid/collection_configurable"
|
4
5
|
require "mongoid/findable"
|
5
6
|
require "mongoid/indexable"
|
6
7
|
require "mongoid/inspectable"
|
@@ -36,6 +37,7 @@ module Mongoid
|
|
36
37
|
include Atomic
|
37
38
|
include Changeable
|
38
39
|
include Clients
|
40
|
+
include CollectionConfigurable
|
39
41
|
include Attributes
|
40
42
|
include Evolvable
|
41
43
|
include Fields
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
module Config
|
5
|
+
|
6
|
+
# Encapsulates logic for loading defaults.
|
7
|
+
module Defaults
|
8
|
+
|
9
|
+
# Load the defaults for the feature flags in the given Mongoid version.
|
10
|
+
# Note that this method will load the *new* functionality introduced in
|
11
|
+
# the given Mongoid version.
|
12
|
+
#
|
13
|
+
# @param [ String | Float ] The version number as X.y.
|
14
|
+
#
|
15
|
+
# raises [ ArgumentError ] if an invalid version is given.
|
16
|
+
def load_defaults(version)
|
17
|
+
# Note that for 7.x, since all of the feature flag defaults have been
|
18
|
+
# flipped to the new functionality, all of the settings for those
|
19
|
+
# versions are to give old functionality. Because of this, it is
|
20
|
+
# possible to recurse to later version to get all of the options to
|
21
|
+
# turn off. Note that this won't be true when adding feature flags to
|
22
|
+
# 9.x, since the default will be the old functionality until the next
|
23
|
+
# major version is released. More likely, the recursion will have to go
|
24
|
+
# in the other direction (towards earlier versions).
|
25
|
+
|
26
|
+
case version.to_s
|
27
|
+
when "7.3"
|
28
|
+
# flags introduced in 7.4 - old functionality
|
29
|
+
self.broken_aggregables = true
|
30
|
+
self.broken_alias_handling = true
|
31
|
+
self.broken_and = true
|
32
|
+
self.broken_scoping = true
|
33
|
+
self.broken_updates = true
|
34
|
+
self.compare_time_by_ms = false
|
35
|
+
self.legacy_pluck_distinct = true
|
36
|
+
self.legacy_triple_equals = true
|
37
|
+
self.object_id_as_json_oid = true
|
38
|
+
|
39
|
+
load_defaults "7.4"
|
40
|
+
when "7.4"
|
41
|
+
# flags introduced in 7.5 - old functionality
|
42
|
+
self.legacy_attributes = true
|
43
|
+
self.overwrite_chained_operators = true
|
44
|
+
|
45
|
+
load_defaults "7.5"
|
46
|
+
when "7.5"
|
47
|
+
# flags introduced in 8.0 - old functionality
|
48
|
+
self.map_big_decimal_to_decimal128 = false
|
49
|
+
when "8.0"
|
50
|
+
# All flag defaults currently reflect 8.0 behavior.
|
51
|
+
when "8.1"
|
52
|
+
# flags introduced in 8.1 - new functionality
|
53
|
+
self.legacy_readonly = false
|
54
|
+
else
|
55
|
+
raise ArgumentError, "Unknown version: #{version}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -25,6 +25,8 @@ module Mongoid
|
|
25
25
|
# @param [ Hash ] options Extras for the option.
|
26
26
|
#
|
27
27
|
# @option options [ Object ] :default The default value.
|
28
|
+
# @option options [ Proc | nil ] :on_change The callback to invoke when the
|
29
|
+
# setter is invoked.
|
28
30
|
def option(name, options = {})
|
29
31
|
defaults[name] = settings[name] = options[:default]
|
30
32
|
|
@@ -38,6 +40,7 @@ module Mongoid
|
|
38
40
|
|
39
41
|
define_method("#{name}=") do |value|
|
40
42
|
settings[name] = value
|
43
|
+
options[:on_change]&.call(value)
|
41
44
|
end
|
42
45
|
|
43
46
|
define_method("#{name}?") do
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
module Config
|
5
|
+
module Validators
|
6
|
+
|
7
|
+
# Validator for async query executor configuration.
|
8
|
+
#
|
9
|
+
# @api private
|
10
|
+
module AsyncQueryExecutor
|
11
|
+
extend self
|
12
|
+
|
13
|
+
|
14
|
+
def validate(options)
|
15
|
+
if options.key?(:async_query_executor)
|
16
|
+
if options[:async_query_executor].to_sym == :immediate && !options[:global_executor_concurrency].nil?
|
17
|
+
raise Errors::InvalidGlobalExecutorConcurrency
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -37,7 +37,7 @@ module Mongoid
|
|
37
37
|
# @example Validate the client has database.
|
38
38
|
# validator.validate_client_database(:default, {})
|
39
39
|
#
|
40
|
-
# @param [ String
|
40
|
+
# @param [ String | Symbol ] name The config key.
|
41
41
|
# @param [ Hash ] config The configuration.
|
42
42
|
def validate_client_database(name, config)
|
43
43
|
if no_database_or_uri?(config)
|
@@ -52,7 +52,7 @@ module Mongoid
|
|
52
52
|
# @example Validate the client has hosts.
|
53
53
|
# validator.validate_client_hosts(:default, {})
|
54
54
|
#
|
55
|
-
# @param [ String
|
55
|
+
# @param [ String | Symbol ] name The config key.
|
56
56
|
# @param [ Hash ] config The configuration.
|
57
57
|
def validate_client_hosts(name, config)
|
58
58
|
if no_hosts_or_uri?(config)
|
@@ -68,7 +68,7 @@ module Mongoid
|
|
68
68
|
# @example Validate the uri and options.
|
69
69
|
# validator.validate_client_uri(:default, {})
|
70
70
|
#
|
71
|
-
# @param [ String
|
71
|
+
# @param [ String | Symbol ] name The config key.
|
72
72
|
# @param [ Hash ] config The configuration.
|
73
73
|
def validate_client_uri(name, config)
|
74
74
|
if both_uri_and_standard?(config)
|
@@ -86,7 +86,7 @@ module Mongoid
|
|
86
86
|
#
|
87
87
|
# @param [ Hash ] config The configuration options.
|
88
88
|
#
|
89
|
-
# @return [ true
|
89
|
+
# @return [ true | false ] If no database or uri is defined.
|
90
90
|
def no_database_or_uri?(config)
|
91
91
|
!config.has_key?(:database) && !config.has_key?(:uri)
|
92
92
|
end
|
@@ -101,7 +101,7 @@ module Mongoid
|
|
101
101
|
#
|
102
102
|
# @param [ Hash ] config The configuration options.
|
103
103
|
#
|
104
|
-
# @return [ true
|
104
|
+
# @return [ true | false ] If no hosts or uri is defined.
|
105
105
|
def no_hosts_or_uri?(config)
|
106
106
|
!config.has_key?(:hosts) && !config.has_key?(:uri)
|
107
107
|
end
|
@@ -116,7 +116,7 @@ module Mongoid
|
|
116
116
|
#
|
117
117
|
# @param [ Hash ] config The configuration options.
|
118
118
|
#
|
119
|
-
# @return [ true
|
119
|
+
# @return [ true | false ] If both standard and uri are defined.
|
120
120
|
def both_uri_and_standard?(config)
|
121
121
|
config.has_key?(:uri) && config.keys.any? do |key|
|
122
122
|
STANDARD.include?(key.to_sym)
|