mongoid 7.2.1 → 9.0.0
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 +20 -20
- data/LICENSE +1 -1
- data/README.md +7 -12
- data/Rakefile +58 -1
- data/lib/config/locales/en.yml +191 -60
- data/lib/mongoid/association/accessors.rb +67 -53
- data/lib/mongoid/association/bindable.rb +77 -31
- data/lib/mongoid/association/builders.rb +8 -14
- data/lib/mongoid/association/constrainable.rb +2 -5
- data/lib/mongoid/association/depending.rb +20 -12
- data/lib/mongoid/association/eager.rb +160 -0
- data/lib/mongoid/association/eager_loadable.rb +41 -11
- data/lib/mongoid/association/embedded/batchable.rb +63 -52
- data/lib/mongoid/association/embedded/cyclic.rb +4 -12
- data/lib/mongoid/association/embedded/eager.rb +23 -0
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +29 -13
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +3 -5
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +25 -23
- data/lib/mongoid/association/embedded/embedded_in.rb +11 -26
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +4 -9
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +5 -6
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +226 -203
- data/lib/mongoid/association/embedded/embeds_many.rb +3 -33
- data/lib/mongoid/association/embedded/embeds_one/binding.rb +3 -9
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +20 -8
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +131 -42
- data/lib/mongoid/association/embedded/embeds_one.rb +4 -30
- data/lib/mongoid/association/embedded.rb +2 -1
- data/lib/mongoid/association/macros.rb +47 -16
- data/lib/mongoid/association/many.rb +12 -24
- data/lib/mongoid/association/marshalable.rb +4 -5
- data/lib/mongoid/association/nested/many.rb +14 -19
- data/lib/mongoid/association/nested/nested_buildable.rb +36 -13
- data/lib/mongoid/association/nested/one.rb +54 -26
- data/lib/mongoid/association/nested.rb +1 -3
- data/lib/mongoid/association/one.rb +3 -11
- data/lib/mongoid/association/options.rb +18 -44
- data/lib/mongoid/association/proxy.rb +49 -42
- data/lib/mongoid/association/referenced/auto_save.rb +11 -15
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +2 -7
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +6 -6
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +2 -2
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +23 -32
- data/lib/mongoid/association/referenced/belongs_to.rb +13 -37
- data/lib/mongoid/association/referenced/counter_cache.rb +18 -26
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +15 -8
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +1 -3
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +191 -123
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +23 -42
- data/lib/mongoid/association/referenced/has_many/binding.rb +1 -5
- data/lib/mongoid/association/referenced/has_many/buildable.rb +1 -3
- data/lib/mongoid/association/referenced/has_many/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +471 -496
- data/lib/mongoid/association/referenced/has_many/proxy.rb +182 -179
- data/lib/mongoid/association/referenced/has_many.rb +17 -43
- data/lib/mongoid/association/referenced/has_one/binding.rb +1 -7
- data/lib/mongoid/association/referenced/has_one/buildable.rb +5 -5
- data/lib/mongoid/association/referenced/has_one/eager.rb +3 -4
- data/lib/mongoid/association/referenced/has_one/proxy.rb +38 -41
- data/lib/mongoid/association/referenced/has_one.rb +17 -36
- data/lib/mongoid/association/referenced/syncable.rb +11 -27
- data/lib/mongoid/association/referenced.rb +1 -1
- data/lib/mongoid/association/reflections.rb +9 -9
- data/lib/mongoid/association/relatable.rb +55 -74
- data/lib/mongoid/association.rb +10 -22
- data/lib/mongoid/atomic/modifiers.rb +7 -53
- data/lib/mongoid/atomic/paths/embedded/many.rb +20 -5
- data/lib/mongoid/atomic/paths/embedded/one.rb +1 -5
- data/lib/mongoid/atomic/paths/embedded.rb +1 -3
- data/lib/mongoid/atomic/paths/root.rb +1 -5
- data/lib/mongoid/atomic/paths.rb +1 -1
- data/lib/mongoid/atomic.rb +39 -86
- data/lib/mongoid/atomic_update_preparer.rb +88 -0
- data/lib/mongoid/attributes/dynamic.rb +5 -21
- data/lib/mongoid/attributes/embedded.rb +34 -0
- data/lib/mongoid/attributes/nested.rb +9 -13
- data/lib/mongoid/attributes/processing.rb +43 -28
- data/lib/mongoid/attributes/projector.rb +120 -0
- data/lib/mongoid/attributes/readonly.rb +4 -8
- data/lib/mongoid/attributes.rb +85 -89
- data/lib/mongoid/cacheable.rb +5 -9
- data/lib/mongoid/changeable.rb +183 -97
- data/lib/mongoid/clients/factory.rb +58 -15
- data/lib/mongoid/clients/options.rb +117 -8
- data/lib/mongoid/clients/sessions.rb +246 -84
- data/lib/mongoid/clients/storage_options.rb +37 -11
- data/lib/mongoid/clients/validators/storage.rb +4 -24
- data/lib/mongoid/clients/validators.rb +1 -1
- data/lib/mongoid/clients.rb +37 -14
- data/lib/mongoid/collection_configurable.rb +59 -0
- data/lib/mongoid/composable.rb +7 -7
- data/lib/mongoid/config/defaults.rb +40 -0
- data/lib/mongoid/config/encryption.rb +213 -0
- data/lib/mongoid/config/environment.rb +25 -5
- data/lib/mongoid/config/introspection.rb +152 -0
- data/lib/mongoid/config/options.rb +11 -14
- data/lib/mongoid/config/validators/async_query_executor.rb +34 -0
- data/lib/mongoid/config/validators/client.rb +7 -23
- data/lib/mongoid/config/validators/option.rb +1 -3
- data/lib/mongoid/config/validators.rb +2 -1
- data/lib/mongoid/config.rb +183 -46
- data/lib/mongoid/contextual/aggregable/memory.rb +38 -26
- data/lib/mongoid/contextual/aggregable/mongo.rb +26 -32
- data/lib/mongoid/contextual/aggregable/none.rb +66 -0
- data/lib/mongoid/contextual/aggregable.rb +18 -0
- data/lib/mongoid/contextual/atomic.rb +97 -30
- data/lib/mongoid/contextual/command.rb +3 -5
- data/lib/mongoid/contextual/map_reduce.rb +8 -33
- data/lib/mongoid/contextual/memory.rb +396 -89
- data/lib/mongoid/contextual/mongo/documents_loader.rb +178 -0
- data/lib/mongoid/contextual/mongo.rb +640 -311
- data/lib/mongoid/contextual/none.rb +244 -30
- data/lib/mongoid/contextual/queryable.rb +5 -4
- data/lib/mongoid/contextual.rb +18 -7
- data/lib/mongoid/copyable.rb +34 -14
- data/lib/mongoid/criteria/findable.rb +52 -22
- data/lib/mongoid/criteria/includable.rb +31 -34
- data/lib/mongoid/criteria/inspectable.rb +4 -3
- data/lib/mongoid/criteria/marshalable.rb +14 -7
- data/lib/mongoid/criteria/modifiable.rb +5 -19
- data/lib/mongoid/criteria/options.rb +1 -3
- data/lib/mongoid/criteria/permission.rb +6 -2
- data/lib/mongoid/criteria/queryable/aggregable.rb +3 -15
- data/lib/mongoid/criteria/queryable/expandable.rb +1 -25
- data/lib/mongoid/criteria/queryable/extensions/array.rb +6 -41
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -9
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -7
- data/lib/mongoid/criteria/queryable/extensions/date.rb +10 -11
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +8 -7
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -41
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +2 -14
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -21
- data/lib/mongoid/criteria/queryable/extensions/object.rb +7 -30
- data/lib/mongoid/criteria/queryable/extensions/range.rb +48 -17
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +10 -13
- data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -5
- data/lib/mongoid/criteria/queryable/extensions/string.rb +19 -34
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +6 -22
- data/lib/mongoid/criteria/queryable/extensions/time.rb +8 -9
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +9 -9
- data/lib/mongoid/criteria/queryable/extensions.rb +1 -5
- data/lib/mongoid/criteria/queryable/key.rb +15 -18
- data/lib/mongoid/criteria/queryable/macroable.rb +1 -3
- data/lib/mongoid/criteria/queryable/mergeable.rb +69 -50
- data/lib/mongoid/criteria/queryable/optional.rb +12 -62
- data/lib/mongoid/criteria/queryable/options.rb +3 -21
- data/lib/mongoid/criteria/queryable/pipeline.rb +2 -14
- data/lib/mongoid/criteria/queryable/selectable.rb +87 -124
- data/lib/mongoid/criteria/queryable/selector.rb +96 -25
- data/lib/mongoid/criteria/queryable/smash.rb +41 -18
- data/lib/mongoid/criteria/queryable/storable.rb +14 -9
- data/lib/mongoid/criteria/queryable.rb +12 -13
- data/lib/mongoid/criteria/scopable.rb +32 -21
- data/lib/mongoid/criteria/translator.rb +46 -0
- data/lib/mongoid/criteria.rb +60 -109
- data/lib/mongoid/deprecable.rb +38 -0
- data/lib/mongoid/deprecation.rb +29 -0
- data/lib/mongoid/document.rb +263 -173
- data/lib/mongoid/encryptable.rb +53 -0
- data/lib/mongoid/equality.rb +22 -25
- data/lib/mongoid/errors/ambiguous_relationship.rb +3 -5
- data/lib/mongoid/errors/attribute_not_loaded.rb +34 -0
- data/lib/mongoid/errors/callback.rb +1 -3
- data/lib/mongoid/errors/create_collection_failure.rb +34 -0
- data/lib/mongoid/errors/criteria_argument_required.rb +1 -1
- data/lib/mongoid/errors/delete_restriction.rb +9 -12
- data/lib/mongoid/errors/document_not_destroyed.rb +3 -7
- data/lib/mongoid/errors/document_not_found.rb +34 -21
- data/lib/mongoid/errors/drop_collection_failure.rb +28 -0
- data/lib/mongoid/errors/empty_config_file.rb +26 -0
- data/lib/mongoid/errors/immutable_attribute.rb +27 -0
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -3
- data/lib/mongoid/errors/invalid_async_query_executor.rb +26 -0
- data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +33 -0
- data/lib/mongoid/errors/invalid_collection.rb +1 -1
- data/lib/mongoid/errors/invalid_config_file.rb +26 -0
- data/lib/mongoid/errors/invalid_config_option.rb +2 -4
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -4
- data/lib/mongoid/errors/invalid_discriminator_key_target.rb +1 -1
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +24 -0
- data/lib/mongoid/errors/invalid_elem_match_operator.rb +1 -1
- data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +6 -5
- data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +27 -0
- data/lib/mongoid/errors/invalid_expression_operator.rb +1 -1
- data/lib/mongoid/errors/invalid_field.rb +7 -7
- data/lib/mongoid/errors/invalid_field_operator.rb +1 -1
- data/lib/mongoid/errors/invalid_field_option.rb +1 -3
- data/lib/mongoid/errors/invalid_field_type.rb +27 -0
- data/lib/mongoid/errors/invalid_find.rb +1 -3
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +23 -0
- data/lib/mongoid/errors/invalid_includes.rb +1 -3
- data/lib/mongoid/errors/invalid_index.rb +1 -3
- data/lib/mongoid/errors/invalid_options.rb +1 -3
- data/lib/mongoid/errors/invalid_path.rb +1 -3
- data/lib/mongoid/errors/invalid_persistence_option.rb +1 -5
- data/lib/mongoid/errors/invalid_query.rb +1 -1
- data/lib/mongoid/errors/invalid_relation.rb +2 -8
- data/lib/mongoid/errors/invalid_relation_option.rb +2 -4
- data/lib/mongoid/errors/invalid_scope.rb +1 -3
- data/lib/mongoid/errors/invalid_session_nesting.rb +17 -0
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +1 -2
- data/lib/mongoid/errors/invalid_storage_options.rb +2 -4
- data/lib/mongoid/errors/invalid_time.rb +1 -3
- data/lib/mongoid/errors/invalid_transaction_nesting.rb +17 -0
- data/lib/mongoid/errors/inverse_not_found.rb +1 -3
- data/lib/mongoid/errors/mixed_client_configuration.rb +1 -3
- data/lib/mongoid/errors/mixed_relations.rb +1 -3
- data/lib/mongoid/errors/mongoid_error.rb +8 -16
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +2 -4
- data/lib/mongoid/errors/no_client_config.rb +1 -3
- data/lib/mongoid/errors/no_client_database.rb +2 -4
- data/lib/mongoid/errors/no_client_hosts.rb +2 -4
- data/lib/mongoid/errors/no_clients_config.rb +1 -3
- data/lib/mongoid/errors/no_default_client.rb +1 -3
- data/lib/mongoid/errors/no_environment.rb +1 -3
- data/lib/mongoid/errors/no_map_reduce_output.rb +1 -3
- data/lib/mongoid/errors/no_metadata.rb +1 -3
- data/lib/mongoid/errors/no_parent.rb +1 -3
- data/lib/mongoid/errors/readonly_attribute.rb +2 -4
- data/lib/mongoid/errors/readonly_document.rb +2 -6
- data/lib/mongoid/errors/rollback.rb +15 -0
- data/lib/mongoid/errors/scope_overwrite.rb +1 -1
- data/lib/mongoid/errors/sessions_not_supported.rb +17 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -2
- data/lib/mongoid/errors/transaction_error.rb +25 -0
- data/lib/mongoid/errors/transactions_not_supported.rb +17 -0
- data/lib/mongoid/errors/unknown_attribute.rb +2 -4
- data/lib/mongoid/errors/unknown_model.rb +1 -3
- data/lib/mongoid/errors/unsaved_document.rb +2 -2
- data/lib/mongoid/errors/unsupported_javascript.rb +1 -3
- data/lib/mongoid/errors/validations.rb +1 -1
- data/lib/mongoid/errors.rb +18 -5
- data/lib/mongoid/evolvable.rb +2 -4
- data/lib/mongoid/extensions/array.rb +20 -58
- data/lib/mongoid/extensions/big_decimal.rb +44 -24
- data/lib/mongoid/extensions/binary.rb +45 -0
- data/lib/mongoid/extensions/boolean.rb +11 -6
- data/lib/mongoid/extensions/date.rb +31 -29
- data/lib/mongoid/extensions/date_time.rb +5 -16
- data/lib/mongoid/extensions/decimal128.rb +3 -5
- data/lib/mongoid/extensions/false_class.rb +8 -10
- data/lib/mongoid/extensions/float.rb +11 -12
- data/lib/mongoid/extensions/hash.rb +28 -148
- data/lib/mongoid/extensions/integer.rb +13 -14
- data/lib/mongoid/extensions/module.rb +5 -5
- data/lib/mongoid/extensions/nil_class.rb +5 -7
- data/lib/mongoid/extensions/object.rb +32 -81
- data/lib/mongoid/extensions/object_id.rb +3 -7
- data/lib/mongoid/extensions/range.rb +47 -24
- data/lib/mongoid/extensions/raw_value.rb +34 -0
- data/lib/mongoid/extensions/regexp.rb +14 -7
- data/lib/mongoid/extensions/set.rb +24 -13
- data/lib/mongoid/extensions/string.rb +30 -62
- data/lib/mongoid/extensions/symbol.rb +9 -22
- data/lib/mongoid/extensions/time.rb +30 -40
- data/lib/mongoid/extensions/time_with_zone.rb +18 -11
- data/lib/mongoid/extensions/true_class.rb +8 -10
- data/lib/mongoid/extensions.rb +3 -20
- data/lib/mongoid/factory.rb +178 -37
- data/lib/mongoid/fields/encrypted.rb +48 -0
- data/lib/mongoid/fields/foreign_key.rb +39 -27
- data/lib/mongoid/fields/localized.rb +25 -15
- data/lib/mongoid/fields/standard.rb +22 -40
- data/lib/mongoid/fields/validators/macro.rb +6 -19
- data/lib/mongoid/fields/validators.rb +1 -1
- data/lib/mongoid/fields.rb +354 -76
- data/lib/mongoid/findable.rb +62 -22
- data/lib/mongoid/indexable/specification.rb +55 -34
- data/lib/mongoid/indexable/validators/options.rb +7 -9
- data/lib/mongoid/indexable.rb +2 -18
- data/lib/mongoid/inspectable.rb +34 -11
- data/lib/mongoid/interceptable.rb +197 -41
- data/lib/mongoid/loadable.rb +83 -0
- data/lib/mongoid/loggable.rb +1 -9
- data/lib/mongoid/matchable.rb +2 -6
- data/lib/mongoid/matcher/all.rb +15 -0
- data/lib/mongoid/matcher/and.rb +14 -0
- data/lib/mongoid/matcher/bits.rb +60 -0
- data/lib/mongoid/matcher/bits_all_clear.rb +41 -0
- data/lib/mongoid/matcher/bits_all_set.rb +41 -0
- data/lib/mongoid/matcher/bits_any_clear.rb +41 -0
- data/lib/mongoid/matcher/bits_any_set.rb +41 -0
- data/lib/mongoid/matcher/elem_match.rb +17 -1
- data/lib/mongoid/matcher/elem_match_expression.rb +14 -2
- data/lib/mongoid/matcher/eq.rb +15 -0
- data/lib/mongoid/matcher/eq_impl.rb +54 -2
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +18 -1
- data/lib/mongoid/matcher/exists.rb +15 -0
- data/lib/mongoid/matcher/expression.rb +22 -14
- data/lib/mongoid/matcher/expression_operator.rb +14 -0
- data/lib/mongoid/matcher/field_expression.rb +19 -5
- data/lib/mongoid/matcher/field_operator.rb +30 -0
- data/lib/mongoid/matcher/gt.rb +15 -0
- data/lib/mongoid/matcher/gte.rb +15 -0
- data/lib/mongoid/matcher/in.rb +15 -0
- data/lib/mongoid/matcher/lt.rb +15 -0
- data/lib/mongoid/matcher/lte.rb +15 -0
- data/lib/mongoid/matcher/mod.rb +33 -0
- data/lib/mongoid/matcher/ne.rb +15 -0
- data/lib/mongoid/matcher/nin.rb +15 -0
- data/lib/mongoid/matcher/nor.rb +14 -0
- data/lib/mongoid/matcher/not.rb +16 -0
- data/lib/mongoid/matcher/or.rb +14 -0
- data/lib/mongoid/matcher/regex.rb +24 -0
- data/lib/mongoid/matcher/size.rb +16 -0
- data/lib/mongoid/matcher/type.rb +124 -0
- data/lib/mongoid/matcher.rb +59 -52
- data/lib/mongoid/persistable/creatable.rb +25 -29
- data/lib/mongoid/persistable/deletable.rb +10 -23
- data/lib/mongoid/persistable/destroyable.rb +37 -11
- data/lib/mongoid/persistable/incrementable.rb +2 -6
- data/lib/mongoid/persistable/logical.rb +1 -5
- data/lib/mongoid/persistable/maxable.rb +37 -0
- data/lib/mongoid/persistable/minable.rb +37 -0
- data/lib/mongoid/persistable/multipliable.rb +36 -0
- data/lib/mongoid/persistable/poppable.rb +1 -5
- data/lib/mongoid/persistable/pullable.rb +1 -7
- data/lib/mongoid/persistable/pushable.rb +1 -7
- data/lib/mongoid/persistable/renamable.rb +1 -5
- data/lib/mongoid/persistable/savable.rb +14 -8
- data/lib/mongoid/persistable/settable.rb +1 -5
- data/lib/mongoid/persistable/unsettable.rb +3 -7
- data/lib/mongoid/persistable/updatable.rb +114 -28
- data/lib/mongoid/persistable/upsertable.rb +33 -8
- data/lib/mongoid/persistable.rb +17 -27
- data/lib/mongoid/persistence_context.rb +111 -43
- data/lib/mongoid/positional.rb +1 -5
- data/lib/mongoid/railtie.rb +23 -15
- data/lib/mongoid/railties/bson_object_id_serializer.rb +39 -0
- data/lib/mongoid/railties/console_sandbox.rb +42 -0
- data/lib/mongoid/railties/controller_runtime.rb +21 -6
- data/lib/mongoid/railties/database.rake +19 -2
- data/lib/mongoid/reloadable.rb +45 -42
- data/lib/mongoid/scopable.rb +25 -53
- data/lib/mongoid/search_indexable.rb +167 -0
- data/lib/mongoid/selectable.rb +6 -17
- data/lib/mongoid/serializable.rb +11 -21
- data/lib/mongoid/shardable.rb +50 -16
- data/lib/mongoid/stateful.rb +66 -22
- data/lib/mongoid/stringified_symbol.rb +19 -7
- data/lib/mongoid/tasks/database.rake +25 -0
- data/lib/mongoid/tasks/database.rb +84 -8
- data/lib/mongoid/tasks/encryption.rake +59 -0
- data/lib/mongoid/tasks/encryption.rb +108 -0
- data/lib/mongoid/threaded/lifecycle.rb +6 -26
- data/lib/mongoid/threaded.rb +131 -92
- data/lib/mongoid/timestamps/created/short.rb +1 -1
- data/lib/mongoid/timestamps/created.rb +4 -4
- data/lib/mongoid/timestamps/short.rb +1 -1
- data/lib/mongoid/timestamps/timeless.rb +29 -7
- data/lib/mongoid/timestamps/updated/short.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +3 -5
- data/lib/mongoid/timestamps.rb +1 -1
- data/lib/mongoid/touchable.rb +155 -29
- data/lib/mongoid/traversable.rb +180 -125
- data/lib/mongoid/utils.rb +52 -0
- data/lib/mongoid/validatable/associated.rb +97 -21
- data/lib/mongoid/validatable/format.rb +1 -1
- data/lib/mongoid/validatable/length.rb +1 -1
- data/lib/mongoid/validatable/localizable.rb +2 -4
- data/lib/mongoid/validatable/macros.rb +10 -14
- data/lib/mongoid/validatable/presence.rb +7 -13
- data/lib/mongoid/validatable/queryable.rb +9 -3
- data/lib/mongoid/validatable/uniqueness.rb +26 -39
- data/lib/mongoid/validatable.rb +20 -29
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/warnings.rb +37 -0
- data/lib/mongoid.rb +56 -22
- data/lib/rails/generators/mongoid/config/config_generator.rb +25 -5
- data/lib/rails/generators/mongoid/config/templates/mongoid.rb +25 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +44 -64
- data/lib/rails/generators/mongoid/model/model_generator.rb +4 -1
- data/lib/rails/generators/mongoid_generator.rb +13 -1
- data/lib/rails/mongoid.rb +4 -32
- data/spec/config/mongoid.yml +16 -1
- data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
- data/spec/integration/active_job_spec.rb +32 -0
- data/spec/integration/app_spec.rb +180 -89
- data/spec/integration/associations/belongs_to_spec.rb +19 -1
- data/spec/integration/associations/embedded_dirty_spec.rb +58 -0
- data/spec/integration/associations/embedded_spec.rb +90 -7
- data/spec/integration/associations/embeds_many_spec.rb +197 -1
- data/spec/integration/associations/embeds_one_spec.rb +19 -1
- data/spec/integration/associations/foreign_key_spec.rb +10 -1
- data/spec/integration/associations/foreign_key_spec_models.rb +1 -1
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +62 -0
- data/spec/integration/associations/has_many_spec.rb +1 -1
- data/spec/integration/associations/has_one_spec.rb +145 -1
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +1 -1
- data/spec/integration/associations/reverse_population_spec.rb +1 -1
- data/spec/integration/associations/reverse_population_spec_models.rb +1 -1
- data/spec/integration/associations/scope_option_spec.rb +102 -0
- data/spec/integration/atomic/modifiers_spec.rb +1 -1
- data/spec/integration/bson_regexp_raw_spec.rb +1 -1
- data/spec/integration/callbacks_models.rb +147 -3
- data/spec/integration/callbacks_spec.rb +398 -8
- data/spec/integration/contextual/empty_spec.rb +142 -0
- data/spec/integration/criteria/alias_query_spec.rb +98 -0
- data/spec/integration/criteria/date_field_spec.rb +2 -2
- data/spec/integration/criteria/default_scope_spec.rb +52 -0
- data/spec/integration/criteria/logical_spec.rb +12 -0
- data/spec/integration/criteria/range_spec.rb +358 -0
- data/spec/integration/criteria/raw_value_spec.rb +525 -0
- data/spec/integration/criteria/time_with_zone_spec.rb +126 -15
- data/spec/integration/discriminator_key_spec.rb +119 -81
- data/spec/integration/discriminator_value_spec.rb +1 -1
- data/spec/integration/document_spec.rb +31 -1
- data/spec/integration/dots_and_dollars_spec.rb +278 -0
- data/spec/integration/encryption_spec.rb +100 -0
- data/spec/integration/i18n_fallbacks_spec.rb +10 -52
- data/spec/integration/matcher_examples_spec.rb +21 -14
- data/spec/integration/matcher_operator_data/bits_all_clear.yml +144 -0
- data/spec/integration/matcher_operator_data/bits_all_set.yml +144 -0
- data/spec/integration/matcher_operator_data/bits_any_clear.yml +144 -0
- data/spec/integration/matcher_operator_data/bits_any_set.yml +144 -0
- data/spec/integration/matcher_operator_data/comment.yml +22 -0
- data/spec/integration/matcher_operator_data/elem_match.yml +46 -0
- data/spec/integration/matcher_operator_data/implicit_traversal.yml +96 -0
- data/spec/integration/matcher_operator_data/in.yml +16 -0
- data/spec/integration/matcher_operator_data/mod.yml +55 -0
- data/spec/integration/matcher_operator_data/size.yml +0 -3
- data/spec/integration/matcher_operator_data/type.yml +64 -0
- data/spec/integration/matcher_operator_data/type_array.yml +15 -0
- data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
- data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
- data/spec/integration/matcher_operator_data/type_code.yml +26 -0
- data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
- data/spec/integration/matcher_operator_data/type_date.yml +39 -0
- data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
- data/spec/integration/matcher_operator_data/type_decimal.yml +37 -0
- data/spec/integration/matcher_operator_data/type_double.yml +15 -0
- data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
- data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
- data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_null.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
- data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
- data/spec/integration/matcher_operator_data/type_string.yml +15 -0
- data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
- data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
- data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
- data/spec/integration/matcher_operator_spec.rb +26 -3
- data/spec/integration/matcher_spec.rb +50 -1
- data/spec/integration/persistence/range_field_spec.rb +351 -0
- data/spec/integration/server_query_spec.rb +1 -1
- data/spec/integration/shardable_spec.rb +1 -1
- data/spec/integration/stringified_symbol_field_spec.rb +17 -3
- data/spec/lite_spec_helper.rb +47 -14
- data/spec/mongoid/association/accessors_spec.rb +31 -19
- data/spec/mongoid/association/auto_save_spec.rb +73 -34
- data/spec/mongoid/association/builders_spec.rb +2 -2
- data/spec/mongoid/association/constrainable_spec.rb +1 -1
- data/spec/mongoid/association/counter_cache_spec.rb +34 -34
- data/spec/mongoid/association/depending_spec.rb +397 -358
- data/spec/mongoid/association/eager_spec.rb +56 -6
- data/spec/mongoid/association/embedded/cyclic_spec.rb +3 -3
- data/spec/mongoid/association/embedded/dirty_spec.rb +3 -3
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +3 -2
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +55 -1
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +110 -23
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +19 -8
- data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +1 -1
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +113 -1
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +712 -203
- data/spec/mongoid/association/embedded/embeds_many_models.rb +189 -1
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +14 -2
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +69 -1
- data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +1 -1
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +26 -1
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +37 -24
- data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +1 -1
- data/spec/mongoid/association/embedded/embeds_one_models.rb +25 -2
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +2 -2
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +29 -1
- data/spec/mongoid/association/macros_spec.rb +10 -10
- data/spec/mongoid/association/nested/many_spec.rb +1 -1
- data/spec/mongoid/association/nested/one_spec.rb +17 -13
- data/spec/mongoid/association/options_spec.rb +1 -1
- data/spec/mongoid/association/polymorphic_spec.rb +1 -1
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +3 -2
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +110 -17
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +51 -15
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +113 -59
- data/spec/mongoid/association/referenced/belongs_to_models.rb +12 -0
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +22 -2
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +27 -22
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -3
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +32 -3
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +386 -376
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +44 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +57 -3
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +131 -1
- data/spec/mongoid/association/referenced/has_many/eager_spec.rb +24 -7
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +313 -134
- data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +1313 -2109
- data/spec/mongoid/association/referenced/has_many_models.rb +39 -2
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_many_spec.rb +47 -1
- data/spec/mongoid/association/referenced/has_one/binding_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +54 -10
- data/spec/mongoid/association/referenced/has_one/eager_spec.rb +18 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +134 -28
- data/spec/mongoid/association/referenced/has_one_models.rb +43 -1
- data/spec/mongoid/association/referenced/has_one_query_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_one_spec.rb +22 -1
- data/spec/mongoid/association/reflections_spec.rb +1 -1
- data/spec/mongoid/association/syncable_spec.rb +47 -33
- data/spec/mongoid/association_spec.rb +1 -1
- data/spec/mongoid/atomic/modifiers_spec.rb +1 -1
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +1 -1
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +1 -1
- data/spec/mongoid/atomic/paths/root_spec.rb +1 -1
- data/spec/mongoid/atomic/paths_spec.rb +65 -27
- data/spec/mongoid/atomic_spec.rb +29 -7
- data/spec/mongoid/atomic_update_preparer_spec.rb +83 -0
- data/spec/mongoid/attributes/dynamic_spec.rb +1 -1
- data/spec/mongoid/attributes/embedded_spec.rb +118 -0
- data/spec/mongoid/attributes/nested_spec.rb +147 -78
- data/spec/mongoid/attributes/nested_spec_models.rb +49 -0
- data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
- data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
- data/spec/mongoid/attributes/projector_spec.rb +41 -0
- data/spec/mongoid/attributes/readonly_spec.rb +23 -23
- data/spec/mongoid/attributes_spec.rb +921 -69
- data/spec/mongoid/cacheable_spec.rb +5 -5
- data/spec/mongoid/changeable_spec.rb +468 -76
- data/spec/mongoid/clients/factory_spec.rb +152 -30
- data/spec/mongoid/clients/options_spec.rb +24 -12
- data/spec/mongoid/clients/sessions_spec.rb +49 -71
- data/spec/mongoid/clients/transactions_spec.rb +971 -176
- data/spec/mongoid/clients/transactions_spec_models.rb +159 -0
- data/spec/mongoid/clients_spec.rb +230 -22
- data/spec/mongoid/collection_configurable_spec.rb +159 -0
- data/spec/mongoid/composable_spec.rb +1 -1
- data/spec/mongoid/config/defaults_spec.rb +99 -0
- data/spec/mongoid/config/encryption_spec.rb +152 -0
- data/spec/mongoid/config/environment_spec.rb +126 -39
- data/spec/mongoid/config/introspection_spec.rb +114 -0
- data/spec/mongoid/config/options_spec.rb +1 -1
- data/spec/mongoid/config_spec.rb +375 -43
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +432 -154
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +63 -0
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +95 -20
- data/spec/mongoid/contextual/aggregable/none_spec.rb +49 -0
- data/spec/mongoid/contextual/atomic_spec.rb +329 -87
- data/spec/mongoid/contextual/map_reduce_spec.rb +5 -19
- data/spec/mongoid/contextual/memory_spec.rb +1479 -127
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +194 -0
- data/spec/mongoid/contextual/mongo_spec.rb +3374 -1254
- data/spec/mongoid/contextual/none_spec.rb +79 -68
- data/spec/mongoid/copyable_spec.rb +465 -23
- data/spec/mongoid/copyable_spec_models.rb +1 -1
- data/spec/mongoid/criteria/findable_spec.rb +295 -229
- data/spec/mongoid/criteria/includable_spec.rb +1493 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +55 -0
- data/spec/mongoid/criteria/inspectable_spec.rb +1 -1
- data/spec/mongoid/criteria/marshalable_spec.rb +19 -2
- data/spec/mongoid/criteria/modifiable_spec.rb +38 -38
- data/spec/mongoid/criteria/options_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/expandable_spec.rb +1 -74
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +8 -20
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +135 -27
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +32 -12
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +12 -1
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +1 -16
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +74 -8
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +238 -179
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -12
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +1 -12
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +48 -132
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +5 -60
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +12 -1
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +12 -1
- data/spec/mongoid/criteria/queryable/key_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +106 -8
- data/spec/mongoid/criteria/queryable/optional_spec.rb +17 -486
- data/spec/mongoid/criteria/queryable/options_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +700 -26
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +149 -683
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +186 -6
- data/spec/mongoid/criteria/queryable/smash_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/storable_spec.rb +87 -1
- data/spec/mongoid/criteria/scopable_spec.rb +128 -1
- data/spec/mongoid/criteria/translator_spec.rb +133 -0
- data/spec/mongoid/criteria_projection_spec.rb +407 -0
- data/spec/mongoid/criteria_spec.rb +1029 -1806
- data/spec/mongoid/document_fields_spec.rb +180 -5
- data/spec/mongoid/document_persistence_context_spec.rb +77 -1
- data/spec/mongoid/document_query_spec.rb +55 -4
- data/spec/mongoid/document_spec.rb +43 -172
- data/spec/mongoid/equality_spec.rb +7 -8
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +1 -1
- data/spec/mongoid/errors/attribute_not_loaded_spec.rb +32 -0
- data/spec/mongoid/errors/callback_spec.rb +1 -1
- data/spec/mongoid/errors/delete_restriction_spec.rb +2 -2
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +1 -1
- data/spec/mongoid/errors/document_not_found_spec.rb +77 -1
- data/spec/mongoid/errors/invalid_collection_spec.rb +1 -1
- data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +6 -6
- data/spec/mongoid/errors/invalid_config_option_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_option_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_spec.rb +2 -2
- data/spec/mongoid/errors/invalid_field_type_spec.rb +56 -0
- data/spec/mongoid/errors/invalid_find_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_includes_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_index_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_options_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_path_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_relation_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_scope_spec.rb +2 -2
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_time_spec.rb +1 -1
- data/spec/mongoid/errors/inverse_not_found_spec.rb +1 -1
- data/spec/mongoid/errors/mixed_client_configuration_spec.rb +1 -1
- data/spec/mongoid/errors/mixed_relations_spec.rb +1 -1
- data/spec/mongoid/errors/mongoid_error_spec.rb +4 -4
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_config_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_database_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_hosts_spec.rb +1 -1
- data/spec/mongoid/errors/no_clients_config_spec.rb +1 -1
- data/spec/mongoid/errors/no_environment_spec.rb +4 -4
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +1 -1
- data/spec/mongoid/errors/no_metadata_spec.rb +1 -1
- data/spec/mongoid/errors/no_parent_spec.rb +1 -1
- data/spec/mongoid/errors/readonly_attribute_spec.rb +1 -1
- data/spec/mongoid/errors/readonly_document_spec.rb +3 -3
- data/spec/mongoid/errors/scope_overwrite_spec.rb +1 -1
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -2
- data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -3
- data/spec/mongoid/errors/unsaved_document_spec.rb +1 -1
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +1 -1
- data/spec/mongoid/errors/validations_spec.rb +1 -1
- data/spec/mongoid/extensions/array_spec.rb +19 -265
- data/spec/mongoid/extensions/big_decimal_spec.rb +713 -213
- data/spec/mongoid/extensions/binary_spec.rb +45 -10
- data/spec/mongoid/extensions/boolean_spec.rb +69 -83
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +15 -11
- data/spec/mongoid/extensions/date_spec.rb +74 -22
- data/spec/mongoid/extensions/date_time_spec.rb +18 -19
- data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
- data/spec/mongoid/extensions/false_class_spec.rb +2 -9
- data/spec/mongoid/extensions/float_spec.rb +56 -84
- data/spec/mongoid/extensions/hash_spec.rb +45 -219
- data/spec/mongoid/extensions/integer_spec.rb +53 -73
- data/spec/mongoid/extensions/module_spec.rb +1 -1
- data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
- data/spec/mongoid/extensions/object_id_spec.rb +1 -1
- data/spec/mongoid/extensions/object_spec.rb +1 -177
- data/spec/mongoid/extensions/range_spec.rb +254 -64
- data/spec/mongoid/extensions/raw_value_spec.rb +67 -0
- data/spec/mongoid/extensions/regexp_spec.rb +59 -34
- data/spec/mongoid/extensions/set_spec.rb +105 -1
- data/spec/mongoid/extensions/string_spec.rb +21 -104
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +1 -1
- data/spec/mongoid/extensions/symbol_spec.rb +15 -53
- data/spec/mongoid/extensions/time_spec.rb +345 -131
- data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -107
- data/spec/mongoid/extensions/true_class_spec.rb +2 -9
- data/spec/mongoid/factory_spec.rb +63 -2
- data/spec/mongoid/fields/foreign_key_spec.rb +282 -120
- data/spec/mongoid/fields/localized_spec.rb +85 -42
- data/spec/mongoid/fields/standard_spec.rb +1 -1
- data/spec/mongoid/fields_spec.rb +826 -121
- data/spec/mongoid/findable_spec.rb +442 -80
- data/spec/mongoid/indexable/specification_spec.rb +132 -14
- data/spec/mongoid/indexable_spec.rb +361 -23
- data/spec/mongoid/inspectable_spec.rb +93 -5
- data/spec/mongoid/interceptable_spec.rb +926 -116
- data/spec/mongoid/interceptable_spec_models.rb +236 -4
- data/spec/mongoid/loading_spec.rb +110 -0
- data/spec/mongoid/loggable_spec.rb +1 -1
- data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
- data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +68 -88
- data/spec/mongoid/matcher/extract_attribute_spec.rb +5 -15
- data/spec/mongoid/mongoizable_spec.rb +286 -0
- data/spec/mongoid/monkey_patches_spec.rb +211 -0
- data/spec/mongoid/persistable/creatable_spec.rb +5 -5
- data/spec/mongoid/persistable/deletable_spec.rb +267 -27
- data/spec/mongoid/persistable/destroyable_spec.rb +409 -24
- data/spec/mongoid/persistable/incrementable_spec.rb +46 -9
- data/spec/mongoid/persistable/logical_spec.rb +42 -5
- data/spec/mongoid/persistable/maxable_spec.rb +147 -0
- data/spec/mongoid/persistable/minable_spec.rb +147 -0
- data/spec/mongoid/persistable/multipliable_spec.rb +227 -0
- data/spec/mongoid/persistable/poppable_spec.rb +41 -5
- data/spec/mongoid/persistable/pullable_spec.rb +81 -9
- data/spec/mongoid/persistable/pushable_spec.rb +81 -9
- data/spec/mongoid/persistable/renamable_spec.rb +40 -4
- data/spec/mongoid/persistable/savable_spec.rb +114 -20
- data/spec/mongoid/persistable/settable_spec.rb +77 -10
- data/spec/mongoid/persistable/unsettable_spec.rb +41 -5
- data/spec/mongoid/persistable/updatable_spec.rb +64 -52
- data/spec/mongoid/persistable/upsertable_spec.rb +124 -4
- data/spec/mongoid/persistable_spec.rb +4 -4
- data/spec/mongoid/persistence_context_spec.rb +58 -59
- data/spec/mongoid/positional_spec.rb +1 -1
- data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +24 -0
- data/spec/mongoid/railties/console_sandbox_spec.rb +44 -0
- data/spec/mongoid/relations/proxy_spec.rb +7 -7
- data/spec/mongoid/reloadable_spec.rb +255 -30
- data/spec/mongoid/scopable_spec.rb +198 -58
- data/spec/mongoid/search_indexable_spec.rb +147 -0
- data/spec/mongoid/selectable_spec.rb +7 -7
- data/spec/mongoid/serializable_spec.rb +19 -40
- data/spec/mongoid/shardable_models.rb +15 -0
- data/spec/mongoid/shardable_spec.rb +181 -31
- data/spec/mongoid/stateful_spec.rb +152 -10
- data/spec/mongoid/tasks/database_rake_spec.rb +193 -42
- data/spec/mongoid/tasks/database_spec.rb +175 -2
- data/spec/mongoid/tasks/encryption_spec.rb +187 -0
- data/spec/mongoid/threaded_spec.rb +40 -3
- data/spec/mongoid/timestamps/created/short_spec.rb +2 -2
- data/spec/mongoid/timestamps/created_spec.rb +2 -2
- data/spec/mongoid/timestamps/timeless_spec.rb +3 -3
- data/spec/mongoid/timestamps/updated/short_spec.rb +4 -4
- data/spec/mongoid/timestamps/updated_spec.rb +4 -4
- data/spec/mongoid/timestamps_spec.rb +399 -11
- data/spec/mongoid/timestamps_spec_models.rb +68 -0
- data/spec/mongoid/touchable_spec.rb +971 -54
- data/spec/mongoid/touchable_spec_models.rb +154 -0
- data/spec/mongoid/traversable_spec.rb +79 -37
- data/spec/mongoid/validatable/associated_spec.rb +14 -31
- data/spec/mongoid/validatable/format_spec.rb +1 -1
- data/spec/mongoid/validatable/length_spec.rb +1 -1
- data/spec/mongoid/validatable/numericality_spec.rb +1 -1
- data/spec/mongoid/validatable/presence_spec.rb +27 -23
- data/spec/mongoid/validatable/uniqueness_spec.rb +170 -99
- data/spec/mongoid/validatable_spec.rb +4 -4
- data/spec/mongoid/warnings_spec.rb +36 -0
- data/spec/mongoid_spec.rb +61 -11
- data/spec/rails/controller_extension/controller_runtime_spec.rb +3 -3
- data/spec/rails/mongoid_spec.rb +28 -132
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/bin/s3-copy +45 -0
- data/spec/shared/bin/s3-upload +69 -0
- data/spec/shared/lib/mrss/cluster_config.rb +24 -4
- data/spec/shared/lib/mrss/constraints.rb +77 -29
- data/spec/shared/lib/mrss/docker_runner.rb +40 -4
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +64 -1
- data/spec/shared/lib/mrss/server_version_registry.rb +78 -34
- data/spec/shared/lib/mrss/session_registry.rb +69 -0
- data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
- data/spec/shared/lib/mrss/utils.rb +37 -0
- data/spec/shared/share/Dockerfile.erb +123 -71
- data/spec/shared/share/haproxy-1.conf +16 -0
- data/spec/shared/share/haproxy-2.conf +17 -0
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/distro.sh +2 -1
- data/spec/shared/shlib/server.sh +187 -40
- data/spec/shared/shlib/set_env.sh +49 -31
- data/spec/spec_helper.rb +46 -49
- data/spec/support/authorization.rb +1 -1
- data/spec/support/client_registry.rb +10 -0
- data/spec/support/constraints.rb +25 -1
- data/spec/support/crypt/models.rb +50 -0
- data/spec/support/crypt.rb +80 -0
- data/spec/support/expectations.rb +1 -1
- data/spec/support/feature_sandbox.rb +72 -0
- data/spec/support/helpers.rb +1 -0
- data/spec/support/immutable_ids.rb +119 -0
- data/spec/support/macros.rb +107 -1
- data/spec/support/models/account.rb +2 -2
- data/spec/support/models/acolyte.rb +1 -1
- data/spec/support/models/actor.rb +1 -1
- data/spec/support/models/actress.rb +1 -1
- data/spec/support/models/address.rb +7 -1
- data/spec/support/models/address_component.rb +1 -1
- data/spec/support/models/address_number.rb +1 -1
- data/spec/support/models/agency.rb +1 -1
- data/spec/support/models/agent.rb +1 -1
- data/spec/support/models/album.rb +1 -1
- data/spec/support/models/alert.rb +1 -1
- data/spec/support/models/animal.rb +1 -1
- data/spec/support/models/answer.rb +1 -1
- data/spec/support/models/appointment.rb +1 -1
- data/spec/support/models/armrest.rb +1 -1
- data/spec/support/models/array_field.rb +1 -1
- data/spec/support/models/article.rb +1 -1
- data/spec/support/models/artist.rb +3 -2
- data/spec/support/models/artwork.rb +1 -1
- data/spec/support/models/audible_sound.rb +4 -0
- data/spec/support/models/audio.rb +1 -1
- data/spec/support/models/augmentation.rb +13 -1
- data/spec/support/models/author.rb +1 -1
- data/spec/support/models/baby.rb +1 -1
- data/spec/support/models/band.rb +13 -1
- data/spec/support/models/bar.rb +1 -1
- data/spec/support/models/basic.rb +1 -1
- data/spec/support/models/bed.rb +1 -1
- data/spec/support/models/big_palette.rb +1 -1
- data/spec/support/models/birthday.rb +1 -1
- data/spec/support/models/bolt.rb +8 -0
- data/spec/support/models/bomb.rb +1 -1
- data/spec/support/models/book.rb +2 -1
- data/spec/support/models/breed.rb +1 -1
- data/spec/support/models/browser.rb +1 -1
- data/spec/support/models/building.rb +3 -1
- data/spec/support/models/building_address.rb +1 -1
- data/spec/support/models/bus.rb +1 -1
- data/spec/support/models/business.rb +1 -1
- data/spec/support/models/callback_test.rb +1 -1
- data/spec/support/models/canvas.rb +1 -1
- data/spec/support/models/car.rb +1 -1
- data/spec/support/models/cat.rb +1 -1
- data/spec/support/models/catalog.rb +25 -0
- data/spec/support/models/category.rb +1 -1
- data/spec/support/models/child.rb +1 -1
- data/spec/support/models/child_doc.rb +4 -4
- data/spec/support/models/church.rb +1 -1
- data/spec/support/models/circle.rb +1 -1
- data/spec/support/models/circuit.rb +1 -1
- data/spec/support/models/circus.rb +4 -1
- data/spec/support/models/code.rb +3 -1
- data/spec/support/models/coding/pull_request.rb +1 -1
- data/spec/support/models/coding.rb +1 -1
- data/spec/support/models/comment.rb +1 -1
- data/spec/support/models/company.rb +1 -1
- data/spec/support/models/consumption_period.rb +1 -1
- data/spec/support/models/contextable_item.rb +1 -1
- data/spec/support/models/contractor.rb +1 -1
- data/spec/support/models/cookie.rb +1 -1
- data/spec/support/models/country_code.rb +3 -1
- data/spec/support/models/courier_job.rb +1 -1
- data/spec/support/models/cover.rb +11 -0
- data/spec/support/models/crate.rb +1 -1
- data/spec/support/models/customer.rb +1 -1
- data/spec/support/models/customer_address.rb +1 -1
- data/spec/support/models/deed.rb +1 -1
- data/spec/support/models/definition.rb +1 -1
- data/spec/support/models/delegating_patient.rb +1 -1
- data/spec/support/models/description.rb +1 -1
- data/spec/support/models/dictionary.rb +1 -1
- data/spec/support/models/division.rb +1 -1
- data/spec/support/models/doctor.rb +1 -1
- data/spec/support/models/dog.rb +1 -1
- data/spec/support/models/dokument.rb +1 -1
- data/spec/support/models/draft.rb +1 -1
- data/spec/support/models/dragon.rb +1 -1
- data/spec/support/models/driver.rb +1 -1
- data/spec/support/models/drug.rb +1 -1
- data/spec/support/models/dungeon.rb +1 -1
- data/spec/support/models/edit.rb +1 -1
- data/spec/support/models/email.rb +1 -1
- data/spec/support/models/employer.rb +1 -1
- data/spec/support/models/entry.rb +1 -1
- data/spec/support/models/eraser.rb +1 -1
- data/spec/support/models/even.rb +1 -1
- data/spec/support/models/event.rb +1 -1
- data/spec/support/models/exhibition.rb +1 -1
- data/spec/support/models/exhibitor.rb +1 -1
- data/spec/support/models/explosion.rb +1 -1
- data/spec/support/models/eye.rb +1 -1
- data/spec/support/models/eye_bowl.rb +1 -1
- data/spec/support/models/face.rb +1 -1
- data/spec/support/models/fanatic.rb +9 -0
- data/spec/support/models/favorite.rb +8 -2
- data/spec/support/models/filesystem.rb +1 -1
- data/spec/support/models/fire_hydrant.rb +1 -1
- data/spec/support/models/firefox.rb +1 -1
- data/spec/support/models/fish.rb +1 -1
- data/spec/support/models/folder.rb +1 -1
- data/spec/support/models/folder_item.rb +1 -1
- data/spec/support/models/fruits.rb +1 -1
- data/spec/support/models/game.rb +1 -1
- data/spec/support/models/ghost.rb +1 -1
- data/spec/support/models/guitar.rb +1 -1
- data/spec/support/models/hole.rb +13 -0
- data/spec/support/models/home.rb +1 -1
- data/spec/support/models/house.rb +1 -1
- data/spec/support/models/html_writer.rb +1 -1
- data/spec/support/models/id_key.rb +1 -1
- data/spec/support/models/idnodef.rb +1 -1
- data/spec/support/models/image.rb +1 -1
- data/spec/support/models/implant.rb +10 -1
- data/spec/support/models/instrument.rb +1 -1
- data/spec/support/models/item.rb +1 -1
- data/spec/support/models/jar.rb +1 -1
- data/spec/support/models/kaleidoscope.rb +1 -1
- data/spec/support/models/kangaroo.rb +1 -1
- data/spec/support/models/label.rb +5 -2
- data/spec/support/models/language.rb +1 -1
- data/spec/support/models/lat_lng.rb +1 -1
- data/spec/support/models/league.rb +1 -1
- data/spec/support/models/learner.rb +1 -1
- data/spec/support/models/line_item.rb +1 -1
- data/spec/support/models/location.rb +1 -1
- data/spec/support/models/login.rb +1 -1
- data/spec/support/models/manufacturer.rb +1 -1
- data/spec/support/models/meat.rb +1 -1
- data/spec/support/models/membership.rb +2 -1
- data/spec/support/models/message.rb +1 -1
- data/spec/support/models/minim.rb +1 -1
- data/spec/support/models/mixed_drink.rb +1 -1
- data/spec/support/models/mop.rb +10 -1
- data/spec/support/models/movie.rb +1 -1
- data/spec/support/models/my_hash.rb +1 -1
- data/spec/support/models/name.rb +11 -1
- data/spec/support/models/name_only.rb +1 -1
- data/spec/support/models/node.rb +1 -1
- data/spec/support/models/note.rb +1 -1
- data/spec/support/models/nut.rb +8 -0
- data/spec/support/models/odd.rb +1 -1
- data/spec/support/models/order.rb +3 -1
- data/spec/support/models/ordered_post.rb +2 -2
- data/spec/support/models/ordered_preference.rb +1 -1
- data/spec/support/models/oscar.rb +1 -1
- data/spec/support/models/other_owner_object.rb +1 -1
- data/spec/support/models/override.rb +1 -1
- data/spec/support/models/ownable.rb +1 -1
- data/spec/support/models/owner.rb +1 -1
- data/spec/support/models/pack.rb +1 -1
- data/spec/support/models/page.rb +1 -1
- data/spec/support/models/page_question.rb +1 -1
- data/spec/support/models/palette.rb +1 -1
- data/spec/support/models/parent.rb +1 -1
- data/spec/support/models/parent_doc.rb +1 -1
- data/spec/support/models/passport.rb +15 -1
- data/spec/support/models/patient.rb +1 -1
- data/spec/support/models/pdf_writer.rb +1 -1
- data/spec/support/models/pencil.rb +1 -1
- data/spec/support/models/person.rb +19 -1
- data/spec/support/models/pet.rb +1 -1
- data/spec/support/models/pet_owner.rb +1 -1
- data/spec/support/models/phone.rb +3 -2
- data/spec/support/models/piano.rb +1 -1
- data/spec/support/models/pizza.rb +1 -1
- data/spec/support/models/player.rb +3 -1
- data/spec/support/models/post.rb +1 -1
- data/spec/support/models/post_genre.rb +1 -1
- data/spec/support/models/powerup.rb +13 -1
- data/spec/support/models/preference.rb +1 -1
- data/spec/support/models/princess.rb +1 -1
- data/spec/support/models/product.rb +2 -1
- data/spec/support/models/profile.rb +1 -1
- data/spec/support/models/pronunciation.rb +1 -1
- data/spec/support/models/pub.rb +1 -1
- data/spec/support/models/publication/encyclopedia.rb +1 -1
- data/spec/support/models/publication/review.rb +1 -1
- data/spec/support/models/publication.rb +1 -1
- data/spec/support/models/purchase.rb +1 -1
- data/spec/support/models/purchased_item.rb +11 -0
- data/spec/support/models/purse.rb +9 -0
- data/spec/support/models/question.rb +1 -1
- data/spec/support/models/quiz.rb +1 -1
- data/spec/support/models/rating.rb +1 -1
- data/spec/support/models/record.rb +1 -1
- data/spec/support/models/registry.rb +2 -1
- data/spec/support/models/role.rb +1 -1
- data/spec/support/models/root_category.rb +1 -1
- data/spec/support/models/sandbox/app/models/app_models_message.rb +4 -0
- data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
- data/spec/support/models/sandbox/sandbox_message.rb +4 -0
- data/spec/support/models/sandbox/sandbox_user.rb +4 -0
- data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
- data/spec/support/models/sandwich.rb +1 -1
- data/spec/support/models/scheduler.rb +1 -1
- data/spec/support/models/school.rb +15 -0
- data/spec/support/models/scribe.rb +1 -1
- data/spec/support/models/sealer.rb +8 -0
- data/spec/support/models/seat.rb +1 -1
- data/spec/support/models/seo.rb +1 -1
- data/spec/support/models/series.rb +1 -1
- data/spec/support/models/server.rb +1 -1
- data/spec/support/models/service.rb +1 -1
- data/spec/support/models/shape.rb +1 -1
- data/spec/support/models/shelf.rb +1 -1
- data/spec/support/models/shield.rb +19 -0
- data/spec/support/models/shipment_address.rb +1 -1
- data/spec/support/models/shipping_container.rb +1 -1
- data/spec/support/models/shipping_pack.rb +1 -1
- data/spec/support/models/shirt.rb +12 -0
- data/spec/support/models/shop.rb +1 -1
- data/spec/support/models/short_agent.rb +1 -1
- data/spec/support/models/short_quiz.rb +1 -1
- data/spec/support/models/simple.rb +1 -1
- data/spec/support/models/slave.rb +1 -1
- data/spec/support/models/song.rb +1 -1
- data/spec/support/models/sound.rb +1 -1
- data/spec/support/models/spacer.rb +8 -0
- data/spec/support/models/square.rb +1 -1
- data/spec/support/models/staff.rb +1 -1
- data/spec/support/models/store_as_dup_test1.rb +1 -1
- data/spec/support/models/store_as_dup_test2.rb +1 -1
- data/spec/support/models/store_as_dup_test3.rb +1 -1
- data/spec/support/models/store_as_dup_test4.rb +1 -1
- data/spec/support/models/strategy.rb +1 -1
- data/spec/support/models/student.rb +15 -0
- data/spec/support/models/sub_item.rb +1 -1
- data/spec/support/models/subscription.rb +1 -1
- data/spec/support/models/survey.rb +1 -1
- data/spec/support/models/symptom.rb +1 -1
- data/spec/support/models/system_role.rb +1 -0
- data/spec/support/models/tag.rb +1 -1
- data/spec/support/models/target.rb +1 -1
- data/spec/support/models/template.rb +1 -1
- data/spec/support/models/thing.rb +1 -1
- data/spec/support/models/threadlocker.rb +8 -0
- data/spec/support/models/title.rb +1 -1
- data/spec/support/models/tool.rb +1 -1
- data/spec/support/models/topping.rb +1 -1
- data/spec/support/models/toy.rb +1 -1
- data/spec/support/models/track.rb +1 -1
- data/spec/support/models/translation.rb +1 -1
- data/spec/support/models/tree.rb +1 -1
- data/spec/support/models/truck.rb +1 -1
- data/spec/support/models/updatable.rb +1 -1
- data/spec/support/models/user.rb +1 -1
- data/spec/support/models/user_account.rb +1 -1
- data/spec/support/models/validation_callback.rb +1 -1
- data/spec/support/models/vehicle.rb +1 -1
- data/spec/support/models/version.rb +1 -1
- data/spec/support/models/vertex.rb +1 -1
- data/spec/support/models/vet_visit.rb +1 -1
- data/spec/support/models/video.rb +1 -1
- data/spec/support/models/video_game.rb +1 -1
- data/spec/support/models/washer.rb +8 -0
- data/spec/support/models/weapon.rb +13 -1
- data/spec/support/models/wiki_page.rb +1 -1
- data/spec/support/models/word.rb +1 -1
- data/spec/support/models/word_origin.rb +1 -1
- data/spec/support/models/writer.rb +1 -1
- data/spec/support/rails_mock.rb +32 -0
- data/spec/support/schema_maps/schema_map_aws.json +17 -0
- data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_azure.json +17 -0
- data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_gcp.json +17 -0
- data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_kmip.json +17 -0
- data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_local.json +18 -0
- data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/shared/time.rb +3 -22
- data/spec/support/sinatra_mock.rb +7 -0
- data/spec/support/spec_config.rb +42 -7
- data.tar.gz.sig +0 -0
- metadata +883 -562
- metadata.gz.sig +0 -0
- data/lib/mongoid/association/referenced/eager.rb +0 -184
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -128
- data/lib/mongoid/contextual/geo_near.rb +0 -269
- data/lib/mongoid/errors/eager_load.rb +0 -26
- data/lib/mongoid/errors/invalid_session_use.rb +0 -26
- data/lib/mongoid/errors/invalid_storage_parent.rb +0 -28
- data/lib/mongoid/errors/invalid_value.rb +0 -18
- data/lib/mongoid/query_cache.rb +0 -333
- data/lib/support/ruby_version.rb +0 -29
- data/spec/mongoid/contextual/geo_near_spec.rb +0 -472
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -61
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -61
- data/spec/mongoid/extensions_spec.rb +0 -32
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -61
- data/spec/mongoid/query_cache_spec.rb +0 -978
- data/spec/support/cluster_config.rb +0 -158
- data/spec/support/session_registry.rb +0 -50
data/spec/mongoid/fields_spec.rb
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
#
|
|
2
|
+
# rubocop:todo all
|
|
3
3
|
|
|
4
4
|
require "spec_helper"
|
|
5
5
|
|
|
6
6
|
describe Mongoid::Fields do
|
|
7
7
|
|
|
8
|
-
before(:all) do
|
|
9
|
-
Mongoid.use_activesupport_time_zone = false
|
|
10
|
-
end
|
|
11
|
-
|
|
12
8
|
describe "#\{field}_translations" do
|
|
13
9
|
|
|
14
10
|
let(:product) do
|
|
@@ -18,18 +14,15 @@ describe Mongoid::Fields do
|
|
|
18
14
|
context "when the field is localized" do
|
|
19
15
|
|
|
20
16
|
context "when translations exist" do
|
|
17
|
+
with_default_i18n_configs
|
|
21
18
|
|
|
22
19
|
before do
|
|
20
|
+
I18n.locale = :en
|
|
23
21
|
product.description = "test"
|
|
24
|
-
I18n.
|
|
25
|
-
::I18n.locale = :de
|
|
22
|
+
I18n.locale = :de
|
|
26
23
|
product.description = "The best"
|
|
27
24
|
end
|
|
28
25
|
|
|
29
|
-
after do
|
|
30
|
-
::I18n.locale = :en
|
|
31
|
-
end
|
|
32
|
-
|
|
33
26
|
let(:translations) do
|
|
34
27
|
product.description_translations
|
|
35
28
|
end
|
|
@@ -110,7 +103,7 @@ describe Mongoid::Fields do
|
|
|
110
103
|
context "when saving the new translations" do
|
|
111
104
|
|
|
112
105
|
before do
|
|
113
|
-
product.save
|
|
106
|
+
product.save!
|
|
114
107
|
end
|
|
115
108
|
|
|
116
109
|
it "persists the changes" do
|
|
@@ -121,7 +114,7 @@ describe Mongoid::Fields do
|
|
|
121
114
|
|
|
122
115
|
before do
|
|
123
116
|
product.description_translations = { "en" => "overwritten" }
|
|
124
|
-
product.save
|
|
117
|
+
product.save!
|
|
125
118
|
end
|
|
126
119
|
|
|
127
120
|
it "persists the changes" do
|
|
@@ -152,7 +145,7 @@ describe Mongoid::Fields do
|
|
|
152
145
|
context "when saving the new translations" do
|
|
153
146
|
|
|
154
147
|
before do
|
|
155
|
-
dictionary.save
|
|
148
|
+
dictionary.save!
|
|
156
149
|
end
|
|
157
150
|
|
|
158
151
|
it "persists the changes" do
|
|
@@ -165,7 +158,7 @@ describe Mongoid::Fields do
|
|
|
165
158
|
|
|
166
159
|
before do
|
|
167
160
|
dictionary.description_translations = { "en" => "overwritten" }
|
|
168
|
-
dictionary.save
|
|
161
|
+
dictionary.save!
|
|
169
162
|
end
|
|
170
163
|
|
|
171
164
|
it "persists the changes" do
|
|
@@ -322,7 +315,7 @@ describe Mongoid::Fields do
|
|
|
322
315
|
end
|
|
323
316
|
|
|
324
317
|
it "converts to Mongoid::Boolean" do
|
|
325
|
-
expect(klass.field(:test, type: Boolean).type).to be(Mongoid::Boolean)
|
|
318
|
+
expect(klass.field(:test, type: Mongoid::Boolean).type).to be(Mongoid::Boolean)
|
|
326
319
|
end
|
|
327
320
|
end
|
|
328
321
|
|
|
@@ -397,6 +390,22 @@ describe Mongoid::Fields do
|
|
|
397
390
|
it "converts :time to Time" do
|
|
398
391
|
expect(klass.field(:test, type: :time).type).to be(Time)
|
|
399
392
|
end
|
|
393
|
+
|
|
394
|
+
context 'when using an unknown symbol' do
|
|
395
|
+
it 'raises InvalidFieldType' do
|
|
396
|
+
lambda do
|
|
397
|
+
klass.field(:test, type: :bogus)
|
|
398
|
+
end.should raise_error(Mongoid::Errors::InvalidFieldType, /defines a field 'test' with an unknown type value :bogus/)
|
|
399
|
+
end
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
context 'when using an unknown string' do
|
|
403
|
+
it 'raises InvalidFieldType' do
|
|
404
|
+
lambda do
|
|
405
|
+
klass.field(:test, type: 'bogus')
|
|
406
|
+
end.should raise_error(Mongoid::Errors::InvalidFieldType, /defines a field 'test' with an unknown type value "bogus"/)
|
|
407
|
+
end
|
|
408
|
+
end
|
|
400
409
|
end
|
|
401
410
|
|
|
402
411
|
context "when the options are valid" do
|
|
@@ -404,7 +413,7 @@ describe Mongoid::Fields do
|
|
|
404
413
|
context "when the options are all standard" do
|
|
405
414
|
|
|
406
415
|
before do
|
|
407
|
-
Band.field :acceptable, type: Boolean
|
|
416
|
+
Band.field :acceptable, type: Mongoid::Boolean
|
|
408
417
|
end
|
|
409
418
|
|
|
410
419
|
after do
|
|
@@ -419,7 +428,7 @@ describe Mongoid::Fields do
|
|
|
419
428
|
context "when a custom option is provided" do
|
|
420
429
|
|
|
421
430
|
before do
|
|
422
|
-
Band.field :acceptable, type: Boolean, custom: true
|
|
431
|
+
Band.field :acceptable, type: Mongoid::Boolean, custom: true
|
|
423
432
|
end
|
|
424
433
|
|
|
425
434
|
it "adds the field to the model" do
|
|
@@ -431,25 +440,25 @@ describe Mongoid::Fields do
|
|
|
431
440
|
context "when the Symbol type is used" do
|
|
432
441
|
|
|
433
442
|
before do
|
|
434
|
-
Mongoid::
|
|
435
|
-
@
|
|
443
|
+
Mongoid::Warnings.class_eval do
|
|
444
|
+
@symbol_type_deprecated = false
|
|
436
445
|
end
|
|
437
446
|
end
|
|
438
447
|
|
|
439
448
|
after do
|
|
440
|
-
|
|
449
|
+
Label.fields.delete("should_warn")
|
|
441
450
|
end
|
|
442
451
|
|
|
443
452
|
it "warns that the BSON symbol type is deprecated" do
|
|
444
453
|
expect(Mongoid.logger).to receive(:warn)
|
|
445
454
|
|
|
446
|
-
|
|
455
|
+
Label.field :should_warn, type: Symbol
|
|
447
456
|
end
|
|
448
457
|
|
|
449
458
|
it "warns on first use of Symbol type only" do
|
|
450
459
|
expect(Mongoid.logger).to receive(:warn).once
|
|
451
460
|
|
|
452
|
-
|
|
461
|
+
Label.field :should_warn, type: Symbol
|
|
453
462
|
end
|
|
454
463
|
|
|
455
464
|
context 'when using Symbol field type in multiple classes' do
|
|
@@ -460,7 +469,7 @@ describe Mongoid::Fields do
|
|
|
460
469
|
it "warns on first use of Symbol type only" do
|
|
461
470
|
expect(Mongoid.logger).to receive(:warn).once
|
|
462
471
|
|
|
463
|
-
|
|
472
|
+
Label.field :should_warn, type: Symbol
|
|
464
473
|
Truck.field :should_warn, type: Symbol
|
|
465
474
|
end
|
|
466
475
|
end
|
|
@@ -470,7 +479,7 @@ describe Mongoid::Fields do
|
|
|
470
479
|
|
|
471
480
|
it "raises an error" do
|
|
472
481
|
expect {
|
|
473
|
-
|
|
482
|
+
Label.field :unacceptable, bad: true
|
|
474
483
|
}.to raise_error(Mongoid::Errors::InvalidFieldOption)
|
|
475
484
|
end
|
|
476
485
|
end
|
|
@@ -515,16 +524,13 @@ describe Mongoid::Fields do
|
|
|
515
524
|
end
|
|
516
525
|
|
|
517
526
|
context "when a single locale is set" do
|
|
527
|
+
with_default_i18n_configs
|
|
518
528
|
|
|
519
529
|
before do
|
|
520
|
-
|
|
530
|
+
I18n.locale = :de
|
|
521
531
|
product.description = "The best"
|
|
522
532
|
end
|
|
523
533
|
|
|
524
|
-
after do
|
|
525
|
-
::I18n.locale = :en
|
|
526
|
-
end
|
|
527
|
-
|
|
528
534
|
let(:description) do
|
|
529
535
|
product.description
|
|
530
536
|
end
|
|
@@ -535,17 +541,15 @@ describe Mongoid::Fields do
|
|
|
535
541
|
end
|
|
536
542
|
|
|
537
543
|
context "when multiple locales are set" do
|
|
544
|
+
with_default_i18n_configs
|
|
538
545
|
|
|
539
546
|
before do
|
|
547
|
+
I18n.locale = :end
|
|
540
548
|
product.description = "Cheap drinks"
|
|
541
|
-
|
|
549
|
+
I18n.locale = :de
|
|
542
550
|
product.description = "Cheaper drinks"
|
|
543
551
|
end
|
|
544
552
|
|
|
545
|
-
after do
|
|
546
|
-
::I18n.locale = :en
|
|
547
|
-
end
|
|
548
|
-
|
|
549
553
|
let(:description) do
|
|
550
554
|
product.description
|
|
551
555
|
end
|
|
@@ -555,6 +559,49 @@ describe Mongoid::Fields do
|
|
|
555
559
|
end
|
|
556
560
|
end
|
|
557
561
|
end
|
|
562
|
+
|
|
563
|
+
context 'when the field is declared as BSON::Decimal128' do
|
|
564
|
+
let(:document) { Mop.create!(decimal128_field: BSON::Decimal128.new(Math::PI.to_s)).reload }
|
|
565
|
+
|
|
566
|
+
shared_context 'BSON::Decimal128 is BigDecimal' do
|
|
567
|
+
it 'should return a BigDecimal' do
|
|
568
|
+
expect(document.decimal128_field).to be_a BigDecimal
|
|
569
|
+
end
|
|
570
|
+
end
|
|
571
|
+
|
|
572
|
+
shared_context 'BSON::Decimal128 is BSON::Decimal128' do
|
|
573
|
+
it 'should return a BSON::Decimal128' do
|
|
574
|
+
expect(document.decimal128_field).to be_a BSON::Decimal128
|
|
575
|
+
end
|
|
576
|
+
end
|
|
577
|
+
|
|
578
|
+
it 'is declared as BSON::Decimal128' do
|
|
579
|
+
expect(Mop.fields['decimal128_field'].type).to be == BSON::Decimal128
|
|
580
|
+
end
|
|
581
|
+
|
|
582
|
+
context 'when BSON version <= 4' do
|
|
583
|
+
max_bson_version '4.99.99'
|
|
584
|
+
it_behaves_like 'BSON::Decimal128 is BSON::Decimal128'
|
|
585
|
+
end
|
|
586
|
+
|
|
587
|
+
context 'when BSON version >= 5' do
|
|
588
|
+
min_bson_version '5.0.0'
|
|
589
|
+
|
|
590
|
+
context 'when allow_bson5_decimal128 is false' do
|
|
591
|
+
config_override :allow_bson5_decimal128, false
|
|
592
|
+
it_behaves_like 'BSON::Decimal128 is BigDecimal'
|
|
593
|
+
end
|
|
594
|
+
|
|
595
|
+
context 'when allow_bson5_decimal128 is true' do
|
|
596
|
+
config_override :allow_bson5_decimal128, true
|
|
597
|
+
it_behaves_like 'BSON::Decimal128 is BSON::Decimal128'
|
|
598
|
+
end
|
|
599
|
+
|
|
600
|
+
context 'when allow_bson5_decimal128 is default' do
|
|
601
|
+
it_behaves_like 'BSON::Decimal128 is BigDecimal'
|
|
602
|
+
end
|
|
603
|
+
end
|
|
604
|
+
end
|
|
558
605
|
end
|
|
559
606
|
|
|
560
607
|
describe "#getter_before_type_cast" do
|
|
@@ -572,8 +619,144 @@ describe Mongoid::Fields do
|
|
|
572
619
|
context "when the attribute has been assigned" do
|
|
573
620
|
|
|
574
621
|
it "returns the attribute before type cast" do
|
|
575
|
-
person.age = "
|
|
576
|
-
expect(person.age_before_type_cast).to eq("
|
|
622
|
+
person.age = "42"
|
|
623
|
+
expect(person.age_before_type_cast).to eq("42")
|
|
624
|
+
end
|
|
625
|
+
end
|
|
626
|
+
|
|
627
|
+
context "when reloading" do
|
|
628
|
+
|
|
629
|
+
let(:product) do
|
|
630
|
+
Product.create!(price: '1')
|
|
631
|
+
end
|
|
632
|
+
|
|
633
|
+
before do
|
|
634
|
+
product.reload
|
|
635
|
+
end
|
|
636
|
+
|
|
637
|
+
it "resets the attributes_before_type_cast to the attributes hash" do
|
|
638
|
+
expect(product.attributes_before_type_cast).to eq(product.attributes)
|
|
639
|
+
end
|
|
640
|
+
|
|
641
|
+
it "the *_before_type_cast method returns the demongoized value" do
|
|
642
|
+
expect(product.price_before_type_cast).to eq(1)
|
|
643
|
+
end
|
|
644
|
+
end
|
|
645
|
+
|
|
646
|
+
context "when reloading and writing a demongoizable value" do
|
|
647
|
+
|
|
648
|
+
let(:product) do
|
|
649
|
+
Product.create!.tap do |product|
|
|
650
|
+
Product.collection.update_one({ _id: product.id }, { :$set => { price: '1' }})
|
|
651
|
+
end
|
|
652
|
+
end
|
|
653
|
+
|
|
654
|
+
before do
|
|
655
|
+
product.reload
|
|
656
|
+
end
|
|
657
|
+
|
|
658
|
+
it "resets the attributes_before_type_cast to the attributes hash" do
|
|
659
|
+
expect(product.attributes_before_type_cast).to eq(product.attributes)
|
|
660
|
+
end
|
|
661
|
+
|
|
662
|
+
it "the *_before_type_cast method returns the mongoized value" do
|
|
663
|
+
expect(product.price_before_type_cast).to eq('1')
|
|
664
|
+
end
|
|
665
|
+
end
|
|
666
|
+
|
|
667
|
+
context "when reading from the db" do
|
|
668
|
+
|
|
669
|
+
let(:product) do
|
|
670
|
+
Product.create!(price: '1')
|
|
671
|
+
end
|
|
672
|
+
|
|
673
|
+
let(:from_db) do
|
|
674
|
+
Product.find(product.id)
|
|
675
|
+
end
|
|
676
|
+
|
|
677
|
+
it "resets the attributes_before_type_cast to the attributes hash" do
|
|
678
|
+
expect(from_db.attributes_before_type_cast).to eq(from_db.attributes)
|
|
679
|
+
end
|
|
680
|
+
|
|
681
|
+
it "the *_before_type_cast method returns the demongoized value" do
|
|
682
|
+
expect(from_db.price_before_type_cast).to eq(1)
|
|
683
|
+
end
|
|
684
|
+
end
|
|
685
|
+
|
|
686
|
+
context "when reading from the db after writing a demongoizable value" do
|
|
687
|
+
|
|
688
|
+
let(:product) do
|
|
689
|
+
Product.create!.tap do |product|
|
|
690
|
+
Product.collection.update_one({ _id: product.id }, { :$set => { price: '1' }})
|
|
691
|
+
end
|
|
692
|
+
end
|
|
693
|
+
|
|
694
|
+
let(:from_db) do
|
|
695
|
+
Product.find(product.id)
|
|
696
|
+
end
|
|
697
|
+
|
|
698
|
+
it "resets the attributes_before_type_cast to the attributes hash" do
|
|
699
|
+
expect(from_db.attributes_before_type_cast).to eq(from_db.attributes)
|
|
700
|
+
end
|
|
701
|
+
|
|
702
|
+
it "the *_before_type_cast method returns the mongoized value" do
|
|
703
|
+
expect(from_db.price_before_type_cast).to eq('1')
|
|
704
|
+
end
|
|
705
|
+
end
|
|
706
|
+
|
|
707
|
+
context "when making a new model" do
|
|
708
|
+
|
|
709
|
+
context "when using new with no options" do
|
|
710
|
+
let(:product) { Product.new }
|
|
711
|
+
|
|
712
|
+
it "sets the attributes_before_type_cast to the attributes hash" do
|
|
713
|
+
expect(product.attributes_before_type_cast).to eq(product.attributes)
|
|
714
|
+
end
|
|
715
|
+
end
|
|
716
|
+
|
|
717
|
+
context "when using new with options" do
|
|
718
|
+
let(:product) { Product.new(price: '1') }
|
|
719
|
+
|
|
720
|
+
let(:abtc) do
|
|
721
|
+
product.attributes.merge('price' => '1')
|
|
722
|
+
end
|
|
723
|
+
|
|
724
|
+
it "has the attributes before type cast" do
|
|
725
|
+
expect(product.attributes_before_type_cast).to eq(abtc)
|
|
726
|
+
end
|
|
727
|
+
end
|
|
728
|
+
|
|
729
|
+
context "when persisting the model" do
|
|
730
|
+
let(:product) { Product.new(price: '1') }
|
|
731
|
+
|
|
732
|
+
let(:abtc) do
|
|
733
|
+
product.attributes.merge('price' => '1')
|
|
734
|
+
end
|
|
735
|
+
|
|
736
|
+
before do
|
|
737
|
+
expect(product.attributes_before_type_cast).to eq(abtc)
|
|
738
|
+
product.save!
|
|
739
|
+
end
|
|
740
|
+
|
|
741
|
+
it "resets the attributes_before_type_cast to the attributes" do
|
|
742
|
+
expect(product.attributes_before_type_cast).to eq(product.attributes)
|
|
743
|
+
end
|
|
744
|
+
end
|
|
745
|
+
|
|
746
|
+
context "when using create! without options" do
|
|
747
|
+
let(:product) { Product.create! }
|
|
748
|
+
|
|
749
|
+
it "resets the attributes_before_type_cast to the attributes" do
|
|
750
|
+
expect(product.attributes_before_type_cast).to eq(product.attributes)
|
|
751
|
+
end
|
|
752
|
+
end
|
|
753
|
+
|
|
754
|
+
context "when using create! with options" do
|
|
755
|
+
let(:product) { Product.create!(price: '1') }
|
|
756
|
+
|
|
757
|
+
it "resets the attributes_before_type_cast to the attributes" do
|
|
758
|
+
expect(product.attributes_before_type_cast).to eq(product.attributes)
|
|
759
|
+
end
|
|
577
760
|
end
|
|
578
761
|
end
|
|
579
762
|
end
|
|
@@ -621,14 +804,14 @@ describe Mongoid::Fields do
|
|
|
621
804
|
|
|
622
805
|
before do
|
|
623
806
|
product.stores = [ "kadewe", "karstadt" ]
|
|
624
|
-
product.save
|
|
807
|
+
product.save!
|
|
625
808
|
end
|
|
626
809
|
|
|
627
810
|
context "when setting the value to nil" do
|
|
628
811
|
|
|
629
812
|
before do
|
|
630
813
|
product.stores = nil
|
|
631
|
-
product.save
|
|
814
|
+
product.save!
|
|
632
815
|
end
|
|
633
816
|
|
|
634
817
|
it "allows the set" do
|
|
@@ -640,7 +823,7 @@ describe Mongoid::Fields do
|
|
|
640
823
|
|
|
641
824
|
before do
|
|
642
825
|
product.stores = [ "kadewe", nil ]
|
|
643
|
-
product.save
|
|
826
|
+
product.save!
|
|
644
827
|
end
|
|
645
828
|
|
|
646
829
|
it "allows the set of nil values" do
|
|
@@ -656,7 +839,7 @@ describe Mongoid::Fields do
|
|
|
656
839
|
|
|
657
840
|
before do
|
|
658
841
|
product.stores = [ "karstadt", "kadewe" ]
|
|
659
|
-
product.save
|
|
842
|
+
product.save!
|
|
660
843
|
end
|
|
661
844
|
|
|
662
845
|
it "reverses the values" do
|
|
@@ -687,16 +870,13 @@ describe Mongoid::Fields do
|
|
|
687
870
|
end
|
|
688
871
|
|
|
689
872
|
context "when a locale is set" do
|
|
873
|
+
with_default_i18n_configs
|
|
690
874
|
|
|
691
875
|
before do
|
|
692
|
-
|
|
876
|
+
I18n.locale = :de
|
|
693
877
|
product.description = "Cheaper drinks"
|
|
694
878
|
end
|
|
695
879
|
|
|
696
|
-
after do
|
|
697
|
-
::I18n.locale = :en
|
|
698
|
-
end
|
|
699
|
-
|
|
700
880
|
let(:description) do
|
|
701
881
|
product.attributes["description"]
|
|
702
882
|
end
|
|
@@ -707,17 +887,15 @@ describe Mongoid::Fields do
|
|
|
707
887
|
end
|
|
708
888
|
|
|
709
889
|
context "when having multiple locales" do
|
|
890
|
+
with_default_i18n_configs
|
|
710
891
|
|
|
711
892
|
before do
|
|
893
|
+
I18n.locale = :en
|
|
712
894
|
product.description = "Cheap drinks"
|
|
713
|
-
|
|
895
|
+
I18n.locale = :de
|
|
714
896
|
product.description = "Cheaper drinks"
|
|
715
897
|
end
|
|
716
898
|
|
|
717
|
-
after do
|
|
718
|
-
::I18n.locale = :en
|
|
719
|
-
end
|
|
720
|
-
|
|
721
899
|
let(:description) do
|
|
722
900
|
product.attributes["description"]
|
|
723
901
|
end
|
|
@@ -729,6 +907,50 @@ describe Mongoid::Fields do
|
|
|
729
907
|
end
|
|
730
908
|
end
|
|
731
909
|
end
|
|
910
|
+
|
|
911
|
+
context "when the field needs to be mongoized" do
|
|
912
|
+
|
|
913
|
+
before do
|
|
914
|
+
product.price = "1"
|
|
915
|
+
product.save!
|
|
916
|
+
end
|
|
917
|
+
|
|
918
|
+
it "mongoizes the value" do
|
|
919
|
+
expect(product.price).to eq(1)
|
|
920
|
+
end
|
|
921
|
+
|
|
922
|
+
it "stores the value in the mongoized form" do
|
|
923
|
+
expect(product.attributes_before_type_cast["price"]).to eq(1)
|
|
924
|
+
end
|
|
925
|
+
end
|
|
926
|
+
|
|
927
|
+
context "when assigning a hash" do
|
|
928
|
+
let(:person) { Person.create!(map: { x: 1 }) }
|
|
929
|
+
|
|
930
|
+
it "is a BSON::Document" do
|
|
931
|
+
expect(person.map).to be_a(BSON::Document)
|
|
932
|
+
end
|
|
933
|
+
|
|
934
|
+
it "has the correct contents" do
|
|
935
|
+
expect(person.map).to eq({ "x" => 1 })
|
|
936
|
+
end
|
|
937
|
+
end
|
|
938
|
+
|
|
939
|
+
context "when loading a hash from the db" do
|
|
940
|
+
before do
|
|
941
|
+
Person.create!(map: { x: 1 })
|
|
942
|
+
end
|
|
943
|
+
|
|
944
|
+
let(:person) { Person.first }
|
|
945
|
+
|
|
946
|
+
it "is a BSON::Document" do
|
|
947
|
+
expect(person.map).to be_a(BSON::Document)
|
|
948
|
+
end
|
|
949
|
+
|
|
950
|
+
it "has the correct contents" do
|
|
951
|
+
expect(person.map).to eq({ "x" => 1 })
|
|
952
|
+
end
|
|
953
|
+
end
|
|
732
954
|
end
|
|
733
955
|
|
|
734
956
|
describe "#defaults" do
|
|
@@ -865,39 +1087,37 @@ describe Mongoid::Fields do
|
|
|
865
1087
|
it "raises an error" do
|
|
866
1088
|
expect {
|
|
867
1089
|
Person.field(meth)
|
|
868
|
-
}.to raise_error(Mongoid::Errors::InvalidField)
|
|
1090
|
+
}.to raise_error(Mongoid::Errors::InvalidField, /Defining a field named '#{meth}' is not allowed/)
|
|
869
1091
|
end
|
|
870
1092
|
end
|
|
871
1093
|
end
|
|
872
1094
|
end
|
|
873
1095
|
|
|
874
1096
|
context "when field already exist and validate_duplicate is enable" do
|
|
1097
|
+
context 'when exception is enabled' do
|
|
1098
|
+
config_override :duplicate_fields_exception, true
|
|
875
1099
|
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
Mongoid.duplicate_fields_exception = false
|
|
882
|
-
end
|
|
883
|
-
|
|
884
|
-
it "raises an error" do
|
|
885
|
-
expect {
|
|
886
|
-
Person.field(:title)
|
|
887
|
-
}.to raise_error(Mongoid::Errors::InvalidField)
|
|
1100
|
+
it "raises an error" do
|
|
1101
|
+
expect {
|
|
1102
|
+
Person.field(:title)
|
|
1103
|
+
}.to raise_error(Mongoid::Errors::InvalidField)
|
|
1104
|
+
end
|
|
888
1105
|
end
|
|
889
1106
|
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
1107
|
+
context 'when exception is disabled' do
|
|
1108
|
+
config_override :duplicate_fields_exception, false
|
|
1109
|
+
it "doesn't raise an error" do
|
|
1110
|
+
expect {
|
|
1111
|
+
Class.new(Person)
|
|
1112
|
+
}.to_not raise_error
|
|
1113
|
+
end
|
|
894
1114
|
end
|
|
895
1115
|
end
|
|
896
1116
|
|
|
897
1117
|
context "when the field is a time" do
|
|
898
1118
|
|
|
899
1119
|
let!(:time) do
|
|
900
|
-
Time.
|
|
1120
|
+
Time.find_zone('UTC').parse('2023-03-03 10:30:53')
|
|
901
1121
|
end
|
|
902
1122
|
|
|
903
1123
|
let!(:person) do
|
|
@@ -905,17 +1125,11 @@ describe Mongoid::Fields do
|
|
|
905
1125
|
end
|
|
906
1126
|
|
|
907
1127
|
context "when reading the field" do
|
|
908
|
-
|
|
909
|
-
before do
|
|
910
|
-
Time.zone = "Berlin"
|
|
911
|
-
end
|
|
912
|
-
|
|
913
|
-
after do
|
|
914
|
-
Time.zone = nil
|
|
915
|
-
end
|
|
1128
|
+
time_zone_override 'Europe/Berlin'
|
|
916
1129
|
|
|
917
1130
|
it "performs the necessary time conversions" do
|
|
918
|
-
expect(person.lunch_time.to_s).to eq(
|
|
1131
|
+
expect(person.lunch_time.to_s).to eq('2023-03-03 11:30:53 +0100')
|
|
1132
|
+
expect(person.lunch_time.time_zone.name).to eq('Europe/Berlin')
|
|
919
1133
|
end
|
|
920
1134
|
end
|
|
921
1135
|
end
|
|
@@ -990,11 +1204,11 @@ describe Mongoid::Fields do
|
|
|
990
1204
|
end
|
|
991
1205
|
|
|
992
1206
|
before do
|
|
993
|
-
Person.field :aliased, as: :alias, type: Boolean, overwrite: true
|
|
1207
|
+
Person.field :aliased, as: :alias, type: Mongoid::Boolean, overwrite: true
|
|
994
1208
|
end
|
|
995
1209
|
|
|
996
1210
|
it "uses the alias to write the attribute" do
|
|
997
|
-
(person.alias =
|
|
1211
|
+
expect(person.alias = true).to be true
|
|
998
1212
|
end
|
|
999
1213
|
|
|
1000
1214
|
it "uses the alias to read the attribute" do
|
|
@@ -1006,7 +1220,7 @@ describe Mongoid::Fields do
|
|
|
1006
1220
|
end
|
|
1007
1221
|
|
|
1008
1222
|
it "uses the name to write the attribute" do
|
|
1009
|
-
(person.aliased =
|
|
1223
|
+
expect(person.aliased = true).to be true
|
|
1010
1224
|
end
|
|
1011
1225
|
|
|
1012
1226
|
it "uses the name to read the attribute" do
|
|
@@ -1235,71 +1449,147 @@ describe Mongoid::Fields do
|
|
|
1235
1449
|
|
|
1236
1450
|
context "when a field is defined as a big decimal" do
|
|
1237
1451
|
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
end
|
|
1452
|
+
context 'when Mongoid.map_big_decimal_to_decimal128 is false' do
|
|
1453
|
+
config_override :map_big_decimal_to_decimal128, false
|
|
1241
1454
|
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
end
|
|
1245
|
-
|
|
1246
|
-
context "when setting to a big decimal" do
|
|
1247
|
-
|
|
1248
|
-
before do
|
|
1249
|
-
band.sales = decimal
|
|
1455
|
+
let(:band) do
|
|
1456
|
+
Band.new(name: "Tool")
|
|
1250
1457
|
end
|
|
1251
1458
|
|
|
1252
|
-
|
|
1253
|
-
|
|
1459
|
+
let(:decimal) do
|
|
1460
|
+
BigDecimal("1000000.00")
|
|
1254
1461
|
end
|
|
1255
1462
|
|
|
1256
|
-
|
|
1257
|
-
|
|
1463
|
+
context "when setting to a big decimal" do
|
|
1464
|
+
|
|
1465
|
+
before do
|
|
1466
|
+
band.sales = decimal
|
|
1467
|
+
end
|
|
1468
|
+
|
|
1469
|
+
it "properly persists as a string" do
|
|
1470
|
+
expect(band.attributes["sales"]).to eq(decimal.to_s)
|
|
1471
|
+
end
|
|
1472
|
+
|
|
1473
|
+
it "returns the proper big decimal" do
|
|
1474
|
+
expect(band.sales).to eq(decimal)
|
|
1475
|
+
end
|
|
1258
1476
|
end
|
|
1259
|
-
end
|
|
1260
1477
|
|
|
1261
|
-
|
|
1478
|
+
context "when setting to a string" do
|
|
1262
1479
|
|
|
1263
|
-
|
|
1264
|
-
|
|
1480
|
+
before do
|
|
1481
|
+
band.sales = decimal.to_s
|
|
1482
|
+
end
|
|
1483
|
+
|
|
1484
|
+
it "properly persists as a string" do
|
|
1485
|
+
expect(band.attributes["sales"]).to eq(decimal.to_s)
|
|
1486
|
+
end
|
|
1487
|
+
|
|
1488
|
+
it "returns the proper big decimal" do
|
|
1489
|
+
expect(band.sales).to eq(decimal)
|
|
1490
|
+
end
|
|
1265
1491
|
end
|
|
1266
1492
|
|
|
1267
|
-
|
|
1268
|
-
|
|
1493
|
+
context "when setting to an integer" do
|
|
1494
|
+
|
|
1495
|
+
before do
|
|
1496
|
+
band.sales = decimal.to_i
|
|
1497
|
+
end
|
|
1498
|
+
|
|
1499
|
+
it "properly persists as a string" do
|
|
1500
|
+
expect(band.attributes["sales"]).to eq("1000000")
|
|
1501
|
+
end
|
|
1502
|
+
|
|
1503
|
+
it "returns the proper big decimal" do
|
|
1504
|
+
expect(band.sales).to eq(decimal)
|
|
1505
|
+
end
|
|
1269
1506
|
end
|
|
1270
1507
|
|
|
1271
|
-
|
|
1272
|
-
|
|
1508
|
+
context "when setting to a float" do
|
|
1509
|
+
|
|
1510
|
+
before do
|
|
1511
|
+
band.sales = decimal.to_f
|
|
1512
|
+
end
|
|
1513
|
+
|
|
1514
|
+
it "properly persists as a string" do
|
|
1515
|
+
expect(band.attributes["sales"]).to eq(decimal.to_s)
|
|
1516
|
+
end
|
|
1517
|
+
|
|
1518
|
+
it "returns the proper big decimal" do
|
|
1519
|
+
expect(band.sales).to eq(decimal)
|
|
1520
|
+
end
|
|
1273
1521
|
end
|
|
1274
1522
|
end
|
|
1275
1523
|
|
|
1276
|
-
context
|
|
1524
|
+
context 'when Mongoid.map_big_decimal_to_decimal128 is true' do
|
|
1525
|
+
config_override :map_big_decimal_to_decimal128, true
|
|
1277
1526
|
|
|
1278
|
-
|
|
1279
|
-
|
|
1527
|
+
let(:band) do
|
|
1528
|
+
Band.new(name: "Tool")
|
|
1280
1529
|
end
|
|
1281
1530
|
|
|
1282
|
-
|
|
1283
|
-
|
|
1531
|
+
let(:decimal) do
|
|
1532
|
+
BigDecimal("1000000.00")
|
|
1284
1533
|
end
|
|
1285
1534
|
|
|
1286
|
-
|
|
1287
|
-
|
|
1535
|
+
context "when setting to a big decimal" do
|
|
1536
|
+
|
|
1537
|
+
before do
|
|
1538
|
+
band.sales = decimal
|
|
1539
|
+
end
|
|
1540
|
+
|
|
1541
|
+
it "properly persists as a BSON::Decimal128" do
|
|
1542
|
+
expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal))
|
|
1543
|
+
end
|
|
1544
|
+
|
|
1545
|
+
it "returns the proper big decimal" do
|
|
1546
|
+
expect(band.sales).to eq(decimal)
|
|
1547
|
+
end
|
|
1288
1548
|
end
|
|
1289
|
-
end
|
|
1290
1549
|
|
|
1291
|
-
|
|
1550
|
+
context "when setting to a string" do
|
|
1292
1551
|
|
|
1293
|
-
|
|
1294
|
-
|
|
1552
|
+
before do
|
|
1553
|
+
band.sales = decimal.to_s
|
|
1554
|
+
end
|
|
1555
|
+
|
|
1556
|
+
it "persists as a BSON::Decimal128" do
|
|
1557
|
+
expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal.to_s))
|
|
1558
|
+
end
|
|
1559
|
+
|
|
1560
|
+
it "returns the proper big decimal" do
|
|
1561
|
+
expect(band.sales).to eq(decimal)
|
|
1562
|
+
end
|
|
1295
1563
|
end
|
|
1296
1564
|
|
|
1297
|
-
|
|
1298
|
-
|
|
1565
|
+
context "when setting to an integer" do
|
|
1566
|
+
|
|
1567
|
+
before do
|
|
1568
|
+
band.sales = decimal.to_i
|
|
1569
|
+
end
|
|
1570
|
+
|
|
1571
|
+
it "persists as a BSON::Decimal128" do
|
|
1572
|
+
expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal.to_i.to_s))
|
|
1573
|
+
end
|
|
1574
|
+
|
|
1575
|
+
it "returns the proper big decimal" do
|
|
1576
|
+
expect(band.sales).to eq(decimal)
|
|
1577
|
+
end
|
|
1299
1578
|
end
|
|
1300
1579
|
|
|
1301
|
-
|
|
1302
|
-
|
|
1580
|
+
context "when setting to a float" do
|
|
1581
|
+
|
|
1582
|
+
before do
|
|
1583
|
+
band.sales = decimal.to_f
|
|
1584
|
+
end
|
|
1585
|
+
|
|
1586
|
+
it "properly persists as a BSON::Decimal128" do
|
|
1587
|
+
expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal.to_f.to_s))
|
|
1588
|
+
end
|
|
1589
|
+
|
|
1590
|
+
it "returns the proper big decimal" do
|
|
1591
|
+
expect(band.sales).to eq(decimal)
|
|
1592
|
+
end
|
|
1303
1593
|
end
|
|
1304
1594
|
end
|
|
1305
1595
|
end
|
|
@@ -1307,7 +1597,7 @@ describe Mongoid::Fields do
|
|
|
1307
1597
|
context "when the field is a hash of arrays" do
|
|
1308
1598
|
|
|
1309
1599
|
let(:person) do
|
|
1310
|
-
Person.create
|
|
1600
|
+
Person.create!
|
|
1311
1601
|
end
|
|
1312
1602
|
|
|
1313
1603
|
let(:map) do
|
|
@@ -1321,7 +1611,7 @@ describe Mongoid::Fields do
|
|
|
1321
1611
|
before do
|
|
1322
1612
|
person.map = map
|
|
1323
1613
|
person.map["stack1"].reverse!
|
|
1324
|
-
person.save
|
|
1614
|
+
person.save!
|
|
1325
1615
|
end
|
|
1326
1616
|
|
|
1327
1617
|
it "properly updates the hash" do
|
|
@@ -1398,4 +1688,419 @@ describe Mongoid::Fields do
|
|
|
1398
1688
|
end
|
|
1399
1689
|
end
|
|
1400
1690
|
end
|
|
1691
|
+
|
|
1692
|
+
describe '.database_field_name' do
|
|
1693
|
+
|
|
1694
|
+
shared_examples_for 'database_field_name' do
|
|
1695
|
+
subject { Person.database_field_name(key) }
|
|
1696
|
+
|
|
1697
|
+
context 'non-aliased field name' do
|
|
1698
|
+
let(:key) { 't' }
|
|
1699
|
+
it { is_expected.to eq 't' }
|
|
1700
|
+
end
|
|
1701
|
+
|
|
1702
|
+
context 'aliased field name' do
|
|
1703
|
+
let(:key) { 'test' }
|
|
1704
|
+
it { is_expected.to eq 't' }
|
|
1705
|
+
end
|
|
1706
|
+
|
|
1707
|
+
context 'non-aliased embeds one relation' do
|
|
1708
|
+
let(:key) { 'pass' }
|
|
1709
|
+
it { is_expected.to eq 'pass' }
|
|
1710
|
+
end
|
|
1711
|
+
|
|
1712
|
+
context 'aliased embeds one relation' do
|
|
1713
|
+
let(:key) { 'passport' }
|
|
1714
|
+
it { is_expected.to eq 'pass' }
|
|
1715
|
+
end
|
|
1716
|
+
|
|
1717
|
+
context 'non-aliased embeds many relation' do
|
|
1718
|
+
let(:key) { 'mobile_phones' }
|
|
1719
|
+
it { is_expected.to eq 'mobile_phones' }
|
|
1720
|
+
end
|
|
1721
|
+
|
|
1722
|
+
context 'aliased embeds many relation' do
|
|
1723
|
+
let(:key) { 'phones' }
|
|
1724
|
+
it { is_expected.to eq 'mobile_phones' }
|
|
1725
|
+
end
|
|
1726
|
+
|
|
1727
|
+
context 'non-aliased embeds one field' do
|
|
1728
|
+
let(:key) { 'pass.exp' }
|
|
1729
|
+
it { is_expected.to eq 'pass.exp' }
|
|
1730
|
+
end
|
|
1731
|
+
|
|
1732
|
+
context 'aliased embeds one field' do
|
|
1733
|
+
let(:key) { 'passport.expiration_date' }
|
|
1734
|
+
it { is_expected.to eq 'pass.exp' }
|
|
1735
|
+
end
|
|
1736
|
+
|
|
1737
|
+
context 'non-aliased embeds many field' do
|
|
1738
|
+
let(:key) { 'mobile_phones.landline' }
|
|
1739
|
+
it { is_expected.to eq 'mobile_phones.landline' }
|
|
1740
|
+
end
|
|
1741
|
+
|
|
1742
|
+
context 'aliased embeds many field' do
|
|
1743
|
+
let(:key) { 'phones.extension' }
|
|
1744
|
+
it { is_expected.to eq 'mobile_phones.ext' }
|
|
1745
|
+
end
|
|
1746
|
+
|
|
1747
|
+
context 'aliased multi-level embedded document' do
|
|
1748
|
+
let(:key) { 'phones.extension' }
|
|
1749
|
+
it { is_expected.to eq 'mobile_phones.ext' }
|
|
1750
|
+
end
|
|
1751
|
+
|
|
1752
|
+
context 'non-aliased multi-level embedded document' do
|
|
1753
|
+
let(:key) { 'phones.extension' }
|
|
1754
|
+
it { is_expected.to eq 'mobile_phones.ext' }
|
|
1755
|
+
end
|
|
1756
|
+
|
|
1757
|
+
context 'aliased multi-level embedded document field' do
|
|
1758
|
+
let(:key) { 'mobile_phones.country_code.code' }
|
|
1759
|
+
it { is_expected.to eq 'mobile_phones.country_code.code' }
|
|
1760
|
+
end
|
|
1761
|
+
|
|
1762
|
+
context 'non-aliased multi-level embedded document field' do
|
|
1763
|
+
let(:key) { 'phones.country_code.iso_alpha2_code' }
|
|
1764
|
+
it { is_expected.to eq 'mobile_phones.country_code.iso' }
|
|
1765
|
+
end
|
|
1766
|
+
|
|
1767
|
+
context 'when field is unknown' do
|
|
1768
|
+
let(:key) { 'shenanigans' }
|
|
1769
|
+
it { is_expected.to eq 'shenanigans' }
|
|
1770
|
+
end
|
|
1771
|
+
|
|
1772
|
+
context 'when embedded field is unknown' do
|
|
1773
|
+
let(:key) { 'phones.bamboozle' }
|
|
1774
|
+
it { is_expected.to eq 'mobile_phones.bamboozle' }
|
|
1775
|
+
end
|
|
1776
|
+
|
|
1777
|
+
context 'when multi-level embedded field is unknown' do
|
|
1778
|
+
let(:key) { 'phones.bamboozle.brouhaha' }
|
|
1779
|
+
it { is_expected.to eq 'mobile_phones.bamboozle.brouhaha' }
|
|
1780
|
+
end
|
|
1781
|
+
end
|
|
1782
|
+
|
|
1783
|
+
shared_examples_for 'pre-fix database_field_name' do
|
|
1784
|
+
subject { Person.database_field_name(key) }
|
|
1785
|
+
|
|
1786
|
+
context 'non-aliased field name' do
|
|
1787
|
+
let(:key) { 't' }
|
|
1788
|
+
it { is_expected.to eq 't' }
|
|
1789
|
+
end
|
|
1790
|
+
|
|
1791
|
+
context 'aliased field name' do
|
|
1792
|
+
let(:key) { 'test' }
|
|
1793
|
+
it { is_expected.to eq 't' }
|
|
1794
|
+
end
|
|
1795
|
+
|
|
1796
|
+
context 'non-aliased embeds one relation' do
|
|
1797
|
+
let(:key) { 'pass' }
|
|
1798
|
+
it { is_expected.to eq 'pass' }
|
|
1799
|
+
end
|
|
1800
|
+
|
|
1801
|
+
context 'aliased embeds one relation' do
|
|
1802
|
+
let(:key) { 'passport' }
|
|
1803
|
+
it { is_expected.to eq 'pass' }
|
|
1804
|
+
end
|
|
1805
|
+
|
|
1806
|
+
context 'non-aliased embeds many relation' do
|
|
1807
|
+
let(:key) { 'mobile_phones' }
|
|
1808
|
+
it { is_expected.to eq 'mobile_phones' }
|
|
1809
|
+
end
|
|
1810
|
+
|
|
1811
|
+
context 'aliased embeds many relation' do
|
|
1812
|
+
let(:key) { 'phones' }
|
|
1813
|
+
it { is_expected.to eq 'mobile_phones' }
|
|
1814
|
+
end
|
|
1815
|
+
|
|
1816
|
+
context 'non-aliased embeds one field' do
|
|
1817
|
+
let(:key) { 'pass.exp' }
|
|
1818
|
+
it { is_expected.to eq 'pass.exp' }
|
|
1819
|
+
end
|
|
1820
|
+
|
|
1821
|
+
context 'aliased embeds one field' do
|
|
1822
|
+
let(:key) { 'passport.expiration_date' }
|
|
1823
|
+
it { is_expected.to eq 'passport.expiration_date' }
|
|
1824
|
+
end
|
|
1825
|
+
|
|
1826
|
+
context 'non-aliased embeds many field' do
|
|
1827
|
+
let(:key) { 'mobile_phones.landline' }
|
|
1828
|
+
it { is_expected.to eq 'mobile_phones.landline' }
|
|
1829
|
+
end
|
|
1830
|
+
|
|
1831
|
+
context 'aliased embeds many field' do
|
|
1832
|
+
let(:key) { 'phones.extension' }
|
|
1833
|
+
it { is_expected.to eq 'phones.extension' }
|
|
1834
|
+
end
|
|
1835
|
+
|
|
1836
|
+
context 'aliased multi-level embedded document' do
|
|
1837
|
+
let(:key) { 'phones.extension' }
|
|
1838
|
+
it { is_expected.to eq 'phones.extension' }
|
|
1839
|
+
end
|
|
1840
|
+
|
|
1841
|
+
context 'non-aliased multi-level embedded document' do
|
|
1842
|
+
let(:key) { 'phones.extension' }
|
|
1843
|
+
it { is_expected.to eq 'phones.extension' }
|
|
1844
|
+
end
|
|
1845
|
+
|
|
1846
|
+
context 'aliased multi-level embedded document field' do
|
|
1847
|
+
let(:key) { 'mobile_phones.country_code.code' }
|
|
1848
|
+
it { is_expected.to eq 'mobile_phones.country_code.code' }
|
|
1849
|
+
end
|
|
1850
|
+
|
|
1851
|
+
context 'non-aliased multi-level embedded document field' do
|
|
1852
|
+
let(:key) { 'phones.country_code.iso_alpha2_code' }
|
|
1853
|
+
it { is_expected.to eq 'phones.country_code.iso_alpha2_code' }
|
|
1854
|
+
end
|
|
1855
|
+
|
|
1856
|
+
context 'when field is unknown' do
|
|
1857
|
+
let(:key) { 'shenanigans' }
|
|
1858
|
+
it { is_expected.to eq 'shenanigans' }
|
|
1859
|
+
end
|
|
1860
|
+
|
|
1861
|
+
context 'when embedded field is unknown' do
|
|
1862
|
+
let(:key) { 'phones.bamboozle' }
|
|
1863
|
+
it { is_expected.to eq 'phones.bamboozle' }
|
|
1864
|
+
end
|
|
1865
|
+
|
|
1866
|
+
context 'when multi-level embedded field is unknown' do
|
|
1867
|
+
let(:key) { 'phones.bamboozle.brouhaha' }
|
|
1868
|
+
it { is_expected.to eq 'phones.bamboozle.brouhaha' }
|
|
1869
|
+
end
|
|
1870
|
+
end
|
|
1871
|
+
|
|
1872
|
+
context 'given nil' do
|
|
1873
|
+
subject { Person.database_field_name(nil) }
|
|
1874
|
+
it { is_expected.to eq nil }
|
|
1875
|
+
end
|
|
1876
|
+
|
|
1877
|
+
context 'given an empty String' do
|
|
1878
|
+
subject { Person.database_field_name('') }
|
|
1879
|
+
it { is_expected.to eq nil }
|
|
1880
|
+
end
|
|
1881
|
+
|
|
1882
|
+
context 'given a String' do
|
|
1883
|
+
subject { Person.database_field_name(key.to_s) }
|
|
1884
|
+
it_behaves_like 'database_field_name'
|
|
1885
|
+
end
|
|
1886
|
+
|
|
1887
|
+
context 'given a Symbol' do
|
|
1888
|
+
subject { Person.database_field_name(key.to_sym) }
|
|
1889
|
+
it_behaves_like 'database_field_name'
|
|
1890
|
+
end
|
|
1891
|
+
|
|
1892
|
+
context 'when getting the database field name of a belongs_to associations' do
|
|
1893
|
+
|
|
1894
|
+
context "when the association is the last item" do
|
|
1895
|
+
let(:name) do
|
|
1896
|
+
Game.database_field_name("person")
|
|
1897
|
+
end
|
|
1898
|
+
|
|
1899
|
+
it "gets the alias" do
|
|
1900
|
+
expect(name).to eq("person_id")
|
|
1901
|
+
end
|
|
1902
|
+
end
|
|
1903
|
+
|
|
1904
|
+
context "when the association is not the last item" do
|
|
1905
|
+
let(:name) do
|
|
1906
|
+
Game.database_field_name("person.name")
|
|
1907
|
+
end
|
|
1908
|
+
|
|
1909
|
+
it "gets the alias" do
|
|
1910
|
+
expect(name).to eq("person.name")
|
|
1911
|
+
end
|
|
1912
|
+
end
|
|
1913
|
+
end
|
|
1914
|
+
end
|
|
1915
|
+
|
|
1916
|
+
describe "#get_field" do
|
|
1917
|
+
|
|
1918
|
+
let(:klass) { Person }
|
|
1919
|
+
let(:field) { klass.cleanse_localized_field_names(field_name) }
|
|
1920
|
+
|
|
1921
|
+
context "when cleansing a field" do
|
|
1922
|
+
let(:field_name) { "employer_id" }
|
|
1923
|
+
it "returns the correct field name" do
|
|
1924
|
+
expect(field).to eq(field_name)
|
|
1925
|
+
end
|
|
1926
|
+
end
|
|
1927
|
+
|
|
1928
|
+
context "when cleansing a localized field" do
|
|
1929
|
+
let(:field_name) { "desc" }
|
|
1930
|
+
it "returns the correct field name" do
|
|
1931
|
+
expect(field).to eq(field_name)
|
|
1932
|
+
end
|
|
1933
|
+
end
|
|
1934
|
+
|
|
1935
|
+
context "when cleansing a translation field" do
|
|
1936
|
+
let(:field_name) { "desc_translations" }
|
|
1937
|
+
it "returns the correct field name" do
|
|
1938
|
+
expect(field).to eq("desc")
|
|
1939
|
+
end
|
|
1940
|
+
end
|
|
1941
|
+
|
|
1942
|
+
context "when cleansing an existing translation field" do
|
|
1943
|
+
let(:field_name) { "localized_translations" }
|
|
1944
|
+
it "returns the correct field name" do
|
|
1945
|
+
expect(field).to eq(field_name)
|
|
1946
|
+
end
|
|
1947
|
+
end
|
|
1948
|
+
|
|
1949
|
+
context "when cleansing an existing translation field with a _translations" do
|
|
1950
|
+
let(:field_name) { "localized_translations_translations" }
|
|
1951
|
+
it "returns the correct field name" do
|
|
1952
|
+
expect(field).to eq("localized_translations")
|
|
1953
|
+
end
|
|
1954
|
+
end
|
|
1955
|
+
|
|
1956
|
+
context "when cleansing dotted translation field" do
|
|
1957
|
+
let(:field_name) { "passport.name_translations.asd" }
|
|
1958
|
+
it "returns the correct field name" do
|
|
1959
|
+
expect(field).to eq("pass.name.asd")
|
|
1960
|
+
end
|
|
1961
|
+
end
|
|
1962
|
+
|
|
1963
|
+
context "when cleansing dotted translation field as a symbol" do
|
|
1964
|
+
let(:field_name) { "passport.name_translations.asd".to_sym }
|
|
1965
|
+
it "returns the correct field name" do
|
|
1966
|
+
expect(field).to eq("pass.name.asd")
|
|
1967
|
+
end
|
|
1968
|
+
end
|
|
1969
|
+
|
|
1970
|
+
context "when cleansing dotted existing translation field" do
|
|
1971
|
+
let(:field_name) { "passport.localized_translations.asd" }
|
|
1972
|
+
it "returns the correct field name" do
|
|
1973
|
+
expect(field).to eq("pass.localized_translations.asd")
|
|
1974
|
+
end
|
|
1975
|
+
end
|
|
1976
|
+
|
|
1977
|
+
context "when cleansing aliased dotted translation field" do
|
|
1978
|
+
let(:field_name) { "pass.name_translations.asd" }
|
|
1979
|
+
it "returns the correct field name" do
|
|
1980
|
+
expect(field).to eq("pass.name.asd")
|
|
1981
|
+
end
|
|
1982
|
+
end
|
|
1983
|
+
end
|
|
1984
|
+
|
|
1985
|
+
describe "localize: :present" do
|
|
1986
|
+
|
|
1987
|
+
let(:product) do
|
|
1988
|
+
Product.new
|
|
1989
|
+
end
|
|
1990
|
+
|
|
1991
|
+
context "when assigning a non blank value" do
|
|
1992
|
+
|
|
1993
|
+
before do
|
|
1994
|
+
product.title = "hello"
|
|
1995
|
+
end
|
|
1996
|
+
|
|
1997
|
+
it "assigns the value" do
|
|
1998
|
+
expect(product.title).to eq("hello")
|
|
1999
|
+
end
|
|
2000
|
+
|
|
2001
|
+
it "populates the translations hash" do
|
|
2002
|
+
expect(product.title_translations).to eq({ "en" => "hello" })
|
|
2003
|
+
end
|
|
2004
|
+
end
|
|
2005
|
+
|
|
2006
|
+
context "when assigning an empty string" do
|
|
2007
|
+
with_default_i18n_configs
|
|
2008
|
+
|
|
2009
|
+
before do
|
|
2010
|
+
I18n.locale = :en
|
|
2011
|
+
product.title = "hello"
|
|
2012
|
+
I18n.locale = :de
|
|
2013
|
+
product.title = "hello there!"
|
|
2014
|
+
product.title = ""
|
|
2015
|
+
end
|
|
2016
|
+
|
|
2017
|
+
it "assigns the value" do
|
|
2018
|
+
expect(product.title).to eq(nil)
|
|
2019
|
+
end
|
|
2020
|
+
|
|
2021
|
+
it "populates the translations hash" do
|
|
2022
|
+
expect(product.title_translations).to eq({ "en" => "hello" })
|
|
2023
|
+
end
|
|
2024
|
+
end
|
|
2025
|
+
|
|
2026
|
+
context "when assigning nil" do
|
|
2027
|
+
with_default_i18n_configs
|
|
2028
|
+
|
|
2029
|
+
before do
|
|
2030
|
+
I18n.locale = :en
|
|
2031
|
+
product.title = "hello"
|
|
2032
|
+
I18n.locale = :de
|
|
2033
|
+
product.title = "hello there!"
|
|
2034
|
+
product.title = nil
|
|
2035
|
+
end
|
|
2036
|
+
|
|
2037
|
+
it "assigns the value" do
|
|
2038
|
+
expect(product.title).to eq(nil)
|
|
2039
|
+
end
|
|
2040
|
+
|
|
2041
|
+
it "populates the translations hash" do
|
|
2042
|
+
expect(product.title_translations).to eq({ "en" => "hello" })
|
|
2043
|
+
end
|
|
2044
|
+
end
|
|
2045
|
+
|
|
2046
|
+
context "when assigning an empty array" do
|
|
2047
|
+
with_default_i18n_configs
|
|
2048
|
+
|
|
2049
|
+
before do
|
|
2050
|
+
I18n.locale = :en
|
|
2051
|
+
product.title = "hello"
|
|
2052
|
+
I18n.locale = :de
|
|
2053
|
+
product.title = "hello there!"
|
|
2054
|
+
product.title = []
|
|
2055
|
+
end
|
|
2056
|
+
|
|
2057
|
+
it "assigns the value" do
|
|
2058
|
+
expect(product.title).to eq(nil)
|
|
2059
|
+
end
|
|
2060
|
+
|
|
2061
|
+
it "populates the translations hash" do
|
|
2062
|
+
expect(product.title_translations).to eq({ "en" => "hello" })
|
|
2063
|
+
end
|
|
2064
|
+
end
|
|
2065
|
+
|
|
2066
|
+
context "when assigning an empty string first" do
|
|
2067
|
+
with_default_i18n_configs
|
|
2068
|
+
|
|
2069
|
+
before do
|
|
2070
|
+
product.title = ""
|
|
2071
|
+
end
|
|
2072
|
+
|
|
2073
|
+
it "assigns the value" do
|
|
2074
|
+
expect(product.title).to eq(nil)
|
|
2075
|
+
end
|
|
2076
|
+
|
|
2077
|
+
it "populates the translations hash" do
|
|
2078
|
+
expect(product.title_translations).to eq({})
|
|
2079
|
+
end
|
|
2080
|
+
end
|
|
2081
|
+
|
|
2082
|
+
context "when assigning an empty string with only one translation" do
|
|
2083
|
+
with_default_i18n_configs
|
|
2084
|
+
|
|
2085
|
+
before do
|
|
2086
|
+
product.title = "Hello"
|
|
2087
|
+
product.title = ""
|
|
2088
|
+
product.save!
|
|
2089
|
+
end
|
|
2090
|
+
|
|
2091
|
+
let(:from_db) { Product.first }
|
|
2092
|
+
|
|
2093
|
+
it "assigns the value" do
|
|
2094
|
+
expect(product.title).to eq(nil)
|
|
2095
|
+
end
|
|
2096
|
+
|
|
2097
|
+
it "populates the translations hash" do
|
|
2098
|
+
expect(product.title_translations).to eq({})
|
|
2099
|
+
end
|
|
2100
|
+
|
|
2101
|
+
it "round trips an empty hash" do
|
|
2102
|
+
expect(from_db.title_translations).to eq({})
|
|
2103
|
+
end
|
|
2104
|
+
end
|
|
2105
|
+
end
|
|
1401
2106
|
end
|