mongoid 3.1.7 → 4.0.0.alpha1
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 +317 -11
- data/README.md +4 -5
- data/lib/config/locales/en.yml +9 -12
- data/lib/mongoid.rb +6 -75
- data/lib/mongoid/atomic.rb +0 -11
- data/lib/mongoid/atomic/paths/embedded.rb +0 -30
- data/lib/mongoid/atomic/paths/root.rb +0 -13
- data/lib/mongoid/attributes.rb +30 -108
- 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} +5 -2
- data/lib/mongoid/composable.rb +104 -0
- data/lib/mongoid/config.rb +3 -9
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/contextual/aggregable/mongo.rb +5 -9
- data/lib/mongoid/contextual/atomic.rb +53 -53
- data/lib/mongoid/contextual/command.rb +26 -0
- data/lib/mongoid/contextual/map_reduce.rb +1 -1
- data/lib/mongoid/contextual/memory.rb +6 -5
- data/lib/mongoid/contextual/mongo.rb +59 -28
- data/lib/mongoid/contextual/text_search.rb +180 -0
- data/lib/mongoid/copyable.rb +2 -3
- data/lib/mongoid/criteria.rb +13 -33
- data/lib/mongoid/criteria/{#findable.rb# → findable.rb} +0 -2
- 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 +1 -1
- data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
- data/lib/mongoid/document.rb +28 -12
- data/lib/mongoid/errors.rb +1 -1
- data/lib/mongoid/errors/document_not_found.rb +2 -1
- data/lib/mongoid/errors/invalid_value.rb +16 -0
- data/lib/mongoid/errors/mongoid_error.rb +1 -1
- data/lib/mongoid/extensions.rb +2 -7
- data/lib/mongoid/extensions/array.rb +2 -2
- data/lib/mongoid/extensions/boolean.rb +14 -17
- data/lib/mongoid/extensions/float.rb +1 -0
- data/lib/mongoid/extensions/hash.rb +1 -1
- data/lib/mongoid/extensions/object.rb +4 -4
- data/lib/mongoid/extensions/object_id.rb +5 -5
- data/lib/mongoid/extensions/range.rb +8 -2
- data/lib/mongoid/extensions/string.rb +5 -17
- data/lib/mongoid/extensions/time.rb +2 -2
- data/lib/mongoid/factory.rb +3 -3
- data/lib/mongoid/fields.rb +9 -8
- data/lib/mongoid/fields/foreign_key.rb +3 -3
- data/lib/mongoid/fields/standard.rb +4 -16
- data/lib/mongoid/fields/validators/macro.rb +11 -3
- data/lib/mongoid/{finders.rb → findable.rb} +6 -2
- 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} +3 -52
- data/lib/mongoid/log_subscriber.rb +22 -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 +1 -1
- 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 +212 -0
- data/lib/mongoid/persistable/creatable.rb +188 -0
- data/lib/mongoid/persistable/deletable.rb +148 -0
- data/lib/mongoid/persistable/destroyable.rb +55 -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 +151 -0
- data/lib/mongoid/persistable/upsertable.rb +55 -0
- data/lib/mongoid/positional.rb +71 -0
- data/lib/mongoid/railtie.rb +32 -45
- data/lib/mongoid/railties/database.rake +12 -6
- data/lib/mongoid/relations.rb +3 -3
- data/lib/mongoid/relations/accessors.rb +13 -46
- data/lib/mongoid/relations/auto_save.rb +15 -36
- data/lib/mongoid/relations/binding.rb +0 -23
- 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 +3 -1
- data/lib/mongoid/relations/builder.rb +1 -1
- data/lib/mongoid/relations/builders.rb +2 -2
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -5
- 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 +47 -0
- data/lib/mongoid/relations/eager/base.rb +57 -0
- data/lib/mongoid/relations/eager/belongs_to.rb +30 -0
- data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +40 -0
- data/lib/mongoid/relations/eager/has_many.rb +37 -0
- data/lib/mongoid/relations/eager/has_one.rb +29 -0
- data/lib/mongoid/relations/embedded/batchable.rb +3 -4
- data/lib/mongoid/relations/embedded/many.rb +7 -27
- data/lib/mongoid/relations/macros.rb +2 -4
- data/lib/mongoid/relations/many.rb +30 -31
- data/lib/mongoid/relations/metadata.rb +6 -75
- data/lib/mongoid/relations/nested_builder.rb +2 -2
- data/lib/mongoid/relations/options.rb +1 -0
- data/lib/mongoid/relations/polymorphic.rb +0 -1
- data/lib/mongoid/relations/proxy.rb +10 -32
- data/lib/mongoid/relations/referenced/in.rb +2 -18
- data/lib/mongoid/relations/referenced/many.rb +9 -22
- data/lib/mongoid/relations/referenced/many_to_many.rb +10 -33
- data/lib/mongoid/relations/referenced/one.rb +2 -21
- data/lib/mongoid/relations/synchronization.rb +3 -3
- data/lib/mongoid/relations/touchable.rb +33 -0
- data/lib/mongoid/{reloading.rb → reloadable.rb} +6 -4
- data/lib/mongoid/{scoping.rb → scopable.rb} +26 -3
- data/lib/mongoid/selectable.rb +59 -0
- data/lib/mongoid/{serialization.rb → serializable.rb} +10 -1
- data/lib/mongoid/sessions.rb +37 -345
- data/lib/mongoid/sessions/factory.rb +2 -0
- data/lib/mongoid/sessions/options.rb +176 -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 +15 -1
- data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
- data/lib/mongoid/support/query_counter.rb +23 -0
- data/lib/mongoid/threaded.rb +0 -110
- data/lib/mongoid/threaded/lifecycle.rb +0 -28
- data/lib/mongoid/timestamps/updated/short.rb +2 -2
- data/lib/mongoid/{hierarchy.rb → traversable.rb} +9 -5
- data/lib/mongoid/{validations.rb → validatable.rb} +23 -9
- data/lib/mongoid/{validations → validatable}/associated.rb +3 -1
- 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 +3 -3
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +9 -13
- 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 +59 -57
- data/lib/support/ruby_version.rb +1 -1
- data/spec/app/models/account.rb +2 -6
- data/spec/app/models/acolyte.rb +1 -0
- data/spec/app/models/actor.rb +0 -1
- data/spec/app/models/address.rb +6 -1
- data/spec/app/models/animal.rb +1 -1
- data/spec/app/models/appointment.rb +2 -2
- 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/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/dragon.rb +4 -0
- data/spec/app/models/drug.rb +1 -3
- data/spec/app/models/dungeon.rb +4 -0
- 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 +0 -2
- 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/login.rb +1 -1
- data/spec/app/models/movie.rb +1 -0
- data/spec/app/models/name.rb +3 -3
- data/spec/app/models/note.rb +1 -1
- data/spec/app/models/oscar.rb +1 -1
- data/spec/app/models/parent_doc.rb +1 -1
- data/spec/app/models/person.rb +13 -8
- data/spec/app/models/phone.rb +1 -3
- data/spec/app/models/player.rb +1 -1
- data/spec/app/models/post.rb +2 -1
- data/spec/app/models/quiz.rb +0 -3
- data/spec/app/models/record.rb +5 -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/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 +1 -1
- data/spec/app/models/video.rb +0 -4
- data/spec/app/models/wiki_page.rb +1 -4
- 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/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} +335 -448
- data/spec/mongoid/attributes/readonly_spec.rb +16 -16
- data/spec/mongoid/attributes_spec.rb +188 -434
- data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +117 -148
- 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 +46 -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 +94 -94
- data/spec/mongoid/contextual/mongo_spec.rb +225 -139
- data/spec/mongoid/contextual/text_search_spec.rb +207 -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 +1063 -0
- data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +31 -31
- data/spec/mongoid/criteria_spec.rb +530 -2207
- data/spec/mongoid/document_spec.rb +166 -120
- 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_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 +3 -3
- 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 +7 -7
- 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/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 +9 -9
- 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 +15 -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 +23 -23
- data/spec/mongoid/fields/standard_spec.rb +12 -12
- data/spec/mongoid/fields_spec.rb +168 -209
- data/spec/mongoid/{finders_spec.rb → findable_spec.rb} +62 -27
- 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} +105 -105
- data/spec/mongoid/log_subscriber_spec.rb +74 -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/{matchers → matchable}/ne_spec.rb +3 -3
- 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 +512 -0
- data/spec/mongoid/persistable/deletable_spec.rb +205 -0
- data/spec/mongoid/persistable/destroyable_spec.rb +148 -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 +432 -0
- data/spec/mongoid/persistable/settable_spec.rb +139 -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} +19 -14
- 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 +36 -16
- data/spec/mongoid/relations/bindings/embedded/in_spec.rb +6 -6
- data/spec/mongoid/relations/bindings/embedded/many_spec.rb +2 -2
- data/spec/mongoid/relations/bindings/embedded/one_spec.rb +3 -3
- data/spec/mongoid/relations/bindings/referenced/in_spec.rb +12 -12
- data/spec/mongoid/relations/bindings/referenced/many_spec.rb +6 -6
- data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +9 -9
- data/spec/mongoid/relations/bindings/referenced/one_spec.rb +6 -6
- 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 +22 -33
- 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 +11 -24
- data/spec/mongoid/relations/builders_spec.rb +21 -21
- data/spec/mongoid/relations/cascading/delete_spec.rb +7 -7
- data/spec/mongoid/relations/cascading/destroy_spec.rb +2 -2
- data/spec/mongoid/relations/cascading/nullify_spec.rb +2 -2
- data/spec/mongoid/relations/cascading/restrict_spec.rb +3 -3
- 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 +143 -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 +55 -56
- data/spec/mongoid/relations/embedded/many_spec.rb +357 -367
- data/spec/mongoid/relations/embedded/one_spec.rb +98 -139
- data/spec/mongoid/relations/macros_spec.rb +108 -102
- data/spec/mongoid/relations/metadata_spec.rb +147 -241
- 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 +379 -522
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +345 -417
- data/spec/mongoid/relations/referenced/one_spec.rb +148 -263
- 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 +116 -116
- data/spec/mongoid/relations/touchable_spec.rb +296 -0
- data/spec/mongoid/relations_spec.rb +16 -15
- data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +20 -60
- data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +74 -126
- data/spec/mongoid/selectable_spec.rb +134 -0
- data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +111 -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 +92 -0
- data/spec/mongoid/sessions_spec.rb +288 -177
- data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
- data/spec/mongoid/state_spec.rb +10 -10
- 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/updated/short_spec.rb +10 -10
- data/spec/mongoid/timestamps/updated_spec.rb +8 -12
- data/spec/mongoid/timestamps_spec.rb +7 -11
- data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
- data/spec/mongoid/{validations → validatable}/associated_spec.rb +18 -18
- data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
- data/spec/mongoid/{validations → validatable}/length_spec.rb +7 -7
- data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
- data/spec/mongoid/{validations → validatable}/presence_spec.rb +31 -38
- data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +126 -183
- data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
- data/spec/mongoid_spec.rb +8 -8
- data/spec/rails/mongoid_spec.rb +72 -87
- data/spec/spec_helper.rb +19 -17
- metadata +261 -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/criterion/findable.rb +0 -179
- 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/draft.rb +0 -9
- 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/#atomic_spec.rb# +0 -365
- 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/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/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
@@ -1,23 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module Mongoid
|
3
|
-
module Errors
|
4
|
-
|
5
|
-
# This error is raised when attempting to version an embedded document.
|
6
|
-
class VersioningNotOnRoot < MongoidError
|
7
|
-
|
8
|
-
# Create the new error.
|
9
|
-
#
|
10
|
-
# @example Create the new error.
|
11
|
-
# VersioningNotOnRoot.new(Address)
|
12
|
-
#
|
13
|
-
# @param [ Class ] klass The embedded class.
|
14
|
-
#
|
15
|
-
# @since 3.0.0
|
16
|
-
def initialize(klass)
|
17
|
-
super(
|
18
|
-
compose_message("versioning_not_on_root", { klass: klass })
|
19
|
-
)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
data/lib/mongoid/identity_map.rb
DELETED
@@ -1,163 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module Mongoid
|
3
|
-
|
4
|
-
# Defines behaviour for the identity map in Mongoid.
|
5
|
-
class IdentityMap < Hash
|
6
|
-
|
7
|
-
# Clear out the loaded documents for the provided selector.
|
8
|
-
#
|
9
|
-
# @example Clear out the documents.
|
10
|
-
# map.clear_many(Post, { person_id: person.id })
|
11
|
-
#
|
12
|
-
# @param [ Class ] klass The class of the relation.
|
13
|
-
# @param [ Hash ] selector The selector.
|
14
|
-
#
|
15
|
-
# @return [ Array ] An empty array.
|
16
|
-
#
|
17
|
-
# @since 2.4.10
|
18
|
-
def clear_many(klass, selector)
|
19
|
-
documents_for(klass)[selector] = {}
|
20
|
-
end
|
21
|
-
|
22
|
-
# Get a document from the identity map by its id.
|
23
|
-
#
|
24
|
-
# @example Get the document from the map.
|
25
|
-
# map.get(Person, id)
|
26
|
-
#
|
27
|
-
# @param [ Class ] klass The class of the document.
|
28
|
-
# @param [ Object, Hash ] idenfier The document id or selector.
|
29
|
-
#
|
30
|
-
# @return [ Document ] The matching document.
|
31
|
-
#
|
32
|
-
# @since 2.1.0
|
33
|
-
def get(klass, identifier)
|
34
|
-
if Mongoid.using_identity_map? && klass
|
35
|
-
if identifier.is_a?(::Array)
|
36
|
-
documents = documents_for(klass)
|
37
|
-
identifier.map do |id|
|
38
|
-
documents[id] || (return nil)
|
39
|
-
end
|
40
|
-
else
|
41
|
-
documents_for(klass)[identifier]
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
# Get many documents from the map via the selector
|
47
|
-
#
|
48
|
-
# @example Get the document from the map.
|
49
|
-
# map.get(Person, { post_id: post })
|
50
|
-
#
|
51
|
-
# @param [ Class ] klass The class of the document.
|
52
|
-
# @param [ Hash ] idenfier The selector.
|
53
|
-
#
|
54
|
-
# @return [ Array<Document> ] The matching documents.
|
55
|
-
#
|
56
|
-
# @since 3.0.0
|
57
|
-
def get_many(klass, identifier)
|
58
|
-
if Mongoid.using_identity_map? && klass
|
59
|
-
documents_for(klass)[identifier].try(:values)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
# Remove the document from the identity map.
|
64
|
-
#
|
65
|
-
# @example Remove the document.
|
66
|
-
# map.removed(person)
|
67
|
-
#
|
68
|
-
# @param [ Document ] document The document to remove.
|
69
|
-
#
|
70
|
-
# @return [ Document, nil ] The removed document.
|
71
|
-
#
|
72
|
-
# @since 2.1.0
|
73
|
-
def remove(document)
|
74
|
-
if Mongoid.using_identity_map? && document && document.id
|
75
|
-
documents_for(document.class).delete(document.id)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
# Puts a document in the identity map, accessed by its id.
|
80
|
-
#
|
81
|
-
# @example Put the document in the map.
|
82
|
-
# identity_map.set(document)
|
83
|
-
#
|
84
|
-
# @param [ Document ] document The document to place in the map.
|
85
|
-
#
|
86
|
-
# @return [ Document ] The provided document.
|
87
|
-
#
|
88
|
-
# @since 2.1.0
|
89
|
-
def set(document)
|
90
|
-
if Mongoid.using_identity_map? && document && document.id
|
91
|
-
documents_for(document.class)[document.id] = document
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
# Set a document in the identity map for the provided selector.
|
96
|
-
#
|
97
|
-
# @example Set the document in the map.
|
98
|
-
# identity_map.set_selector(document, { :person_id => person.id })
|
99
|
-
#
|
100
|
-
# @param [ Document ] document The document to set.
|
101
|
-
# @param [ Hash ] selector The selector to identify it.
|
102
|
-
#
|
103
|
-
# @return [ Array<Document> ] The documents.
|
104
|
-
#
|
105
|
-
# @since 2.2.0
|
106
|
-
def set_many(document, selector)
|
107
|
-
(documents_for(document.class)[selector] ||= {})[document.id] = document
|
108
|
-
end
|
109
|
-
|
110
|
-
# Set a document in the identity map for the provided selector.
|
111
|
-
#
|
112
|
-
# @example Set the document in the map.
|
113
|
-
# identity_map.set_selector(document, { :person_id => person.id })
|
114
|
-
#
|
115
|
-
# @param [ Document ] document The document to set.
|
116
|
-
# @param [ Hash ] selector The selector to identify it.
|
117
|
-
#
|
118
|
-
# @return [ Document ] The matching document.
|
119
|
-
#
|
120
|
-
# @since 2.2.0
|
121
|
-
def set_one(document, selector)
|
122
|
-
documents_for(document.class)[selector] = document
|
123
|
-
end
|
124
|
-
|
125
|
-
private
|
126
|
-
|
127
|
-
# Get the documents in the identity map for a specific class.
|
128
|
-
#
|
129
|
-
# @example Get the documents for the class.
|
130
|
-
# map.documents_for(Person)
|
131
|
-
#
|
132
|
-
# @param [ Class ] klass The class to retrieve.
|
133
|
-
#
|
134
|
-
# @return [ Hash ] The documents.
|
135
|
-
#
|
136
|
-
# @since 2.1.0
|
137
|
-
def documents_for(klass)
|
138
|
-
if klass
|
139
|
-
self[klass.collection_name] ||= {}
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
class << self
|
144
|
-
|
145
|
-
# For ease of access we provide the same API to the identity map on the
|
146
|
-
# class level, which in turn just gets the identity map that is on the
|
147
|
-
# current thread.
|
148
|
-
#
|
149
|
-
# @example Get a document from the current identity map by id.
|
150
|
-
# IdentityMap.get(id)
|
151
|
-
#
|
152
|
-
# @example Set a document in the current identity map.
|
153
|
-
# IdentityMap.set(document)
|
154
|
-
#
|
155
|
-
# @since 2.1.0
|
156
|
-
delegate(*(
|
157
|
-
Hash.public_instance_methods(false) +
|
158
|
-
IdentityMap.public_instance_methods(false) <<
|
159
|
-
{ to: :"Mongoid::Threaded.identity_map" }
|
160
|
-
))
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
data/lib/mongoid/json.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module Mongoid
|
3
|
-
# This module is for hooking in to +ActiveModel+s serialization to let
|
4
|
-
# configuring the ability to include the root in JSON happen from the Mongoid
|
5
|
-
# config.
|
6
|
-
module JSON
|
7
|
-
extend ActiveSupport::Concern
|
8
|
-
|
9
|
-
# We need to redefine where the JSON configuration is getting defined,
|
10
|
-
# similar to +ActiveRecord+.
|
11
|
-
included do
|
12
|
-
undef_method :include_root_in_json
|
13
|
-
delegate :include_root_in_json, to: ::Mongoid
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
data/lib/mongoid/matchers.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require "mongoid/matchers/strategies"
|
3
|
-
|
4
|
-
module Mongoid
|
5
|
-
|
6
|
-
# This module contains all the behavior for ruby implementations of MongoDB
|
7
|
-
# selectors.
|
8
|
-
module Matchers
|
9
|
-
|
10
|
-
# Determines if this document has the attributes to match the supplied
|
11
|
-
# MongoDB selector. Used for matching on embedded associations.
|
12
|
-
#
|
13
|
-
# @example Does the document match?
|
14
|
-
# document.matches?(:title => { "$in" => [ "test" ] })
|
15
|
-
#
|
16
|
-
# @param [ Hash ] selector The MongoDB selector.
|
17
|
-
#
|
18
|
-
# @return [ true, false ] True if matches, false if not.
|
19
|
-
def matches?(selector)
|
20
|
-
selector.each_pair do |key, value|
|
21
|
-
if value.is_a?(Hash)
|
22
|
-
value.each do |item|
|
23
|
-
return false unless Strategies.matcher(self, key, Hash[*item]).matches?(Hash[*item])
|
24
|
-
end
|
25
|
-
else
|
26
|
-
return false unless Strategies.matcher(self, key, value).matches?(value)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
return true
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,97 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require "mongoid/matchers/default"
|
3
|
-
require "mongoid/matchers/all"
|
4
|
-
require "mongoid/matchers/and"
|
5
|
-
require "mongoid/matchers/exists"
|
6
|
-
require "mongoid/matchers/gt"
|
7
|
-
require "mongoid/matchers/gte"
|
8
|
-
require "mongoid/matchers/in"
|
9
|
-
require "mongoid/matchers/lt"
|
10
|
-
require "mongoid/matchers/lte"
|
11
|
-
require "mongoid/matchers/ne"
|
12
|
-
require "mongoid/matchers/nin"
|
13
|
-
require "mongoid/matchers/or"
|
14
|
-
require "mongoid/matchers/size"
|
15
|
-
|
16
|
-
module Mongoid
|
17
|
-
module Matchers
|
18
|
-
|
19
|
-
# This module is responsible for returning the correct matcher given a
|
20
|
-
# MongoDB query expression.
|
21
|
-
module Strategies
|
22
|
-
extend self
|
23
|
-
|
24
|
-
MATCHERS = {
|
25
|
-
"$all" => Matchers::All,
|
26
|
-
"$and" => Matchers::And,
|
27
|
-
"$exists" => Matchers::Exists,
|
28
|
-
"$gt" => Matchers::Gt,
|
29
|
-
"$gte" => Matchers::Gte,
|
30
|
-
"$in" => Matchers::In,
|
31
|
-
"$lt" => Matchers::Lt,
|
32
|
-
"$lte" => Matchers::Lte,
|
33
|
-
"$ne" => Matchers::Ne,
|
34
|
-
"$nin" => Matchers::Nin,
|
35
|
-
"$or" => Matchers::Or,
|
36
|
-
"$size" => Matchers::Size
|
37
|
-
}.with_indifferent_access
|
38
|
-
|
39
|
-
# Get the matcher for the supplied key and value. Will determine the class
|
40
|
-
# name from the key.
|
41
|
-
#
|
42
|
-
# @example Get the matcher.
|
43
|
-
# document.matcher(:title, { "$in" => [ "test" ] })
|
44
|
-
#
|
45
|
-
# @param [ Document ] document The document to check.
|
46
|
-
# @param [ Symbol, String ] key The field name.
|
47
|
-
# @param [ Object, Hash ] The value or selector.
|
48
|
-
#
|
49
|
-
# @return [ Matcher ] The matcher.
|
50
|
-
#
|
51
|
-
# @since 2.0.0.rc.7
|
52
|
-
def matcher(document, key, value)
|
53
|
-
if value.is_a?(Hash)
|
54
|
-
matcher = MATCHERS[value.keys.first]
|
55
|
-
if matcher
|
56
|
-
matcher.new(extract_attribute(document, key))
|
57
|
-
else
|
58
|
-
Default.new(extract_attribute(document, key))
|
59
|
-
end
|
60
|
-
else
|
61
|
-
case key.to_s
|
62
|
-
when "$or" then Matchers::Or.new(value, document)
|
63
|
-
when "$and" then Matchers::And.new(value, document)
|
64
|
-
else Default.new(extract_attribute(document, key))
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
private
|
70
|
-
|
71
|
-
# Extract the attribute from the key, being smarter about dot notation.
|
72
|
-
#
|
73
|
-
# @example Extract the attribute.
|
74
|
-
# strategy.extract_attribute(doc, "info.field")
|
75
|
-
#
|
76
|
-
# @param [ Document ] document The document.
|
77
|
-
# @param [ String ] key The key.
|
78
|
-
#
|
79
|
-
# @return [ Object ] The value of the attribute.
|
80
|
-
#
|
81
|
-
# @since 2.2.1
|
82
|
-
def extract_attribute(document, key)
|
83
|
-
if (key_string = key.to_s) =~ /.+\..+/
|
84
|
-
key_string.split('.').inject(document.as_document) do |_attribs, _key|
|
85
|
-
if _attribs.is_a?(::Array)
|
86
|
-
_attribs.map { |doc| doc.try(:[], _key) }
|
87
|
-
else
|
88
|
-
_attribs.try(:[], _key)
|
89
|
-
end
|
90
|
-
end
|
91
|
-
else
|
92
|
-
document.attributes[key_string]
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
@@ -1,105 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module Mongoid
|
3
|
-
|
4
|
-
# Adds Rails' multi-parameter attribute support to Mongoid.
|
5
|
-
#
|
6
|
-
# @todo: Durran: This module needs an overhaul.
|
7
|
-
module MultiParameterAttributes
|
8
|
-
|
9
|
-
module Errors
|
10
|
-
|
11
|
-
# Raised when an error occurred while doing a mass assignment to an
|
12
|
-
# attribute through the <tt>attributes=</tt> method. The exception
|
13
|
-
# has an +attribute+ property that is the name of the offending attribute.
|
14
|
-
class AttributeAssignmentError < Mongoid::Errors::MongoidError
|
15
|
-
attr_reader :exception, :attribute
|
16
|
-
|
17
|
-
def initialize(message, exception, attribute)
|
18
|
-
@exception = exception
|
19
|
-
@attribute = attribute
|
20
|
-
@message = message
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
# Raised when there are multiple errors while doing a mass assignment
|
25
|
-
# through the +attributes+ method. The exception has an +errors+
|
26
|
-
# property that contains an array of AttributeAssignmentError
|
27
|
-
# objects, each corresponding to the error while assigning to an
|
28
|
-
# attribute.
|
29
|
-
class MultiparameterAssignmentErrors < Mongoid::Errors::MongoidError
|
30
|
-
attr_reader :errors
|
31
|
-
|
32
|
-
def initialize(errors)
|
33
|
-
@errors = errors
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
# Process the provided attributes casting them to their proper values if a
|
39
|
-
# field exists for them on the document. This will be limited to only the
|
40
|
-
# attributes provided in the suppied +Hash+ so that no extra nil values get
|
41
|
-
# put into the document's attributes.
|
42
|
-
#
|
43
|
-
# @example Process the attributes.
|
44
|
-
# person.process_attributes(:title => "sir", :age => 40)
|
45
|
-
#
|
46
|
-
# @param [ Hash ] attrs The attributes to set.
|
47
|
-
# @param [ Symbol ] role A role for scoped mass assignment.
|
48
|
-
# @param [ Boolean ] guard_protected_attributes False to skip mass assignment protection.
|
49
|
-
#
|
50
|
-
# @since 2.0.0.rc.7
|
51
|
-
def process_attributes(attrs = nil, role = :default, guard_protected_attributes = true)
|
52
|
-
if attrs
|
53
|
-
errors = []
|
54
|
-
attributes = attrs.class.new
|
55
|
-
attributes.permitted = true if attrs.respond_to?(:permitted?) && attrs.permitted?
|
56
|
-
multi_parameter_attributes = {}
|
57
|
-
|
58
|
-
attrs.each_pair do |key, value|
|
59
|
-
if key =~ /\A([^\(]+)\((\d+)([if])\)$/
|
60
|
-
key, index = $1, $2.to_i
|
61
|
-
(multi_parameter_attributes[key] ||= {})[index] = value.empty? ? nil : value.send("to_#{$3}")
|
62
|
-
else
|
63
|
-
attributes[key] = value
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
multi_parameter_attributes.each_pair do |key, values|
|
68
|
-
begin
|
69
|
-
values = (values.keys.min..values.keys.max).map { |i| values[i] }
|
70
|
-
field = self.class.fields[database_field_name(key)]
|
71
|
-
attributes[key] = instantiate_object(field, values)
|
72
|
-
rescue => e
|
73
|
-
errors << Errors::AttributeAssignmentError.new(
|
74
|
-
"error on assignment #{values.inspect} to #{key}", e, key
|
75
|
-
)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
unless errors.empty?
|
80
|
-
raise Errors::MultiparameterAssignmentErrors.new(errors),
|
81
|
-
"#{errors.size} error(s) on assignment of multiparameter attributes"
|
82
|
-
end
|
83
|
-
|
84
|
-
super attributes, role, guard_protected_attributes
|
85
|
-
else
|
86
|
-
super
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
protected
|
91
|
-
|
92
|
-
def instantiate_object(field, values_with_empty_parameters)
|
93
|
-
return nil if values_with_empty_parameters.all? { |v| v.nil? }
|
94
|
-
values = values_with_empty_parameters.collect { |v| v.nil? ? 1 : v }
|
95
|
-
klass = field.type
|
96
|
-
if klass == DateTime || klass == Date || klass == Time
|
97
|
-
field.mongoize(values)
|
98
|
-
elsif klass
|
99
|
-
klass.new(*values)
|
100
|
-
else
|
101
|
-
values
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
@@ -1,78 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module Mongoid
|
3
|
-
|
4
|
-
# Mongoid's implementation of Rails' nested attributes.
|
5
|
-
module NestedAttributes
|
6
|
-
extend ActiveSupport::Concern
|
7
|
-
|
8
|
-
included do
|
9
|
-
class_attribute :nested_attributes
|
10
|
-
self.nested_attributes = {}
|
11
|
-
end
|
12
|
-
|
13
|
-
module ClassMethods
|
14
|
-
|
15
|
-
REJECT_ALL_BLANK_PROC = ->(attributes){
|
16
|
-
attributes.all? { |key, value| key == '_destroy' || value.blank? }
|
17
|
-
}
|
18
|
-
|
19
|
-
# Used when needing to update related models from a parent relation. Can
|
20
|
-
# be used on embedded or referenced relations.
|
21
|
-
#
|
22
|
-
# @example Defining nested attributes.
|
23
|
-
#
|
24
|
-
# class Person
|
25
|
-
# include Mongoid::Document
|
26
|
-
#
|
27
|
-
# embeds_many :addresses
|
28
|
-
# embeds_one :game
|
29
|
-
# references_many :posts
|
30
|
-
#
|
31
|
-
# accepts_nested_attributes_for :addresses, :game, :posts
|
32
|
-
# end
|
33
|
-
#
|
34
|
-
# @param [ Array<Symbol>, Hash ] *args A list of relation names, followed
|
35
|
-
# by a hash of options.
|
36
|
-
#
|
37
|
-
# @option *args [ true, false ] :allow_destroy Can deletion occur?
|
38
|
-
# @option *args [ Proc, Symbol ] :reject_if Block or symbol pointing
|
39
|
-
# to a class method to reject documents with.
|
40
|
-
# @option *args [ Integer ] :limit The max number to create.
|
41
|
-
# @option *args [ true, false ] :update_only Only update existing docs.
|
42
|
-
def accepts_nested_attributes_for(*args)
|
43
|
-
options = args.extract_options!
|
44
|
-
options[:reject_if] = REJECT_ALL_BLANK_PROC if options[:reject_if] == :all_blank
|
45
|
-
args.each do |name|
|
46
|
-
meth = "#{name}_attributes="
|
47
|
-
self.nested_attributes["#{name}_attributes"] = meth
|
48
|
-
metadata = relations[name.to_s]
|
49
|
-
raise Errors::NestedAttributesMetadataNotFound.new(self, name) unless metadata
|
50
|
-
autosave_nested_attributes(metadata)
|
51
|
-
re_define_method(meth) do |attrs|
|
52
|
-
_assigning do
|
53
|
-
metadata.nested_builder(attrs, options).build(self, mass_assignment_options)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
private
|
60
|
-
|
61
|
-
# Add the autosave information for the nested relation.
|
62
|
-
#
|
63
|
-
# @api private
|
64
|
-
#
|
65
|
-
# @example Add the autosave if appropriate.
|
66
|
-
# Person.autosave_nested_attributes(metadata)
|
67
|
-
#
|
68
|
-
# @param [ Metadata ] metadata The existing relation metadata.
|
69
|
-
#
|
70
|
-
# @since 3.1.4
|
71
|
-
def autosave_nested_attributes(metadata)
|
72
|
-
unless metadata.autosave == false
|
73
|
-
autosave(metadata.merge!(autosave: true))
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|