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/scopable.rb
CHANGED
@@ -23,7 +23,7 @@ module Mongoid
|
|
23
23
|
# @example Apply the default scoping.
|
24
24
|
# document.apply_default_scoping
|
25
25
|
#
|
26
|
-
# @return [ true
|
26
|
+
# @return [ true | false ] If default scoping was applied.
|
27
27
|
def apply_default_scoping
|
28
28
|
if default_scoping
|
29
29
|
default_scoping.call.selector.each do |field, value|
|
@@ -74,7 +74,7 @@ module Mongoid
|
|
74
74
|
# default_scope ->{ where(active: true) }
|
75
75
|
# end
|
76
76
|
#
|
77
|
-
# @param [ Proc
|
77
|
+
# @param [ Proc | Criteria ] value The default scope.
|
78
78
|
#
|
79
79
|
# @raise [ Errors::InvalidScope ] If the scope is not a proc or criteria.
|
80
80
|
#
|
@@ -90,7 +90,7 @@ module Mongoid
|
|
90
90
|
# @example Can the default scope be applied?
|
91
91
|
# Band.default_scopable?
|
92
92
|
#
|
93
|
-
# @return [ true
|
93
|
+
# @return [ true | false ] If the default scope can be applied.
|
94
94
|
def default_scopable?
|
95
95
|
default_scoping? && !Threaded.without_default_scope?(self)
|
96
96
|
end
|
@@ -168,9 +168,11 @@ module Mongoid
|
|
168
168
|
# Band.where(name: "Depeche Mode")
|
169
169
|
# end
|
170
170
|
#
|
171
|
-
# @note This will force the default scope to be removed
|
171
|
+
# @note This will force the default scope to be removed, but will not
|
172
|
+
# remove scopes declared with ``.with_scope``. This will be changed
|
173
|
+
# in Mongoid 9.
|
172
174
|
#
|
173
|
-
# @return [ Criteria
|
175
|
+
# @return [ Criteria | Object ] The unscoped criteria or result of the
|
174
176
|
# block.
|
175
177
|
def unscoped
|
176
178
|
if block_given?
|
@@ -240,7 +242,7 @@ module Mongoid
|
|
240
242
|
# @example Warn or raise error if name exists.
|
241
243
|
# Model.valid_scope_name?("test")
|
242
244
|
#
|
243
|
-
# @param [ String
|
245
|
+
# @param [ String | Symbol ] name The name of the scope.
|
244
246
|
#
|
245
247
|
# @raise [ Errors::ScopeOverwrite ] If the name exists and configured to
|
246
248
|
# raise the error.
|
@@ -249,12 +251,12 @@ module Mongoid
|
|
249
251
|
if Mongoid.scope_overwrite_exception
|
250
252
|
raise Errors::ScopeOverwrite.new(self.name, name)
|
251
253
|
else
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
254
|
+
Mongoid.logger.warn(
|
255
|
+
"Creating scope :#{name} which conflicts with #{self.name}.#{name}. " +
|
256
|
+
"Calls to `Mongoid::Criteria##{name}` will delegate to " +
|
257
|
+
"`Mongoid::Criteria##{name}` for criteria with klass #{self.name} " +
|
258
|
+
"and will ignore the declared scope."
|
259
|
+
)
|
258
260
|
end
|
259
261
|
end
|
260
262
|
end
|
@@ -311,7 +313,7 @@ module Mongoid
|
|
311
313
|
# @example Process the default scope.
|
312
314
|
# Model.process_default_scope(value)
|
313
315
|
#
|
314
|
-
# @param [ Criteria
|
316
|
+
# @param [ Criteria | Proc ] value The default scope value.
|
315
317
|
def process_default_scope(value)
|
316
318
|
if existing = default_scoping
|
317
319
|
->{ existing.call.merge(value.to_proc.call) }
|
data/lib/mongoid/selectable.rb
CHANGED
@@ -15,8 +15,7 @@ module Mongoid
|
|
15
15
|
#
|
16
16
|
# @return [ Hash ] The document's selector.
|
17
17
|
def atomic_selector
|
18
|
-
|
19
|
-
(embedded? ? embedded_atomic_selector : root_atomic_selector_in_db)
|
18
|
+
embedded? ? embedded_atomic_selector : root_atomic_selector_in_db
|
20
19
|
end
|
21
20
|
|
22
21
|
private
|
data/lib/mongoid/serializable.rb
CHANGED
@@ -12,13 +12,13 @@ module Mongoid
|
|
12
12
|
included do
|
13
13
|
|
14
14
|
class << self
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
15
|
+
def include_root_in_json
|
16
|
+
@include_root_in_json.nil? ? ::Mongoid.include_root_in_json : @include_root_in_json
|
17
|
+
end
|
18
|
+
|
19
|
+
def include_root_in_json=(new_value)
|
20
|
+
@include_root_in_json = new_value
|
21
|
+
end
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -33,10 +33,14 @@ module Mongoid
|
|
33
33
|
#
|
34
34
|
# @param [ Hash ] options The options to pass.
|
35
35
|
#
|
36
|
-
# @option options [ Symbol
|
37
|
-
#
|
38
|
-
# @option options [ Symbol
|
39
|
-
#
|
36
|
+
# @option options [ Symbol | String | Array<Symbol | String> ] :except
|
37
|
+
# Do not include these field(s).
|
38
|
+
# @option options [ Symbol | String | Array<Symbol | String> ] :include
|
39
|
+
# Which association(s) to include.
|
40
|
+
# @option options [ Symbol | String | Array<Symbol | String> ] :only
|
41
|
+
# Limit the field(s) to only these.
|
42
|
+
# @option options [ Symbol | String | Array<Symbol | String> ] :methods
|
43
|
+
# What methods to include.
|
40
44
|
#
|
41
45
|
# @return [ Hash ] The document, ready to be serialized.
|
42
46
|
def serializable_hash(options = nil)
|
@@ -137,7 +141,7 @@ module Mongoid
|
|
137
141
|
# @example Get the association names.
|
138
142
|
# document.relation_names(:include => [ :addresses ])
|
139
143
|
#
|
140
|
-
# @param [ Hash
|
144
|
+
# @param [ Hash | Symbol | Array<Symbol> ] inclusions The inclusions.
|
141
145
|
#
|
142
146
|
# @return [ Array<Symbol> ] The names of the included associations.
|
143
147
|
def relation_names(inclusions)
|
@@ -150,7 +154,7 @@ module Mongoid
|
|
150
154
|
# @example Get the association options.
|
151
155
|
# document.relation_names(:include => [ :addresses ])
|
152
156
|
#
|
153
|
-
# @param [ Hash
|
157
|
+
# @param [ Hash | Symbol | Array<Symbol> ] inclusions The inclusions.
|
154
158
|
# @param [ Hash ] options The options.
|
155
159
|
# @param [ Symbol ] name The name of the association.
|
156
160
|
#
|
data/lib/mongoid/stateful.rb
CHANGED
@@ -6,7 +6,15 @@ module Mongoid
|
|
6
6
|
# document can transition through.
|
7
7
|
module Stateful
|
8
8
|
|
9
|
-
attr_writer :destroyed, :flagged_for_destroy, :
|
9
|
+
attr_writer :destroyed, :flagged_for_destroy, :previously_new_record
|
10
|
+
|
11
|
+
def new_record=(new_value)
|
12
|
+
@new_record ||= false
|
13
|
+
if @new_record && !new_value
|
14
|
+
@previously_new_record = true
|
15
|
+
end
|
16
|
+
@new_record = new_value
|
17
|
+
end
|
10
18
|
|
11
19
|
# Returns true if the +Document+ has not been persisted to the database,
|
12
20
|
# false if it has. This is determined by the variable @new_record
|
@@ -15,29 +23,47 @@ module Mongoid
|
|
15
23
|
# @example Is the document new?
|
16
24
|
# person.new_record?
|
17
25
|
#
|
18
|
-
# @return [ true
|
26
|
+
# @return [ true | false ] True if new, false if not.
|
19
27
|
def new_record?
|
20
28
|
@new_record ||= false
|
21
29
|
end
|
22
30
|
|
31
|
+
# Returns true if this document was just created -- that is, prior to the last
|
32
|
+
# save, the object didn't exist in the database and new_record? would have
|
33
|
+
# returned true.
|
34
|
+
#
|
35
|
+
# @return [ true | false ] True if was just created, false if not.
|
36
|
+
def previously_new_record?
|
37
|
+
@previously_new_record ||= false
|
38
|
+
end
|
39
|
+
|
23
40
|
# Checks if the document has been saved to the database. Returns false
|
24
41
|
# if the document has been destroyed.
|
25
42
|
#
|
26
43
|
# @example Is the document persisted?
|
27
44
|
# person.persisted?
|
28
45
|
#
|
29
|
-
# @return [ true
|
46
|
+
# @return [ true | false ] True if persisted, false if not.
|
30
47
|
def persisted?
|
31
48
|
!new_record? && !destroyed?
|
32
49
|
end
|
33
50
|
|
51
|
+
# Checks if the document was previously saved to the database
|
52
|
+
# but now it has been deleted.
|
53
|
+
#
|
54
|
+
# @return [ true | false ] True if was persisted but now destroyed,
|
55
|
+
# otherwise false.
|
56
|
+
def previously_persisted?
|
57
|
+
!new_record? && destroyed?
|
58
|
+
end
|
59
|
+
|
34
60
|
# Returns whether or not the document has been flagged for deletion, but
|
35
61
|
# not destroyed yet. Used for atomic pulls of child documents.
|
36
62
|
#
|
37
63
|
# @example Is the document flagged?
|
38
64
|
# document.flagged_for_destroy?
|
39
65
|
#
|
40
|
-
# @return [ true
|
66
|
+
# @return [ true | false ] If the document is flagged.
|
41
67
|
def flagged_for_destroy?
|
42
68
|
@flagged_for_destroy ||= false
|
43
69
|
end
|
@@ -51,7 +77,7 @@ module Mongoid
|
|
51
77
|
# @example Is the document destroyed?
|
52
78
|
# person.destroyed?
|
53
79
|
#
|
54
|
-
# @return [ true
|
80
|
+
# @return [ true | false ] True if destroyed, false if not.
|
55
81
|
def destroyed?
|
56
82
|
@destroyed ||= false
|
57
83
|
end
|
@@ -61,7 +87,7 @@ module Mongoid
|
|
61
87
|
# @example Is this pushable?
|
62
88
|
# person.pushable?
|
63
89
|
#
|
64
|
-
# @return [ true
|
90
|
+
# @return [ true | false ] Is the document new and embedded?
|
65
91
|
def pushable?
|
66
92
|
new_record? &&
|
67
93
|
embedded_many? &&
|
@@ -69,14 +95,35 @@ module Mongoid
|
|
69
95
|
!_parent.delayed_atomic_sets[atomic_path]
|
70
96
|
end
|
71
97
|
|
98
|
+
# Flags the document as readonly. Will cause a ReadonlyDocument error to be
|
99
|
+
# raised if the document is attempted to be saved, updated or destroyed.
|
100
|
+
#
|
101
|
+
# @example Flag the document as readonly.
|
102
|
+
# document.readonly!
|
103
|
+
#
|
104
|
+
# @return [ true | false ] true if the document was successfully marked
|
105
|
+
# readonly, false otherwise.
|
106
|
+
def readonly!
|
107
|
+
if Mongoid.legacy_readonly
|
108
|
+
Mongoid::Warnings.warn_legacy_readonly
|
109
|
+
false
|
110
|
+
else
|
111
|
+
@readonly = true
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
72
115
|
# Is the document readonly?
|
73
116
|
#
|
74
117
|
# @example Is the document readonly?
|
75
118
|
# document.readonly?
|
76
119
|
#
|
77
|
-
# @return [ true
|
120
|
+
# @return [ true | false ] If the document is readonly.
|
78
121
|
def readonly?
|
79
|
-
|
122
|
+
if Mongoid.legacy_readonly
|
123
|
+
__selected_fields != nil
|
124
|
+
else
|
125
|
+
@readonly ||= false
|
126
|
+
end
|
80
127
|
end
|
81
128
|
|
82
129
|
# Determine if the document can be set.
|
@@ -84,7 +131,7 @@ module Mongoid
|
|
84
131
|
# @example Is this settable?
|
85
132
|
# person.settable?
|
86
133
|
#
|
87
|
-
# @return [ true
|
134
|
+
# @return [ true | false ] Is this document a new embeds one?
|
88
135
|
def settable?
|
89
136
|
new_record? && embedded_one? && _parent.persisted?
|
90
137
|
end
|
@@ -94,7 +141,7 @@ module Mongoid
|
|
94
141
|
# @example Is the document updateable?
|
95
142
|
# person.updateable?
|
96
143
|
#
|
97
|
-
# @return [ true
|
144
|
+
# @return [ true | false ] If the document is changed and persisted.
|
98
145
|
def updateable?
|
99
146
|
persisted? && changed?
|
100
147
|
end
|
@@ -5,6 +5,11 @@ namespace :db do
|
|
5
5
|
task :load_models do
|
6
6
|
end
|
7
7
|
|
8
|
+
desc "Create collections for Mongoid models"
|
9
|
+
task :create_collections => [:environment, :load_models] do
|
10
|
+
::Mongoid::Tasks::Database.create_collections
|
11
|
+
end
|
12
|
+
|
8
13
|
desc "Create indexes specified in Mongoid models"
|
9
14
|
task :create_indexes => [:environment, :load_models] do
|
10
15
|
::Mongoid::Tasks::Database.create_indexes
|
@@ -34,5 +39,12 @@ namespace :db do
|
|
34
39
|
task :purge => :environment do
|
35
40
|
::Mongoid.purge!
|
36
41
|
end
|
42
|
+
|
43
|
+
namespace :create_collections do
|
44
|
+
desc "Drop and create collections for Mongoid models"
|
45
|
+
task :force => [:environment, :load_models] do
|
46
|
+
::Mongoid::Tasks::Database.create_collections(force: true)
|
47
|
+
end
|
48
|
+
end
|
37
49
|
end
|
38
50
|
end
|
@@ -5,6 +5,26 @@ module Mongoid
|
|
5
5
|
module Database
|
6
6
|
extend self
|
7
7
|
|
8
|
+
# Create collections for each model given the provided globs and the class is
|
9
|
+
# not embedded.
|
10
|
+
#
|
11
|
+
# @param [ Array<Mongoid::Document> ] models. Array of document classes for
|
12
|
+
# which collections should be created. Defaulted to all document classes
|
13
|
+
# in the application.
|
14
|
+
# @param [ true | false ] force If true, the method will drop existing
|
15
|
+
# collections before creating new ones. If false, the method will create
|
16
|
+
# only new collection (that do not exist in the database).
|
17
|
+
def create_collections(models = ::Mongoid.models, force: false)
|
18
|
+
models.each do |model|
|
19
|
+
if !model.embedded? || model.cyclic?
|
20
|
+
model.create_collection(force: force)
|
21
|
+
logger.info("MONGOID: Created collection for #{model}:")
|
22
|
+
else
|
23
|
+
logger.info("MONGOID: collection options ignored on: #{model}, please define in the root model.")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
8
28
|
# Create indexes for each model given the provided globs and the class is
|
9
29
|
# not embedded.
|
10
30
|
#
|
@@ -36,7 +56,6 @@ module Mongoid
|
|
36
56
|
# Mongoid::Tasks::Database.undefined_indexes
|
37
57
|
#
|
38
58
|
# @return [ Array<Hash> ] The list of undefined indexes by model.
|
39
|
-
#
|
40
59
|
def undefined_indexes(models = ::Mongoid.models)
|
41
60
|
undefined_by_model = {}
|
42
61
|
|
@@ -90,7 +109,6 @@ module Mongoid
|
|
90
109
|
# Mongoid::Tasks::Database.remove_indexes
|
91
110
|
#
|
92
111
|
# @return [ Array<Class> ] The un-indexed models.
|
93
|
-
#
|
94
112
|
def remove_indexes(models = ::Mongoid.models)
|
95
113
|
models.each do |model|
|
96
114
|
next if model.embedded?
|
@@ -37,7 +37,7 @@ module Mongoid
|
|
37
37
|
# @example Is the current thread in assigning mode?
|
38
38
|
# proxy._assigning?
|
39
39
|
#
|
40
|
-
# @return [ true
|
40
|
+
# @return [ true | false ] If the thread is assigning.
|
41
41
|
def _assigning?
|
42
42
|
Threaded.executing?(ASSIGN)
|
43
43
|
end
|
@@ -62,7 +62,7 @@ module Mongoid
|
|
62
62
|
# @example Is the current thread in binding mode?
|
63
63
|
# proxy.binding?
|
64
64
|
#
|
65
|
-
# @return [ true
|
65
|
+
# @return [ true | false ] If the thread is binding.
|
66
66
|
def _binding?
|
67
67
|
Threaded.executing?(BIND)
|
68
68
|
end
|
@@ -87,7 +87,7 @@ module Mongoid
|
|
87
87
|
# @example Is the current thread in building mode?
|
88
88
|
# proxy._building?
|
89
89
|
#
|
90
|
-
# @return [ true
|
90
|
+
# @return [ true | false ] If the thread is building.
|
91
91
|
def _building?
|
92
92
|
Threaded.executing?(BUILD)
|
93
93
|
end
|
@@ -97,7 +97,7 @@ module Mongoid
|
|
97
97
|
# @example Is the current thread in creating mode?
|
98
98
|
# proxy.creating?
|
99
99
|
#
|
100
|
-
# @return [ true
|
100
|
+
# @return [ true | false ] If the thread is creating.
|
101
101
|
def _creating?
|
102
102
|
Threaded.executing?(CREATE)
|
103
103
|
end
|
@@ -122,7 +122,7 @@ module Mongoid
|
|
122
122
|
# @example Is the current thread in loading mode?
|
123
123
|
# proxy._loading?
|
124
124
|
#
|
125
|
-
# @return [ true
|
125
|
+
# @return [ true | false ] If the thread is loading.
|
126
126
|
def _loading?
|
127
127
|
Threaded.executing?(LOAD)
|
128
128
|
end
|
data/lib/mongoid/threaded.rb
CHANGED
@@ -26,6 +26,10 @@ module Mongoid
|
|
26
26
|
hash[key] = "[mongoid]:#{key}-stack"
|
27
27
|
end
|
28
28
|
|
29
|
+
# The key storing the default value for whether or not callbacks are
|
30
|
+
# executed on documents.
|
31
|
+
EXECUTE_CALLBACKS = '[mongoid]:execute-callbacks'
|
32
|
+
|
29
33
|
extend self
|
30
34
|
|
31
35
|
# Begin entry into a named thread local stack.
|
@@ -45,7 +49,7 @@ module Mongoid
|
|
45
49
|
# @example Get the global database override.
|
46
50
|
# Threaded.database_override
|
47
51
|
#
|
48
|
-
# @return [ String
|
52
|
+
# @return [ String | Symbol ] The override.
|
49
53
|
def database_override
|
50
54
|
Thread.current[DATABASE_OVERRIDE_KEY]
|
51
55
|
end
|
@@ -55,9 +59,9 @@ module Mongoid
|
|
55
59
|
# @example Set the global database override.
|
56
60
|
# Threaded.database_override = :testing
|
57
61
|
#
|
58
|
-
# @param [ String
|
62
|
+
# @param [ String | Symbol ] name The global override name.
|
59
63
|
#
|
60
|
-
# @return [ String
|
64
|
+
# @return [ String | Symbol ] The override.
|
61
65
|
def database_override=(name)
|
62
66
|
Thread.current[DATABASE_OVERRIDE_KEY] = name
|
63
67
|
end
|
@@ -167,7 +171,7 @@ module Mongoid
|
|
167
171
|
# @example Get the global client override.
|
168
172
|
# Threaded.client_override
|
169
173
|
#
|
170
|
-
# @return [ String
|
174
|
+
# @return [ String | Symbol ] The override.
|
171
175
|
def client_override
|
172
176
|
Thread.current[CLIENT_OVERRIDE_KEY]
|
173
177
|
end
|
@@ -177,9 +181,9 @@ module Mongoid
|
|
177
181
|
# @example Set the global client override.
|
178
182
|
# Threaded.client_override = :testing
|
179
183
|
#
|
180
|
-
# @param [ String
|
184
|
+
# @param [ String | Symbol ] name The global override name.
|
181
185
|
#
|
182
|
-
# @return [ String
|
186
|
+
# @return [ String | Symbol ] The override.
|
183
187
|
def client_override=(name)
|
184
188
|
Thread.current[CLIENT_OVERRIDE_KEY] = name
|
185
189
|
end
|
@@ -255,7 +259,7 @@ module Mongoid
|
|
255
259
|
#
|
256
260
|
# @param [ Document ] document The document to check.
|
257
261
|
#
|
258
|
-
# @return [ true
|
262
|
+
# @return [ true | false ] If the document is autosaved.
|
259
263
|
def autosaved?(document)
|
260
264
|
autosaves_for(document.class).include?(document._id)
|
261
265
|
end
|
@@ -267,7 +271,7 @@ module Mongoid
|
|
267
271
|
#
|
268
272
|
# @param [ Document ] document The document to check.
|
269
273
|
#
|
270
|
-
# @return [ true
|
274
|
+
# @return [ true | false ] If the document is validated.
|
271
275
|
def validated?(document)
|
272
276
|
validations_for(document.class).include?(document._id)
|
273
277
|
end
|
@@ -322,7 +326,7 @@ module Mongoid
|
|
322
326
|
#
|
323
327
|
# @param [ Mongo::Session ] session The session to save.
|
324
328
|
def set_session(session)
|
325
|
-
Thread.current[:session] = session
|
329
|
+
Thread.current["[mongoid]:session"] = session
|
326
330
|
end
|
327
331
|
|
328
332
|
# Get the cached session for this thread.
|
@@ -330,9 +334,9 @@ module Mongoid
|
|
330
334
|
# @example Get the session for this thread.
|
331
335
|
# Threaded.get_session
|
332
336
|
#
|
333
|
-
# @return [ Mongo::Session
|
337
|
+
# @return [ Mongo::Session | nil ] The session cached on this thread or nil.
|
334
338
|
def get_session
|
335
|
-
Thread.current[:session]
|
339
|
+
Thread.current["[mongoid]:session"]
|
336
340
|
end
|
337
341
|
|
338
342
|
# Clear the cached session for this thread.
|
@@ -344,7 +348,33 @@ module Mongoid
|
|
344
348
|
def clear_session
|
345
349
|
session = get_session
|
346
350
|
session.end_session if session
|
347
|
-
Thread.current[:session] = nil
|
351
|
+
Thread.current["[mongoid]:session"] = nil
|
352
|
+
end
|
353
|
+
|
354
|
+
# Queries whether document callbacks should be executed by default for the
|
355
|
+
# current thread.
|
356
|
+
#
|
357
|
+
# Unless otherwise indicated (by #execute_callbacks=), this will return
|
358
|
+
# true.
|
359
|
+
#
|
360
|
+
# @return [ true | false ] Whether or not document callbacks should be
|
361
|
+
# executed by default.
|
362
|
+
def execute_callbacks?
|
363
|
+
if Thread.current.key?(EXECUTE_CALLBACKS)
|
364
|
+
Thread.current[EXECUTE_CALLBACKS]
|
365
|
+
else
|
366
|
+
true
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
370
|
+
# Indicates whether document callbacks should be invoked by default for
|
371
|
+
# the current thread. Individual documents may further override the
|
372
|
+
# callback behavior, but this will be used for the default behavior.
|
373
|
+
#
|
374
|
+
# @param flag [ true | false ] Whether or not document callbacks should be
|
375
|
+
# executed by default.
|
376
|
+
def execute_callbacks=(flag)
|
377
|
+
Thread.current[EXECUTE_CALLBACKS] = flag
|
348
378
|
end
|
349
379
|
end
|
350
380
|
end
|
@@ -22,13 +22,20 @@ module Mongoid
|
|
22
22
|
# @example Set the created at time.
|
23
23
|
# person.set_created_at
|
24
24
|
def set_created_at
|
25
|
-
if
|
26
|
-
time = Time.now
|
25
|
+
if able_to_set_created_at?
|
26
|
+
time = Time.configured.now
|
27
27
|
self.updated_at = time if is_a?(Updated) && !updated_at_changed?
|
28
28
|
self.created_at = time
|
29
29
|
end
|
30
30
|
clear_timeless_option
|
31
31
|
end
|
32
|
+
|
33
|
+
# Is the created timestamp able to be set?
|
34
|
+
#
|
35
|
+
# @return [ true, false ] If the timestamp can be set.
|
36
|
+
def able_to_set_created_at?
|
37
|
+
!frozen? && !timeless? && !created_at
|
38
|
+
end
|
32
39
|
end
|
33
40
|
end
|
34
41
|
end
|
@@ -24,7 +24,7 @@ module Mongoid
|
|
24
24
|
# person.set_updated_at
|
25
25
|
def set_updated_at
|
26
26
|
if able_to_set_updated_at?
|
27
|
-
self.updated_at = Time.now
|
27
|
+
self.updated_at = Time.configured.now unless updated_at_changed?
|
28
28
|
end
|
29
29
|
|
30
30
|
clear_timeless_option
|
@@ -35,7 +35,7 @@ module Mongoid
|
|
35
35
|
# @example Can the timestamp be set?
|
36
36
|
# document.able_to_set_updated_at?
|
37
37
|
#
|
38
|
-
# @return [ true
|
38
|
+
# @return [ true | false ] If the timestamp can be set.
|
39
39
|
def able_to_set_updated_at?
|
40
40
|
!frozen? && !timeless? && (new_record? || changed?)
|
41
41
|
end
|
data/lib/mongoid/touchable.rb
CHANGED
@@ -19,13 +19,13 @@ module Mongoid
|
|
19
19
|
#
|
20
20
|
# @param [ Symbol ] field The name of an additional field to update.
|
21
21
|
#
|
22
|
-
# @return [ true/false ] false if
|
22
|
+
# @return [ true/false ] false if document is new_record otherwise true.
|
23
23
|
def touch(field = nil)
|
24
24
|
return false if _root.new_record?
|
25
|
-
current = Time.now
|
25
|
+
current = Time.configured.now
|
26
26
|
field = database_field_name(field)
|
27
27
|
write_attribute(:updated_at, current) if respond_to?("updated_at=")
|
28
|
-
write_attribute(field, current) if field
|
28
|
+
write_attribute(field, current) if field.present?
|
29
29
|
|
30
30
|
# If the document being touched is embedded, touch its parents
|
31
31
|
# all the way through the composition hierarchy to the root object,
|
@@ -60,7 +60,6 @@ module Mongoid
|
|
60
60
|
|
61
61
|
# Callbacks are invoked on the composition root first and on the
|
62
62
|
# leaf-most embedded document last.
|
63
|
-
# TODO add tests, see MONGOID-5015.
|
64
63
|
run_callbacks(:touch)
|
65
64
|
true
|
66
65
|
end
|
data/lib/mongoid/traversable.rb
CHANGED
@@ -7,6 +7,29 @@ module Mongoid
|
|
7
7
|
# Provides behavior around traversing the document graph.
|
8
8
|
module Traversable
|
9
9
|
extend ActiveSupport::Concern
|
10
|
+
# This code is extracted from ActiveSupport so that we do not depend on
|
11
|
+
# their private API that may change at any time.
|
12
|
+
# This code should be reviewed and maybe removed when implementing
|
13
|
+
# https://jira.mongodb.org/browse/MONGOID-5832
|
14
|
+
class << self
|
15
|
+
# @api private
|
16
|
+
def __redefine(owner, name, value)
|
17
|
+
if owner.singleton_class?
|
18
|
+
owner.redefine_method(name) { value }
|
19
|
+
owner.send(:public, name)
|
20
|
+
end
|
21
|
+
owner.redefine_singleton_method(name) { value }
|
22
|
+
owner.singleton_class.send(:public, name)
|
23
|
+
owner.redefine_singleton_method("#{name}=") do |new_value|
|
24
|
+
if owner.equal?(self)
|
25
|
+
value = new_value
|
26
|
+
else
|
27
|
+
::Mongoid::Traversable.redefine(self, name, new_value)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
owner.singleton_class.send(:public, "#{name}=")
|
31
|
+
end
|
32
|
+
end
|
10
33
|
|
11
34
|
def _parent
|
12
35
|
@__parent ||= nil
|
@@ -30,7 +53,7 @@ module Mongoid
|
|
30
53
|
if value
|
31
54
|
Mongoid::Fields::Validators::Macro.validate_field_name(self, value)
|
32
55
|
value = value.to_s
|
33
|
-
|
56
|
+
::Mongoid::Traversable.__redefine(self, 'discriminator_key', value)
|
34
57
|
else
|
35
58
|
# When discriminator key is set to nil, replace the class's definition
|
36
59
|
# of the discriminator key reader (provided by class_attribute earlier)
|
@@ -203,7 +226,7 @@ module Mongoid
|
|
203
226
|
# @example Check if the document is a subclass
|
204
227
|
# Square.new.hereditary?
|
205
228
|
#
|
206
|
-
# @return [ true
|
229
|
+
# @return [ true | false ] True if hereditary, false if not.
|
207
230
|
def hereditary?
|
208
231
|
self.class.hereditary?
|
209
232
|
end
|
@@ -233,10 +256,11 @@ module Mongoid
|
|
233
256
|
def remove_child(child)
|
234
257
|
name = child.association_name
|
235
258
|
if child.embedded_one?
|
259
|
+
self.attributes.delete(child._association.store_as)
|
236
260
|
remove_ivar(name)
|
237
261
|
else
|
238
262
|
relation = send(name)
|
239
|
-
relation.
|
263
|
+
relation._remove(child)
|
240
264
|
end
|
241
265
|
end
|
242
266
|
|
@@ -282,7 +306,7 @@ module Mongoid
|
|
282
306
|
# @example Is the document the root?
|
283
307
|
# document._root?
|
284
308
|
#
|
285
|
-
# @return [ true
|
309
|
+
# @return [ true | false ] If the document is the root.
|
286
310
|
def _root?
|
287
311
|
_parent ? false : true
|
288
312
|
end
|
@@ -294,11 +318,23 @@ module Mongoid
|
|
294
318
|
# @example Check if the document is a subclass.
|
295
319
|
# Square.hereditary?
|
296
320
|
#
|
297
|
-
# @return [ true
|
321
|
+
# @return [ true | false ] True if hereditary, false if not.
|
298
322
|
def hereditary?
|
299
323
|
!!(Mongoid::Document > superclass)
|
300
324
|
end
|
301
325
|
|
326
|
+
# Returns the root class of the STI tree that the current
|
327
|
+
# class participates in. If the class is not an STI subclass, this
|
328
|
+
# returns the class itself.
|
329
|
+
#
|
330
|
+
# @return [ Mongoid::Document ] the root of the STI tree
|
331
|
+
def root_class
|
332
|
+
root = self
|
333
|
+
root = root.superclass while root.hereditary?
|
334
|
+
|
335
|
+
root
|
336
|
+
end
|
337
|
+
|
302
338
|
# When inheriting, we want to copy the fields from the parent class and
|
303
339
|
# set the on the child to start, mimicking the behavior of the old
|
304
340
|
# class_inheritable_accessor that was deprecated in Rails edge.
|