mongoid 7.0.10 → 7.4.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 +30 -30
- data/README.md +32 -19
- data/Rakefile +51 -7
- data/lib/config/locales/en.yml +129 -70
- data/lib/mongoid/association/accessors.rb +143 -80
- data/lib/mongoid/association/bindable.rb +7 -26
- data/lib/mongoid/association/builders.rb +4 -12
- data/lib/mongoid/association/constrainable.rb +5 -6
- data/lib/mongoid/association/depending.rb +9 -18
- data/lib/mongoid/association/eager_loadable.rb +2 -3
- data/lib/mongoid/association/embedded/batchable.rb +16 -42
- data/lib/mongoid/association/embedded/cyclic.rb +10 -17
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +3 -7
- 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 +6 -26
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +4 -8
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +8 -5
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +90 -93
- data/lib/mongoid/association/embedded/embeds_many.rb +6 -34
- data/lib/mongoid/association/embedded/embeds_one/binding.rb +4 -8
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +9 -6
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +42 -27
- data/lib/mongoid/association/embedded/embeds_one.rb +6 -30
- data/lib/mongoid/association/embedded.rb +2 -0
- data/lib/mongoid/association/macros.rb +44 -41
- data/lib/mongoid/association/many.rb +16 -30
- data/lib/mongoid/association/marshalable.rb +3 -6
- data/lib/mongoid/association/nested/many.rb +18 -27
- data/lib/mongoid/association/nested/nested_buildable.rb +5 -11
- data/lib/mongoid/association/nested/one.rb +16 -27
- data/lib/mongoid/association/nested.rb +3 -3
- data/lib/mongoid/association/one.rb +4 -11
- data/lib/mongoid/association/options.rb +8 -38
- data/lib/mongoid/association/proxy.rb +37 -36
- data/lib/mongoid/association/referenced/auto_save.rb +5 -11
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +4 -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 +16 -27
- data/lib/mongoid/association/referenced/belongs_to.rb +14 -36
- data/lib/mongoid/association/referenced/counter_cache.rb +4 -15
- data/lib/mongoid/association/referenced/eager.rb +39 -38
- 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 +37 -57
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +23 -43
- 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 +444 -456
- data/lib/mongoid/association/referenced/has_many/proxy.rb +74 -107
- data/lib/mongoid/association/referenced/has_many.rb +18 -42
- 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 +13 -26
- data/lib/mongoid/association/referenced/has_one/proxy.rb +23 -25
- data/lib/mongoid/association/referenced/has_one.rb +13 -33
- data/lib/mongoid/association/referenced/syncable.rb +7 -22
- data/lib/mongoid/association/referenced.rb +2 -0
- data/lib/mongoid/association/reflections.rb +7 -6
- data/lib/mongoid/association/relatable.rb +18 -74
- data/lib/mongoid/association.rb +8 -22
- data/lib/mongoid/atomic/modifiers.rb +27 -51
- data/lib/mongoid/atomic/paths/embedded/many.rb +4 -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 +29 -44
- data/lib/mongoid/attributes/dynamic.rb +3 -18
- data/lib/mongoid/attributes/nested.rb +7 -10
- data/lib/mongoid/attributes/processing.rb +9 -24
- data/lib/mongoid/attributes/projector.rb +119 -0
- data/lib/mongoid/attributes/readonly.rb +3 -6
- data/lib/mongoid/attributes.rb +46 -60
- data/lib/mongoid/cacheable.rb +6 -9
- data/lib/mongoid/changeable.rb +6 -60
- data/lib/mongoid/clients/factory.rb +42 -17
- data/lib/mongoid/clients/options.rb +10 -13
- data/lib/mongoid/clients/sessions.rb +2 -6
- data/lib/mongoid/clients/storage_options.rb +7 -12
- data/lib/mongoid/clients/validators/storage.rb +2 -9
- 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 +15 -6
- data/lib/mongoid/config/options.rb +20 -23
- data/lib/mongoid/config/validators/client.rb +2 -17
- data/lib/mongoid/config/validators/option.rb +2 -3
- data/lib/mongoid/config/validators.rb +2 -1
- data/lib/mongoid/config.rb +112 -41
- data/lib/mongoid/contextual/aggregable/memory.rb +17 -12
- data/lib/mongoid/contextual/aggregable/mongo.rb +25 -26
- 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 +6 -37
- data/lib/mongoid/contextual/map_reduce.rb +5 -33
- data/lib/mongoid/contextual/memory.rb +8 -61
- data/lib/mongoid/contextual/mongo.rb +160 -82
- data/lib/mongoid/contextual/none.rb +44 -28
- data/lib/mongoid/contextual/queryable.rb +2 -3
- data/lib/mongoid/contextual.rb +7 -9
- data/lib/mongoid/copyable.rb +11 -10
- data/lib/mongoid/criteria/findable.rb +12 -15
- data/lib/mongoid/criteria/includable.rb +8 -15
- data/lib/mongoid/criteria/inspectable.rb +2 -3
- data/lib/mongoid/criteria/marshalable.rb +2 -5
- data/lib/mongoid/criteria/modifiable.rb +2 -19
- data/lib/mongoid/criteria/options.rb +2 -3
- data/lib/mongoid/criteria/permission.rb +2 -1
- data/lib/mongoid/criteria/queryable/aggregable.rb +2 -13
- data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
- data/lib/mongoid/criteria/queryable/extensions/array.rb +4 -27
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -4
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +3 -4
- data/lib/mongoid/criteria/queryable/extensions/date.rb +3 -8
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +5 -11
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -26
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -14
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -12
- data/lib/mongoid/criteria/queryable/extensions/object.rb +4 -29
- data/lib/mongoid/criteria/queryable/extensions/range.rb +41 -17
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +6 -13
- data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -4
- data/lib/mongoid/criteria/queryable/extensions/string.rb +3 -18
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -10
- data/lib/mongoid/criteria/queryable/extensions/time.rb +3 -8
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +3 -8
- data/lib/mongoid/criteria/queryable/extensions.rb +1 -4
- data/lib/mongoid/criteria/queryable/key.rb +36 -21
- data/lib/mongoid/criteria/queryable/macroable.rb +3 -4
- data/lib/mongoid/criteria/queryable/mergeable.rb +179 -40
- data/lib/mongoid/criteria/queryable/optional.rb +5 -48
- data/lib/mongoid/criteria/queryable/options.rb +2 -19
- data/lib/mongoid/criteria/queryable/pipeline.rb +5 -15
- data/lib/mongoid/criteria/queryable/selectable.rb +414 -162
- data/lib/mongoid/criteria/queryable/selector.rb +36 -24
- data/lib/mongoid/criteria/queryable/smash.rb +2 -11
- data/lib/mongoid/criteria/queryable/storable.rb +237 -0
- data/lib/mongoid/criteria/queryable.rb +7 -9
- data/lib/mongoid/criteria/scopable.rb +27 -19
- data/lib/mongoid/criteria.rb +79 -72
- data/lib/mongoid/document.rb +24 -73
- data/lib/mongoid/equality.rb +29 -12
- 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 +2 -9
- data/lib/mongoid/errors/eager_load.rb +6 -5
- 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 +2 -3
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -3
- data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -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 +2 -5
- 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_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 +4 -9
- 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 +2 -3
- data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
- data/lib/mongoid/errors/invalid_time.rb +2 -3
- data/lib/mongoid/errors/invalid_value.rb +2 -1
- 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 +3 -10
- 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 +2 -3
- data/lib/mongoid/errors/no_client_hosts.rb +2 -3
- 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 +2 -3
- 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 +2 -0
- data/lib/mongoid/errors/unknown_attribute.rb +2 -3
- 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 +12 -1
- data/lib/mongoid/evolvable.rb +4 -5
- data/lib/mongoid/extensions/array.rb +28 -37
- data/lib/mongoid/extensions/big_decimal.rb +2 -11
- data/lib/mongoid/extensions/boolean.rb +3 -5
- data/lib/mongoid/extensions/date.rb +13 -12
- data/lib/mongoid/extensions/date_time.rb +4 -12
- data/lib/mongoid/extensions/decimal128.rb +2 -5
- data/lib/mongoid/extensions/false_class.rb +4 -7
- data/lib/mongoid/extensions/float.rb +5 -10
- data/lib/mongoid/extensions/hash.rb +47 -34
- data/lib/mongoid/extensions/integer.rb +5 -12
- data/lib/mongoid/extensions/module.rb +2 -3
- data/lib/mongoid/extensions/nil_class.rb +2 -5
- data/lib/mongoid/extensions/object.rb +17 -44
- data/lib/mongoid/extensions/object_id.rb +2 -7
- data/lib/mongoid/extensions/range.rb +2 -11
- data/lib/mongoid/extensions/regexp.rb +2 -3
- data/lib/mongoid/extensions/set.rb +2 -7
- data/lib/mongoid/extensions/string.rb +19 -39
- data/lib/mongoid/extensions/symbol.rb +2 -7
- data/lib/mongoid/extensions/time.rb +12 -9
- data/lib/mongoid/extensions/time_with_zone.rb +25 -7
- data/lib/mongoid/extensions/true_class.rb +4 -7
- data/lib/mongoid/extensions.rb +18 -3
- data/lib/mongoid/factory.rb +52 -13
- data/lib/mongoid/fields/foreign_key.rb +3 -22
- data/lib/mongoid/fields/localized.rb +2 -11
- data/lib/mongoid/fields/standard.rb +6 -36
- data/lib/mongoid/fields/validators/macro.rb +36 -18
- data/lib/mongoid/fields/validators.rb +2 -1
- data/lib/mongoid/fields.rb +113 -63
- data/lib/mongoid/findable.rb +59 -23
- data/lib/mongoid/indexable/specification.rb +3 -16
- data/lib/mongoid/indexable/validators/options.rb +2 -7
- data/lib/mongoid/indexable.rb +6 -21
- data/lib/mongoid/inspectable.rb +4 -11
- data/lib/mongoid/interceptable.rb +13 -30
- data/lib/mongoid/loggable.rb +13 -16
- data/lib/mongoid/matchable.rb +2 -153
- 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 +110 -0
- data/lib/mongoid/persistable/creatable.rb +4 -21
- data/lib/mongoid/persistable/deletable.rb +5 -21
- data/lib/mongoid/persistable/destroyable.rb +11 -10
- 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 +3 -8
- data/lib/mongoid/persistable/settable.rb +3 -6
- data/lib/mongoid/persistable/unsettable.rb +8 -8
- data/lib/mongoid/persistable/updatable.rb +32 -20
- data/lib/mongoid/persistable/upsertable.rb +3 -8
- data/lib/mongoid/persistable.rb +133 -38
- data/lib/mongoid/persistence_context.rb +23 -36
- data/lib/mongoid/positional.rb +2 -5
- data/lib/mongoid/query_cache.rb +118 -103
- data/lib/mongoid/railtie.rb +3 -16
- data/lib/mongoid/railties/controller_runtime.rb +3 -1
- data/lib/mongoid/railties/database.rake +9 -0
- data/lib/mongoid/reloadable.rb +14 -19
- data/lib/mongoid/scopable.rb +8 -35
- data/lib/mongoid/selectable.rb +8 -17
- data/lib/mongoid/serializable.rb +24 -29
- data/lib/mongoid/shardable.rb +80 -17
- data/lib/mongoid/stateful.rb +3 -10
- data/lib/mongoid/stringified_symbol.rb +52 -0
- data/lib/mongoid/tasks/database.rake +12 -5
- data/lib/mongoid/tasks/database.rb +85 -5
- data/lib/mongoid/threaded/lifecycle.rb +2 -21
- data/lib/mongoid/threaded.rb +2 -55
- data/lib/mongoid/timestamps/created/short.rb +2 -1
- data/lib/mongoid/timestamps/created.rb +3 -2
- 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 +3 -4
- data/lib/mongoid/timestamps.rb +3 -2
- data/lib/mongoid/touchable.rb +53 -23
- data/lib/mongoid/traversable.rb +177 -57
- data/lib/mongoid/validatable/associated.rb +5 -6
- data/lib/mongoid/validatable/format.rb +2 -1
- data/lib/mongoid/validatable/length.rb +2 -1
- data/lib/mongoid/validatable/localizable.rb +2 -3
- data/lib/mongoid/validatable/macros.rb +2 -7
- data/lib/mongoid/validatable/presence.rb +8 -13
- data/lib/mongoid/validatable/queryable.rb +2 -3
- data/lib/mongoid/validatable/uniqueness.rb +20 -33
- data/lib/mongoid/validatable.rb +8 -27
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid.rb +32 -15
- data/lib/rails/generators/mongoid/config/config_generator.rb +10 -2
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +45 -30
- 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 +1 -0
- data/spec/integration/app_spec.rb +246 -95
- data/spec/integration/associations/belongs_to_spec.rb +2 -0
- data/spec/integration/associations/embedded_dirty_spec.rb +29 -0
- data/spec/integration/associations/embedded_spec.rb +207 -1
- data/spec/integration/associations/embeds_many_spec.rb +206 -0
- data/spec/integration/associations/embeds_one_spec.rb +23 -0
- data/spec/integration/associations/foreign_key_spec.rb +98 -0
- data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
- data/spec/integration/associations/has_many_spec.rb +128 -0
- data/spec/integration/associations/has_one_spec.rb +176 -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 +61 -0
- data/spec/integration/callbacks_spec.rb +228 -0
- 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 +265 -0
- data/spec/integration/criteria/time_with_zone_spec.rb +125 -15
- data/spec/integration/discriminator_key_spec.rb +353 -0
- data/spec/integration/discriminator_value_spec.rb +206 -0
- data/spec/integration/document_spec.rb +30 -1
- data/spec/integration/i18n_fallbacks_spec.rb +89 -0
- data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -42
- 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 +40 -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 +124 -0
- data/spec/integration/matcher_spec.rb +283 -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 +22 -5
- 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 +34 -32
- data/spec/mongoid/association/depending_spec.rb +426 -333
- data/spec/mongoid/association/eager_spec.rb +6 -4
- 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 +2 -0
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +2 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +65 -13
- 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 +2 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +431 -133
- data/spec/mongoid/association/embedded/embeds_many_models.rb +17 -1
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +51 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +3 -1
- data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +2 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +2 -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 +3 -0
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +3 -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 +2 -0
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +57 -16
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +242 -12
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +99 -58
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +24 -1
- 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 +215 -167
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +43 -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 +46 -2
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +3 -1
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +23 -0
- data/spec/mongoid/association/referenced/has_many/eager_spec.rb +40 -9
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +306 -125
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +679 -339
- data/spec/mongoid/association/referenced/has_many_models.rb +58 -0
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
- data/spec/mongoid/association/referenced/has_many_spec.rb +23 -0
- data/spec/mongoid/association/referenced/has_one/binding_spec.rb +2 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +53 -7
- data/spec/mongoid/association/referenced/has_one/eager_spec.rb +34 -4
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +28 -26
- data/spec/mongoid/association/referenced/has_one_models.rb +49 -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 +33 -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 +107 -12
- data/spec/mongoid/atomic_spec.rb +31 -6
- data/spec/mongoid/attributes/dynamic_spec.rb +0 -1
- data/spec/mongoid/attributes/nested_spec.rb +69 -67
- 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 +44 -0
- data/spec/mongoid/attributes/readonly_spec.rb +24 -22
- data/spec/mongoid/attributes_spec.rb +363 -28
- data/spec/mongoid/cacheable_spec.rb +3 -1
- data/spec/mongoid/changeable_spec.rb +60 -35
- data/spec/mongoid/clients/factory_spec.rb +136 -28
- data/spec/mongoid/clients/options_spec.rb +44 -26
- data/spec/mongoid/clients/sessions_spec.rb +25 -28
- data/spec/mongoid/clients/transactions_spec.rb +54 -29
- data/spec/mongoid/clients_spec.rb +8 -6
- data/spec/mongoid/composable_spec.rb +2 -0
- data/spec/mongoid/config/environment_spec.rb +88 -8
- data/spec/mongoid/config/options_spec.rb +22 -3
- data/spec/mongoid/config_spec.rb +277 -1
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +53 -11
- 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 +222 -71
- data/spec/mongoid/contextual/geo_near_spec.rb +20 -18
- data/spec/mongoid/contextual/map_reduce_spec.rb +4 -2
- data/spec/mongoid/contextual/memory_spec.rb +25 -23
- data/spec/mongoid/contextual/mongo_spec.rb +413 -92
- data/spec/mongoid/contextual/none_spec.rb +9 -81
- data/spec/mongoid/copyable_spec.rb +207 -26
- data/spec/mongoid/copyable_spec_models.rb +30 -0
- data/spec/mongoid/criteria/findable_spec.rb +77 -20
- data/spec/mongoid/criteria/inspectable_spec.rb +2 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +2 -0
- 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 +2 -0
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +2 -0
- 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 +2 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +35 -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 -0
- 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 +0 -1
- 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 -0
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +23 -16
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +2 -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 +3 -1
- 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 +1593 -286
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +1010 -2736
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/smash_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/storable_spec.rb +226 -0
- data/spec/mongoid/criteria/scopable_spec.rb +129 -0
- data/spec/mongoid/criteria_projection_spec.rb +410 -0
- data/spec/mongoid/criteria_spec.rb +782 -459
- data/spec/mongoid/document_fields_spec.rb +26 -1
- 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 +123 -48
- 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 +2 -0
- data/spec/mongoid/errors/eager_load_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_collection_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_config_file_spec.rb +31 -0
- 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 +2 -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 +22 -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 +2 -0
- 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 +2 -0
- 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 +25 -43
- data/spec/mongoid/extensions/big_decimal_spec.rb +2 -0
- data/spec/mongoid/extensions/binary_spec.rb +2 -0
- data/spec/mongoid/extensions/boolean_spec.rb +2 -0
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +335 -0
- data/spec/mongoid/extensions/date_spec.rb +8 -160
- data/spec/mongoid/extensions/date_time_spec.rb +17 -60
- 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 +17 -3
- data/spec/mongoid/extensions/hash_spec.rb +105 -0
- data/spec/mongoid/extensions/integer_spec.rb +14 -2
- 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 +2 -0
- data/spec/mongoid/extensions/regexp_spec.rb +2 -0
- data/spec/mongoid/extensions/set_spec.rb +2 -0
- data/spec/mongoid/extensions/string_spec.rb +60 -27
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
- data/spec/mongoid/extensions/symbol_spec.rb +2 -0
- data/spec/mongoid/extensions/time_spec.rb +29 -0
- data/spec/mongoid/extensions/time_with_zone_spec.rb +33 -0
- data/spec/mongoid/extensions/true_class_spec.rb +3 -1
- data/spec/mongoid/extensions_spec.rb +16 -2
- data/spec/mongoid/factory_spec.rb +287 -27
- data/spec/mongoid/fields/foreign_key_spec.rb +2 -0
- data/spec/mongoid/fields/localized_spec.rb +6 -4
- data/spec/mongoid/fields/standard_spec.rb +2 -0
- data/spec/mongoid/fields_spec.rb +418 -36
- data/spec/mongoid/findable_spec.rb +53 -19
- data/spec/mongoid/indexable/specification_spec.rb +2 -0
- data/spec/mongoid/indexable_spec.rb +30 -2
- data/spec/mongoid/inspectable_spec.rb +39 -2
- data/spec/mongoid/interceptable_spec.rb +168 -96
- data/spec/mongoid/interceptable_spec_models.rb +76 -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 +40 -0
- data/spec/mongoid/persistable/creatable_spec.rb +112 -27
- data/spec/mongoid/persistable/deletable_spec.rb +273 -11
- data/spec/mongoid/persistable/destroyable_spec.rb +201 -11
- 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 +54 -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 +4 -2
- data/spec/mongoid/persistable_spec.rb +85 -9
- data/spec/mongoid/persistence_context_spec.rb +2 -0
- data/spec/mongoid/positional_spec.rb +2 -0
- data/spec/mongoid/query_cache_middleware_spec.rb +68 -0
- data/spec/mongoid/query_cache_spec.rb +501 -81
- data/spec/mongoid/relations/proxy_spec.rb +8 -6
- data/spec/mongoid/reloadable_spec.rb +298 -20
- data/spec/mongoid/scopable_spec.rb +67 -21
- data/spec/mongoid/selectable_spec.rb +8 -6
- data/spec/mongoid/serializable_spec.rb +160 -29
- data/spec/mongoid/shardable_models.rb +61 -0
- data/spec/mongoid/shardable_spec.rb +116 -17
- data/spec/mongoid/stateful_spec.rb +3 -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 +8 -6
- data/spec/mongoid/touchable_spec.rb +180 -33
- data/spec/mongoid/touchable_spec_models.rb +53 -0
- data/spec/mongoid/traversable_spec.rb +1167 -1
- data/spec/mongoid/validatable/associated_spec.rb +2 -0
- 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 +69 -67
- data/spec/mongoid/validatable_spec.rb +5 -3
- data/spec/mongoid_spec.rb +2 -0
- data/spec/rails/controller_extension/controller_runtime_spec.rb +3 -1
- data/spec/rails/mongoid_spec.rb +4 -2
- data/spec/shared/LICENSE +20 -0
- 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/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/cluster_config.rb +231 -0
- data/spec/shared/lib/mrss/constraints.rb +386 -0
- data/spec/shared/lib/mrss/docker_runner.rb +271 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +199 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
- 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 +179 -0
- data/spec/shared/lib/mrss/utils.rb +15 -0
- data/spec/shared/share/Dockerfile.erb +339 -0
- data/spec/shared/share/haproxy-1.conf +16 -0
- data/spec/shared/share/haproxy-2.conf +17 -0
- data/spec/shared/shlib/distro.sh +74 -0
- data/spec/shared/shlib/server.sh +379 -0
- data/spec/shared/shlib/set_env.sh +132 -0
- data/spec/spec_helper.rb +39 -35
- data/spec/support/authorization.rb +2 -0
- data/spec/support/client_registry.rb +9 -0
- data/spec/support/constraints.rb +15 -234
- data/spec/support/expectations.rb +5 -1
- data/spec/support/helpers.rb +11 -0
- data/spec/support/macros.rb +22 -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/{app → support}/models/augmentation.rb +2 -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 +6 -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/{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/{app → support}/models/circus.rb +2 -0
- data/spec/{app → support}/models/code.rb +2 -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/support/models/customer.rb +10 -0
- data/spec/support/models/customer_address.rb +11 -0
- 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/{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 +2 -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 +4 -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 +2 -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 +2 -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 +13 -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 +21 -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 +2 -0
- data/spec/{app → support}/models/post.rb +2 -0
- data/spec/{app → support}/models/post_genre.rb +2 -0
- data/spec/{app → support}/models/powerup.rb +2 -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/{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 +2 -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/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/{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/{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/{app → support}/models/weapon.rb +2 -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/shared/time.rb +53 -0
- data/spec/support/spec_config.rb +16 -3
- data.tar.gz.sig +0 -0
- metadata +1100 -738
- metadata.gz.sig +0 -0
- data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
- 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/bed.rb +0 -1
- data/spec/app/models/car.rb +0 -1
- 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/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/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/child_process_helper.rb +0 -76
- data/spec/support/cluster_config.rb +0 -158
- /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
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module Mongoid
|
|
3
4
|
module Atomic
|
|
4
5
|
module Paths
|
|
5
6
|
module Embedded
|
|
6
7
|
|
|
7
|
-
# This class encapsulates
|
|
8
|
+
# This class encapsulates behavior for locating and updating
|
|
8
9
|
# documents that are defined as an embedded 1-1.
|
|
9
10
|
class One
|
|
10
11
|
include Embedded
|
|
@@ -15,23 +16,19 @@ module Mongoid
|
|
|
15
16
|
# One.new(document)
|
|
16
17
|
#
|
|
17
18
|
# @param [ Document ] document The document to generate the paths for.
|
|
18
|
-
#
|
|
19
|
-
# @since 2.1.0
|
|
20
19
|
def initialize(document)
|
|
21
20
|
@document, @parent = document, document._parent
|
|
22
21
|
@insert_modifier, @delete_modifier ="$set", "$unset"
|
|
23
22
|
end
|
|
24
23
|
|
|
25
24
|
# Get the position of the document in the hierarchy. This will
|
|
26
|
-
# include indexes of 1-n embedded
|
|
25
|
+
# include indexes of 1-n embedded associations that may sit above the
|
|
27
26
|
# embedded one.
|
|
28
27
|
#
|
|
29
28
|
# @example Get the position.
|
|
30
29
|
# one.position
|
|
31
30
|
#
|
|
32
31
|
# @return [ String ] The position of the document.
|
|
33
|
-
#
|
|
34
|
-
# @since 2.1.0
|
|
35
32
|
def position
|
|
36
33
|
pos = parent.atomic_position
|
|
37
34
|
"#{pos}#{"." unless pos.blank?}#{document._association.store_as}"
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
require "mongoid/atomic/paths/embedded/one"
|
|
3
4
|
require "mongoid/atomic/paths/embedded/many"
|
|
4
5
|
|
|
@@ -17,8 +18,6 @@ module Mongoid
|
|
|
17
18
|
# many.path
|
|
18
19
|
#
|
|
19
20
|
# @return [ String ] The path to the document.
|
|
20
|
-
#
|
|
21
|
-
# @since 2.1.0
|
|
22
21
|
def path
|
|
23
22
|
@path ||= position.sub(/\.\d+\z/, "")
|
|
24
23
|
end
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module Mongoid
|
|
3
4
|
module Atomic
|
|
4
5
|
module Paths
|
|
5
6
|
|
|
6
|
-
# This class encapsulates
|
|
7
|
+
# This class encapsulates behavior for locating and updating root
|
|
7
8
|
# documents atomically.
|
|
8
9
|
class Root
|
|
9
10
|
|
|
@@ -15,21 +16,17 @@ module Mongoid
|
|
|
15
16
|
# Root.new(document)
|
|
16
17
|
#
|
|
17
18
|
# @param [ Document ] document The document to generate the paths for.
|
|
18
|
-
#
|
|
19
|
-
# @since 2.1.0
|
|
20
19
|
def initialize(document)
|
|
21
20
|
@document, @path, @position = document, "", ""
|
|
22
21
|
end
|
|
23
22
|
|
|
24
23
|
# Asking for the insert modifier on a document with a root path
|
|
25
|
-
# indicates a mixed
|
|
24
|
+
# indicates a mixed association most likely happened.
|
|
26
25
|
#
|
|
27
26
|
# @example Attempt to get the insert modifier.
|
|
28
27
|
# root.insert_modifier
|
|
29
28
|
#
|
|
30
29
|
# @raise [ Errors::InvalidPath ] The error for the attempt.
|
|
31
|
-
#
|
|
32
|
-
# @since 3.0.14
|
|
33
30
|
def insert_modifier
|
|
34
31
|
raise Errors::InvalidPath.new(document.class)
|
|
35
32
|
end
|
data/lib/mongoid/atomic/paths.rb
CHANGED
data/lib/mongoid/atomic.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
require "mongoid/atomic/modifiers"
|
|
3
4
|
require "mongoid/atomic/paths"
|
|
4
5
|
|
|
@@ -32,8 +33,6 @@ module Mongoid
|
|
|
32
33
|
# person.add_atomic_pull(address)
|
|
33
34
|
#
|
|
34
35
|
# @param [ Document ] document The embedded document to pull.
|
|
35
|
-
#
|
|
36
|
-
# @since 2.2.0
|
|
37
36
|
def add_atomic_pull(document)
|
|
38
37
|
document.flagged_for_destroy = true
|
|
39
38
|
key = document.association_name.to_s
|
|
@@ -49,8 +48,6 @@ module Mongoid
|
|
|
49
48
|
# @param [ Document ] document The child document.
|
|
50
49
|
#
|
|
51
50
|
# @return [ Array<Document> ] The children.
|
|
52
|
-
#
|
|
53
|
-
# @since 3.0.0
|
|
54
51
|
def add_atomic_unset(document)
|
|
55
52
|
document.flagged_for_destroy = true
|
|
56
53
|
key = document.association_name.to_s
|
|
@@ -64,8 +61,6 @@ module Mongoid
|
|
|
64
61
|
# address.atomic_attribute_name(:city)
|
|
65
62
|
#
|
|
66
63
|
# @return [ String ] The path to the document attribute in the database
|
|
67
|
-
#
|
|
68
|
-
# @since 3.0.0
|
|
69
64
|
def atomic_attribute_name(name)
|
|
70
65
|
embedded? ? "#{atomic_position}.#{name}" : name
|
|
71
66
|
end
|
|
@@ -76,8 +71,6 @@ module Mongoid
|
|
|
76
71
|
# person.atomic_array_pushes
|
|
77
72
|
#
|
|
78
73
|
# @return [ Hash ] The array pushes.
|
|
79
|
-
#
|
|
80
|
-
# @since 2.4.0
|
|
81
74
|
def atomic_array_pushes
|
|
82
75
|
@atomic_array_pushes ||= {}
|
|
83
76
|
end
|
|
@@ -88,8 +81,6 @@ module Mongoid
|
|
|
88
81
|
# person.atomic_array_pulls
|
|
89
82
|
#
|
|
90
83
|
# @return [ Hash ] The array pulls.
|
|
91
|
-
#
|
|
92
|
-
# @since 2.4.0
|
|
93
84
|
def atomic_array_pulls
|
|
94
85
|
@atomic_array_pulls ||= {}
|
|
95
86
|
end
|
|
@@ -100,8 +91,6 @@ module Mongoid
|
|
|
100
91
|
# person.atomic_array_add_to_sets
|
|
101
92
|
#
|
|
102
93
|
# @return [ Hash ] The array add_to_sets.
|
|
103
|
-
#
|
|
104
|
-
# @since 2.4.0
|
|
105
94
|
def atomic_array_add_to_sets
|
|
106
95
|
@atomic_array_add_to_sets ||= {}
|
|
107
96
|
end
|
|
@@ -127,13 +116,11 @@ module Mongoid
|
|
|
127
116
|
# person.atomic_updates(children)
|
|
128
117
|
#
|
|
129
118
|
# @return [ Hash ] The updates and their modifiers.
|
|
130
|
-
#
|
|
131
|
-
# @since 2.1.0
|
|
132
119
|
def atomic_updates(_use_indexes = false)
|
|
133
120
|
process_flagged_destroys
|
|
134
121
|
mods = Modifiers.new
|
|
135
122
|
generate_atomic_updates(mods, self)
|
|
136
|
-
|
|
123
|
+
_descendants.each do |child|
|
|
137
124
|
child.process_flagged_destroys
|
|
138
125
|
generate_atomic_updates(mods, child)
|
|
139
126
|
end
|
|
@@ -190,8 +177,6 @@ module Mongoid
|
|
|
190
177
|
# document.atomic_paths
|
|
191
178
|
#
|
|
192
179
|
# @return [ Object ] The associated path.
|
|
193
|
-
#
|
|
194
|
-
# @since 2.1.0
|
|
195
180
|
def atomic_paths
|
|
196
181
|
@atomic_paths ||= begin
|
|
197
182
|
if _association
|
|
@@ -208,8 +193,6 @@ module Mongoid
|
|
|
208
193
|
# person.atomic_pulls
|
|
209
194
|
#
|
|
210
195
|
# @return [ Array<Hash> ] The $pullAll operations.
|
|
211
|
-
#
|
|
212
|
-
# @since 2.2.0
|
|
213
196
|
def atomic_pulls
|
|
214
197
|
pulls = {}
|
|
215
198
|
delayed_atomic_pulls.each_pair do |_, docs|
|
|
@@ -229,8 +212,6 @@ module Mongoid
|
|
|
229
212
|
# person.atomic_pushes
|
|
230
213
|
#
|
|
231
214
|
# @return [ Hash ] The $push and $each operations.
|
|
232
|
-
#
|
|
233
|
-
# @since 2.1.0
|
|
234
215
|
def atomic_pushes
|
|
235
216
|
pushable? ? { atomic_position => as_attributes } : {}
|
|
236
217
|
end
|
|
@@ -241,8 +222,6 @@ module Mongoid
|
|
|
241
222
|
# person.atomic_sets
|
|
242
223
|
#
|
|
243
224
|
# @return [ Hash ] The $set operations.
|
|
244
|
-
#
|
|
245
|
-
# @since 2.1.0
|
|
246
225
|
def atomic_sets
|
|
247
226
|
updateable? ? setters : settable? ? { atomic_path => as_attributes } : {}
|
|
248
227
|
end
|
|
@@ -253,8 +232,6 @@ module Mongoid
|
|
|
253
232
|
# person.atomic_unsets
|
|
254
233
|
#
|
|
255
234
|
# @return [ Array<Hash> ] The $unset operations.
|
|
256
|
-
#
|
|
257
|
-
# @since 2.2.0
|
|
258
235
|
def atomic_unsets
|
|
259
236
|
unsets = []
|
|
260
237
|
delayed_atomic_unsets.each_pair do |name, docs|
|
|
@@ -273,8 +250,6 @@ module Mongoid
|
|
|
273
250
|
# person.delayed_atomic_sets
|
|
274
251
|
#
|
|
275
252
|
# @return [ Hash ] The delayed $sets.
|
|
276
|
-
#
|
|
277
|
-
# @since 2.3.0
|
|
278
253
|
def delayed_atomic_sets
|
|
279
254
|
@delayed_atomic_sets ||= {}
|
|
280
255
|
end
|
|
@@ -285,8 +260,6 @@ module Mongoid
|
|
|
285
260
|
# document.delayed_atomic_pulls
|
|
286
261
|
#
|
|
287
262
|
# @return [ Hash ] name/document pairs.
|
|
288
|
-
#
|
|
289
|
-
# @since 2.3.2
|
|
290
263
|
def delayed_atomic_pulls
|
|
291
264
|
@delayed_atomic_pulls ||= {}
|
|
292
265
|
end
|
|
@@ -297,8 +270,6 @@ module Mongoid
|
|
|
297
270
|
# document.delayed_atomic_unsets
|
|
298
271
|
#
|
|
299
272
|
# @return [ Hash ] The atomic unsets
|
|
300
|
-
#
|
|
301
|
-
# @since 3.0.0
|
|
302
273
|
def delayed_atomic_unsets
|
|
303
274
|
@delayed_atomic_unsets ||= {}
|
|
304
275
|
end
|
|
@@ -309,8 +280,6 @@ module Mongoid
|
|
|
309
280
|
# document.flag_as_destroyed
|
|
310
281
|
#
|
|
311
282
|
# @return [ String ] The atomic path.
|
|
312
|
-
#
|
|
313
|
-
# @since 3.0.0
|
|
314
283
|
def flag_as_destroyed
|
|
315
284
|
self.destroyed = true
|
|
316
285
|
self.flagged_for_destroy = false
|
|
@@ -323,8 +292,6 @@ module Mongoid
|
|
|
323
292
|
# document.flagged_destroys
|
|
324
293
|
#
|
|
325
294
|
# @return [ Array<Proc> ] The flagged destroys.
|
|
326
|
-
#
|
|
327
|
-
# @since 3.0.10
|
|
328
295
|
def flagged_destroys
|
|
329
296
|
@flagged_destroys ||= []
|
|
330
297
|
end
|
|
@@ -335,8 +302,6 @@ module Mongoid
|
|
|
335
302
|
# document.process_flagged_destroys
|
|
336
303
|
#
|
|
337
304
|
# @return [ Array ] The cleared array.
|
|
338
|
-
#
|
|
339
|
-
# @since 3.0.10
|
|
340
305
|
def process_flagged_destroys
|
|
341
306
|
_assigning do
|
|
342
307
|
flagged_destroys.each(&:call)
|
|
@@ -353,8 +318,6 @@ module Mongoid
|
|
|
353
318
|
#
|
|
354
319
|
# @param [ Modifiers ] mods The atomic modifications.
|
|
355
320
|
# @param [ Document ] doc The document to update for.
|
|
356
|
-
#
|
|
357
|
-
# @since 2.2.0
|
|
358
321
|
def generate_atomic_updates(mods, doc)
|
|
359
322
|
mods.unset(doc.atomic_unsets)
|
|
360
323
|
mods.pull(doc.atomic_pulls)
|
|
@@ -377,17 +340,39 @@ module Mongoid
|
|
|
377
340
|
# @param [ Symbol ] field The optional field.
|
|
378
341
|
#
|
|
379
342
|
# @return [ Hash ] The atomic updates.
|
|
380
|
-
#
|
|
381
|
-
# @since 3.0.6
|
|
382
343
|
def touch_atomic_updates(field = nil)
|
|
383
344
|
updates = atomic_updates
|
|
384
345
|
return {} unless atomic_updates.key?("$set")
|
|
385
346
|
touches = {}
|
|
347
|
+
wanted_keys = %w(updated_at u_at)
|
|
348
|
+
# TODO this permits field to be passed as an empty string in which case
|
|
349
|
+
# it is ignored, get rid of this behavior.
|
|
350
|
+
if field.present?
|
|
351
|
+
wanted_keys << field.to_s
|
|
352
|
+
end
|
|
386
353
|
updates["$set"].each_pair do |key, value|
|
|
387
|
-
|
|
388
|
-
|
|
354
|
+
if wanted_keys.include?(key.split('.').last)
|
|
355
|
+
touches.update(key => value)
|
|
356
|
+
end
|
|
389
357
|
end
|
|
390
358
|
{ "$set" => touches }
|
|
391
359
|
end
|
|
360
|
+
|
|
361
|
+
# Returns the $set atomic updates affecting the specified field.
|
|
362
|
+
#
|
|
363
|
+
# @param [ String ] field The field name.
|
|
364
|
+
#
|
|
365
|
+
# @api private
|
|
366
|
+
def set_field_atomic_updates(field)
|
|
367
|
+
updates = atomic_updates
|
|
368
|
+
return {} unless atomic_updates.key?("$set")
|
|
369
|
+
sets = {}
|
|
370
|
+
updates["$set"].each_pair do |key, value|
|
|
371
|
+
if key.split('.').last == field
|
|
372
|
+
sets.update(key => value)
|
|
373
|
+
end
|
|
374
|
+
end
|
|
375
|
+
{ "$set" => sets }
|
|
376
|
+
end
|
|
392
377
|
end
|
|
393
378
|
end
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module Mongoid
|
|
3
4
|
module Attributes
|
|
4
5
|
|
|
5
6
|
# This module contains the behavior for dynamic attributes.
|
|
6
|
-
#
|
|
7
|
-
# @since 4.0.0
|
|
8
7
|
module Dynamic
|
|
9
8
|
extend ActiveSupport::Concern
|
|
10
9
|
|
|
@@ -17,8 +16,6 @@ module Mongoid
|
|
|
17
16
|
# @param [ true, false ] include_private
|
|
18
17
|
#
|
|
19
18
|
# @return [ true, false ] True if it does, false if not.
|
|
20
|
-
#
|
|
21
|
-
# @since 4.0.0
|
|
22
19
|
def respond_to?(name, include_private = false)
|
|
23
20
|
super || (
|
|
24
21
|
attributes &&
|
|
@@ -34,8 +31,6 @@ module Mongoid
|
|
|
34
31
|
# model.define_dynamic_reader(:field)
|
|
35
32
|
#
|
|
36
33
|
# @param [ String ] name The name of the field.
|
|
37
|
-
#
|
|
38
|
-
# @since 4.0.0
|
|
39
34
|
def define_dynamic_reader(name)
|
|
40
35
|
return unless name.valid_method_name?
|
|
41
36
|
|
|
@@ -55,8 +50,6 @@ module Mongoid
|
|
|
55
50
|
# model.define_dynamic_before_type_cast_reader(:field)
|
|
56
51
|
#
|
|
57
52
|
# @param [ String ] name The name of the field.
|
|
58
|
-
#
|
|
59
|
-
# @since 4.0.0
|
|
60
53
|
def define_dynamic_before_type_cast_reader(name)
|
|
61
54
|
class_eval do
|
|
62
55
|
define_method("#{name}_before_type_cast") do
|
|
@@ -74,8 +67,6 @@ module Mongoid
|
|
|
74
67
|
# model.define_dynamic_writer(:field)
|
|
75
68
|
#
|
|
76
69
|
# @param [ String ] name The name of the field.
|
|
77
|
-
#
|
|
78
|
-
# @since 4.0.0
|
|
79
70
|
def define_dynamic_writer(name)
|
|
80
71
|
return unless name.valid_method_name?
|
|
81
72
|
|
|
@@ -94,8 +85,6 @@ module Mongoid
|
|
|
94
85
|
#
|
|
95
86
|
# @param [ Symbol ] name The name of the field.
|
|
96
87
|
# @param [ Object ] value The value of the field.
|
|
97
|
-
#
|
|
98
|
-
# @since 4.0.0
|
|
99
88
|
def process_attribute(name, value)
|
|
100
89
|
responds = respond_to?("#{name}=")
|
|
101
90
|
if !responds
|
|
@@ -111,10 +100,8 @@ module Mongoid
|
|
|
111
100
|
# document.inspect_dynamic_fields
|
|
112
101
|
#
|
|
113
102
|
# @return [ String ] An array of pretty printed dynamic field values.
|
|
114
|
-
#
|
|
115
|
-
# @since 4.0.0
|
|
116
103
|
def inspect_dynamic_fields
|
|
117
|
-
keys = attributes.keys - fields.keys - relations.keys - ["_id",
|
|
104
|
+
keys = attributes.keys - fields.keys - relations.keys - ["_id", self.class.discriminator_key]
|
|
118
105
|
return keys.map do |name|
|
|
119
106
|
"#{name}: #{attributes[name].inspect}"
|
|
120
107
|
end
|
|
@@ -131,8 +118,6 @@ module Mongoid
|
|
|
131
118
|
# @param [ Array ] args The arguments to the method.
|
|
132
119
|
#
|
|
133
120
|
# @return [ Object ] The result of the method call.
|
|
134
|
-
#
|
|
135
|
-
# @since 4.0.0
|
|
136
121
|
def method_missing(name, *args)
|
|
137
122
|
attr = name.to_s
|
|
138
123
|
return super unless attributes.has_key?(attr.reader)
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module Mongoid
|
|
3
4
|
module Attributes
|
|
4
5
|
|
|
5
|
-
# Defines
|
|
6
|
-
#
|
|
7
|
-
# @since 1.0.0
|
|
6
|
+
# Defines behavior around that lovel Rails feature nested attributes.
|
|
8
7
|
module Nested
|
|
9
8
|
extend ActiveSupport::Concern
|
|
10
9
|
|
|
@@ -19,8 +18,8 @@ module Mongoid
|
|
|
19
18
|
attributes.all? { |key, value| key == '_destroy' || value.blank? }
|
|
20
19
|
}
|
|
21
20
|
|
|
22
|
-
# Used when needing to update related models from a parent
|
|
23
|
-
# be used on embedded or referenced
|
|
21
|
+
# Used when needing to update related models from a parent association. Can
|
|
22
|
+
# be used on embedded or referenced associations.
|
|
24
23
|
#
|
|
25
24
|
# @example Defining nested attributes.
|
|
26
25
|
#
|
|
@@ -34,7 +33,7 @@ module Mongoid
|
|
|
34
33
|
# accepts_nested_attributes_for :addresses, :game, :posts
|
|
35
34
|
# end
|
|
36
35
|
#
|
|
37
|
-
# @param [ Array<Symbol>, Hash ] args A list of
|
|
36
|
+
# @param [ Array<Symbol>, Hash ] args A list of association names, followed
|
|
38
37
|
# by a hash of options.
|
|
39
38
|
#
|
|
40
39
|
# @option *args [ true, false ] :allow_destroy Can deletion occur?
|
|
@@ -70,7 +69,7 @@ module Mongoid
|
|
|
70
69
|
|
|
71
70
|
private
|
|
72
71
|
|
|
73
|
-
# Add the autosave information for the nested
|
|
72
|
+
# Add the autosave information for the nested association.
|
|
74
73
|
#
|
|
75
74
|
# @api private
|
|
76
75
|
#
|
|
@@ -78,8 +77,6 @@ module Mongoid
|
|
|
78
77
|
# Person.autosave_nested_attributes(metadata)
|
|
79
78
|
#
|
|
80
79
|
# @param [ Association ] association The existing association metadata.
|
|
81
|
-
#
|
|
82
|
-
# @since 3.1.4
|
|
83
80
|
def autosave_nested_attributes(association)
|
|
84
81
|
# In order for the autosave functionality to work properly, the association needs to be
|
|
85
82
|
# marked as autosave despite the fact that the option isn't present. Because the method
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module Mongoid
|
|
3
4
|
module Attributes
|
|
4
5
|
|
|
@@ -7,15 +8,13 @@ module Mongoid
|
|
|
7
8
|
|
|
8
9
|
# Process the provided attributes casting them to their proper values if a
|
|
9
10
|
# field exists for them on the document. This will be limited to only the
|
|
10
|
-
# attributes provided in the
|
|
11
|
+
# attributes provided in the supplied +Hash+ so that no extra nil values get
|
|
11
12
|
# put into the document's attributes.
|
|
12
13
|
#
|
|
13
14
|
# @example Process the attributes.
|
|
14
15
|
# person.process_attributes(:title => "sir", :age => 40)
|
|
15
16
|
#
|
|
16
17
|
# @param [ Hash ] attrs The attributes to set.
|
|
17
|
-
#
|
|
18
|
-
# @since 2.0.0.rc.7
|
|
19
18
|
def process_attributes(attrs = nil)
|
|
20
19
|
attrs ||= {}
|
|
21
20
|
if !attrs.empty?
|
|
@@ -31,7 +30,7 @@ module Mongoid
|
|
|
31
30
|
|
|
32
31
|
private
|
|
33
32
|
|
|
34
|
-
# If the key provided is the name of
|
|
33
|
+
# If the key provided is the name of an association or a nested attribute, we
|
|
35
34
|
# need to wait until all other attributes are set before processing
|
|
36
35
|
# these.
|
|
37
36
|
#
|
|
@@ -42,8 +41,6 @@ module Mongoid
|
|
|
42
41
|
# @param [ Object ] value The value of the attribute.
|
|
43
42
|
#
|
|
44
43
|
# @return [ true, false ] True if pending, false if not.
|
|
45
|
-
#
|
|
46
|
-
# @since 2.0.0.rc.7
|
|
47
44
|
def pending_attribute?(key, value)
|
|
48
45
|
name = key.to_s
|
|
49
46
|
if relations.has_key?(name)
|
|
@@ -57,14 +54,12 @@ module Mongoid
|
|
|
57
54
|
return false
|
|
58
55
|
end
|
|
59
56
|
|
|
60
|
-
# Get all the pending
|
|
57
|
+
# Get all the pending associations that need to be set.
|
|
61
58
|
#
|
|
62
|
-
# @example Get the pending
|
|
59
|
+
# @example Get the pending associations.
|
|
63
60
|
# document.pending_relations
|
|
64
61
|
#
|
|
65
|
-
# @return [ Hash ] The pending
|
|
66
|
-
#
|
|
67
|
-
# @since 2.0.0.rc.7
|
|
62
|
+
# @return [ Hash ] The pending associations in key/value pairs.
|
|
68
63
|
def pending_relations
|
|
69
64
|
@pending_relations ||= {}
|
|
70
65
|
end
|
|
@@ -75,8 +70,6 @@ module Mongoid
|
|
|
75
70
|
# document.pending_nested
|
|
76
71
|
#
|
|
77
72
|
# @return [ Hash ] The pending nested attributes in key/value pairs.
|
|
78
|
-
#
|
|
79
|
-
# @since 2.0.0.rc.7
|
|
80
73
|
def pending_nested
|
|
81
74
|
@pending_nested ||= {}
|
|
82
75
|
end
|
|
@@ -89,8 +82,6 @@ module Mongoid
|
|
|
89
82
|
#
|
|
90
83
|
# @param [ Symbol ] name The name of the field.
|
|
91
84
|
# @param [ Object ] value The value of the field.
|
|
92
|
-
#
|
|
93
|
-
# @since 2.0.0.rc.7
|
|
94
85
|
def process_attribute(name, value)
|
|
95
86
|
if !respond_to?("#{name}=", true) && store_as = aliased_fields.invert[name.to_s]
|
|
96
87
|
name = store_as
|
|
@@ -105,8 +96,6 @@ module Mongoid
|
|
|
105
96
|
#
|
|
106
97
|
# @example Process the nested attributes.
|
|
107
98
|
# document.process_nested
|
|
108
|
-
#
|
|
109
|
-
# @since 2.0.0.rc.7
|
|
110
99
|
def process_nested
|
|
111
100
|
pending_nested.each_pair do |name, value|
|
|
112
101
|
send("#{name}=", value)
|
|
@@ -117,20 +106,16 @@ module Mongoid
|
|
|
117
106
|
#
|
|
118
107
|
# @example Process the pending items.
|
|
119
108
|
# document.process_pending
|
|
120
|
-
#
|
|
121
|
-
# @since 2.0.0.rc.7
|
|
122
109
|
def process_pending
|
|
123
110
|
process_nested and process_relations
|
|
124
111
|
pending_nested.clear and pending_relations.clear
|
|
125
112
|
end
|
|
126
113
|
|
|
127
|
-
# Process all the pending
|
|
114
|
+
# Process all the pending associations that needed to wait until ids were set
|
|
128
115
|
# to fire off.
|
|
129
116
|
#
|
|
130
|
-
# @example Process the
|
|
117
|
+
# @example Process the associations.
|
|
131
118
|
# document.process_relations
|
|
132
|
-
#
|
|
133
|
-
# @since 2.0.0.rc.7
|
|
134
119
|
def process_relations
|
|
135
120
|
pending_relations.each_pair do |name, value|
|
|
136
121
|
association = relations[name]
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Mongoid
|
|
4
|
+
module Attributes
|
|
5
|
+
|
|
6
|
+
# This module defines projection helpers.
|
|
7
|
+
#
|
|
8
|
+
# Projection rules are rather non-trivial. See
|
|
9
|
+
# https://docs.mongodb.com/manual/reference/method/db.collection.find/#find-projection
|
|
10
|
+
# for server documentation.
|
|
11
|
+
# 4.4 server (and presumably all older ones) requires that a projection
|
|
12
|
+
# for content fields is either exclusionary or inclusionary, i.e. one
|
|
13
|
+
# cannot mix exclusions and inclusions in the same query.
|
|
14
|
+
# However, _id can be excluded in a projection that includes content
|
|
15
|
+
# fields.
|
|
16
|
+
# Integer projection values other than 0 and 1 aren't officially
|
|
17
|
+
# documented as of this writing; see DOCSP-15266.
|
|
18
|
+
# 4.4 server also allows nested hash projection specification
|
|
19
|
+
# in addition to dot notation, which I assume Mongoid doesn't handle yet.
|
|
20
|
+
#
|
|
21
|
+
# @api private
|
|
22
|
+
class Projector
|
|
23
|
+
def initialize(projection)
|
|
24
|
+
if projection
|
|
25
|
+
@content_projection = projection.dup
|
|
26
|
+
@content_projection.delete('_id')
|
|
27
|
+
@id_projection_value = projection['_id']
|
|
28
|
+
else
|
|
29
|
+
@content_projection = nil
|
|
30
|
+
@id_projection_value = nil
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
attr_reader :id_projection_value
|
|
35
|
+
attr_reader :content_projection
|
|
36
|
+
|
|
37
|
+
# Determine if the specified attribute, or a dot notation path, is allowed
|
|
38
|
+
# by the configured projection, if any.
|
|
39
|
+
#
|
|
40
|
+
# If there is no configured projection, returns true.
|
|
41
|
+
#
|
|
42
|
+
# @param [ String ] name The name of the attribute or a dot notation path.
|
|
43
|
+
#
|
|
44
|
+
# @return [ true, false ] Whether the attribute is allowed by projection.
|
|
45
|
+
#
|
|
46
|
+
# @api private
|
|
47
|
+
def attribute_or_path_allowed?(name)
|
|
48
|
+
# Special handling for _id.
|
|
49
|
+
if name == '_id'
|
|
50
|
+
result = unless id_projection_value.nil?
|
|
51
|
+
value_inclusionary?(id_projection_value)
|
|
52
|
+
else
|
|
53
|
+
true
|
|
54
|
+
end
|
|
55
|
+
return result
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
if content_projection.nil?
|
|
59
|
+
# No projection (as opposed to an empty projection).
|
|
60
|
+
# All attributes are allowed.
|
|
61
|
+
return true
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Find an item which matches or is a parent of the requested name/path.
|
|
65
|
+
# This handles the case when, for example, the projection was
|
|
66
|
+
# {foo: true} and we want to know if foo.bar is allowed.
|
|
67
|
+
item, value = content_projection.detect do |path, value|
|
|
68
|
+
(name + '.').start_with?(path + '.')
|
|
69
|
+
end
|
|
70
|
+
if item
|
|
71
|
+
return value_inclusionary?(value)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
if content_inclusionary?
|
|
75
|
+
# Find an item which would be a strict child of the requested name/path.
|
|
76
|
+
# This handles the case when, for example, the projection was
|
|
77
|
+
# {"foo.bar" => true} and we want to know if foo is allowed.
|
|
78
|
+
# (It is as a container of bars.)
|
|
79
|
+
item, value = content_projection.detect do |path, value|
|
|
80
|
+
(path + '.').start_with?(name + '.')
|
|
81
|
+
end
|
|
82
|
+
if item
|
|
83
|
+
return true
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
!content_inclusionary?
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
private
|
|
91
|
+
|
|
92
|
+
# Determines whether the projection for content fields is inclusionary.
|
|
93
|
+
#
|
|
94
|
+
# An empty projection is inclusionary.
|
|
95
|
+
def content_inclusionary?
|
|
96
|
+
if content_projection.empty?
|
|
97
|
+
return value_inclusionary?(id_projection_value)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
value_inclusionary?(content_projection.values.first)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def value_inclusionary?(value)
|
|
104
|
+
case value
|
|
105
|
+
when Integer
|
|
106
|
+
value >= 1
|
|
107
|
+
when true
|
|
108
|
+
true
|
|
109
|
+
when false
|
|
110
|
+
false
|
|
111
|
+
else
|
|
112
|
+
# The various expressions that are permitted as projection arguments
|
|
113
|
+
# imply an inclusionary projection.
|
|
114
|
+
true
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module Mongoid
|
|
3
4
|
module Attributes
|
|
4
5
|
|
|
5
|
-
# This module defines
|
|
6
|
+
# This module defines behavior for readonly attributes.
|
|
6
7
|
module Readonly
|
|
7
8
|
extend ActiveSupport::Concern
|
|
8
9
|
|
|
@@ -20,8 +21,6 @@ module Mongoid
|
|
|
20
21
|
#
|
|
21
22
|
# @return [ true, false ] If the document is new, or if the field is not
|
|
22
23
|
# readonly.
|
|
23
|
-
#
|
|
24
|
-
# @since 3.0.0
|
|
25
24
|
def attribute_writable?(name)
|
|
26
25
|
new_record? || (!readonly_attributes.include?(name) && _loaded?(name))
|
|
27
26
|
end
|
|
@@ -63,8 +62,6 @@ module Mongoid
|
|
|
63
62
|
# end
|
|
64
63
|
#
|
|
65
64
|
# @param [ Array<Symbol> ] names The names of the fields.
|
|
66
|
-
#
|
|
67
|
-
# @since 3.0.0
|
|
68
65
|
def attr_readonly(*names)
|
|
69
66
|
names.each do |name|
|
|
70
67
|
readonly_attributes << database_field_name(name)
|