mongoid 7.0.13 → 8.0.8
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 +30 -30
- data/README.md +32 -19
- data/Rakefile +43 -0
- data/lib/config/locales/en.yml +178 -95
- data/lib/mongoid/association/accessors.rb +175 -83
- data/lib/mongoid/association/bindable.rb +57 -28
- data/lib/mongoid/association/builders.rb +8 -14
- data/lib/mongoid/association/constrainable.rb +5 -7
- data/lib/mongoid/association/depending.rb +9 -18
- data/lib/mongoid/association/eager_loadable.rb +31 -10
- data/lib/mongoid/association/embedded/batchable.rb +67 -53
- data/lib/mongoid/association/embedded/cyclic.rb +10 -17
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +27 -9
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +7 -4
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +14 -24
- data/lib/mongoid/association/embedded/embedded_in.rb +9 -28
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +5 -8
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +8 -5
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +143 -122
- data/lib/mongoid/association/embedded/embeds_many.rb +8 -36
- data/lib/mongoid/association/embedded/embeds_one/binding.rb +4 -8
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +26 -9
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +63 -29
- data/lib/mongoid/association/embedded/embeds_one.rb +9 -33
- data/lib/mongoid/association/embedded.rb +2 -0
- data/lib/mongoid/association/macros.rb +71 -41
- data/lib/mongoid/association/many.rb +25 -35
- data/lib/mongoid/association/marshalable.rb +3 -6
- data/lib/mongoid/association/nested/many.rb +22 -30
- data/lib/mongoid/association/nested/nested_buildable.rb +9 -15
- data/lib/mongoid/association/nested/one.rb +19 -30
- data/lib/mongoid/association/nested.rb +3 -3
- data/lib/mongoid/association/one.rb +5 -12
- data/lib/mongoid/association/options.rb +16 -46
- data/lib/mongoid/association/proxy.rb +37 -38
- data/lib/mongoid/association/referenced/auto_save.rb +9 -14
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +5 -9
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +11 -9
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +40 -3
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +19 -31
- data/lib/mongoid/association/referenced/belongs_to.rb +16 -38
- data/lib/mongoid/association/referenced/counter_cache.rb +14 -25
- data/lib/mongoid/association/referenced/eager.rb +41 -40
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +12 -11
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +5 -5
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -1
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +105 -68
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +29 -46
- data/lib/mongoid/association/referenced/has_many/binding.rb +3 -6
- data/lib/mongoid/association/referenced/has_many/buildable.rb +5 -5
- data/lib/mongoid/association/referenced/has_many/eager.rb +2 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +440 -456
- data/lib/mongoid/association/referenced/has_many/proxy.rb +101 -124
- data/lib/mongoid/association/referenced/has_many.rb +21 -45
- data/lib/mongoid/association/referenced/has_one/binding.rb +4 -9
- data/lib/mongoid/association/referenced/has_one/buildable.rb +20 -6
- data/lib/mongoid/association/referenced/has_one/eager.rb +2 -1
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +16 -29
- data/lib/mongoid/association/referenced/has_one/proxy.rb +25 -30
- data/lib/mongoid/association/referenced/has_one.rb +16 -36
- data/lib/mongoid/association/referenced/syncable.rb +11 -26
- data/lib/mongoid/association/referenced.rb +2 -0
- data/lib/mongoid/association/reflections.rb +7 -6
- data/lib/mongoid/association/relatable.rb +62 -84
- data/lib/mongoid/association.rb +13 -27
- data/lib/mongoid/atomic/modifiers.rb +29 -53
- data/lib/mongoid/atomic/paths/embedded/many.rb +23 -7
- data/lib/mongoid/atomic/paths/embedded/one.rb +4 -7
- data/lib/mongoid/atomic/paths/embedded.rb +2 -3
- data/lib/mongoid/atomic/paths/root.rb +4 -7
- data/lib/mongoid/atomic/paths.rb +2 -1
- data/lib/mongoid/atomic.rb +45 -51
- data/lib/mongoid/attributes/dynamic.rb +6 -21
- data/lib/mongoid/attributes/nested.rb +11 -14
- data/lib/mongoid/attributes/processing.rb +46 -30
- data/lib/mongoid/attributes/projector.rb +119 -0
- data/lib/mongoid/attributes/readonly.rb +5 -8
- data/lib/mongoid/attributes.rb +80 -98
- data/lib/mongoid/cacheable.rb +7 -10
- data/lib/mongoid/changeable.rb +49 -70
- data/lib/mongoid/clients/factory.rb +42 -17
- data/lib/mongoid/clients/options.rb +15 -14
- data/lib/mongoid/clients/sessions.rb +4 -20
- data/lib/mongoid/clients/storage_options.rb +7 -12
- data/lib/mongoid/clients/validators/storage.rb +5 -12
- data/lib/mongoid/clients/validators.rb +2 -1
- data/lib/mongoid/clients.rb +3 -10
- data/lib/mongoid/composable.rb +5 -9
- data/lib/mongoid/config/environment.rb +30 -5
- data/lib/mongoid/config/options.rb +23 -23
- data/lib/mongoid/config/validators/client.rb +8 -23
- data/lib/mongoid/config/validators/option.rb +2 -3
- data/lib/mongoid/config/validators.rb +2 -1
- data/lib/mongoid/config.rb +164 -48
- data/lib/mongoid/contextual/aggregable/memory.rb +40 -27
- data/lib/mongoid/contextual/aggregable/mongo.rb +32 -33
- data/lib/mongoid/contextual/aggregable/none.rb +65 -0
- data/lib/mongoid/contextual/aggregable.rb +17 -0
- data/lib/mongoid/contextual/atomic.rb +29 -31
- data/lib/mongoid/contextual/command.rb +2 -5
- data/lib/mongoid/contextual/geo_near.rb +13 -44
- data/lib/mongoid/contextual/map_reduce.rb +7 -35
- data/lib/mongoid/contextual/memory.rb +187 -81
- data/lib/mongoid/contextual/mongo.rb +360 -239
- data/lib/mongoid/contextual/none.rb +109 -31
- data/lib/mongoid/contextual/queryable.rb +3 -4
- data/lib/mongoid/contextual.rb +9 -11
- data/lib/mongoid/copyable.rb +42 -17
- data/lib/mongoid/criteria/findable.rb +19 -19
- data/lib/mongoid/criteria/includable.rb +30 -33
- data/lib/mongoid/criteria/inspectable.rb +2 -3
- data/lib/mongoid/criteria/marshalable.rb +12 -7
- data/lib/mongoid/criteria/modifiable.rb +2 -19
- data/lib/mongoid/criteria/options.rb +2 -3
- data/lib/mongoid/criteria/permission.rb +3 -2
- data/lib/mongoid/criteria/queryable/aggregable.rb +4 -15
- data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
- data/lib/mongoid/criteria/queryable/extensions/array.rb +7 -41
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +28 -8
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -6
- data/lib/mongoid/criteria/queryable/extensions/date.rb +9 -9
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +11 -12
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +4 -41
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -14
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -21
- data/lib/mongoid/criteria/queryable/extensions/object.rb +6 -30
- data/lib/mongoid/criteria/queryable/extensions/range.rb +49 -17
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -16
- data/lib/mongoid/criteria/queryable/extensions/set.rb +4 -5
- data/lib/mongoid/criteria/queryable/extensions/string.rb +7 -32
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +7 -22
- data/lib/mongoid/criteria/queryable/extensions/time.rb +9 -9
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +9 -9
- data/lib/mongoid/criteria/queryable/extensions.rb +1 -4
- data/lib/mongoid/criteria/queryable/key.rb +39 -24
- data/lib/mongoid/criteria/queryable/macroable.rb +3 -4
- data/lib/mongoid/criteria/queryable/mergeable.rb +200 -40
- data/lib/mongoid/criteria/queryable/optional.rb +10 -59
- data/lib/mongoid/criteria/queryable/options.rb +4 -21
- data/lib/mongoid/criteria/queryable/pipeline.rb +5 -15
- data/lib/mongoid/criteria/queryable/selectable.rb +417 -171
- data/lib/mongoid/criteria/queryable/selector.rb +127 -30
- data/lib/mongoid/criteria/queryable/smash.rb +42 -18
- data/lib/mongoid/criteria/queryable/storable.rb +237 -0
- data/lib/mongoid/criteria/queryable.rb +18 -15
- data/lib/mongoid/criteria/scopable.rb +29 -21
- data/lib/mongoid/criteria/translator.rb +45 -0
- data/lib/mongoid/criteria.rb +95 -107
- data/lib/mongoid/deprecable.rb +37 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +148 -97
- data/lib/mongoid/equality.rb +35 -18
- data/lib/mongoid/errors/ambiguous_relationship.rb +4 -5
- data/lib/mongoid/errors/callback.rb +2 -3
- data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
- data/lib/mongoid/errors/delete_restriction.rb +10 -13
- data/lib/mongoid/errors/document_not_destroyed.rb +4 -7
- data/lib/mongoid/errors/document_not_found.rb +35 -21
- data/lib/mongoid/errors/empty_config_file.rb +25 -0
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -3
- data/lib/mongoid/errors/invalid_collection.rb +2 -1
- data/lib/mongoid/errors/invalid_config_file.rb +25 -0
- data/lib/mongoid/errors/invalid_config_option.rb +3 -4
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +3 -4
- data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
- data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
- data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
- data/lib/mongoid/errors/invalid_field.rb +8 -7
- data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
- data/lib/mongoid/errors/invalid_field_option.rb +2 -3
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/invalid_find.rb +2 -3
- data/lib/mongoid/errors/invalid_includes.rb +2 -3
- data/lib/mongoid/errors/invalid_index.rb +2 -3
- data/lib/mongoid/errors/invalid_options.rb +4 -5
- data/lib/mongoid/errors/invalid_path.rb +2 -3
- data/lib/mongoid/errors/invalid_persistence_option.rb +2 -5
- data/lib/mongoid/errors/invalid_query.rb +40 -0
- data/lib/mongoid/errors/invalid_relation.rb +5 -10
- data/lib/mongoid/errors/invalid_relation_option.rb +4 -5
- data/lib/mongoid/errors/invalid_scope.rb +2 -3
- data/lib/mongoid/errors/invalid_session_use.rb +3 -6
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
- data/lib/mongoid/errors/invalid_storage_options.rb +3 -4
- data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
- data/lib/mongoid/errors/invalid_time.rb +2 -3
- data/lib/mongoid/errors/inverse_not_found.rb +3 -4
- data/lib/mongoid/errors/mixed_client_configuration.rb +2 -3
- data/lib/mongoid/errors/mixed_relations.rb +2 -3
- data/lib/mongoid/errors/mongoid_error.rb +6 -13
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
- data/lib/mongoid/errors/no_client_config.rb +4 -5
- data/lib/mongoid/errors/no_client_database.rb +3 -4
- data/lib/mongoid/errors/no_client_hosts.rb +3 -4
- data/lib/mongoid/errors/no_clients_config.rb +2 -3
- data/lib/mongoid/errors/no_default_client.rb +3 -4
- data/lib/mongoid/errors/no_environment.rb +2 -3
- data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
- data/lib/mongoid/errors/no_metadata.rb +2 -3
- data/lib/mongoid/errors/no_parent.rb +2 -3
- data/lib/mongoid/errors/readonly_attribute.rb +3 -4
- data/lib/mongoid/errors/readonly_document.rb +3 -6
- data/lib/mongoid/errors/scope_overwrite.rb +2 -1
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -1
- data/lib/mongoid/errors/unknown_attribute.rb +3 -4
- data/lib/mongoid/errors/unknown_model.rb +2 -3
- data/lib/mongoid/errors/unsaved_document.rb +3 -2
- data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
- data/lib/mongoid/errors/validations.rb +2 -1
- data/lib/mongoid/errors.rb +14 -3
- data/lib/mongoid/evolvable.rb +4 -5
- data/lib/mongoid/extensions/array.rb +37 -44
- data/lib/mongoid/extensions/big_decimal.rb +35 -21
- data/lib/mongoid/extensions/binary.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +10 -6
- data/lib/mongoid/extensions/date.rb +32 -25
- data/lib/mongoid/extensions/date_time.rb +5 -13
- data/lib/mongoid/extensions/decimal128.rb +2 -5
- data/lib/mongoid/extensions/false_class.rb +5 -8
- data/lib/mongoid/extensions/float.rb +12 -14
- data/lib/mongoid/extensions/hash.rb +87 -45
- data/lib/mongoid/extensions/integer.rb +12 -16
- data/lib/mongoid/extensions/module.rb +3 -4
- data/lib/mongoid/extensions/nil_class.rb +2 -5
- data/lib/mongoid/extensions/object.rb +25 -50
- data/lib/mongoid/extensions/object_id.rb +2 -7
- data/lib/mongoid/extensions/range.rb +42 -20
- data/lib/mongoid/extensions/regexp.rb +13 -7
- data/lib/mongoid/extensions/set.rb +13 -11
- data/lib/mongoid/extensions/string.rb +30 -61
- data/lib/mongoid/extensions/symbol.rb +6 -22
- data/lib/mongoid/extensions/time.rb +37 -23
- data/lib/mongoid/extensions/time_with_zone.rb +26 -9
- data/lib/mongoid/extensions/true_class.rb +5 -8
- data/lib/mongoid/extensions.rb +19 -3
- data/lib/mongoid/factory.rb +104 -17
- data/lib/mongoid/fields/foreign_key.rb +14 -26
- data/lib/mongoid/fields/localized.rb +11 -15
- data/lib/mongoid/fields/standard.rb +13 -43
- data/lib/mongoid/fields/validators/macro.rb +32 -20
- data/lib/mongoid/fields/validators.rb +2 -1
- data/lib/mongoid/fields.rb +328 -85
- data/lib/mongoid/findable.rb +90 -33
- data/lib/mongoid/indexable/specification.rb +5 -18
- data/lib/mongoid/indexable/validators/options.rb +8 -9
- data/lib/mongoid/indexable.rb +6 -21
- data/lib/mongoid/inspectable.rb +4 -11
- data/lib/mongoid/interceptable.rb +191 -41
- data/lib/mongoid/loggable.rb +13 -16
- data/lib/mongoid/matchable.rb +3 -154
- data/lib/mongoid/matcher/all.rb +22 -0
- data/lib/mongoid/matcher/and.rb +21 -0
- data/lib/mongoid/matcher/bits.rb +41 -0
- data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
- data/lib/mongoid/matcher/bits_all_set.rb +20 -0
- data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
- data/lib/mongoid/matcher/bits_any_set.rb +20 -0
- data/lib/mongoid/matcher/elem_match.rb +36 -0
- data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
- data/lib/mongoid/matcher/eq.rb +11 -0
- data/lib/mongoid/matcher/eq_impl.rb +67 -0
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
- data/lib/mongoid/matcher/exists.rb +15 -0
- data/lib/mongoid/matcher/expression.rb +35 -0
- data/lib/mongoid/matcher/expression_operator.rb +19 -0
- data/lib/mongoid/matcher/field_expression.rb +62 -0
- data/lib/mongoid/matcher/field_operator.rb +54 -0
- data/lib/mongoid/matcher/gt.rb +17 -0
- data/lib/mongoid/matcher/gte.rb +17 -0
- data/lib/mongoid/matcher/in.rb +25 -0
- data/lib/mongoid/matcher/lt.rb +17 -0
- data/lib/mongoid/matcher/lte.rb +17 -0
- data/lib/mongoid/matcher/mod.rb +17 -0
- data/lib/mongoid/matcher/ne.rb +16 -0
- data/lib/mongoid/matcher/nin.rb +11 -0
- data/lib/mongoid/matcher/nor.rb +25 -0
- data/lib/mongoid/matcher/not.rb +29 -0
- data/lib/mongoid/matcher/or.rb +21 -0
- data/lib/mongoid/matcher/regex.rb +41 -0
- data/lib/mongoid/matcher/size.rb +26 -0
- data/lib/mongoid/matcher/type.rb +99 -0
- data/lib/mongoid/matcher.rb +130 -0
- data/lib/mongoid/persistable/creatable.rb +22 -30
- data/lib/mongoid/persistable/deletable.rb +6 -22
- data/lib/mongoid/persistable/destroyable.rb +12 -11
- data/lib/mongoid/persistable/incrementable.rb +6 -7
- data/lib/mongoid/persistable/logical.rb +4 -6
- data/lib/mongoid/persistable/poppable.rb +3 -6
- data/lib/mongoid/persistable/pullable.rb +3 -8
- data/lib/mongoid/persistable/pushable.rb +3 -8
- data/lib/mongoid/persistable/renamable.rb +10 -8
- data/lib/mongoid/persistable/savable.rb +5 -10
- data/lib/mongoid/persistable/settable.rb +3 -6
- data/lib/mongoid/persistable/unsettable.rb +9 -9
- data/lib/mongoid/persistable/updatable.rb +50 -31
- data/lib/mongoid/persistable/upsertable.rb +5 -10
- data/lib/mongoid/persistable.rb +135 -40
- data/lib/mongoid/persistence_context.rb +85 -45
- data/lib/mongoid/positional.rb +2 -5
- data/lib/mongoid/query_cache.rb +13 -280
- data/lib/mongoid/railtie.rb +3 -16
- data/lib/mongoid/railties/controller_runtime.rb +4 -2
- data/lib/mongoid/railties/database.rake +9 -0
- data/lib/mongoid/reloadable.rb +19 -22
- data/lib/mongoid/scopable.rb +34 -57
- data/lib/mongoid/selectable.rb +8 -18
- data/lib/mongoid/serializable.rb +33 -34
- data/lib/mongoid/shardable.rb +108 -21
- data/lib/mongoid/stateful.rb +38 -19
- data/lib/mongoid/stringified_symbol.rb +52 -0
- data/lib/mongoid/tasks/database.rake +12 -5
- data/lib/mongoid/tasks/database.rb +85 -7
- data/lib/mongoid/threaded/lifecycle.rb +7 -26
- data/lib/mongoid/threaded.rb +44 -67
- data/lib/mongoid/timestamps/created/short.rb +2 -1
- data/lib/mongoid/timestamps/created.rb +4 -3
- data/lib/mongoid/timestamps/short.rb +2 -1
- data/lib/mongoid/timestamps/timeless.rb +6 -9
- data/lib/mongoid/timestamps/updated/short.rb +2 -1
- data/lib/mongoid/timestamps/updated.rb +5 -6
- data/lib/mongoid/timestamps.rb +3 -2
- data/lib/mongoid/touchable.rb +54 -25
- data/lib/mongoid/traversable.rb +185 -61
- data/lib/mongoid/validatable/associated.rb +99 -22
- data/lib/mongoid/validatable/format.rb +2 -1
- data/lib/mongoid/validatable/length.rb +2 -1
- data/lib/mongoid/validatable/localizable.rb +3 -4
- data/lib/mongoid/validatable/macros.rb +2 -9
- data/lib/mongoid/validatable/presence.rb +10 -15
- data/lib/mongoid/validatable/queryable.rb +2 -3
- data/lib/mongoid/validatable/uniqueness.rb +29 -41
- data/lib/mongoid/validatable.rb +22 -33
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/warnings.rb +28 -0
- data/lib/mongoid.rb +34 -15
- data/lib/rails/generators/mongoid/config/config_generator.rb +2 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +53 -32
- data/lib/rails/generators/mongoid/model/model_generator.rb +3 -2
- data/lib/rails/generators/mongoid_generator.rb +2 -1
- data/lib/rails/mongoid.rb +4 -5
- data/spec/README.md +19 -4
- data/spec/config/mongoid.yml +17 -0
- data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
- data/spec/integration/app_spec.rb +31 -27
- data/spec/integration/associations/belongs_to_spec.rb +20 -0
- data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
- data/spec/integration/associations/embedded_spec.rb +162 -55
- data/spec/integration/associations/embeds_many_spec.rb +219 -0
- data/spec/integration/associations/embeds_one_spec.rb +41 -0
- data/spec/integration/associations/foreign_key_spec.rb +107 -0
- data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +61 -0
- data/spec/integration/associations/has_many_spec.rb +128 -0
- data/spec/integration/associations/has_one_spec.rb +272 -0
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
- data/spec/integration/associations/reverse_population_spec.rb +34 -0
- data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
- data/spec/integration/associations/scope_option_spec.rb +101 -0
- data/spec/integration/atomic/modifiers_spec.rb +116 -0
- data/spec/integration/bson_regexp_raw_spec.rb +19 -0
- data/spec/integration/callbacks_models.rb +107 -1
- data/spec/integration/callbacks_spec.rb +262 -8
- data/spec/integration/contextual/empty_spec.rb +141 -0
- data/spec/integration/criteria/alias_query_spec.rb +161 -0
- data/spec/integration/criteria/date_field_spec.rb +1 -2
- data/spec/integration/criteria/default_scope_spec.rb +72 -0
- data/spec/integration/criteria/logical_spec.rb +124 -0
- data/spec/integration/criteria/range_spec.rb +359 -0
- data/spec/integration/criteria/time_with_zone_spec.rb +125 -15
- data/spec/integration/discriminator_key_spec.rb +392 -0
- data/spec/integration/discriminator_value_spec.rb +206 -0
- data/spec/integration/document_spec.rb +30 -1
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/i18n_fallbacks_spec.rb +73 -0
- data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +130 -45
- data/spec/integration/matcher_operator_data/all.yml +140 -0
- data/spec/integration/matcher_operator_data/and.yml +93 -0
- data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
- data/spec/integration/matcher_operator_data/comment.yml +22 -0
- data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
- data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
- data/spec/integration/matcher_operator_data/eq.yml +191 -0
- data/spec/integration/matcher_operator_data/exists.yml +213 -0
- data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
- data/spec/integration/matcher_operator_data/gt.yml +132 -0
- data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
- data/spec/integration/matcher_operator_data/gte.yml +132 -0
- data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
- data/spec/integration/matcher_operator_data/implicit.yml +331 -0
- data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
- data/spec/integration/matcher_operator_data/in.yml +210 -0
- data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
- data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
- data/spec/integration/matcher_operator_data/lt.yml +132 -0
- data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
- data/spec/integration/matcher_operator_data/lte.yml +132 -0
- data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
- data/spec/integration/matcher_operator_data/mod.yml +55 -0
- data/spec/integration/matcher_operator_data/multiple.yml +29 -0
- data/spec/integration/matcher_operator_data/ne.yml +150 -0
- data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
- data/spec/integration/matcher_operator_data/nin.yml +114 -0
- data/spec/integration/matcher_operator_data/nor.yml +126 -0
- data/spec/integration/matcher_operator_data/not.yml +196 -0
- data/spec/integration/matcher_operator_data/or.yml +137 -0
- data/spec/integration/matcher_operator_data/regex.yml +174 -0
- data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
- data/spec/integration/matcher_operator_data/size.yml +174 -0
- data/spec/integration/matcher_operator_data/type.yml +70 -0
- data/spec/integration/matcher_operator_data/type_array.yml +16 -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 +41 -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 +122 -0
- data/spec/integration/matcher_spec.rb +283 -0
- data/spec/integration/persistence/range_field_spec.rb +350 -0
- data/spec/integration/server_query_spec.rb +141 -0
- data/spec/integration/shardable_spec.rb +148 -0
- data/spec/integration/stringified_symbol_field_spec.rb +203 -0
- data/spec/lite_spec_helper.rb +18 -6
- data/spec/mongoid/association/accessors_spec.rb +284 -77
- data/spec/mongoid/association/auto_save_spec.rb +74 -33
- data/spec/mongoid/association/builders_spec.rb +3 -1
- data/spec/mongoid/association/constrainable_spec.rb +2 -0
- data/spec/mongoid/association/counter_cache_spec.rb +35 -33
- data/spec/mongoid/association/depending_spec.rb +431 -338
- data/spec/mongoid/association/eager_spec.rb +8 -5
- data/spec/mongoid/association/embedded/cyclic_spec.rb +4 -2
- data/spec/mongoid/association/embedded/dirty_spec.rb +4 -2
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +4 -1
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +56 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +84 -22
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +3 -1
- data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +2 -0
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +114 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +687 -173
- data/spec/mongoid/association/embedded/embeds_many_models.rb +174 -1
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +63 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +71 -1
- data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +2 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +27 -0
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +23 -21
- data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +2 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +22 -0
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +31 -1
- data/spec/mongoid/association/macros_spec.rb +11 -9
- data/spec/mongoid/association/nested/many_spec.rb +2 -0
- data/spec/mongoid/association/nested/one_spec.rb +18 -12
- data/spec/mongoid/association/options_spec.rb +2 -0
- data/spec/mongoid/association/polymorphic_spec.rb +2 -0
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +4 -1
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +111 -16
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +242 -12
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +114 -58
- data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +26 -3
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +3 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +46 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +25 -5
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +418 -361
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +68 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +81 -4
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +3 -1
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +132 -0
- data/spec/mongoid/association/referenced/has_many/eager_spec.rb +40 -9
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +314 -133
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +848 -451
- data/spec/mongoid/association/referenced/has_many_models.rb +61 -1
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
- data/spec/mongoid/association/referenced/has_many_spec.rb +48 -0
- data/spec/mongoid/association/referenced/has_one/binding_spec.rb +2 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +55 -9
- data/spec/mongoid/association/referenced/has_one/eager_spec.rb +34 -4
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +135 -27
- data/spec/mongoid/association/referenced/has_one_models.rb +65 -0
- data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
- data/spec/mongoid/association/referenced/has_one_spec.rb +24 -1
- data/spec/mongoid/association/reflections_spec.rb +2 -0
- data/spec/mongoid/association/syncable_spec.rb +47 -31
- data/spec/mongoid/association_spec.rb +2 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +49 -0
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +2 -0
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +2 -0
- data/spec/mongoid/atomic/paths/root_spec.rb +2 -0
- data/spec/mongoid/atomic/paths_spec.rb +66 -26
- data/spec/mongoid/atomic_spec.rb +53 -6
- data/spec/mongoid/attributes/dynamic_spec.rb +0 -1
- data/spec/mongoid/attributes/nested_spec.rb +149 -78
- data/spec/mongoid/attributes/nested_spec_models.rb +48 -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 +40 -0
- data/spec/mongoid/attributes/readonly_spec.rb +24 -22
- data/spec/mongoid/attributes_spec.rb +683 -65
- data/spec/mongoid/cacheable_spec.rb +6 -4
- data/spec/mongoid/changeable_spec.rb +185 -43
- data/spec/mongoid/clients/factory_spec.rb +128 -28
- data/spec/mongoid/clients/options_spec.rb +45 -26
- data/spec/mongoid/clients/sessions_spec.rb +25 -66
- data/spec/mongoid/clients/transactions_spec.rb +54 -29
- data/spec/mongoid/clients_spec.rb +65 -8
- data/spec/mongoid/composable_spec.rb +2 -0
- data/spec/mongoid/config/environment_spec.rb +126 -8
- data/spec/mongoid/config/options_spec.rb +22 -3
- data/spec/mongoid/config_spec.rb +377 -1
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +433 -153
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +122 -20
- data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
- data/spec/mongoid/contextual/atomic_spec.rb +205 -67
- data/spec/mongoid/contextual/geo_near_spec.rb +20 -18
- data/spec/mongoid/contextual/map_reduce_spec.rb +6 -18
- data/spec/mongoid/contextual/memory_spec.rb +1360 -91
- data/spec/mongoid/contextual/mongo_spec.rb +1871 -544
- data/spec/mongoid/contextual/none_spec.rb +39 -73
- data/spec/mongoid/copyable_spec.rb +657 -26
- data/spec/mongoid/copyable_spec_models.rb +30 -0
- data/spec/mongoid/criteria/findable_spec.rb +161 -228
- data/spec/mongoid/criteria/includable_spec.rb +1492 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
- data/spec/mongoid/criteria/inspectable_spec.rb +2 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +20 -1
- data/spec/mongoid/criteria/modifiable_spec.rb +43 -40
- data/spec/mongoid/criteria/options_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +9 -19
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +136 -26
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +13 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +46 -17
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +2 -15
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -8
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +239 -178
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +2 -59
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +2 -59
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +34 -16
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +13 -0
- data/spec/mongoid/criteria/queryable/key_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +145 -12
- data/spec/mongoid/criteria/queryable/optional_spec.rb +18 -485
- data/spec/mongoid/criteria/queryable/options_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1643 -286
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +1191 -2752
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +91 -4
- data/spec/mongoid/criteria/queryable/smash_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/storable_spec.rb +298 -0
- data/spec/mongoid/criteria/scopable_spec.rb +129 -0
- data/spec/mongoid/criteria/translator_spec.rb +132 -0
- data/spec/mongoid/criteria_projection_spec.rb +409 -0
- data/spec/mongoid/criteria_spec.rb +1322 -1723
- data/spec/mongoid/document_fields_spec.rb +179 -5
- data/spec/mongoid/document_persistence_context_spec.rb +0 -1
- data/spec/mongoid/document_query_spec.rb +89 -0
- data/spec/mongoid/document_spec.rb +153 -87
- data/spec/mongoid/equality_spec.rb +144 -41
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +5 -3
- data/spec/mongoid/errors/callback_spec.rb +2 -0
- data/spec/mongoid/errors/delete_restriction_spec.rb +4 -2
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +2 -0
- data/spec/mongoid/errors/document_not_found_spec.rb +78 -0
- data/spec/mongoid/errors/invalid_collection_spec.rb +2 -0
- data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +7 -5
- data/spec/mongoid/errors/invalid_config_option_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_field_option_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_field_spec.rb +3 -1
- data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
- data/spec/mongoid/errors/invalid_find_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_includes_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_index_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_options_spec.rb +4 -2
- data/spec/mongoid/errors/invalid_path_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_relation_spec.rb +4 -2
- data/spec/mongoid/errors/invalid_scope_spec.rb +3 -1
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_time_spec.rb +2 -0
- data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -1
- data/spec/mongoid/errors/mixed_client_configuration_spec.rb +2 -0
- data/spec/mongoid/errors/mixed_relations_spec.rb +2 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +24 -8
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +5 -3
- data/spec/mongoid/errors/no_client_config_spec.rb +4 -2
- data/spec/mongoid/errors/no_client_database_spec.rb +5 -3
- data/spec/mongoid/errors/no_client_hosts_spec.rb +5 -3
- data/spec/mongoid/errors/no_clients_config_spec.rb +2 -0
- data/spec/mongoid/errors/no_environment_spec.rb +5 -3
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +2 -0
- data/spec/mongoid/errors/no_metadata_spec.rb +4 -2
- data/spec/mongoid/errors/no_parent_spec.rb +3 -1
- data/spec/mongoid/errors/readonly_attribute_spec.rb +2 -0
- data/spec/mongoid/errors/readonly_document_spec.rb +2 -0
- data/spec/mongoid/errors/scope_overwrite_spec.rb +2 -0
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -1
- data/spec/mongoid/errors/unknown_attribute_spec.rb +4 -2
- data/spec/mongoid/errors/unsaved_document_spec.rb +3 -1
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +2 -0
- data/spec/mongoid/errors/validations_spec.rb +2 -0
- data/spec/mongoid/extensions/array_spec.rb +41 -45
- data/spec/mongoid/extensions/big_decimal_spec.rb +714 -212
- data/spec/mongoid/extensions/binary_spec.rb +46 -9
- data/spec/mongoid/extensions/boolean_spec.rb +70 -82
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +339 -0
- data/spec/mongoid/extensions/date_spec.rb +58 -140
- data/spec/mongoid/extensions/date_time_spec.rb +32 -69
- data/spec/mongoid/extensions/decimal128_spec.rb +2 -0
- data/spec/mongoid/extensions/false_class_spec.rb +3 -1
- data/spec/mongoid/extensions/float_spec.rb +66 -73
- data/spec/mongoid/extensions/hash_spec.rb +138 -3
- data/spec/mongoid/extensions/integer_spec.rb +61 -63
- data/spec/mongoid/extensions/module_spec.rb +2 -0
- data/spec/mongoid/extensions/nil_class_spec.rb +2 -0
- data/spec/mongoid/extensions/object_id_spec.rb +2 -0
- data/spec/mongoid/extensions/object_spec.rb +13 -24
- data/spec/mongoid/extensions/range_spec.rb +257 -54
- data/spec/mongoid/extensions/regexp_spec.rb +60 -33
- data/spec/mongoid/extensions/set_spec.rb +108 -0
- data/spec/mongoid/extensions/string_spec.rb +111 -50
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
- data/spec/mongoid/extensions/symbol_spec.rb +20 -25
- data/spec/mongoid/extensions/time_spec.rb +663 -66
- data/spec/mongoid/extensions/time_with_zone_spec.rb +50 -31
- data/spec/mongoid/extensions/true_class_spec.rb +3 -1
- data/spec/mongoid/extensions_spec.rb +16 -2
- data/spec/mongoid/factory_spec.rb +347 -27
- data/spec/mongoid/fields/foreign_key_spec.rb +2 -0
- data/spec/mongoid/fields/localized_spec.rb +43 -16
- data/spec/mongoid/fields/standard_spec.rb +2 -0
- data/spec/mongoid/fields_spec.rb +776 -80
- data/spec/mongoid/findable_spec.rb +133 -34
- data/spec/mongoid/indexable/specification_spec.rb +4 -2
- data/spec/mongoid/indexable_spec.rb +65 -18
- data/spec/mongoid/inspectable_spec.rb +39 -2
- data/spec/mongoid/interceptable_spec.rb +955 -103
- data/spec/mongoid/interceptable_spec_models.rb +307 -0
- data/spec/mongoid/loggable_spec.rb +2 -0
- data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
- data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
- data/spec/mongoid/matcher/extract_attribute_spec.rb +36 -0
- data/spec/mongoid/mongoizable_spec.rb +285 -0
- data/spec/mongoid/persistable/creatable_spec.rb +114 -29
- data/spec/mongoid/persistable/deletable_spec.rb +274 -12
- data/spec/mongoid/persistable/destroyable_spec.rb +202 -12
- data/spec/mongoid/persistable/incrementable_spec.rb +23 -7
- data/spec/mongoid/persistable/logical_spec.rb +19 -3
- data/spec/mongoid/persistable/poppable_spec.rb +19 -3
- data/spec/mongoid/persistable/pullable_spec.rb +36 -6
- data/spec/mongoid/persistable/pushable_spec.rb +36 -6
- data/spec/mongoid/persistable/renamable_spec.rb +18 -2
- data/spec/mongoid/persistable/savable_spec.rb +188 -25
- data/spec/mongoid/persistable/settable_spec.rb +24 -8
- data/spec/mongoid/persistable/unsettable_spec.rb +19 -3
- data/spec/mongoid/persistable/updatable_spec.rb +45 -23
- data/spec/mongoid/persistable/upsertable_spec.rb +18 -2
- data/spec/mongoid/persistable_spec.rb +85 -9
- data/spec/mongoid/persistence_context_spec.rb +52 -1
- data/spec/mongoid/positional_spec.rb +2 -0
- data/spec/mongoid/query_cache_middleware_spec.rb +50 -0
- data/spec/mongoid/query_cache_spec.rb +339 -87
- data/spec/mongoid/relations/proxy_spec.rb +8 -6
- data/spec/mongoid/reloadable_spec.rb +357 -22
- data/spec/mongoid/scopable_spec.rb +121 -37
- data/spec/mongoid/selectable_spec.rb +8 -6
- data/spec/mongoid/serializable_spec.rb +160 -29
- data/spec/mongoid/shardable_models.rb +75 -0
- data/spec/mongoid/shardable_spec.rb +239 -34
- data/spec/mongoid/stateful_spec.rb +31 -1
- data/spec/mongoid/tasks/database_rake_spec.rb +2 -0
- data/spec/mongoid/tasks/database_spec.rb +2 -0
- data/spec/mongoid/threaded_spec.rb +4 -2
- data/spec/mongoid/timestamps/created/short_spec.rb +3 -1
- data/spec/mongoid/timestamps/created_spec.rb +3 -1
- data/spec/mongoid/timestamps/timeless_spec.rb +4 -2
- data/spec/mongoid/timestamps/updated/short_spec.rb +5 -3
- data/spec/mongoid/timestamps/updated_spec.rb +5 -3
- data/spec/mongoid/timestamps_spec.rb +398 -6
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +296 -33
- data/spec/mongoid/touchable_spec_models.rb +57 -0
- data/spec/mongoid/traversable_spec.rb +1160 -1
- data/spec/mongoid/validatable/associated_spec.rb +15 -30
- data/spec/mongoid/validatable/format_spec.rb +2 -0
- data/spec/mongoid/validatable/length_spec.rb +2 -0
- data/spec/mongoid/validatable/numericality_spec.rb +2 -0
- data/spec/mongoid/validatable/presence_spec.rb +28 -22
- data/spec/mongoid/validatable/uniqueness_spec.rb +128 -98
- data/spec/mongoid/validatable_spec.rb +5 -3
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/mongoid_spec.rb +3 -1
- data/spec/rails/controller_extension/controller_runtime_spec.rb +5 -3
- data/spec/rails/mongoid_spec.rb +8 -18
- data/spec/shared/bin/s3-copy +45 -0
- data/spec/shared/bin/s3-upload +69 -0
- data/spec/shared/lib/mrss/cluster_config.rb +14 -4
- data/spec/shared/lib/mrss/constraints.rb +51 -27
- data/spec/shared/lib/mrss/docker_runner.rb +37 -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 +48 -1
- data/spec/shared/lib/mrss/server_version_registry.rb +16 -18
- 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 +18 -1
- data/spec/shared/lib/mrss/utils.rb +28 -6
- data/spec/shared/share/Dockerfile.erb +156 -66
- 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 +171 -45
- data/spec/shared/shlib/set_env.sh +47 -6
- data/spec/spec_helper.rb +38 -36
- data/spec/support/authorization.rb +2 -0
- data/spec/support/client_registry.rb +9 -0
- data/spec/support/constraints.rb +39 -8
- data/spec/support/expectations.rb +5 -1
- data/spec/support/helpers.rb +11 -0
- data/spec/support/macros.rb +77 -0
- data/spec/{app → support}/models/account.rb +3 -1
- data/spec/{app → support}/models/acolyte.rb +2 -0
- data/spec/{app → support}/models/actor.rb +3 -1
- data/spec/support/models/actress.rb +4 -0
- data/spec/{app → support}/models/address.rb +6 -0
- data/spec/{app → support}/models/address_component.rb +2 -0
- data/spec/{app → support}/models/address_number.rb +2 -0
- data/spec/{app → support}/models/agency.rb +2 -0
- data/spec/{app → support}/models/agent.rb +2 -0
- data/spec/{app → support}/models/album.rb +2 -0
- data/spec/{app → support}/models/alert.rb +2 -0
- data/spec/{app → support}/models/animal.rb +2 -0
- data/spec/{app → support}/models/answer.rb +2 -0
- data/spec/{app → support}/models/appointment.rb +2 -0
- data/spec/support/models/armrest.rb +9 -0
- data/spec/{app → support}/models/article.rb +2 -0
- data/spec/{app → support}/models/artist.rb +4 -0
- data/spec/{app → support}/models/artwork.rb +2 -0
- data/spec/support/models/audible_sound.rb +3 -0
- data/spec/{app → support}/models/audio.rb +2 -0
- data/spec/support/models/augmentation.rb +25 -0
- data/spec/{app → support}/models/author.rb +2 -0
- data/spec/{app → support}/models/baby.rb +2 -0
- data/spec/{app → support}/models/band.rb +9 -0
- data/spec/{app → support}/models/bar.rb +2 -0
- data/spec/{app → support}/models/basic.rb +2 -0
- data/spec/support/models/bed.rb +3 -0
- data/spec/{app → support}/models/big_palette.rb +2 -0
- data/spec/{app → support}/models/birthday.rb +2 -0
- data/spec/support/models/bolt.rb +7 -0
- data/spec/{app → support}/models/bomb.rb +2 -0
- data/spec/{app → support}/models/book.rb +2 -0
- data/spec/{app → support}/models/breed.rb +2 -0
- data/spec/{app → support}/models/browser.rb +3 -1
- data/spec/{app → support}/models/building.rb +2 -0
- data/spec/{app → support}/models/building_address.rb +2 -0
- data/spec/{app → support}/models/bus.rb +2 -0
- data/spec/{app → support}/models/business.rb +2 -0
- data/spec/{app → support}/models/callback_test.rb +2 -0
- data/spec/{app → support}/models/canvas.rb +3 -1
- data/spec/support/models/car.rb +3 -0
- data/spec/{app → support}/models/cat.rb +2 -0
- data/spec/support/models/catalog.rb +24 -0
- data/spec/{app → support}/models/category.rb +2 -0
- data/spec/{app → support}/models/child.rb +2 -0
- data/spec/{app → support}/models/child_doc.rb +5 -3
- data/spec/{app → support}/models/church.rb +2 -0
- data/spec/{app → support}/models/circle.rb +2 -0
- data/spec/{app → support}/models/circuit.rb +2 -0
- data/spec/support/models/circus.rb +12 -0
- data/spec/{app → support}/models/code.rb +4 -0
- data/spec/support/models/coding/pull_request.rb +11 -0
- data/spec/support/models/coding.rb +3 -0
- data/spec/{app → support}/models/comment.rb +2 -0
- data/spec/{app → support}/models/company.rb +2 -0
- data/spec/{app → support}/models/consumption_period.rb +2 -0
- data/spec/{app → support}/models/contextable_item.rb +2 -0
- data/spec/{app → support}/models/contractor.rb +2 -0
- data/spec/{app → support}/models/cookie.rb +2 -0
- data/spec/{app → support}/models/country_code.rb +4 -0
- data/spec/{app → support}/models/courier_job.rb +2 -0
- data/spec/support/models/crate.rb +12 -0
- data/spec/{app → support}/models/customer.rb +0 -1
- data/spec/{app → support}/models/customer_address.rb +0 -1
- data/spec/support/models/deed.rb +7 -0
- data/spec/{app → support}/models/definition.rb +2 -0
- data/spec/{app → support}/models/delegating_patient.rb +0 -1
- data/spec/{app → support}/models/description.rb +2 -0
- data/spec/{app → support}/models/dictionary.rb +8 -0
- data/spec/{app → support}/models/division.rb +2 -0
- data/spec/{app → support}/models/doctor.rb +2 -0
- data/spec/{app → support}/models/dog.rb +2 -0
- data/spec/{app → support}/models/dokument.rb +2 -0
- data/spec/{app → support}/models/draft.rb +2 -0
- data/spec/{app → support}/models/dragon.rb +2 -0
- data/spec/{app → support}/models/driver.rb +3 -1
- data/spec/{app → support}/models/drug.rb +2 -0
- data/spec/{app → support}/models/dungeon.rb +2 -0
- data/spec/{app → support}/models/edit.rb +2 -0
- data/spec/{app → support}/models/email.rb +2 -0
- data/spec/{app → support}/models/employer.rb +2 -0
- data/spec/{app → support}/models/entry.rb +2 -0
- data/spec/support/models/eraser.rb +3 -0
- data/spec/{app → support}/models/even.rb +2 -0
- data/spec/{app → support}/models/event.rb +2 -0
- data/spec/{app → support}/models/exhibition.rb +2 -0
- data/spec/{app → support}/models/exhibitor.rb +2 -0
- data/spec/{app → support}/models/explosion.rb +2 -0
- data/spec/{app → support}/models/eye.rb +2 -0
- data/spec/{app → support}/models/eye_bowl.rb +2 -0
- data/spec/{app → support}/models/face.rb +2 -0
- data/spec/support/models/fanatic.rb +8 -0
- data/spec/{app → support}/models/favorite.rb +2 -0
- data/spec/{app → support}/models/filesystem.rb +2 -0
- data/spec/{app → support}/models/fire_hydrant.rb +2 -0
- data/spec/{app → support}/models/firefox.rb +2 -0
- data/spec/{app → support}/models/fish.rb +2 -0
- data/spec/{app → support}/models/folder.rb +2 -0
- data/spec/{app → support}/models/folder_item.rb +2 -0
- data/spec/{app → support}/models/fruits.rb +2 -0
- data/spec/{app → support}/models/game.rb +2 -0
- data/spec/{app → support}/models/ghost.rb +2 -0
- data/spec/support/models/guitar.rb +4 -0
- data/spec/support/models/hole.rb +12 -0
- data/spec/{app → support}/models/home.rb +2 -0
- data/spec/{app → support}/models/house.rb +2 -0
- data/spec/{app → support}/models/html_writer.rb +2 -0
- data/spec/{app → support}/models/id_key.rb +2 -0
- data/spec/support/models/idnodef.rb +7 -0
- data/spec/{app → support}/models/image.rb +2 -0
- data/spec/{app → support}/models/implant.rb +11 -0
- data/spec/support/models/instrument.rb +8 -0
- data/spec/{app → support}/models/item.rb +3 -1
- data/spec/{app → support}/models/jar.rb +2 -0
- data/spec/{app → support}/models/kaleidoscope.rb +2 -0
- data/spec/{app → support}/models/kangaroo.rb +3 -1
- data/spec/{app → support}/models/label.rb +6 -1
- data/spec/{app → support}/models/language.rb +2 -0
- data/spec/{app → support}/models/lat_lng.rb +2 -0
- data/spec/{app → support}/models/league.rb +2 -0
- data/spec/support/models/learner.rb +4 -0
- data/spec/{app → support}/models/line_item.rb +2 -0
- data/spec/{app → support}/models/location.rb +2 -0
- data/spec/{app → support}/models/login.rb +2 -0
- data/spec/{app → support}/models/manufacturer.rb +2 -0
- data/spec/{app → support}/models/meat.rb +2 -0
- data/spec/{app → support}/models/membership.rb +3 -0
- data/spec/{app → support}/models/message.rb +2 -0
- data/spec/{app → support}/models/minim.rb +0 -1
- data/spec/{app → support}/models/mixed_drink.rb +2 -0
- data/spec/support/models/mop.rb +24 -0
- data/spec/{app → support}/models/movie.rb +2 -0
- data/spec/support/models/my_hash.rb +4 -0
- data/spec/{app → support}/models/name.rb +12 -0
- data/spec/support/models/name_only.rb +8 -0
- data/spec/{app → support}/models/node.rb +2 -0
- data/spec/{app → support}/models/note.rb +2 -0
- data/spec/support/models/nut.rb +7 -0
- data/spec/{app → support}/models/odd.rb +2 -0
- data/spec/support/models/order.rb +12 -0
- data/spec/{app → support}/models/ordered_post.rb +3 -1
- data/spec/{app → support}/models/ordered_preference.rb +2 -0
- data/spec/{app → support}/models/oscar.rb +2 -0
- data/spec/support/models/other_owner_object.rb +4 -0
- data/spec/{app → support}/models/override.rb +2 -0
- data/spec/{app → support}/models/ownable.rb +2 -0
- data/spec/{app → support}/models/owner.rb +4 -0
- data/spec/{app → support}/models/pack.rb +2 -0
- data/spec/{app → support}/models/page.rb +2 -0
- data/spec/{app → support}/models/page_question.rb +2 -0
- data/spec/{app → support}/models/palette.rb +3 -1
- data/spec/{app → support}/models/parent.rb +2 -0
- data/spec/{app → support}/models/parent_doc.rb +2 -0
- data/spec/support/models/passport.rb +22 -0
- data/spec/{app → support}/models/patient.rb +2 -0
- data/spec/{app → support}/models/pdf_writer.rb +2 -0
- data/spec/support/models/pencil.rb +3 -0
- data/spec/{app → support}/models/person.rb +23 -1
- data/spec/{app → support}/models/pet.rb +2 -0
- data/spec/{app → support}/models/pet_owner.rb +2 -0
- data/spec/{app → support}/models/phone.rb +5 -1
- data/spec/support/models/piano.rb +4 -0
- data/spec/{app → support}/models/pizza.rb +2 -0
- data/spec/{app → support}/models/player.rb +4 -0
- data/spec/{app → support}/models/post.rb +2 -0
- data/spec/{app → support}/models/post_genre.rb +2 -0
- data/spec/support/models/powerup.rb +25 -0
- data/spec/{app → support}/models/preference.rb +2 -0
- data/spec/{app → support}/models/princess.rb +2 -0
- data/spec/{app → support}/models/product.rb +2 -0
- data/spec/support/models/profile.rb +17 -0
- data/spec/{app → support}/models/pronunciation.rb +2 -0
- data/spec/{app → support}/models/pub.rb +2 -0
- data/spec/support/models/publication/encyclopedia.rb +11 -0
- data/spec/support/models/publication/review.rb +13 -0
- data/spec/support/models/publication.rb +4 -0
- data/spec/{app → support}/models/purchase.rb +2 -0
- data/spec/support/models/purchased_item.rb +10 -0
- data/spec/support/models/purse.rb +9 -0
- data/spec/{app → support}/models/question.rb +2 -0
- data/spec/{app → support}/models/quiz.rb +2 -0
- data/spec/{app → support}/models/rating.rb +2 -0
- data/spec/{app → support}/models/record.rb +2 -0
- data/spec/{app → support}/models/registry.rb +3 -0
- data/spec/{app → support}/models/role.rb +2 -0
- data/spec/{app → support}/models/root_category.rb +2 -0
- data/spec/{app → support}/models/sandwich.rb +2 -0
- data/spec/{app → support}/models/scheduler.rb +2 -0
- data/spec/support/models/school.rb +14 -0
- data/spec/support/models/scribe.rb +7 -0
- data/spec/support/models/sealer.rb +7 -0
- data/spec/support/models/seat.rb +24 -0
- data/spec/{app → support}/models/seo.rb +2 -0
- data/spec/support/models/series.rb +7 -0
- data/spec/{app → support}/models/server.rb +2 -0
- data/spec/{app → support}/models/service.rb +2 -0
- data/spec/{app → support}/models/shape.rb +4 -2
- data/spec/{app → support}/models/shelf.rb +2 -0
- data/spec/support/models/shield.rb +18 -0
- data/spec/{app → support}/models/shipment_address.rb +2 -0
- data/spec/{app → support}/models/shipping_container.rb +2 -0
- data/spec/{app → support}/models/shipping_pack.rb +2 -0
- data/spec/support/models/shirt.rb +11 -0
- data/spec/{app → support}/models/shop.rb +2 -0
- data/spec/{app → support}/models/short_agent.rb +2 -0
- data/spec/{app → support}/models/short_quiz.rb +2 -0
- data/spec/{app → support}/models/simple.rb +2 -0
- data/spec/{app → support}/models/slave.rb +2 -0
- data/spec/{app → support}/models/song.rb +2 -0
- data/spec/{app → support}/models/sound.rb +2 -0
- data/spec/support/models/spacer.rb +7 -0
- data/spec/{app → support}/models/square.rb +2 -0
- data/spec/{app → support}/models/staff.rb +2 -0
- data/spec/{app → support}/models/store_as_dup_test1.rb +2 -0
- data/spec/{app → support}/models/store_as_dup_test2.rb +2 -0
- data/spec/{app → support}/models/strategy.rb +2 -0
- data/spec/support/models/student.rb +14 -0
- data/spec/{app → support}/models/sub_item.rb +2 -0
- data/spec/{app → support}/models/subscription.rb +2 -0
- data/spec/{app → support}/models/survey.rb +2 -0
- data/spec/{app → support}/models/symptom.rb +2 -0
- data/spec/support/models/system_role.rb +7 -0
- data/spec/{app → support}/models/tag.rb +2 -0
- data/spec/{app → support}/models/target.rb +2 -0
- data/spec/{app → support}/models/template.rb +2 -0
- data/spec/{app → support}/models/thing.rb +2 -0
- data/spec/support/models/threadlocker.rb +7 -0
- data/spec/{app → support}/models/title.rb +2 -0
- data/spec/{app → support}/models/tool.rb +4 -2
- data/spec/{app → support}/models/topping.rb +2 -0
- data/spec/support/models/toy.rb +9 -0
- data/spec/{app → support}/models/track.rb +2 -0
- data/spec/{app → support}/models/translation.rb +2 -0
- data/spec/{app → support}/models/tree.rb +2 -0
- data/spec/support/models/truck.rb +7 -0
- data/spec/{app → support}/models/user.rb +2 -0
- data/spec/{app → support}/models/user_account.rb +2 -0
- data/spec/{app → support}/models/validation_callback.rb +2 -0
- data/spec/support/models/vehicle.rb +18 -0
- data/spec/{app → support}/models/version.rb +2 -0
- data/spec/{app → support}/models/vertex.rb +3 -1
- data/spec/{app → support}/models/vet_visit.rb +2 -0
- data/spec/{app → support}/models/video.rb +2 -0
- data/spec/support/models/video_game.rb +3 -0
- data/spec/support/models/washer.rb +7 -0
- data/spec/support/models/weapon.rb +25 -0
- data/spec/{app → support}/models/wiki_page.rb +3 -0
- data/spec/{app → support}/models/word.rb +2 -0
- data/spec/{app → support}/models/word_origin.rb +2 -0
- data/spec/{app → support}/models/writer.rb +4 -2
- 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 +53 -0
- data/spec/support/spec_config.rb +12 -3
- data.tar.gz.sig +0 -0
- metadata +1162 -764
- metadata.gz.sig +0 -0
- data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
- data/lib/mongoid/errors/eager_load.rb +0 -22
- data/lib/mongoid/errors/invalid_value.rb +0 -16
- data/lib/mongoid/matchable/all.rb +0 -28
- data/lib/mongoid/matchable/and.rb +0 -30
- data/lib/mongoid/matchable/default.rb +0 -119
- data/lib/mongoid/matchable/elem_match.rb +0 -34
- data/lib/mongoid/matchable/eq.rb +0 -22
- data/lib/mongoid/matchable/exists.rb +0 -23
- data/lib/mongoid/matchable/gt.rb +0 -23
- data/lib/mongoid/matchable/gte.rb +0 -23
- data/lib/mongoid/matchable/in.rb +0 -24
- data/lib/mongoid/matchable/lt.rb +0 -23
- data/lib/mongoid/matchable/lte.rb +0 -23
- data/lib/mongoid/matchable/ne.rb +0 -21
- data/lib/mongoid/matchable/nin.rb +0 -22
- data/lib/mongoid/matchable/nor.rb +0 -37
- data/lib/mongoid/matchable/or.rb +0 -33
- data/lib/mongoid/matchable/regexp.rb +0 -27
- data/lib/mongoid/matchable/size.rb +0 -21
- data/lib/support/ruby_version.rb +0 -26
- data/spec/app/models/actress.rb +0 -2
- data/spec/app/models/augmentation.rb +0 -11
- data/spec/app/models/bed.rb +0 -1
- data/spec/app/models/car.rb +0 -1
- data/spec/app/models/circus.rb +0 -7
- data/spec/app/models/eraser.rb +0 -1
- data/spec/app/models/learner.rb +0 -2
- data/spec/app/models/my_hash.rb +0 -2
- data/spec/app/models/other_owner_object.rb +0 -2
- data/spec/app/models/passport.rb +0 -5
- data/spec/app/models/pencil.rb +0 -1
- data/spec/app/models/powerup.rb +0 -11
- data/spec/app/models/profile.rb +0 -5
- data/spec/app/models/series.rb +0 -4
- data/spec/app/models/truck.rb +0 -3
- data/spec/app/models/vehicle.rb +0 -11
- data/spec/app/models/video_game.rb +0 -1
- data/spec/app/models/weapon.rb +0 -11
- data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
- data/spec/mongoid/matchable/all_spec.rb +0 -31
- data/spec/mongoid/matchable/and_spec.rb +0 -187
- data/spec/mongoid/matchable/default_spec.rb +0 -137
- data/spec/mongoid/matchable/elem_match_spec.rb +0 -106
- data/spec/mongoid/matchable/eq_spec.rb +0 -48
- data/spec/mongoid/matchable/exists_spec.rb +0 -57
- data/spec/mongoid/matchable/gt_spec.rb +0 -86
- data/spec/mongoid/matchable/gte_spec.rb +0 -84
- data/spec/mongoid/matchable/in_spec.rb +0 -49
- data/spec/mongoid/matchable/lt_spec.rb +0 -85
- data/spec/mongoid/matchable/lte_spec.rb +0 -85
- data/spec/mongoid/matchable/ne_spec.rb +0 -46
- data/spec/mongoid/matchable/nin_spec.rb +0 -48
- data/spec/mongoid/matchable/nor_spec.rb +0 -209
- data/spec/mongoid/matchable/or_spec.rb +0 -131
- data/spec/mongoid/matchable/regexp_spec.rb +0 -59
- data/spec/mongoid/matchable/size_spec.rb +0 -25
- data/spec/mongoid/matchable_spec.rb +0 -853
- data/spec/support/cluster_config.rb +0 -158
- data/spec/support/session_registry.rb +0 -50
- /data/spec/{app → support}/models/array_field.rb +0 -0
- /data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
- /data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
- /data/spec/{app → support}/models/updatable.rb +0 -0
data/lib/mongoid/fields.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
require "mongoid/fields/standard"
|
|
3
4
|
require "mongoid/fields/foreign_key"
|
|
4
5
|
require "mongoid/fields/localized"
|
|
@@ -6,13 +7,14 @@ require "mongoid/fields/validators"
|
|
|
6
7
|
|
|
7
8
|
module Mongoid
|
|
8
9
|
|
|
9
|
-
# This module defines
|
|
10
|
+
# This module defines behavior for fields.
|
|
10
11
|
module Fields
|
|
11
12
|
extend ActiveSupport::Concern
|
|
12
13
|
|
|
14
|
+
StringifiedSymbol = Mongoid::StringifiedSymbol
|
|
15
|
+
Boolean = Mongoid::Boolean
|
|
16
|
+
|
|
13
17
|
# For fields defined with symbols use the correct class.
|
|
14
|
-
#
|
|
15
|
-
# @since 4.0.0
|
|
16
18
|
TYPE_MAPPINGS = {
|
|
17
19
|
array: Array,
|
|
18
20
|
big_decimal: BigDecimal,
|
|
@@ -28,14 +30,94 @@ module Mongoid
|
|
|
28
30
|
regexp: Regexp,
|
|
29
31
|
set: Set,
|
|
30
32
|
string: String,
|
|
33
|
+
stringified_symbol: StringifiedSymbol,
|
|
31
34
|
symbol: Symbol,
|
|
32
35
|
time: Time
|
|
33
36
|
}.with_indifferent_access
|
|
34
37
|
|
|
35
|
-
# Constant for all names of the
|
|
38
|
+
# Constant for all names of the _id field in a document.
|
|
39
|
+
#
|
|
40
|
+
# This does not include aliases of _id field.
|
|
41
|
+
#
|
|
42
|
+
# @api private
|
|
43
|
+
IDS = [ :_id, '_id', ].freeze
|
|
44
|
+
|
|
45
|
+
# BSON classes that are not supported as field types
|
|
36
46
|
#
|
|
37
|
-
# @
|
|
38
|
-
|
|
47
|
+
# @api private
|
|
48
|
+
INVALID_BSON_CLASSES = [ BSON::Decimal128, BSON::Int32, BSON::Int64 ].freeze
|
|
49
|
+
|
|
50
|
+
module ClassMethods
|
|
51
|
+
# Returns the list of id fields for this model class, as both strings
|
|
52
|
+
# and symbols.
|
|
53
|
+
#
|
|
54
|
+
# @return [ Array<Symbol | String> ] List of id fields.
|
|
55
|
+
#
|
|
56
|
+
# @api private
|
|
57
|
+
def id_fields
|
|
58
|
+
IDS.dup.tap do |id_fields|
|
|
59
|
+
aliased_fields.each do |k, v|
|
|
60
|
+
if v == '_id'
|
|
61
|
+
id_fields << k.to_sym
|
|
62
|
+
id_fields << k
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Extracts the id field from the specified attributes hash based on
|
|
69
|
+
# aliases defined in this class.
|
|
70
|
+
#
|
|
71
|
+
# @param [ Hash ] attributes The attributes to inspect.
|
|
72
|
+
#
|
|
73
|
+
# @return [ Object ] The id value.
|
|
74
|
+
#
|
|
75
|
+
# @api private
|
|
76
|
+
def extract_id_field(attributes)
|
|
77
|
+
id_fields.each do |k|
|
|
78
|
+
if v = attributes[k]
|
|
79
|
+
return v
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
nil
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Removes the _translations from the given field name. This is done only
|
|
86
|
+
# when there doesn't already exist a field name or relation with the
|
|
87
|
+
# same name (i.e. with the _translations suffix). This check for an
|
|
88
|
+
# existing field is done recursively
|
|
89
|
+
#
|
|
90
|
+
# @param [ String | Symbol ] name The name of the field to cleanse.
|
|
91
|
+
#
|
|
92
|
+
# @return [ Field ] The field name without _translations
|
|
93
|
+
def cleanse_localized_field_names(name)
|
|
94
|
+
name = database_field_name(name.to_s)
|
|
95
|
+
|
|
96
|
+
klass = self
|
|
97
|
+
[].tap do |res|
|
|
98
|
+
ar = name.split('.')
|
|
99
|
+
ar.each_with_index do |fn, i|
|
|
100
|
+
key = fn
|
|
101
|
+
unless klass.fields.key?(fn) || klass.relations.key?(fn)
|
|
102
|
+
if tr = fn.match(/(.*)_translations\z/)&.captures&.first
|
|
103
|
+
key = tr
|
|
104
|
+
else
|
|
105
|
+
key = fn
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
end
|
|
109
|
+
res.push(key)
|
|
110
|
+
|
|
111
|
+
if klass.fields.key?(fn)
|
|
112
|
+
res.push(ar.drop(i+1).join('.')) unless i == ar.length - 1
|
|
113
|
+
break
|
|
114
|
+
elsif klass.relations.key?(fn)
|
|
115
|
+
klass = klass.relations[key].klass
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end.join('.')
|
|
119
|
+
end
|
|
120
|
+
end
|
|
39
121
|
|
|
40
122
|
included do
|
|
41
123
|
class_attribute :aliased_fields
|
|
@@ -57,8 +139,7 @@ module Mongoid
|
|
|
57
139
|
type: BSON::ObjectId
|
|
58
140
|
)
|
|
59
141
|
|
|
60
|
-
|
|
61
|
-
alias :id= :_id=
|
|
142
|
+
alias_attribute(:id, :_id)
|
|
62
143
|
end
|
|
63
144
|
|
|
64
145
|
# Apply all default values to the document which are not procs.
|
|
@@ -66,9 +147,7 @@ module Mongoid
|
|
|
66
147
|
# @example Apply all the non-proc defaults.
|
|
67
148
|
# model.apply_pre_processed_defaults
|
|
68
149
|
#
|
|
69
|
-
# @return [ Array<String ] The names of the non-proc defaults.
|
|
70
|
-
#
|
|
71
|
-
# @since 2.4.0
|
|
150
|
+
# @return [ Array<String> ] The names of the non-proc defaults.
|
|
72
151
|
def apply_pre_processed_defaults
|
|
73
152
|
pre_processed_defaults.each do |name|
|
|
74
153
|
apply_default(name)
|
|
@@ -80,10 +159,9 @@ module Mongoid
|
|
|
80
159
|
# @example Apply all the proc defaults.
|
|
81
160
|
# model.apply_post_processed_defaults
|
|
82
161
|
#
|
|
83
|
-
# @return [ Array<String ] The names of the proc defaults.
|
|
84
|
-
#
|
|
85
|
-
# @since 2.4.0
|
|
162
|
+
# @return [ Array<String> ] The names of the proc defaults.
|
|
86
163
|
def apply_post_processed_defaults
|
|
164
|
+
pending_callbacks.delete(:apply_post_processed_defaults)
|
|
87
165
|
post_processed_defaults.each do |name|
|
|
88
166
|
apply_default(name)
|
|
89
167
|
end
|
|
@@ -95,8 +173,6 @@ module Mongoid
|
|
|
95
173
|
# model.apply_default("name")
|
|
96
174
|
#
|
|
97
175
|
# @param [ String ] name The name of the field.
|
|
98
|
-
#
|
|
99
|
-
# @since 2.4.0
|
|
100
176
|
def apply_default(name)
|
|
101
177
|
unless attributes.key?(name)
|
|
102
178
|
if field = fields[name]
|
|
@@ -113,9 +189,8 @@ module Mongoid
|
|
|
113
189
|
#
|
|
114
190
|
# @example Apply all the defaults.
|
|
115
191
|
# model.apply_defaults
|
|
116
|
-
#
|
|
117
|
-
# @since 2.4.0
|
|
118
192
|
def apply_defaults
|
|
193
|
+
pending_callbacks.delete(:apply_defaults)
|
|
119
194
|
apply_pre_processed_defaults
|
|
120
195
|
apply_post_processed_defaults
|
|
121
196
|
end
|
|
@@ -126,11 +201,9 @@ module Mongoid
|
|
|
126
201
|
# method to automatically wrap params in JSON requests.
|
|
127
202
|
#
|
|
128
203
|
# @example Get the field names
|
|
129
|
-
#
|
|
204
|
+
# document.attribute_names
|
|
130
205
|
#
|
|
131
206
|
# @return [ Array<String> ] The field names
|
|
132
|
-
#
|
|
133
|
-
# @since 3.0.0
|
|
134
207
|
def attribute_names
|
|
135
208
|
self.class.attribute_names
|
|
136
209
|
end
|
|
@@ -141,11 +214,9 @@ module Mongoid
|
|
|
141
214
|
# @example Get the database field name.
|
|
142
215
|
# model.database_field_name(:authorization)
|
|
143
216
|
#
|
|
144
|
-
# @param [ String
|
|
217
|
+
# @param [ String | Symbol ] name The name to get.
|
|
145
218
|
#
|
|
146
219
|
# @return [ String ] The name of the field as it's stored in the db.
|
|
147
|
-
#
|
|
148
|
-
# @since 3.0.7
|
|
149
220
|
def database_field_name(name)
|
|
150
221
|
self.class.database_field_name(name)
|
|
151
222
|
end
|
|
@@ -158,9 +229,7 @@ module Mongoid
|
|
|
158
229
|
# @param [ Field ] field The field.
|
|
159
230
|
# @param [ Object ] value The current value.
|
|
160
231
|
#
|
|
161
|
-
# @return [ true
|
|
162
|
-
#
|
|
163
|
-
# @since 3.1.0
|
|
232
|
+
# @return [ true | false ] If we set the field lazily.
|
|
164
233
|
def lazy_settable?(field, value)
|
|
165
234
|
!frozen? && value.nil? && field.lazy?
|
|
166
235
|
end
|
|
@@ -172,17 +241,43 @@ module Mongoid
|
|
|
172
241
|
# @example Is the document using object ids?
|
|
173
242
|
# model.using_object_ids?
|
|
174
243
|
#
|
|
175
|
-
# @return [ true
|
|
244
|
+
# @return [ true | false ] Using object ids.
|
|
176
245
|
def using_object_ids?
|
|
177
246
|
self.class.using_object_ids?
|
|
178
247
|
end
|
|
179
248
|
|
|
249
|
+
# Does this field start with a dollar sign ($) or contain a dot/period (.)?
|
|
250
|
+
#
|
|
251
|
+
# @api private
|
|
252
|
+
#
|
|
253
|
+
# @param [ String ] name The field name.
|
|
254
|
+
#
|
|
255
|
+
# @return [ true | false ] If this field is dotted or dollared.
|
|
256
|
+
def dot_dollar_field?(name)
|
|
257
|
+
n = aliased_fields[name] || name
|
|
258
|
+
fields.key?(n) && (n.include?('.') || n.start_with?('$'))
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
# Validate whether or not the field starts with a dollar sign ($) or
|
|
262
|
+
# contains a dot/period (.).
|
|
263
|
+
#
|
|
264
|
+
# @api private
|
|
265
|
+
#
|
|
266
|
+
# @raise [ InvalidDotDollarAssignment ] If contains dots or starts with a dollar.
|
|
267
|
+
#
|
|
268
|
+
# @param [ String ] name The field name.
|
|
269
|
+
def validate_writable_field_name!(name)
|
|
270
|
+
if dot_dollar_field?(name)
|
|
271
|
+
raise Errors::InvalidDotDollarAssignment.new(self.class, name)
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
180
275
|
class << self
|
|
181
276
|
|
|
182
277
|
# Stores the provided block to be run when the option name specified is
|
|
183
278
|
# defined on a field.
|
|
184
279
|
#
|
|
185
|
-
# No assumptions are made about what
|
|
280
|
+
# No assumptions are made about what functionality the handler might
|
|
186
281
|
# perform, so it will always be called if the `option_name` key is
|
|
187
282
|
# provided in the field definition -- even if it is false or nil.
|
|
188
283
|
#
|
|
@@ -194,8 +289,6 @@ module Mongoid
|
|
|
194
289
|
# @param [ Symbol ] option_name the option name to match against
|
|
195
290
|
# @param [ Proc ] block the handler to execute when the option is
|
|
196
291
|
# provided.
|
|
197
|
-
#
|
|
198
|
-
# @since 2.1.0
|
|
199
292
|
def option(option_name, &block)
|
|
200
293
|
options[option_name] = block
|
|
201
294
|
end
|
|
@@ -207,11 +300,141 @@ module Mongoid
|
|
|
207
300
|
# # => { :required => #<Proc:0x00000100976b38> }
|
|
208
301
|
#
|
|
209
302
|
# @return [ Hash ] the option map
|
|
210
|
-
#
|
|
211
|
-
# @since 2.1.0
|
|
212
303
|
def options
|
|
213
304
|
@options ||= {}
|
|
214
305
|
end
|
|
306
|
+
|
|
307
|
+
# Traverse down the association tree and search for the field for the
|
|
308
|
+
# given key. To do this, split the key by '.' and for each part (meth) of
|
|
309
|
+
# the key:
|
|
310
|
+
#
|
|
311
|
+
# - If the meth is a field, yield the meth, field, and is_field as true.
|
|
312
|
+
# - If the meth is an association, update the klass to the association's
|
|
313
|
+
# klass, and yield the meth, klass, and is_field as false.
|
|
314
|
+
#
|
|
315
|
+
# The next iteration will use klass's fields and associations to continue
|
|
316
|
+
# traversing the tree.
|
|
317
|
+
#
|
|
318
|
+
# @param [ String ] key The key used to search the association tree.
|
|
319
|
+
# @param [ Hash ] fields The fields to begin the search with.
|
|
320
|
+
# @param [ Hash ] associations The associations to begin the search with.
|
|
321
|
+
# @param [ Hash ] aliased_associations The alaised associations to begin
|
|
322
|
+
# the search with.
|
|
323
|
+
# @param [ Proc ] block The block takes in three paramaters, the current
|
|
324
|
+
# meth, the field or the relation, and whether the second parameter is a
|
|
325
|
+
# field or not.
|
|
326
|
+
#
|
|
327
|
+
# @return [ Field ] The field found for the given key at the end of the
|
|
328
|
+
# search. This will return nil if the last thing found is an association
|
|
329
|
+
# or no field was found for the given key.
|
|
330
|
+
#
|
|
331
|
+
# @api private
|
|
332
|
+
def traverse_association_tree(key, fields, associations, aliased_associations)
|
|
333
|
+
klass = nil
|
|
334
|
+
field = nil
|
|
335
|
+
key.split('.').each_with_index do |meth, i|
|
|
336
|
+
fs = i == 0 ? fields : klass&.fields
|
|
337
|
+
rs = i == 0 ? associations : klass&.relations
|
|
338
|
+
as = i == 0 ? aliased_associations : klass&.aliased_associations
|
|
339
|
+
|
|
340
|
+
# Associations can possibly have two "keys", their name and their alias.
|
|
341
|
+
# The fields name is what is used to store it in the klass's relations
|
|
342
|
+
# and field hashes, and the alias is what's used to store that field
|
|
343
|
+
# in the database. The key inputted to this function is the aliased
|
|
344
|
+
# key. We can convert them back to their names by looking in the
|
|
345
|
+
# aliased_associations hash.
|
|
346
|
+
aliased = meth
|
|
347
|
+
if as && a = as.fetch(meth, nil)
|
|
348
|
+
aliased = a.to_s
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
field = nil
|
|
352
|
+
klass = nil
|
|
353
|
+
if fs && f = fs[aliased]
|
|
354
|
+
field = f
|
|
355
|
+
yield(meth, f, true) if block_given?
|
|
356
|
+
elsif rs && rel = rs[aliased]
|
|
357
|
+
klass = rel.klass
|
|
358
|
+
yield(meth, rel, false) if block_given?
|
|
359
|
+
else
|
|
360
|
+
yield(meth, nil, false) if block_given?
|
|
361
|
+
end
|
|
362
|
+
end
|
|
363
|
+
field
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
# Get the name of the provided field as it is stored in the database.
|
|
367
|
+
# Used in determining if the field is aliased or not. Recursively
|
|
368
|
+
# finds aliases for embedded documents and fields, delimited with
|
|
369
|
+
# period "." character.
|
|
370
|
+
#
|
|
371
|
+
# Note that this method returns the name of associations as they're
|
|
372
|
+
# stored in the database, whereas the `relations` hash uses their in-code
|
|
373
|
+
# aliases. In order to check for membership in the relations hash, you
|
|
374
|
+
# would first have to look up the string returned from this method in
|
|
375
|
+
# the aliased_associations hash.
|
|
376
|
+
#
|
|
377
|
+
# This method will not expand the alias of a belongs_to association that
|
|
378
|
+
# is not the last item. For example, if we had a School that has_many
|
|
379
|
+
# Students, and the field name passed was (from the Student's perspective):
|
|
380
|
+
#
|
|
381
|
+
# school._id
|
|
382
|
+
#
|
|
383
|
+
# The alias for a belongs_to association is that association's _id field.
|
|
384
|
+
# Therefore, expanding out this association would yield:
|
|
385
|
+
#
|
|
386
|
+
# school_id._id
|
|
387
|
+
#
|
|
388
|
+
# This is not the correct field name, because the intention here was not
|
|
389
|
+
# to get a property of the _id field. The intention was to get a property
|
|
390
|
+
# of the referenced document. Therefore, if a part of the name passed is
|
|
391
|
+
# a belongs_to association that is not the last part of the name, we
|
|
392
|
+
# won't expand its alias, and return:
|
|
393
|
+
#
|
|
394
|
+
# school._id
|
|
395
|
+
#
|
|
396
|
+
# If the belongs_to association is the last part of the name, we will
|
|
397
|
+
# pass back the _id field.
|
|
398
|
+
#
|
|
399
|
+
# @param [ String | Symbol ] name The name to get.
|
|
400
|
+
# @param [ Hash ] relations The associations.
|
|
401
|
+
# @param [ Hash ] alaiased_fields The aliased fields.
|
|
402
|
+
# @param [ Hash ] alaiased_associations The aliased associations.
|
|
403
|
+
#
|
|
404
|
+
# @return [ String ] The name of the field as stored in the database.
|
|
405
|
+
#
|
|
406
|
+
# @api private
|
|
407
|
+
def database_field_name(name, relations, aliased_fields, aliased_associations)
|
|
408
|
+
if Mongoid.broken_alias_handling
|
|
409
|
+
return nil unless name
|
|
410
|
+
normalized = name.to_s
|
|
411
|
+
aliased_fields[normalized] || normalized
|
|
412
|
+
else
|
|
413
|
+
return nil unless name.present?
|
|
414
|
+
key = name.to_s
|
|
415
|
+
segment, remaining = key.split('.', 2)
|
|
416
|
+
|
|
417
|
+
# Don't get the alias for the field when a belongs_to association
|
|
418
|
+
# is not the last item. Therefore, get the alias when one of the
|
|
419
|
+
# following is true:
|
|
420
|
+
# 1. This is the last item, i.e. there is no remaining.
|
|
421
|
+
# 2. It is not an association.
|
|
422
|
+
# 3. It is not a belongs association
|
|
423
|
+
if !remaining || !relations.key?(segment) || !relations[segment].is_a?(Association::Referenced::BelongsTo)
|
|
424
|
+
segment = aliased_fields[segment]&.dup || segment
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
return segment unless remaining
|
|
428
|
+
|
|
429
|
+
relation = relations[aliased_associations[segment] || segment]
|
|
430
|
+
if relation
|
|
431
|
+
k = relation.klass
|
|
432
|
+
"#{segment}.#{database_field_name(remaining, k.relations, k.aliased_fields, k.aliased_associations)}"
|
|
433
|
+
else
|
|
434
|
+
"#{segment}.#{remaining}"
|
|
435
|
+
end
|
|
436
|
+
end
|
|
437
|
+
end
|
|
215
438
|
end
|
|
216
439
|
|
|
217
440
|
module ClassMethods
|
|
@@ -225,8 +448,6 @@ module Mongoid
|
|
|
225
448
|
# Model.attribute_names
|
|
226
449
|
#
|
|
227
450
|
# @return [ Array<String> ] The field names
|
|
228
|
-
#
|
|
229
|
-
# @since 3.0.0
|
|
230
451
|
def attribute_names
|
|
231
452
|
fields.keys
|
|
232
453
|
end
|
|
@@ -234,18 +455,11 @@ module Mongoid
|
|
|
234
455
|
# Get the name of the provided field as it is stored in the database.
|
|
235
456
|
# Used in determining if the field is aliased or not.
|
|
236
457
|
#
|
|
237
|
-
# @
|
|
238
|
-
# Model.database_field_name(:authorization)
|
|
239
|
-
#
|
|
240
|
-
# @param [ String, Symbol ] name The name to get.
|
|
458
|
+
# @param [ String | Symbol ] name The name to get.
|
|
241
459
|
#
|
|
242
460
|
# @return [ String ] The name of the field as it's stored in the db.
|
|
243
|
-
#
|
|
244
|
-
# @since 3.0.7
|
|
245
461
|
def database_field_name(name)
|
|
246
|
-
|
|
247
|
-
normalized = name.to_s
|
|
248
|
-
aliased_fields[normalized] || normalized
|
|
462
|
+
Fields.database_field_name(name, relations, aliased_fields, aliased_associations)
|
|
249
463
|
end
|
|
250
464
|
|
|
251
465
|
# Defines all the fields that are accessible on the Document
|
|
@@ -253,14 +467,14 @@ module Mongoid
|
|
|
253
467
|
# added as an instance method to the Document.
|
|
254
468
|
#
|
|
255
469
|
# @example Define a field.
|
|
256
|
-
# field :score, :
|
|
470
|
+
# field :score, type: Integer, default: 0
|
|
257
471
|
#
|
|
258
472
|
# @param [ Symbol ] name The name of the field.
|
|
259
473
|
# @param [ Hash ] options The options to pass to the field.
|
|
260
474
|
#
|
|
261
|
-
# @option options [ Class ] :type The type of the field.
|
|
475
|
+
# @option options [ Class | Symbol | String ] :type The type of the field.
|
|
262
476
|
# @option options [ String ] :label The label for the field.
|
|
263
|
-
# @option options [ Object
|
|
477
|
+
# @option options [ Object | Proc ] :default The field's default.
|
|
264
478
|
#
|
|
265
479
|
# @return [ Field ] The generated field
|
|
266
480
|
def field(name, options = {})
|
|
@@ -282,8 +496,6 @@ module Mongoid
|
|
|
282
496
|
# @param [ Class ] type The new type of field.
|
|
283
497
|
#
|
|
284
498
|
# @return [ Serializable ] The new field.
|
|
285
|
-
#
|
|
286
|
-
# @since 2.1.0
|
|
287
499
|
def replace_field(name, type)
|
|
288
500
|
remove_defaults(name)
|
|
289
501
|
add_field(name, fields[name].options.merge(type: type))
|
|
@@ -295,13 +507,28 @@ module Mongoid
|
|
|
295
507
|
# @example Does this class use object ids?
|
|
296
508
|
# person.using_object_ids?
|
|
297
509
|
#
|
|
298
|
-
# @return [ true
|
|
299
|
-
#
|
|
300
|
-
# @since 1.0.0
|
|
510
|
+
# @return [ true | false ] If the class uses BSON::ObjectIds for the id.
|
|
301
511
|
def using_object_ids?
|
|
302
512
|
fields["_id"].object_id_field?
|
|
303
513
|
end
|
|
304
514
|
|
|
515
|
+
# Traverse down the association tree and search for the field for the
|
|
516
|
+
# given key.
|
|
517
|
+
#
|
|
518
|
+
# @param [ String ] key The key used to search the association tree.
|
|
519
|
+
# @param [ Proc ] block The block takes in three paramaters, the current
|
|
520
|
+
# meth, the field or the relation, and whether the second parameter is a
|
|
521
|
+
# field or not.
|
|
522
|
+
#
|
|
523
|
+
# @return [ Field ] The field found for the given key at the end of the
|
|
524
|
+
# search. This will return nil if the last thing found is an association
|
|
525
|
+
# or no field was found for the given key.
|
|
526
|
+
#
|
|
527
|
+
# @api private
|
|
528
|
+
def traverse_association_tree(key, &block)
|
|
529
|
+
Fields.traverse_association_tree(key, fields, relations, aliased_associations, &block)
|
|
530
|
+
end
|
|
531
|
+
|
|
305
532
|
protected
|
|
306
533
|
|
|
307
534
|
# Add the defaults to the model. This breaks them up between ones that
|
|
@@ -311,8 +538,6 @@ module Mongoid
|
|
|
311
538
|
# Model.add_defaults(field)
|
|
312
539
|
#
|
|
313
540
|
# @param [ Field ] field The field to add for.
|
|
314
|
-
#
|
|
315
|
-
# @since 2.4.0
|
|
316
541
|
def add_defaults(field)
|
|
317
542
|
default, name = field.default_val, field.name.to_s
|
|
318
543
|
remove_defaults(name)
|
|
@@ -381,8 +606,6 @@ module Mongoid
|
|
|
381
606
|
# @param [ Symbol ] name The name of the field.
|
|
382
607
|
# @param [ Symbol ] meth The name of the accessor.
|
|
383
608
|
# @param [ Hash ] options The options.
|
|
384
|
-
#
|
|
385
|
-
# @since 2.0.0
|
|
386
609
|
def create_accessors(name, meth, options = {})
|
|
387
610
|
field = fields[name]
|
|
388
611
|
|
|
@@ -406,8 +629,6 @@ module Mongoid
|
|
|
406
629
|
# @param [ String ] name The name of the attribute.
|
|
407
630
|
# @param [ String ] meth The name of the method.
|
|
408
631
|
# @param [ Field ] field The field.
|
|
409
|
-
#
|
|
410
|
-
# @since 2.4.0
|
|
411
632
|
def create_field_getter(name, meth, field)
|
|
412
633
|
generated_methods.module_eval do
|
|
413
634
|
re_define_method(meth) do
|
|
@@ -415,9 +636,7 @@ module Mongoid
|
|
|
415
636
|
if lazy_settable?(field, raw)
|
|
416
637
|
write_attribute(name, field.eval_default(self))
|
|
417
638
|
else
|
|
418
|
-
|
|
419
|
-
attribute_will_change!(name) if value.resizable?
|
|
420
|
-
value
|
|
639
|
+
process_raw_attribute(name.to_s, raw, field)
|
|
421
640
|
end
|
|
422
641
|
end
|
|
423
642
|
end
|
|
@@ -432,8 +651,6 @@ module Mongoid
|
|
|
432
651
|
#
|
|
433
652
|
# @param [ String ] name The name of the attribute.
|
|
434
653
|
# @param [ String ] meth The name of the method.
|
|
435
|
-
#
|
|
436
|
-
# @since 3.1.0
|
|
437
654
|
def create_field_getter_before_type_cast(name, meth)
|
|
438
655
|
generated_methods.module_eval do
|
|
439
656
|
re_define_method("#{meth}_before_type_cast") do
|
|
@@ -454,8 +671,6 @@ module Mongoid
|
|
|
454
671
|
# @param [ String ] name The name of the attribute.
|
|
455
672
|
# @param [ String ] meth The name of the method.
|
|
456
673
|
# @param [ Field ] field The field.
|
|
457
|
-
#
|
|
458
|
-
# @since 2.4.0
|
|
459
674
|
def create_field_setter(name, meth, field)
|
|
460
675
|
generated_methods.module_eval do
|
|
461
676
|
re_define_method("#{meth}=") do |value|
|
|
@@ -475,8 +690,6 @@ module Mongoid
|
|
|
475
690
|
#
|
|
476
691
|
# @param [ String ] name The name of the attribute.
|
|
477
692
|
# @param [ String ] meth The name of the method.
|
|
478
|
-
#
|
|
479
|
-
# @since 2.4.0
|
|
480
693
|
def create_field_check(name, meth)
|
|
481
694
|
generated_methods.module_eval do
|
|
482
695
|
re_define_method("#{meth}?") do
|
|
@@ -493,8 +706,6 @@ module Mongoid
|
|
|
493
706
|
#
|
|
494
707
|
# @param [ String ] name The name of the attribute.
|
|
495
708
|
# @param [ String ] meth The name of the method.
|
|
496
|
-
#
|
|
497
|
-
# @since 2.4.0
|
|
498
709
|
def create_translations_getter(name, meth)
|
|
499
710
|
generated_methods.module_eval do
|
|
500
711
|
re_define_method("#{meth}_translations") do
|
|
@@ -513,16 +724,12 @@ module Mongoid
|
|
|
513
724
|
# @param [ String ] name The name of the attribute.
|
|
514
725
|
# @param [ String ] meth The name of the method.
|
|
515
726
|
# @param [ Field ] field The field.
|
|
516
|
-
#
|
|
517
|
-
# @since 2.4.0
|
|
518
727
|
def create_translations_setter(name, meth, field)
|
|
519
728
|
generated_methods.module_eval do
|
|
520
729
|
re_define_method("#{meth}_translations=") do |value|
|
|
521
730
|
attribute_will_change!(name)
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
field.type.mongoize(_value)
|
|
525
|
-
end
|
|
731
|
+
value&.transform_values! do |_value|
|
|
732
|
+
field.type.mongoize(_value)
|
|
526
733
|
end
|
|
527
734
|
attributes[name] = value
|
|
528
735
|
end
|
|
@@ -536,8 +743,6 @@ module Mongoid
|
|
|
536
743
|
# Person.generated_methods
|
|
537
744
|
#
|
|
538
745
|
# @return [ Module ] The module of generated methods.
|
|
539
|
-
#
|
|
540
|
-
# @since 2.0.0
|
|
541
746
|
def generated_methods
|
|
542
747
|
@generated_methods ||= begin
|
|
543
748
|
mod = Module.new
|
|
@@ -552,8 +757,6 @@ module Mongoid
|
|
|
552
757
|
# Model.remove_defaults(name)
|
|
553
758
|
#
|
|
554
759
|
# @param [ String ] name The field name.
|
|
555
|
-
#
|
|
556
|
-
# @since 2.4.0
|
|
557
760
|
def remove_defaults(name)
|
|
558
761
|
pre_processed_defaults.delete_one(name)
|
|
559
762
|
post_processed_defaults.delete_one(name)
|
|
@@ -561,20 +764,60 @@ module Mongoid
|
|
|
561
764
|
|
|
562
765
|
def field_for(name, options)
|
|
563
766
|
opts = options.merge(klass: self)
|
|
564
|
-
|
|
565
|
-
opts[:type] = type_mapping || unmapped_type(options)
|
|
767
|
+
opts[:type] = retrieve_and_validate_type(name, options[:type])
|
|
566
768
|
return Fields::Localized.new(name, opts) if options[:localize]
|
|
567
769
|
return Fields::ForeignKey.new(name, opts) if options[:identity]
|
|
568
770
|
Fields::Standard.new(name, opts)
|
|
569
771
|
end
|
|
570
772
|
|
|
571
|
-
|
|
572
|
-
|
|
773
|
+
# Get the class for the given type.
|
|
774
|
+
#
|
|
775
|
+
# @param [ Symbol ] name The name of the field.
|
|
776
|
+
# @param [ Symbol | Class ] type The type of the field.
|
|
777
|
+
#
|
|
778
|
+
# @return [ Class ] The type of the field.
|
|
779
|
+
#
|
|
780
|
+
# @raises [ Mongoid::Errors::InvalidFieldType ] if given an invalid field
|
|
781
|
+
# type.
|
|
782
|
+
#
|
|
783
|
+
# @api private
|
|
784
|
+
def retrieve_and_validate_type(name, type)
|
|
785
|
+
result = TYPE_MAPPINGS[type] || unmapped_type(type)
|
|
786
|
+
raise Errors::InvalidFieldType.new(self, name, type) if !result.is_a?(Class)
|
|
787
|
+
|
|
788
|
+
if unsupported_type?(result)
|
|
789
|
+
warn_message = "Using #{result} as the field type is not supported. "
|
|
790
|
+
if result == BSON::Decimal128
|
|
791
|
+
warn_message += 'In BSON <= 4, the BSON::Decimal128 type will work as expected for both storing and querying, but will return a BigDecimal on query in BSON 5+. To use literal BSON::Decimal128 fields with BSON 5, set Mongoid.allow_bson5_decimal128 to true.'
|
|
792
|
+
else
|
|
793
|
+
warn_message += 'Saving values of this type to the database will work as expected, however, querying them will return a value of the native Ruby Integer type.'
|
|
794
|
+
end
|
|
795
|
+
Mongoid.logger.warn(warn_message)
|
|
796
|
+
end
|
|
797
|
+
|
|
798
|
+
result
|
|
799
|
+
end
|
|
800
|
+
|
|
801
|
+
def unmapped_type(type)
|
|
802
|
+
if "Boolean" == type.to_s
|
|
573
803
|
Mongoid::Boolean
|
|
574
804
|
else
|
|
575
|
-
|
|
805
|
+
type || Object
|
|
576
806
|
end
|
|
577
807
|
end
|
|
808
|
+
|
|
809
|
+
# Queries whether or not the given type is permitted as a declared field
|
|
810
|
+
# type.
|
|
811
|
+
#
|
|
812
|
+
# @param [ Class ] type The type to query
|
|
813
|
+
#
|
|
814
|
+
# @return [ true | false ] whether or not the type is supported
|
|
815
|
+
#
|
|
816
|
+
# @api private
|
|
817
|
+
def unsupported_type?(type)
|
|
818
|
+
return !Mongoid::Config.allow_bson5_decimal128? if type == BSON::Decimal128
|
|
819
|
+
INVALID_BSON_CLASSES.include?(type)
|
|
820
|
+
end
|
|
578
821
|
end
|
|
579
822
|
end
|
|
580
823
|
end
|