mongoid 3.1.6 → 4.0.2
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 +479 -8
- data/README.md +10 -7
- data/lib/config/locales/en.yml +34 -20
- data/lib/mongoid.rb +10 -76
- data/lib/mongoid/atomic.rb +3 -14
- data/lib/mongoid/atomic/paths/embedded.rb +0 -30
- data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
- data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
- data/lib/mongoid/atomic/paths/root.rb +0 -13
- data/lib/mongoid/attributes.rb +65 -101
- data/lib/mongoid/attributes/dynamic.rb +154 -0
- data/lib/mongoid/attributes/nested.rb +82 -0
- data/lib/mongoid/attributes/processing.rb +13 -66
- data/lib/mongoid/{dirty.rb → changeable.rb} +32 -2
- data/lib/mongoid/composable.rb +105 -0
- data/lib/mongoid/config.rb +3 -9
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/contextual.rb +2 -0
- data/lib/mongoid/contextual/aggregable/memory.rb +2 -2
- data/lib/mongoid/contextual/aggregable/mongo.rb +7 -9
- data/lib/mongoid/contextual/atomic.rb +53 -53
- data/lib/mongoid/contextual/geo_near.rb +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +4 -2
- data/lib/mongoid/contextual/memory.rb +23 -11
- data/lib/mongoid/contextual/mongo.rb +75 -57
- data/lib/mongoid/contextual/none.rb +90 -0
- data/lib/mongoid/contextual/text_search.rb +178 -0
- data/lib/mongoid/copyable.rb +2 -3
- data/lib/mongoid/criteria.rb +39 -34
- data/lib/mongoid/criteria/#findable.rb# +141 -0
- data/lib/mongoid/{criterion → criteria}/findable.rb +7 -47
- data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
- data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
- data/lib/mongoid/{criterion → criteria}/modifiable.rb +28 -8
- data/lib/mongoid/criteria/permission.rb +70 -0
- data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
- data/lib/mongoid/document.rb +39 -24
- data/lib/mongoid/errors.rb +4 -1
- data/lib/mongoid/errors/document_not_destroyed.rb +25 -0
- data/lib/mongoid/errors/document_not_found.rb +2 -1
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_parent.rb +26 -0
- data/lib/mongoid/errors/invalid_value.rb +16 -0
- data/lib/mongoid/errors/mongoid_error.rb +1 -1
- data/lib/mongoid/errors/readonly_document.rb +24 -0
- data/lib/mongoid/extensions.rb +15 -7
- data/lib/mongoid/extensions/array.rb +3 -3
- data/lib/mongoid/extensions/big_decimal.rb +1 -1
- data/lib/mongoid/extensions/boolean.rb +15 -17
- data/lib/mongoid/extensions/date.rb +1 -1
- data/lib/mongoid/extensions/date_time.rb +3 -3
- data/lib/mongoid/extensions/float.rb +2 -1
- data/lib/mongoid/extensions/hash.rb +3 -3
- data/lib/mongoid/extensions/integer.rb +1 -1
- data/lib/mongoid/extensions/object.rb +7 -7
- data/lib/mongoid/extensions/object_id.rb +5 -5
- data/lib/mongoid/extensions/range.rb +9 -3
- data/lib/mongoid/extensions/regexp.rb +1 -1
- data/lib/mongoid/extensions/set.rb +1 -1
- data/lib/mongoid/extensions/string.rb +6 -18
- data/lib/mongoid/extensions/symbol.rb +1 -1
- data/lib/mongoid/extensions/time.rb +3 -3
- data/lib/mongoid/extensions/time_with_zone.rb +1 -1
- data/lib/mongoid/factory.rb +8 -6
- data/lib/mongoid/fields.rb +41 -8
- data/lib/mongoid/fields/foreign_key.rb +3 -3
- data/lib/mongoid/fields/localized.rb +1 -1
- data/lib/mongoid/fields/standard.rb +5 -17
- data/lib/mongoid/fields/validators/macro.rb +15 -5
- data/lib/mongoid/{finders.rb → findable.rb} +35 -7
- data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
- data/lib/mongoid/indexable/specification.rb +104 -0
- data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
- data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
- data/lib/mongoid/{callbacks.rb → interceptable.rb} +30 -62
- data/lib/mongoid/log_subscriber.rb +55 -0
- data/lib/mongoid/matchable.rb +152 -0
- data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/ne.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
- data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
- data/lib/mongoid/persistable.rb +216 -0
- data/lib/mongoid/persistable/creatable.rb +189 -0
- data/lib/mongoid/persistable/deletable.rb +149 -0
- data/lib/mongoid/persistable/destroyable.rb +60 -0
- data/lib/mongoid/persistable/incrementable.rb +36 -0
- data/lib/mongoid/persistable/logical.rb +38 -0
- data/lib/mongoid/persistable/poppable.rb +39 -0
- data/lib/mongoid/persistable/pullable.rb +55 -0
- data/lib/mongoid/persistable/pushable.rb +62 -0
- data/lib/mongoid/persistable/renamable.rb +35 -0
- data/lib/mongoid/persistable/savable.rb +52 -0
- data/lib/mongoid/persistable/settable.rb +33 -0
- data/lib/mongoid/persistable/unsettable.rb +36 -0
- data/lib/mongoid/persistable/updatable.rb +153 -0
- data/lib/mongoid/persistable/upsertable.rb +55 -0
- data/lib/mongoid/positional.rb +71 -0
- data/lib/mongoid/query_cache.rb +255 -0
- data/lib/mongoid/railtie.rb +34 -60
- data/lib/mongoid/railties/database.rake +9 -25
- data/lib/mongoid/relations.rb +11 -25
- data/lib/mongoid/relations/accessors.rb +15 -51
- data/lib/mongoid/relations/auto_save.rb +15 -36
- data/lib/mongoid/relations/binding.rb +2 -25
- data/lib/mongoid/relations/bindings/embedded/in.rb +1 -1
- data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
- data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -2
- data/lib/mongoid/relations/builder.rb +1 -1
- data/lib/mongoid/relations/builders.rb +2 -2
- data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -6
- data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
- data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
- data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
- data/lib/mongoid/relations/cascading.rb +3 -5
- data/lib/mongoid/relations/constraint.rb +1 -1
- data/lib/mongoid/relations/conversions.rb +1 -1
- data/lib/mongoid/relations/counter_cache.rb +39 -15
- data/lib/mongoid/relations/eager.rb +46 -0
- data/lib/mongoid/relations/eager/base.rb +149 -0
- data/lib/mongoid/relations/eager/belongs_to.rb +31 -0
- data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +47 -0
- data/lib/mongoid/relations/eager/has_many.rb +38 -0
- data/lib/mongoid/relations/eager/has_one.rb +30 -0
- data/lib/mongoid/relations/embedded/batchable.rb +4 -5
- data/lib/mongoid/relations/embedded/in.rb +4 -4
- data/lib/mongoid/relations/embedded/many.rb +14 -32
- data/lib/mongoid/relations/embedded/one.rb +1 -1
- data/lib/mongoid/relations/macros.rb +3 -4
- data/lib/mongoid/relations/many.rb +51 -31
- data/lib/mongoid/relations/marshalable.rb +3 -3
- data/lib/mongoid/relations/metadata.rb +14 -79
- data/lib/mongoid/relations/nested_builder.rb +2 -2
- data/lib/mongoid/relations/one.rb +1 -1
- data/lib/mongoid/relations/options.rb +1 -0
- data/lib/mongoid/relations/polymorphic.rb +0 -1
- data/lib/mongoid/relations/proxy.rb +21 -41
- data/lib/mongoid/relations/referenced/in.rb +4 -20
- data/lib/mongoid/relations/referenced/many.rb +22 -35
- data/lib/mongoid/relations/referenced/many_to_many.rb +19 -42
- data/lib/mongoid/relations/referenced/one.rb +6 -25
- data/lib/mongoid/relations/synchronization.rb +4 -4
- data/lib/mongoid/relations/targets/enumerable.rb +10 -10
- data/lib/mongoid/relations/touchable.rb +34 -1
- data/lib/mongoid/{reloading.rb → reloadable.rb} +7 -5
- data/lib/mongoid/{scoping.rb → scopable.rb} +36 -36
- data/lib/mongoid/selectable.rb +59 -0
- data/lib/mongoid/{serialization.rb → serializable.rb} +11 -2
- data/lib/mongoid/sessions.rb +37 -345
- data/lib/mongoid/sessions/factory.rb +2 -0
- data/lib/mongoid/sessions/options.rb +185 -0
- data/lib/mongoid/sessions/storage_options.rb +140 -0
- data/lib/mongoid/sessions/thread_options.rb +19 -0
- data/lib/mongoid/sessions/validators/storage.rb +16 -3
- data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
- data/lib/mongoid/{state.rb → stateful.rb} +13 -1
- data/lib/mongoid/support/query_counter.rb +23 -0
- data/lib/mongoid/tasks/database.rake +31 -0
- data/lib/mongoid/tasks/database.rb +107 -0
- data/lib/mongoid/threaded.rb +26 -172
- data/lib/mongoid/threaded/lifecycle.rb +0 -28
- data/lib/mongoid/timestamps/updated/short.rb +2 -2
- data/lib/mongoid/{hierarchy.rb → traversable.rb} +15 -7
- data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
- data/lib/mongoid/{validations → validatable}/associated.rb +4 -2
- data/lib/mongoid/{validations → validatable}/format.rb +1 -1
- data/lib/mongoid/{validations → validatable}/length.rb +1 -1
- data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
- data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
- data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
- data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
- data/lib/mongoid/{validations → validatable}/uniqueness.rb +25 -21
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +46 -25
- data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
- data/lib/rails/generators/mongoid_generator.rb +3 -40
- data/lib/rails/mongoid.rb +0 -122
- data/lib/support/ruby_version.rb +1 -1
- data/spec/app/models/account.rb +2 -6
- data/spec/app/models/acolyte.rb +2 -1
- data/spec/app/models/actor.rb +0 -1
- data/spec/app/models/address.rb +8 -3
- data/spec/app/models/animal.rb +1 -1
- data/spec/app/models/appointment.rb +3 -3
- data/spec/app/models/article.rb +1 -4
- data/spec/app/models/audio.rb +5 -0
- data/spec/app/models/author.rb +0 -2
- data/spec/app/models/band.rb +3 -2
- data/spec/app/models/bar.rb +1 -0
- data/spec/app/models/book.rb +1 -0
- data/spec/app/models/building.rb +0 -2
- data/spec/app/models/building_address.rb +0 -2
- data/spec/app/models/bus.rb +1 -1
- data/spec/app/models/canvas.rb +1 -1
- data/spec/app/models/contextable_item.rb +5 -0
- data/spec/app/models/contractor.rb +0 -2
- data/spec/app/models/country_code.rb +1 -1
- data/spec/app/models/definition.rb +2 -2
- data/spec/app/models/dog.rb +1 -1
- data/spec/app/models/draft.rb +9 -0
- data/spec/app/models/dragon.rb +4 -0
- data/spec/app/models/drug.rb +1 -3
- data/spec/app/models/dungeon.rb +4 -0
- data/spec/app/models/edit.rb +5 -0
- data/spec/app/models/even.rb +7 -0
- data/spec/app/models/event.rb +1 -1
- data/spec/app/models/filesystem.rb +1 -0
- data/spec/app/models/fish.rb +0 -1
- data/spec/app/models/fruits.rb +6 -0
- data/spec/app/models/game.rb +0 -2
- data/spec/app/models/house.rb +1 -3
- data/spec/app/models/id_key.rb +6 -0
- data/spec/app/models/item.rb +1 -5
- data/spec/app/models/jar.rb +1 -1
- data/spec/app/models/label.rb +4 -4
- data/spec/app/models/line_item.rb +1 -1
- data/spec/app/models/login.rb +1 -1
- data/spec/app/models/message.rb +8 -0
- data/spec/app/models/movie.rb +1 -0
- data/spec/app/models/name.rb +3 -3
- data/spec/app/models/note.rb +3 -1
- data/spec/app/models/odd.rb +7 -0
- data/spec/app/models/oscar.rb +1 -1
- data/spec/app/models/parent_doc.rb +1 -1
- data/spec/app/models/person.rb +16 -10
- data/spec/app/models/phone.rb +1 -3
- data/spec/app/models/player.rb +3 -3
- data/spec/app/models/post.rb +5 -3
- data/spec/app/models/preference.rb +1 -1
- data/spec/app/models/quiz.rb +0 -3
- data/spec/app/models/record.rb +10 -5
- data/spec/app/models/registry.rb +1 -1
- data/spec/app/models/server.rb +1 -1
- data/spec/app/models/service.rb +3 -3
- data/spec/app/models/sound.rb +5 -0
- data/spec/app/models/symptom.rb +1 -1
- data/spec/app/models/template.rb +1 -1
- data/spec/app/models/title.rb +0 -1
- data/spec/app/models/track.rb +5 -5
- data/spec/app/models/tree.rb +3 -3
- data/spec/app/models/video.rb +1 -5
- data/spec/app/models/wiki_page.rb +2 -5
- data/spec/app/models/word.rb +3 -0
- data/spec/app/models/word_origin.rb +1 -1
- data/spec/config/mongoid.yml +7 -8
- data/spec/helpers.rb +18 -0
- data/spec/mongoid/#atomic_spec.rb# +365 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
- data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
- data/spec/mongoid/atomic/paths_spec.rb +19 -19
- data/spec/mongoid/atomic_spec.rb +19 -19
- data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +474 -592
- data/spec/mongoid/attributes/readonly_spec.rb +58 -18
- data/spec/mongoid/attributes_spec.rb +349 -434
- data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +203 -153
- data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
- data/spec/mongoid/config/environment_spec.rb +3 -3
- data/spec/mongoid/config/options_spec.rb +6 -6
- data/spec/mongoid/config_spec.rb +24 -48
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +78 -38
- data/spec/mongoid/contextual/atomic_spec.rb +60 -56
- data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
- data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
- data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
- data/spec/mongoid/contextual/memory_spec.rb +156 -94
- data/spec/mongoid/contextual/mongo_spec.rb +238 -150
- data/spec/mongoid/contextual/none_spec.rb +127 -0
- data/spec/mongoid/contextual/text_search_spec.rb +209 -0
- data/spec/mongoid/copyable_spec.rb +56 -68
- data/spec/mongoid/criteria/findable_spec.rb +991 -0
- data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
- data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
- data/spec/mongoid/criteria/modifiable_spec.rb +1252 -0
- data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
- data/spec/mongoid/criteria_spec.rb +715 -2421
- data/spec/mongoid/document_spec.rb +171 -121
- data/spec/mongoid/equality_spec.rb +22 -22
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
- data/spec/mongoid/errors/callback_spec.rb +3 -3
- data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +33 -0
- data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
- data/spec/mongoid/errors/eager_load_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_scope_spec.rb +5 -5
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
- data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
- data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
- data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
- data/spec/mongoid/errors/mongoid_error_spec.rb +8 -8
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
- data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
- data/spec/mongoid/errors/no_parent_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
- data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
- data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
- data/spec/mongoid/errors/readonly_document_spec.rb +29 -0
- data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
- data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
- data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
- data/spec/mongoid/errors/validations_spec.rb +7 -7
- data/spec/mongoid/extensions/array_spec.rb +61 -61
- data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
- data/spec/mongoid/extensions/binary_spec.rb +12 -12
- data/spec/mongoid/extensions/boolean_spec.rb +18 -18
- data/spec/mongoid/extensions/date_spec.rb +13 -13
- data/spec/mongoid/extensions/date_time_spec.rb +8 -8
- data/spec/mongoid/extensions/false_class_spec.rb +5 -5
- data/spec/mongoid/extensions/float_spec.rb +29 -15
- data/spec/mongoid/extensions/hash_spec.rb +29 -29
- data/spec/mongoid/extensions/integer_spec.rb +15 -15
- data/spec/mongoid/extensions/module_spec.rb +2 -2
- data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
- data/spec/mongoid/extensions/object_id_spec.rb +134 -134
- data/spec/mongoid/extensions/object_spec.rb +26 -26
- data/spec/mongoid/extensions/range_spec.rb +61 -12
- data/spec/mongoid/extensions/regexp_spec.rb +4 -4
- data/spec/mongoid/extensions/set_spec.rb +4 -4
- data/spec/mongoid/extensions/string_spec.rb +35 -46
- data/spec/mongoid/extensions/symbol_spec.rb +9 -9
- data/spec/mongoid/extensions/time_spec.rb +49 -49
- data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
- data/spec/mongoid/extensions/true_class_spec.rb +5 -5
- data/spec/mongoid/extensions_spec.rb +29 -0
- data/spec/mongoid/factory_spec.rb +15 -15
- data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
- data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
- data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
- data/spec/mongoid/fields/localized_spec.rb +38 -23
- data/spec/mongoid/fields/standard_spec.rb +12 -12
- data/spec/mongoid/fields_spec.rb +263 -217
- data/spec/mongoid/findable_spec.rb +509 -0
- data/spec/mongoid/indexable/specification_spec.rb +102 -0
- data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
- data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
- data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +117 -116
- data/spec/mongoid/log_subscriber_spec.rb +75 -0
- data/spec/mongoid/loggable_spec.rb +1 -1
- data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
- data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
- data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
- data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
- data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
- data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
- data/spec/mongoid/matchable/in_spec.rb +49 -0
- data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
- data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
- data/spec/mongoid/matchable/ne_spec.rb +46 -0
- data/spec/mongoid/matchable/nin_spec.rb +48 -0
- data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
- data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
- data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
- data/spec/mongoid/persistable/creatable_spec.rb +553 -0
- data/spec/mongoid/persistable/deletable_spec.rb +218 -0
- data/spec/mongoid/persistable/destroyable_spec.rb +192 -0
- data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
- data/spec/mongoid/persistable/logical_spec.rb +143 -0
- data/spec/mongoid/persistable/poppable_spec.rb +115 -0
- data/spec/mongoid/persistable/pullable_spec.rb +228 -0
- data/spec/mongoid/persistable/pushable_spec.rb +258 -0
- data/spec/mongoid/persistable/renamable_spec.rb +135 -0
- data/spec/mongoid/persistable/savable_spec.rb +498 -0
- data/spec/mongoid/persistable/settable_spec.rb +162 -0
- data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
- data/spec/mongoid/persistable/updatable_spec.rb +558 -0
- data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
- data/spec/mongoid/persistable_spec.rb +206 -0
- data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +14 -19
- data/spec/mongoid/query_cache_spec.rb +263 -0
- data/spec/mongoid/railties/document_spec.rb +2 -2
- data/spec/mongoid/relations/accessors_spec.rb +53 -145
- data/spec/mongoid/relations/auto_save_spec.rb +37 -17
- data/spec/mongoid/relations/bindings/embedded/in_spec.rb +12 -12
- data/spec/mongoid/relations/bindings/embedded/many_spec.rb +3 -3
- data/spec/mongoid/relations/bindings/embedded/one_spec.rb +5 -5
- data/spec/mongoid/relations/bindings/referenced/in_spec.rb +26 -26
- data/spec/mongoid/relations/bindings/referenced/many_spec.rb +10 -10
- data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +19 -19
- data/spec/mongoid/relations/bindings/referenced/one_spec.rb +12 -12
- data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
- data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
- data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
- data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
- data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
- data/spec/mongoid/relations/builders/referenced/in_spec.rb +24 -35
- data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
- data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
- data/spec/mongoid/relations/builders/referenced/one_spec.rb +12 -25
- data/spec/mongoid/relations/builders_spec.rb +21 -21
- data/spec/mongoid/relations/cascading/delete_spec.rb +9 -9
- data/spec/mongoid/relations/cascading/destroy_spec.rb +6 -6
- data/spec/mongoid/relations/cascading/nullify_spec.rb +4 -4
- data/spec/mongoid/relations/cascading/restrict_spec.rb +7 -7
- data/spec/mongoid/relations/cascading_spec.rb +16 -16
- data/spec/mongoid/relations/constraint_spec.rb +8 -7
- data/spec/mongoid/relations/conversions_spec.rb +16 -14
- data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
- data/spec/mongoid/relations/cyclic_spec.rb +18 -18
- data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
- data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +117 -0
- data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
- data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
- data/spec/mongoid/relations/eager_spec.rb +228 -0
- data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
- data/spec/mongoid/relations/embedded/in_spec.rb +56 -57
- data/spec/mongoid/relations/embedded/many_spec.rb +467 -372
- data/spec/mongoid/relations/embedded/one_spec.rb +108 -141
- data/spec/mongoid/relations/macros_spec.rb +108 -102
- data/spec/mongoid/relations/metadata_spec.rb +180 -255
- data/spec/mongoid/relations/options_spec.rb +1 -1
- data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
- data/spec/mongoid/relations/proxy_spec.rb +2 -2
- data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
- data/spec/mongoid/relations/referenced/many_spec.rb +587 -527
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +401 -424
- data/spec/mongoid/relations/referenced/one_spec.rb +149 -264
- data/spec/mongoid/relations/reflections_spec.rb +6 -6
- data/spec/mongoid/relations/synchronization_spec.rb +46 -50
- data/spec/mongoid/relations/targets/enumerable_spec.rb +118 -118
- data/spec/mongoid/relations/touchable_spec.rb +333 -0
- data/spec/mongoid/relations_spec.rb +16 -15
- data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +38 -55
- data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +89 -164
- data/spec/mongoid/selectable_spec.rb +134 -0
- data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +129 -82
- data/spec/mongoid/sessions/factory_spec.rb +49 -28
- data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
- data/spec/mongoid/sessions/options_spec.rb +108 -0
- data/spec/mongoid/sessions_spec.rb +319 -178
- data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
- data/spec/mongoid/{state_spec.rb → stateful_spec.rb} +36 -11
- data/spec/mongoid/tasks/database_rake_spec.rb +285 -0
- data/spec/mongoid/tasks/database_spec.rb +160 -0
- data/spec/mongoid/threaded_spec.rb +17 -70
- data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
- data/spec/mongoid/timestamps/created_spec.rb +5 -5
- data/spec/mongoid/timestamps/timeless_spec.rb +6 -6
- data/spec/mongoid/timestamps/updated/short_spec.rb +11 -11
- data/spec/mongoid/timestamps/updated_spec.rb +9 -13
- data/spec/mongoid/timestamps_spec.rb +9 -13
- data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
- data/spec/mongoid/{validations → validatable}/associated_spec.rb +45 -22
- data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
- data/spec/mongoid/{validations → validatable}/length_spec.rb +14 -14
- data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
- data/spec/mongoid/{validations → validatable}/presence_spec.rb +37 -44
- data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +184 -192
- data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
- data/spec/mongoid_spec.rb +8 -8
- data/spec/rails/mongoid_spec.rb +19 -335
- data/spec/spec_helper.rb +31 -13
- metadata +303 -283
- data/lib/mongoid/atomic/positionable.rb +0 -73
- data/lib/mongoid/components.rb +0 -92
- data/lib/mongoid/config/inflections.rb +0 -6
- data/lib/mongoid/contextual/eager.rb +0 -158
- data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
- data/lib/mongoid/identity_map.rb +0 -163
- data/lib/mongoid/json.rb +0 -16
- data/lib/mongoid/matchers.rb +0 -32
- data/lib/mongoid/matchers/strategies.rb +0 -97
- data/lib/mongoid/multi_parameter_attributes.rb +0 -105
- data/lib/mongoid/nested_attributes.rb +0 -78
- data/lib/mongoid/observer.rb +0 -192
- data/lib/mongoid/paranoia.rb +0 -136
- data/lib/mongoid/persistence.rb +0 -357
- data/lib/mongoid/persistence/atomic.rb +0 -231
- data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
- data/lib/mongoid/persistence/atomic/bit.rb +0 -35
- data/lib/mongoid/persistence/atomic/inc.rb +0 -45
- data/lib/mongoid/persistence/atomic/operation.rb +0 -154
- data/lib/mongoid/persistence/atomic/pop.rb +0 -32
- data/lib/mongoid/persistence/atomic/pull.rb +0 -32
- data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
- data/lib/mongoid/persistence/atomic/push.rb +0 -25
- data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
- data/lib/mongoid/persistence/atomic/rename.rb +0 -30
- data/lib/mongoid/persistence/atomic/sets.rb +0 -28
- data/lib/mongoid/persistence/atomic/unset.rb +0 -27
- data/lib/mongoid/persistence/deletion.rb +0 -31
- data/lib/mongoid/persistence/insertion.rb +0 -38
- data/lib/mongoid/persistence/modification.rb +0 -35
- data/lib/mongoid/persistence/operations.rb +0 -214
- data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
- data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
- data/lib/mongoid/persistence/operations/insert.rb +0 -34
- data/lib/mongoid/persistence/operations/remove.rb +0 -33
- data/lib/mongoid/persistence/operations/update.rb +0 -59
- data/lib/mongoid/persistence/operations/upsert.rb +0 -28
- data/lib/mongoid/persistence/upsertion.rb +0 -31
- data/lib/mongoid/unit_of_work.rb +0 -61
- data/lib/mongoid/versioning.rb +0 -217
- data/lib/rack/mongoid.rb +0 -2
- data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
- data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
- data/spec/app/models/actor_observer.rb +0 -15
- data/spec/app/models/callback_recorder.rb +0 -25
- data/spec/app/models/paranoid_phone.rb +0 -25
- data/spec/app/models/paranoid_post.rb +0 -36
- data/spec/app/models/phone_observer.rb +0 -6
- data/spec/mongoid/attributes/processing_spec.rb +0 -149
- data/spec/mongoid/criterion/destructive_spec.rb +0 -101
- data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
- data/spec/mongoid/criterion/modification_spec.rb +0 -402
- data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
- data/spec/mongoid/finders_spec.rb +0 -321
- data/spec/mongoid/identity_map_spec.rb +0 -564
- data/spec/mongoid/json_spec.rb +0 -33
- data/spec/mongoid/matchers/in_spec.rb +0 -25
- data/spec/mongoid/matchers/ne_spec.rb +0 -25
- data/spec/mongoid/matchers/nin_spec.rb +0 -25
- data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
- data/spec/mongoid/observer_spec.rb +0 -290
- data/spec/mongoid/paranoia_spec.rb +0 -759
- data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
- data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
- data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
- data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
- data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
- data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
- data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
- data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
- data/spec/mongoid/persistence/atomic_spec.rb +0 -216
- data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
- data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
- data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
- data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
- data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
- data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
- data/spec/mongoid/persistence/operations_spec.rb +0 -313
- data/spec/mongoid/persistence_spec.rb +0 -2279
- data/spec/mongoid/unit_of_work_spec.rb +0 -196
- data/spec/mongoid/versioning_spec.rb +0 -540
- data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -0,0 +1,163 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mongoid::Relations::Eager::HasOne do
|
4
|
+
|
5
|
+
describe ".grouped_doc" do
|
6
|
+
|
7
|
+
let(:person) do
|
8
|
+
Person.create!
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:docs) do
|
12
|
+
Person.all.to_a
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:metadata) do
|
16
|
+
Person.reflect_on_association(:cat)
|
17
|
+
end
|
18
|
+
|
19
|
+
let(:eager) do
|
20
|
+
described_class.new([metadata], docs).tap do |b|
|
21
|
+
b.shift_metadata
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
before do
|
26
|
+
Cat.create!(person: person)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "aggregates by the relation primary key" do
|
30
|
+
expect(eager.grouped_docs.keys).to eq([person.username])
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe ".set_on_parent" do
|
35
|
+
|
36
|
+
let(:person) do
|
37
|
+
Person.create!
|
38
|
+
end
|
39
|
+
|
40
|
+
let(:docs) do
|
41
|
+
Person.all.to_a
|
42
|
+
end
|
43
|
+
|
44
|
+
let(:metadata) do
|
45
|
+
Person.reflect_on_association(:cat)
|
46
|
+
end
|
47
|
+
|
48
|
+
let(:eager) do
|
49
|
+
described_class.new([metadata], docs).tap do |b|
|
50
|
+
b.shift_metadata
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
before do
|
55
|
+
Cat.create!(person: person)
|
56
|
+
eager
|
57
|
+
end
|
58
|
+
|
59
|
+
it "sets the relation into the parent" do
|
60
|
+
docs.each do |doc|
|
61
|
+
expect(doc).to receive(:set_relation).once.with(:cat, :foo)
|
62
|
+
end
|
63
|
+
eager.set_on_parent(person.username, :foo)
|
64
|
+
end
|
65
|
+
|
66
|
+
it "doesnt call an extra query" do
|
67
|
+
expect_query(0) do
|
68
|
+
eager.set_on_parent(person.username, :foo)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe ".includes" do
|
74
|
+
|
75
|
+
let(:person) do
|
76
|
+
Person.create!
|
77
|
+
end
|
78
|
+
|
79
|
+
before do
|
80
|
+
3.times { Cat.create!(person: person) }
|
81
|
+
Cat.create!(person: Person.create!)
|
82
|
+
end
|
83
|
+
|
84
|
+
context "when including the has_one relation" do
|
85
|
+
|
86
|
+
it "queries twice" do
|
87
|
+
|
88
|
+
expect_query(2) do
|
89
|
+
|
90
|
+
Person.all.includes(:cat).each do |person|
|
91
|
+
expect(person.cat).to_not be_nil
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context "when including more than one has_one relation" do
|
98
|
+
|
99
|
+
it "queries 3 times" do
|
100
|
+
|
101
|
+
expect_query(3) do
|
102
|
+
|
103
|
+
Person.all.includes(:cat, :account).each do |person|
|
104
|
+
expect(person.cat).to_not be_nil
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context "when the relation is not polymorphic" do
|
111
|
+
|
112
|
+
let!(:game) do
|
113
|
+
person.create_game(name: "Tron")
|
114
|
+
end
|
115
|
+
|
116
|
+
let!(:eager) do
|
117
|
+
Person.where(_id: person.id).includes(:game).first
|
118
|
+
end
|
119
|
+
|
120
|
+
it "puts the documents in the parent document" do
|
121
|
+
expect(eager.ivar(:game)).to eq(game)
|
122
|
+
end
|
123
|
+
|
124
|
+
it "does not query when touching the association" do
|
125
|
+
expect_query(0) do
|
126
|
+
expect(eager.game).to eq(game)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
it "does not query when updating the association" do
|
131
|
+
expect_query(0) do
|
132
|
+
eager.game.name = "Revenge of Racing of Magic"
|
133
|
+
expect(eager.game.name).to eq("Revenge of Racing of Magic")
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
context "when the relation is polymorphic" do
|
139
|
+
|
140
|
+
let!(:book) do
|
141
|
+
Book.create(name: "Game of Thrones")
|
142
|
+
end
|
143
|
+
|
144
|
+
let!(:rating) do
|
145
|
+
book.create_rating(value: 10)
|
146
|
+
end
|
147
|
+
|
148
|
+
let!(:eager) do
|
149
|
+
Book.all.includes(:rating).first
|
150
|
+
end
|
151
|
+
|
152
|
+
it "puts the found documents in the parent document" do
|
153
|
+
expect(eager.ivar(:rating)).to eq(rating)
|
154
|
+
end
|
155
|
+
|
156
|
+
it "does not query when touching the association" do
|
157
|
+
expect_query(0) do
|
158
|
+
expect(eager.rating).to eq(rating)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
@@ -0,0 +1,228 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mongoid::Relations::Eager do
|
4
|
+
|
5
|
+
describe ".preload" do
|
6
|
+
|
7
|
+
let(:criteria) do
|
8
|
+
Account.where(name: 'savings')
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:context) do
|
12
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:inclusions) do
|
16
|
+
includes.map do |key|
|
17
|
+
Account.reflect_on_association(key)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:doc) { criteria.first }
|
22
|
+
|
23
|
+
context "when belongs_to" do
|
24
|
+
|
25
|
+
let!(:account) do
|
26
|
+
Account.create!(person: person, name: 'savings')
|
27
|
+
end
|
28
|
+
|
29
|
+
let(:person) do
|
30
|
+
Person.create!
|
31
|
+
end
|
32
|
+
|
33
|
+
let(:includes) { [:person] }
|
34
|
+
|
35
|
+
it "groups by foreign_key" do
|
36
|
+
expect(doc).to receive(:person_id).once
|
37
|
+
context.preload(inclusions, [doc])
|
38
|
+
end
|
39
|
+
|
40
|
+
it "preloads the parent" do
|
41
|
+
expect(doc.ivar(:person)).to be false
|
42
|
+
context.preload(inclusions, [doc])
|
43
|
+
expect(doc.ivar(:person)).to eq(doc.person)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context "when has_one" do
|
48
|
+
|
49
|
+
let(:account) do
|
50
|
+
Account.create!(name: 'savings')
|
51
|
+
end
|
52
|
+
|
53
|
+
let!(:comment) do
|
54
|
+
Comment.create!(title: 'my account comment', account: account)
|
55
|
+
end
|
56
|
+
|
57
|
+
let(:includes) { [:comment] }
|
58
|
+
|
59
|
+
it "preloads the child" do
|
60
|
+
expect(doc.ivar(:comment)).to be false
|
61
|
+
context.preload(inclusions, [doc])
|
62
|
+
expect(doc.ivar(:comment)).to eq(doc.comment)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context "when has_many" do
|
67
|
+
|
68
|
+
let(:account) do
|
69
|
+
Account.create!(name: 'savings')
|
70
|
+
end
|
71
|
+
|
72
|
+
let!(:alert) do
|
73
|
+
Alert.create!(account: account)
|
74
|
+
end
|
75
|
+
|
76
|
+
let(:includes) { [:alerts] }
|
77
|
+
|
78
|
+
it "preloads the child" do
|
79
|
+
expect(doc.ivar(:alerts)).to be false
|
80
|
+
context.preload(inclusions, [doc])
|
81
|
+
expect(doc.ivar(:alerts)).to eq(doc.alerts)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context "when has_and_belongs_to_many" do
|
86
|
+
|
87
|
+
let(:account) do
|
88
|
+
Account.create!(name: 'savings')
|
89
|
+
end
|
90
|
+
|
91
|
+
let!(:agent) do
|
92
|
+
Agent.create!(accounts: [account])
|
93
|
+
end
|
94
|
+
|
95
|
+
let(:includes) { [:agents] }
|
96
|
+
|
97
|
+
it "preloads the child" do
|
98
|
+
expect(doc.ivar(:agents)).to be false
|
99
|
+
context.preload(inclusions, [doc])
|
100
|
+
expect(doc.ivar(:agents)).to eq(doc.agents)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe ".eager_load" do
|
106
|
+
|
107
|
+
before do
|
108
|
+
Person.create!
|
109
|
+
end
|
110
|
+
|
111
|
+
let(:context) do
|
112
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
113
|
+
end
|
114
|
+
|
115
|
+
context "when including one has_many relation" do
|
116
|
+
|
117
|
+
let(:criteria) do
|
118
|
+
Person.includes(:posts)
|
119
|
+
end
|
120
|
+
|
121
|
+
let(:docs) do
|
122
|
+
Person.all.to_a
|
123
|
+
end
|
124
|
+
|
125
|
+
let(:posts_metadata) do
|
126
|
+
Person.reflect_on_association(:posts)
|
127
|
+
end
|
128
|
+
|
129
|
+
it "runs the has_many preload" do
|
130
|
+
expect(Mongoid::Relations::Eager::HasMany).to receive(:new).with([posts_metadata], docs).once.and_call_original
|
131
|
+
|
132
|
+
context.eager_load(docs)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
context "when including multiple relations" do
|
137
|
+
|
138
|
+
let(:criteria) do
|
139
|
+
Person.includes(:posts, :houses, :cat)
|
140
|
+
end
|
141
|
+
|
142
|
+
let(:docs) do
|
143
|
+
Person.all.to_a
|
144
|
+
end
|
145
|
+
|
146
|
+
let(:posts_metadata) do
|
147
|
+
Person.reflect_on_association(:posts)
|
148
|
+
end
|
149
|
+
|
150
|
+
let(:houses_metadata) do
|
151
|
+
Person.reflect_on_association(:houses)
|
152
|
+
end
|
153
|
+
|
154
|
+
let(:cat_metadata) do
|
155
|
+
Person.reflect_on_association(:cat)
|
156
|
+
end
|
157
|
+
|
158
|
+
it "runs the has_many preload" do
|
159
|
+
expect(Mongoid::Relations::Eager::HasMany).to receive(:new).with([posts_metadata], docs).once.and_call_original
|
160
|
+
|
161
|
+
context.eager_load(docs)
|
162
|
+
end
|
163
|
+
|
164
|
+
it "runs the has_one preload" do
|
165
|
+
expect(Mongoid::Relations::Eager::HasOne).to receive(:new).with([cat_metadata], docs).once.and_call_original
|
166
|
+
context.eager_load(docs)
|
167
|
+
end
|
168
|
+
|
169
|
+
it "runs the has_and_belongs_to_many preload" do
|
170
|
+
expect(Mongoid::Relations::Eager::HasAndBelongsToMany).to receive(:new).with([houses_metadata], docs).once.and_call_original
|
171
|
+
context.eager_load(docs)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
context "when including two of the same relation type" do
|
176
|
+
|
177
|
+
let(:criteria) do
|
178
|
+
Person.includes(:book, :cat)
|
179
|
+
end
|
180
|
+
|
181
|
+
let(:docs) do
|
182
|
+
Person.all.to_a
|
183
|
+
end
|
184
|
+
|
185
|
+
let(:book_metadata) do
|
186
|
+
Person.reflect_on_association(:book)
|
187
|
+
end
|
188
|
+
|
189
|
+
let(:cat_metadata) do
|
190
|
+
Person.reflect_on_association(:cat)
|
191
|
+
end
|
192
|
+
|
193
|
+
it "runs the has_one preload" do
|
194
|
+
expect(Mongoid::Relations::Eager::HasOne).to receive(:new).with([book_metadata, cat_metadata], docs).once.and_call_original
|
195
|
+
context.eager_load(docs)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
describe ".eager_loadable?" do
|
201
|
+
|
202
|
+
let(:context) do
|
203
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
204
|
+
end
|
205
|
+
|
206
|
+
context "when criteria has multiple includes" do
|
207
|
+
|
208
|
+
let(:criteria) do
|
209
|
+
Post.includes(:person, :roles)
|
210
|
+
end
|
211
|
+
|
212
|
+
it "is eager_loadable" do
|
213
|
+
expect(context.eager_loadable?).to be true
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
context "when criteria has no includes" do
|
218
|
+
|
219
|
+
let(:criteria) do
|
220
|
+
Post.all
|
221
|
+
end
|
222
|
+
|
223
|
+
it "is not eager_loadable" do
|
224
|
+
expect(context.eager_loadable?).to be false
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
@@ -7,11 +7,11 @@ describe "when initialize a model with an embedded model" do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
it "has changes in the embedded model" do
|
10
|
-
person.pet.changes.
|
10
|
+
expect(person.pet.changes).to_not be_empty
|
11
11
|
end
|
12
12
|
|
13
13
|
it "does not have previous_changes in the embedded model" do
|
14
|
-
person.pet.previous_changes.
|
14
|
+
expect(person.pet.previous_changes).to be_empty
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
@@ -22,11 +22,11 @@ describe "when creating a model with an embedded model" do
|
|
22
22
|
end
|
23
23
|
|
24
24
|
it "does not have changes in the embedded model" do
|
25
|
-
person.pet.changes.
|
25
|
+
expect(person.pet.changes).to be_empty
|
26
26
|
end
|
27
27
|
|
28
28
|
it "has previous_changes in the embedded model" do
|
29
|
-
person.pet.previous_changes.
|
29
|
+
expect(person.pet.previous_changes).to_not be_empty
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -41,11 +41,11 @@ describe "when embedding a model on an already saved model" do
|
|
41
41
|
end
|
42
42
|
|
43
43
|
it "has not changes on the embedded model" do
|
44
|
-
person.pet.changes.
|
44
|
+
expect(person.pet.changes).to be_empty
|
45
45
|
end
|
46
46
|
|
47
47
|
it "has previous changes on the embedded model" do
|
48
|
-
person.pet.previous_changes.
|
48
|
+
expect(person.pet.previous_changes).to_not be_empty
|
49
49
|
end
|
50
50
|
|
51
51
|
describe "and saving the model" do
|
@@ -55,11 +55,11 @@ describe "when embedding a model on an already saved model" do
|
|
55
55
|
end
|
56
56
|
|
57
57
|
it "does not have changes on the embedded model" do
|
58
|
-
person.pet.changes.
|
58
|
+
expect(person.pet.changes).to be_empty
|
59
59
|
end
|
60
60
|
|
61
61
|
it "does not have previous changes on the embedded model" do
|
62
|
-
person.pet.previous_changes.
|
62
|
+
expect(person.pet.previous_changes).to be_empty
|
63
63
|
end
|
64
64
|
end
|
65
65
|
end
|
@@ -25,14 +25,14 @@ describe Mongoid::Relations::Embedded::In do
|
|
25
25
|
context "when the document is a different instance" do
|
26
26
|
|
27
27
|
it "returns false" do
|
28
|
-
(relation === Person.new).
|
28
|
+
expect((relation === Person.new)).to be false
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
32
|
context "when the document is the same instance" do
|
33
33
|
|
34
34
|
it "returns true" do
|
35
|
-
(relation === target).
|
35
|
+
expect((relation === target)).to be true
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
@@ -57,19 +57,19 @@ describe Mongoid::Relations::Embedded::In do
|
|
57
57
|
end
|
58
58
|
|
59
59
|
it "sets the target of the relation" do
|
60
|
-
name.namable.
|
60
|
+
expect(name.namable).to eq(person)
|
61
61
|
end
|
62
62
|
|
63
63
|
it "sets the base on the inverse relation" do
|
64
|
-
person.name.
|
64
|
+
expect(person.name).to eq(name)
|
65
65
|
end
|
66
66
|
|
67
67
|
it "sets the same instance on the inverse relation" do
|
68
|
-
person.name.
|
68
|
+
expect(person.name).to eql(name)
|
69
69
|
end
|
70
70
|
|
71
71
|
it "does not save the target" do
|
72
|
-
person.
|
72
|
+
expect(person).to_not be_persisted
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
@@ -88,19 +88,19 @@ describe Mongoid::Relations::Embedded::In do
|
|
88
88
|
end
|
89
89
|
|
90
90
|
it "sets the target of the relation" do
|
91
|
-
name.namable.
|
91
|
+
expect(name.namable).to eq(person)
|
92
92
|
end
|
93
93
|
|
94
94
|
it "sets the base on the inverse relation" do
|
95
|
-
person.name.
|
95
|
+
expect(person.name).to eq(name)
|
96
96
|
end
|
97
97
|
|
98
98
|
it "sets the same instance on the inverse relation" do
|
99
|
-
person.name.
|
99
|
+
expect(person.name).to eql(name)
|
100
100
|
end
|
101
101
|
|
102
102
|
it "does not save the base" do
|
103
|
-
name.
|
103
|
+
expect(name).to_not be_persisted
|
104
104
|
end
|
105
105
|
end
|
106
106
|
end
|
@@ -122,19 +122,19 @@ describe Mongoid::Relations::Embedded::In do
|
|
122
122
|
end
|
123
123
|
|
124
124
|
it "sets the target of the relation" do
|
125
|
-
address.addressable.
|
125
|
+
expect(address.addressable).to eq(person)
|
126
126
|
end
|
127
127
|
|
128
128
|
it "appends the base on the inverse relation" do
|
129
|
-
person.addresses.
|
129
|
+
expect(person.addresses).to eq([ address ])
|
130
130
|
end
|
131
131
|
|
132
132
|
it "sets the same instance in the inverse relation" do
|
133
|
-
person.addresses.first.
|
133
|
+
expect(person.addresses.first).to eql(address)
|
134
134
|
end
|
135
135
|
|
136
136
|
it "does not save the target" do
|
137
|
-
person.
|
137
|
+
expect(person).to_not be_persisted
|
138
138
|
end
|
139
139
|
end
|
140
140
|
|
@@ -153,15 +153,15 @@ describe Mongoid::Relations::Embedded::In do
|
|
153
153
|
end
|
154
154
|
|
155
155
|
it "sets the target of the relation" do
|
156
|
-
address.addressable.
|
156
|
+
expect(address.addressable).to eq(person)
|
157
157
|
end
|
158
158
|
|
159
159
|
it "sets the same instance in the inverse relation" do
|
160
|
-
person.addresses.first.
|
160
|
+
expect(person.addresses.first).to eql(address)
|
161
161
|
end
|
162
162
|
|
163
163
|
it "appends the base on the inverse relation" do
|
164
|
-
person.addresses.
|
164
|
+
expect(person.addresses).to eq([ address ])
|
165
165
|
end
|
166
166
|
end
|
167
167
|
end
|
@@ -187,11 +187,11 @@ describe Mongoid::Relations::Embedded::In do
|
|
187
187
|
end
|
188
188
|
|
189
189
|
it "sets the relation to nil" do
|
190
|
-
name.namable.
|
190
|
+
expect(name.namable).to be_nil
|
191
191
|
end
|
192
192
|
|
193
193
|
it "removes the inverse relation" do
|
194
|
-
person.name.
|
194
|
+
expect(person.name).to be_nil
|
195
195
|
end
|
196
196
|
end
|
197
197
|
|
@@ -210,11 +210,11 @@ describe Mongoid::Relations::Embedded::In do
|
|
210
210
|
end
|
211
211
|
|
212
212
|
it "sets the relation to nil" do
|
213
|
-
name.namable.
|
213
|
+
expect(name.namable).to be_nil
|
214
214
|
end
|
215
215
|
|
216
216
|
it "removes the inverse relation" do
|
217
|
-
person.name.
|
217
|
+
expect(person.name).to be_nil
|
218
218
|
end
|
219
219
|
end
|
220
220
|
|
@@ -234,15 +234,15 @@ describe Mongoid::Relations::Embedded::In do
|
|
234
234
|
end
|
235
235
|
|
236
236
|
it "sets the relation to nil" do
|
237
|
-
name.namable.
|
237
|
+
expect(name.namable).to be_nil
|
238
238
|
end
|
239
239
|
|
240
240
|
it "removed the inverse relation" do
|
241
|
-
person.name.
|
241
|
+
expect(person.name).to be_nil
|
242
242
|
end
|
243
243
|
|
244
244
|
it "deletes the child document" do
|
245
|
-
name.
|
245
|
+
expect(name).to be_destroyed
|
246
246
|
end
|
247
247
|
end
|
248
248
|
end
|
@@ -265,11 +265,11 @@ describe Mongoid::Relations::Embedded::In do
|
|
265
265
|
end
|
266
266
|
|
267
267
|
it "sets the relation to nil" do
|
268
|
-
address.addressable.
|
268
|
+
expect(address.addressable).to be_nil
|
269
269
|
end
|
270
270
|
|
271
271
|
it "removes the inverse relation" do
|
272
|
-
person.addresses.
|
272
|
+
expect(person.addresses).to be_empty
|
273
273
|
end
|
274
274
|
end
|
275
275
|
|
@@ -284,7 +284,7 @@ describe Mongoid::Relations::Embedded::In do
|
|
284
284
|
end
|
285
285
|
|
286
286
|
it "sets the relation to nil" do
|
287
|
-
address.addressable.
|
287
|
+
expect(address.addressable).to be_nil
|
288
288
|
end
|
289
289
|
end
|
290
290
|
|
@@ -304,15 +304,15 @@ describe Mongoid::Relations::Embedded::In do
|
|
304
304
|
end
|
305
305
|
|
306
306
|
it "sets the relation to nil" do
|
307
|
-
address.addressable.
|
307
|
+
expect(address.addressable).to be_nil
|
308
308
|
end
|
309
309
|
|
310
310
|
it "removed the inverse relation" do
|
311
|
-
person.addresses.
|
311
|
+
expect(person.addresses).to be_empty
|
312
312
|
end
|
313
313
|
|
314
314
|
it "deletes the child document" do
|
315
|
-
address.
|
315
|
+
expect(address).to be_destroyed
|
316
316
|
end
|
317
317
|
end
|
318
318
|
|
@@ -336,19 +336,19 @@ describe Mongoid::Relations::Embedded::In do
|
|
336
336
|
end
|
337
337
|
|
338
338
|
it "sets the relation to nil" do
|
339
|
-
address_one.addressable.
|
339
|
+
expect(address_one.addressable).to be_nil
|
340
340
|
end
|
341
341
|
|
342
342
|
it "removed the inverse relation" do
|
343
|
-
person.addresses.
|
343
|
+
expect(person.addresses).to eq([ address_two ])
|
344
344
|
end
|
345
345
|
|
346
346
|
it "deletes the child document" do
|
347
|
-
address_one.
|
347
|
+
expect(address_one).to be_destroyed
|
348
348
|
end
|
349
349
|
|
350
350
|
it "reindexes the children" do
|
351
|
-
address_two._index.
|
351
|
+
expect(address_two._index).to eq(0)
|
352
352
|
end
|
353
353
|
end
|
354
354
|
end
|
@@ -373,28 +373,28 @@ describe Mongoid::Relations::Embedded::In do
|
|
373
373
|
end
|
374
374
|
|
375
375
|
it "returns the embedded one builder" do
|
376
|
-
described_class.builder(base, metadata, target).
|
376
|
+
expect(described_class.builder(base, metadata, target)).to be_a(builder_klass)
|
377
377
|
end
|
378
378
|
end
|
379
379
|
|
380
380
|
describe ".embedded?" do
|
381
381
|
|
382
382
|
it "returns true" do
|
383
|
-
described_class.
|
383
|
+
expect(described_class).to be_embedded
|
384
384
|
end
|
385
385
|
end
|
386
386
|
|
387
387
|
describe ".foreign_key_suffix" do
|
388
388
|
|
389
389
|
it "returns nil" do
|
390
|
-
described_class.foreign_key_suffix.
|
390
|
+
expect(described_class.foreign_key_suffix).to be_nil
|
391
391
|
end
|
392
392
|
end
|
393
393
|
|
394
394
|
describe ".macro" do
|
395
395
|
|
396
396
|
it "returns embeds_one" do
|
397
|
-
described_class.macro.
|
397
|
+
expect(described_class.macro).to eq(:embedded_in)
|
398
398
|
end
|
399
399
|
end
|
400
400
|
|
@@ -413,8 +413,7 @@ describe Mongoid::Relations::Embedded::In do
|
|
413
413
|
end
|
414
414
|
|
415
415
|
it "returns the single nested builder" do
|
416
|
-
described_class.nested_builder(metadata, attributes, {}).
|
417
|
-
be_a(nested_builder_klass)
|
416
|
+
expect(described_class.nested_builder(metadata, attributes, {})).to be_a(nested_builder_klass)
|
418
417
|
end
|
419
418
|
end
|
420
419
|
|
@@ -437,7 +436,7 @@ describe Mongoid::Relations::Embedded::In do
|
|
437
436
|
context "when checking #{method}" do
|
438
437
|
|
439
438
|
it "returns true" do
|
440
|
-
document.respond_to?(method).
|
439
|
+
expect(document.respond_to?(method)).to be true
|
441
440
|
end
|
442
441
|
end
|
443
442
|
end
|
@@ -446,8 +445,8 @@ describe Mongoid::Relations::Embedded::In do
|
|
446
445
|
describe ".valid_options" do
|
447
446
|
|
448
447
|
it "returns the valid options" do
|
449
|
-
described_class.valid_options.
|
450
|
-
[ :autobuild, :cyclic, :polymorphic ]
|
448
|
+
expect(described_class.valid_options).to eq(
|
449
|
+
[ :autobuild, :cyclic, :polymorphic, :touch ]
|
451
450
|
)
|
452
451
|
end
|
453
452
|
end
|
@@ -455,7 +454,7 @@ describe Mongoid::Relations::Embedded::In do
|
|
455
454
|
describe ".validation_default" do
|
456
455
|
|
457
456
|
it "returns false" do
|
458
|
-
described_class.validation_default.
|
457
|
+
expect(described_class.validation_default).to be false
|
459
458
|
end
|
460
459
|
end
|
461
460
|
|
@@ -478,23 +477,23 @@ describe Mongoid::Relations::Embedded::In do
|
|
478
477
|
end
|
479
478
|
|
480
479
|
it "saves the child" do
|
481
|
-
Person.last.addresses.last.
|
480
|
+
expect(Person.last.addresses.last).to eq(address)
|
482
481
|
end
|
483
482
|
|
484
483
|
it "indexes the child" do
|
485
|
-
address._index.
|
484
|
+
expect(address._index).to eq(0)
|
486
485
|
end
|
487
486
|
|
488
487
|
it "saves the first location with the correct index" do
|
489
|
-
first_location._index.
|
488
|
+
expect(first_location._index).to eq(0)
|
490
489
|
end
|
491
490
|
|
492
491
|
it "saves the second location with the correct index" do
|
493
|
-
second_location._index.
|
492
|
+
expect(second_location._index).to eq(1)
|
494
493
|
end
|
495
494
|
|
496
495
|
it "has the locations in the association array" do
|
497
|
-
Person.last.addresses.last.locations.
|
496
|
+
expect(Person.last.addresses.last.locations).to eq(
|
498
497
|
[first_location, second_location]
|
499
498
|
)
|
500
499
|
end
|
@@ -515,11 +514,11 @@ describe Mongoid::Relations::Embedded::In do
|
|
515
514
|
end
|
516
515
|
|
517
516
|
it "does not save the child" do
|
518
|
-
address.
|
517
|
+
expect(address).to_not be_persisted
|
519
518
|
end
|
520
519
|
|
521
520
|
it "does not save the deeply embedded children" do
|
522
|
-
address.locations.first.
|
521
|
+
expect(address.locations.first).to_not be_persisted
|
523
522
|
end
|
524
523
|
end
|
525
524
|
|
@@ -547,15 +546,15 @@ describe Mongoid::Relations::Embedded::In do
|
|
547
546
|
end
|
548
547
|
|
549
548
|
it "sets the new parent" do
|
550
|
-
name.namable.
|
549
|
+
expect(name.namable).to eq(person)
|
551
550
|
end
|
552
551
|
|
553
552
|
it "removes the previous parent relation" do
|
554
|
-
person_two.name.
|
553
|
+
expect(person_two.name).to be_nil
|
555
554
|
end
|
556
555
|
|
557
556
|
it "sets the new child relation" do
|
558
|
-
person.name.
|
557
|
+
expect(person.name).to eq(name)
|
559
558
|
end
|
560
559
|
|
561
560
|
context "when reloading" do
|
@@ -565,15 +564,15 @@ describe Mongoid::Relations::Embedded::In do
|
|
565
564
|
end
|
566
565
|
|
567
566
|
it "sets the new parent" do
|
568
|
-
name.namable.
|
567
|
+
expect(name.namable).to eq(person)
|
569
568
|
end
|
570
569
|
|
571
570
|
it "removes the previous parent relation" do
|
572
|
-
person_two.name.
|
571
|
+
expect(person_two.name).to be_nil
|
573
572
|
end
|
574
573
|
|
575
574
|
it "sets the new child relation" do
|
576
|
-
person.name.
|
575
|
+
expect(person.name).to eq(name)
|
577
576
|
end
|
578
577
|
end
|
579
578
|
end
|