mongoid 7.2.1 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +20 -20
- data/LICENSE +1 -1
- data/README.md +7 -12
- data/Rakefile +58 -1
- data/lib/config/locales/en.yml +191 -60
- data/lib/mongoid/association/accessors.rb +67 -53
- data/lib/mongoid/association/bindable.rb +77 -31
- data/lib/mongoid/association/builders.rb +8 -14
- data/lib/mongoid/association/constrainable.rb +2 -5
- data/lib/mongoid/association/depending.rb +20 -12
- data/lib/mongoid/association/eager.rb +160 -0
- data/lib/mongoid/association/eager_loadable.rb +41 -11
- data/lib/mongoid/association/embedded/batchable.rb +63 -52
- data/lib/mongoid/association/embedded/cyclic.rb +4 -12
- data/lib/mongoid/association/embedded/eager.rb +23 -0
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +29 -13
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +3 -5
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +25 -23
- data/lib/mongoid/association/embedded/embedded_in.rb +11 -26
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +4 -9
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +5 -6
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +226 -203
- data/lib/mongoid/association/embedded/embeds_many.rb +3 -33
- data/lib/mongoid/association/embedded/embeds_one/binding.rb +3 -9
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +20 -8
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +131 -42
- data/lib/mongoid/association/embedded/embeds_one.rb +4 -30
- data/lib/mongoid/association/embedded.rb +2 -1
- data/lib/mongoid/association/macros.rb +47 -16
- data/lib/mongoid/association/many.rb +12 -24
- data/lib/mongoid/association/marshalable.rb +4 -5
- data/lib/mongoid/association/nested/many.rb +14 -19
- data/lib/mongoid/association/nested/nested_buildable.rb +36 -13
- data/lib/mongoid/association/nested/one.rb +54 -26
- data/lib/mongoid/association/nested.rb +1 -3
- data/lib/mongoid/association/one.rb +3 -11
- data/lib/mongoid/association/options.rb +18 -44
- data/lib/mongoid/association/proxy.rb +49 -42
- data/lib/mongoid/association/referenced/auto_save.rb +11 -15
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +2 -7
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +6 -6
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +2 -2
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +23 -32
- data/lib/mongoid/association/referenced/belongs_to.rb +13 -37
- data/lib/mongoid/association/referenced/counter_cache.rb +18 -26
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +15 -8
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +1 -3
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +191 -123
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +23 -42
- data/lib/mongoid/association/referenced/has_many/binding.rb +1 -5
- data/lib/mongoid/association/referenced/has_many/buildable.rb +1 -3
- data/lib/mongoid/association/referenced/has_many/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +471 -496
- data/lib/mongoid/association/referenced/has_many/proxy.rb +182 -179
- data/lib/mongoid/association/referenced/has_many.rb +17 -43
- data/lib/mongoid/association/referenced/has_one/binding.rb +1 -7
- data/lib/mongoid/association/referenced/has_one/buildable.rb +5 -5
- data/lib/mongoid/association/referenced/has_one/eager.rb +3 -4
- data/lib/mongoid/association/referenced/has_one/proxy.rb +38 -41
- data/lib/mongoid/association/referenced/has_one.rb +17 -36
- data/lib/mongoid/association/referenced/syncable.rb +11 -27
- data/lib/mongoid/association/referenced.rb +1 -1
- data/lib/mongoid/association/reflections.rb +9 -9
- data/lib/mongoid/association/relatable.rb +55 -74
- data/lib/mongoid/association.rb +10 -22
- data/lib/mongoid/atomic/modifiers.rb +7 -53
- data/lib/mongoid/atomic/paths/embedded/many.rb +20 -5
- data/lib/mongoid/atomic/paths/embedded/one.rb +1 -5
- data/lib/mongoid/atomic/paths/embedded.rb +1 -3
- data/lib/mongoid/atomic/paths/root.rb +1 -5
- data/lib/mongoid/atomic/paths.rb +1 -1
- data/lib/mongoid/atomic.rb +39 -86
- data/lib/mongoid/atomic_update_preparer.rb +88 -0
- data/lib/mongoid/attributes/dynamic.rb +5 -21
- data/lib/mongoid/attributes/embedded.rb +34 -0
- data/lib/mongoid/attributes/nested.rb +9 -13
- data/lib/mongoid/attributes/processing.rb +43 -28
- data/lib/mongoid/attributes/projector.rb +120 -0
- data/lib/mongoid/attributes/readonly.rb +4 -8
- data/lib/mongoid/attributes.rb +85 -89
- data/lib/mongoid/cacheable.rb +5 -9
- data/lib/mongoid/changeable.rb +183 -97
- data/lib/mongoid/clients/factory.rb +58 -15
- data/lib/mongoid/clients/options.rb +117 -8
- data/lib/mongoid/clients/sessions.rb +246 -84
- data/lib/mongoid/clients/storage_options.rb +37 -11
- data/lib/mongoid/clients/validators/storage.rb +4 -24
- data/lib/mongoid/clients/validators.rb +1 -1
- data/lib/mongoid/clients.rb +37 -14
- data/lib/mongoid/collection_configurable.rb +59 -0
- data/lib/mongoid/composable.rb +7 -7
- data/lib/mongoid/config/defaults.rb +40 -0
- data/lib/mongoid/config/encryption.rb +213 -0
- data/lib/mongoid/config/environment.rb +25 -5
- data/lib/mongoid/config/introspection.rb +152 -0
- data/lib/mongoid/config/options.rb +11 -14
- data/lib/mongoid/config/validators/async_query_executor.rb +34 -0
- data/lib/mongoid/config/validators/client.rb +7 -23
- data/lib/mongoid/config/validators/option.rb +1 -3
- data/lib/mongoid/config/validators.rb +2 -1
- data/lib/mongoid/config.rb +183 -46
- data/lib/mongoid/contextual/aggregable/memory.rb +38 -26
- data/lib/mongoid/contextual/aggregable/mongo.rb +26 -32
- data/lib/mongoid/contextual/aggregable/none.rb +66 -0
- data/lib/mongoid/contextual/aggregable.rb +18 -0
- data/lib/mongoid/contextual/atomic.rb +97 -30
- data/lib/mongoid/contextual/command.rb +3 -5
- data/lib/mongoid/contextual/map_reduce.rb +8 -33
- data/lib/mongoid/contextual/memory.rb +396 -89
- data/lib/mongoid/contextual/mongo/documents_loader.rb +178 -0
- data/lib/mongoid/contextual/mongo.rb +640 -311
- data/lib/mongoid/contextual/none.rb +244 -30
- data/lib/mongoid/contextual/queryable.rb +5 -4
- data/lib/mongoid/contextual.rb +18 -7
- data/lib/mongoid/copyable.rb +34 -14
- data/lib/mongoid/criteria/findable.rb +52 -22
- data/lib/mongoid/criteria/includable.rb +31 -34
- data/lib/mongoid/criteria/inspectable.rb +4 -3
- data/lib/mongoid/criteria/marshalable.rb +14 -7
- data/lib/mongoid/criteria/modifiable.rb +5 -19
- data/lib/mongoid/criteria/options.rb +1 -3
- data/lib/mongoid/criteria/permission.rb +6 -2
- data/lib/mongoid/criteria/queryable/aggregable.rb +3 -15
- data/lib/mongoid/criteria/queryable/expandable.rb +1 -25
- data/lib/mongoid/criteria/queryable/extensions/array.rb +6 -41
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -9
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -7
- data/lib/mongoid/criteria/queryable/extensions/date.rb +10 -11
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +8 -7
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -41
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +2 -14
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -21
- data/lib/mongoid/criteria/queryable/extensions/object.rb +7 -30
- data/lib/mongoid/criteria/queryable/extensions/range.rb +48 -17
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +10 -13
- data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -5
- data/lib/mongoid/criteria/queryable/extensions/string.rb +19 -34
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +6 -22
- data/lib/mongoid/criteria/queryable/extensions/time.rb +8 -9
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +9 -9
- data/lib/mongoid/criteria/queryable/extensions.rb +1 -5
- data/lib/mongoid/criteria/queryable/key.rb +15 -18
- data/lib/mongoid/criteria/queryable/macroable.rb +1 -3
- data/lib/mongoid/criteria/queryable/mergeable.rb +69 -50
- data/lib/mongoid/criteria/queryable/optional.rb +12 -62
- data/lib/mongoid/criteria/queryable/options.rb +3 -21
- data/lib/mongoid/criteria/queryable/pipeline.rb +2 -14
- data/lib/mongoid/criteria/queryable/selectable.rb +87 -124
- data/lib/mongoid/criteria/queryable/selector.rb +96 -25
- data/lib/mongoid/criteria/queryable/smash.rb +41 -18
- data/lib/mongoid/criteria/queryable/storable.rb +14 -9
- data/lib/mongoid/criteria/queryable.rb +12 -13
- data/lib/mongoid/criteria/scopable.rb +32 -21
- data/lib/mongoid/criteria/translator.rb +46 -0
- data/lib/mongoid/criteria.rb +60 -109
- data/lib/mongoid/deprecable.rb +38 -0
- data/lib/mongoid/deprecation.rb +29 -0
- data/lib/mongoid/document.rb +263 -173
- data/lib/mongoid/encryptable.rb +53 -0
- data/lib/mongoid/equality.rb +22 -25
- data/lib/mongoid/errors/ambiguous_relationship.rb +3 -5
- data/lib/mongoid/errors/attribute_not_loaded.rb +34 -0
- data/lib/mongoid/errors/callback.rb +1 -3
- data/lib/mongoid/errors/create_collection_failure.rb +34 -0
- data/lib/mongoid/errors/criteria_argument_required.rb +1 -1
- data/lib/mongoid/errors/delete_restriction.rb +9 -12
- data/lib/mongoid/errors/document_not_destroyed.rb +3 -7
- data/lib/mongoid/errors/document_not_found.rb +34 -21
- data/lib/mongoid/errors/drop_collection_failure.rb +28 -0
- data/lib/mongoid/errors/empty_config_file.rb +26 -0
- data/lib/mongoid/errors/immutable_attribute.rb +27 -0
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -3
- data/lib/mongoid/errors/invalid_async_query_executor.rb +26 -0
- data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +33 -0
- data/lib/mongoid/errors/invalid_collection.rb +1 -1
- data/lib/mongoid/errors/invalid_config_file.rb +26 -0
- data/lib/mongoid/errors/invalid_config_option.rb +2 -4
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -4
- data/lib/mongoid/errors/invalid_discriminator_key_target.rb +1 -1
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +24 -0
- data/lib/mongoid/errors/invalid_elem_match_operator.rb +1 -1
- data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +6 -5
- data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +27 -0
- data/lib/mongoid/errors/invalid_expression_operator.rb +1 -1
- data/lib/mongoid/errors/invalid_field.rb +7 -7
- data/lib/mongoid/errors/invalid_field_operator.rb +1 -1
- data/lib/mongoid/errors/invalid_field_option.rb +1 -3
- data/lib/mongoid/errors/invalid_field_type.rb +27 -0
- data/lib/mongoid/errors/invalid_find.rb +1 -3
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +23 -0
- data/lib/mongoid/errors/invalid_includes.rb +1 -3
- data/lib/mongoid/errors/invalid_index.rb +1 -3
- data/lib/mongoid/errors/invalid_options.rb +1 -3
- data/lib/mongoid/errors/invalid_path.rb +1 -3
- data/lib/mongoid/errors/invalid_persistence_option.rb +1 -5
- data/lib/mongoid/errors/invalid_query.rb +1 -1
- data/lib/mongoid/errors/invalid_relation.rb +2 -8
- data/lib/mongoid/errors/invalid_relation_option.rb +2 -4
- data/lib/mongoid/errors/invalid_scope.rb +1 -3
- data/lib/mongoid/errors/invalid_session_nesting.rb +17 -0
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +1 -2
- data/lib/mongoid/errors/invalid_storage_options.rb +2 -4
- data/lib/mongoid/errors/invalid_time.rb +1 -3
- data/lib/mongoid/errors/invalid_transaction_nesting.rb +17 -0
- data/lib/mongoid/errors/inverse_not_found.rb +1 -3
- data/lib/mongoid/errors/mixed_client_configuration.rb +1 -3
- data/lib/mongoid/errors/mixed_relations.rb +1 -3
- data/lib/mongoid/errors/mongoid_error.rb +8 -16
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +2 -4
- data/lib/mongoid/errors/no_client_config.rb +1 -3
- data/lib/mongoid/errors/no_client_database.rb +2 -4
- data/lib/mongoid/errors/no_client_hosts.rb +2 -4
- data/lib/mongoid/errors/no_clients_config.rb +1 -3
- data/lib/mongoid/errors/no_default_client.rb +1 -3
- data/lib/mongoid/errors/no_environment.rb +1 -3
- data/lib/mongoid/errors/no_map_reduce_output.rb +1 -3
- data/lib/mongoid/errors/no_metadata.rb +1 -3
- data/lib/mongoid/errors/no_parent.rb +1 -3
- data/lib/mongoid/errors/readonly_attribute.rb +2 -4
- data/lib/mongoid/errors/readonly_document.rb +2 -6
- data/lib/mongoid/errors/rollback.rb +15 -0
- data/lib/mongoid/errors/scope_overwrite.rb +1 -1
- data/lib/mongoid/errors/sessions_not_supported.rb +17 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -2
- data/lib/mongoid/errors/transaction_error.rb +25 -0
- data/lib/mongoid/errors/transactions_not_supported.rb +17 -0
- data/lib/mongoid/errors/unknown_attribute.rb +2 -4
- data/lib/mongoid/errors/unknown_model.rb +1 -3
- data/lib/mongoid/errors/unsaved_document.rb +2 -2
- data/lib/mongoid/errors/unsupported_javascript.rb +1 -3
- data/lib/mongoid/errors/validations.rb +1 -1
- data/lib/mongoid/errors.rb +18 -5
- data/lib/mongoid/evolvable.rb +2 -4
- data/lib/mongoid/extensions/array.rb +20 -58
- data/lib/mongoid/extensions/big_decimal.rb +44 -24
- data/lib/mongoid/extensions/binary.rb +45 -0
- data/lib/mongoid/extensions/boolean.rb +11 -6
- data/lib/mongoid/extensions/date.rb +31 -29
- data/lib/mongoid/extensions/date_time.rb +5 -16
- data/lib/mongoid/extensions/decimal128.rb +3 -5
- data/lib/mongoid/extensions/false_class.rb +8 -10
- data/lib/mongoid/extensions/float.rb +11 -12
- data/lib/mongoid/extensions/hash.rb +28 -148
- data/lib/mongoid/extensions/integer.rb +13 -14
- data/lib/mongoid/extensions/module.rb +5 -5
- data/lib/mongoid/extensions/nil_class.rb +5 -7
- data/lib/mongoid/extensions/object.rb +32 -81
- data/lib/mongoid/extensions/object_id.rb +3 -7
- data/lib/mongoid/extensions/range.rb +47 -24
- data/lib/mongoid/extensions/raw_value.rb +34 -0
- data/lib/mongoid/extensions/regexp.rb +14 -7
- data/lib/mongoid/extensions/set.rb +24 -13
- data/lib/mongoid/extensions/string.rb +30 -62
- data/lib/mongoid/extensions/symbol.rb +9 -22
- data/lib/mongoid/extensions/time.rb +30 -40
- data/lib/mongoid/extensions/time_with_zone.rb +18 -11
- data/lib/mongoid/extensions/true_class.rb +8 -10
- data/lib/mongoid/extensions.rb +3 -20
- data/lib/mongoid/factory.rb +178 -37
- data/lib/mongoid/fields/encrypted.rb +48 -0
- data/lib/mongoid/fields/foreign_key.rb +39 -27
- data/lib/mongoid/fields/localized.rb +25 -15
- data/lib/mongoid/fields/standard.rb +22 -40
- data/lib/mongoid/fields/validators/macro.rb +6 -19
- data/lib/mongoid/fields/validators.rb +1 -1
- data/lib/mongoid/fields.rb +354 -76
- data/lib/mongoid/findable.rb +62 -22
- data/lib/mongoid/indexable/specification.rb +55 -34
- data/lib/mongoid/indexable/validators/options.rb +7 -9
- data/lib/mongoid/indexable.rb +2 -18
- data/lib/mongoid/inspectable.rb +34 -11
- data/lib/mongoid/interceptable.rb +197 -41
- data/lib/mongoid/loadable.rb +83 -0
- data/lib/mongoid/loggable.rb +1 -9
- data/lib/mongoid/matchable.rb +2 -6
- data/lib/mongoid/matcher/all.rb +15 -0
- data/lib/mongoid/matcher/and.rb +14 -0
- data/lib/mongoid/matcher/bits.rb +60 -0
- data/lib/mongoid/matcher/bits_all_clear.rb +41 -0
- data/lib/mongoid/matcher/bits_all_set.rb +41 -0
- data/lib/mongoid/matcher/bits_any_clear.rb +41 -0
- data/lib/mongoid/matcher/bits_any_set.rb +41 -0
- data/lib/mongoid/matcher/elem_match.rb +17 -1
- data/lib/mongoid/matcher/elem_match_expression.rb +14 -2
- data/lib/mongoid/matcher/eq.rb +15 -0
- data/lib/mongoid/matcher/eq_impl.rb +54 -2
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +18 -1
- data/lib/mongoid/matcher/exists.rb +15 -0
- data/lib/mongoid/matcher/expression.rb +22 -14
- data/lib/mongoid/matcher/expression_operator.rb +14 -0
- data/lib/mongoid/matcher/field_expression.rb +19 -5
- data/lib/mongoid/matcher/field_operator.rb +30 -0
- data/lib/mongoid/matcher/gt.rb +15 -0
- data/lib/mongoid/matcher/gte.rb +15 -0
- data/lib/mongoid/matcher/in.rb +15 -0
- data/lib/mongoid/matcher/lt.rb +15 -0
- data/lib/mongoid/matcher/lte.rb +15 -0
- data/lib/mongoid/matcher/mod.rb +33 -0
- data/lib/mongoid/matcher/ne.rb +15 -0
- data/lib/mongoid/matcher/nin.rb +15 -0
- data/lib/mongoid/matcher/nor.rb +14 -0
- data/lib/mongoid/matcher/not.rb +16 -0
- data/lib/mongoid/matcher/or.rb +14 -0
- data/lib/mongoid/matcher/regex.rb +24 -0
- data/lib/mongoid/matcher/size.rb +16 -0
- data/lib/mongoid/matcher/type.rb +124 -0
- data/lib/mongoid/matcher.rb +59 -52
- data/lib/mongoid/persistable/creatable.rb +25 -29
- data/lib/mongoid/persistable/deletable.rb +10 -23
- data/lib/mongoid/persistable/destroyable.rb +37 -11
- data/lib/mongoid/persistable/incrementable.rb +2 -6
- data/lib/mongoid/persistable/logical.rb +1 -5
- data/lib/mongoid/persistable/maxable.rb +37 -0
- data/lib/mongoid/persistable/minable.rb +37 -0
- data/lib/mongoid/persistable/multipliable.rb +36 -0
- data/lib/mongoid/persistable/poppable.rb +1 -5
- data/lib/mongoid/persistable/pullable.rb +1 -7
- data/lib/mongoid/persistable/pushable.rb +1 -7
- data/lib/mongoid/persistable/renamable.rb +1 -5
- data/lib/mongoid/persistable/savable.rb +14 -8
- data/lib/mongoid/persistable/settable.rb +1 -5
- data/lib/mongoid/persistable/unsettable.rb +3 -7
- data/lib/mongoid/persistable/updatable.rb +114 -28
- data/lib/mongoid/persistable/upsertable.rb +33 -8
- data/lib/mongoid/persistable.rb +17 -27
- data/lib/mongoid/persistence_context.rb +111 -43
- data/lib/mongoid/positional.rb +1 -5
- data/lib/mongoid/railtie.rb +23 -15
- data/lib/mongoid/railties/bson_object_id_serializer.rb +39 -0
- data/lib/mongoid/railties/console_sandbox.rb +42 -0
- data/lib/mongoid/railties/controller_runtime.rb +21 -6
- data/lib/mongoid/railties/database.rake +19 -2
- data/lib/mongoid/reloadable.rb +45 -42
- data/lib/mongoid/scopable.rb +25 -53
- data/lib/mongoid/search_indexable.rb +167 -0
- data/lib/mongoid/selectable.rb +6 -17
- data/lib/mongoid/serializable.rb +11 -21
- data/lib/mongoid/shardable.rb +50 -16
- data/lib/mongoid/stateful.rb +66 -22
- data/lib/mongoid/stringified_symbol.rb +19 -7
- data/lib/mongoid/tasks/database.rake +25 -0
- data/lib/mongoid/tasks/database.rb +84 -8
- data/lib/mongoid/tasks/encryption.rake +59 -0
- data/lib/mongoid/tasks/encryption.rb +108 -0
- data/lib/mongoid/threaded/lifecycle.rb +6 -26
- data/lib/mongoid/threaded.rb +131 -92
- data/lib/mongoid/timestamps/created/short.rb +1 -1
- data/lib/mongoid/timestamps/created.rb +4 -4
- data/lib/mongoid/timestamps/short.rb +1 -1
- data/lib/mongoid/timestamps/timeless.rb +29 -7
- data/lib/mongoid/timestamps/updated/short.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +3 -5
- data/lib/mongoid/timestamps.rb +1 -1
- data/lib/mongoid/touchable.rb +155 -29
- data/lib/mongoid/traversable.rb +180 -125
- data/lib/mongoid/utils.rb +52 -0
- data/lib/mongoid/validatable/associated.rb +97 -21
- data/lib/mongoid/validatable/format.rb +1 -1
- data/lib/mongoid/validatable/length.rb +1 -1
- data/lib/mongoid/validatable/localizable.rb +2 -4
- data/lib/mongoid/validatable/macros.rb +10 -14
- data/lib/mongoid/validatable/presence.rb +7 -13
- data/lib/mongoid/validatable/queryable.rb +9 -3
- data/lib/mongoid/validatable/uniqueness.rb +26 -39
- data/lib/mongoid/validatable.rb +20 -29
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/warnings.rb +37 -0
- data/lib/mongoid.rb +56 -22
- data/lib/rails/generators/mongoid/config/config_generator.rb +25 -5
- data/lib/rails/generators/mongoid/config/templates/mongoid.rb +25 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +44 -64
- data/lib/rails/generators/mongoid/model/model_generator.rb +4 -1
- data/lib/rails/generators/mongoid_generator.rb +13 -1
- data/lib/rails/mongoid.rb +4 -32
- data/spec/config/mongoid.yml +16 -1
- data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
- data/spec/integration/active_job_spec.rb +32 -0
- data/spec/integration/app_spec.rb +180 -89
- data/spec/integration/associations/belongs_to_spec.rb +19 -1
- data/spec/integration/associations/embedded_dirty_spec.rb +58 -0
- data/spec/integration/associations/embedded_spec.rb +90 -7
- data/spec/integration/associations/embeds_many_spec.rb +197 -1
- data/spec/integration/associations/embeds_one_spec.rb +19 -1
- data/spec/integration/associations/foreign_key_spec.rb +10 -1
- data/spec/integration/associations/foreign_key_spec_models.rb +1 -1
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +62 -0
- data/spec/integration/associations/has_many_spec.rb +1 -1
- data/spec/integration/associations/has_one_spec.rb +145 -1
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +1 -1
- data/spec/integration/associations/reverse_population_spec.rb +1 -1
- data/spec/integration/associations/reverse_population_spec_models.rb +1 -1
- data/spec/integration/associations/scope_option_spec.rb +102 -0
- data/spec/integration/atomic/modifiers_spec.rb +1 -1
- data/spec/integration/bson_regexp_raw_spec.rb +1 -1
- data/spec/integration/callbacks_models.rb +147 -3
- data/spec/integration/callbacks_spec.rb +398 -8
- data/spec/integration/contextual/empty_spec.rb +142 -0
- data/spec/integration/criteria/alias_query_spec.rb +98 -0
- data/spec/integration/criteria/date_field_spec.rb +2 -2
- data/spec/integration/criteria/default_scope_spec.rb +52 -0
- data/spec/integration/criteria/logical_spec.rb +12 -0
- data/spec/integration/criteria/range_spec.rb +358 -0
- data/spec/integration/criteria/raw_value_spec.rb +525 -0
- data/spec/integration/criteria/time_with_zone_spec.rb +126 -15
- data/spec/integration/discriminator_key_spec.rb +119 -81
- data/spec/integration/discriminator_value_spec.rb +1 -1
- data/spec/integration/document_spec.rb +31 -1
- data/spec/integration/dots_and_dollars_spec.rb +278 -0
- data/spec/integration/encryption_spec.rb +100 -0
- data/spec/integration/i18n_fallbacks_spec.rb +10 -52
- data/spec/integration/matcher_examples_spec.rb +21 -14
- data/spec/integration/matcher_operator_data/bits_all_clear.yml +144 -0
- data/spec/integration/matcher_operator_data/bits_all_set.yml +144 -0
- data/spec/integration/matcher_operator_data/bits_any_clear.yml +144 -0
- data/spec/integration/matcher_operator_data/bits_any_set.yml +144 -0
- data/spec/integration/matcher_operator_data/comment.yml +22 -0
- data/spec/integration/matcher_operator_data/elem_match.yml +46 -0
- data/spec/integration/matcher_operator_data/implicit_traversal.yml +96 -0
- data/spec/integration/matcher_operator_data/in.yml +16 -0
- data/spec/integration/matcher_operator_data/mod.yml +55 -0
- data/spec/integration/matcher_operator_data/size.yml +0 -3
- data/spec/integration/matcher_operator_data/type.yml +64 -0
- data/spec/integration/matcher_operator_data/type_array.yml +15 -0
- data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
- data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
- data/spec/integration/matcher_operator_data/type_code.yml +26 -0
- data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
- data/spec/integration/matcher_operator_data/type_date.yml +39 -0
- data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
- data/spec/integration/matcher_operator_data/type_decimal.yml +37 -0
- data/spec/integration/matcher_operator_data/type_double.yml +15 -0
- data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
- data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
- data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_null.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
- data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
- data/spec/integration/matcher_operator_data/type_string.yml +15 -0
- data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
- data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
- data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
- data/spec/integration/matcher_operator_spec.rb +26 -3
- data/spec/integration/matcher_spec.rb +50 -1
- data/spec/integration/persistence/range_field_spec.rb +351 -0
- data/spec/integration/server_query_spec.rb +1 -1
- data/spec/integration/shardable_spec.rb +1 -1
- data/spec/integration/stringified_symbol_field_spec.rb +17 -3
- data/spec/lite_spec_helper.rb +47 -14
- data/spec/mongoid/association/accessors_spec.rb +31 -19
- data/spec/mongoid/association/auto_save_spec.rb +73 -34
- data/spec/mongoid/association/builders_spec.rb +2 -2
- data/spec/mongoid/association/constrainable_spec.rb +1 -1
- data/spec/mongoid/association/counter_cache_spec.rb +34 -34
- data/spec/mongoid/association/depending_spec.rb +397 -358
- data/spec/mongoid/association/eager_spec.rb +56 -6
- data/spec/mongoid/association/embedded/cyclic_spec.rb +3 -3
- data/spec/mongoid/association/embedded/dirty_spec.rb +3 -3
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +3 -2
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +55 -1
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +110 -23
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +19 -8
- data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +1 -1
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +113 -1
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +712 -203
- data/spec/mongoid/association/embedded/embeds_many_models.rb +189 -1
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +14 -2
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +69 -1
- data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +1 -1
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +26 -1
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +37 -24
- data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +1 -1
- data/spec/mongoid/association/embedded/embeds_one_models.rb +25 -2
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +2 -2
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +29 -1
- data/spec/mongoid/association/macros_spec.rb +10 -10
- data/spec/mongoid/association/nested/many_spec.rb +1 -1
- data/spec/mongoid/association/nested/one_spec.rb +17 -13
- data/spec/mongoid/association/options_spec.rb +1 -1
- data/spec/mongoid/association/polymorphic_spec.rb +1 -1
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +3 -2
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +110 -17
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +51 -15
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +113 -59
- data/spec/mongoid/association/referenced/belongs_to_models.rb +12 -0
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +22 -2
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +27 -22
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -3
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +32 -3
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +386 -376
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +44 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +57 -3
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +131 -1
- data/spec/mongoid/association/referenced/has_many/eager_spec.rb +24 -7
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +313 -134
- data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +1313 -2109
- data/spec/mongoid/association/referenced/has_many_models.rb +39 -2
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_many_spec.rb +47 -1
- data/spec/mongoid/association/referenced/has_one/binding_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +54 -10
- data/spec/mongoid/association/referenced/has_one/eager_spec.rb +18 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +134 -28
- data/spec/mongoid/association/referenced/has_one_models.rb +43 -1
- data/spec/mongoid/association/referenced/has_one_query_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_one_spec.rb +22 -1
- data/spec/mongoid/association/reflections_spec.rb +1 -1
- data/spec/mongoid/association/syncable_spec.rb +47 -33
- data/spec/mongoid/association_spec.rb +1 -1
- data/spec/mongoid/atomic/modifiers_spec.rb +1 -1
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +1 -1
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +1 -1
- data/spec/mongoid/atomic/paths/root_spec.rb +1 -1
- data/spec/mongoid/atomic/paths_spec.rb +65 -27
- data/spec/mongoid/atomic_spec.rb +29 -7
- data/spec/mongoid/atomic_update_preparer_spec.rb +83 -0
- data/spec/mongoid/attributes/dynamic_spec.rb +1 -1
- data/spec/mongoid/attributes/embedded_spec.rb +118 -0
- data/spec/mongoid/attributes/nested_spec.rb +147 -78
- data/spec/mongoid/attributes/nested_spec_models.rb +49 -0
- data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
- data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
- data/spec/mongoid/attributes/projector_spec.rb +41 -0
- data/spec/mongoid/attributes/readonly_spec.rb +23 -23
- data/spec/mongoid/attributes_spec.rb +921 -69
- data/spec/mongoid/cacheable_spec.rb +5 -5
- data/spec/mongoid/changeable_spec.rb +468 -76
- data/spec/mongoid/clients/factory_spec.rb +152 -30
- data/spec/mongoid/clients/options_spec.rb +24 -12
- data/spec/mongoid/clients/sessions_spec.rb +49 -71
- data/spec/mongoid/clients/transactions_spec.rb +971 -176
- data/spec/mongoid/clients/transactions_spec_models.rb +159 -0
- data/spec/mongoid/clients_spec.rb +230 -22
- data/spec/mongoid/collection_configurable_spec.rb +159 -0
- data/spec/mongoid/composable_spec.rb +1 -1
- data/spec/mongoid/config/defaults_spec.rb +99 -0
- data/spec/mongoid/config/encryption_spec.rb +152 -0
- data/spec/mongoid/config/environment_spec.rb +126 -39
- data/spec/mongoid/config/introspection_spec.rb +114 -0
- data/spec/mongoid/config/options_spec.rb +1 -1
- data/spec/mongoid/config_spec.rb +375 -43
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +432 -154
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +63 -0
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +95 -20
- data/spec/mongoid/contextual/aggregable/none_spec.rb +49 -0
- data/spec/mongoid/contextual/atomic_spec.rb +329 -87
- data/spec/mongoid/contextual/map_reduce_spec.rb +5 -19
- data/spec/mongoid/contextual/memory_spec.rb +1479 -127
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +194 -0
- data/spec/mongoid/contextual/mongo_spec.rb +3374 -1254
- data/spec/mongoid/contextual/none_spec.rb +79 -68
- data/spec/mongoid/copyable_spec.rb +465 -23
- data/spec/mongoid/copyable_spec_models.rb +1 -1
- data/spec/mongoid/criteria/findable_spec.rb +295 -229
- data/spec/mongoid/criteria/includable_spec.rb +1493 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +55 -0
- data/spec/mongoid/criteria/inspectable_spec.rb +1 -1
- data/spec/mongoid/criteria/marshalable_spec.rb +19 -2
- data/spec/mongoid/criteria/modifiable_spec.rb +38 -38
- data/spec/mongoid/criteria/options_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/expandable_spec.rb +1 -74
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +8 -20
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +135 -27
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +32 -12
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +12 -1
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +1 -16
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +74 -8
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +238 -179
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -12
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +1 -12
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +48 -132
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +5 -60
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +12 -1
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +12 -1
- data/spec/mongoid/criteria/queryable/key_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +106 -8
- data/spec/mongoid/criteria/queryable/optional_spec.rb +17 -486
- data/spec/mongoid/criteria/queryable/options_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +700 -26
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +149 -683
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +186 -6
- data/spec/mongoid/criteria/queryable/smash_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/storable_spec.rb +87 -1
- data/spec/mongoid/criteria/scopable_spec.rb +128 -1
- data/spec/mongoid/criteria/translator_spec.rb +133 -0
- data/spec/mongoid/criteria_projection_spec.rb +407 -0
- data/spec/mongoid/criteria_spec.rb +1029 -1806
- data/spec/mongoid/document_fields_spec.rb +180 -5
- data/spec/mongoid/document_persistence_context_spec.rb +77 -1
- data/spec/mongoid/document_query_spec.rb +55 -4
- data/spec/mongoid/document_spec.rb +43 -172
- data/spec/mongoid/equality_spec.rb +7 -8
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +1 -1
- data/spec/mongoid/errors/attribute_not_loaded_spec.rb +32 -0
- data/spec/mongoid/errors/callback_spec.rb +1 -1
- data/spec/mongoid/errors/delete_restriction_spec.rb +2 -2
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +1 -1
- data/spec/mongoid/errors/document_not_found_spec.rb +77 -1
- data/spec/mongoid/errors/invalid_collection_spec.rb +1 -1
- data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +6 -6
- data/spec/mongoid/errors/invalid_config_option_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_option_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_spec.rb +2 -2
- data/spec/mongoid/errors/invalid_field_type_spec.rb +56 -0
- data/spec/mongoid/errors/invalid_find_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_includes_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_index_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_options_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_path_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_relation_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_scope_spec.rb +2 -2
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_time_spec.rb +1 -1
- data/spec/mongoid/errors/inverse_not_found_spec.rb +1 -1
- data/spec/mongoid/errors/mixed_client_configuration_spec.rb +1 -1
- data/spec/mongoid/errors/mixed_relations_spec.rb +1 -1
- data/spec/mongoid/errors/mongoid_error_spec.rb +4 -4
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_config_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_database_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_hosts_spec.rb +1 -1
- data/spec/mongoid/errors/no_clients_config_spec.rb +1 -1
- data/spec/mongoid/errors/no_environment_spec.rb +4 -4
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +1 -1
- data/spec/mongoid/errors/no_metadata_spec.rb +1 -1
- data/spec/mongoid/errors/no_parent_spec.rb +1 -1
- data/spec/mongoid/errors/readonly_attribute_spec.rb +1 -1
- data/spec/mongoid/errors/readonly_document_spec.rb +3 -3
- data/spec/mongoid/errors/scope_overwrite_spec.rb +1 -1
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -2
- data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -3
- data/spec/mongoid/errors/unsaved_document_spec.rb +1 -1
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +1 -1
- data/spec/mongoid/errors/validations_spec.rb +1 -1
- data/spec/mongoid/extensions/array_spec.rb +19 -265
- data/spec/mongoid/extensions/big_decimal_spec.rb +713 -213
- data/spec/mongoid/extensions/binary_spec.rb +45 -10
- data/spec/mongoid/extensions/boolean_spec.rb +69 -83
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +15 -11
- data/spec/mongoid/extensions/date_spec.rb +74 -22
- data/spec/mongoid/extensions/date_time_spec.rb +18 -19
- data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
- data/spec/mongoid/extensions/false_class_spec.rb +2 -9
- data/spec/mongoid/extensions/float_spec.rb +56 -84
- data/spec/mongoid/extensions/hash_spec.rb +45 -219
- data/spec/mongoid/extensions/integer_spec.rb +53 -73
- data/spec/mongoid/extensions/module_spec.rb +1 -1
- data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
- data/spec/mongoid/extensions/object_id_spec.rb +1 -1
- data/spec/mongoid/extensions/object_spec.rb +1 -177
- data/spec/mongoid/extensions/range_spec.rb +254 -64
- data/spec/mongoid/extensions/raw_value_spec.rb +67 -0
- data/spec/mongoid/extensions/regexp_spec.rb +59 -34
- data/spec/mongoid/extensions/set_spec.rb +105 -1
- data/spec/mongoid/extensions/string_spec.rb +21 -104
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +1 -1
- data/spec/mongoid/extensions/symbol_spec.rb +15 -53
- data/spec/mongoid/extensions/time_spec.rb +345 -131
- data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -107
- data/spec/mongoid/extensions/true_class_spec.rb +2 -9
- data/spec/mongoid/factory_spec.rb +63 -2
- data/spec/mongoid/fields/foreign_key_spec.rb +282 -120
- data/spec/mongoid/fields/localized_spec.rb +85 -42
- data/spec/mongoid/fields/standard_spec.rb +1 -1
- data/spec/mongoid/fields_spec.rb +826 -121
- data/spec/mongoid/findable_spec.rb +442 -80
- data/spec/mongoid/indexable/specification_spec.rb +132 -14
- data/spec/mongoid/indexable_spec.rb +361 -23
- data/spec/mongoid/inspectable_spec.rb +93 -5
- data/spec/mongoid/interceptable_spec.rb +926 -116
- data/spec/mongoid/interceptable_spec_models.rb +236 -4
- data/spec/mongoid/loading_spec.rb +110 -0
- data/spec/mongoid/loggable_spec.rb +1 -1
- data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
- data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +68 -88
- data/spec/mongoid/matcher/extract_attribute_spec.rb +5 -15
- data/spec/mongoid/mongoizable_spec.rb +286 -0
- data/spec/mongoid/monkey_patches_spec.rb +211 -0
- data/spec/mongoid/persistable/creatable_spec.rb +5 -5
- data/spec/mongoid/persistable/deletable_spec.rb +267 -27
- data/spec/mongoid/persistable/destroyable_spec.rb +409 -24
- data/spec/mongoid/persistable/incrementable_spec.rb +46 -9
- data/spec/mongoid/persistable/logical_spec.rb +42 -5
- data/spec/mongoid/persistable/maxable_spec.rb +147 -0
- data/spec/mongoid/persistable/minable_spec.rb +147 -0
- data/spec/mongoid/persistable/multipliable_spec.rb +227 -0
- data/spec/mongoid/persistable/poppable_spec.rb +41 -5
- data/spec/mongoid/persistable/pullable_spec.rb +81 -9
- data/spec/mongoid/persistable/pushable_spec.rb +81 -9
- data/spec/mongoid/persistable/renamable_spec.rb +40 -4
- data/spec/mongoid/persistable/savable_spec.rb +114 -20
- data/spec/mongoid/persistable/settable_spec.rb +77 -10
- data/spec/mongoid/persistable/unsettable_spec.rb +41 -5
- data/spec/mongoid/persistable/updatable_spec.rb +64 -52
- data/spec/mongoid/persistable/upsertable_spec.rb +124 -4
- data/spec/mongoid/persistable_spec.rb +4 -4
- data/spec/mongoid/persistence_context_spec.rb +58 -59
- data/spec/mongoid/positional_spec.rb +1 -1
- data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +24 -0
- data/spec/mongoid/railties/console_sandbox_spec.rb +44 -0
- data/spec/mongoid/relations/proxy_spec.rb +7 -7
- data/spec/mongoid/reloadable_spec.rb +255 -30
- data/spec/mongoid/scopable_spec.rb +198 -58
- data/spec/mongoid/search_indexable_spec.rb +147 -0
- data/spec/mongoid/selectable_spec.rb +7 -7
- data/spec/mongoid/serializable_spec.rb +19 -40
- data/spec/mongoid/shardable_models.rb +15 -0
- data/spec/mongoid/shardable_spec.rb +181 -31
- data/spec/mongoid/stateful_spec.rb +152 -10
- data/spec/mongoid/tasks/database_rake_spec.rb +193 -42
- data/spec/mongoid/tasks/database_spec.rb +175 -2
- data/spec/mongoid/tasks/encryption_spec.rb +187 -0
- data/spec/mongoid/threaded_spec.rb +40 -3
- data/spec/mongoid/timestamps/created/short_spec.rb +2 -2
- data/spec/mongoid/timestamps/created_spec.rb +2 -2
- data/spec/mongoid/timestamps/timeless_spec.rb +3 -3
- data/spec/mongoid/timestamps/updated/short_spec.rb +4 -4
- data/spec/mongoid/timestamps/updated_spec.rb +4 -4
- data/spec/mongoid/timestamps_spec.rb +399 -11
- data/spec/mongoid/timestamps_spec_models.rb +68 -0
- data/spec/mongoid/touchable_spec.rb +971 -54
- data/spec/mongoid/touchable_spec_models.rb +154 -0
- data/spec/mongoid/traversable_spec.rb +79 -37
- data/spec/mongoid/validatable/associated_spec.rb +14 -31
- data/spec/mongoid/validatable/format_spec.rb +1 -1
- data/spec/mongoid/validatable/length_spec.rb +1 -1
- data/spec/mongoid/validatable/numericality_spec.rb +1 -1
- data/spec/mongoid/validatable/presence_spec.rb +27 -23
- data/spec/mongoid/validatable/uniqueness_spec.rb +170 -99
- data/spec/mongoid/validatable_spec.rb +4 -4
- data/spec/mongoid/warnings_spec.rb +36 -0
- data/spec/mongoid_spec.rb +61 -11
- data/spec/rails/controller_extension/controller_runtime_spec.rb +3 -3
- data/spec/rails/mongoid_spec.rb +28 -132
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/bin/s3-copy +45 -0
- data/spec/shared/bin/s3-upload +69 -0
- data/spec/shared/lib/mrss/cluster_config.rb +24 -4
- data/spec/shared/lib/mrss/constraints.rb +77 -29
- data/spec/shared/lib/mrss/docker_runner.rb +40 -4
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +64 -1
- data/spec/shared/lib/mrss/server_version_registry.rb +78 -34
- data/spec/shared/lib/mrss/session_registry.rb +69 -0
- data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
- data/spec/shared/lib/mrss/utils.rb +37 -0
- data/spec/shared/share/Dockerfile.erb +123 -71
- data/spec/shared/share/haproxy-1.conf +16 -0
- data/spec/shared/share/haproxy-2.conf +17 -0
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/distro.sh +2 -1
- data/spec/shared/shlib/server.sh +187 -40
- data/spec/shared/shlib/set_env.sh +49 -31
- data/spec/spec_helper.rb +46 -49
- data/spec/support/authorization.rb +1 -1
- data/spec/support/client_registry.rb +10 -0
- data/spec/support/constraints.rb +25 -1
- data/spec/support/crypt/models.rb +50 -0
- data/spec/support/crypt.rb +80 -0
- data/spec/support/expectations.rb +1 -1
- data/spec/support/feature_sandbox.rb +72 -0
- data/spec/support/helpers.rb +1 -0
- data/spec/support/immutable_ids.rb +119 -0
- data/spec/support/macros.rb +107 -1
- data/spec/support/models/account.rb +2 -2
- data/spec/support/models/acolyte.rb +1 -1
- data/spec/support/models/actor.rb +1 -1
- data/spec/support/models/actress.rb +1 -1
- data/spec/support/models/address.rb +7 -1
- data/spec/support/models/address_component.rb +1 -1
- data/spec/support/models/address_number.rb +1 -1
- data/spec/support/models/agency.rb +1 -1
- data/spec/support/models/agent.rb +1 -1
- data/spec/support/models/album.rb +1 -1
- data/spec/support/models/alert.rb +1 -1
- data/spec/support/models/animal.rb +1 -1
- data/spec/support/models/answer.rb +1 -1
- data/spec/support/models/appointment.rb +1 -1
- data/spec/support/models/armrest.rb +1 -1
- data/spec/support/models/array_field.rb +1 -1
- data/spec/support/models/article.rb +1 -1
- data/spec/support/models/artist.rb +3 -2
- data/spec/support/models/artwork.rb +1 -1
- data/spec/support/models/audible_sound.rb +4 -0
- data/spec/support/models/audio.rb +1 -1
- data/spec/support/models/augmentation.rb +13 -1
- data/spec/support/models/author.rb +1 -1
- data/spec/support/models/baby.rb +1 -1
- data/spec/support/models/band.rb +13 -1
- data/spec/support/models/bar.rb +1 -1
- data/spec/support/models/basic.rb +1 -1
- data/spec/support/models/bed.rb +1 -1
- data/spec/support/models/big_palette.rb +1 -1
- data/spec/support/models/birthday.rb +1 -1
- data/spec/support/models/bolt.rb +8 -0
- data/spec/support/models/bomb.rb +1 -1
- data/spec/support/models/book.rb +2 -1
- data/spec/support/models/breed.rb +1 -1
- data/spec/support/models/browser.rb +1 -1
- data/spec/support/models/building.rb +3 -1
- data/spec/support/models/building_address.rb +1 -1
- data/spec/support/models/bus.rb +1 -1
- data/spec/support/models/business.rb +1 -1
- data/spec/support/models/callback_test.rb +1 -1
- data/spec/support/models/canvas.rb +1 -1
- data/spec/support/models/car.rb +1 -1
- data/spec/support/models/cat.rb +1 -1
- data/spec/support/models/catalog.rb +25 -0
- data/spec/support/models/category.rb +1 -1
- data/spec/support/models/child.rb +1 -1
- data/spec/support/models/child_doc.rb +4 -4
- data/spec/support/models/church.rb +1 -1
- data/spec/support/models/circle.rb +1 -1
- data/spec/support/models/circuit.rb +1 -1
- data/spec/support/models/circus.rb +4 -1
- data/spec/support/models/code.rb +3 -1
- data/spec/support/models/coding/pull_request.rb +1 -1
- data/spec/support/models/coding.rb +1 -1
- data/spec/support/models/comment.rb +1 -1
- data/spec/support/models/company.rb +1 -1
- data/spec/support/models/consumption_period.rb +1 -1
- data/spec/support/models/contextable_item.rb +1 -1
- data/spec/support/models/contractor.rb +1 -1
- data/spec/support/models/cookie.rb +1 -1
- data/spec/support/models/country_code.rb +3 -1
- data/spec/support/models/courier_job.rb +1 -1
- data/spec/support/models/cover.rb +11 -0
- data/spec/support/models/crate.rb +1 -1
- data/spec/support/models/customer.rb +1 -1
- data/spec/support/models/customer_address.rb +1 -1
- data/spec/support/models/deed.rb +1 -1
- data/spec/support/models/definition.rb +1 -1
- data/spec/support/models/delegating_patient.rb +1 -1
- data/spec/support/models/description.rb +1 -1
- data/spec/support/models/dictionary.rb +1 -1
- data/spec/support/models/division.rb +1 -1
- data/spec/support/models/doctor.rb +1 -1
- data/spec/support/models/dog.rb +1 -1
- data/spec/support/models/dokument.rb +1 -1
- data/spec/support/models/draft.rb +1 -1
- data/spec/support/models/dragon.rb +1 -1
- data/spec/support/models/driver.rb +1 -1
- data/spec/support/models/drug.rb +1 -1
- data/spec/support/models/dungeon.rb +1 -1
- data/spec/support/models/edit.rb +1 -1
- data/spec/support/models/email.rb +1 -1
- data/spec/support/models/employer.rb +1 -1
- data/spec/support/models/entry.rb +1 -1
- data/spec/support/models/eraser.rb +1 -1
- data/spec/support/models/even.rb +1 -1
- data/spec/support/models/event.rb +1 -1
- data/spec/support/models/exhibition.rb +1 -1
- data/spec/support/models/exhibitor.rb +1 -1
- data/spec/support/models/explosion.rb +1 -1
- data/spec/support/models/eye.rb +1 -1
- data/spec/support/models/eye_bowl.rb +1 -1
- data/spec/support/models/face.rb +1 -1
- data/spec/support/models/fanatic.rb +9 -0
- data/spec/support/models/favorite.rb +8 -2
- data/spec/support/models/filesystem.rb +1 -1
- data/spec/support/models/fire_hydrant.rb +1 -1
- data/spec/support/models/firefox.rb +1 -1
- data/spec/support/models/fish.rb +1 -1
- data/spec/support/models/folder.rb +1 -1
- data/spec/support/models/folder_item.rb +1 -1
- data/spec/support/models/fruits.rb +1 -1
- data/spec/support/models/game.rb +1 -1
- data/spec/support/models/ghost.rb +1 -1
- data/spec/support/models/guitar.rb +1 -1
- data/spec/support/models/hole.rb +13 -0
- data/spec/support/models/home.rb +1 -1
- data/spec/support/models/house.rb +1 -1
- data/spec/support/models/html_writer.rb +1 -1
- data/spec/support/models/id_key.rb +1 -1
- data/spec/support/models/idnodef.rb +1 -1
- data/spec/support/models/image.rb +1 -1
- data/spec/support/models/implant.rb +10 -1
- data/spec/support/models/instrument.rb +1 -1
- data/spec/support/models/item.rb +1 -1
- data/spec/support/models/jar.rb +1 -1
- data/spec/support/models/kaleidoscope.rb +1 -1
- data/spec/support/models/kangaroo.rb +1 -1
- data/spec/support/models/label.rb +5 -2
- data/spec/support/models/language.rb +1 -1
- data/spec/support/models/lat_lng.rb +1 -1
- data/spec/support/models/league.rb +1 -1
- data/spec/support/models/learner.rb +1 -1
- data/spec/support/models/line_item.rb +1 -1
- data/spec/support/models/location.rb +1 -1
- data/spec/support/models/login.rb +1 -1
- data/spec/support/models/manufacturer.rb +1 -1
- data/spec/support/models/meat.rb +1 -1
- data/spec/support/models/membership.rb +2 -1
- data/spec/support/models/message.rb +1 -1
- data/spec/support/models/minim.rb +1 -1
- data/spec/support/models/mixed_drink.rb +1 -1
- data/spec/support/models/mop.rb +10 -1
- data/spec/support/models/movie.rb +1 -1
- data/spec/support/models/my_hash.rb +1 -1
- data/spec/support/models/name.rb +11 -1
- data/spec/support/models/name_only.rb +1 -1
- data/spec/support/models/node.rb +1 -1
- data/spec/support/models/note.rb +1 -1
- data/spec/support/models/nut.rb +8 -0
- data/spec/support/models/odd.rb +1 -1
- data/spec/support/models/order.rb +3 -1
- data/spec/support/models/ordered_post.rb +2 -2
- data/spec/support/models/ordered_preference.rb +1 -1
- data/spec/support/models/oscar.rb +1 -1
- data/spec/support/models/other_owner_object.rb +1 -1
- data/spec/support/models/override.rb +1 -1
- data/spec/support/models/ownable.rb +1 -1
- data/spec/support/models/owner.rb +1 -1
- data/spec/support/models/pack.rb +1 -1
- data/spec/support/models/page.rb +1 -1
- data/spec/support/models/page_question.rb +1 -1
- data/spec/support/models/palette.rb +1 -1
- data/spec/support/models/parent.rb +1 -1
- data/spec/support/models/parent_doc.rb +1 -1
- data/spec/support/models/passport.rb +15 -1
- data/spec/support/models/patient.rb +1 -1
- data/spec/support/models/pdf_writer.rb +1 -1
- data/spec/support/models/pencil.rb +1 -1
- data/spec/support/models/person.rb +19 -1
- data/spec/support/models/pet.rb +1 -1
- data/spec/support/models/pet_owner.rb +1 -1
- data/spec/support/models/phone.rb +3 -2
- data/spec/support/models/piano.rb +1 -1
- data/spec/support/models/pizza.rb +1 -1
- data/spec/support/models/player.rb +3 -1
- data/spec/support/models/post.rb +1 -1
- data/spec/support/models/post_genre.rb +1 -1
- data/spec/support/models/powerup.rb +13 -1
- data/spec/support/models/preference.rb +1 -1
- data/spec/support/models/princess.rb +1 -1
- data/spec/support/models/product.rb +2 -1
- data/spec/support/models/profile.rb +1 -1
- data/spec/support/models/pronunciation.rb +1 -1
- data/spec/support/models/pub.rb +1 -1
- data/spec/support/models/publication/encyclopedia.rb +1 -1
- data/spec/support/models/publication/review.rb +1 -1
- data/spec/support/models/publication.rb +1 -1
- data/spec/support/models/purchase.rb +1 -1
- data/spec/support/models/purchased_item.rb +11 -0
- data/spec/support/models/purse.rb +9 -0
- data/spec/support/models/question.rb +1 -1
- data/spec/support/models/quiz.rb +1 -1
- data/spec/support/models/rating.rb +1 -1
- data/spec/support/models/record.rb +1 -1
- data/spec/support/models/registry.rb +2 -1
- data/spec/support/models/role.rb +1 -1
- data/spec/support/models/root_category.rb +1 -1
- data/spec/support/models/sandbox/app/models/app_models_message.rb +4 -0
- data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
- data/spec/support/models/sandbox/sandbox_message.rb +4 -0
- data/spec/support/models/sandbox/sandbox_user.rb +4 -0
- data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
- data/spec/support/models/sandwich.rb +1 -1
- data/spec/support/models/scheduler.rb +1 -1
- data/spec/support/models/school.rb +15 -0
- data/spec/support/models/scribe.rb +1 -1
- data/spec/support/models/sealer.rb +8 -0
- data/spec/support/models/seat.rb +1 -1
- data/spec/support/models/seo.rb +1 -1
- data/spec/support/models/series.rb +1 -1
- data/spec/support/models/server.rb +1 -1
- data/spec/support/models/service.rb +1 -1
- data/spec/support/models/shape.rb +1 -1
- data/spec/support/models/shelf.rb +1 -1
- data/spec/support/models/shield.rb +19 -0
- data/spec/support/models/shipment_address.rb +1 -1
- data/spec/support/models/shipping_container.rb +1 -1
- data/spec/support/models/shipping_pack.rb +1 -1
- data/spec/support/models/shirt.rb +12 -0
- data/spec/support/models/shop.rb +1 -1
- data/spec/support/models/short_agent.rb +1 -1
- data/spec/support/models/short_quiz.rb +1 -1
- data/spec/support/models/simple.rb +1 -1
- data/spec/support/models/slave.rb +1 -1
- data/spec/support/models/song.rb +1 -1
- data/spec/support/models/sound.rb +1 -1
- data/spec/support/models/spacer.rb +8 -0
- data/spec/support/models/square.rb +1 -1
- data/spec/support/models/staff.rb +1 -1
- data/spec/support/models/store_as_dup_test1.rb +1 -1
- data/spec/support/models/store_as_dup_test2.rb +1 -1
- data/spec/support/models/store_as_dup_test3.rb +1 -1
- data/spec/support/models/store_as_dup_test4.rb +1 -1
- data/spec/support/models/strategy.rb +1 -1
- data/spec/support/models/student.rb +15 -0
- data/spec/support/models/sub_item.rb +1 -1
- data/spec/support/models/subscription.rb +1 -1
- data/spec/support/models/survey.rb +1 -1
- data/spec/support/models/symptom.rb +1 -1
- data/spec/support/models/system_role.rb +1 -0
- data/spec/support/models/tag.rb +1 -1
- data/spec/support/models/target.rb +1 -1
- data/spec/support/models/template.rb +1 -1
- data/spec/support/models/thing.rb +1 -1
- data/spec/support/models/threadlocker.rb +8 -0
- data/spec/support/models/title.rb +1 -1
- data/spec/support/models/tool.rb +1 -1
- data/spec/support/models/topping.rb +1 -1
- data/spec/support/models/toy.rb +1 -1
- data/spec/support/models/track.rb +1 -1
- data/spec/support/models/translation.rb +1 -1
- data/spec/support/models/tree.rb +1 -1
- data/spec/support/models/truck.rb +1 -1
- data/spec/support/models/updatable.rb +1 -1
- data/spec/support/models/user.rb +1 -1
- data/spec/support/models/user_account.rb +1 -1
- data/spec/support/models/validation_callback.rb +1 -1
- data/spec/support/models/vehicle.rb +1 -1
- data/spec/support/models/version.rb +1 -1
- data/spec/support/models/vertex.rb +1 -1
- data/spec/support/models/vet_visit.rb +1 -1
- data/spec/support/models/video.rb +1 -1
- data/spec/support/models/video_game.rb +1 -1
- data/spec/support/models/washer.rb +8 -0
- data/spec/support/models/weapon.rb +13 -1
- data/spec/support/models/wiki_page.rb +1 -1
- data/spec/support/models/word.rb +1 -1
- data/spec/support/models/word_origin.rb +1 -1
- data/spec/support/models/writer.rb +1 -1
- data/spec/support/rails_mock.rb +32 -0
- data/spec/support/schema_maps/schema_map_aws.json +17 -0
- data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_azure.json +17 -0
- data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_gcp.json +17 -0
- data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_kmip.json +17 -0
- data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_local.json +18 -0
- data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/shared/time.rb +3 -22
- data/spec/support/sinatra_mock.rb +7 -0
- data/spec/support/spec_config.rb +42 -7
- data.tar.gz.sig +0 -0
- metadata +883 -562
- metadata.gz.sig +0 -0
- data/lib/mongoid/association/referenced/eager.rb +0 -184
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -128
- data/lib/mongoid/contextual/geo_near.rb +0 -269
- data/lib/mongoid/errors/eager_load.rb +0 -26
- data/lib/mongoid/errors/invalid_session_use.rb +0 -26
- data/lib/mongoid/errors/invalid_storage_parent.rb +0 -28
- data/lib/mongoid/errors/invalid_value.rb +0 -18
- data/lib/mongoid/query_cache.rb +0 -333
- data/lib/support/ruby_version.rb +0 -29
- data/spec/mongoid/contextual/geo_near_spec.rb +0 -472
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -61
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -61
- data/spec/mongoid/extensions_spec.rb +0 -32
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -61
- data/spec/mongoid/query_cache_spec.rb +0 -978
- data/spec/support/cluster_config.rb +0 -158
- data/spec/support/session_registry.rb +0 -50
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'optparse'
|
|
4
|
+
|
|
5
|
+
def parse_data_key_options(argv = ARGV)
|
|
6
|
+
# The only way to use OptionParser to parse custom options in rake is
|
|
7
|
+
# to pass an empty argument ("--") before specifying them, e.g.:
|
|
8
|
+
#
|
|
9
|
+
# rake db:mongoid:encryption:create_data_key -- --client default
|
|
10
|
+
#
|
|
11
|
+
# Otherwise, rake complains about an unknown option. Thus, we can tell
|
|
12
|
+
# if the argument list is valid for us to parse by detecting this empty
|
|
13
|
+
# argument.
|
|
14
|
+
#
|
|
15
|
+
# (This works around an issue in the tests, where the specs are loading
|
|
16
|
+
# the tasks directly to test them, but the option parser is then picking
|
|
17
|
+
# up rspec command-line arguments and raising an exception).
|
|
18
|
+
return {} unless argv.include?('--')
|
|
19
|
+
|
|
20
|
+
{}.tap do |options|
|
|
21
|
+
parser = OptionParser.new do |opts|
|
|
22
|
+
opts.on('-c', '--client CLIENT', 'Name of the client to use') do |v|
|
|
23
|
+
options[:client_name] = v
|
|
24
|
+
end
|
|
25
|
+
opts.on('-p', '--provider PROVIDER', 'KMS provider to use') do |v|
|
|
26
|
+
options[:kms_provider_name] = v
|
|
27
|
+
end
|
|
28
|
+
opts.on('-n', '--key-alt-name KEY_ALT_NAME', 'Alternate name for the key') do |v|
|
|
29
|
+
options[:key_alt_name] = v
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
# rubocop:disable Lint/EmptyBlock
|
|
33
|
+
parser.parse!(parser.order!(argv) {})
|
|
34
|
+
# rubocop:enable Lint/EmptyBlock
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
namespace :db do
|
|
39
|
+
namespace :mongoid do
|
|
40
|
+
namespace :encryption do
|
|
41
|
+
desc 'Create encryption key'
|
|
42
|
+
task create_data_key: [ :environment ] do
|
|
43
|
+
options = parse_data_key_options
|
|
44
|
+
result = Mongoid::Tasks::Encryption.create_data_key(
|
|
45
|
+
client_name: options[:client_name],
|
|
46
|
+
kms_provider_name: options[:kms_provider_name],
|
|
47
|
+
key_alt_name: options[:key_alt_name]
|
|
48
|
+
)
|
|
49
|
+
output = [].tap do |lines|
|
|
50
|
+
lines << "Created data key with id: '#{result[:key_id]}'"
|
|
51
|
+
lines << "with key alt name: '#{result[:key_alt_name]}'" if result[:key_alt_name]
|
|
52
|
+
lines << "for kms provider: '#{result[:kms_provider]}'"
|
|
53
|
+
lines << "in key vault: '#{result[:key_vault_namespace]}'."
|
|
54
|
+
end
|
|
55
|
+
puts output.join(' ')
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# rubocop:todo all
|
|
3
|
+
|
|
4
|
+
module Mongoid
|
|
5
|
+
module Tasks
|
|
6
|
+
# This module contains helper methods for data encryption.
|
|
7
|
+
module Encryption
|
|
8
|
+
extend self
|
|
9
|
+
|
|
10
|
+
# Create a data encryption key for the given kms provider using the
|
|
11
|
+
# auto_encryption_options from the client's configuration.
|
|
12
|
+
#
|
|
13
|
+
# @param [ String | nil ] kms_provider_name The name of the kms provider
|
|
14
|
+
# to use. If not provided, the first provider in the client's
|
|
15
|
+
# auto_encryption_options will be used.
|
|
16
|
+
# @param [ String | nil ] client_name The name of the client to take
|
|
17
|
+
# auto_encryption_options from. If not provided, the default client
|
|
18
|
+
# will be used.
|
|
19
|
+
# @param [ String | nil ] key_alt_name The alternate name of the key.
|
|
20
|
+
#
|
|
21
|
+
# @return [ Hash ] A hash containing the key id as :key_id,
|
|
22
|
+
# kms provider name as :kms_provider, and key vault namespace as
|
|
23
|
+
# :key_vault_namespace.
|
|
24
|
+
def create_data_key(client_name: nil, kms_provider_name: nil, key_alt_name: nil)
|
|
25
|
+
kms_provider_name, kms_providers, key_vault_namespace = prepare_arguments(
|
|
26
|
+
kms_provider_name,
|
|
27
|
+
client_name
|
|
28
|
+
)
|
|
29
|
+
key_vault_client = Mongoid::Clients.default.with(database: key_vault_namespace.split('.').first)
|
|
30
|
+
client_encryption = Mongo::ClientEncryption.new(
|
|
31
|
+
key_vault_client,
|
|
32
|
+
key_vault_namespace: key_vault_namespace,
|
|
33
|
+
kms_providers: kms_providers
|
|
34
|
+
)
|
|
35
|
+
client_encryption_opts = {}.tap do |opts|
|
|
36
|
+
opts[:key_alt_names] = [key_alt_name] if key_alt_name
|
|
37
|
+
end
|
|
38
|
+
data_key_id = client_encryption.create_data_key(kms_provider_name, client_encryption_opts)
|
|
39
|
+
{
|
|
40
|
+
key_id: Base64.strict_encode64(data_key_id.data),
|
|
41
|
+
kms_provider: kms_provider_name,
|
|
42
|
+
key_vault_namespace: key_vault_namespace,
|
|
43
|
+
key_alt_name: key_alt_name
|
|
44
|
+
}.compact
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
# Prepare arguments needed to create a data key from the client's
|
|
50
|
+
# auto_encryption_options.
|
|
51
|
+
#
|
|
52
|
+
# @param [ String | nil ] kms_provider_name The name of the kms provider.
|
|
53
|
+
# @param [ String | nil ] client_name The name of the client.
|
|
54
|
+
#
|
|
55
|
+
# @return [ Array<String, Hash, String> ] An array containing the
|
|
56
|
+
# normalized kms provider name, the kms providers hash, and the key
|
|
57
|
+
# vault namespace.
|
|
58
|
+
def prepare_arguments(kms_provider_name, client_name)
|
|
59
|
+
client = (client_name || 'default').to_s
|
|
60
|
+
client_options = Mongoid.clients[client]
|
|
61
|
+
unless client_options.is_a?(Hash)
|
|
62
|
+
raise Errors::NoClientConfig.new(client)
|
|
63
|
+
end
|
|
64
|
+
auto_encryption_options = client_options.dig(:options, :auto_encryption_options)
|
|
65
|
+
unless auto_encryption_options.is_a?(Hash)
|
|
66
|
+
raise Errors::InvalidAutoEncryptionConfiguration.new(client)
|
|
67
|
+
end
|
|
68
|
+
key_vault_namespace = auto_encryption_options[:key_vault_namespace]
|
|
69
|
+
unless key_vault_namespace.is_a?(String)
|
|
70
|
+
raise Errors::InvalidAutoEncryptionConfiguration.new(client)
|
|
71
|
+
end
|
|
72
|
+
kms_providers = auto_encryption_options[:kms_providers]
|
|
73
|
+
unless kms_providers.is_a?(Hash)
|
|
74
|
+
raise Errors::InvalidAutoEncryptionConfiguration.new(client)
|
|
75
|
+
end
|
|
76
|
+
valid_kms_provider_name = get_kms_provider_name(kms_provider_name, kms_providers)
|
|
77
|
+
unless kms_providers.key?(valid_kms_provider_name)
|
|
78
|
+
raise Errors::InvalidAutoEncryptionConfiguration.new(client, valid_kms_provider_name)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
[valid_kms_provider_name, kms_providers, key_vault_namespace]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Get kms provider name to use for creating a data key.
|
|
85
|
+
#
|
|
86
|
+
# If kms_provider_name is provided, it will be used. Otherwise, if there
|
|
87
|
+
# is only one kms provider, that provider will be used. Otherwise, an
|
|
88
|
+
# error will be raised.
|
|
89
|
+
#
|
|
90
|
+
# @param [ String | nil ] kms_provider_name The name of the kms provider
|
|
91
|
+
# as provided by the user.
|
|
92
|
+
# @param [ Hash ] kms_providers The kms providers hash from the client's
|
|
93
|
+
# auto_encryption_options.
|
|
94
|
+
#
|
|
95
|
+
# @return [ String ] The kms provider name to use for creating a data
|
|
96
|
+
# key.
|
|
97
|
+
def get_kms_provider_name(kms_provider_name, kms_providers)
|
|
98
|
+
if kms_provider_name
|
|
99
|
+
kms_provider_name
|
|
100
|
+
elsif kms_providers.keys.length == 1
|
|
101
|
+
kms_providers.keys.first
|
|
102
|
+
else
|
|
103
|
+
raise ArgumentError, 'kms_provider_name must be provided when there are multiple kms providers'
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
#
|
|
2
|
+
# rubocop:todo all
|
|
3
3
|
|
|
4
4
|
module Mongoid
|
|
5
5
|
module Threaded
|
|
@@ -26,8 +26,6 @@ module Mongoid
|
|
|
26
26
|
# end
|
|
27
27
|
#
|
|
28
28
|
# @return [ Object ] The yielded value.
|
|
29
|
-
#
|
|
30
|
-
# @since 2.2.0
|
|
31
29
|
def _assigning
|
|
32
30
|
Threaded.begin_execution(ASSIGN)
|
|
33
31
|
yield
|
|
@@ -40,9 +38,7 @@ module Mongoid
|
|
|
40
38
|
# @example Is the current thread in assigning mode?
|
|
41
39
|
# proxy._assigning?
|
|
42
40
|
#
|
|
43
|
-
# @return [ true
|
|
44
|
-
#
|
|
45
|
-
# @since 2.1.0
|
|
41
|
+
# @return [ true | false ] If the thread is assigning.
|
|
46
42
|
def _assigning?
|
|
47
43
|
Threaded.executing?(ASSIGN)
|
|
48
44
|
end
|
|
@@ -55,8 +51,6 @@ module Mongoid
|
|
|
55
51
|
# end
|
|
56
52
|
#
|
|
57
53
|
# @return [ Object ] The return value of the block.
|
|
58
|
-
#
|
|
59
|
-
# @since 2.1.0
|
|
60
54
|
def _binding
|
|
61
55
|
Threaded.begin_execution(BIND)
|
|
62
56
|
yield
|
|
@@ -69,9 +63,7 @@ module Mongoid
|
|
|
69
63
|
# @example Is the current thread in binding mode?
|
|
70
64
|
# proxy.binding?
|
|
71
65
|
#
|
|
72
|
-
# @return [ true
|
|
73
|
-
#
|
|
74
|
-
# @since 2.1.0
|
|
66
|
+
# @return [ true | false ] If the thread is binding.
|
|
75
67
|
def _binding?
|
|
76
68
|
Threaded.executing?(BIND)
|
|
77
69
|
end
|
|
@@ -84,8 +76,6 @@ module Mongoid
|
|
|
84
76
|
# end
|
|
85
77
|
#
|
|
86
78
|
# @return [ Object ] The return value of the block.
|
|
87
|
-
#
|
|
88
|
-
# @since 2.1.0
|
|
89
79
|
def _building
|
|
90
80
|
Threaded.begin_execution(BUILD)
|
|
91
81
|
yield
|
|
@@ -98,9 +88,7 @@ module Mongoid
|
|
|
98
88
|
# @example Is the current thread in building mode?
|
|
99
89
|
# proxy._building?
|
|
100
90
|
#
|
|
101
|
-
# @return [ true
|
|
102
|
-
#
|
|
103
|
-
# @since 2.1.0
|
|
91
|
+
# @return [ true | false ] If the thread is building.
|
|
104
92
|
def _building?
|
|
105
93
|
Threaded.executing?(BUILD)
|
|
106
94
|
end
|
|
@@ -110,9 +98,7 @@ module Mongoid
|
|
|
110
98
|
# @example Is the current thread in creating mode?
|
|
111
99
|
# proxy.creating?
|
|
112
100
|
#
|
|
113
|
-
# @return [ true
|
|
114
|
-
#
|
|
115
|
-
# @since 2.1.0
|
|
101
|
+
# @return [ true | false ] If the thread is creating.
|
|
116
102
|
def _creating?
|
|
117
103
|
Threaded.executing?(CREATE)
|
|
118
104
|
end
|
|
@@ -125,8 +111,6 @@ module Mongoid
|
|
|
125
111
|
# end
|
|
126
112
|
#
|
|
127
113
|
# @return [ Object ] The return value of the block.
|
|
128
|
-
#
|
|
129
|
-
# @since 2.3.2
|
|
130
114
|
def _loading
|
|
131
115
|
Threaded.begin_execution(LOAD)
|
|
132
116
|
yield
|
|
@@ -139,9 +123,7 @@ module Mongoid
|
|
|
139
123
|
# @example Is the current thread in loading mode?
|
|
140
124
|
# proxy._loading?
|
|
141
125
|
#
|
|
142
|
-
# @return [ true
|
|
143
|
-
#
|
|
144
|
-
# @since 2.3.2
|
|
126
|
+
# @return [ true | false ] If the thread is loading.
|
|
145
127
|
def _loading?
|
|
146
128
|
Threaded.executing?(LOAD)
|
|
147
129
|
end
|
|
@@ -156,8 +138,6 @@ module Mongoid
|
|
|
156
138
|
# end
|
|
157
139
|
#
|
|
158
140
|
# @return [ Object ] The return value of the block.
|
|
159
|
-
#
|
|
160
|
-
# @since 2.1.0
|
|
161
141
|
def _creating
|
|
162
142
|
Threaded.begin_execution(CREATE)
|
|
163
143
|
yield
|
data/lib/mongoid/threaded.rb
CHANGED
|
@@ -1,38 +1,39 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# encoding: utf-8
|
|
3
2
|
|
|
4
|
-
require
|
|
3
|
+
require 'mongoid/threaded/lifecycle'
|
|
5
4
|
|
|
6
5
|
module Mongoid
|
|
7
|
-
|
|
8
6
|
# This module contains logic for easy access to objects that have a lifecycle
|
|
9
7
|
# on the current thread.
|
|
10
8
|
module Threaded
|
|
11
|
-
|
|
12
|
-
DATABASE_OVERRIDE_KEY = "[mongoid]:db-override"
|
|
9
|
+
DATABASE_OVERRIDE_KEY = '[mongoid]:db-override'
|
|
13
10
|
|
|
14
11
|
# Constant for the key to store clients.
|
|
15
|
-
|
|
16
|
-
# @since 5.0.0
|
|
17
|
-
CLIENTS_KEY = "[mongoid]:clients"
|
|
12
|
+
CLIENTS_KEY = '[mongoid]:clients'
|
|
18
13
|
|
|
19
14
|
# The key to override the client.
|
|
20
|
-
|
|
21
|
-
# @since 5.0.0
|
|
22
|
-
CLIENT_OVERRIDE_KEY = "[mongoid]:client-override"
|
|
15
|
+
CLIENT_OVERRIDE_KEY = '[mongoid]:client-override'
|
|
23
16
|
|
|
24
17
|
# The key for the current thread's scope stack.
|
|
25
|
-
|
|
26
|
-
# @since 2.0.0
|
|
27
|
-
CURRENT_SCOPE_KEY = "[mongoid]:current-scope"
|
|
18
|
+
CURRENT_SCOPE_KEY = '[mongoid]:current-scope'
|
|
28
19
|
|
|
29
|
-
AUTOSAVES_KEY =
|
|
30
|
-
VALIDATIONS_KEY =
|
|
20
|
+
AUTOSAVES_KEY = '[mongoid]:autosaves'
|
|
21
|
+
VALIDATIONS_KEY = '[mongoid]:validations'
|
|
31
22
|
|
|
32
23
|
STACK_KEYS = Hash.new do |hash, key|
|
|
33
24
|
hash[key] = "[mongoid]:#{key}-stack"
|
|
34
25
|
end
|
|
35
26
|
|
|
27
|
+
# The key for the current thread's sessions.
|
|
28
|
+
SESSIONS_KEY = '[mongoid]:sessions'
|
|
29
|
+
|
|
30
|
+
# The key for storing documents modified inside transactions.
|
|
31
|
+
MODIFIED_DOCUMENTS_KEY = '[mongoid]:modified-documents'
|
|
32
|
+
|
|
33
|
+
# The key storing the default value for whether or not callbacks are
|
|
34
|
+
# executed on documents.
|
|
35
|
+
EXECUTE_CALLBACKS = '[mongoid]:execute-callbacks'
|
|
36
|
+
|
|
36
37
|
extend self
|
|
37
38
|
|
|
38
39
|
# Begin entry into a named thread local stack.
|
|
@@ -43,8 +44,6 @@ module Mongoid
|
|
|
43
44
|
# @param [ String ] name The name of the stack
|
|
44
45
|
#
|
|
45
46
|
# @return [ true ] True.
|
|
46
|
-
#
|
|
47
|
-
# @since 2.4.0
|
|
48
47
|
def begin_execution(name)
|
|
49
48
|
stack(name).push(true)
|
|
50
49
|
end
|
|
@@ -54,9 +53,7 @@ module Mongoid
|
|
|
54
53
|
# @example Get the global database override.
|
|
55
54
|
# Threaded.database_override
|
|
56
55
|
#
|
|
57
|
-
# @return [ String
|
|
58
|
-
#
|
|
59
|
-
# @since 3.0.0
|
|
56
|
+
# @return [ String | Symbol ] The override.
|
|
60
57
|
def database_override
|
|
61
58
|
Thread.current[DATABASE_OVERRIDE_KEY]
|
|
62
59
|
end
|
|
@@ -66,11 +63,9 @@ module Mongoid
|
|
|
66
63
|
# @example Set the global database override.
|
|
67
64
|
# Threaded.database_override = :testing
|
|
68
65
|
#
|
|
69
|
-
# @param [ String
|
|
66
|
+
# @param [ String | Symbol ] name The global override name.
|
|
70
67
|
#
|
|
71
|
-
# @return [ String
|
|
72
|
-
#
|
|
73
|
-
# @since 3.0.0
|
|
68
|
+
# @return [ String | Symbol ] The override.
|
|
74
69
|
def database_override=(name)
|
|
75
70
|
Thread.current[DATABASE_OVERRIDE_KEY] = name
|
|
76
71
|
end
|
|
@@ -83,8 +78,6 @@ module Mongoid
|
|
|
83
78
|
# @param [ Symbol ] name The name of the stack
|
|
84
79
|
#
|
|
85
80
|
# @return [ true ] If the stack is being executed.
|
|
86
|
-
#
|
|
87
|
-
# @since 2.4.0
|
|
88
81
|
def executing?(name)
|
|
89
82
|
!stack(name).empty?
|
|
90
83
|
end
|
|
@@ -97,8 +90,6 @@ module Mongoid
|
|
|
97
90
|
# @param [ Symbol ] name The name of the stack
|
|
98
91
|
#
|
|
99
92
|
# @return [ true ] True.
|
|
100
|
-
#
|
|
101
|
-
# @since 2.4.0
|
|
102
93
|
def exit_execution(name)
|
|
103
94
|
stack(name).pop
|
|
104
95
|
end
|
|
@@ -111,8 +102,6 @@ module Mongoid
|
|
|
111
102
|
# @param [ Symbol ] name The name of the stack
|
|
112
103
|
#
|
|
113
104
|
# @return [ Array ] The stack.
|
|
114
|
-
#
|
|
115
|
-
# @since 2.4.0
|
|
116
105
|
def stack(name)
|
|
117
106
|
Thread.current[STACK_KEYS[name]] ||= []
|
|
118
107
|
end
|
|
@@ -123,8 +112,6 @@ module Mongoid
|
|
|
123
112
|
# Threaded.begin_autosave(doc)
|
|
124
113
|
#
|
|
125
114
|
# @param [ Document ] document The document to autosave.
|
|
126
|
-
#
|
|
127
|
-
# @since 3.0.0
|
|
128
115
|
def begin_autosave(document)
|
|
129
116
|
autosaves_for(document.class).push(document._id)
|
|
130
117
|
end
|
|
@@ -135,8 +122,6 @@ module Mongoid
|
|
|
135
122
|
# Threaded.begin_validate(doc)
|
|
136
123
|
#
|
|
137
124
|
# @param [ Document ] document The document to validate.
|
|
138
|
-
#
|
|
139
|
-
# @since 2.1.9
|
|
140
125
|
def begin_validate(document)
|
|
141
126
|
validations_for(document.class).push(document._id)
|
|
142
127
|
end
|
|
@@ -147,8 +132,6 @@ module Mongoid
|
|
|
147
132
|
# Threaded.exit_autosave(doc)
|
|
148
133
|
#
|
|
149
134
|
# @param [ Document ] document The document to autosave.
|
|
150
|
-
#
|
|
151
|
-
# @since 3.0.0
|
|
152
135
|
def exit_autosave(document)
|
|
153
136
|
autosaves_for(document.class).delete_one(document._id)
|
|
154
137
|
end
|
|
@@ -159,8 +142,6 @@ module Mongoid
|
|
|
159
142
|
# Threaded.exit_validate(doc)
|
|
160
143
|
#
|
|
161
144
|
# @param [ Document ] document The document to validate.
|
|
162
|
-
#
|
|
163
|
-
# @since 2.1.9
|
|
164
145
|
def exit_validate(document)
|
|
165
146
|
validations_for(document.class).delete_one(document._id)
|
|
166
147
|
end
|
|
@@ -194,9 +175,7 @@ module Mongoid
|
|
|
194
175
|
# @example Get the global client override.
|
|
195
176
|
# Threaded.client_override
|
|
196
177
|
#
|
|
197
|
-
# @return [ String
|
|
198
|
-
#
|
|
199
|
-
# @since 5.0.0
|
|
178
|
+
# @return [ String | Symbol ] The override.
|
|
200
179
|
def client_override
|
|
201
180
|
Thread.current[CLIENT_OVERRIDE_KEY]
|
|
202
181
|
end
|
|
@@ -206,11 +185,9 @@ module Mongoid
|
|
|
206
185
|
# @example Set the global client override.
|
|
207
186
|
# Threaded.client_override = :testing
|
|
208
187
|
#
|
|
209
|
-
# @param [ String
|
|
210
|
-
#
|
|
211
|
-
# @return [ String, Symbol ] The override.
|
|
188
|
+
# @param [ String | Symbol ] name The global override name.
|
|
212
189
|
#
|
|
213
|
-
# @
|
|
190
|
+
# @return [ String | Symbol ] The override.
|
|
214
191
|
def client_override=(name)
|
|
215
192
|
Thread.current[CLIENT_OVERRIDE_KEY] = name
|
|
216
193
|
end
|
|
@@ -224,8 +201,6 @@ module Mongoid
|
|
|
224
201
|
# @param [ Klass ] klass The class type of the scope.
|
|
225
202
|
#
|
|
226
203
|
# @return [ Criteria ] The scope.
|
|
227
|
-
#
|
|
228
|
-
# @since 5.0.0
|
|
229
204
|
def current_scope(klass = nil)
|
|
230
205
|
if klass && Thread.current[CURRENT_SCOPE_KEY].respond_to?(:keys)
|
|
231
206
|
Thread.current[CURRENT_SCOPE_KEY][
|
|
@@ -244,8 +219,6 @@ module Mongoid
|
|
|
244
219
|
# @param [ Criteria ] scope The current scope.
|
|
245
220
|
#
|
|
246
221
|
# @return [ Criteria ] The scope.
|
|
247
|
-
#
|
|
248
|
-
# @since 5.0.0
|
|
249
222
|
def current_scope=(scope)
|
|
250
223
|
Thread.current[CURRENT_SCOPE_KEY] = scope
|
|
251
224
|
end
|
|
@@ -259,14 +232,9 @@ module Mongoid
|
|
|
259
232
|
# @param [ Class ] klass The current model class.
|
|
260
233
|
#
|
|
261
234
|
# @return [ Criteria ] The scope.
|
|
262
|
-
#
|
|
263
|
-
# @since 5.0.1
|
|
264
235
|
def set_current_scope(scope, klass)
|
|
265
236
|
if scope.nil?
|
|
266
|
-
|
|
267
|
-
Thread.current[CURRENT_SCOPE_KEY].delete(klass)
|
|
268
|
-
Thread.current[CURRENT_SCOPE_KEY] = nil if Thread.current[CURRENT_SCOPE_KEY].empty?
|
|
269
|
-
end
|
|
237
|
+
unset_current_scope(klass)
|
|
270
238
|
else
|
|
271
239
|
Thread.current[CURRENT_SCOPE_KEY] ||= {}
|
|
272
240
|
Thread.current[CURRENT_SCOPE_KEY][klass] = scope
|
|
@@ -292,9 +260,7 @@ module Mongoid
|
|
|
292
260
|
#
|
|
293
261
|
# @param [ Document ] document The document to check.
|
|
294
262
|
#
|
|
295
|
-
# @return [ true
|
|
296
|
-
#
|
|
297
|
-
# @since 2.1.9
|
|
263
|
+
# @return [ true | false ] If the document is autosaved.
|
|
298
264
|
def autosaved?(document)
|
|
299
265
|
autosaves_for(document.class).include?(document._id)
|
|
300
266
|
end
|
|
@@ -306,9 +272,7 @@ module Mongoid
|
|
|
306
272
|
#
|
|
307
273
|
# @param [ Document ] document The document to check.
|
|
308
274
|
#
|
|
309
|
-
# @return [ true
|
|
310
|
-
#
|
|
311
|
-
# @since 2.1.9
|
|
275
|
+
# @return [ true | false ] If the document is validated.
|
|
312
276
|
def validated?(document)
|
|
313
277
|
validations_for(document.class).include?(document._id)
|
|
314
278
|
end
|
|
@@ -319,8 +283,6 @@ module Mongoid
|
|
|
319
283
|
# Threaded.autosaves
|
|
320
284
|
#
|
|
321
285
|
# @return [ Hash ] The current autosaves.
|
|
322
|
-
#
|
|
323
|
-
# @since 3.0.0
|
|
324
286
|
def autosaves
|
|
325
287
|
Thread.current[AUTOSAVES_KEY] ||= {}
|
|
326
288
|
end
|
|
@@ -331,8 +293,6 @@ module Mongoid
|
|
|
331
293
|
# Threaded.validations
|
|
332
294
|
#
|
|
333
295
|
# @return [ Hash ] The current validations.
|
|
334
|
-
#
|
|
335
|
-
# @since 2.1.9
|
|
336
296
|
def validations
|
|
337
297
|
Thread.current[VALIDATIONS_KEY] ||= {}
|
|
338
298
|
end
|
|
@@ -345,11 +305,10 @@ module Mongoid
|
|
|
345
305
|
# @param [ Class ] klass The class to check.
|
|
346
306
|
#
|
|
347
307
|
# @return [ Array ] The current autosaves.
|
|
348
|
-
#
|
|
349
|
-
# @since 3.0.0
|
|
350
308
|
def autosaves_for(klass)
|
|
351
309
|
autosaves[klass] ||= []
|
|
352
310
|
end
|
|
311
|
+
|
|
353
312
|
# Get all validations on the current thread for the class.
|
|
354
313
|
#
|
|
355
314
|
# @example Get all validations.
|
|
@@ -358,48 +317,128 @@ module Mongoid
|
|
|
358
317
|
# @param [ Class ] klass The class to check.
|
|
359
318
|
#
|
|
360
319
|
# @return [ Array ] The current validations.
|
|
361
|
-
#
|
|
362
|
-
# @since 2.1.9
|
|
363
320
|
def validations_for(klass)
|
|
364
321
|
validations[klass] ||= []
|
|
365
322
|
end
|
|
366
323
|
|
|
367
|
-
# Cache a session for this thread.
|
|
324
|
+
# Cache a session for this thread for a client.
|
|
368
325
|
#
|
|
369
|
-
# @
|
|
370
|
-
#
|
|
326
|
+
# @note For backward compatibility it is allowed to call this method without
|
|
327
|
+
# specifying `client` parameter.
|
|
371
328
|
#
|
|
372
329
|
# @param [ Mongo::Session ] session The session to save.
|
|
373
|
-
#
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
Thread.current[:session] = session
|
|
330
|
+
# @param [ Mongo::Client | nil ] client The client to cache the session for.
|
|
331
|
+
def set_session(session, client: nil)
|
|
332
|
+
sessions[client] = session
|
|
377
333
|
end
|
|
378
334
|
|
|
379
|
-
# Get the cached session for this thread.
|
|
335
|
+
# Get the cached session for this thread for a client.
|
|
380
336
|
#
|
|
381
|
-
# @
|
|
382
|
-
#
|
|
337
|
+
# @note For backward compatibility it is allowed to call this method without
|
|
338
|
+
# specifying `client` parameter.
|
|
383
339
|
#
|
|
384
|
-
# @
|
|
340
|
+
# @param [ Mongo::Client | nil ] client The client to cache the session for.
|
|
385
341
|
#
|
|
386
|
-
# @
|
|
387
|
-
def get_session
|
|
388
|
-
|
|
342
|
+
# @return [ Mongo::Session | nil ] The session cached on this thread or nil.
|
|
343
|
+
def get_session(client: nil)
|
|
344
|
+
sessions[client]
|
|
389
345
|
end
|
|
390
346
|
|
|
391
|
-
# Clear the cached session for this thread.
|
|
347
|
+
# Clear the cached session for this thread for a client.
|
|
392
348
|
#
|
|
393
|
-
# @
|
|
394
|
-
#
|
|
349
|
+
# @note For backward compatibility it is allowed to call this method without
|
|
350
|
+
# specifying `client` parameter.
|
|
351
|
+
#
|
|
352
|
+
# @param [ Mongo::Client | nil ] client The client to clear the session for.
|
|
395
353
|
#
|
|
396
354
|
# @return [ nil ]
|
|
355
|
+
def clear_session(client: nil)
|
|
356
|
+
sessions.delete(client)&.end_session
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
# Store a reference to the document that was modified inside a transaction
|
|
360
|
+
# associated with the session.
|
|
361
|
+
#
|
|
362
|
+
# @param [ Mongo::Session ] session Session in scope of which the document
|
|
363
|
+
# was modified.
|
|
364
|
+
# @param [ Mongoid::Document ] document Mongoid document that was modified.
|
|
365
|
+
def add_modified_document(session, document)
|
|
366
|
+
return unless session&.in_transaction?
|
|
367
|
+
|
|
368
|
+
modified_documents[session] << document
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
# Clears the set of modified documents for the given session, and return the
|
|
372
|
+
# content of the set before the clearance.
|
|
373
|
+
# @param [ Mongo::Session ] session Session for which the modified documents
|
|
374
|
+
# set should be cleared.
|
|
375
|
+
#
|
|
376
|
+
# @return [ Set<Mongoid::Document> ] Collection of modified documents before
|
|
377
|
+
# it was cleared.
|
|
378
|
+
def clear_modified_documents(session)
|
|
379
|
+
modified_documents[session].dup
|
|
380
|
+
ensure
|
|
381
|
+
modified_documents[session].clear
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
# Queries whether document callbacks should be executed by default for the
|
|
385
|
+
# current thread.
|
|
386
|
+
#
|
|
387
|
+
# Unless otherwise indicated (by #execute_callbacks=), this will return
|
|
388
|
+
# true.
|
|
389
|
+
#
|
|
390
|
+
# @return [ true | false ] Whether or not document callbacks should be
|
|
391
|
+
# executed by default.
|
|
392
|
+
def execute_callbacks?
|
|
393
|
+
if Thread.current.key?(EXECUTE_CALLBACKS)
|
|
394
|
+
Thread.current[EXECUTE_CALLBACKS]
|
|
395
|
+
else
|
|
396
|
+
true
|
|
397
|
+
end
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
# Indicates whether document callbacks should be invoked by default for
|
|
401
|
+
# the current thread. Individual documents may further override the
|
|
402
|
+
# callback behavior, but this will be used for the default behavior.
|
|
397
403
|
#
|
|
398
|
-
# @
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
404
|
+
# @param flag [ true | false ] Whether or not document callbacks should be
|
|
405
|
+
# executed by default.
|
|
406
|
+
def execute_callbacks=(flag)
|
|
407
|
+
Thread.current[EXECUTE_CALLBACKS] = flag
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
# Returns the thread store of sessions.
|
|
411
|
+
#
|
|
412
|
+
# @return [ Hash<Integer, Set> ] The sessions indexed by client object ID.
|
|
413
|
+
#
|
|
414
|
+
# @api private
|
|
415
|
+
def sessions
|
|
416
|
+
Thread.current[SESSIONS_KEY] ||= {}.compare_by_identity
|
|
417
|
+
end
|
|
418
|
+
|
|
419
|
+
# Returns the thread store of modified documents.
|
|
420
|
+
#
|
|
421
|
+
# @return [ Hash<Mongo::Session, Set<Mongoid::Document>> ] The modified
|
|
422
|
+
# documents indexed by session.
|
|
423
|
+
#
|
|
424
|
+
# @api private
|
|
425
|
+
def modified_documents
|
|
426
|
+
Thread.current[MODIFIED_DOCUMENTS_KEY] ||= Hash.new do |h, k|
|
|
427
|
+
h[k] = Set.new
|
|
428
|
+
end
|
|
429
|
+
end
|
|
430
|
+
|
|
431
|
+
private
|
|
432
|
+
|
|
433
|
+
# Removes the given klass from the current scope, and tidies the current
|
|
434
|
+
# scope list.
|
|
435
|
+
#
|
|
436
|
+
# @param klass [ Class ] the class to remove from the current scope.
|
|
437
|
+
def unset_current_scope(klass)
|
|
438
|
+
return unless Thread.current[CURRENT_SCOPE_KEY]
|
|
439
|
+
|
|
440
|
+
Thread.current[CURRENT_SCOPE_KEY].delete(klass)
|
|
441
|
+
Thread.current[CURRENT_SCOPE_KEY] = nil if Thread.current[CURRENT_SCOPE_KEY].empty?
|
|
403
442
|
end
|
|
404
443
|
end
|
|
405
444
|
end
|