mongoid 7.5.1 → 8.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +3 -3
- data/README.md +6 -6
- data/Rakefile +25 -0
- data/lib/config/locales/en.yml +92 -43
- data/lib/mongoid/association/accessors.rb +40 -11
- data/lib/mongoid/association/bindable.rb +50 -2
- data/lib/mongoid/association/builders.rb +5 -3
- data/lib/mongoid/association/constrainable.rb +0 -1
- data/lib/mongoid/association/eager_loadable.rb +29 -7
- data/lib/mongoid/association/embedded/batchable.rb +54 -14
- 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 +69 -45
- 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 +29 -19
- 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/paths/embedded/many.rb +19 -0
- data/lib/mongoid/atomic.rb +7 -0
- data/lib/mongoid/attributes/dynamic.rb +4 -4
- data/lib/mongoid/attributes/nested.rb +6 -6
- data/lib/mongoid/attributes/processing.rb +37 -6
- data/lib/mongoid/attributes/projector.rb +2 -2
- data/lib/mongoid/attributes/readonly.rb +3 -3
- data/lib/mongoid/attributes.rb +51 -42
- data/lib/mongoid/cacheable.rb +2 -2
- 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 +145 -17
- 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 +521 -333
- 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 +1 -9
- data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
- data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
- data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
- data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
- data/lib/mongoid/criteria/queryable/key.rb +4 -4
- data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
- data/lib/mongoid/criteria/queryable/optional.rb +11 -17
- data/lib/mongoid/criteria/queryable/options.rb +2 -2
- data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
- data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
- data/lib/mongoid/criteria/queryable/selector.rb +93 -8
- data/lib/mongoid/criteria/queryable/smash.rb +40 -7
- data/lib/mongoid/criteria/queryable/storable.rb +1 -1
- 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 +36 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +135 -36
- data/lib/mongoid/equality.rb +8 -8
- data/lib/mongoid/errors/create_collection_failure.rb +33 -0
- data/lib/mongoid/errors/document_not_found.rb +10 -6
- data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
- data/lib/mongoid/errors/immutable_attribute.rb +26 -0
- data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
- data/lib/mongoid/errors/invalid_config_option.rb +1 -1
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_field.rb +6 -2
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
- data/lib/mongoid/errors/invalid_relation.rb +1 -1
- data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
- data/lib/mongoid/errors/invalid_session_use.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
- data/lib/mongoid/errors/mongoid_error.rb +3 -3
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
- data/lib/mongoid/errors/no_client_database.rb +1 -1
- data/lib/mongoid/errors/no_client_hosts.rb +1 -1
- data/lib/mongoid/errors/readonly_attribute.rb +1 -1
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
- data/lib/mongoid/errors/unknown_attribute.rb +1 -1
- data/lib/mongoid/errors.rb +6 -3
- data/lib/mongoid/extensions/array.rb +9 -7
- data/lib/mongoid/extensions/big_decimal.rb +33 -10
- data/lib/mongoid/extensions/binary.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +8 -2
- data/lib/mongoid/extensions/date.rb +26 -20
- data/lib/mongoid/extensions/date_time.rb +1 -1
- data/lib/mongoid/extensions/false_class.rb +1 -1
- data/lib/mongoid/extensions/float.rb +7 -4
- data/lib/mongoid/extensions/hash.rb +19 -8
- 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 +129 -20
- 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 +76 -15
- 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 +33 -13
- 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 +63 -10
- 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 +10 -6
- data/lib/mongoid/shardable.rb +35 -11
- data/lib/mongoid/stateful.rb +57 -10
- data/lib/mongoid/tasks/database.rake +12 -0
- data/lib/mongoid/tasks/database.rb +20 -2
- data/lib/mongoid/threaded/lifecycle.rb +5 -5
- data/lib/mongoid/threaded.rb +42 -12
- data/lib/mongoid/timestamps/created.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +2 -2
- data/lib/mongoid/touchable.rb +2 -3
- data/lib/mongoid/traversable.rb +5 -4
- data/lib/mongoid/utils.rb +22 -0
- 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 +9 -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 +10 -14
- 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 +21 -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 +360 -4
- data/spec/integration/criteria/range_spec.rb +95 -1
- data/spec/integration/discriminator_key_spec.rb +118 -80
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/i18n_fallbacks_spec.rb +3 -32
- data/spec/integration/matcher_examples_spec.rb +20 -13
- data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
- data/spec/integration/matcher_operator_spec.rb +3 -5
- data/spec/integration/persistence/range_field_spec.rb +350 -0
- data/spec/mongoid/association/counter_cache_spec.rb +1 -1
- data/spec/mongoid/association/depending_spec.rb +9 -9
- data/spec/mongoid/association/eager_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +276 -65
- data/spec/mongoid/association/embedded/embeds_many_models.rb +158 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -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 +15 -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 +215 -228
- 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 +193 -177
- data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
- data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
- data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
- data/spec/mongoid/association/syncable_spec.rb +15 -1
- data/spec/mongoid/atomic/paths_spec.rb +0 -14
- data/spec/mongoid/attributes/nested_spec.rb +80 -11
- data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
- data/spec/mongoid/attributes/projector_spec.rb +1 -5
- data/spec/mongoid/attributes_spec.rb +554 -33
- data/spec/mongoid/cacheable_spec.rb +3 -3
- 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 +179 -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 +220 -30
- 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 +1570 -413
- data/spec/mongoid/contextual/none_spec.rb +60 -21
- data/spec/mongoid/copyable_spec.rb +453 -11
- data/spec/mongoid/criteria/findable_spec.rb +86 -210
- data/spec/mongoid/criteria/includable_spec.rb +1492 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
- data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
- data/spec/mongoid/criteria/queryable/selector_spec.rb +90 -5
- data/spec/mongoid/criteria/queryable/storable_spec.rb +72 -0
- data/spec/mongoid/criteria/translator_spec.rb +132 -0
- data/spec/mongoid/criteria_projection_spec.rb +1 -5
- data/spec/mongoid/criteria_spec.rb +469 -1205
- data/spec/mongoid/document_fields_spec.rb +173 -24
- data/spec/mongoid/document_spec.rb +32 -41
- data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
- data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
- data/spec/mongoid/extensions/array_spec.rb +16 -2
- data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
- data/spec/mongoid/extensions/binary_spec.rb +44 -9
- data/spec/mongoid/extensions/boolean_spec.rb +68 -82
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
- data/spec/mongoid/extensions/date_spec.rb +71 -1
- data/spec/mongoid/extensions/date_time_spec.rb +15 -9
- data/spec/mongoid/extensions/float_spec.rb +53 -74
- data/spec/mongoid/extensions/hash_spec.rb +33 -3
- data/spec/mongoid/extensions/integer_spec.rb +50 -64
- data/spec/mongoid/extensions/range_spec.rb +255 -54
- data/spec/mongoid/extensions/regexp_spec.rb +58 -33
- data/spec/mongoid/extensions/set_spec.rb +106 -0
- data/spec/mongoid/extensions/string_spec.rb +53 -25
- data/spec/mongoid/extensions/symbol_spec.rb +18 -25
- data/spec/mongoid/extensions/time_spec.rb +639 -106
- data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
- data/spec/mongoid/factory_spec.rb +61 -1
- data/spec/mongoid/fields/localized_spec.rb +80 -37
- data/spec/mongoid/fields_spec.rb +500 -84
- 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 +599 -8
- data/spec/mongoid/interceptable_spec_models.rb +235 -4
- data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
- data/spec/mongoid/mongoizable_spec.rb +285 -0
- data/spec/mongoid/persistable/creatable_spec.rb +2 -2
- data/spec/mongoid/persistable/deletable_spec.rb +28 -8
- data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
- data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
- data/spec/mongoid/persistable/logical_spec.rb +37 -0
- data/spec/mongoid/persistable/poppable_spec.rb +36 -0
- data/spec/mongoid/persistable/pullable_spec.rb +72 -0
- data/spec/mongoid/persistable/pushable_spec.rb +72 -0
- data/spec/mongoid/persistable/renamable_spec.rb +36 -0
- data/spec/mongoid/persistable/savable_spec.rb +96 -0
- data/spec/mongoid/persistable/settable_spec.rb +37 -0
- data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
- data/spec/mongoid/persistable/updatable_spec.rb +20 -28
- data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
- data/spec/mongoid/persistence_context_spec.rb +57 -58
- 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 +9 -30
- data/spec/mongoid/shardable_models.rb +14 -0
- data/spec/mongoid/shardable_spec.rb +157 -51
- data/spec/mongoid/stateful_spec.rb +150 -8
- data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
- data/spec/mongoid/tasks/database_spec.rb +127 -0
- data/spec/mongoid/timestamps_spec.rb +392 -4
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +390 -2
- data/spec/mongoid/touchable_spec_models.rb +14 -8
- data/spec/mongoid/traversable_spec.rb +13 -35
- data/spec/mongoid/validatable/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 -10
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
- data/spec/rails/mongoid_spec.rb +4 -16
- data/spec/shared/lib/mrss/lite_constraints.rb +8 -0
- data/spec/shared/shlib/server.sh +5 -5
- 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 +4 -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/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
- data.tar.gz.sig +0 -0
- metadata +720 -638
- metadata.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/lib/mongoid/shardable.rb
CHANGED
@@ -47,18 +47,22 @@ module Mongoid
|
|
47
47
|
self.class.shard_key_fields
|
48
48
|
end
|
49
49
|
|
50
|
-
# Returns the selector that would match the
|
51
|
-
#
|
50
|
+
# Returns the selector that would match the defined shard keys. If
|
51
|
+
# `prefer_persisted` is false (the default), it uses the current values
|
52
|
+
# of the specified shard keys, otherwise, it will try to use whatever value
|
53
|
+
# was most recently persisted.
|
54
|
+
#
|
55
|
+
# @param [ true | false ] prefer_persisted Whether to use the current
|
56
|
+
# value of the shard key fields, or to use their most recently persisted
|
57
|
+
# values.
|
52
58
|
#
|
53
59
|
# @return [ Hash ] The shard key selector.
|
54
60
|
#
|
55
61
|
# @api private
|
56
|
-
def shard_key_selector
|
57
|
-
|
58
|
-
|
59
|
-
selector[field.to_s] = send(field)
|
62
|
+
def shard_key_selector(prefer_persisted: false)
|
63
|
+
shard_key_fields.each_with_object({}) do |field, selector|
|
64
|
+
selector[field.to_s] = shard_key_field_value(field.to_s, prefer_persisted: prefer_persisted)
|
60
65
|
end
|
61
|
-
selector
|
62
66
|
end
|
63
67
|
|
64
68
|
# Returns the selector that would match the existing version of this
|
@@ -72,11 +76,31 @@ module Mongoid
|
|
72
76
|
#
|
73
77
|
# @api private
|
74
78
|
def shard_key_selector_in_db
|
75
|
-
|
76
|
-
|
77
|
-
|
79
|
+
shard_key_selector(prefer_persisted: true)
|
80
|
+
end
|
81
|
+
|
82
|
+
# Returns the value for the named shard key. If the field identifies
|
83
|
+
# an embedded document, the key will be parsed and recursively evaluated.
|
84
|
+
# If `prefer_persisted` is true, the value last persisted to the database
|
85
|
+
# will be returned, regardless of what the current value of the attribute
|
86
|
+
# may be.
|
87
|
+
#
|
88
|
+
# @param [String] field The name of the field to evaluate
|
89
|
+
# @param [ true|false ] prefer_persisted Whether or not to prefer the
|
90
|
+
# persisted value over the current value.
|
91
|
+
#
|
92
|
+
# @return [ Object ] The value of the named field.
|
93
|
+
#
|
94
|
+
# @api private
|
95
|
+
def shard_key_field_value(field, prefer_persisted:)
|
96
|
+
if field.include?(".")
|
97
|
+
relation, remaining = field.split(".", 2)
|
98
|
+
send(relation)&.shard_key_field_value(remaining, prefer_persisted: prefer_persisted)
|
99
|
+
elsif prefer_persisted && !new_record?
|
100
|
+
attribute_was(field)
|
101
|
+
else
|
102
|
+
send(field)
|
78
103
|
end
|
79
|
-
selector
|
80
104
|
end
|
81
105
|
|
82
106
|
module ClassMethods
|
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
|
@@ -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,10 +19,10 @@ 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
28
|
write_attribute(field, current) if field
|
@@ -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
@@ -203,7 +203,7 @@ module Mongoid
|
|
203
203
|
# @example Check if the document is a subclass
|
204
204
|
# Square.new.hereditary?
|
205
205
|
#
|
206
|
-
# @return [ true
|
206
|
+
# @return [ true | false ] True if hereditary, false if not.
|
207
207
|
def hereditary?
|
208
208
|
self.class.hereditary?
|
209
209
|
end
|
@@ -233,10 +233,11 @@ module Mongoid
|
|
233
233
|
def remove_child(child)
|
234
234
|
name = child.association_name
|
235
235
|
if child.embedded_one?
|
236
|
+
self.attributes.delete(child._association.store_as)
|
236
237
|
remove_ivar(name)
|
237
238
|
else
|
238
239
|
relation = send(name)
|
239
|
-
relation.
|
240
|
+
relation._remove(child)
|
240
241
|
end
|
241
242
|
end
|
242
243
|
|
@@ -282,7 +283,7 @@ module Mongoid
|
|
282
283
|
# @example Is the document the root?
|
283
284
|
# document._root?
|
284
285
|
#
|
285
|
-
# @return [ true
|
286
|
+
# @return [ true | false ] If the document is the root.
|
286
287
|
def _root?
|
287
288
|
_parent ? false : true
|
288
289
|
end
|
@@ -294,7 +295,7 @@ module Mongoid
|
|
294
295
|
# @example Check if the document is a subclass.
|
295
296
|
# Square.hereditary?
|
296
297
|
#
|
297
|
-
# @return [ true
|
298
|
+
# @return [ true | false ] True if hereditary, false if not.
|
298
299
|
def hereditary?
|
299
300
|
!!(Mongoid::Document > superclass)
|
300
301
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
|
5
|
+
# @api private
|
6
|
+
module Utils
|
7
|
+
|
8
|
+
# This function should be used if you need to measure time.
|
9
|
+
# @example Calculate elapsed time.
|
10
|
+
# starting = Utils.monotonic_time
|
11
|
+
# # do something time consuming
|
12
|
+
# ending = Utils.monotonic_time
|
13
|
+
# puts "It took #{(ending - starting).to_i} seconds"
|
14
|
+
#
|
15
|
+
# @see https://blog.dnsimple.com/2018/03/elapsed-time-with-ruby-the-right-way/
|
16
|
+
#
|
17
|
+
# @return [Float] seconds according to monotonic clock
|
18
|
+
module_function def monotonic_time
|
19
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -12,7 +12,7 @@ module Mongoid
|
|
12
12
|
# validator.validate_each(model, :name, "value")
|
13
13
|
#
|
14
14
|
# @param [ Document ] document The document.
|
15
|
-
# @param [ Symbol
|
15
|
+
# @param [ Symbol | String ] attribute The attribute to validate.
|
16
16
|
# @param [ Object ] value The attribute value.
|
17
17
|
def validate_each(document, attribute, value)
|
18
18
|
field = document.fields[document.database_field_name(attribute)]
|
@@ -18,8 +18,7 @@ module Mongoid
|
|
18
18
|
# validates_associated :name, :addresses
|
19
19
|
# end
|
20
20
|
#
|
21
|
-
# @param [
|
22
|
-
#
|
21
|
+
# @param [ Object... ] *args The arguments to pass to the validator.
|
23
22
|
def validates_associated(*args)
|
24
23
|
validates_with(AssociatedValidator, _merge_attributes(args))
|
25
24
|
end
|
@@ -36,8 +35,7 @@ module Mongoid
|
|
36
35
|
# validates_uniqueness_of :title
|
37
36
|
# end
|
38
37
|
#
|
39
|
-
# @param [
|
40
|
-
#
|
38
|
+
# @param [ Object... ] *args The arguments to pass to the validator.
|
41
39
|
def validates_uniqueness_of(*args)
|
42
40
|
validates_with(UniquenessValidator, _merge_attributes(args))
|
43
41
|
end
|
@@ -52,7 +50,7 @@ module Mongoid
|
|
52
50
|
# validates_format_of :title, with: /\A[a-z0-9 \-_]*\z/i
|
53
51
|
# end
|
54
52
|
#
|
55
|
-
# @param [
|
53
|
+
# @param [ Object... ] *args The names of the field(s) to validate.
|
56
54
|
def validates_format_of(*args)
|
57
55
|
validates_with(FormatValidator, _merge_attributes(args))
|
58
56
|
end
|
@@ -67,7 +65,7 @@ module Mongoid
|
|
67
65
|
# validates_length_of :title, minimum: 100
|
68
66
|
# end
|
69
67
|
#
|
70
|
-
# @param [
|
68
|
+
# @param [ Object... ] *args The names of the field(s) to validate.
|
71
69
|
def validates_length_of(*args)
|
72
70
|
validates_with(LengthValidator, _merge_attributes(args))
|
73
71
|
end
|
@@ -82,7 +80,7 @@ module Mongoid
|
|
82
80
|
# validates_presence_of :title
|
83
81
|
# end
|
84
82
|
#
|
85
|
-
# @param [
|
83
|
+
# @param [ Object... ] *args The names of the field(s) to validate.
|
86
84
|
def validates_presence_of(*args)
|
87
85
|
validates_with(PresenceValidator, _merge_attributes(args))
|
88
86
|
end
|
@@ -56,7 +56,7 @@ module Mongoid
|
|
56
56
|
# @param [ Symbol ] attr The attribute.
|
57
57
|
# @param [ Object ] value The value.
|
58
58
|
#
|
59
|
-
# @return [ true
|
59
|
+
# @return [ true | false ] If the doc is missing.
|
60
60
|
def relation_or_fk_missing?(doc, attr, value)
|
61
61
|
return true if value.blank? && doc.send(attr).blank?
|
62
62
|
association = doc.relations[attr.to_s]
|
@@ -72,7 +72,7 @@ module Mongoid
|
|
72
72
|
#
|
73
73
|
# @param [ Object ] value The value.
|
74
74
|
#
|
75
|
-
# @return [ true
|
75
|
+
# @return [ true | false ] If the value is not present.
|
76
76
|
def not_present?(value)
|
77
77
|
value.blank? && value != false
|
78
78
|
end
|