mongoid 9.0.11 → 9.1.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
- data/CHANGELOG.md +8 -8
- data/README.md +5 -11
- data/Rakefile +35 -38
- data/lib/config/locales/en.yml +11 -0
- data/lib/mongoid/association/accessors.rb +19 -26
- data/lib/mongoid/association/bindable.rb +43 -45
- data/lib/mongoid/association/builders.rb +18 -15
- data/lib/mongoid/association/constrainable.rb +3 -5
- data/lib/mongoid/association/depending.rb +34 -38
- data/lib/mongoid/association/eager.rb +47 -13
- data/lib/mongoid/association/eager_loadable.rb +152 -24
- data/lib/mongoid/association/embedded/batchable.rb +28 -30
- data/lib/mongoid/association/embedded/cyclic.rb +8 -11
- data/lib/mongoid/association/embedded/eager.rb +1 -6
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +6 -9
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -3
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -0
- data/lib/mongoid/association/embedded/embedded_in.rb +25 -22
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +0 -2
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +2 -3
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +1 -1
- data/lib/mongoid/association/embedded/embeds_many.rb +24 -21
- data/lib/mongoid/association/embedded/embeds_one/binding.rb +0 -2
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +2 -6
- data/lib/mongoid/association/embedded/embeds_one.rb +20 -18
- data/lib/mongoid/association/embedded.rb +0 -1
- data/lib/mongoid/association/macros.rb +3 -7
- data/lib/mongoid/association/many.rb +75 -3
- data/lib/mongoid/association/marshalable.rb +0 -3
- data/lib/mongoid/association/nested/many.rb +18 -13
- data/lib/mongoid/association/nested/nested_buildable.rb +6 -9
- data/lib/mongoid/association/nested/one.rb +4 -7
- data/lib/mongoid/association/nested.rb +1 -3
- data/lib/mongoid/association/one.rb +0 -3
- data/lib/mongoid/association/options.rb +8 -7
- data/lib/mongoid/association/referenced/auto_save.rb +0 -2
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +11 -15
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +23 -5
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +1 -3
- data/lib/mongoid/association/referenced/belongs_to.rb +48 -43
- data/lib/mongoid/association/referenced/counter_cache.rb +5 -10
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +0 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +8 -4
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +0 -3
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +52 -47
- data/lib/mongoid/association/referenced/has_many/binding.rb +0 -2
- data/lib/mongoid/association/referenced/has_many/buildable.rb +11 -5
- data/lib/mongoid/association/referenced/has_many/eager.rb +0 -3
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +107 -38
- data/lib/mongoid/association/referenced/has_many/proxy.rb +10 -6
- data/lib/mongoid/association/referenced/has_many.rb +30 -24
- data/lib/mongoid/association/referenced/has_one/binding.rb +0 -2
- data/lib/mongoid/association/referenced/has_one/buildable.rb +11 -9
- data/lib/mongoid/association/referenced/has_one/eager.rb +0 -3
- data/lib/mongoid/association/referenced/has_one.rb +26 -21
- data/lib/mongoid/association/referenced/syncable.rb +30 -34
- data/lib/mongoid/association/referenced.rb +0 -1
- data/lib/mongoid/association/reflections.rb +0 -3
- data/lib/mongoid/association/relatable.rb +69 -66
- data/lib/mongoid/association.rb +12 -15
- data/lib/mongoid/atomic/modifiers.rb +65 -25
- data/lib/mongoid/atomic/paths/embedded/many.rb +4 -7
- data/lib/mongoid/atomic/paths/embedded/one.rb +2 -4
- data/lib/mongoid/atomic/paths/embedded.rb +3 -6
- data/lib/mongoid/atomic/paths/root.rb +1 -4
- data/lib/mongoid/atomic/paths.rb +2 -3
- data/lib/mongoid/atomic.rb +0 -3
- data/lib/mongoid/attributes/dynamic.rb +6 -7
- data/lib/mongoid/attributes/nested.rb +8 -10
- data/lib/mongoid/attributes/projector.rb +7 -20
- data/lib/mongoid/attributes/readonly.rb +6 -11
- data/lib/mongoid/attributes.rb +18 -34
- data/lib/mongoid/cacheable.rb +24 -6
- data/lib/mongoid/clients/factory.rb +12 -15
- data/lib/mongoid/clients/options.rb +2 -5
- data/lib/mongoid/clients/sessions.rb +50 -60
- data/lib/mongoid/clients/storage_options.rb +1 -4
- data/lib/mongoid/clients/validators/storage.rb +2 -3
- data/lib/mongoid/clients/validators.rb +1 -2
- data/lib/mongoid/clients.rb +8 -11
- data/lib/mongoid/collection_configurable.rb +10 -14
- data/lib/mongoid/composable.rb +30 -34
- data/lib/mongoid/config/defaults.rb +7 -4
- data/lib/mongoid/config/encryption.rb +1 -3
- data/lib/mongoid/config/environment.rb +7 -16
- data/lib/mongoid/config/introspection.rb +14 -16
- data/lib/mongoid/config/options.rb +16 -10
- data/lib/mongoid/config/validators/async_query_executor.rb +3 -6
- data/lib/mongoid/config/validators/client.rb +12 -15
- data/lib/mongoid/config/validators/option.rb +3 -5
- data/lib/mongoid/config/validators.rb +3 -4
- data/lib/mongoid/config.rb +132 -42
- data/lib/mongoid/contextual/aggregable/memory.rb +2 -4
- data/lib/mongoid/contextual/aggregable/mongo.rb +20 -22
- data/lib/mongoid/contextual/aggregable/none.rb +2 -4
- data/lib/mongoid/contextual/aggregable.rb +5 -7
- data/lib/mongoid/contextual/atomic.rb +20 -24
- data/lib/mongoid/contextual/command.rb +0 -3
- data/lib/mongoid/contextual/map_reduce.rb +12 -16
- data/lib/mongoid/contextual/memory.rb +72 -65
- data/lib/mongoid/contextual/mongo/documents_loader.rb +2 -3
- data/lib/mongoid/contextual/mongo.rb +169 -85
- data/lib/mongoid/contextual/none.rb +9 -9
- data/lib/mongoid/contextual/queryable.rb +1 -4
- data/lib/mongoid/contextual.rb +18 -7
- data/lib/mongoid/copyable.rb +7 -9
- data/lib/mongoid/criteria/findable.rb +5 -7
- data/lib/mongoid/criteria/includable.rb +37 -8
- data/lib/mongoid/criteria/inspectable.rb +2 -5
- data/lib/mongoid/criteria/marshalable.rb +4 -8
- data/lib/mongoid/criteria/modifiable.rb +3 -11
- data/lib/mongoid/criteria/options.rb +0 -3
- data/lib/mongoid/criteria/permission.rb +34 -37
- data/lib/mongoid/criteria/queryable/aggregable.rb +9 -10
- data/lib/mongoid/criteria/queryable/expandable.rb +4 -9
- data/lib/mongoid/criteria/queryable/extensions/array.rb +7 -10
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -5
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -4
- data/lib/mongoid/criteria/queryable/extensions/date.rb +2 -6
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +3 -7
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -4
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +20 -11
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +15 -11
- data/lib/mongoid/criteria/queryable/extensions/object.rb +7 -8
- data/lib/mongoid/criteria/queryable/extensions/range.rb +6 -9
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +10 -12
- data/lib/mongoid/criteria/queryable/extensions/set.rb +4 -6
- data/lib/mongoid/criteria/queryable/extensions/string.rb +5 -9
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -7
- data/lib/mongoid/criteria/queryable/extensions/time.rb +2 -6
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +2 -12
- data/lib/mongoid/criteria/queryable/extensions.rb +18 -21
- data/lib/mongoid/criteria/queryable/key.rb +12 -18
- data/lib/mongoid/criteria/queryable/macroable.rb +0 -3
- data/lib/mongoid/criteria/queryable/mergeable.rb +31 -39
- data/lib/mongoid/criteria/queryable/optional.rb +17 -18
- data/lib/mongoid/criteria/queryable/options.rb +20 -9
- data/lib/mongoid/criteria/queryable/pipeline.rb +6 -9
- data/lib/mongoid/criteria/queryable/selectable.rb +131 -193
- data/lib/mongoid/criteria/queryable/selector.rb +20 -29
- data/lib/mongoid/criteria/queryable/smash.rb +1 -6
- data/lib/mongoid/criteria/queryable/storable.rb +20 -39
- data/lib/mongoid/criteria/queryable.rb +25 -15
- data/lib/mongoid/criteria/scopable.rb +5 -11
- data/lib/mongoid/criteria/translator.rb +5 -8
- data/lib/mongoid/criteria.rb +109 -54
- data/lib/mongoid/deprecable.rb +1 -4
- data/lib/mongoid/deprecation.rb +2 -6
- data/lib/mongoid/document.rb +1 -1
- data/lib/mongoid/encryptable.rb +1 -2
- data/lib/mongoid/equality.rb +4 -5
- data/lib/mongoid/errors/ambiguous_relationship.rb +2 -5
- data/lib/mongoid/errors/attribute_not_loaded.rb +1 -4
- data/lib/mongoid/errors/callback.rb +1 -4
- data/lib/mongoid/errors/create_collection_failure.rb +8 -11
- data/lib/mongoid/errors/criteria_argument_required.rb +2 -5
- data/lib/mongoid/errors/delete_restriction.rb +1 -4
- data/lib/mongoid/errors/document_not_destroyed.rb +1 -4
- data/lib/mongoid/errors/document_not_found.rb +16 -21
- data/lib/mongoid/errors/drop_collection_failure.rb +7 -10
- data/lib/mongoid/errors/empty_config_file.rb +1 -4
- data/lib/mongoid/errors/immutable_attribute.rb +1 -4
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -4
- data/lib/mongoid/errors/invalid_async_query_executor.rb +2 -5
- data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +2 -5
- data/lib/mongoid/errors/invalid_collection.rb +1 -3
- data/lib/mongoid/errors/invalid_config_file.rb +1 -4
- data/lib/mongoid/errors/invalid_config_option.rb +2 -5
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +6 -10
- data/lib/mongoid/errors/invalid_discriminator_key_target.rb +2 -4
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +1 -4
- data/lib/mongoid/errors/invalid_elem_match_operator.rb +5 -9
- data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +1 -4
- data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +1 -4
- data/lib/mongoid/errors/invalid_expression_operator.rb +3 -7
- data/lib/mongoid/errors/invalid_field.rb +2 -5
- data/lib/mongoid/errors/invalid_field_operator.rb +5 -9
- data/lib/mongoid/errors/invalid_field_option.rb +2 -5
- data/lib/mongoid/errors/invalid_field_type.rb +1 -4
- data/lib/mongoid/errors/invalid_find.rb +1 -4
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +1 -4
- data/lib/mongoid/errors/invalid_includes.rb +3 -6
- data/lib/mongoid/errors/invalid_index.rb +1 -4
- data/lib/mongoid/errors/invalid_options.rb +1 -4
- data/lib/mongoid/errors/invalid_path.rb +1 -4
- data/lib/mongoid/errors/invalid_persistence_option.rb +4 -7
- data/lib/mongoid/errors/invalid_query.rb +6 -11
- data/lib/mongoid/errors/invalid_relation.rb +10 -13
- data/lib/mongoid/errors/invalid_relation_option.rb +4 -7
- data/lib/mongoid/errors/invalid_scope.rb +1 -4
- data/lib/mongoid/errors/invalid_session_nesting.rb +0 -3
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +2 -4
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -4
- data/lib/mongoid/errors/invalid_time.rb +1 -4
- data/lib/mongoid/errors/invalid_transaction_nesting.rb +0 -3
- data/lib/mongoid/errors/inverse_not_found.rb +1 -4
- data/lib/mongoid/errors/mixed_client_configuration.rb +1 -4
- data/lib/mongoid/errors/mixed_relations.rb +1 -3
- data/lib/mongoid/errors/mongoid_error.rb +7 -11
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -4
- data/lib/mongoid/errors/no_client_config.rb +1 -4
- data/lib/mongoid/errors/no_client_database.rb +1 -4
- data/lib/mongoid/errors/no_client_hosts.rb +1 -4
- data/lib/mongoid/errors/no_clients_config.rb +1 -4
- data/lib/mongoid/errors/no_default_client.rb +1 -4
- data/lib/mongoid/errors/no_environment.rb +1 -4
- data/lib/mongoid/errors/no_map_reduce_output.rb +1 -4
- data/lib/mongoid/errors/no_metadata.rb +1 -4
- data/lib/mongoid/errors/no_parent.rb +1 -4
- data/lib/mongoid/errors/readonly_attribute.rb +1 -4
- data/lib/mongoid/errors/readonly_document.rb +1 -4
- data/lib/mongoid/errors/rollback.rb +0 -2
- data/lib/mongoid/errors/scope_overwrite.rb +2 -4
- data/lib/mongoid/errors/sessions_not_supported.rb +0 -3
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -3
- data/lib/mongoid/errors/transaction_error.rb +0 -3
- data/lib/mongoid/errors/transactions_not_supported.rb +0 -3
- data/lib/mongoid/errors/unknown_attribute.rb +1 -4
- data/lib/mongoid/errors/unknown_model.rb +1 -4
- data/lib/mongoid/errors/unregistered_class.rb +1 -1
- data/lib/mongoid/errors/unsaved_document.rb +1 -3
- data/lib/mongoid/errors/unsupported_isolation_level.rb +22 -0
- data/lib/mongoid/errors/unsupported_javascript.rb +1 -4
- data/lib/mongoid/errors/validations.rb +3 -5
- data/lib/mongoid/errors.rb +72 -72
- data/lib/mongoid/evolvable.rb +0 -3
- data/lib/mongoid/extensions/array.rb +5 -7
- data/lib/mongoid/extensions/big_decimal.rb +6 -7
- data/lib/mongoid/extensions/binary.rb +3 -6
- data/lib/mongoid/extensions/boolean.rb +4 -7
- data/lib/mongoid/extensions/bson_document.rb +28 -0
- data/lib/mongoid/extensions/date.rb +10 -14
- data/lib/mongoid/extensions/date_time.rb +2 -6
- data/lib/mongoid/extensions/decimal128.rb +1 -5
- data/lib/mongoid/extensions/false_class.rb +3 -5
- data/lib/mongoid/extensions/float.rb +5 -10
- data/lib/mongoid/extensions/hash.rb +5 -10
- data/lib/mongoid/extensions/integer.rb +5 -10
- data/lib/mongoid/extensions/module.rb +1 -4
- data/lib/mongoid/extensions/nil_class.rb +0 -1
- data/lib/mongoid/extensions/object.rb +9 -14
- data/lib/mongoid/extensions/object_id.rb +2 -6
- data/lib/mongoid/extensions/range.rb +14 -15
- data/lib/mongoid/extensions/raw_value.rb +0 -3
- data/lib/mongoid/extensions/regexp.rb +3 -6
- data/lib/mongoid/extensions/set.rb +3 -4
- data/lib/mongoid/extensions/string.rb +8 -12
- data/lib/mongoid/extensions/symbol.rb +3 -7
- data/lib/mongoid/extensions/time.rb +24 -26
- data/lib/mongoid/extensions/time_with_zone.rb +4 -7
- data/lib/mongoid/extensions/true_class.rb +3 -5
- data/lib/mongoid/extensions.rb +26 -26
- data/lib/mongoid/factory.rb +5 -9
- data/lib/mongoid/fields/encrypted.rb +0 -1
- data/lib/mongoid/fields/foreign_key.rb +9 -10
- data/lib/mongoid/fields/localized.rb +12 -12
- data/lib/mongoid/fields/standard.rb +5 -7
- data/lib/mongoid/fields/validators/macro.rb +23 -34
- data/lib/mongoid/fields/validators.rb +1 -2
- data/lib/mongoid/fields.rb +151 -58
- data/lib/mongoid/findable.rb +82 -53
- data/lib/mongoid/indexable/specification.rb +20 -6
- data/lib/mongoid/indexable/validators/options.rb +33 -40
- data/lib/mongoid/indexable.rb +26 -25
- data/lib/mongoid/inspectable.rb +4 -7
- data/lib/mongoid/interceptable.rb +41 -40
- data/lib/mongoid/loadable.rb +17 -18
- data/lib/mongoid/loggable.rb +4 -8
- data/lib/mongoid/matchable.rb +0 -2
- data/lib/mongoid/matcher/all.rb +2 -5
- data/lib/mongoid/matcher/and.rb +0 -3
- data/lib/mongoid/matcher/bits.rb +13 -8
- data/lib/mongoid/matcher/bits_all_clear.rb +1 -3
- data/lib/mongoid/matcher/bits_all_set.rb +1 -3
- data/lib/mongoid/matcher/bits_any_clear.rb +1 -3
- data/lib/mongoid/matcher/bits_any_set.rb +1 -3
- data/lib/mongoid/matcher/elem_match.rb +13 -15
- data/lib/mongoid/matcher/elem_match_expression.rb +0 -3
- data/lib/mongoid/matcher/eq.rb +0 -3
- data/lib/mongoid/matcher/eq_impl.rb +12 -17
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +4 -7
- data/lib/mongoid/matcher/exists.rb +1 -4
- data/lib/mongoid/matcher/expression.rb +5 -10
- data/lib/mongoid/matcher/expression_operator.rb +1 -3
- data/lib/mongoid/matcher/field_expression.rb +10 -13
- data/lib/mongoid/matcher/field_operator.rb +4 -6
- data/lib/mongoid/matcher/gt.rb +0 -3
- data/lib/mongoid/matcher/gte.rb +0 -3
- data/lib/mongoid/matcher/in.rb +9 -12
- data/lib/mongoid/matcher/lt.rb +0 -3
- data/lib/mongoid/matcher/lte.rb +0 -3
- data/lib/mongoid/matcher/mod.rb +4 -8
- data/lib/mongoid/matcher/ne.rb +0 -3
- data/lib/mongoid/matcher/nin.rb +0 -3
- data/lib/mongoid/matcher/nor.rb +1 -6
- data/lib/mongoid/matcher/not.rb +0 -3
- data/lib/mongoid/matcher/or.rb +0 -3
- data/lib/mongoid/matcher/regex.rb +11 -14
- data/lib/mongoid/matcher/size.rb +2 -5
- data/lib/mongoid/matcher/type.rb +32 -37
- data/lib/mongoid/matcher.rb +7 -15
- data/lib/mongoid/model_resolver.rb +1 -0
- data/lib/mongoid/persistable/creatable.rb +23 -7
- data/lib/mongoid/persistable/deletable.rb +6 -7
- data/lib/mongoid/persistable/destroyable.rb +2 -6
- data/lib/mongoid/persistable/incrementable.rb +1 -3
- data/lib/mongoid/persistable/logical.rb +3 -5
- data/lib/mongoid/persistable/maxable.rb +2 -4
- data/lib/mongoid/persistable/minable.rb +2 -4
- data/lib/mongoid/persistable/multipliable.rb +1 -3
- data/lib/mongoid/persistable/poppable.rb +2 -4
- data/lib/mongoid/persistable/pullable.rb +3 -5
- data/lib/mongoid/persistable/pushable.rb +5 -7
- data/lib/mongoid/persistable/renamable.rb +1 -3
- data/lib/mongoid/persistable/savable.rb +0 -3
- data/lib/mongoid/persistable/settable.rb +4 -13
- data/lib/mongoid/persistable/unsettable.rb +1 -3
- data/lib/mongoid/persistable/updatable.rb +16 -24
- data/lib/mongoid/persistable/upsertable.rb +8 -10
- data/lib/mongoid/persistable.rb +28 -27
- data/lib/mongoid/persistence_context.rb +34 -41
- data/lib/mongoid/pluckable.rb +0 -2
- data/lib/mongoid/positional.rb +5 -11
- data/lib/mongoid/railtie.rb +16 -22
- data/lib/mongoid/railties/console_sandbox.rb +6 -8
- data/lib/mongoid/railties/controller_runtime.rb +7 -11
- data/lib/mongoid/railties/database.rake +42 -44
- data/lib/mongoid/scopable.rb +23 -31
- data/lib/mongoid/search_indexable.rb +330 -0
- data/lib/mongoid/selectable.rb +1 -3
- data/lib/mongoid/serializable.rb +6 -8
- data/lib/mongoid/shardable.rb +8 -17
- data/lib/mongoid/stateful.rb +5 -10
- data/lib/mongoid/stringified_symbol.rb +5 -9
- data/lib/mongoid/tasks/database.rake +31 -32
- data/lib/mongoid/tasks/database.rb +28 -30
- data/lib/mongoid/tasks/encryption.rb +10 -15
- data/lib/mongoid/threaded/lifecycle.rb +6 -9
- data/lib/mongoid/threaded.rb +132 -32
- data/lib/mongoid/timestamps/created/short.rb +2 -3
- data/lib/mongoid/timestamps/created.rb +1 -2
- data/lib/mongoid/timestamps/short.rb +0 -1
- data/lib/mongoid/timestamps/timeless.rb +8 -13
- data/lib/mongoid/timestamps/updated/short.rb +2 -3
- data/lib/mongoid/timestamps/updated.rb +2 -5
- data/lib/mongoid/timestamps.rb +4 -6
- data/lib/mongoid/touchable.rb +19 -11
- data/lib/mongoid/traversable.rb +3 -2
- data/lib/mongoid/validatable/associated.rb +1 -5
- data/lib/mongoid/validatable/format.rb +0 -2
- data/lib/mongoid/validatable/length.rb +0 -2
- data/lib/mongoid/validatable/localizable.rb +0 -3
- data/lib/mongoid/validatable/macros.rb +0 -2
- data/lib/mongoid/validatable/numericality.rb +24 -3
- data/lib/mongoid/validatable/presence.rb +8 -10
- data/lib/mongoid/validatable/queryable.rb +0 -3
- data/lib/mongoid/validatable/uniqueness.rb +12 -14
- data/lib/mongoid/validatable.rb +15 -20
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +10 -11
- data/lib/mongoid.rb +30 -34
- data/lib/rails/generators/mongoid/config/config_generator.rb +2 -4
- data/lib/rails/generators/mongoid/config/templates/mongoid.rb +4 -5
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +2 -2
- data/lib/rails/generators/mongoid/model/model_generator.rb +5 -8
- data/lib/rails/generators/mongoid_generator.rb +6 -10
- data/lib/rails/mongoid.rb +1 -3
- data/spec/integration/active_job_spec.rb +1 -2
- data/spec/integration/app_spec.rb +142 -178
- data/spec/integration/associations/belongs_to_spec.rb +30 -28
- data/spec/integration/associations/embedded_dirty_spec.rb +0 -1
- data/spec/integration/associations/embedded_spec.rb +41 -43
- data/spec/integration/associations/embeds_many_spec.rb +46 -29
- data/spec/integration/associations/embeds_one_spec.rb +2 -1
- data/spec/integration/associations/foreign_key_spec.rb +10 -11
- data/spec/integration/associations/foreign_key_spec_models.rb +8 -9
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +16 -13
- data/spec/integration/associations/has_many_spec.rb +17 -18
- data/spec/integration/associations/has_one_spec.rb +42 -45
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +36 -39
- data/spec/integration/associations/reverse_population_spec.rb +4 -5
- data/spec/integration/associations/reverse_population_spec_models.rb +0 -1
- data/spec/integration/associations/scope_option_spec.rb +18 -20
- data/spec/integration/atomic/modifiers_spec.rb +72 -52
- data/spec/integration/bson_regexp_raw_spec.rb +2 -3
- data/spec/integration/caching_spec.rb +68 -0
- data/spec/integration/callbacks_models.rb +11 -9
- data/spec/integration/callbacks_spec.rb +78 -80
- data/spec/integration/contextual/empty_spec.rb +19 -20
- data/spec/integration/criteria/alias_query_spec.rb +12 -19
- data/spec/integration/criteria/date_field_spec.rb +1 -2
- data/spec/integration/criteria/default_scope_spec.rb +23 -18
- data/spec/integration/criteria/logical_spec.rb +18 -19
- data/spec/integration/criteria/range_spec.rb +77 -86
- data/spec/integration/criteria/raw_value_spec.rb +122 -109
- data/spec/integration/criteria/time_with_zone_spec.rb +33 -24
- data/spec/integration/discriminator_key_spec.rb +85 -85
- data/spec/integration/discriminator_value_spec.rb +70 -73
- data/spec/integration/document_spec.rb +9 -10
- data/spec/integration/dots_and_dollars_spec.rb +104 -119
- data/spec/integration/encryption_spec.rb +8 -11
- data/spec/integration/i18n_fallbacks_spec.rb +7 -8
- data/spec/integration/isolation_state_spec.rb +241 -0
- data/spec/integration/matcher_examples_spec.rb +145 -168
- data/spec/integration/matcher_operator_data/in.yml +6 -6
- data/spec/integration/matcher_operator_spec.rb +16 -26
- data/spec/integration/matcher_spec.rb +31 -32
- data/spec/integration/persistence/collection_options_spec.rb +0 -2
- data/spec/integration/persistence/range_field_spec.rb +24 -2
- data/spec/integration/server_query_spec.rb +43 -37
- data/spec/integration/shardable_spec.rb +10 -11
- data/spec/integration/stringified_symbol_field_spec.rb +28 -43
- data/spec/lite_spec_helper.rb +11 -12
- data/spec/mongoid/association/accessors_spec.rb +197 -285
- data/spec/mongoid/association/auto_save_spec.rb +62 -93
- data/spec/mongoid/association/builders_spec.rb +121 -74
- data/spec/mongoid/association/constrainable_spec.rb +9 -22
- data/spec/mongoid/association/counter_cache_spec.rb +71 -104
- data/spec/mongoid/association/depending_spec.rb +166 -208
- data/spec/mongoid/association/eager_spec.rb +416 -80
- data/spec/mongoid/association/embedded/cyclic_spec.rb +36 -48
- data/spec/mongoid/association/embedded/dirty_spec.rb +15 -20
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +36 -54
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +8 -15
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +135 -175
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +25 -127
- data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +9 -14
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +38 -51
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +1151 -1340
- data/spec/mongoid/association/embedded/embeds_many_models.rb +17 -17
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +11 -11
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +25 -138
- data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +15 -23
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +18 -26
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +204 -273
- data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +0 -1
- data/spec/mongoid/association/embedded/embeds_one_models.rb +0 -1
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +5 -6
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -143
- data/spec/mongoid/association/macros_spec.rb +213 -300
- data/spec/mongoid/association/nested/many_spec.rb +51 -73
- data/spec/mongoid/association/nested/one_spec.rb +56 -80
- data/spec/mongoid/association/options_spec.rb +187 -310
- data/spec/mongoid/association/polymorphic_spec.rb +35 -53
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +55 -76
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +36 -41
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +81 -101
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +258 -345
- data/spec/mongoid/association/referenced/belongs_to_models.rb +4 -3
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +3 -4
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +91 -294
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +42 -56
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +41 -32
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +36 -42
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +8 -9
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +771 -975
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +9 -9
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +5 -6
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +59 -177
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +29 -43
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +53 -53
- data/spec/mongoid/association/referenced/has_many/eager_spec.rb +104 -67
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +431 -675
- data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -2
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +173 -11
- data/spec/mongoid/association/referenced/has_many_models.rb +1 -2
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +3 -4
- data/spec/mongoid/association/referenced/has_many_spec.rb +44 -188
- data/spec/mongoid/association/referenced/has_one/binding_spec.rb +26 -38
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +28 -29
- data/spec/mongoid/association/referenced/has_one/eager_spec.rb +29 -42
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +270 -332
- data/spec/mongoid/association/referenced/has_one_models.rb +1 -2
- data/spec/mongoid/association/referenced/has_one_query_spec.rb +3 -4
- data/spec/mongoid/association/referenced/has_one_spec.rb +40 -188
- data/spec/mongoid/association/reflections_spec.rb +14 -24
- data/spec/mongoid/association/syncable_spec.rb +102 -125
- data/spec/mongoid/association_spec.rb +47 -70
- data/spec/mongoid/atomic/modifiers_spec.rb +184 -197
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +39 -52
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +35 -49
- data/spec/mongoid/atomic/paths/root_spec.rb +9 -15
- data/spec/mongoid/atomic/paths_spec.rb +81 -117
- data/spec/mongoid/atomic_spec.rb +156 -171
- data/spec/mongoid/attributes/dynamic_spec.rb +5 -6
- data/spec/mongoid/attributes/nested_spec.rb +1219 -1692
- data/spec/mongoid/attributes/nested_spec_models.rb +8 -9
- data/spec/mongoid/attributes/projector_spec.rb +2 -6
- data/spec/mongoid/attributes/readonly_spec.rb +73 -97
- data/spec/mongoid/attributes_spec.rb +669 -826
- data/spec/mongoid/cacheable_spec.rb +74 -44
- data/spec/mongoid/changeable_spec.rb +591 -733
- data/spec/mongoid/clients/factory_spec.rb +122 -154
- data/spec/mongoid/clients/options_spec.rb +40 -59
- data/spec/mongoid/clients/sessions_spec.rb +25 -44
- data/spec/mongoid/clients/transactions_spec.rb +33 -50
- data/spec/mongoid/clients/transactions_spec_models.rb +3 -4
- data/spec/mongoid/clients_spec.rb +265 -355
- data/spec/mongoid/collection_configurable_spec.rb +9 -12
- data/spec/mongoid/composable_spec.rb +2 -9
- data/spec/mongoid/config/defaults_spec.rb +24 -31
- data/spec/mongoid/config/encryption_spec.rb +54 -57
- data/spec/mongoid/config/environment_spec.rb +30 -40
- data/spec/mongoid/config/introspection_spec.rb +42 -37
- data/spec/mongoid/config/options_spec.rb +14 -21
- data/spec/mongoid/config_spec.rb +145 -195
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +98 -135
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +4 -7
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +149 -187
- data/spec/mongoid/contextual/aggregable/none_spec.rb +14 -16
- data/spec/mongoid/contextual/atomic_spec.rb +223 -271
- data/spec/mongoid/contextual/map_reduce_spec.rb +110 -138
- data/spec/mongoid/contextual/memory_spec.rb +706 -854
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +12 -13
- data/spec/mongoid/contextual/mongo_spec.rb +1008 -1213
- data/spec/mongoid/contextual/none_spec.rb +54 -59
- data/spec/mongoid/contextual/short_circuit_spec.rb +139 -0
- data/spec/mongoid/copyable_spec.rb +254 -300
- data/spec/mongoid/copyable_spec_models.rb +0 -1
- data/spec/mongoid/criteria/findable_spec.rb +322 -387
- data/spec/mongoid/criteria/includable_spec.rb +421 -372
- data/spec/mongoid/criteria/includable_spec_models.rb +16 -7
- data/spec/mongoid/criteria/inspectable_spec.rb +11 -14
- data/spec/mongoid/criteria/marshalable_spec.rb +11 -14
- data/spec/mongoid/criteria/modifiable_spec.rb +366 -512
- data/spec/mongoid/criteria/options_spec.rb +2 -7
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +112 -141
- data/spec/mongoid/criteria/queryable/expandable_spec.rb +8 -11
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +127 -184
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +123 -60
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +84 -117
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +44 -65
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +86 -108
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +94 -33
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +103 -138
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +95 -34
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +25 -38
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +26 -28
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +32 -54
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +136 -130
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +16 -24
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +15 -24
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +12 -19
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +46 -63
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +28 -42
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +73 -96
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +71 -92
- data/spec/mongoid/criteria/queryable/key_spec.rb +32 -36
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +44 -49
- data/spec/mongoid/criteria/queryable/optional_spec.rb +373 -486
- data/spec/mongoid/criteria/queryable/options_spec.rb +172 -123
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +65 -87
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +41 -53
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +576 -680
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +7 -11
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +807 -998
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +154 -191
- data/spec/mongoid/criteria/queryable/selector_spec.rb +294 -390
- data/spec/mongoid/criteria/queryable/smash_spec.rb +6 -11
- data/spec/mongoid/criteria/queryable/storable_spec.rb +54 -81
- data/spec/mongoid/criteria/queryable_mql_spec.rb +92 -0
- data/spec/mongoid/criteria/scopable_spec.rb +102 -138
- data/spec/mongoid/criteria/translator_spec.rb +59 -60
- data/spec/mongoid/criteria_projection_spec.rb +81 -99
- data/spec/mongoid/criteria_spec.rb +935 -950
- data/spec/mongoid/document_fields_spec.rb +28 -30
- data/spec/mongoid/document_persistence_context_spec.rb +13 -15
- data/spec/mongoid/document_query_spec.rb +9 -12
- data/spec/mongoid/document_spec.rb +317 -409
- data/spec/mongoid/equality_spec.rb +69 -102
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +8 -11
- data/spec/mongoid/errors/attribute_not_loaded_spec.rb +7 -10
- data/spec/mongoid/errors/callback_spec.rb +8 -11
- data/spec/mongoid/errors/delete_restriction_spec.rb +5 -8
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +7 -10
- data/spec/mongoid/errors/document_not_found_spec.rb +51 -61
- data/spec/mongoid/errors/invalid_collection_spec.rb +9 -13
- data/spec/mongoid/errors/invalid_config_file_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_config_option_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_field_option_spec.rb +7 -10
- data/spec/mongoid/errors/invalid_field_spec.rb +10 -11
- data/spec/mongoid/errors/invalid_field_type_spec.rb +9 -12
- data/spec/mongoid/errors/invalid_find_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_includes_spec.rb +9 -13
- data/spec/mongoid/errors/invalid_index_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_options_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_path_spec.rb +7 -10
- data/spec/mongoid/errors/invalid_relation_spec.rb +15 -16
- data/spec/mongoid/errors/invalid_scope_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -6
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_time_spec.rb +8 -11
- data/spec/mongoid/errors/inverse_not_found_spec.rb +9 -12
- data/spec/mongoid/errors/mixed_client_configuration_spec.rb +9 -12
- data/spec/mongoid/errors/mixed_relations_spec.rb +8 -11
- data/spec/mongoid/errors/mongoid_error_spec.rb +21 -24
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +6 -9
- data/spec/mongoid/errors/no_client_config_spec.rb +7 -10
- data/spec/mongoid/errors/no_client_database_spec.rb +9 -12
- data/spec/mongoid/errors/no_client_hosts_spec.rb +9 -12
- data/spec/mongoid/errors/no_clients_config_spec.rb +7 -10
- data/spec/mongoid/errors/no_environment_spec.rb +8 -11
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +8 -11
- data/spec/mongoid/errors/no_metadata_spec.rb +7 -10
- data/spec/mongoid/errors/no_parent_spec.rb +7 -10
- data/spec/mongoid/errors/readonly_attribute_spec.rb +7 -10
- data/spec/mongoid/errors/readonly_document_spec.rb +6 -9
- data/spec/mongoid/errors/scope_overwrite_spec.rb +9 -12
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +9 -12
- data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -8
- data/spec/mongoid/errors/unsaved_document_spec.rb +8 -11
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +9 -12
- data/spec/mongoid/errors/validations_spec.rb +11 -14
- data/spec/mongoid/extensions/array_spec.rb +70 -92
- data/spec/mongoid/extensions/big_decimal_spec.rb +233 -313
- data/spec/mongoid/extensions/binary_spec.rb +21 -32
- data/spec/mongoid/extensions/boolean_spec.rb +52 -75
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +43 -54
- data/spec/mongoid/extensions/date_spec.rb +26 -38
- data/spec/mongoid/extensions/date_time_spec.rb +22 -32
- data/spec/mongoid/extensions/decimal128_spec.rb +12 -18
- data/spec/mongoid/extensions/false_class_spec.rb +10 -17
- data/spec/mongoid/extensions/float_spec.rb +40 -61
- data/spec/mongoid/extensions/hash_spec.rb +46 -64
- data/spec/mongoid/extensions/integer_spec.rb +40 -61
- data/spec/mongoid/extensions/module_spec.rb +13 -18
- data/spec/mongoid/extensions/nil_class_spec.rb +2 -5
- data/spec/mongoid/extensions/object_id_spec.rb +159 -247
- data/spec/mongoid/extensions/object_spec.rb +31 -47
- data/spec/mongoid/extensions/range_spec.rb +112 -115
- data/spec/mongoid/extensions/raw_value_spec.rb +10 -12
- data/spec/mongoid/extensions/regexp_spec.rb +23 -36
- data/spec/mongoid/extensions/set_spec.rb +38 -49
- data/spec/mongoid/extensions/string_spec.rb +118 -167
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +29 -43
- data/spec/mongoid/extensions/symbol_spec.rb +12 -20
- data/spec/mongoid/extensions/time_spec.rb +160 -202
- data/spec/mongoid/extensions/time_with_zone_spec.rb +79 -105
- data/spec/mongoid/extensions/true_class_spec.rb +10 -17
- data/spec/mongoid/factory_spec.rb +125 -148
- data/spec/mongoid/fields/foreign_key_spec.rb +124 -169
- data/spec/mongoid/fields/localized_spec.rb +140 -185
- data/spec/mongoid/fields/standard_spec.rb +43 -59
- data/spec/mongoid/fields_spec.rb +751 -620
- data/spec/mongoid/findable_spec.rb +260 -228
- data/spec/mongoid/indexable/specification_spec.rb +42 -58
- data/spec/mongoid/indexable_spec.rb +260 -264
- data/spec/mongoid/inspectable_spec.rb +45 -55
- data/spec/mongoid/interceptable_spec.rb +784 -922
- data/spec/mongoid/interceptable_spec_models.rb +35 -35
- data/spec/mongoid/loading_spec.rb +47 -43
- data/spec/mongoid/loggable_spec.rb +3 -6
- data/spec/mongoid/matcher/extract_attribute_spec.rb +2 -6
- data/spec/mongoid/mongoizable_spec.rb +81 -90
- data/spec/mongoid/monkey_patches_spec.rb +4 -0
- data/spec/mongoid/persistable/creatable_spec.rb +181 -220
- data/spec/mongoid/persistable/deletable_spec.rb +139 -179
- data/spec/mongoid/persistable/destroyable_spec.rb +135 -164
- data/spec/mongoid/persistable/incrementable_spec.rb +65 -84
- data/spec/mongoid/persistable/logical_spec.rb +48 -61
- data/spec/mongoid/persistable/maxable_spec.rb +45 -44
- data/spec/mongoid/persistable/minable_spec.rb +45 -44
- data/spec/mongoid/persistable/multipliable_spec.rb +54 -69
- data/spec/mongoid/persistable/poppable_spec.rb +47 -60
- data/spec/mongoid/persistable/pullable_spec.rb +79 -103
- data/spec/mongoid/persistable/pushable_spec.rb +106 -131
- data/spec/mongoid/persistable/renamable_spec.rb +52 -65
- data/spec/mongoid/persistable/savable_spec.rb +152 -189
- data/spec/mongoid/persistable/settable_spec.rb +121 -145
- data/spec/mongoid/persistable/unsettable_spec.rb +56 -73
- data/spec/mongoid/persistable/updatable_spec.rb +185 -232
- data/spec/mongoid/persistable/upsertable_spec.rb +66 -77
- data/spec/mongoid/persistable_spec.rb +132 -139
- data/spec/mongoid/persistence_context_spec.rb +31 -89
- data/spec/mongoid/positional_spec.rb +67 -79
- data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +0 -3
- data/spec/mongoid/railties/console_sandbox_spec.rb +0 -1
- data/spec/mongoid/relations/proxy_spec.rb +0 -1
- data/spec/mongoid/reloadable_spec.rb +250 -145
- data/spec/mongoid/scopable_spec.rb +319 -398
- data/spec/mongoid/search_indexable_spec.rb +446 -41
- data/spec/mongoid/selectable_spec.rb +36 -51
- data/spec/mongoid/serializable_spec.rb +269 -312
- data/spec/mongoid/shardable_models.rb +5 -5
- data/spec/mongoid/shardable_spec.rb +44 -46
- data/spec/mongoid/stateful_spec.rb +55 -75
- data/spec/mongoid/tasks/database_rake_spec.rb +138 -141
- data/spec/mongoid/tasks/database_spec.rb +80 -80
- data/spec/mongoid/tasks/encryption_spec.rb +22 -20
- data/spec/mongoid/threaded_spec.rb +57 -83
- data/spec/mongoid/timestamps/created/short_spec.rb +12 -16
- data/spec/mongoid/timestamps/created_spec.rb +16 -20
- data/spec/mongoid/timestamps/timeless_spec.rb +31 -43
- data/spec/mongoid/timestamps/updated/short_spec.rb +21 -28
- data/spec/mongoid/timestamps/updated_spec.rb +18 -25
- data/spec/mongoid/timestamps_spec.rb +171 -188
- data/spec/mongoid/timestamps_spec_models.rb +12 -13
- data/spec/mongoid/touchable_spec.rb +330 -294
- data/spec/mongoid/touchable_spec_models.rb +35 -37
- data/spec/mongoid/traversable_spec.rb +435 -471
- data/spec/mongoid/validatable/associated_spec.rb +42 -60
- data/spec/mongoid/validatable/format_spec.rb +24 -34
- data/spec/mongoid/validatable/length_spec.rb +62 -86
- data/spec/mongoid/validatable/numericality_spec.rb +114 -23
- data/spec/mongoid/validatable/presence_spec.rb +149 -203
- data/spec/mongoid/validatable/uniqueness_spec.rb +632 -830
- data/spec/mongoid/validatable_spec.rb +71 -103
- data/spec/mongoid/warnings_spec.rb +5 -9
- data/spec/mongoid_spec.rb +25 -41
- data/spec/rails/controller_extension/controller_runtime_spec.rb +45 -49
- data/spec/rails/mongoid_spec.rb +15 -15
- data/spec/shared/lib/mrss/cluster_config.rb +5 -40
- data/spec/shared/lib/mrss/constraints.rb +7 -46
- data/spec/shared/lib/mrss/docker_runner.rb +10 -21
- data/spec/shared/lib/mrss/eg_config_utils.rb +0 -31
- data/spec/shared/lib/mrss/release/candidate.rb +18 -12
- data/spec/shared/lib/mrss/server_version_registry.rb +1 -5
- data/spec/shared/share/Dockerfile.erb +6 -8
- data/spec/shared/shlib/server.sh +0 -50
- data/spec/shared/shlib/set_env.sh +4 -10
- data/spec/spec_helper.rb +54 -31
- data/spec/support/authorization.rb +0 -1
- data/spec/support/client_registry.rb +1 -2
- data/spec/support/constraints.rb +8 -25
- data/spec/support/crypt/models.rb +7 -8
- data/spec/support/crypt.rb +6 -9
- data/spec/support/expectations.rb +21 -7
- data/spec/support/feature_sandbox.rb +1 -4
- data/spec/support/helpers.rb +0 -1
- data/spec/support/immutable_ids.rb +20 -21
- data/spec/support/macros.rb +1 -3
- data/spec/support/models/account.rb +4 -5
- data/spec/support/models/acolyte.rb +5 -5
- data/spec/support/models/actor.rb +3 -3
- data/spec/support/models/actress.rb +0 -1
- data/spec/support/models/address.rb +11 -11
- 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 -2
- data/spec/support/models/alert.rb +1 -1
- data/spec/support/models/animal.rb +4 -5
- data/spec/support/models/answer.rb +1 -1
- data/spec/support/models/appointment.rb +2 -2
- data/spec/support/models/armrest.rb +0 -1
- data/spec/support/models/array_field.rb +0 -1
- data/spec/support/models/article.rb +0 -1
- data/spec/support/models/artist.rb +16 -12
- data/spec/support/models/artwork.rb +1 -1
- data/spec/support/models/audible_sound.rb +0 -1
- data/spec/support/models/audio.rb +2 -2
- data/spec/support/models/augmentation.rb +1 -2
- data/spec/support/models/author.rb +1 -1
- data/spec/support/models/baby.rb +1 -1
- data/spec/support/models/band.rb +0 -1
- data/spec/support/models/bar.rb +2 -2
- data/spec/support/models/basic.rb +0 -1
- data/spec/support/models/bed.rb +0 -1
- data/spec/support/models/big_palette.rb +0 -1
- data/spec/support/models/birthday.rb +3 -5
- data/spec/support/models/bolt.rb +0 -1
- data/spec/support/models/bomb.rb +1 -1
- data/spec/support/models/book.rb +1 -1
- data/spec/support/models/breed.rb +1 -1
- data/spec/support/models/browser.rb +1 -2
- data/spec/support/models/building.rb +0 -1
- data/spec/support/models/building_address.rb +1 -1
- data/spec/support/models/bus.rb +1 -1
- data/spec/support/models/business.rb +2 -2
- data/spec/support/models/callback_test.rb +1 -1
- data/spec/support/models/canvas.rb +5 -6
- data/spec/support/models/car.rb +0 -1
- data/spec/support/models/cat.rb +0 -2
- data/spec/support/models/catalog.rb +0 -1
- data/spec/support/models/category.rb +1 -1
- data/spec/support/models/child.rb +1 -1
- data/spec/support/models/child_doc.rb +5 -6
- data/spec/support/models/church.rb +1 -1
- data/spec/support/models/circle.rb +0 -1
- data/spec/support/models/circuit.rb +2 -2
- data/spec/support/models/circus.rb +0 -1
- data/spec/support/models/code.rb +2 -1
- data/spec/support/models/coding/pull_request.rb +0 -1
- data/spec/support/models/coding.rb +0 -1
- data/spec/support/models/comment.rb +0 -1
- data/spec/support/models/company.rb +0 -1
- data/spec/support/models/consumption_period.rb +0 -1
- data/spec/support/models/contextable_item.rb +1 -1
- data/spec/support/models/contractor.rb +1 -1
- data/spec/support/models/cookie.rb +0 -1
- data/spec/support/models/country_code.rb +2 -3
- data/spec/support/models/courier_job.rb +2 -2
- data/spec/support/models/cover.rb +0 -1
- data/spec/support/models/crate.rb +0 -1
- data/spec/support/models/customer.rb +0 -1
- data/spec/support/models/customer_address.rb +0 -1
- data/spec/support/models/deed.rb +1 -1
- data/spec/support/models/definition.rb +1 -1
- data/spec/support/models/delegating_patient.rb +0 -1
- data/spec/support/models/description.rb +0 -1
- data/spec/support/models/dictionary.rb +1 -1
- data/spec/support/models/division.rb +2 -2
- data/spec/support/models/doctor.rb +0 -1
- data/spec/support/models/dog.rb +2 -2
- data/spec/support/models/dokument.rb +1 -1
- data/spec/support/models/draft.rb +0 -1
- data/spec/support/models/dragon.rb +1 -1
- data/spec/support/models/driver.rb +2 -2
- 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 -2
- data/spec/support/models/entry.rb +1 -1
- data/spec/support/models/eraser.rb +0 -1
- data/spec/support/models/even.rb +1 -1
- data/spec/support/models/event.rb +3 -4
- 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 +0 -1
- data/spec/support/models/eye_bowl.rb +2 -3
- data/spec/support/models/face.rb +2 -3
- data/spec/support/models/fanatic.rb +1 -1
- data/spec/support/models/favorite.rb +1 -1
- data/spec/support/models/filesystem.rb +1 -1
- data/spec/support/models/fire_hydrant.rb +1 -1
- data/spec/support/models/firefox.rb +0 -1
- data/spec/support/models/fish.rb +0 -1
- data/spec/support/models/folder.rb +0 -2
- data/spec/support/models/folder_item.rb +1 -3
- data/spec/support/models/fruits.rb +9 -5
- data/spec/support/models/game.rb +3 -4
- data/spec/support/models/ghost.rb +0 -1
- data/spec/support/models/guitar.rb +0 -1
- data/spec/support/models/hole.rb +0 -1
- data/spec/support/models/home.rb +1 -1
- data/spec/support/models/house.rb +2 -2
- data/spec/support/models/html_writer.rb +0 -1
- data/spec/support/models/id_key.rb +3 -3
- data/spec/support/models/idnodef.rb +0 -1
- data/spec/support/models/image.rb +0 -1
- data/spec/support/models/implant.rb +1 -2
- data/spec/support/models/instrument.rb +2 -3
- data/spec/support/models/item.rb +2 -2
- data/spec/support/models/jar.rb +1 -2
- data/spec/support/models/kaleidoscope.rb +1 -1
- data/spec/support/models/kangaroo.rb +1 -1
- data/spec/support/models/label.rb +2 -2
- data/spec/support/models/language.rb +1 -1
- data/spec/support/models/lat_lng.rb +0 -1
- data/spec/support/models/league.rb +1 -1
- data/spec/support/models/learner.rb +0 -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 -2
- data/spec/support/models/manufacturer.rb +0 -1
- data/spec/support/models/meat.rb +1 -1
- data/spec/support/models/membership.rb +1 -1
- data/spec/support/models/message.rb +1 -2
- data/spec/support/models/minim.rb +0 -1
- data/spec/support/models/mixed_drink.rb +1 -1
- data/spec/support/models/modifier_models.rb +25 -0
- data/spec/support/models/mop.rb +0 -1
- data/spec/support/models/movie.rb +1 -1
- data/spec/support/models/my_hash.rb +1 -2
- data/spec/support/models/name.rb +4 -5
- data/spec/support/models/name_only.rb +0 -1
- data/spec/support/models/node.rb +1 -1
- data/spec/support/models/note.rb +3 -3
- data/spec/support/models/nut.rb +0 -1
- data/spec/support/models/odd.rb +1 -1
- data/spec/support/models/order.rb +1 -1
- data/spec/support/models/ordered_post.rb +1 -1
- 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 +0 -1
- data/spec/support/models/override.rb +3 -11
- data/spec/support/models/ownable.rb +1 -1
- data/spec/support/models/owner.rb +1 -1
- data/spec/support/models/pack.rb +0 -1
- data/spec/support/models/page.rb +3 -3
- data/spec/support/models/page_question.rb +1 -1
- data/spec/support/models/palette.rb +2 -2
- data/spec/support/models/parent.rb +2 -2
- data/spec/support/models/parent_doc.rb +1 -1
- data/spec/support/models/passport.rb +0 -1
- data/spec/support/models/patient.rb +2 -2
- data/spec/support/models/pdf_writer.rb +0 -1
- data/spec/support/models/pencil.rb +0 -1
- data/spec/support/models/person.rb +32 -28
- data/spec/support/models/pet.rb +1 -1
- data/spec/support/models/pet_owner.rb +1 -1
- data/spec/support/models/phone.rb +1 -2
- data/spec/support/models/piano.rb +0 -1
- data/spec/support/models/pizza.rb +1 -1
- data/spec/support/models/player.rb +5 -5
- data/spec/support/models/post.rb +12 -12
- data/spec/support/models/post_genre.rb +1 -1
- data/spec/support/models/powerup.rb +1 -2
- data/spec/support/models/preference.rb +2 -2
- data/spec/support/models/princess.rb +1 -1
- data/spec/support/models/product.rb +3 -3
- data/spec/support/models/profile.rb +2 -1
- data/spec/support/models/pronunciation.rb +1 -1
- data/spec/support/models/pub.rb +2 -2
- data/spec/support/models/publication/encyclopedia.rb +0 -1
- data/spec/support/models/publication/review.rb +0 -1
- data/spec/support/models/publication.rb +0 -1
- data/spec/support/models/purchase.rb +1 -1
- data/spec/support/models/purchased_item.rb +1 -1
- data/spec/support/models/question.rb +2 -2
- data/spec/support/models/quiz.rb +1 -1
- data/spec/support/models/rating.rb +1 -1
- data/spec/support/models/record.rb +2 -3
- data/spec/support/models/registry.rb +1 -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 +0 -1
- data/spec/support/models/sandbox/lib/models/lib_models_message.rb +0 -1
- data/spec/support/models/sandbox/sandbox_message.rb +0 -1
- data/spec/support/models/sandbox/sandbox_user.rb +0 -1
- data/spec/support/models/sandbox/subdir/sandbox_comment.rb +0 -1
- data/spec/support/models/sandwich.rb +1 -1
- data/spec/support/models/scheduler.rb +0 -1
- data/spec/support/models/school.rb +0 -1
- data/spec/support/models/scribe.rb +1 -1
- data/spec/support/models/sealer.rb +0 -1
- data/spec/support/models/seat.rb +0 -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 +2 -2
- data/spec/support/models/shape.rb +3 -3
- data/spec/support/models/shelf.rb +1 -1
- data/spec/support/models/shield.rb +2 -2
- data/spec/support/models/shipment_address.rb +0 -1
- data/spec/support/models/shipping_container.rb +1 -1
- data/spec/support/models/shipping_pack.rb +0 -1
- data/spec/support/models/shirt.rb +0 -1
- data/spec/support/models/shop.rb +2 -2
- data/spec/support/models/short_agent.rb +0 -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 -2
- data/spec/support/models/sound.rb +2 -2
- data/spec/support/models/spacer.rb +0 -1
- data/spec/support/models/square.rb +0 -1
- data/spec/support/models/staff.rb +0 -1
- data/spec/support/models/store_as_dup_test1.rb +2 -2
- data/spec/support/models/store_as_dup_test2.rb +1 -1
- data/spec/support/models/store_as_dup_test3.rb +2 -2
- data/spec/support/models/store_as_dup_test4.rb +1 -1
- data/spec/support/models/strategy.rb +0 -1
- data/spec/support/models/student.rb +1 -2
- data/spec/support/models/sub_item.rb +0 -1
- data/spec/support/models/subscription.rb +2 -2
- data/spec/support/models/survey.rb +2 -2
- data/spec/support/models/symptom.rb +2 -2
- data/spec/support/models/system_role.rb +2 -3
- data/spec/support/models/tag.rb +2 -2
- 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 +0 -1
- data/spec/support/models/title.rb +0 -1
- data/spec/support/models/tool.rb +3 -3
- data/spec/support/models/topping.rb +1 -1
- data/spec/support/models/toy.rb +0 -1
- data/spec/support/models/track.rb +1 -1
- data/spec/support/models/translation.rb +1 -1
- data/spec/support/models/tree.rb +2 -3
- data/spec/support/models/truck.rb +0 -1
- data/spec/support/models/updatable.rb +0 -1
- data/spec/support/models/user.rb +3 -4
- data/spec/support/models/user_account.rb +3 -3
- data/spec/support/models/validation_callback.rb +4 -4
- data/spec/support/models/vehicle.rb +2 -3
- data/spec/support/models/version.rb +1 -1
- data/spec/support/models/vertex.rb +0 -1
- data/spec/support/models/vet_visit.rb +1 -1
- data/spec/support/models/video.rb +2 -2
- data/spec/support/models/video_game.rb +0 -1
- data/spec/support/models/washer.rb +0 -1
- data/spec/support/models/weapon.rb +1 -2
- data/spec/support/models/wiki_page.rb +2 -3
- data/spec/support/models/word.rb +2 -2
- data/spec/support/models/word_origin.rb +1 -2
- data/spec/support/models/writer.rb +3 -3
- data/spec/support/rails_mock.rb +7 -12
- data/spec/support/shared/time.rb +0 -1
- data/spec/support/sinatra_mock.rb +4 -2
- data/spec/support/spec_config.rb +19 -18
- metadata +14 -2
|
@@ -1,52 +1,47 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
|
-
require
|
|
3
|
+
require 'spec_helper'
|
|
5
4
|
|
|
6
5
|
# Retrieve the singleton class for the given class.
|
|
7
6
|
def singleton_class_for(klass)
|
|
8
|
-
class <<klass; self; end
|
|
7
|
+
class << klass; self; end
|
|
9
8
|
end
|
|
10
9
|
|
|
11
10
|
# Helper method for removing a declared scope
|
|
12
11
|
def remove_scope(klass, scope)
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
return unless klass._declared_scopes[scope]
|
|
13
|
+
|
|
14
|
+
singleton_class_for(klass).remove_method(scope)
|
|
15
|
+
klass._declared_scopes.delete(scope)
|
|
17
16
|
end
|
|
18
17
|
|
|
19
18
|
describe Mongoid::Scopable do
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
context "when provided a proc" do
|
|
24
|
-
|
|
19
|
+
describe '.default_scope' do
|
|
20
|
+
context 'when provided a proc' do
|
|
25
21
|
let(:criteria) do
|
|
26
|
-
Band.where(name:
|
|
22
|
+
Band.where(name: 'Depeche Mode')
|
|
27
23
|
end
|
|
28
24
|
|
|
29
25
|
before do
|
|
30
|
-
Band.default_scope ->{ criteria }
|
|
26
|
+
Band.default_scope -> { criteria }
|
|
31
27
|
end
|
|
32
28
|
|
|
33
29
|
after do
|
|
34
30
|
Band.default_scoping = nil
|
|
35
31
|
end
|
|
36
32
|
|
|
37
|
-
it
|
|
33
|
+
it 'adds the default scope to the class' do
|
|
38
34
|
expect(Band.default_scoping.call).to eq(criteria)
|
|
39
35
|
end
|
|
40
36
|
|
|
41
|
-
it
|
|
37
|
+
it 'flags as being default scoped' do
|
|
42
38
|
expect(Band).to be_default_scoping
|
|
43
39
|
end
|
|
44
40
|
end
|
|
45
41
|
|
|
46
|
-
context
|
|
47
|
-
|
|
42
|
+
context 'when provided a block' do
|
|
48
43
|
let(:criteria) do
|
|
49
|
-
Band.where(name:
|
|
44
|
+
Band.where(name: 'Depeche Mode')
|
|
50
45
|
end
|
|
51
46
|
|
|
52
47
|
before do
|
|
@@ -57,18 +52,18 @@ describe Mongoid::Scopable do
|
|
|
57
52
|
Band.default_scoping = nil
|
|
58
53
|
end
|
|
59
54
|
|
|
60
|
-
it
|
|
55
|
+
it 'adds the default scope to the class' do
|
|
61
56
|
expect(Band.default_scoping.call).to eq(criteria)
|
|
62
57
|
end
|
|
63
58
|
|
|
64
|
-
it
|
|
59
|
+
it 'flags as being default scoped' do
|
|
65
60
|
expect(Band).to be_default_scoping
|
|
66
61
|
end
|
|
67
62
|
end
|
|
68
63
|
|
|
69
|
-
context
|
|
64
|
+
context 'when a class method' do
|
|
70
65
|
let(:criteria) do
|
|
71
|
-
Band.where(name:
|
|
66
|
+
Band.where(name: 'Depeche Mode')
|
|
72
67
|
end
|
|
73
68
|
|
|
74
69
|
before do
|
|
@@ -86,42 +81,40 @@ describe Mongoid::Scopable do
|
|
|
86
81
|
Object.send(:remove_const, :DefaultScopeAsClassMethod)
|
|
87
82
|
end
|
|
88
83
|
|
|
89
|
-
it
|
|
84
|
+
it 'adds the default scope to the class' do
|
|
90
85
|
pending 'https://jira.mongodb.org/browse/MONGOID-5483'
|
|
91
86
|
expect(DefaultScopeAsClassMethod.default_scoping.call).to eq(criteria)
|
|
92
87
|
end
|
|
93
88
|
|
|
94
|
-
it
|
|
89
|
+
it 'flags as being default scoped' do
|
|
95
90
|
pending 'https://jira.mongodb.org/browse/MONGOID-5483'
|
|
96
91
|
expect(DefaultScopeAsClassMethod).to be_default_scoping
|
|
97
92
|
end
|
|
98
93
|
end
|
|
99
94
|
|
|
100
|
-
context
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
expect {
|
|
95
|
+
context 'when provided a non proc' do
|
|
96
|
+
it 'raises an error' do
|
|
97
|
+
expect do
|
|
104
98
|
Band.default_scope({})
|
|
105
|
-
|
|
99
|
+
end.to raise_error(Mongoid::Errors::InvalidScope)
|
|
106
100
|
end
|
|
107
101
|
end
|
|
108
102
|
|
|
109
|
-
context
|
|
110
|
-
|
|
103
|
+
context 'when there is more then one default_scope' do
|
|
111
104
|
let(:criteria) do
|
|
112
|
-
->{ Band.where(name:
|
|
105
|
+
-> { Band.where(name: 'Depeche Mode') }
|
|
113
106
|
end
|
|
114
107
|
|
|
115
108
|
let(:additional_criteria) do
|
|
116
|
-
->{ Band.where(origin:
|
|
109
|
+
-> { Band.where(origin: 'England') }
|
|
117
110
|
end
|
|
118
111
|
|
|
119
112
|
let(:proc_criteria) do
|
|
120
|
-
->{ Band.where(active: true) }
|
|
113
|
+
-> { Band.where(active: true) }
|
|
121
114
|
end
|
|
122
115
|
|
|
123
116
|
let(:rand_criteria) do
|
|
124
|
-
->{ Band.gt(likes: Mongo::Monitoring.next_operation_id) }
|
|
117
|
+
-> { Band.gt(likes: Mongo::Monitoring.next_operation_id) }
|
|
125
118
|
end
|
|
126
119
|
|
|
127
120
|
before do
|
|
@@ -135,192 +128,177 @@ describe Mongoid::Scopable do
|
|
|
135
128
|
Band.default_scoping = nil
|
|
136
129
|
end
|
|
137
130
|
|
|
138
|
-
it
|
|
139
|
-
expect(Band.default_scoping.call.selector[
|
|
131
|
+
it 'adds the first default scope' do
|
|
132
|
+
expect(Band.default_scoping.call.selector['name']).to eq('Depeche Mode')
|
|
140
133
|
end
|
|
141
134
|
|
|
142
|
-
it
|
|
143
|
-
expect(Band.default_scoping.call.selector[
|
|
135
|
+
it 'adds the additional default scope' do
|
|
136
|
+
expect(Band.default_scoping.call.selector['origin']).to eq('England')
|
|
144
137
|
end
|
|
145
138
|
|
|
146
|
-
it
|
|
147
|
-
expect(Band.default_scoping.call.selector[
|
|
139
|
+
it 'adds the proc default scope' do
|
|
140
|
+
expect(Band.default_scoping.call.selector['active']).to be true
|
|
148
141
|
end
|
|
149
142
|
|
|
150
|
-
it
|
|
151
|
-
expect(Band.all.selector[
|
|
143
|
+
it 'delays execution of the merge until called' do
|
|
144
|
+
expect(Band.all.selector['likes']).not_to eq(Band.all.selector['likes'])
|
|
152
145
|
end
|
|
153
146
|
|
|
154
|
-
it
|
|
147
|
+
it 'flags as being default scoped' do
|
|
155
148
|
expect(Band).to be_default_scoping
|
|
156
149
|
end
|
|
157
150
|
end
|
|
158
151
|
|
|
159
|
-
context
|
|
160
|
-
|
|
161
|
-
let (:selector) do
|
|
152
|
+
context 'when parent class has default scope' do
|
|
153
|
+
let(:selector) do
|
|
162
154
|
AudibleSound.all.selector
|
|
163
155
|
end
|
|
164
156
|
|
|
165
157
|
it "the subclass doesn't duplicate the default scope in the selector" do
|
|
166
|
-
expect(selector).to eq({'active' => true})
|
|
158
|
+
expect(selector).to eq({ 'active' => true })
|
|
167
159
|
end
|
|
168
160
|
end
|
|
169
161
|
|
|
170
|
-
context
|
|
171
|
-
|
|
162
|
+
context 'when the default scope is dotted' do
|
|
172
163
|
let(:criteria) do
|
|
173
164
|
Band.where('tags.foo' => 'bar')
|
|
174
165
|
end
|
|
175
166
|
|
|
167
|
+
let(:band) do
|
|
168
|
+
Band.create!
|
|
169
|
+
end
|
|
170
|
+
|
|
176
171
|
before do
|
|
177
|
-
Band.default_scope ->{ criteria }
|
|
172
|
+
Band.default_scope -> { criteria }
|
|
173
|
+
band
|
|
178
174
|
end
|
|
179
175
|
|
|
180
176
|
after do
|
|
181
177
|
Band.default_scoping = nil
|
|
182
178
|
end
|
|
183
179
|
|
|
184
|
-
|
|
185
|
-
Band.create!
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
it "adds the scope as a dotted key attribute" do
|
|
180
|
+
it 'adds the scope as a dotted key attribute' do
|
|
189
181
|
expect(band.attributes['tags.foo']).to eq('bar')
|
|
190
182
|
end
|
|
191
183
|
|
|
192
|
-
it
|
|
184
|
+
it 'adds the default scope to the class' do
|
|
193
185
|
expect(Band.default_scoping.call).to eq(criteria)
|
|
194
186
|
end
|
|
195
187
|
|
|
196
|
-
it
|
|
188
|
+
it 'flags as being default scoped' do
|
|
197
189
|
expect(Band).to be_default_scoping
|
|
198
190
|
end
|
|
199
191
|
|
|
200
|
-
it
|
|
192
|
+
it 'does not find the correct document' do
|
|
201
193
|
expect(Band.count).to eq(0)
|
|
202
194
|
end
|
|
203
195
|
end
|
|
204
196
|
|
|
205
|
-
context
|
|
206
|
-
|
|
197
|
+
context 'when the default scope is dotted with a query' do
|
|
207
198
|
let(:criteria) do
|
|
208
|
-
Band.where('tags.foo' => {'$eq' => 'bar'})
|
|
199
|
+
Band.where('tags.foo' => { '$eq' => 'bar' })
|
|
200
|
+
end
|
|
201
|
+
let!(:band) do
|
|
202
|
+
Band.create!('tags' => { 'foo' => 'bar' })
|
|
209
203
|
end
|
|
210
204
|
|
|
211
205
|
before do
|
|
212
|
-
Band.default_scope ->{ criteria }
|
|
206
|
+
Band.default_scope -> { criteria }
|
|
213
207
|
end
|
|
214
208
|
|
|
215
209
|
after do
|
|
216
210
|
Band.default_scoping = nil
|
|
217
211
|
end
|
|
218
212
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
end
|
|
222
|
-
|
|
223
|
-
it "does not add the scope as a dotted key attribute" do
|
|
224
|
-
expect(band.attributes).to_not have_key('tags.foo')
|
|
213
|
+
it 'does not add the scope as a dotted key attribute' do
|
|
214
|
+
expect(band.attributes).not_to have_key('tags.foo')
|
|
225
215
|
end
|
|
226
216
|
|
|
227
|
-
it
|
|
217
|
+
it 'adds the default scope to the class' do
|
|
228
218
|
expect(Band.default_scoping.call).to eq(criteria)
|
|
229
219
|
end
|
|
230
220
|
|
|
231
|
-
it
|
|
221
|
+
it 'flags as being default scoped' do
|
|
232
222
|
expect(Band).to be_default_scoping
|
|
233
223
|
end
|
|
234
224
|
|
|
235
|
-
it
|
|
225
|
+
it 'finds the correct document' do
|
|
236
226
|
expect(Band.where.first).to eq(band)
|
|
237
227
|
end
|
|
238
228
|
end
|
|
239
229
|
end
|
|
240
230
|
|
|
241
|
-
describe
|
|
242
|
-
|
|
243
|
-
context "when a default scope exists" do
|
|
244
|
-
|
|
231
|
+
describe '.default_scopable?' do
|
|
232
|
+
context 'when a default scope exists' do
|
|
245
233
|
let(:criteria) do
|
|
246
|
-
Band.where(name:
|
|
234
|
+
Band.where(name: 'Depeche Mode')
|
|
247
235
|
end
|
|
248
236
|
|
|
249
237
|
before do
|
|
250
|
-
Band.default_scope ->{ criteria }
|
|
238
|
+
Band.default_scope -> { criteria }
|
|
251
239
|
end
|
|
252
240
|
|
|
253
241
|
after do
|
|
254
242
|
Band.default_scoping = nil
|
|
255
243
|
end
|
|
256
244
|
|
|
257
|
-
context
|
|
258
|
-
|
|
259
|
-
it "returns true" do
|
|
245
|
+
context 'when not in an unscoped block' do
|
|
246
|
+
it 'returns true' do
|
|
260
247
|
expect(Band).to be_default_scopable
|
|
261
248
|
end
|
|
262
249
|
end
|
|
263
250
|
|
|
264
|
-
context
|
|
265
|
-
|
|
266
|
-
it "returns false" do
|
|
251
|
+
context 'when in an unscoped block' do
|
|
252
|
+
it 'returns false' do
|
|
267
253
|
Band.unscoped do
|
|
268
|
-
expect(Band).
|
|
254
|
+
expect(Band).not_to be_default_scopable
|
|
269
255
|
end
|
|
270
256
|
end
|
|
271
257
|
end
|
|
272
258
|
end
|
|
273
259
|
|
|
274
|
-
context
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
expect(Band).to_not be_default_scopable
|
|
260
|
+
context 'when a default scope does not exist' do
|
|
261
|
+
it 'returns false' do
|
|
262
|
+
expect(Band).not_to be_default_scopable
|
|
278
263
|
end
|
|
279
264
|
end
|
|
280
265
|
end
|
|
281
266
|
|
|
282
|
-
describe
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
it "returns an empty criteria" do
|
|
267
|
+
describe '.queryable' do
|
|
268
|
+
context 'when no criteria exists on the stack' do
|
|
269
|
+
it 'returns an empty criteria' do
|
|
287
270
|
expect(Band.queryable.selector).to be_empty
|
|
288
271
|
end
|
|
289
272
|
|
|
290
|
-
context
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
expect(Band.queryable.embedded).to be(nil)
|
|
273
|
+
context 'when the class is not embedded' do
|
|
274
|
+
it 'returns a criteria with embedded set to nil' do
|
|
275
|
+
expect(Band.queryable.embedded).to be_nil
|
|
294
276
|
end
|
|
295
277
|
end
|
|
296
278
|
|
|
297
|
-
context
|
|
298
|
-
|
|
299
|
-
it "returns a criteria with embedded set to true" do
|
|
279
|
+
context 'when the class is embedded' do
|
|
280
|
+
it 'returns a criteria with embedded set to true' do
|
|
300
281
|
expect(Address.queryable.embedded).to be(true)
|
|
301
282
|
end
|
|
302
283
|
|
|
303
|
-
context
|
|
304
|
-
|
|
284
|
+
context 'when scopes are chained' do
|
|
305
285
|
let(:person) do
|
|
306
286
|
Person.create!
|
|
307
287
|
end
|
|
308
288
|
|
|
309
|
-
it
|
|
289
|
+
it 'constructs a criteria for an embedded relation' do
|
|
310
290
|
expect(person.addresses.without_postcode_ordered.embedded).to be(true)
|
|
311
291
|
end
|
|
312
292
|
end
|
|
313
293
|
end
|
|
314
294
|
end
|
|
315
295
|
|
|
316
|
-
context
|
|
317
|
-
|
|
296
|
+
context 'when a criteria exists on the stack' do
|
|
318
297
|
let(:criteria) do
|
|
319
|
-
Band.where(name:
|
|
298
|
+
Band.where(name: 'Depeche Mode')
|
|
320
299
|
end
|
|
321
300
|
|
|
322
|
-
context
|
|
323
|
-
|
|
301
|
+
context 'when using #current_scope=scope' do
|
|
324
302
|
before do
|
|
325
303
|
Mongoid::Threaded.current_scope = criteria
|
|
326
304
|
end
|
|
@@ -329,13 +307,12 @@ describe Mongoid::Scopable do
|
|
|
329
307
|
Mongoid::Threaded.current_scope = nil
|
|
330
308
|
end
|
|
331
309
|
|
|
332
|
-
it
|
|
310
|
+
it 'returns the criteria on the stack' do
|
|
333
311
|
expect(Band.queryable).to eq(criteria)
|
|
334
312
|
end
|
|
335
313
|
end
|
|
336
314
|
|
|
337
|
-
context
|
|
338
|
-
|
|
315
|
+
context 'when using #set_current_scope(scope, klass)' do
|
|
339
316
|
before do
|
|
340
317
|
Mongoid::Threaded.set_current_scope(criteria, Band)
|
|
341
318
|
end
|
|
@@ -344,21 +321,18 @@ describe Mongoid::Scopable do
|
|
|
344
321
|
Mongoid::Threaded.set_current_scope(nil, Band)
|
|
345
322
|
end
|
|
346
323
|
|
|
347
|
-
it
|
|
324
|
+
it 'returns the criteria on the stack' do
|
|
348
325
|
expect(Band.queryable).to eq(criteria)
|
|
349
326
|
end
|
|
350
327
|
end
|
|
351
328
|
end
|
|
352
329
|
end
|
|
353
330
|
|
|
354
|
-
describe
|
|
355
|
-
|
|
356
|
-
context "when provided a criteria" do
|
|
357
|
-
|
|
331
|
+
describe '.scope' do
|
|
332
|
+
context 'when provided a criteria' do
|
|
358
333
|
context 'when a collation is defined on the criteria' do
|
|
359
|
-
|
|
360
334
|
before do
|
|
361
|
-
Band.scope(:tests, ->{ Band.where(name: 'TESTING').collation(locale: 'en_US', strength: 2) })
|
|
335
|
+
Band.scope(:tests, -> { Band.where(name: 'TESTING').collation(locale: 'en_US', strength: 2) })
|
|
362
336
|
Band.create!(name: 'testing')
|
|
363
337
|
end
|
|
364
338
|
|
|
@@ -371,12 +345,11 @@ describe Mongoid::Scopable do
|
|
|
371
345
|
end
|
|
372
346
|
end
|
|
373
347
|
|
|
374
|
-
context
|
|
375
|
-
|
|
348
|
+
context 'when a block is provided' do
|
|
376
349
|
before do
|
|
377
|
-
Band.scope(:active, ->{ Band.where(active: true) }) do
|
|
350
|
+
Band.scope(:active, -> { Band.where(active: true) }) do
|
|
378
351
|
def add_origin
|
|
379
|
-
tap { |c| c.selector[:origin] =
|
|
352
|
+
tap { |c| c.selector[:origin] = 'Deutschland' }
|
|
380
353
|
end
|
|
381
354
|
end
|
|
382
355
|
end
|
|
@@ -389,17 +362,16 @@ describe Mongoid::Scopable do
|
|
|
389
362
|
Band.active.add_origin
|
|
390
363
|
end
|
|
391
364
|
|
|
392
|
-
it
|
|
393
|
-
expect(scope.selector).to eq({
|
|
365
|
+
it 'adds the extension to the scope' do
|
|
366
|
+
expect(scope.selector).to eq({ 'active' => true, 'origin' => 'Deutschland' })
|
|
394
367
|
end
|
|
395
368
|
end
|
|
396
369
|
|
|
397
|
-
context
|
|
398
|
-
|
|
370
|
+
context 'when scoping an embedded document' do
|
|
399
371
|
before do
|
|
400
372
|
Record.scope(
|
|
401
373
|
:tool,
|
|
402
|
-
->{ Record.where(:name.in => [
|
|
374
|
+
-> { Record.where(:name.in => %w[undertow aenima lateralus]) }
|
|
403
375
|
)
|
|
404
376
|
end
|
|
405
377
|
|
|
@@ -407,65 +379,60 @@ describe Mongoid::Scopable do
|
|
|
407
379
|
remove_scope(Record, :tool)
|
|
408
380
|
end
|
|
409
381
|
|
|
410
|
-
context
|
|
411
|
-
|
|
382
|
+
context 'when calling the scope' do
|
|
412
383
|
let(:band) do
|
|
413
384
|
Band.new
|
|
414
385
|
end
|
|
415
386
|
|
|
416
387
|
let!(:undertow) do
|
|
417
|
-
band.records.build(name:
|
|
388
|
+
band.records.build(name: 'undertow')
|
|
418
389
|
end
|
|
419
390
|
|
|
420
391
|
let(:scoped) do
|
|
421
392
|
band.records.tool
|
|
422
393
|
end
|
|
423
394
|
|
|
424
|
-
it
|
|
395
|
+
it 'returns the correct documents' do
|
|
425
396
|
expect(scoped).to eq([ undertow ])
|
|
426
397
|
end
|
|
427
398
|
end
|
|
428
399
|
end
|
|
429
400
|
|
|
430
|
-
context
|
|
431
|
-
|
|
401
|
+
context 'when no block is provided' do
|
|
432
402
|
before do
|
|
433
|
-
Band.scope(:active, ->{ Band.where(active: true).skip(10) })
|
|
403
|
+
Band.scope(:active, -> { Band.where(active: true).skip(10) })
|
|
434
404
|
end
|
|
435
405
|
|
|
436
406
|
after do
|
|
437
407
|
remove_scope(Band, :active)
|
|
438
408
|
end
|
|
439
409
|
|
|
440
|
-
it
|
|
410
|
+
it 'adds a method for the scope' do
|
|
441
411
|
expect(Band).to respond_to(:active)
|
|
442
412
|
end
|
|
443
413
|
|
|
444
|
-
context
|
|
445
|
-
|
|
446
|
-
context "when calling from the class" do
|
|
447
|
-
|
|
414
|
+
context 'when calling the scope' do
|
|
415
|
+
context 'when calling from the class' do
|
|
448
416
|
let(:scope) do
|
|
449
417
|
Band.active
|
|
450
418
|
end
|
|
451
419
|
|
|
452
|
-
it
|
|
420
|
+
it 'returns a criteria' do
|
|
453
421
|
expect(scope).to be_a(Mongoid::Criteria)
|
|
454
422
|
end
|
|
455
423
|
|
|
456
|
-
it
|
|
457
|
-
expect(scope.selector).to eq({
|
|
424
|
+
it 'contains the proper selector' do
|
|
425
|
+
expect(scope.selector).to eq({ 'active' => true })
|
|
458
426
|
end
|
|
459
427
|
|
|
460
|
-
it
|
|
428
|
+
it 'contains the proper options' do
|
|
461
429
|
expect(scope.options).to eq({ skip: 10 })
|
|
462
430
|
end
|
|
463
431
|
end
|
|
464
432
|
|
|
465
|
-
context
|
|
466
|
-
|
|
433
|
+
context 'when chained to another scope' do
|
|
467
434
|
before do
|
|
468
|
-
Band.scope(:english, ->{ Band.where(origin:
|
|
435
|
+
Band.scope(:english, -> { Band.where(origin: 'England') })
|
|
469
436
|
end
|
|
470
437
|
|
|
471
438
|
after do
|
|
@@ -476,113 +443,109 @@ describe Mongoid::Scopable do
|
|
|
476
443
|
Band.english.active
|
|
477
444
|
end
|
|
478
445
|
|
|
479
|
-
it
|
|
446
|
+
it 'returns a criteria' do
|
|
480
447
|
expect(scope).to be_a(Mongoid::Criteria)
|
|
481
448
|
end
|
|
482
449
|
|
|
483
|
-
it
|
|
484
|
-
expect(scope.selector).to eq({
|
|
450
|
+
it 'contains the proper selector' do
|
|
451
|
+
expect(scope.selector).to eq({ 'active' => true, 'origin' => 'England' })
|
|
485
452
|
end
|
|
486
453
|
|
|
487
|
-
it
|
|
454
|
+
it 'contains the proper options' do
|
|
488
455
|
expect(scope.options).to eq({ skip: 10 })
|
|
489
456
|
end
|
|
490
457
|
|
|
491
|
-
it
|
|
492
|
-
expect(Band.active.selector).to eq({
|
|
458
|
+
it 'does not modify the original scope' do
|
|
459
|
+
expect(Band.active.selector).to eq({ 'active' => true })
|
|
493
460
|
end
|
|
494
461
|
end
|
|
495
462
|
|
|
496
|
-
context
|
|
497
|
-
|
|
463
|
+
context 'when chained to a criteria' do
|
|
498
464
|
let(:criteria) do
|
|
499
|
-
Band.where(origin:
|
|
465
|
+
Band.where(origin: 'England')
|
|
500
466
|
end
|
|
501
467
|
|
|
502
468
|
let(:scope) do
|
|
503
469
|
criteria.active
|
|
504
470
|
end
|
|
505
471
|
|
|
506
|
-
it
|
|
472
|
+
it 'returns a criteria' do
|
|
507
473
|
expect(scope).to be_a(Mongoid::Criteria)
|
|
508
474
|
end
|
|
509
475
|
|
|
510
|
-
it
|
|
511
|
-
expect(scope.selector).to eq({
|
|
476
|
+
it 'contains the proper selector' do
|
|
477
|
+
expect(scope.selector).to eq({ 'origin' => 'England', 'active' => true })
|
|
512
478
|
end
|
|
513
479
|
|
|
514
|
-
it
|
|
480
|
+
it 'contains the proper options' do
|
|
515
481
|
expect(scope.options).to eq({ skip: 10 })
|
|
516
482
|
end
|
|
517
483
|
|
|
518
|
-
it
|
|
519
|
-
expect(Band.active.selector).to eq({
|
|
484
|
+
it 'does not modify the original scope' do
|
|
485
|
+
expect(Band.active.selector).to eq({ 'active' => true })
|
|
520
486
|
end
|
|
521
487
|
|
|
522
|
-
it
|
|
523
|
-
expect(criteria.selector).to eq({
|
|
488
|
+
it 'does not modify the original criteria' do
|
|
489
|
+
expect(criteria.selector).to eq({ 'origin' => 'England' })
|
|
524
490
|
end
|
|
525
491
|
end
|
|
526
492
|
end
|
|
527
493
|
end
|
|
528
494
|
|
|
529
|
-
context
|
|
530
|
-
|
|
531
|
-
context "when raising an error" do
|
|
495
|
+
context 'when the name conflict with an existing method' do
|
|
496
|
+
context 'when raising an error' do
|
|
532
497
|
config_override :scope_overwrite_exception, true
|
|
533
498
|
|
|
534
499
|
after do
|
|
535
500
|
remove_scope(Band, :active)
|
|
536
501
|
end
|
|
537
502
|
|
|
538
|
-
it
|
|
539
|
-
expect
|
|
540
|
-
Band.scope(:active, ->{ Band.where(active: true) })
|
|
541
|
-
Band.scope(:active, ->{ Band.where(active: true) })
|
|
542
|
-
|
|
503
|
+
it 'raises an exception' do
|
|
504
|
+
expect do
|
|
505
|
+
Band.scope(:active, -> { Band.where(active: true) })
|
|
506
|
+
Band.scope(:active, -> { Band.where(active: true) })
|
|
507
|
+
end.to raise_error(Mongoid::Errors::ScopeOverwrite)
|
|
543
508
|
end
|
|
544
509
|
end
|
|
545
510
|
|
|
546
|
-
context
|
|
511
|
+
context 'when not raising an error' do
|
|
547
512
|
config_override :scope_overwrite_exception, false
|
|
548
513
|
|
|
549
514
|
after do
|
|
550
515
|
remove_scope(Band, :active)
|
|
551
516
|
end
|
|
552
517
|
|
|
553
|
-
it
|
|
554
|
-
Band.scope(:active, ->{ Band.where(active: true) })
|
|
555
|
-
Band.scope(:active, ->{ Band.where(active: true) })
|
|
518
|
+
it 'raises no exception' do
|
|
519
|
+
Band.scope(:active, -> { Band.where(active: true) })
|
|
520
|
+
Band.scope(:active, -> { Band.where(active: true) })
|
|
556
521
|
end
|
|
557
522
|
end
|
|
558
523
|
end
|
|
559
524
|
end
|
|
560
525
|
|
|
561
|
-
context
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
context "when with optional and keyword arguments" do
|
|
526
|
+
context 'when provided a proc' do
|
|
527
|
+
context 'when a block is provided' do
|
|
528
|
+
context 'when with optional and keyword arguments' do
|
|
566
529
|
before do
|
|
567
|
-
Band.scope(:named_by,
|
|
530
|
+
Band.scope(:named_by, lambda { |name, deleted: false|
|
|
568
531
|
Band.where(name: name, deleted: deleted)
|
|
569
532
|
})
|
|
570
533
|
end
|
|
571
534
|
|
|
572
535
|
let(:scope) do
|
|
573
|
-
Band.named_by(
|
|
536
|
+
Band.named_by('Emily', deleted: true)
|
|
574
537
|
end
|
|
575
538
|
|
|
576
|
-
it
|
|
577
|
-
scope.selector.should
|
|
539
|
+
it 'sets the conditions from keyword arguments' do
|
|
540
|
+
scope.selector.should eq({ 'name' => 'Emily', 'deleted' => true })
|
|
578
541
|
end
|
|
579
542
|
end
|
|
580
543
|
|
|
581
|
-
context
|
|
544
|
+
context 'when without arguments' do
|
|
582
545
|
before do
|
|
583
|
-
Band.scope(:active, ->{ Band.where(active: true) }) do
|
|
546
|
+
Band.scope(:active, -> { Band.where(active: true) }) do
|
|
584
547
|
def add_origin
|
|
585
|
-
tap { |c| c.selector[:origin] =
|
|
548
|
+
tap { |c| c.selector[:origin] = 'Deutschland' }
|
|
586
549
|
end
|
|
587
550
|
end
|
|
588
551
|
end
|
|
@@ -595,22 +558,20 @@ describe Mongoid::Scopable do
|
|
|
595
558
|
Band.active.add_origin
|
|
596
559
|
end
|
|
597
560
|
|
|
598
|
-
it
|
|
599
|
-
expect(scope.selector).to eq({
|
|
561
|
+
it 'adds the extension to the scope' do
|
|
562
|
+
expect(scope.selector).to eq({ 'active' => true, 'origin' => 'Deutschland' })
|
|
600
563
|
end
|
|
601
564
|
end
|
|
602
565
|
end
|
|
603
566
|
|
|
604
567
|
context 'when the block is an none scope' do
|
|
605
|
-
|
|
606
568
|
before do
|
|
607
569
|
Simple.create!(name: 'Emily')
|
|
608
570
|
end
|
|
609
571
|
|
|
610
572
|
context 'when there is no default scope' do
|
|
611
|
-
|
|
612
573
|
before do
|
|
613
|
-
Simple.scope(:nothing, ->{ none })
|
|
574
|
+
Simple.scope(:nothing, -> { none })
|
|
614
575
|
end
|
|
615
576
|
|
|
616
577
|
it 'returns no results' do
|
|
@@ -619,14 +580,13 @@ describe Mongoid::Scopable do
|
|
|
619
580
|
end
|
|
620
581
|
|
|
621
582
|
context 'when there is a default scope' do
|
|
622
|
-
|
|
623
583
|
let(:criteria) do
|
|
624
|
-
Simple.where(name:
|
|
584
|
+
Simple.where(name: 'Emily')
|
|
625
585
|
end
|
|
626
586
|
|
|
627
587
|
before do
|
|
628
|
-
Simple.default_scope ->{ criteria }
|
|
629
|
-
Simple.scope(:nothing, ->{ none })
|
|
588
|
+
Simple.default_scope -> { criteria }
|
|
589
|
+
Simple.scope(:nothing, -> { none })
|
|
630
590
|
end
|
|
631
591
|
|
|
632
592
|
after do
|
|
@@ -637,13 +597,11 @@ describe Mongoid::Scopable do
|
|
|
637
597
|
expect(Simple.nothing).to be_empty
|
|
638
598
|
end
|
|
639
599
|
end
|
|
640
|
-
|
|
641
600
|
end
|
|
642
601
|
|
|
643
|
-
context
|
|
644
|
-
|
|
602
|
+
context 'when no block is provided' do
|
|
645
603
|
before do
|
|
646
|
-
Band.scope(:active, ->{ Band.where(active: true).skip(10) })
|
|
604
|
+
Band.scope(:active, -> { Band.where(active: true).skip(10) })
|
|
647
605
|
Band.scope(:named_by, ->(name) { Band.where(name: name) if name })
|
|
648
606
|
end
|
|
649
607
|
|
|
@@ -652,42 +610,38 @@ describe Mongoid::Scopable do
|
|
|
652
610
|
remove_scope(Band, :named_by)
|
|
653
611
|
end
|
|
654
612
|
|
|
655
|
-
it
|
|
613
|
+
it 'adds a method for the scope' do
|
|
656
614
|
expect(Band).to respond_to(:active)
|
|
657
615
|
end
|
|
658
616
|
|
|
659
|
-
context
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
it "returns a chainable empty scope" do
|
|
617
|
+
context 'when calling the scope' do
|
|
618
|
+
context 'when the scope would return nil' do
|
|
619
|
+
it 'returns a chainable empty scope' do
|
|
664
620
|
expect(Band.named_by(nil)).to be_a(Mongoid::Criteria)
|
|
665
621
|
end
|
|
666
622
|
end
|
|
667
623
|
|
|
668
|
-
context
|
|
669
|
-
|
|
624
|
+
context 'when calling from the class' do
|
|
670
625
|
let(:scope) do
|
|
671
626
|
Band.active
|
|
672
627
|
end
|
|
673
628
|
|
|
674
|
-
it
|
|
629
|
+
it 'returns a criteria' do
|
|
675
630
|
expect(scope).to be_a(Mongoid::Criteria)
|
|
676
631
|
end
|
|
677
632
|
|
|
678
|
-
it
|
|
679
|
-
expect(scope.selector).to eq({
|
|
633
|
+
it 'contains the proper selector' do
|
|
634
|
+
expect(scope.selector).to eq({ 'active' => true })
|
|
680
635
|
end
|
|
681
636
|
|
|
682
|
-
it
|
|
637
|
+
it 'contains the proper options' do
|
|
683
638
|
expect(scope.options).to eq({ skip: 10 })
|
|
684
639
|
end
|
|
685
640
|
end
|
|
686
641
|
|
|
687
|
-
context
|
|
688
|
-
|
|
642
|
+
context 'when chained to another scope' do
|
|
689
643
|
before do
|
|
690
|
-
Band.scope(:english, ->{ Band.where(origin:
|
|
644
|
+
Band.scope(:english, -> { Band.where(origin: 'England') })
|
|
691
645
|
end
|
|
692
646
|
|
|
693
647
|
after do
|
|
@@ -698,60 +652,58 @@ describe Mongoid::Scopable do
|
|
|
698
652
|
Band.english.active
|
|
699
653
|
end
|
|
700
654
|
|
|
701
|
-
it
|
|
655
|
+
it 'returns a criteria' do
|
|
702
656
|
expect(scope).to be_a(Mongoid::Criteria)
|
|
703
657
|
end
|
|
704
658
|
|
|
705
|
-
it
|
|
706
|
-
expect(scope.selector).to eq({
|
|
659
|
+
it 'contains the proper selector' do
|
|
660
|
+
expect(scope.selector).to eq({ 'active' => true, 'origin' => 'England' })
|
|
707
661
|
end
|
|
708
662
|
|
|
709
|
-
it
|
|
663
|
+
it 'contains the proper options' do
|
|
710
664
|
expect(scope.options).to eq({ skip: 10 })
|
|
711
665
|
end
|
|
712
666
|
|
|
713
|
-
it
|
|
714
|
-
expect(Band.active.selector).to eq({
|
|
667
|
+
it 'does not modify the original scope' do
|
|
668
|
+
expect(Band.active.selector).to eq({ 'active' => true })
|
|
715
669
|
end
|
|
716
670
|
end
|
|
717
671
|
|
|
718
|
-
context
|
|
719
|
-
|
|
672
|
+
context 'when chained to a criteria' do
|
|
720
673
|
let(:criteria) do
|
|
721
|
-
Band.where(origin:
|
|
674
|
+
Band.where(origin: 'England')
|
|
722
675
|
end
|
|
723
676
|
|
|
724
677
|
let(:scope) do
|
|
725
678
|
criteria.active
|
|
726
679
|
end
|
|
727
680
|
|
|
728
|
-
it
|
|
681
|
+
it 'returns a criteria' do
|
|
729
682
|
expect(scope).to be_a(Mongoid::Criteria)
|
|
730
683
|
end
|
|
731
684
|
|
|
732
|
-
it
|
|
733
|
-
expect(scope.selector).to eq({
|
|
685
|
+
it 'contains the proper selector' do
|
|
686
|
+
expect(scope.selector).to eq({ 'origin' => 'England', 'active' => true })
|
|
734
687
|
end
|
|
735
688
|
|
|
736
|
-
it
|
|
689
|
+
it 'contains the proper options' do
|
|
737
690
|
expect(scope.options).to eq({ skip: 10 })
|
|
738
691
|
end
|
|
739
692
|
|
|
740
|
-
it
|
|
741
|
-
expect(Band.active.selector).to eq({
|
|
693
|
+
it 'does not modify the original scope' do
|
|
694
|
+
expect(Band.active.selector).to eq({ 'active' => true })
|
|
742
695
|
end
|
|
743
696
|
|
|
744
|
-
it
|
|
745
|
-
expect(criteria.selector).to eq({
|
|
697
|
+
it 'does not modify the original criteria' do
|
|
698
|
+
expect(criteria.selector).to eq({ 'origin' => 'England' })
|
|
746
699
|
end
|
|
747
700
|
end
|
|
748
701
|
|
|
749
|
-
context
|
|
750
|
-
|
|
702
|
+
context 'when chaining scopes through more than one model' do
|
|
751
703
|
before do
|
|
752
|
-
Author.scope(:author, -> { where(author: true) }
|
|
753
|
-
Article.scope(:is_public, -> { where(public: true) }
|
|
754
|
-
Article.scope(:authored,
|
|
704
|
+
Author.scope(:author, -> { where(author: true) })
|
|
705
|
+
Article.scope(:is_public, -> { where(public: true) })
|
|
706
|
+
Article.scope(:authored, lambda {
|
|
755
707
|
author_ids = Author.author.pluck(:id)
|
|
756
708
|
where(:author_id.in => author_ids)
|
|
757
709
|
})
|
|
@@ -771,12 +723,11 @@ describe Mongoid::Scopable do
|
|
|
771
723
|
end
|
|
772
724
|
|
|
773
725
|
context "when calling another model's scope from within a scope" do
|
|
774
|
-
|
|
775
726
|
let(:authored_count) do
|
|
776
727
|
Article.authored.size
|
|
777
728
|
end
|
|
778
729
|
|
|
779
|
-
it
|
|
730
|
+
it 'returns the correct documents' do
|
|
780
731
|
expect(authored_count).to eq(3)
|
|
781
732
|
end
|
|
782
733
|
end
|
|
@@ -786,7 +737,7 @@ describe Mongoid::Scopable do
|
|
|
786
737
|
Article.is_public.authored.size
|
|
787
738
|
end
|
|
788
739
|
|
|
789
|
-
it
|
|
740
|
+
it 'returns the correct documents' do
|
|
790
741
|
expect(is_public_authored_count).to eq(2)
|
|
791
742
|
end
|
|
792
743
|
end
|
|
@@ -794,54 +745,50 @@ describe Mongoid::Scopable do
|
|
|
794
745
|
end
|
|
795
746
|
end
|
|
796
747
|
|
|
797
|
-
context
|
|
798
|
-
|
|
799
|
-
context "when raising an error" do
|
|
748
|
+
context 'when the name conflict with an existing method' do
|
|
749
|
+
context 'when raising an error' do
|
|
800
750
|
config_override :scope_overwrite_exception, true
|
|
801
751
|
|
|
802
752
|
after do
|
|
803
753
|
remove_scope(Band, :active)
|
|
804
754
|
end
|
|
805
755
|
|
|
806
|
-
it
|
|
807
|
-
expect
|
|
808
|
-
Band.scope(:active, ->{ Band.where(active: true) })
|
|
809
|
-
Band.scope(:active, ->{ Band.where(active: true) })
|
|
810
|
-
|
|
756
|
+
it 'raises an exception' do
|
|
757
|
+
expect do
|
|
758
|
+
Band.scope(:active, -> { Band.where(active: true) })
|
|
759
|
+
Band.scope(:active, -> { Band.where(active: true) })
|
|
760
|
+
end.to raise_error(Mongoid::Errors::ScopeOverwrite)
|
|
811
761
|
end
|
|
812
762
|
end
|
|
813
763
|
|
|
814
|
-
context
|
|
764
|
+
context 'when not raising an error' do
|
|
815
765
|
config_override :scope_overwrite_exception, false
|
|
816
766
|
|
|
817
767
|
after do
|
|
818
768
|
remove_scope(Band, :active)
|
|
819
769
|
end
|
|
820
770
|
|
|
821
|
-
it
|
|
822
|
-
Band.scope(:active, ->{ Band.where(active: true) })
|
|
823
|
-
Band.scope(:active, ->{ Band.where(active: true) })
|
|
771
|
+
it 'raises no exception' do
|
|
772
|
+
Band.scope(:active, -> { Band.where(active: true) })
|
|
773
|
+
Band.scope(:active, -> { Band.where(active: true) })
|
|
824
774
|
end
|
|
825
775
|
end
|
|
826
776
|
end
|
|
827
777
|
end
|
|
828
778
|
|
|
829
|
-
context
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
expect {
|
|
779
|
+
context 'when provided a non proc or criteria' do
|
|
780
|
+
it 'raises an error' do
|
|
781
|
+
expect do
|
|
833
782
|
Band.scope(:active, {})
|
|
834
|
-
|
|
783
|
+
end.to raise_error(Mongoid::Errors::InvalidScope)
|
|
835
784
|
end
|
|
836
785
|
end
|
|
837
786
|
|
|
838
|
-
context
|
|
839
|
-
|
|
840
|
-
context "when both scopes are or queries" do
|
|
841
|
-
|
|
787
|
+
context 'when chaining a proc with a proc' do
|
|
788
|
+
context 'when both scopes are or queries' do
|
|
842
789
|
before do
|
|
843
|
-
Band.scope(:xxx, ->{ Band.any_of({ :aaa.gt => 0 }, { :bbb.gt => 0 }) })
|
|
844
|
-
Band.scope(:yyy, ->{ Band.any_of({ :
|
|
790
|
+
Band.scope(:xxx, -> { Band.any_of({ :aaa.gt => 0 }, { :bbb.gt => 0 }) })
|
|
791
|
+
Band.scope(:yyy, -> { Band.any_of({ ccc: nil }, { :ccc.gt => 1 }) })
|
|
845
792
|
end
|
|
846
793
|
|
|
847
794
|
after do
|
|
@@ -853,26 +800,25 @@ describe Mongoid::Scopable do
|
|
|
853
800
|
Band.yyy.xxx
|
|
854
801
|
end
|
|
855
802
|
|
|
856
|
-
it
|
|
803
|
+
it 'properly chains the $or queries together' do
|
|
857
804
|
expect(criteria.selector).to eq({
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
805
|
+
'$or' => [
|
|
806
|
+
{ 'ccc' => nil },
|
|
807
|
+
{ 'ccc' => { '$gt' => 1.0 } }
|
|
808
|
+
],
|
|
809
|
+
'$and' => [ { '$or' => [
|
|
810
|
+
{ 'aaa' => { '$gt' => 0.0 } },
|
|
811
|
+
{ 'bbb' => { '$gt' => 0.0 } }
|
|
812
|
+
] } ]
|
|
813
|
+
})
|
|
867
814
|
end
|
|
868
815
|
end
|
|
869
816
|
end
|
|
870
817
|
|
|
871
|
-
context
|
|
872
|
-
|
|
818
|
+
context 'when working with a subclass' do
|
|
873
819
|
before do
|
|
874
|
-
Shape.scope(:located_at, ->(x,y) {Shape.where(x: x, y: y)})
|
|
875
|
-
Circle.scope(:with_radius, ->(r) {Circle.where(radius: r)})
|
|
820
|
+
Shape.scope(:located_at, ->(x, y) { Shape.where(x: x, y: y) })
|
|
821
|
+
Circle.scope(:with_radius, ->(r) { Circle.where(radius: r) })
|
|
876
822
|
end
|
|
877
823
|
|
|
878
824
|
after do
|
|
@@ -885,7 +831,7 @@ describe Mongoid::Scopable do
|
|
|
885
831
|
end
|
|
886
832
|
|
|
887
833
|
let(:circle_located_at) do
|
|
888
|
-
Circle.located_at(0,0)
|
|
834
|
+
Circle.located_at(0, 0)
|
|
889
835
|
end
|
|
890
836
|
|
|
891
837
|
let(:circle_scope_keys) do
|
|
@@ -893,20 +839,19 @@ describe Mongoid::Scopable do
|
|
|
893
839
|
end
|
|
894
840
|
|
|
895
841
|
it "doesn't include subclass scopes in superclass scope list" do
|
|
896
|
-
expect(shape_scope_keys).to
|
|
842
|
+
expect(shape_scope_keys).to contain_exactly(:located_at)
|
|
897
843
|
end
|
|
898
844
|
|
|
899
|
-
it
|
|
845
|
+
it 'includes superclass scope methods on subclass' do
|
|
900
846
|
expect(circle_located_at).to be_a(Mongoid::Criteria)
|
|
901
847
|
end
|
|
902
848
|
|
|
903
|
-
it
|
|
904
|
-
expect(circle_scope_keys).to match_array([
|
|
849
|
+
it 'includes superclass scopes in subclass scope list' do
|
|
850
|
+
expect(circle_scope_keys).to match_array(%i[located_at with_radius])
|
|
905
851
|
end
|
|
906
852
|
end
|
|
907
853
|
|
|
908
|
-
context
|
|
909
|
-
|
|
854
|
+
context 'when calling a scope defined in a parent class' do
|
|
910
855
|
before do
|
|
911
856
|
Shape.class_eval do
|
|
912
857
|
scope :visible, -> { large }
|
|
@@ -923,140 +868,128 @@ describe Mongoid::Scopable do
|
|
|
923
868
|
remove_scope(Circle, :large)
|
|
924
869
|
end
|
|
925
870
|
|
|
926
|
-
it
|
|
927
|
-
expect(Circle.visible.selector).to eq(
|
|
871
|
+
it 'uses subclass context for all the other used scopes' do
|
|
872
|
+
expect(Circle.visible.selector).to eq('radius' => 5)
|
|
928
873
|
end
|
|
929
874
|
end
|
|
930
875
|
end
|
|
931
876
|
|
|
932
|
-
describe
|
|
933
|
-
|
|
934
|
-
context "when no options are provided" do
|
|
935
|
-
|
|
877
|
+
describe '.scoped' do
|
|
878
|
+
context 'when no options are provided' do
|
|
936
879
|
let(:scoped) do
|
|
937
880
|
Band.scoped
|
|
938
881
|
end
|
|
939
882
|
|
|
940
|
-
it
|
|
883
|
+
it 'returns a criteria' do
|
|
941
884
|
expect(scoped).to be_a(Mongoid::Criteria)
|
|
942
885
|
end
|
|
943
886
|
|
|
944
|
-
it
|
|
887
|
+
it 'contains an empty selector' do
|
|
945
888
|
expect(scoped.selector).to be_empty
|
|
946
889
|
end
|
|
947
890
|
|
|
948
|
-
it
|
|
891
|
+
it 'contains empty options' do
|
|
949
892
|
expect(scoped.options).to be_empty
|
|
950
893
|
end
|
|
951
894
|
end
|
|
952
895
|
|
|
953
|
-
context
|
|
954
|
-
|
|
896
|
+
context 'when options are provided' do
|
|
955
897
|
let(:scoped) do
|
|
956
898
|
Band.scoped(skip: 10, limit: 10)
|
|
957
899
|
end
|
|
958
900
|
|
|
959
|
-
it
|
|
901
|
+
it 'returns a criteria' do
|
|
960
902
|
expect(scoped).to be_a(Mongoid::Criteria)
|
|
961
903
|
end
|
|
962
904
|
|
|
963
|
-
it
|
|
905
|
+
it 'contains an empty selector' do
|
|
964
906
|
expect(scoped.selector).to be_empty
|
|
965
907
|
end
|
|
966
908
|
|
|
967
|
-
it
|
|
909
|
+
it 'contains the options' do
|
|
968
910
|
expect(scoped.options).to eq({ skip: 10, limit: 10 })
|
|
969
911
|
end
|
|
970
912
|
end
|
|
971
913
|
|
|
972
|
-
context
|
|
973
|
-
|
|
914
|
+
context 'when a default scope exists' do
|
|
974
915
|
let(:criteria) do
|
|
975
|
-
Band.where(name:
|
|
916
|
+
Band.where(name: 'Depeche Mode')
|
|
917
|
+
end
|
|
918
|
+
let(:scoped) do
|
|
919
|
+
Band.scoped
|
|
976
920
|
end
|
|
977
921
|
|
|
978
922
|
before do
|
|
979
|
-
Band.default_scope ->{ criteria }
|
|
923
|
+
Band.default_scope -> { criteria }
|
|
980
924
|
end
|
|
981
925
|
|
|
982
926
|
after do
|
|
983
927
|
Band.default_scoping = nil
|
|
984
928
|
end
|
|
985
929
|
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
end
|
|
989
|
-
|
|
990
|
-
it "allows the default scope to be added" do
|
|
991
|
-
expect(scoped.selector).to eq({ "name" => "Depeche Mode" })
|
|
930
|
+
it 'allows the default scope to be added' do
|
|
931
|
+
expect(scoped.selector).to eq({ 'name' => 'Depeche Mode' })
|
|
992
932
|
end
|
|
993
933
|
|
|
994
|
-
context
|
|
995
|
-
|
|
934
|
+
context 'when chained after an unscoped criteria' do
|
|
996
935
|
let(:scoped) do
|
|
997
936
|
Band.unscoped.scoped
|
|
998
937
|
end
|
|
999
938
|
|
|
1000
|
-
it
|
|
1001
|
-
expect(scoped.selector).to eq({
|
|
939
|
+
it 'reapplies the default scope' do
|
|
940
|
+
expect(scoped.selector).to eq({ 'name' => 'Depeche Mode' })
|
|
1002
941
|
end
|
|
1003
942
|
end
|
|
1004
943
|
end
|
|
1005
944
|
end
|
|
1006
945
|
|
|
1007
|
-
describe
|
|
1008
|
-
|
|
946
|
+
describe '.unscoped' do
|
|
1009
947
|
let(:criteria) do
|
|
1010
|
-
Band.where(name:
|
|
948
|
+
Band.where(name: 'Depeche Mode')
|
|
1011
949
|
end
|
|
1012
950
|
|
|
1013
951
|
before do
|
|
1014
|
-
Band.default_scope ->{ criteria }
|
|
952
|
+
Band.default_scope -> { criteria }
|
|
1015
953
|
end
|
|
1016
954
|
|
|
1017
955
|
after do
|
|
1018
956
|
Band.default_scoping = nil
|
|
1019
957
|
end
|
|
1020
958
|
|
|
1021
|
-
context
|
|
1022
|
-
|
|
959
|
+
context 'when called directly' do
|
|
1023
960
|
let(:unscoped) do
|
|
1024
961
|
Band.unscoped
|
|
1025
962
|
end
|
|
1026
963
|
|
|
1027
|
-
it
|
|
964
|
+
it 'removes the default scope from the criteria' do
|
|
1028
965
|
expect(unscoped.selector).to be_empty
|
|
1029
966
|
end
|
|
1030
967
|
|
|
1031
|
-
context
|
|
1032
|
-
|
|
968
|
+
context 'when chained after a scoped criteria' do
|
|
1033
969
|
let(:unscoped) do
|
|
1034
970
|
Band.scoped.unscoped
|
|
1035
971
|
end
|
|
1036
972
|
|
|
1037
|
-
it
|
|
973
|
+
it 'removes all scoping' do
|
|
1038
974
|
expect(unscoped.selector).to be_empty
|
|
1039
975
|
end
|
|
1040
976
|
end
|
|
1041
977
|
|
|
1042
|
-
context
|
|
1043
|
-
|
|
1044
|
-
context "when scope is already defined in parent class" do
|
|
1045
|
-
|
|
978
|
+
context 'when default scope is in a super class' do
|
|
979
|
+
context 'when scope is already defined in parent class' do
|
|
1046
980
|
let(:unscoped) do
|
|
1047
981
|
class U1 < Kaleidoscope; end
|
|
1048
982
|
U1.unscoped.activated
|
|
1049
983
|
end
|
|
1050
984
|
|
|
1051
|
-
it
|
|
1052
|
-
expect(unscoped.selector).to eq({
|
|
985
|
+
it 'clears default scope' do
|
|
986
|
+
expect(unscoped.selector).to eq({ 'active' => true })
|
|
1053
987
|
end
|
|
1054
988
|
end
|
|
1055
989
|
|
|
1056
|
-
context
|
|
1057
|
-
|
|
990
|
+
context 'when the scope is created dynamically' do
|
|
1058
991
|
before do
|
|
1059
|
-
Band.scope(:active, ->{ Band.where(active: true) })
|
|
992
|
+
Band.scope(:active, -> { Band.where(active: true) })
|
|
1060
993
|
end
|
|
1061
994
|
|
|
1062
995
|
after do
|
|
@@ -1068,44 +1001,40 @@ describe Mongoid::Scopable do
|
|
|
1068
1001
|
U2.unscoped.active
|
|
1069
1002
|
end
|
|
1070
1003
|
|
|
1071
|
-
it
|
|
1072
|
-
expect(unscoped.selector).to eq({
|
|
1004
|
+
it 'clears default scope' do
|
|
1005
|
+
expect(unscoped.selector).to eq({ 'active' => true })
|
|
1073
1006
|
end
|
|
1074
1007
|
end
|
|
1075
1008
|
end
|
|
1076
1009
|
end
|
|
1077
1010
|
|
|
1078
|
-
context
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
it "does not allow default scoping to be added in the block" do
|
|
1011
|
+
context 'when used with a block' do
|
|
1012
|
+
context 'when a criteria is called in the block' do
|
|
1013
|
+
it 'does not allow default scoping to be added in the block' do
|
|
1083
1014
|
Band.unscoped do
|
|
1084
1015
|
expect(Band.skip(10).selector).to be_empty
|
|
1085
1016
|
end
|
|
1086
1017
|
end
|
|
1087
1018
|
end
|
|
1088
1019
|
|
|
1089
|
-
context
|
|
1090
|
-
|
|
1091
|
-
it "does not allow default scoping to be added in the block" do
|
|
1020
|
+
context 'when a call is made to scoped in the block' do
|
|
1021
|
+
it 'does not allow default scoping to be added in the block' do
|
|
1092
1022
|
Band.unscoped do
|
|
1093
1023
|
expect(Band.scoped.selector).to be_empty
|
|
1094
1024
|
end
|
|
1095
1025
|
end
|
|
1096
1026
|
end
|
|
1097
1027
|
|
|
1098
|
-
context
|
|
1099
|
-
|
|
1028
|
+
context 'when a named scope is called in the block' do
|
|
1100
1029
|
before do
|
|
1101
|
-
Band.scope(:skipped, ->{ Band.skip(10) })
|
|
1030
|
+
Band.scope(:skipped, -> { Band.skip(10) })
|
|
1102
1031
|
end
|
|
1103
1032
|
|
|
1104
1033
|
after do
|
|
1105
1034
|
remove_scope(Band, :skipped)
|
|
1106
1035
|
end
|
|
1107
1036
|
|
|
1108
|
-
it
|
|
1037
|
+
it 'does not allow the default scope to be applied' do
|
|
1109
1038
|
Band.unscoped do
|
|
1110
1039
|
expect(Band.skipped.selector).to be_empty
|
|
1111
1040
|
end
|
|
@@ -1114,76 +1043,71 @@ describe Mongoid::Scopable do
|
|
|
1114
1043
|
end
|
|
1115
1044
|
end
|
|
1116
1045
|
|
|
1117
|
-
describe
|
|
1118
|
-
|
|
1046
|
+
describe '.with_default_scope' do
|
|
1119
1047
|
let(:criteria) do
|
|
1120
|
-
Band.where(name:
|
|
1048
|
+
Band.where(name: 'Depeche Mode')
|
|
1121
1049
|
end
|
|
1122
1050
|
|
|
1123
1051
|
before do
|
|
1124
|
-
Band.default_scope ->{ criteria }
|
|
1052
|
+
Band.default_scope -> { criteria }
|
|
1125
1053
|
end
|
|
1126
1054
|
|
|
1127
1055
|
after do
|
|
1128
1056
|
Band.default_scoping = nil
|
|
1129
1057
|
end
|
|
1130
1058
|
|
|
1131
|
-
context
|
|
1132
|
-
|
|
1133
|
-
it "returns an empty criteria" do
|
|
1059
|
+
context 'when inside an unscoped block' do
|
|
1060
|
+
it 'returns an empty criteria' do
|
|
1134
1061
|
Band.unscoped do
|
|
1135
1062
|
expect(Band.with_default_scope.selector).to be_empty
|
|
1136
1063
|
end
|
|
1137
1064
|
end
|
|
1138
1065
|
end
|
|
1139
1066
|
|
|
1140
|
-
context
|
|
1141
|
-
|
|
1067
|
+
context 'when the criteria is unscoped' do
|
|
1142
1068
|
let(:scoped) do
|
|
1143
1069
|
Band.unscoped.with_default_scope
|
|
1144
1070
|
end
|
|
1145
1071
|
|
|
1146
|
-
it
|
|
1072
|
+
it 'returns an empty criteria' do
|
|
1147
1073
|
expect(scoped.selector).to be_empty
|
|
1148
1074
|
end
|
|
1149
1075
|
end
|
|
1150
1076
|
|
|
1151
|
-
context
|
|
1152
|
-
|
|
1077
|
+
context 'when no unscoping exists' do
|
|
1153
1078
|
let(:scoped) do
|
|
1154
1079
|
Band.with_default_scope
|
|
1155
1080
|
end
|
|
1156
1081
|
|
|
1157
|
-
it
|
|
1158
|
-
expect(scoped.selector).to eq({
|
|
1082
|
+
it 'returns a scoped criteria' do
|
|
1083
|
+
expect(scoped.selector).to eq({ 'name' => 'Depeche Mode' })
|
|
1159
1084
|
end
|
|
1160
1085
|
end
|
|
1161
1086
|
end
|
|
1162
1087
|
|
|
1163
|
-
describe
|
|
1164
|
-
|
|
1088
|
+
describe '.with_scope' do
|
|
1165
1089
|
let(:criteria) do
|
|
1166
1090
|
Band.where(active: true)
|
|
1167
1091
|
end
|
|
1168
1092
|
|
|
1169
|
-
it
|
|
1093
|
+
it 'yields to the criteria' do
|
|
1170
1094
|
Band.with_scope(criteria) do |crit|
|
|
1171
|
-
expect(crit.selector).to eq({
|
|
1095
|
+
expect(crit.selector).to eq({ 'active' => true })
|
|
1172
1096
|
end
|
|
1173
1097
|
end
|
|
1174
1098
|
|
|
1175
|
-
context
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1099
|
+
context 'when using #current_scope' do
|
|
1100
|
+
it 'pops the criteria off the stack' do
|
|
1101
|
+
Band.with_scope(criteria) do
|
|
1102
|
+
end
|
|
1179
1103
|
expect(Mongoid::Threaded.current_scope).to be_nil
|
|
1180
1104
|
end
|
|
1181
1105
|
end
|
|
1182
1106
|
|
|
1183
|
-
context
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1107
|
+
context 'when using #current_scope(klass)' do
|
|
1108
|
+
it 'pops the criteria off the stack' do
|
|
1109
|
+
Band.with_scope(criteria) do
|
|
1110
|
+
end
|
|
1187
1111
|
expect(Mongoid::Threaded.current_scope(Band)).to be_nil
|
|
1188
1112
|
end
|
|
1189
1113
|
end
|
|
@@ -1193,17 +1117,17 @@ describe Mongoid::Scopable do
|
|
|
1193
1117
|
let(:c2) { Band.where(active: false) }
|
|
1194
1118
|
|
|
1195
1119
|
it 'restores previous scope' do
|
|
1196
|
-
Band.with_scope(c1) do |
|
|
1197
|
-
Band.with_scope(c2) do |
|
|
1198
|
-
Mongoid::Threaded.current_scope(Band).selector.should
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1120
|
+
Band.with_scope(c1) do |_crit|
|
|
1121
|
+
Band.with_scope(c2) do |_crit2|
|
|
1122
|
+
Mongoid::Threaded.current_scope(Band).selector.should eq(
|
|
1123
|
+
{
|
|
1124
|
+
'active' => true,
|
|
1125
|
+
'$and' => [ { 'active' => false } ]
|
|
1126
|
+
}
|
|
1127
|
+
)
|
|
1202
1128
|
end
|
|
1203
1129
|
|
|
1204
|
-
Mongoid::Threaded.current_scope(Band).selector.should
|
|
1205
|
-
'active' => true,
|
|
1206
|
-
}
|
|
1130
|
+
Mongoid::Threaded.current_scope(Band).selector.should eq({ 'active' => true })
|
|
1207
1131
|
end
|
|
1208
1132
|
end
|
|
1209
1133
|
end
|
|
@@ -1212,29 +1136,26 @@ describe Mongoid::Scopable do
|
|
|
1212
1136
|
let(:c1) { Band.where(active: true) }
|
|
1213
1137
|
|
|
1214
1138
|
it 'restores previous scope' do
|
|
1215
|
-
Band.with_scope(c1) do |
|
|
1216
|
-
Band.unscoped do |
|
|
1217
|
-
Mongoid::Threaded.current_scope(Band).should
|
|
1139
|
+
Band.with_scope(c1) do |_crit|
|
|
1140
|
+
Band.unscoped do |_crit2|
|
|
1141
|
+
Mongoid::Threaded.current_scope(Band).should be_nil
|
|
1218
1142
|
end
|
|
1219
1143
|
|
|
1220
|
-
Mongoid::Threaded.current_scope(Band).selector.should
|
|
1221
|
-
'active' => true,
|
|
1222
|
-
}
|
|
1144
|
+
Mongoid::Threaded.current_scope(Band).selector.should eq({ 'active' => true })
|
|
1223
1145
|
end
|
|
1224
1146
|
end
|
|
1225
1147
|
end
|
|
1226
1148
|
end
|
|
1227
1149
|
|
|
1228
|
-
describe
|
|
1229
|
-
|
|
1230
|
-
it "sets the threading options" do
|
|
1150
|
+
describe '.without_default_scope' do
|
|
1151
|
+
it 'sets the threading options' do
|
|
1231
1152
|
Band.without_default_scope do
|
|
1232
1153
|
expect(Mongoid::Threaded).to be_executing(:without_default_scope)
|
|
1233
1154
|
expect(Mongoid::Threaded.without_default_scope?(Band)).to be(true)
|
|
1234
1155
|
end
|
|
1235
1156
|
end
|
|
1236
1157
|
|
|
1237
|
-
it
|
|
1158
|
+
it 'suppresses default scope on the given model within the given block' do
|
|
1238
1159
|
Appointment.without_default_scope do
|
|
1239
1160
|
expect(Appointment.all.selector).to be_empty
|
|
1240
1161
|
end
|
|
@@ -1247,14 +1168,14 @@ describe Mongoid::Scopable do
|
|
|
1247
1168
|
end
|
|
1248
1169
|
end
|
|
1249
1170
|
|
|
1250
|
-
describe
|
|
1251
|
-
context
|
|
1171
|
+
describe 'scoped queries' do
|
|
1172
|
+
context 'with a default scope' do
|
|
1252
1173
|
let(:criteria) do
|
|
1253
|
-
Band.where(name:
|
|
1174
|
+
Band.where(name: 'Depeche Mode')
|
|
1254
1175
|
end
|
|
1255
1176
|
|
|
1256
1177
|
before do
|
|
1257
|
-
Band.default_scope ->{ criteria }
|
|
1178
|
+
Band.default_scope -> { criteria }
|
|
1258
1179
|
Band.scope :unscoped_everyone, -> { unscoped }
|
|
1259
1180
|
Band.scope :removed_default, -> { scoped.remove_scoping(all) }
|
|
1260
1181
|
|
|
@@ -1268,7 +1189,7 @@ describe Mongoid::Scopable do
|
|
|
1268
1189
|
remove_scope Band, :removed_default
|
|
1269
1190
|
end
|
|
1270
1191
|
|
|
1271
|
-
context
|
|
1192
|
+
context 'when allow_scopes_to_unset_default_scope == false' do # default for <= 9
|
|
1272
1193
|
config_override :allow_scopes_to_unset_default_scope, false
|
|
1273
1194
|
|
|
1274
1195
|
it 'merges the default scope into the query with unscoped' do
|
|
@@ -1280,7 +1201,7 @@ describe Mongoid::Scopable do
|
|
|
1280
1201
|
end
|
|
1281
1202
|
end
|
|
1282
1203
|
|
|
1283
|
-
context
|
|
1204
|
+
context 'when allow_scopes_to_unset_default_scope == true' do # default for >= 10
|
|
1284
1205
|
config_override :allow_scopes_to_unset_default_scope, true
|
|
1285
1206
|
|
|
1286
1207
|
it 'does not merge the default scope into the query with unscoped' do
|