mongoid 7.4.3 → 8.0.7
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/README.md +3 -3
- data/Rakefile +25 -0
- data/lib/config/locales/en.yml +52 -28
- data/lib/mongoid/association/accessors.rb +38 -9
- data/lib/mongoid/association/bindable.rb +50 -2
- data/lib/mongoid/association/builders.rb +4 -2
- data/lib/mongoid/association/constrainable.rb +0 -1
- data/lib/mongoid/association/eager_loadable.rb +29 -7
- data/lib/mongoid/association/embedded/batchable.rb +33 -10
- data/lib/mongoid/association/embedded/cyclic.rb +1 -1
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -2
- data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +65 -41
- data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +23 -4
- data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
- data/lib/mongoid/association/macros.rb +28 -1
- data/lib/mongoid/association/many.rb +11 -7
- data/lib/mongoid/association/nested/many.rb +5 -4
- data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
- data/lib/mongoid/association/nested/one.rb +5 -5
- data/lib/mongoid/association/one.rb +2 -2
- data/lib/mongoid/association/options.rb +9 -9
- data/lib/mongoid/association/proxy.rb +14 -3
- data/lib/mongoid/association/referenced/auto_save.rb +4 -3
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
- data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
- data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
- data/lib/mongoid/association/referenced/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +20 -24
- data/lib/mongoid/association/referenced/has_many/proxy.rb +26 -16
- data/lib/mongoid/association/referenced/has_many.rb +3 -3
- data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
- data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
- data/lib/mongoid/association/referenced/has_one.rb +3 -3
- data/lib/mongoid/association/referenced/syncable.rb +4 -4
- data/lib/mongoid/association/reflections.rb +2 -2
- data/lib/mongoid/association/relatable.rb +44 -10
- data/lib/mongoid/association.rb +5 -5
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic.rb +7 -0
- data/lib/mongoid/attributes/dynamic.rb +3 -3
- data/lib/mongoid/attributes/nested.rb +5 -5
- data/lib/mongoid/attributes/processing.rb +37 -6
- data/lib/mongoid/attributes/projector.rb +1 -1
- data/lib/mongoid/attributes/readonly.rb +2 -2
- data/lib/mongoid/attributes.rb +43 -40
- data/lib/mongoid/cacheable.rb +2 -2
- data/lib/mongoid/changeable.rb +43 -10
- data/lib/mongoid/clients/options.rb +5 -1
- data/lib/mongoid/clients/sessions.rb +2 -14
- data/lib/mongoid/clients/validators/storage.rb +3 -3
- data/lib/mongoid/config/options.rb +3 -0
- data/lib/mongoid/config/validators/client.rb +6 -6
- data/lib/mongoid/config.rb +62 -17
- data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
- data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
- data/lib/mongoid/contextual/aggregable/none.rb +1 -1
- data/lib/mongoid/contextual/atomic.rb +1 -1
- data/lib/mongoid/contextual/geo_near.rb +7 -7
- data/lib/mongoid/contextual/map_reduce.rb +2 -2
- data/lib/mongoid/contextual/memory.rb +180 -21
- data/lib/mongoid/contextual/mongo.rb +260 -217
- data/lib/mongoid/contextual/none.rb +67 -5
- data/lib/mongoid/contextual/queryable.rb +1 -1
- data/lib/mongoid/contextual.rb +2 -2
- data/lib/mongoid/copyable.rb +32 -8
- data/lib/mongoid/criteria/findable.rb +7 -4
- data/lib/mongoid/criteria/includable.rb +24 -20
- data/lib/mongoid/criteria/marshalable.rb +10 -2
- data/lib/mongoid/criteria/permission.rb +1 -1
- data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
- data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -14
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
- data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -15
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
- data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
- data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
- data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
- data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
- data/lib/mongoid/criteria/queryable/key.rb +3 -3
- data/lib/mongoid/criteria/queryable/mergeable.rb +21 -0
- data/lib/mongoid/criteria/queryable/optional.rb +5 -11
- data/lib/mongoid/criteria/queryable/options.rb +2 -2
- data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
- data/lib/mongoid/criteria/queryable/selectable.rb +31 -37
- data/lib/mongoid/criteria/queryable/selector.rb +93 -8
- data/lib/mongoid/criteria/queryable/smash.rb +40 -7
- data/lib/mongoid/criteria/queryable/storable.rb +1 -1
- data/lib/mongoid/criteria/queryable.rb +12 -7
- data/lib/mongoid/criteria/scopable.rb +2 -2
- data/lib/mongoid/criteria/translator.rb +45 -0
- data/lib/mongoid/criteria.rb +16 -35
- data/lib/mongoid/deprecable.rb +37 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +135 -34
- data/lib/mongoid/equality.rb +8 -8
- data/lib/mongoid/errors/document_not_found.rb +33 -12
- data/lib/mongoid/errors/invalid_config_option.rb +1 -1
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_field.rb +6 -2
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/invalid_relation.rb +1 -1
- data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
- data/lib/mongoid/errors/invalid_session_use.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
- data/lib/mongoid/errors/mongoid_error.rb +3 -3
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
- data/lib/mongoid/errors/no_client_database.rb +1 -1
- data/lib/mongoid/errors/no_client_hosts.rb +1 -1
- data/lib/mongoid/errors/readonly_attribute.rb +1 -1
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
- data/lib/mongoid/errors/unknown_attribute.rb +1 -1
- data/lib/mongoid/errors.rb +2 -2
- data/lib/mongoid/extensions/array.rb +9 -7
- data/lib/mongoid/extensions/big_decimal.rb +33 -10
- data/lib/mongoid/extensions/binary.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +8 -2
- data/lib/mongoid/extensions/date.rb +26 -20
- data/lib/mongoid/extensions/date_time.rb +1 -1
- data/lib/mongoid/extensions/false_class.rb +1 -1
- data/lib/mongoid/extensions/float.rb +7 -4
- data/lib/mongoid/extensions/hash.rb +37 -8
- data/lib/mongoid/extensions/integer.rb +7 -4
- data/lib/mongoid/extensions/module.rb +1 -1
- data/lib/mongoid/extensions/object.rb +8 -6
- data/lib/mongoid/extensions/range.rb +41 -10
- data/lib/mongoid/extensions/regexp.rb +11 -4
- data/lib/mongoid/extensions/set.rb +11 -4
- data/lib/mongoid/extensions/string.rb +11 -22
- data/lib/mongoid/extensions/symbol.rb +4 -15
- data/lib/mongoid/extensions/time.rb +27 -16
- data/lib/mongoid/extensions/time_with_zone.rb +1 -2
- data/lib/mongoid/extensions/true_class.rb +1 -1
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/factory.rb +55 -7
- data/lib/mongoid/fields/foreign_key.rb +11 -4
- data/lib/mongoid/fields/localized.rb +9 -4
- data/lib/mongoid/fields/standard.rb +7 -7
- data/lib/mongoid/fields/validators/macro.rb +3 -9
- data/lib/mongoid/fields.rb +233 -40
- data/lib/mongoid/findable.rb +34 -13
- data/lib/mongoid/indexable/specification.rb +2 -2
- data/lib/mongoid/indexable/validators/options.rb +6 -2
- data/lib/mongoid/interceptable.rb +185 -16
- data/lib/mongoid/matchable.rb +1 -1
- data/lib/mongoid/matcher.rb +33 -13
- data/lib/mongoid/persistable/creatable.rb +18 -9
- data/lib/mongoid/persistable/deletable.rb +1 -1
- data/lib/mongoid/persistable/destroyable.rb +1 -1
- data/lib/mongoid/persistable/savable.rb +2 -2
- data/lib/mongoid/persistable/unsettable.rb +1 -1
- data/lib/mongoid/persistable/updatable.rb +19 -12
- data/lib/mongoid/persistable/upsertable.rb +1 -1
- data/lib/mongoid/persistable.rb +3 -3
- data/lib/mongoid/persistence_context.rb +63 -10
- data/lib/mongoid/query_cache.rb +8 -260
- data/lib/mongoid/railties/controller_runtime.rb +1 -1
- data/lib/mongoid/reloadable.rb +10 -8
- data/lib/mongoid/scopable.rb +26 -22
- data/lib/mongoid/selectable.rb +1 -2
- data/lib/mongoid/serializable.rb +10 -6
- data/lib/mongoid/shardable.rb +35 -11
- data/lib/mongoid/stateful.rb +35 -9
- data/lib/mongoid/tasks/database.rb +0 -2
- data/lib/mongoid/threaded/lifecycle.rb +5 -5
- data/lib/mongoid/threaded.rb +42 -12
- data/lib/mongoid/timestamps/created.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +2 -2
- data/lib/mongoid/touchable.rb +2 -3
- data/lib/mongoid/traversable.rb +5 -4
- data/lib/mongoid/validatable/localizable.rb +1 -1
- data/lib/mongoid/validatable/macros.rb +0 -2
- data/lib/mongoid/validatable/presence.rb +2 -2
- data/lib/mongoid/validatable/uniqueness.rb +9 -8
- data/lib/mongoid/validatable.rb +6 -6
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +28 -0
- data/lib/mongoid.rb +2 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -3
- data/spec/config/mongoid.yml +16 -0
- data/spec/integration/app_spec.rb +8 -12
- data/spec/integration/associations/belongs_to_spec.rb +18 -0
- data/spec/integration/associations/embedded_spec.rb +15 -0
- data/spec/integration/associations/embeds_many_spec.rb +15 -2
- data/spec/integration/associations/embeds_one_spec.rb +18 -0
- data/spec/integration/associations/foreign_key_spec.rb +9 -0
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
- data/spec/integration/associations/has_one_spec.rb +97 -1
- data/spec/integration/associations/scope_option_spec.rb +1 -1
- data/spec/integration/callbacks_models.rb +95 -1
- data/spec/integration/callbacks_spec.rb +246 -4
- data/spec/integration/criteria/range_spec.rb +95 -1
- data/spec/integration/discriminator_key_spec.rb +115 -76
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/i18n_fallbacks_spec.rb +1 -17
- data/spec/integration/matcher_examples_spec.rb +20 -13
- data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
- data/spec/integration/matcher_operator_spec.rb +3 -5
- data/spec/integration/persistence/range_field_spec.rb +350 -0
- data/spec/mongoid/association/counter_cache_spec.rb +1 -1
- data/spec/mongoid/association/depending_spec.rb +9 -9
- data/spec/mongoid/association/eager_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +235 -40
- data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
- data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +202 -201
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +8 -8
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +160 -119
- data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
- data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
- data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
- data/spec/mongoid/association/syncable_spec.rb +14 -0
- data/spec/mongoid/atomic/paths_spec.rb +0 -14
- data/spec/mongoid/attributes/nested_spec.rb +80 -11
- data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
- data/spec/mongoid/attributes/projector_spec.rb +1 -5
- data/spec/mongoid/attributes_spec.rb +551 -27
- data/spec/mongoid/cacheable_spec.rb +3 -3
- data/spec/mongoid/changeable_spec.rb +130 -13
- data/spec/mongoid/clients/factory_spec.rb +23 -30
- data/spec/mongoid/clients/options_spec.rb +1 -0
- data/spec/mongoid/clients/sessions_spec.rb +0 -38
- data/spec/mongoid/clients_spec.rb +57 -2
- data/spec/mongoid/config_spec.rb +78 -18
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
- data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
- data/spec/mongoid/contextual/memory_spec.rb +1336 -69
- data/spec/mongoid/contextual/mongo_spec.rb +1253 -247
- data/spec/mongoid/contextual/none_spec.rb +38 -0
- data/spec/mongoid/copyable_spec.rb +451 -1
- data/spec/mongoid/criteria/findable_spec.rb +86 -210
- data/spec/mongoid/criteria/includable_spec.rb +1492 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +0 -59
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +289 -124
- data/spec/mongoid/criteria/queryable/selector_spec.rb +89 -4
- data/spec/mongoid/criteria/queryable/storable_spec.rb +72 -0
- data/spec/mongoid/criteria/translator_spec.rb +132 -0
- data/spec/mongoid/criteria_projection_spec.rb +0 -1
- data/spec/mongoid/criteria_spec.rb +475 -1199
- data/spec/mongoid/document_fields_spec.rb +173 -24
- data/spec/mongoid/document_spec.rb +32 -41
- data/spec/mongoid/errors/document_not_found_spec.rb +76 -0
- data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
- data/spec/mongoid/extensions/array_spec.rb +16 -2
- data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
- data/spec/mongoid/extensions/binary_spec.rb +44 -9
- data/spec/mongoid/extensions/boolean_spec.rb +68 -82
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
- data/spec/mongoid/extensions/date_spec.rb +71 -1
- data/spec/mongoid/extensions/date_time_spec.rb +15 -9
- data/spec/mongoid/extensions/float_spec.rb +53 -74
- data/spec/mongoid/extensions/hash_spec.rb +33 -3
- data/spec/mongoid/extensions/integer_spec.rb +50 -64
- data/spec/mongoid/extensions/range_spec.rb +255 -54
- data/spec/mongoid/extensions/regexp_spec.rb +58 -33
- data/spec/mongoid/extensions/set_spec.rb +106 -0
- data/spec/mongoid/extensions/string_spec.rb +53 -25
- data/spec/mongoid/extensions/symbol_spec.rb +18 -25
- data/spec/mongoid/extensions/time_spec.rb +634 -66
- data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
- data/spec/mongoid/factory_spec.rb +61 -1
- data/spec/mongoid/fields/localized_spec.rb +37 -12
- data/spec/mongoid/fields_spec.rb +364 -50
- data/spec/mongoid/findable_spec.rb +80 -15
- data/spec/mongoid/indexable/specification_spec.rb +2 -2
- data/spec/mongoid/indexable_spec.rb +39 -20
- data/spec/mongoid/interceptable_spec.rb +807 -27
- data/spec/mongoid/interceptable_spec_models.rb +235 -4
- data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
- data/spec/mongoid/mongoizable_spec.rb +285 -0
- data/spec/mongoid/persistable/creatable_spec.rb +2 -2
- data/spec/mongoid/persistable/deletable_spec.rb +2 -2
- data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
- data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
- data/spec/mongoid/persistence_context_spec.rb +50 -1
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
- data/spec/mongoid/query_cache_spec.rb +0 -154
- data/spec/mongoid/reloadable_spec.rb +59 -2
- data/spec/mongoid/scopable_spec.rb +54 -16
- data/spec/mongoid/shardable_models.rb +14 -0
- data/spec/mongoid/shardable_spec.rb +157 -51
- data/spec/mongoid/stateful_spec.rb +28 -0
- data/spec/mongoid/timestamps_spec.rb +390 -0
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +116 -0
- data/spec/mongoid/touchable_spec_models.rb +12 -8
- data/spec/mongoid/traversable_spec.rb +4 -11
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +59 -31
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/mongoid_spec.rb +1 -1
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
- data/spec/rails/mongoid_spec.rb +4 -16
- data/spec/shared/lib/mrss/docker_runner.rb +7 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +10 -2
- data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
- data/spec/shared/lib/mrss/utils.rb +28 -6
- data/spec/shared/share/Dockerfile.erb +36 -40
- data/spec/shared/shlib/server.sh +32 -8
- data/spec/shared/shlib/set_env.sh +4 -4
- data/spec/support/constraints.rb +24 -0
- data/spec/support/macros.rb +46 -0
- data/spec/support/models/augmentation.rb +12 -0
- data/spec/support/models/band.rb +3 -0
- data/spec/support/models/catalog.rb +24 -0
- data/spec/support/models/circus.rb +3 -0
- data/spec/support/models/code.rb +2 -0
- data/spec/support/models/fanatic.rb +8 -0
- data/spec/support/models/implant.rb +9 -0
- data/spec/support/models/label.rb +2 -0
- data/spec/support/models/passport.rb +9 -0
- data/spec/support/models/person.rb +2 -0
- data/spec/support/models/player.rb +2 -0
- data/spec/support/models/powerup.rb +12 -0
- data/spec/support/models/purse.rb +9 -0
- data/spec/support/models/registry.rb +1 -0
- data/spec/support/models/school.rb +14 -0
- data/spec/support/models/shield.rb +18 -0
- data/spec/support/models/student.rb +14 -0
- data/spec/support/models/weapon.rb +12 -0
- data.tar.gz.sig +4 -1
- metadata +682 -635
- metadata.gz.sig +0 -0
- data/lib/mongoid/errors/eager_load.rb +0 -23
- data/lib/mongoid/errors/invalid_value.rb +0 -17
- data/spec/mongoid/errors/eager_load_spec.rb +0 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ffe4422a33c5d676a4ae8e28c2d3ea748a738022b5fe0defa69a675fefbff8d
|
4
|
+
data.tar.gz: d296900948d3e569beb33f4c63876ac24c45368dd0f3000efebecdcaed2cfbcf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3632cdca025ba56792b041d07a560d00f3a561fa21ca9b0f44167fbf54b14fe0cc5ae040adeff7a24ac98795f6a54cfbfcd88ae3057906a44d606573e18ee398
|
7
|
+
data.tar.gz: 243a702300881cc8ef82f7937e8ff3ea718b2c23aea8768a6392d47b6f3f841dba062e0133d142855b9f9ccf85f3bfbe0f45b743daed7f82813e02f6b9a1674b
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -11,6 +11,15 @@ $: << File.join(ROOT, 'spec/shared/lib')
|
|
11
11
|
require "rake"
|
12
12
|
require "rspec/core/rake_task"
|
13
13
|
require 'mrss/spec_organizer'
|
14
|
+
require 'rubygems/package'
|
15
|
+
require 'rubygems/security/policies'
|
16
|
+
|
17
|
+
def signed_gem?(path_to_gem)
|
18
|
+
Gem::Package.new(path_to_gem, Gem::Security::HighSecurity).verify
|
19
|
+
true
|
20
|
+
rescue Gem::Security::Exception => e
|
21
|
+
false
|
22
|
+
end
|
14
23
|
|
15
24
|
$LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
16
25
|
require "mongoid/version"
|
@@ -103,3 +112,19 @@ namespace :release do
|
|
103
112
|
end
|
104
113
|
end
|
105
114
|
end
|
115
|
+
|
116
|
+
desc 'Verifies that all built gems in pkg/ are valid'
|
117
|
+
task :verify do
|
118
|
+
gems = Dir['pkg/*.gem']
|
119
|
+
if gems.empty?
|
120
|
+
puts 'There are no gems in pkg/ to verify'
|
121
|
+
else
|
122
|
+
gems.each do |gem|
|
123
|
+
if signed_gem?(gem)
|
124
|
+
puts "#{gem} is signed"
|
125
|
+
else
|
126
|
+
abort "#{gem} is not signed"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
data/lib/config/locales/en.yml
CHANGED
@@ -1,4 +1,8 @@
|
|
1
1
|
en:
|
2
|
+
errors:
|
3
|
+
messages:
|
4
|
+
taken: "has already been taken"
|
5
|
+
|
2
6
|
mongoid:
|
3
7
|
errors:
|
4
8
|
messages:
|
@@ -61,7 +65,7 @@ en:
|
|
61
65
|
and the following ids were not found: %{missing}."
|
62
66
|
resolution: "Search for an id that is in the database or set
|
63
67
|
the Mongoid.raise_not_found_error configuration option to false,
|
64
|
-
which will cause
|
68
|
+
which will cause nil to be returned instead of raising this error when
|
65
69
|
searching for a single id, or only the matched documents when searching
|
66
70
|
for multiples."
|
67
71
|
document_with_attributes_not_found:
|
@@ -71,15 +75,17 @@ en:
|
|
71
75
|
will be raised."
|
72
76
|
resolution: "Search for attributes that are in the database or set
|
73
77
|
the Mongoid.raise_not_found_error configuration option to false,
|
74
|
-
which will cause
|
75
|
-
|
76
|
-
message: "
|
77
|
-
|
78
|
-
summary: "
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
78
|
+
which will cause nil to be returned instead of raising this error."
|
79
|
+
document_with_shard_key_not_found:
|
80
|
+
message: "Document not found for class %{klass} with id %{missing} and
|
81
|
+
shard key %{shard_key}."
|
82
|
+
summary: "When calling %{klass}.find with an id and a shard key, each
|
83
|
+
parameter must match a document in the database or this error will
|
84
|
+
be raised. The search was for the id: %{missing} with
|
85
|
+
shard_key: %{shard_key} and it was not found."
|
86
|
+
resolution: "Search for an id/shard key that is in the database or set
|
87
|
+
the Mongoid.raise_not_found_error configuration option to false,
|
88
|
+
which will cause nil to be returned instead of raising this error."
|
83
89
|
empty_config_file:
|
84
90
|
message: "Empty configuration file: %{path}."
|
85
91
|
summary: "Your mongoid.yml configuration file appears to be empty."
|
@@ -126,6 +132,17 @@ en:
|
|
126
132
|
allowed."
|
127
133
|
resolution: "Try setting the discriminator key on %{superclass} or one of %{class_name}'s
|
128
134
|
ancestors."
|
135
|
+
invalid_dot_dollar_assignment:
|
136
|
+
message: "Cannot set the %{attr} attribute on the %{klass} class."
|
137
|
+
summary: "Calling the setters for fields that start with a dollar
|
138
|
+
sign ($) or contain a dot/period (.) is prohibited. See the
|
139
|
+
Mongoid documentation on Field Names with Dots/Periods (.) and
|
140
|
+
Dollar Signs ($) for more information."
|
141
|
+
resolution: "In order to set fields that start with a dollar
|
142
|
+
sign ($) or contain a dot/period (.), the aggregation pipeline can
|
143
|
+
be used. MongoDB provides specific operators for working with these
|
144
|
+
fields. Refer to the MongoDB documentation here:
|
145
|
+
https://www.mongodb.com/docs/manual/core/dot-dollar-considerations/"
|
129
146
|
invalid_elem_match_operator:
|
130
147
|
message: "Invalid $elemMatch operator '%{operator}'."
|
131
148
|
summary: "You misspelled an operator or are using an operator that
|
@@ -146,7 +163,7 @@ en:
|
|
146
163
|
resolution: "Valid expression operators are: %{valid_operators}.
|
147
164
|
Ensure you are using one of these operators."
|
148
165
|
invalid_field:
|
149
|
-
message: "Defining a field named '%{
|
166
|
+
message: "Defining a field named '%{field}' is not allowed."
|
150
167
|
summary: "Defining this field would override the method '%{name}',
|
151
168
|
which would cause issues with expectations around the original
|
152
169
|
method and cause extremely hard to debug issues. The original
|
@@ -181,6 +198,13 @@ en:
|
|
181
198
|
\_\_end\n\n
|
182
199
|
Refer to:
|
183
200
|
https://docs.mongodb.com/mongoid/current/reference/fields/#custom-field-options"
|
201
|
+
invalid_field_type:
|
202
|
+
message: "Invalid field type %{type_inspection} for field '%{field}' on model '%{klass}'."
|
203
|
+
summary: "Model '%{klass}' defines a field '%{field}' with an unknown type value
|
204
|
+
%{type_inspection}."
|
205
|
+
resolution: "Please provide a valid type value for the field.
|
206
|
+
Refer to:
|
207
|
+
https://docs.mongodb.com/mongoid/current/reference/fields/#using-symbols-or-strings-instead-of-classes"
|
184
208
|
invalid_includes:
|
185
209
|
message: "Invalid includes directive: %{klass}.includes(%{args})"
|
186
210
|
summary: "Eager loading in Mongoid only supports providing arguments
|
@@ -196,7 +220,6 @@ en:
|
|
196
220
|
Valid options are:\n
|
197
221
|
\_\_background: true|false\n
|
198
222
|
\_\_database: 'database_name'\n
|
199
|
-
\_\_drop_dups: true|false\n
|
200
223
|
\_\_name: 'index_name'\n
|
201
224
|
\_\_sparse: true|false\n
|
202
225
|
\_\_unique: true|false\n
|
@@ -215,7 +238,8 @@ en:
|
|
215
238
|
\_\_language_override\n
|
216
239
|
\_\_default_language\n
|
217
240
|
\_\_collation\n
|
218
|
-
|
241
|
+
\_\_wildcard_projection: { 'path.to.field.a': 1, 'path.to.field.b': 0 }\n
|
242
|
+
Valid types are: 1, -1, '2d', '2dsphere', 'geoHaystack (deprecated)', 'text', 'hashed'\n\n
|
219
243
|
Example:\n
|
220
244
|
\_\_class Band\n
|
221
245
|
\_\_\_\_include Mongoid::Document\n
|
@@ -349,10 +373,6 @@ en:
|
|
349
373
|
from the child side which association to go in."
|
350
374
|
resolution: "Set the values from the parent, or redefine the association
|
351
375
|
with only a single definition in the parent."
|
352
|
-
invalid_value:
|
353
|
-
message: "Value of type %{value_class} cannot be written to a field of type %{field_class}"
|
354
|
-
summary: "Tried to set a value of type %{value_class} to a field of type %{field_class}"
|
355
|
-
resolution: "Verify if the value to be set correspond to field definition"
|
356
376
|
mixed_relations:
|
357
377
|
message: "Referencing a(n) %{embedded} document from the %{root}
|
358
378
|
document via a non-embedded association is not allowed since the
|
@@ -404,17 +424,23 @@ en:
|
|
404
424
|
\_\_\_\_\_\_default:\n
|
405
425
|
\_\_\_\_\_\_\_\_hosts:\n
|
406
426
|
\_\_\_\_\_\_\_\_\_\_- localhost:27017\n\n"
|
427
|
+
no_documents_found:
|
428
|
+
message: "Could not find a document of class %{klass}."
|
429
|
+
summary: "Mongoid attempted to find a document of the class %{klass}
|
430
|
+
but none exist."
|
431
|
+
resolution: "Create a document of class %{klass} or use a finder
|
432
|
+
method that does not raise an exception when no documents are
|
433
|
+
found."
|
407
434
|
no_environment:
|
408
435
|
message: "Could not load the configuration since no environment
|
409
436
|
was defined."
|
410
|
-
summary: "Mongoid
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
being defined."
|
437
|
+
summary: "Mongoid could not determine the environment to use because
|
438
|
+
it was not specified in any of the following locations:
|
439
|
+
Rails.env, Sinatra::Base.environment,
|
440
|
+
ENV[\"RACK_ENV\"], ENV[\"MONGOID_ENV\"]. Without knowing the
|
441
|
+
environment, Mongoid cannot load its configuration."
|
442
|
+
resolution: "Please ensure an environment is set in one of the
|
443
|
+
listed locations. The environment must be explicitly set."
|
418
444
|
no_map_reduce_output:
|
419
445
|
message: "No output location was specified for the map/reduce
|
420
446
|
operation."
|
@@ -541,11 +567,9 @@ en:
|
|
541
567
|
server versions 3.6 and higher."
|
542
568
|
resolution: "Verify that all servers in your deployment are at least
|
543
569
|
version 3.6 or don't attempt to use sessions with older server versions."
|
544
|
-
taken:
|
545
|
-
"is already taken"
|
546
570
|
too_many_nested_attribute_records:
|
547
571
|
message: "Accepting nested attributes for %{association} is limited
|
548
|
-
to %{limit}
|
572
|
+
to %{limit} documents."
|
549
573
|
summary: "More documents were sent to be processed than the allowed
|
550
574
|
limit."
|
551
575
|
resolution: "The limit is set as an option to the macro, for example:
|
@@ -15,8 +15,8 @@ module Mongoid
|
|
15
15
|
# @example Build the association.
|
16
16
|
# person.__build__(:addresses, { :_id => 1 }, association)
|
17
17
|
#
|
18
|
-
# @param [ String
|
19
|
-
# @param [ Hash
|
18
|
+
# @param [ String | Symbol ] name The name of the association.
|
19
|
+
# @param [ Hash | BSON::ObjectId ] object The id or attributes to use.
|
20
20
|
# @param [ Association ] association The association metadata.
|
21
21
|
# @param [ Hash ] selected_fields Fields which were retrieved via #only.
|
22
22
|
# If selected_fields is specified, fields not listed in it will not be
|
@@ -33,7 +33,7 @@ module Mongoid
|
|
33
33
|
# @example Create the association.
|
34
34
|
# person.create_relation(document, association)
|
35
35
|
#
|
36
|
-
# @param [ Document
|
36
|
+
# @param [ Document | Array<Document> ] object The association target.
|
37
37
|
# @param [ Association ] association The association metadata.
|
38
38
|
# @param [ Hash ] selected_fields Fields which were retrieved via #only.
|
39
39
|
# If selected_fields is specified, fields not listed in it will not be
|
@@ -42,8 +42,23 @@ module Mongoid
|
|
42
42
|
# @return [ Proxy ] The association.
|
43
43
|
def create_relation(object, association, selected_fields = nil)
|
44
44
|
type = @attributes[association.inverse_type]
|
45
|
-
target = association.build(self, object, type, selected_fields)
|
46
|
-
|
45
|
+
target = if t = association.build(self, object, type, selected_fields)
|
46
|
+
association.create_relation(self, t)
|
47
|
+
else
|
48
|
+
nil
|
49
|
+
end
|
50
|
+
|
51
|
+
# Only need to do this on embedded associations. The pending callbacks
|
52
|
+
# are only added when materializing the documents, which only happens
|
53
|
+
# on embedded associations. There is no call to the database in the
|
54
|
+
# construction of a referenced association.
|
55
|
+
if association.embedded?
|
56
|
+
Array(target).each do |doc|
|
57
|
+
doc.try(:run_pending_callbacks)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
target
|
47
62
|
end
|
48
63
|
|
49
64
|
# Resets the criteria inside the association proxy. Used by many-to-many
|
@@ -65,7 +80,7 @@ module Mongoid
|
|
65
80
|
# @example Set the proxy on the document.
|
66
81
|
# person.set(:addresses, addresses)
|
67
82
|
#
|
68
|
-
# @param [ String
|
83
|
+
# @param [ String | Symbol ] name The name of the association.
|
69
84
|
# @param [ Proxy ] relation The association to set.
|
70
85
|
#
|
71
86
|
# @return [ Proxy ] The association.
|
@@ -86,10 +101,23 @@ module Mongoid
|
|
86
101
|
# @param [ Symbol ] name The name of the association.
|
87
102
|
# @param [ Association ] association The association metadata.
|
88
103
|
# @param [ Object ] object The object used to build the association.
|
89
|
-
# @param [ true
|
104
|
+
# @param [ true | false ] reload If the association is to be reloaded.
|
90
105
|
#
|
91
106
|
# @return [ Proxy ] The association.
|
92
107
|
def get_relation(name, association, object, reload = false)
|
108
|
+
field_name = database_field_name(name)
|
109
|
+
|
110
|
+
# As per the comments under MONGOID-5034, I've decided to only raise on
|
111
|
+
# embedded associations for a missing attribute. Rails does not raise
|
112
|
+
# for a missing attribute on referenced associations.
|
113
|
+
# We also don't want to raise if we're retrieving an association within
|
114
|
+
# the codebase. This is often done when retrieving the inverse association
|
115
|
+
# during binding or when cascading callbacks. Whenever we retrieve
|
116
|
+
# associations within the codebase, we use without_autobuild.
|
117
|
+
if !without_autobuild? && association.embedded? && attribute_missing?(field_name)
|
118
|
+
raise ActiveModel::MissingAttributeError, "Missing attribute: '#{field_name}'"
|
119
|
+
end
|
120
|
+
|
93
121
|
if !reload && (value = ivar(name)) != false
|
94
122
|
value
|
95
123
|
else
|
@@ -197,7 +225,7 @@ module Mongoid
|
|
197
225
|
# @example Is autobuild disabled?
|
198
226
|
# document.without_autobuild?
|
199
227
|
#
|
200
|
-
# @return [ true
|
228
|
+
# @return [ true | false ] If autobuild is disabled.
|
201
229
|
def without_autobuild?
|
202
230
|
Threaded.executing?(:without_autobuild)
|
203
231
|
end
|
@@ -291,7 +319,7 @@ module Mongoid
|
|
291
319
|
ids_method = "#{association.name.to_s.singularize}_ids"
|
292
320
|
association.inverse_class.tap do |klass|
|
293
321
|
klass.re_define_method(ids_method) do
|
294
|
-
send(association.name).
|
322
|
+
send(association.name).pluck(:_id)
|
295
323
|
end
|
296
324
|
end
|
297
325
|
end
|
@@ -341,6 +369,7 @@ module Mongoid
|
|
341
369
|
# @return [ Class ] The class being set up.
|
342
370
|
def self.define_ids_setter!(association)
|
343
371
|
ids_method = "#{association.name.to_s.singularize}_ids="
|
372
|
+
association.inverse_class.aliased_associations[ids_method.chop] = association.name.to_s
|
344
373
|
association.inverse_class.tap do |klass|
|
345
374
|
klass.re_define_method(ids_method) do |ids|
|
346
375
|
send(association.setter, association.relation_class.find(ids.reject(&:blank?)))
|
@@ -15,7 +15,7 @@ module Mongoid
|
|
15
15
|
# Binding.new(base, target, association)
|
16
16
|
#
|
17
17
|
# @param [ Document ] base The base of the binding.
|
18
|
-
# @param [ Document
|
18
|
+
# @param [ Document | Array<Document> ] target The target of the binding.
|
19
19
|
# @param [ Association ] association The association metadata.
|
20
20
|
def initialize(base, target, association)
|
21
21
|
@_base, @_target, @_association = base, target, association
|
@@ -60,6 +60,53 @@ module Mongoid
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
+
# Remove the associated document from the inverse's association.
|
64
|
+
#
|
65
|
+
# @param [ Document ] doc The document to remove.
|
66
|
+
def remove_associated(doc)
|
67
|
+
if inverse = _association.inverse(doc)
|
68
|
+
if _association.many?
|
69
|
+
remove_associated_many(doc, inverse)
|
70
|
+
elsif _association.in_to?
|
71
|
+
remove_associated_in_to(doc, inverse)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# Remove the associated document from the inverse's association.
|
77
|
+
#
|
78
|
+
# This method removes the associated on *_many relationships.
|
79
|
+
#
|
80
|
+
# @param [ Document ] doc The document to remove.
|
81
|
+
# @param [ Symbol ] inverse The name of the inverse.
|
82
|
+
def remove_associated_many(doc, inverse)
|
83
|
+
# We only want to remove the inverse association when the inverse
|
84
|
+
# document is in memory.
|
85
|
+
if inv = doc.ivar(inverse)
|
86
|
+
# This first condition is needed because when assigning the
|
87
|
+
# embeds_many association using the same embeds_many
|
88
|
+
# association, we delete from the array we are about to assign.
|
89
|
+
if _base != inv && (associated = inv.ivar(_association.name))
|
90
|
+
associated.delete(doc)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# Remove the associated document from the inverse's association.
|
96
|
+
#
|
97
|
+
# This method removes associated on belongs_to and embedded_in
|
98
|
+
# associations.
|
99
|
+
#
|
100
|
+
# @param [ Document ] doc The document to remove.
|
101
|
+
# @param [ Symbol ] inverse The name of the inverse.
|
102
|
+
def remove_associated_in_to(doc, inverse)
|
103
|
+
# We only want to remove the inverse association when the inverse
|
104
|
+
# document is in memory.
|
105
|
+
if associated = doc.ivar(inverse)
|
106
|
+
associated.send(_association.setter, nil)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
63
110
|
# Set the id of the related document in the foreign key field on the
|
64
111
|
# keyed document.
|
65
112
|
#
|
@@ -134,6 +181,7 @@ module Mongoid
|
|
134
181
|
# @param [ Document ] doc The document to bind.
|
135
182
|
def bind_from_relational_parent(doc)
|
136
183
|
check_inverse!(doc)
|
184
|
+
remove_associated(doc)
|
137
185
|
bind_foreign_key(doc, record_id(_base))
|
138
186
|
bind_polymorphic_type(doc, _base.class.name)
|
139
187
|
bind_inverse(doc, _base)
|
@@ -152,7 +200,7 @@ module Mongoid
|
|
152
200
|
# @example Set the base association.
|
153
201
|
# binding.set_base_association
|
154
202
|
#
|
155
|
-
# @return [ true
|
203
|
+
# @return [ true | false ] If the association changed.
|
156
204
|
def set_base_association
|
157
205
|
inverse_association = _association.inverse_association(_target)
|
158
206
|
if inverse_association != _association && !inverse_association.nil?
|
@@ -46,9 +46,10 @@ module Mongoid
|
|
46
46
|
association.inverse_class.tap do |klass|
|
47
47
|
klass.re_define_method("build_#{association.name}") do |*args|
|
48
48
|
attributes, _options = parse_args(*args)
|
49
|
-
document = Factory.
|
49
|
+
document = Factory.execute_build(association.relation_class, attributes, execute_callbacks: false)
|
50
50
|
_building do
|
51
51
|
child = send("#{association.name}=", document)
|
52
|
+
child.run_pending_callbacks
|
52
53
|
child.run_callbacks(:build)
|
53
54
|
child
|
54
55
|
end
|
@@ -69,10 +70,11 @@ module Mongoid
|
|
69
70
|
association.inverse_class.tap do |klass|
|
70
71
|
klass.re_define_method("create_#{association.name}") do |*args|
|
71
72
|
attributes, _options = parse_args(*args)
|
72
|
-
document = Factory.
|
73
|
+
document = Factory.execute_build(association.relation_class, attributes, execute_callbacks: false)
|
73
74
|
doc = _assigning do
|
74
75
|
send("#{association.name}=", document)
|
75
76
|
end
|
77
|
+
doc.run_pending_callbacks
|
76
78
|
doc.save
|
77
79
|
save if new_record? && association.stores_foreign_key?
|
78
80
|
doc
|
@@ -20,13 +20,35 @@ module Mongoid
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
23
|
+
# Load the associations for the given documents. This will be done
|
24
|
+
# recursively to load the associations of the given documents'
|
25
|
+
# subdocuments.
|
26
|
+
#
|
27
|
+
# @param [ Array<Association> ] associations The associations to load.
|
28
|
+
# @param [ Array<Document> ] document The documents.
|
29
|
+
def preload(associations, docs)
|
30
|
+
assoc_map = associations.group_by(&:inverse_class_name)
|
31
|
+
docs_map = {}
|
32
|
+
queue = [ klass.to_s ]
|
33
|
+
|
34
|
+
while klass = queue.shift
|
35
|
+
if as = assoc_map.delete(klass)
|
36
|
+
as.each do |assoc|
|
37
|
+
queue << assoc.class_name
|
38
|
+
|
39
|
+
# If this class is nested in the inclusion tree, only load documents
|
40
|
+
# for the association above it. If there is no parent association,
|
41
|
+
# we will include documents from the documents passed to this method.
|
42
|
+
ds = docs
|
43
|
+
if assoc.parent_inclusions.length > 0
|
44
|
+
ds = assoc.parent_inclusions.map{ |p| docs_map[p].to_a }.flatten
|
45
|
+
end
|
46
|
+
|
47
|
+
res = assoc.relation.eager_loader([assoc], ds).run
|
48
|
+
|
49
|
+
docs_map[assoc.name] ||= [].to_set
|
50
|
+
docs_map[assoc.name].merge(res)
|
51
|
+
end
|
30
52
|
end
|
31
53
|
end
|
32
54
|
end
|
@@ -50,7 +50,7 @@ module Mongoid
|
|
50
50
|
_unscoped.clear
|
51
51
|
end
|
52
52
|
|
53
|
-
# Batch remove the provided documents as a $pullAll.
|
53
|
+
# Batch remove the provided documents as a $pullAll or $pull.
|
54
54
|
#
|
55
55
|
# @example Batch remove the documents.
|
56
56
|
# batchable.batch_remove([ doc_one, doc_two ])
|
@@ -58,13 +58,36 @@ module Mongoid
|
|
58
58
|
# @param [ Array<Document> ] docs The docs to remove.
|
59
59
|
# @param [ Symbol ] method Delete or destroy.
|
60
60
|
def batch_remove(docs, method = :delete)
|
61
|
+
# If the _id is nil, we cannot use $pull and delete by searching for
|
62
|
+
# the id. Therefore we have to use pullAll with the documents'
|
63
|
+
# attributes.
|
61
64
|
removals = pre_process_batch_remove(docs, method)
|
65
|
+
pulls, pull_alls = removals.partition { |o| !o["_id"].nil? }
|
66
|
+
|
67
|
+
if !_base.persisted?
|
68
|
+
post_process_batch_remove(docs, method) unless docs.empty?
|
69
|
+
return reindex
|
70
|
+
end
|
71
|
+
|
62
72
|
if !docs.empty?
|
63
|
-
|
64
|
-
|
73
|
+
if !pulls.empty?
|
74
|
+
collection.find(selector).update_one(
|
75
|
+
positionally(selector, "$pull" => { path => { "_id" => { "$in" => pulls.pluck("_id") } } }),
|
65
76
|
session: _session
|
66
|
-
|
77
|
+
)
|
78
|
+
end
|
79
|
+
if !pull_alls.empty?
|
80
|
+
collection.find(selector).update_one(
|
81
|
+
positionally(selector, "$pullAll" => { path => pull_alls }),
|
82
|
+
session: _session
|
83
|
+
)
|
84
|
+
end
|
67
85
|
post_process_batch_remove(docs, method)
|
86
|
+
else
|
87
|
+
collection.find(selector).update_one(
|
88
|
+
positionally(selector, "$set" => { path => [] }),
|
89
|
+
session: _session
|
90
|
+
)
|
68
91
|
end
|
69
92
|
reindex
|
70
93
|
end
|
@@ -90,7 +113,7 @@ module Mongoid
|
|
90
113
|
batch_remove(_target.dup)
|
91
114
|
end
|
92
115
|
elsif _target != docs
|
93
|
-
_base.delayed_atomic_sets.
|
116
|
+
_base.delayed_atomic_sets.delete(path) unless _assigning?
|
94
117
|
docs = normalize_docs(docs).compact
|
95
118
|
_target.clear and _unscoped.clear
|
96
119
|
_base.delayed_atomic_unsets.delete(path)
|
@@ -173,7 +196,7 @@ module Mongoid
|
|
173
196
|
# @example Can inserts be performed?
|
174
197
|
# batchable.insertable?
|
175
198
|
#
|
176
|
-
# @return [ true
|
199
|
+
# @return [ true | false ] If inserts can be performed.
|
177
200
|
def insertable?
|
178
201
|
persistable? && !_assigning? && inserts_valid
|
179
202
|
end
|
@@ -185,7 +208,7 @@ module Mongoid
|
|
185
208
|
# @example Are the inserts currently valid.
|
186
209
|
# batchable.inserts_valid
|
187
210
|
#
|
188
|
-
# @return [ true
|
211
|
+
# @return [ true | false ] If inserts are currently valid.
|
189
212
|
def inserts_valid
|
190
213
|
@inserts_valid
|
191
214
|
end
|
@@ -197,9 +220,9 @@ module Mongoid
|
|
197
220
|
# @example Set the flag.
|
198
221
|
# batchable.inserts_valid = true
|
199
222
|
#
|
200
|
-
# @param [ true
|
223
|
+
# @param [ true | false ] value The flag.
|
201
224
|
#
|
202
|
-
# @return [ true
|
225
|
+
# @return [ true | false ] The flag.
|
203
226
|
def inserts_valid=(value)
|
204
227
|
@inserts_valid = value
|
205
228
|
end
|
@@ -212,7 +235,7 @@ module Mongoid
|
|
212
235
|
# @example Normalize the docs.
|
213
236
|
# batchable.normalize_docs(docs)
|
214
237
|
#
|
215
|
-
# @param [ Array<Hash
|
238
|
+
# @param [ Array<Hash | Document> ] docs The docs to normalize.
|
216
239
|
#
|
217
240
|
# @return [ Array<Document> ] The docs.
|
218
241
|
def normalize_docs(docs)
|
@@ -88,7 +88,7 @@ module Mongoid
|
|
88
88
|
# @example Determine the child name.
|
89
89
|
# Role.cyclic_child_name
|
90
90
|
#
|
91
|
-
# @param [ true
|
91
|
+
# @param [ true | false ] many Is the a many association?
|
92
92
|
#
|
93
93
|
# @return [ String ] "child_" plus the class name underscored in
|
94
94
|
# singular or plural form.
|
@@ -19,12 +19,14 @@ module Mongoid
|
|
19
19
|
# name.person.bind(:continue => true)
|
20
20
|
# name.person = Person.new
|
21
21
|
def bind_one
|
22
|
-
_base._association = _association.inverse_association(_target) unless _base._association
|
23
|
-
_base.parentize(_target)
|
24
22
|
binding do
|
23
|
+
check_polymorphic_inverses!(_target)
|
24
|
+
_base._association = _association.inverse_association(_target) unless _base._association
|
25
|
+
_base.parentize(_target)
|
25
26
|
if _base.embedded_many?
|
26
27
|
_target.do_or_do_not(_association.inverse(_target)).push(_base)
|
27
28
|
else
|
29
|
+
remove_associated(_target)
|
28
30
|
_target.do_or_do_not(_association.inverse_setter(_target), _base)
|
29
31
|
end
|
30
32
|
end
|
@@ -45,6 +47,26 @@ module Mongoid
|
|
45
47
|
end
|
46
48
|
end
|
47
49
|
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
# Check for problems with multiple inverse definitions.
|
54
|
+
#
|
55
|
+
# @api private
|
56
|
+
#
|
57
|
+
# @example Check for inverses errors.
|
58
|
+
# binding.check_inverses!(doc)
|
59
|
+
#
|
60
|
+
# @param [ Document ] doc The document to check.
|
61
|
+
def check_polymorphic_inverses!(doc)
|
62
|
+
if inverses = _association.inverses(doc)
|
63
|
+
if inverses.length > 1
|
64
|
+
raise Errors::InvalidSetPolymorphicRelation.new(
|
65
|
+
_association.name, _base.class.name, _target.class.name
|
66
|
+
)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
48
70
|
end
|
49
71
|
end
|
50
72
|
end
|
@@ -32,7 +32,7 @@ module Mongoid
|
|
32
32
|
#
|
33
33
|
# @param [ Document ] replacement A document to replace the target.
|
34
34
|
#
|
35
|
-
# @return [ Document
|
35
|
+
# @return [ Document | nil ] The association or nil.
|
36
36
|
def substitute(replacement)
|
37
37
|
unbind_one
|
38
38
|
unless replacement
|
@@ -74,7 +74,7 @@ module Mongoid
|
|
74
74
|
# @example Can we persist the association?
|
75
75
|
# relation.persistable?
|
76
76
|
#
|
77
|
-
# @return [ true
|
77
|
+
# @return [ true | false ] If the association is persistable.
|
78
78
|
def persistable?
|
79
79
|
_target.persisted? && !_binding? && !_building?
|
80
80
|
end
|