mongoid 7.5.1 → 8.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +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
|
@@ -14,19 +14,19 @@ describe Mongoid::Serializable do
|
|
|
14
14
|
expect(guitar.send(:field_names, {})).to eq(guitar.fields.except("_type").keys.sort)
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
context "when using a custom discriminator_key" do
|
|
18
|
-
before do
|
|
17
|
+
context "when using a custom discriminator_key" do
|
|
18
|
+
before do
|
|
19
19
|
Instrument.discriminator_key = "dkey"
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
-
after do
|
|
22
|
+
after do
|
|
23
23
|
Instrument.discriminator_key = nil
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
let(:guitar) do
|
|
27
27
|
Guitar.new
|
|
28
28
|
end
|
|
29
|
-
|
|
29
|
+
|
|
30
30
|
it "includes _type but does not include the new discriminator key" do
|
|
31
31
|
expect(guitar.send(:field_names, {})).to eq(guitar.fields.except("dkey").keys.sort)
|
|
32
32
|
end
|
|
@@ -41,15 +41,11 @@ describe Mongoid::Serializable do
|
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
after do
|
|
44
|
-
Mongoid.include_root_in_json = false
|
|
45
44
|
reload_model(:Minim)
|
|
46
45
|
end
|
|
47
46
|
|
|
48
47
|
context "when global config is set to true" do
|
|
49
|
-
|
|
50
|
-
before do
|
|
51
|
-
Mongoid.include_root_in_json = true
|
|
52
|
-
end
|
|
48
|
+
config_override :include_root_in_json, true
|
|
53
49
|
|
|
54
50
|
it "returns true" do
|
|
55
51
|
expect(Minim.public_send(meth)).to be true
|
|
@@ -67,10 +63,7 @@ describe Mongoid::Serializable do
|
|
|
67
63
|
end
|
|
68
64
|
|
|
69
65
|
context "when global config set to false" do
|
|
70
|
-
|
|
71
|
-
before do
|
|
72
|
-
Mongoid.include_root_in_json = false
|
|
73
|
-
end
|
|
66
|
+
config_override :include_root_in_json, false
|
|
74
67
|
|
|
75
68
|
it "returns false" do
|
|
76
69
|
expect(Minim.public_send(meth)).to be false
|
|
@@ -89,13 +82,13 @@ describe Mongoid::Serializable do
|
|
|
89
82
|
end
|
|
90
83
|
|
|
91
84
|
describe "#include_root_in_json" do
|
|
85
|
+
config_override :include_root_in_json, false
|
|
92
86
|
|
|
93
87
|
before do
|
|
94
88
|
reload_model(:Minim)
|
|
95
89
|
end
|
|
96
90
|
|
|
97
91
|
after do
|
|
98
|
-
Mongoid.include_root_in_json = false
|
|
99
92
|
reload_model(:Minim)
|
|
100
93
|
end
|
|
101
94
|
|
|
@@ -127,10 +120,6 @@ describe Mongoid::Serializable do
|
|
|
127
120
|
|
|
128
121
|
context "when global config set to false" do
|
|
129
122
|
|
|
130
|
-
before do
|
|
131
|
-
Mongoid.include_root_in_json = false
|
|
132
|
-
end
|
|
133
|
-
|
|
134
123
|
it "returns false" do
|
|
135
124
|
expect(minim.public_send(meth)).to be false
|
|
136
125
|
end
|
|
@@ -297,14 +286,7 @@ describe Mongoid::Serializable do
|
|
|
297
286
|
end
|
|
298
287
|
|
|
299
288
|
context "when include_type_for_serialization is true" do
|
|
300
|
-
|
|
301
|
-
before do
|
|
302
|
-
Mongoid.include_type_for_serialization = true
|
|
303
|
-
end
|
|
304
|
-
|
|
305
|
-
after do
|
|
306
|
-
Mongoid.include_type_for_serialization = false
|
|
307
|
-
end
|
|
289
|
+
config_override :include_type_for_serialization, true
|
|
308
290
|
|
|
309
291
|
it "includes _type field" do
|
|
310
292
|
expect(person.serializable_hash.keys).to include '_type'
|
|
@@ -881,16 +863,13 @@ describe Mongoid::Serializable do
|
|
|
881
863
|
end
|
|
882
864
|
|
|
883
865
|
context "when including root in json via Mongoid" do
|
|
866
|
+
config_override :include_root_in_json, false
|
|
884
867
|
|
|
885
868
|
before do
|
|
886
869
|
account.include_root_in_json.should be false
|
|
887
870
|
Mongoid.include_root_in_json = true
|
|
888
871
|
end
|
|
889
872
|
|
|
890
|
-
after do
|
|
891
|
-
Mongoid.include_root_in_json = false
|
|
892
|
-
end
|
|
893
|
-
|
|
894
873
|
it "uses the mongoid configuration" do
|
|
895
874
|
expect(JSON.parse(account.to_json)).to have_key("account")
|
|
896
875
|
end
|
|
@@ -59,3 +59,17 @@ end
|
|
|
59
59
|
class SmNotSharded
|
|
60
60
|
include Mongoid::Document
|
|
61
61
|
end
|
|
62
|
+
|
|
63
|
+
class SmReviewAuthor
|
|
64
|
+
include Mongoid::Document
|
|
65
|
+
embedded_in :review, class_name: "SmReview", touch: false
|
|
66
|
+
field :name, type: String
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
class SmReview
|
|
70
|
+
include Mongoid::Document
|
|
71
|
+
|
|
72
|
+
embeds_one :author, class_name: "SmReviewAuthor"
|
|
73
|
+
|
|
74
|
+
shard_key "author.name" => 1
|
|
75
|
+
end
|
|
@@ -27,11 +27,11 @@ describe Mongoid::Shardable do
|
|
|
27
27
|
context 'when full syntax is used' do
|
|
28
28
|
context 'with symbol value' do
|
|
29
29
|
it 'sets shard key fields to symbol value' do
|
|
30
|
-
SmProducer.shard_key_fields.
|
|
30
|
+
expect(SmProducer.shard_key_fields).to be == %i(age gender)
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
it 'sets shard config' do
|
|
34
|
-
SmProducer.shard_config.
|
|
34
|
+
expect(SmProducer.shard_config).to be == {
|
|
35
35
|
key: {age: 1, gender: 'hashed'},
|
|
36
36
|
options: {
|
|
37
37
|
unique: true,
|
|
@@ -41,37 +41,37 @@ describe Mongoid::Shardable do
|
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
it 'keeps hashed as string' do
|
|
44
|
-
SmProducer.shard_config[:key][:gender].
|
|
44
|
+
expect(SmProducer.shard_config[:key][:gender]).to be == 'hashed'
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
context 'with string value' do
|
|
49
49
|
it 'sets shard key fields to symbol value' do
|
|
50
|
-
SmActor.shard_key_fields.
|
|
50
|
+
expect(SmActor.shard_key_fields).to be == %i(age gender hello)
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
it 'sets shard config' do
|
|
54
|
-
SmActor.shard_config.
|
|
54
|
+
expect(SmActor.shard_config).to be == {
|
|
55
55
|
key: {age: 1, gender: 'hashed', hello: 'hashed'},
|
|
56
56
|
options: {},
|
|
57
57
|
}
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
it 'sets hashed to string' do
|
|
61
|
-
SmActor.shard_config[:key][:gender].
|
|
61
|
+
expect(SmActor.shard_config[:key][:gender]).to be == 'hashed'
|
|
62
62
|
end
|
|
63
63
|
end
|
|
64
64
|
|
|
65
65
|
context 'when passed association name' do
|
|
66
66
|
it 'uses foreign key as shard key in shard config' do
|
|
67
|
-
SmDriver.shard_config.
|
|
67
|
+
expect(SmDriver.shard_config).to be == {
|
|
68
68
|
key: {age: 1, agency_id: 'hashed'},
|
|
69
69
|
options: {},
|
|
70
70
|
}
|
|
71
71
|
end
|
|
72
72
|
|
|
73
73
|
it 'uses foreign key as shard key in shard key fields' do
|
|
74
|
-
SmDriver.shard_key_fields.
|
|
74
|
+
expect(SmDriver.shard_key_fields).to be == %i(age agency_id)
|
|
75
75
|
end
|
|
76
76
|
end
|
|
77
77
|
end
|
|
@@ -79,26 +79,26 @@ describe Mongoid::Shardable do
|
|
|
79
79
|
context 'when shorthand syntax is used' do
|
|
80
80
|
context 'with symbol value' do
|
|
81
81
|
it 'sets shard key fields to symbol value' do
|
|
82
|
-
SmMovie.shard_key_fields.
|
|
82
|
+
expect(SmMovie.shard_key_fields).to be == %i(year)
|
|
83
83
|
end
|
|
84
84
|
end
|
|
85
85
|
|
|
86
86
|
context 'with string value' do
|
|
87
87
|
it 'sets shard key fields to symbol value' do
|
|
88
|
-
SmTrailer.shard_key_fields.
|
|
88
|
+
expect(SmTrailer.shard_key_fields).to be == %i(year)
|
|
89
89
|
end
|
|
90
90
|
end
|
|
91
91
|
|
|
92
92
|
context 'when passed association name' do
|
|
93
93
|
it 'uses foreign key as shard key in shard config' do
|
|
94
|
-
SmDirector.shard_config.
|
|
94
|
+
expect(SmDirector.shard_config).to be == {
|
|
95
95
|
key: {agency_id: 1},
|
|
96
96
|
options: {},
|
|
97
97
|
}
|
|
98
98
|
end
|
|
99
99
|
|
|
100
100
|
it 'uses foreign key as shard key in shard key fields' do
|
|
101
|
-
SmDirector.shard_key_fields.
|
|
101
|
+
expect(SmDirector.shard_key_fields).to be == %i(agency_id)
|
|
102
102
|
end
|
|
103
103
|
end
|
|
104
104
|
end
|
|
@@ -106,41 +106,80 @@ describe Mongoid::Shardable do
|
|
|
106
106
|
|
|
107
107
|
describe '#shard_key_selector' do
|
|
108
108
|
subject { instance.shard_key_selector }
|
|
109
|
-
|
|
110
|
-
|
|
109
|
+
|
|
110
|
+
context 'when key is an immediate attribute' do
|
|
111
|
+
let(:klass) { Band }
|
|
112
|
+
let(:value) { 'a-brand-name' }
|
|
111
113
|
|
|
112
|
-
|
|
114
|
+
before { klass.shard_key(:name) }
|
|
113
115
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
+
context 'when record is new' do
|
|
117
|
+
let(:instance) { klass.new(name: value) }
|
|
116
118
|
|
|
117
|
-
|
|
119
|
+
it { is_expected.to eq({ 'name' => value }) }
|
|
118
120
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
+
context 'changing shard key value' do
|
|
122
|
+
let(:new_value) { 'a-new-value' }
|
|
121
123
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
+
before do
|
|
125
|
+
instance.name = new_value
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
it { is_expected.to eq({ 'name' => new_value }) }
|
|
124
129
|
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
context 'when record is persisted' do
|
|
133
|
+
let(:instance) { klass.create!(name: value) }
|
|
134
|
+
|
|
135
|
+
it { is_expected.to eq({ 'name' => value }) }
|
|
136
|
+
|
|
137
|
+
context 'changing shard key value' do
|
|
138
|
+
let(:new_value) { 'a-new-value' }
|
|
139
|
+
|
|
140
|
+
before do
|
|
141
|
+
instance.name = new_value
|
|
142
|
+
end
|
|
125
143
|
|
|
126
|
-
|
|
144
|
+
it { is_expected.to eq({ 'name' => new_value }) }
|
|
145
|
+
end
|
|
127
146
|
end
|
|
128
147
|
end
|
|
129
148
|
|
|
130
|
-
context 'when
|
|
131
|
-
let(:
|
|
149
|
+
context 'when key is an embedded attribute' do
|
|
150
|
+
let(:klass) { SmReview }
|
|
151
|
+
let(:value) { 'Arthur Conan Doyle' }
|
|
152
|
+
let(:key) { 'author.name' }
|
|
132
153
|
|
|
133
|
-
|
|
154
|
+
context 'when record is new' do
|
|
155
|
+
let(:instance) { klass.new(author: { name: value }) }
|
|
134
156
|
|
|
135
|
-
|
|
136
|
-
let(:new_value) { 'a-new-value' }
|
|
157
|
+
it { is_expected.to eq({ key => value }) }
|
|
137
158
|
|
|
138
|
-
|
|
139
|
-
|
|
159
|
+
context 'changing shard key value' do
|
|
160
|
+
let(:new_value) { 'Jules Verne' }
|
|
161
|
+
|
|
162
|
+
before do
|
|
163
|
+
instance.author.name = new_value
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
it { is_expected.to eq({ key => new_value }) }
|
|
140
167
|
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
context 'when record is persisted' do
|
|
171
|
+
let(:instance) { klass.create!(author: { name: value }) }
|
|
172
|
+
|
|
173
|
+
it { is_expected.to eq({ key => value }) }
|
|
174
|
+
|
|
175
|
+
context 'changing shard key value' do
|
|
176
|
+
let(:new_value) { 'Jules Verne' }
|
|
177
|
+
|
|
178
|
+
before do
|
|
179
|
+
instance.author.name = new_value
|
|
180
|
+
end
|
|
141
181
|
|
|
142
|
-
|
|
143
|
-
subject.should == { 'name' => new_value }
|
|
182
|
+
it { is_expected.to eq({ 'author.name' => new_value }) }
|
|
144
183
|
end
|
|
145
184
|
end
|
|
146
185
|
end
|
|
@@ -148,42 +187,109 @@ describe Mongoid::Shardable do
|
|
|
148
187
|
|
|
149
188
|
describe '#shard_key_selector_in_db' do
|
|
150
189
|
subject { instance.shard_key_selector_in_db }
|
|
151
|
-
let(:klass) { Band }
|
|
152
|
-
let(:value) { 'a-brand-name' }
|
|
153
190
|
|
|
154
|
-
|
|
191
|
+
context 'when key is an immediate attribute' do
|
|
192
|
+
let(:klass) { Band }
|
|
193
|
+
let(:value) { 'a-brand-name' }
|
|
155
194
|
|
|
156
|
-
|
|
157
|
-
let(:instance) { klass.new(name: value) }
|
|
195
|
+
before { klass.shard_key(:name) }
|
|
158
196
|
|
|
159
|
-
|
|
197
|
+
context 'when record is new' do
|
|
198
|
+
let(:instance) { klass.new(name: value) }
|
|
160
199
|
|
|
161
|
-
|
|
162
|
-
|
|
200
|
+
it { is_expected.to eq({ 'name' => value }) }
|
|
201
|
+
|
|
202
|
+
context 'changing shard key value' do
|
|
203
|
+
let(:new_value) { 'a-new-value' }
|
|
204
|
+
|
|
205
|
+
before do
|
|
206
|
+
instance.name = new_value
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
it { is_expected.to eq({ 'name' => new_value }) }
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
context 'when record is persisted' do
|
|
214
|
+
let(:instance) { klass.create!(name: value) }
|
|
215
|
+
|
|
216
|
+
it { is_expected.to eq({ 'name' => value }) }
|
|
217
|
+
|
|
218
|
+
context 'changing shard key value' do
|
|
219
|
+
let(:new_value) { 'a-new-value' }
|
|
220
|
+
|
|
221
|
+
before do
|
|
222
|
+
instance.name = new_value
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
it { is_expected.to eq({ 'name' => value }) }
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
context "when record is not found" do
|
|
230
|
+
let!(:instance) { klass.create!(name: value) }
|
|
163
231
|
|
|
164
232
|
before do
|
|
165
|
-
instance.
|
|
233
|
+
instance.destroy
|
|
166
234
|
end
|
|
167
235
|
|
|
168
|
-
it
|
|
169
|
-
|
|
236
|
+
it "raises a DocumentNotFound error with the shard key in the description on reload" do
|
|
237
|
+
expect do
|
|
238
|
+
instance.reload
|
|
239
|
+
end.to raise_error(Mongoid::Errors::DocumentNotFound, /Document not found for class Band with id #{instance.id.to_s} and shard key name: a-brand-name./)
|
|
170
240
|
end
|
|
171
241
|
end
|
|
172
242
|
end
|
|
173
243
|
|
|
174
|
-
context 'when
|
|
175
|
-
let(:
|
|
244
|
+
context 'when key is an embedded attribute' do
|
|
245
|
+
let(:klass) { SmReview }
|
|
246
|
+
let(:value) { 'Arthur Conan Doyle' }
|
|
247
|
+
let(:key) { 'author.name' }
|
|
176
248
|
|
|
177
|
-
|
|
249
|
+
context 'when record is new' do
|
|
250
|
+
let(:instance) { klass.new(author: { name: value }) }
|
|
178
251
|
|
|
179
|
-
|
|
180
|
-
let(:new_value) { 'a-new-value' }
|
|
252
|
+
it { is_expected.to eq({ key => value }) }
|
|
181
253
|
|
|
182
|
-
|
|
183
|
-
|
|
254
|
+
context 'changing shard key value' do
|
|
255
|
+
let(:new_value) { 'Jules Verne' }
|
|
256
|
+
|
|
257
|
+
before do
|
|
258
|
+
instance.author.name = new_value
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
it { is_expected.to eq({ key => new_value }) }
|
|
184
262
|
end
|
|
263
|
+
end
|
|
185
264
|
|
|
186
|
-
|
|
265
|
+
context 'when record is persisted' do
|
|
266
|
+
let(:instance) { klass.create!(author: { name: value }) }
|
|
267
|
+
|
|
268
|
+
it { is_expected.to eq({ key => value }) }
|
|
269
|
+
|
|
270
|
+
context 'changing shard key value' do
|
|
271
|
+
let(:new_value) { 'Jules Verne' }
|
|
272
|
+
|
|
273
|
+
before do
|
|
274
|
+
instance.author.name = new_value
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
it { is_expected.to eq({ key => value }) }
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
context "when record is not found" do
|
|
281
|
+
let!(:instance) { klass.create!(author: { name: value }) }
|
|
282
|
+
|
|
283
|
+
before do
|
|
284
|
+
instance.destroy
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
it "raises a DocumentNotFound error with the shard key in the description on reload" do
|
|
288
|
+
expect do
|
|
289
|
+
instance.reload
|
|
290
|
+
end.to raise_error(Mongoid::Errors::DocumentNotFound, /Document not found for class SmReview with id #{instance.id.to_s} and shard key author.name: Arthur Conan Doyle./)
|
|
291
|
+
end
|
|
292
|
+
end
|
|
187
293
|
end
|
|
188
294
|
end
|
|
189
295
|
end
|
|
@@ -40,6 +40,25 @@ describe Mongoid::Stateful do
|
|
|
40
40
|
end
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
+
describe '#previously_new_record?' do
|
|
44
|
+
it "returns correct values" do
|
|
45
|
+
person = Person.new
|
|
46
|
+
expect(person).not_to be_a_previously_new_record
|
|
47
|
+
person.save!
|
|
48
|
+
expect(person).to be_a_previously_new_record
|
|
49
|
+
person.title = "Title"
|
|
50
|
+
person.save!
|
|
51
|
+
expect(person).not_to be_a_previously_new_record
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "resets after reload" do
|
|
55
|
+
person = Person.create!
|
|
56
|
+
expect(person).to be_a_previously_new_record
|
|
57
|
+
person.reload
|
|
58
|
+
expect(person).not_to be_a_previously_new_record
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
43
62
|
describe "#persisted?" do
|
|
44
63
|
|
|
45
64
|
let(:person) do
|
|
@@ -62,6 +81,15 @@ describe Mongoid::Stateful do
|
|
|
62
81
|
end
|
|
63
82
|
end
|
|
64
83
|
|
|
84
|
+
describe "#previously_persisted?" do
|
|
85
|
+
it "returns true after being destroyed" do
|
|
86
|
+
person = Person.create!
|
|
87
|
+
expect(person).not_to be_previously_persisted
|
|
88
|
+
person.destroy
|
|
89
|
+
expect(person).to be_previously_persisted
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
65
93
|
describe "destroyed?" do
|
|
66
94
|
|
|
67
95
|
let(:person) do
|
|
@@ -108,21 +136,135 @@ describe Mongoid::Stateful do
|
|
|
108
136
|
Band.new
|
|
109
137
|
end
|
|
110
138
|
|
|
111
|
-
context "when
|
|
139
|
+
context "when legacy_readonly is true" do
|
|
140
|
+
config_override :legacy_readonly, true
|
|
112
141
|
|
|
113
|
-
|
|
114
|
-
|
|
142
|
+
context "when the selected fields are set" do
|
|
143
|
+
|
|
144
|
+
before do
|
|
145
|
+
document.__selected_fields = { test: 1 }
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
it "returns true" do
|
|
149
|
+
expect(document).to be_readonly
|
|
150
|
+
end
|
|
115
151
|
end
|
|
116
152
|
|
|
117
|
-
|
|
118
|
-
|
|
153
|
+
context "when no readonly has been set" do
|
|
154
|
+
|
|
155
|
+
it "returns false" do
|
|
156
|
+
expect(document).to_not be_readonly
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
context "when the readonly! method is called" do
|
|
161
|
+
|
|
162
|
+
let(:op) do
|
|
163
|
+
document.readonly!
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
it "returns false" do
|
|
167
|
+
op
|
|
168
|
+
expect(document).to_not be_readonly
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
it "warns" do
|
|
172
|
+
expect(Mongoid::Warnings).to receive(:warn_legacy_readonly)
|
|
173
|
+
op
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
context "when overriding readonly?" do
|
|
178
|
+
|
|
179
|
+
let(:doc) { ReadonlyModel.create! }
|
|
180
|
+
|
|
181
|
+
before do
|
|
182
|
+
class ReadonlyModel
|
|
183
|
+
include Mongoid::Document
|
|
184
|
+
|
|
185
|
+
attr_accessor :locked
|
|
186
|
+
|
|
187
|
+
def readonly?
|
|
188
|
+
!!locked
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
after do
|
|
194
|
+
Object.send(:remove_const, :ReadonlyModel)
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
it "raises when readonly? is true" do
|
|
198
|
+
expect(doc.readonly?).to be false
|
|
199
|
+
doc.locked = true
|
|
200
|
+
expect(doc.readonly?).to be true
|
|
201
|
+
expect do
|
|
202
|
+
doc.destroy
|
|
203
|
+
end.to raise_error(Mongoid::Errors::ReadonlyDocument)
|
|
204
|
+
end
|
|
119
205
|
end
|
|
120
206
|
end
|
|
121
207
|
|
|
122
|
-
context "when
|
|
208
|
+
context "when legacy_readonly is false" do
|
|
209
|
+
config_override :legacy_readonly, false
|
|
123
210
|
|
|
124
|
-
|
|
125
|
-
|
|
211
|
+
context "when the selected fields are set" do
|
|
212
|
+
|
|
213
|
+
before do
|
|
214
|
+
document.__selected_fields = { test: 1 }
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
it "returns false" do
|
|
218
|
+
expect(document).to_not be_readonly
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
context "when the readonly! method is called" do
|
|
223
|
+
|
|
224
|
+
before do
|
|
225
|
+
document.readonly!
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
it "returns true" do
|
|
229
|
+
expect(document).to be_readonly
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
context "when no readonly has been set" do
|
|
234
|
+
|
|
235
|
+
it "returns false" do
|
|
236
|
+
expect(document).to_not be_readonly
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
context "when overriding readonly?" do
|
|
241
|
+
|
|
242
|
+
let(:doc) { ReadonlyModel.new }
|
|
243
|
+
|
|
244
|
+
before do
|
|
245
|
+
class ReadonlyModel
|
|
246
|
+
include Mongoid::Document
|
|
247
|
+
|
|
248
|
+
attr_accessor :locked
|
|
249
|
+
|
|
250
|
+
def readonly?
|
|
251
|
+
!!locked
|
|
252
|
+
end
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
after do
|
|
257
|
+
Object.send(:remove_const, :ReadonlyModel)
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
it "raises when readonly? is true" do
|
|
261
|
+
expect(doc.readonly?).to be false
|
|
262
|
+
doc.locked = true
|
|
263
|
+
expect(doc.readonly?).to be true
|
|
264
|
+
expect do
|
|
265
|
+
doc.save!
|
|
266
|
+
end.to raise_error(Mongoid::Errors::ReadonlyDocument)
|
|
267
|
+
end
|
|
126
268
|
end
|
|
127
269
|
end
|
|
128
270
|
end
|