mongoid 3.1.6 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +432 -8
- data/README.md +5 -6
- data/lib/config/locales/en.yml +32 -18
- 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/embedded.rb +0 -30
- data/lib/mongoid/atomic/paths/root.rb +0 -13
- data/lib/mongoid/atomic.rb +1 -12
- 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/attributes.rb +63 -101
- data/lib/mongoid/{dirty.rb → changeable.rb} +32 -2
- data/lib/mongoid/composable.rb +105 -0
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/config.rb +3 -9
- 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 +18 -6
- data/lib/mongoid/contextual/mongo.rb +64 -56
- data/lib/mongoid/contextual/none.rb +90 -0
- data/lib/mongoid/contextual/text_search.rb +178 -0
- data/lib/mongoid/contextual.rb +2 -0
- data/lib/mongoid/copyable.rb +2 -3
- 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/criteria.rb +39 -34
- data/lib/mongoid/document.rb +32 -17
- 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/errors.rb +4 -1
- 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/extensions.rb +2 -7
- data/lib/mongoid/factory.rb +8 -6
- 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/fields.rb +41 -8
- data/lib/mongoid/{finders.rb → findable.rb} +8 -2
- data/lib/mongoid/indexable/specification.rb +104 -0
- data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
- data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
- 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/{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/matchable.rb +152 -0
- data/lib/mongoid/persistable/creatable.rb +188 -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 +152 -0
- data/lib/mongoid/persistable/upsertable.rb +55 -0
- data/lib/mongoid/persistable.rb +216 -0
- data/lib/mongoid/positional.rb +71 -0
- data/lib/mongoid/query_cache.rb +247 -0
- data/lib/mongoid/railtie.rb +32 -45
- data/lib/mongoid/railties/database.rake +9 -25
- data/lib/mongoid/relations/accessors.rb +13 -49
- data/lib/mongoid/relations/auto_save.rb +15 -36
- data/lib/mongoid/relations/binding.rb +1 -24
- 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 +3 -1
- data/lib/mongoid/relations/builder.rb +1 -1
- 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/builders.rb +2 -2
- 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/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/eager.rb +46 -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 +30 -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/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 +19 -32
- data/lib/mongoid/relations/referenced/many_to_many.rb +15 -38
- data/lib/mongoid/relations/referenced/one.rb +6 -25
- data/lib/mongoid/relations/synchronization.rb +3 -3
- data/lib/mongoid/relations/touchable.rb +34 -1
- data/lib/mongoid/relations.rb +11 -25
- data/lib/mongoid/{reloading.rb → reloadable.rb} +6 -4
- 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/factory.rb +2 -0
- data/lib/mongoid/sessions/options.rb +180 -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/sessions.rb +37 -345
- 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/lifecycle.rb +0 -28
- data/lib/mongoid/threaded.rb +0 -157
- data/lib/mongoid/timestamps/updated/short.rb +2 -2
- data/lib/mongoid/{hierarchy.rb → traversable.rb} +9 -5
- 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 +23 -19
- data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid.rb +10 -76
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +13 -24
- 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/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/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/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 +58 -18
- data/spec/mongoid/attributes_spec.rb +315 -436
- 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 +68 -58
- 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 +151 -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 +1255 -0
- data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
- data/spec/mongoid/criteria_spec.rb +578 -2295
- 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_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 +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 +38 -23
- data/spec/mongoid/fields/standard_spec.rb +12 -12
- data/spec/mongoid/fields_spec.rb +263 -217
- data/spec/mongoid/{finders_spec.rb → findable_spec.rb} +127 -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} +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 +512 -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 +461 -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} +9 -9
- data/spec/mongoid/query_cache_spec.rb +231 -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 +393 -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 +434 -527
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +352 -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} +20 -60
- 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 +107 -0
- data/spec/mongoid/sessions_spec.rb +289 -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 +29 -13
- metadata +296 -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/strategies.rb +0 -97
- data/lib/mongoid/matchers.rb +0 -32
- 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/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/atomic.rb +0 -231
- 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/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/operations.rb +0 -214
- data/lib/mongoid/persistence/upsertion.rb +0 -31
- data/lib/mongoid/persistence.rb +0 -357
- data/lib/mongoid/unit_of_work.rb +0 -61
- data/lib/mongoid/versioning.rb +0 -217
- data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
- data/lib/rack/mongoid.rb +0 -2
- 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/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
data/lib/mongoid/persistence.rb
DELETED
|
@@ -1,357 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
require "mongoid/persistence/atomic"
|
|
3
|
-
require "mongoid/persistence/deletion"
|
|
4
|
-
require "mongoid/persistence/insertion"
|
|
5
|
-
require "mongoid/persistence/modification"
|
|
6
|
-
require "mongoid/persistence/upsertion"
|
|
7
|
-
require "mongoid/persistence/operations"
|
|
8
|
-
|
|
9
|
-
module Mongoid
|
|
10
|
-
|
|
11
|
-
# The persistence module is a mixin to provide database accessor methods for
|
|
12
|
-
# the document. These correspond to the appropriate accessors on a
|
|
13
|
-
# mongo collection and retain the same DSL.
|
|
14
|
-
#
|
|
15
|
-
# @example Sample persistence operations.
|
|
16
|
-
# document.insert
|
|
17
|
-
# document.update
|
|
18
|
-
# document.upsert
|
|
19
|
-
module Persistence
|
|
20
|
-
extend ActiveSupport::Concern
|
|
21
|
-
include Atomic
|
|
22
|
-
include Mongoid::Atomic::Positionable
|
|
23
|
-
|
|
24
|
-
# The atomic operations that deal with arrays or sets in the db.
|
|
25
|
-
#
|
|
26
|
-
# @since 4.0.0
|
|
27
|
-
LIST_OPERATIONS = [ "$addToSet", "$push", "$pull", "$pullAll" ].freeze
|
|
28
|
-
|
|
29
|
-
# Remove the document from the database with callbacks.
|
|
30
|
-
#
|
|
31
|
-
# @example Destroy a document.
|
|
32
|
-
# document.destroy
|
|
33
|
-
#
|
|
34
|
-
# @param [ Hash ] options Options to pass to destroy.
|
|
35
|
-
#
|
|
36
|
-
# @return [ true, false ] True if successful, false if not.
|
|
37
|
-
def destroy(options = {})
|
|
38
|
-
self.flagged_for_destroy = true
|
|
39
|
-
result = run_callbacks(:destroy) do
|
|
40
|
-
remove(options)
|
|
41
|
-
end
|
|
42
|
-
self.flagged_for_destroy = false
|
|
43
|
-
result
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
# Insert a new document into the database. Will return the document
|
|
47
|
-
# itself whether or not the save was successful.
|
|
48
|
-
#
|
|
49
|
-
# @example Insert a document.
|
|
50
|
-
# document.insert
|
|
51
|
-
#
|
|
52
|
-
# @param [ Hash ] options Options to pass to insert.
|
|
53
|
-
#
|
|
54
|
-
# @return [ Document ] The persisted document.
|
|
55
|
-
def insert(options = {})
|
|
56
|
-
Operations.insert(self, options).persist
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
# Remove the document from the database.
|
|
60
|
-
#
|
|
61
|
-
# @example Remove the document.
|
|
62
|
-
# document.remove
|
|
63
|
-
#
|
|
64
|
-
# @param [ Hash ] options Options to pass to remove.
|
|
65
|
-
#
|
|
66
|
-
# @return [ TrueClass ] True.
|
|
67
|
-
def remove(options = {})
|
|
68
|
-
Operations.remove(self, options).persist
|
|
69
|
-
end
|
|
70
|
-
alias :delete :remove
|
|
71
|
-
|
|
72
|
-
# Save the document - will perform an insert if the document is new, and
|
|
73
|
-
# update if not.
|
|
74
|
-
#
|
|
75
|
-
# @example Save the document.
|
|
76
|
-
# document.save
|
|
77
|
-
#
|
|
78
|
-
# @param [ Hash ] options Options to pass to the save.
|
|
79
|
-
#
|
|
80
|
-
# @return [ true, false ] True is success, false if not.
|
|
81
|
-
#
|
|
82
|
-
# @since 1.0.0
|
|
83
|
-
def save(options = {})
|
|
84
|
-
if new_record?
|
|
85
|
-
!insert(options).new_record?
|
|
86
|
-
else
|
|
87
|
-
update(options)
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
# Save the document - will perform an insert if the document is new, and
|
|
92
|
-
# update if not. If a validation error occurs an error will get raised.
|
|
93
|
-
#
|
|
94
|
-
# @example Save the document.
|
|
95
|
-
# document.save!
|
|
96
|
-
#
|
|
97
|
-
# @param [ Hash ] options Options to pass to the save.
|
|
98
|
-
#
|
|
99
|
-
# @return [ true, false ] True if validation passed.
|
|
100
|
-
def save!(options = {})
|
|
101
|
-
unless save(options)
|
|
102
|
-
self.class.fail_validate!(self) unless errors.empty?
|
|
103
|
-
self.class.fail_callback!(self, :save!)
|
|
104
|
-
end
|
|
105
|
-
return true
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
# Touch the document, in effect updating its updated_at timestamp and
|
|
109
|
-
# optionally the provided field to the current time. If any belongs_to
|
|
110
|
-
# relations exist with a touch option, they will be updated as well.
|
|
111
|
-
#
|
|
112
|
-
# @example Update the updated_at timestamp.
|
|
113
|
-
# document.touch
|
|
114
|
-
#
|
|
115
|
-
# @example Update the updated_at and provided timestamps.
|
|
116
|
-
# document.touch(:audited)
|
|
117
|
-
#
|
|
118
|
-
# @note This will not autobuild relations if those options are set.
|
|
119
|
-
#
|
|
120
|
-
# @param [ Symbol ] field The name of an additional field to update.
|
|
121
|
-
#
|
|
122
|
-
# @return [ true/false ] false if record is new_record otherwise true.
|
|
123
|
-
#
|
|
124
|
-
# @since 3.0.0
|
|
125
|
-
def touch(field = nil)
|
|
126
|
-
return false if _root.new_record?
|
|
127
|
-
current = Time.now
|
|
128
|
-
field = database_field_name(field)
|
|
129
|
-
write_attribute(:updated_at, current) if respond_to?("updated_at=")
|
|
130
|
-
write_attribute(field, current) if field
|
|
131
|
-
|
|
132
|
-
touches = touch_atomic_updates(field)
|
|
133
|
-
unless touches.empty?
|
|
134
|
-
selector = atomic_selector
|
|
135
|
-
_root.collection.find(selector).update(positionally(selector, touches))
|
|
136
|
-
end
|
|
137
|
-
run_callbacks(:touch, :after)
|
|
138
|
-
true
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
# Update the document in the database.
|
|
142
|
-
#
|
|
143
|
-
# @example Update an existing document.
|
|
144
|
-
# document.update
|
|
145
|
-
#
|
|
146
|
-
# @param [ Hash ] options Options to pass to update.
|
|
147
|
-
#
|
|
148
|
-
# @return [ true, false ] True if succeeded, false if not.
|
|
149
|
-
def update(options = {})
|
|
150
|
-
Operations.update(self, options).persist
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
# Update a single attribute and persist the entire document.
|
|
154
|
-
# This skips validation but fires the callbacks.
|
|
155
|
-
#
|
|
156
|
-
# @example Update the attribute.
|
|
157
|
-
# person.update_attribute(:title, "Sir")
|
|
158
|
-
#
|
|
159
|
-
# @param [ Symbol, String ] name The name of the attribute.
|
|
160
|
-
# @param [ Object ] value The new value of the attribute.a
|
|
161
|
-
#
|
|
162
|
-
# @raise [ Errors::ReadonlyAttribute ] If the field cannot be changed due
|
|
163
|
-
# to being flagged as reaodnly.
|
|
164
|
-
#
|
|
165
|
-
# @return [ true, false ] True if save was successfull, false if not.
|
|
166
|
-
#
|
|
167
|
-
# @since 2.0.0.rc.6
|
|
168
|
-
def update_attribute(name, value)
|
|
169
|
-
normalized = name.to_s
|
|
170
|
-
unless attribute_writable?(normalized)
|
|
171
|
-
raise Errors::ReadonlyAttribute.new(normalized, value)
|
|
172
|
-
end
|
|
173
|
-
write_attribute(database_field_name(normalized), value)
|
|
174
|
-
save(validate: false)
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
# Update the document attributes in the database.
|
|
178
|
-
#
|
|
179
|
-
# @example Update the document's attributes
|
|
180
|
-
# document.update_attributes(:title => "Sir")
|
|
181
|
-
#
|
|
182
|
-
# @param [ Hash ] attributes The attributes to update.
|
|
183
|
-
#
|
|
184
|
-
# @return [ true, false ] True if validation passed, false if not.
|
|
185
|
-
def update_attributes(attributes = {}, options = {})
|
|
186
|
-
assign_attributes(attributes, options); save
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
# Update the document attributes in the database and raise an error if
|
|
190
|
-
# validation failed.
|
|
191
|
-
#
|
|
192
|
-
# @example Update the document's attributes.
|
|
193
|
-
# document.update_attributes(:title => "Sir")
|
|
194
|
-
#
|
|
195
|
-
# @param [ Hash ] attributes The attributes to update.
|
|
196
|
-
#
|
|
197
|
-
# @raise [ Errors::Validations ] If validation failed.
|
|
198
|
-
#
|
|
199
|
-
# @return [ true, false ] True if validation passed.
|
|
200
|
-
def update_attributes!(attributes = {}, options = {})
|
|
201
|
-
result = update_attributes(attributes, options)
|
|
202
|
-
unless result
|
|
203
|
-
self.class.fail_validate!(self) unless errors.empty?
|
|
204
|
-
self.class.fail_callback!(self, :update_attributes!)
|
|
205
|
-
end
|
|
206
|
-
result
|
|
207
|
-
end
|
|
208
|
-
|
|
209
|
-
# Perform an upsert of the document. If the document does not exist in the
|
|
210
|
-
# database, then Mongo will insert a new one, otherwise the fields will get
|
|
211
|
-
# overwritten with new values on the existing document.
|
|
212
|
-
#
|
|
213
|
-
# @example Upsert the document.
|
|
214
|
-
# document.upsert
|
|
215
|
-
#
|
|
216
|
-
# @param [ Hash ] options The validation options.
|
|
217
|
-
#
|
|
218
|
-
# @return [ true ] True.
|
|
219
|
-
#
|
|
220
|
-
# @since 3.0.0
|
|
221
|
-
def upsert(options = {})
|
|
222
|
-
Operations.upsert(self, options).persist
|
|
223
|
-
end
|
|
224
|
-
|
|
225
|
-
module ClassMethods #:nodoc:
|
|
226
|
-
|
|
227
|
-
# Create a new document. This will instantiate a new document and
|
|
228
|
-
# insert it in a single call. Will always return the document
|
|
229
|
-
# whether save passed or not.
|
|
230
|
-
#
|
|
231
|
-
# @example Create a new document.
|
|
232
|
-
# Person.create(:title => "Mr")
|
|
233
|
-
#
|
|
234
|
-
# @example Create multiple new documents.
|
|
235
|
-
# Person.create({ title: "Mr" }, { title: "Mrs" })
|
|
236
|
-
#
|
|
237
|
-
# @param [ Hash, Array ] attributes The attributes to create with, or an
|
|
238
|
-
# Array of multiple attributes for multiple documents.
|
|
239
|
-
# @param [ Hash ] options A mass-assignment protection options. Supports
|
|
240
|
-
# :as and :without_protection
|
|
241
|
-
#
|
|
242
|
-
# @return [ Document, Array<Document> ] The newly created document(s).
|
|
243
|
-
#
|
|
244
|
-
# @since 1.0.0
|
|
245
|
-
def create(attributes = nil, options = {}, &block)
|
|
246
|
-
_creating do
|
|
247
|
-
if attributes.is_a?(::Array)
|
|
248
|
-
attributes.map { |attrs| create(attrs, options, &block) }
|
|
249
|
-
else
|
|
250
|
-
doc = new(attributes, options, &block)
|
|
251
|
-
doc.save
|
|
252
|
-
doc
|
|
253
|
-
end
|
|
254
|
-
end
|
|
255
|
-
end
|
|
256
|
-
|
|
257
|
-
# Create a new document. This will instantiate a new document and
|
|
258
|
-
# insert it in a single call. Will always return the document
|
|
259
|
-
# whether save passed or not, and if validation fails an error will be
|
|
260
|
-
# raise.
|
|
261
|
-
#
|
|
262
|
-
# @example Create a new document.
|
|
263
|
-
# Person.create!(:title => "Mr")
|
|
264
|
-
#
|
|
265
|
-
# @example Create multiple new documents.
|
|
266
|
-
# Person.create!({ title: "Mr" }, { title: "Mrs" })
|
|
267
|
-
#
|
|
268
|
-
# @param [ Hash, Array ] attributes The attributes to create with, or an
|
|
269
|
-
# Array of multiple attributes for multiple documents.
|
|
270
|
-
# @param [ Hash ] options A mass-assignment protection options. Supports
|
|
271
|
-
# :as and :without_protection
|
|
272
|
-
#
|
|
273
|
-
# @return [ Document, Array<Document> ] The newly created document(s).
|
|
274
|
-
#
|
|
275
|
-
# @since 1.0.0
|
|
276
|
-
def create!(attributes = {}, options = {}, &block)
|
|
277
|
-
_creating do
|
|
278
|
-
if attributes.is_a?(::Array)
|
|
279
|
-
attributes.map { |attrs| create!(attrs, options, &block) }
|
|
280
|
-
else
|
|
281
|
-
doc = new(attributes, options, &block)
|
|
282
|
-
fail_validate!(doc) unless doc.insert.errors.empty?
|
|
283
|
-
fail_callback!(doc, :create!) if doc.new_record?
|
|
284
|
-
doc
|
|
285
|
-
end
|
|
286
|
-
end
|
|
287
|
-
end
|
|
288
|
-
|
|
289
|
-
# Delete all documents given the supplied conditions. If no conditions
|
|
290
|
-
# are passed, the entire collection will be dropped for performance
|
|
291
|
-
# benefits. Does not fire any callbacks.
|
|
292
|
-
#
|
|
293
|
-
# @example Delete matching documents from the collection.
|
|
294
|
-
# Person.delete_all(:conditions => { :title => "Sir" })
|
|
295
|
-
#
|
|
296
|
-
# @example Delete all documents from the collection.
|
|
297
|
-
# Person.delete_all
|
|
298
|
-
#
|
|
299
|
-
# @param [ Hash ] conditions Optional conditions to delete by.
|
|
300
|
-
#
|
|
301
|
-
# @return [ Integer ] The number of documents deleted.
|
|
302
|
-
def delete_all(conditions = nil)
|
|
303
|
-
conds = conditions || {}
|
|
304
|
-
selector = conds[:conditions] || conds
|
|
305
|
-
selector.merge!(_type: name) if hereditary?
|
|
306
|
-
coll = collection
|
|
307
|
-
deleted = coll.find(selector).count
|
|
308
|
-
coll.find(selector).remove_all
|
|
309
|
-
deleted
|
|
310
|
-
end
|
|
311
|
-
|
|
312
|
-
# Delete all documents given the supplied conditions. If no conditions
|
|
313
|
-
# are passed, the entire collection will be dropped for performance
|
|
314
|
-
# benefits. Fires the destroy callbacks if conditions were passed.
|
|
315
|
-
#
|
|
316
|
-
# @example Destroy matching documents from the collection.
|
|
317
|
-
# Person.destroy_all(:conditions => { :title => "Sir" })
|
|
318
|
-
#
|
|
319
|
-
# @example Destroy all documents from the collection.
|
|
320
|
-
# Person.destroy_all
|
|
321
|
-
#
|
|
322
|
-
# @param [ Hash ] conditions Optional conditions to destroy by.
|
|
323
|
-
#
|
|
324
|
-
# @return [ Integer ] The number of documents destroyed.
|
|
325
|
-
def destroy_all(conditions = nil)
|
|
326
|
-
conds = conditions || {}
|
|
327
|
-
documents = where(conds[:conditions] || conds)
|
|
328
|
-
destroyed = documents.count
|
|
329
|
-
documents.each { |doc| doc.destroy }
|
|
330
|
-
destroyed
|
|
331
|
-
end
|
|
332
|
-
|
|
333
|
-
# Raise an error if validation failed.
|
|
334
|
-
#
|
|
335
|
-
# @example Raise the validation error.
|
|
336
|
-
# Person.fail_validate!(person)
|
|
337
|
-
#
|
|
338
|
-
# @param [ Document ] document The document to fail.
|
|
339
|
-
def fail_validate!(document)
|
|
340
|
-
raise Errors::Validations.new(document)
|
|
341
|
-
end
|
|
342
|
-
|
|
343
|
-
# Raise an error if a callback failed.
|
|
344
|
-
#
|
|
345
|
-
# @example Raise the callback error.
|
|
346
|
-
# Person.fail_callback!(person, :create!)
|
|
347
|
-
#
|
|
348
|
-
# @param [ Document ] document The document to fail.
|
|
349
|
-
# @param [ Symbol ] method The method being called.
|
|
350
|
-
#
|
|
351
|
-
# @since 2.2.0
|
|
352
|
-
def fail_callback!(document, method)
|
|
353
|
-
raise Errors::Callback.new(document.class, method)
|
|
354
|
-
end
|
|
355
|
-
end
|
|
356
|
-
end
|
|
357
|
-
end
|
data/lib/mongoid/unit_of_work.rb
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
|
|
4
|
-
# This module handles unit of work functionality with regards to the identity
|
|
5
|
-
# map.
|
|
6
|
-
module UnitOfWork
|
|
7
|
-
|
|
8
|
-
# We can process a unit of work in Mongoid and have the identity map
|
|
9
|
-
# automatically clear itself out after the work is complete.
|
|
10
|
-
#
|
|
11
|
-
# @example Process a unit of work.
|
|
12
|
-
# Mongoid.unit_of_work do
|
|
13
|
-
# Person.create(title: "Sir")
|
|
14
|
-
# end
|
|
15
|
-
#
|
|
16
|
-
# @example Process with identity map disabled on the current thread.
|
|
17
|
-
# Mongoid.unit_of_work(disable: :current) do
|
|
18
|
-
# Person.create(title: "Sir")
|
|
19
|
-
# end
|
|
20
|
-
#
|
|
21
|
-
# @example Process with identity map disabled on all threads.
|
|
22
|
-
# Mongoid.unit_of_work(disable: :all) do
|
|
23
|
-
# Person.create(title: "Sir")
|
|
24
|
-
# end
|
|
25
|
-
#
|
|
26
|
-
# @param [ Hash ] options The disabling options.
|
|
27
|
-
#
|
|
28
|
-
# @option [ Symbol ] :disable Either :all or :current to indicate whether
|
|
29
|
-
# to temporarily disable the identity map on the current thread or all
|
|
30
|
-
# threads.
|
|
31
|
-
#
|
|
32
|
-
# @return [ Object ] The result of the block.
|
|
33
|
-
#
|
|
34
|
-
# @since 2.1.0
|
|
35
|
-
def unit_of_work(options = {})
|
|
36
|
-
disable = options[:disable]
|
|
37
|
-
begin
|
|
38
|
-
Threaded.disable_identity_map(disable) if disable
|
|
39
|
-
yield if block_given?
|
|
40
|
-
ensure
|
|
41
|
-
if disable
|
|
42
|
-
Threaded.enable_identity_map(disable)
|
|
43
|
-
else
|
|
44
|
-
IdentityMap.clear
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
# Are we currently using the identity map?
|
|
50
|
-
#
|
|
51
|
-
# @example Is the identity map currently enabled?
|
|
52
|
-
# Mongoid.using_identity_map?
|
|
53
|
-
#
|
|
54
|
-
# @return [ true, false ] If the identity map is in use.
|
|
55
|
-
#
|
|
56
|
-
# @since 3.0.0
|
|
57
|
-
def using_identity_map?
|
|
58
|
-
Mongoid.identity_map_enabled? && Threaded.identity_map_enabled?
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
end
|
data/lib/mongoid/versioning.rb
DELETED
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
|
|
4
|
-
# Include this module to get automatic versioning of root level documents.
|
|
5
|
-
# This will add a version field to the +Document+ and a has_many association
|
|
6
|
-
# with all the versions contained in it.
|
|
7
|
-
module Versioning
|
|
8
|
-
extend ActiveSupport::Concern
|
|
9
|
-
|
|
10
|
-
included do
|
|
11
|
-
field :version, type: Integer, default: 1
|
|
12
|
-
|
|
13
|
-
embeds_many \
|
|
14
|
-
:versions,
|
|
15
|
-
class_name: self.name,
|
|
16
|
-
validate: false,
|
|
17
|
-
cyclic: true,
|
|
18
|
-
inverse_of: nil,
|
|
19
|
-
versioned: true
|
|
20
|
-
|
|
21
|
-
set_callback :save, :before, :revise, if: :revisable?
|
|
22
|
-
|
|
23
|
-
class_attribute :version_max
|
|
24
|
-
self.cyclic = true
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# Create a new version of the +Document+. This will load the previous
|
|
28
|
-
# document from the database and set it as the next version before saving
|
|
29
|
-
# the current document. It then increments the version number. If a #max_versions
|
|
30
|
-
# limit is set in the model and it's exceeded, the oldest version gets discarded.
|
|
31
|
-
#
|
|
32
|
-
# @example Revise the document.
|
|
33
|
-
# person.revise
|
|
34
|
-
#
|
|
35
|
-
# @since 1.0.0
|
|
36
|
-
def revise
|
|
37
|
-
previous = previous_revision
|
|
38
|
-
if previous && versioned_attributes_changed?
|
|
39
|
-
new_version = versions.build(
|
|
40
|
-
previous.versioned_attributes, without_protection: true
|
|
41
|
-
)
|
|
42
|
-
new_version._id = nil
|
|
43
|
-
if version_max.present? && versions.length > version_max
|
|
44
|
-
deleted = versions.first
|
|
45
|
-
if deleted.paranoid?
|
|
46
|
-
versions.delete_one(deleted)
|
|
47
|
-
collection.find(atomic_selector).
|
|
48
|
-
update({ "$pull" => { "versions" => { "version" => deleted.version }}})
|
|
49
|
-
else
|
|
50
|
-
versions.delete(deleted)
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
self.version = (version || 1 ) + 1
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# Forces the creation of a new version of the +Document+, regardless of
|
|
58
|
-
# whether a change was actually made.
|
|
59
|
-
#
|
|
60
|
-
# @example Revise the document.
|
|
61
|
-
# person.revise!
|
|
62
|
-
#
|
|
63
|
-
# @since 2.2.1
|
|
64
|
-
def revise!
|
|
65
|
-
versions.build(
|
|
66
|
-
(previous_revision || self).versioned_attributes, without_protection: true
|
|
67
|
-
)
|
|
68
|
-
versions.shift if version_max.present? && versions.length > version_max
|
|
69
|
-
self.version = (version || 1 ) + 1
|
|
70
|
-
save
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
# Filters the results of +changes+ by removing any fields that should
|
|
74
|
-
# not be versioned.
|
|
75
|
-
#
|
|
76
|
-
# @return [ Hash ] A hash of versioned changed attributes.
|
|
77
|
-
#
|
|
78
|
-
# @since 2.1.0
|
|
79
|
-
def versioned_changes
|
|
80
|
-
only_versioned_attributes(changes.except("updated_at"))
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
# Filters the results of +attributes+ by removing any fields that should
|
|
84
|
-
# not be versioned.
|
|
85
|
-
#
|
|
86
|
-
# @return [ Hash ] A hash of versioned attributes.
|
|
87
|
-
#
|
|
88
|
-
# @since 2.1.0
|
|
89
|
-
def versioned_attributes
|
|
90
|
-
only_versioned_attributes(attributes)
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
# Check if any versioned fields have been modified. This is similar
|
|
94
|
-
# to +changed?+, except this method also ignores fields set to be
|
|
95
|
-
# ignored by versioning.
|
|
96
|
-
#
|
|
97
|
-
# @return [ Boolean ] Whether fields that will be versioned have changed.
|
|
98
|
-
#
|
|
99
|
-
# @since 2.1.0
|
|
100
|
-
def versioned_attributes_changed?
|
|
101
|
-
!versioned_changes.empty?
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
# Executes a block that temporarily disables versioning. This is for cases
|
|
105
|
-
# where you do not want to version on every save.
|
|
106
|
-
#
|
|
107
|
-
# @example Execute a save without versioning.
|
|
108
|
-
# person.versionless(&:save)
|
|
109
|
-
#
|
|
110
|
-
# @return [ Object ] The document or result of the block execution.
|
|
111
|
-
#
|
|
112
|
-
# @since 2.0.0
|
|
113
|
-
def versionless
|
|
114
|
-
@versionless = true
|
|
115
|
-
result = yield(self) if block_given?
|
|
116
|
-
@versionless = false
|
|
117
|
-
result || self
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
private
|
|
121
|
-
|
|
122
|
-
# Find the previous version of this document in the database, or if the
|
|
123
|
-
# document had been saved without versioning return the persisted one.
|
|
124
|
-
#
|
|
125
|
-
# @example Find the last version.
|
|
126
|
-
# document.find_last_version
|
|
127
|
-
#
|
|
128
|
-
# @return [ Document, nil ] The previously saved document.
|
|
129
|
-
#
|
|
130
|
-
# @since 2.0.0
|
|
131
|
-
def previous_revision
|
|
132
|
-
_loading_revision do
|
|
133
|
-
self.class.unscoped.
|
|
134
|
-
where(_id: id).
|
|
135
|
-
any_of({ version: version }, { version: nil }).first
|
|
136
|
-
end
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
# Is the document able to be revised? This is true if the document has
|
|
140
|
-
# changed and we have not explicitly told it not to version.
|
|
141
|
-
#
|
|
142
|
-
# @example Is the document revisable?
|
|
143
|
-
# document.revisable?
|
|
144
|
-
#
|
|
145
|
-
# @return [ true, false ] If the document is revisable.
|
|
146
|
-
#
|
|
147
|
-
# @since 2.0.0
|
|
148
|
-
def revisable?
|
|
149
|
-
versioned_attributes_changed? && !versionless?
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
# Are we in versionless mode? This is true if in a versionless block on the
|
|
153
|
-
# document.
|
|
154
|
-
#
|
|
155
|
-
# @example Is the document in versionless mode?
|
|
156
|
-
# document.versionless?
|
|
157
|
-
#
|
|
158
|
-
# @return [ true, false ] Is the document not currently versioning.
|
|
159
|
-
#
|
|
160
|
-
# @since 2.0.0
|
|
161
|
-
def versionless?
|
|
162
|
-
@versionless ||= false
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
# Filters fields that should not be versioned out of an attributes hash.
|
|
166
|
-
# Dynamic attributes are always versioned.
|
|
167
|
-
#
|
|
168
|
-
# @param [ Hash ] A hash with field names as keys.
|
|
169
|
-
#
|
|
170
|
-
# @return [ Hash ] The hash without non-versioned columns.
|
|
171
|
-
#
|
|
172
|
-
# @since 2.1.0
|
|
173
|
-
def only_versioned_attributes(hash)
|
|
174
|
-
versioned = {}
|
|
175
|
-
hash.except("versions").each_pair do |name, value|
|
|
176
|
-
add_versioned_attribute(versioned, name, value)
|
|
177
|
-
end
|
|
178
|
-
versioned
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
# Add the versioned attribute. Will work now for localized fields.
|
|
182
|
-
#
|
|
183
|
-
# @api private
|
|
184
|
-
#
|
|
185
|
-
# @example Add the versioned attribute.
|
|
186
|
-
# model.add_versioned_attribute({}, "name", "test")
|
|
187
|
-
#
|
|
188
|
-
# @param [ Hash ] versioned The versioned attributes.
|
|
189
|
-
# @param [ String ] name The name of the field.
|
|
190
|
-
# @param [ Object ] value The value for the field.
|
|
191
|
-
#
|
|
192
|
-
# @since 3.0.10
|
|
193
|
-
def add_versioned_attribute(versioned, name, value)
|
|
194
|
-
field = fields[name]
|
|
195
|
-
if field && field.localized?
|
|
196
|
-
versioned["#{name}_translations"] = value
|
|
197
|
-
else
|
|
198
|
-
versioned[name] = value if !field || field.versioned?
|
|
199
|
-
end
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
module ClassMethods
|
|
203
|
-
|
|
204
|
-
# Sets the maximum number of versions to store.
|
|
205
|
-
#
|
|
206
|
-
# @example Set the maximum.
|
|
207
|
-
# Person.max_versions(5)
|
|
208
|
-
#
|
|
209
|
-
# @param [ Integer ] number The maximum number to store.
|
|
210
|
-
#
|
|
211
|
-
# @return [ Integer ] The max number of versions.
|
|
212
|
-
def max_versions(number)
|
|
213
|
-
self.version_max = number.to_i
|
|
214
|
-
end
|
|
215
|
-
end
|
|
216
|
-
end
|
|
217
|
-
end
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Rack
|
|
3
|
-
module Mongoid
|
|
4
|
-
module Middleware
|
|
5
|
-
|
|
6
|
-
# This middleware contains the behaviour needed to properly use the
|
|
7
|
-
# identity map in Rack based applications. This middleware will properly
|
|
8
|
-
# handle Rails or Rack streaming responses.
|
|
9
|
-
class IdentityMap
|
|
10
|
-
|
|
11
|
-
# Initialize the new middleware.
|
|
12
|
-
#
|
|
13
|
-
# @example Init the middleware.
|
|
14
|
-
# IdentityMap.new(app)
|
|
15
|
-
#
|
|
16
|
-
# @param [ Object ] app The application.
|
|
17
|
-
#
|
|
18
|
-
# @since 2.1.0
|
|
19
|
-
def initialize(app)
|
|
20
|
-
@app = app
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
# Make the request with the provided environment.
|
|
24
|
-
#
|
|
25
|
-
# @example Make the request.
|
|
26
|
-
# identity_map.call(env)
|
|
27
|
-
#
|
|
28
|
-
# @param [ Object ] env The environment.
|
|
29
|
-
#
|
|
30
|
-
# @return [ Array ] The status, headers, and response.
|
|
31
|
-
#
|
|
32
|
-
# @since 2.1.0
|
|
33
|
-
def call(env)
|
|
34
|
-
::Mongoid.unit_of_work { @app.call(env) }
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
data/lib/rack/mongoid.rb
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
require "rails/generators/mongoid_generator"
|
|
3
|
-
|
|
4
|
-
module Mongoid
|
|
5
|
-
module Generators
|
|
6
|
-
class ObserverGenerator < Base
|
|
7
|
-
|
|
8
|
-
check_class_collision suffix: "Observer"
|
|
9
|
-
|
|
10
|
-
def create_observer_file
|
|
11
|
-
template 'observer.rb.tt', File.join('app/models', class_path, "#{file_name}_observer.rb")
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
hook_for :test_framework
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|