mongoid 3.1.6 → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +479 -8
- data/README.md +10 -7
- data/lib/config/locales/en.yml +34 -20
- data/lib/mongoid.rb +10 -76
- data/lib/mongoid/atomic.rb +3 -14
- data/lib/mongoid/atomic/paths/embedded.rb +0 -30
- data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
- data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
- data/lib/mongoid/atomic/paths/root.rb +0 -13
- data/lib/mongoid/attributes.rb +65 -101
- data/lib/mongoid/attributes/dynamic.rb +154 -0
- data/lib/mongoid/attributes/nested.rb +82 -0
- data/lib/mongoid/attributes/processing.rb +13 -66
- data/lib/mongoid/{dirty.rb → changeable.rb} +32 -2
- data/lib/mongoid/composable.rb +105 -0
- data/lib/mongoid/config.rb +3 -9
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/contextual.rb +2 -0
- data/lib/mongoid/contextual/aggregable/memory.rb +2 -2
- data/lib/mongoid/contextual/aggregable/mongo.rb +7 -9
- data/lib/mongoid/contextual/atomic.rb +53 -53
- data/lib/mongoid/contextual/geo_near.rb +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +4 -2
- data/lib/mongoid/contextual/memory.rb +23 -11
- data/lib/mongoid/contextual/mongo.rb +75 -57
- data/lib/mongoid/contextual/none.rb +90 -0
- data/lib/mongoid/contextual/text_search.rb +178 -0
- data/lib/mongoid/copyable.rb +2 -3
- data/lib/mongoid/criteria.rb +39 -34
- data/lib/mongoid/criteria/#findable.rb# +141 -0
- data/lib/mongoid/{criterion → criteria}/findable.rb +7 -47
- data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
- data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
- data/lib/mongoid/{criterion → criteria}/modifiable.rb +28 -8
- data/lib/mongoid/criteria/permission.rb +70 -0
- data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
- data/lib/mongoid/document.rb +39 -24
- data/lib/mongoid/errors.rb +4 -1
- data/lib/mongoid/errors/document_not_destroyed.rb +25 -0
- data/lib/mongoid/errors/document_not_found.rb +2 -1
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_parent.rb +26 -0
- data/lib/mongoid/errors/invalid_value.rb +16 -0
- data/lib/mongoid/errors/mongoid_error.rb +1 -1
- data/lib/mongoid/errors/readonly_document.rb +24 -0
- data/lib/mongoid/extensions.rb +15 -7
- data/lib/mongoid/extensions/array.rb +3 -3
- data/lib/mongoid/extensions/big_decimal.rb +1 -1
- data/lib/mongoid/extensions/boolean.rb +15 -17
- data/lib/mongoid/extensions/date.rb +1 -1
- data/lib/mongoid/extensions/date_time.rb +3 -3
- data/lib/mongoid/extensions/float.rb +2 -1
- data/lib/mongoid/extensions/hash.rb +3 -3
- data/lib/mongoid/extensions/integer.rb +1 -1
- data/lib/mongoid/extensions/object.rb +7 -7
- data/lib/mongoid/extensions/object_id.rb +5 -5
- data/lib/mongoid/extensions/range.rb +9 -3
- data/lib/mongoid/extensions/regexp.rb +1 -1
- data/lib/mongoid/extensions/set.rb +1 -1
- data/lib/mongoid/extensions/string.rb +6 -18
- data/lib/mongoid/extensions/symbol.rb +1 -1
- data/lib/mongoid/extensions/time.rb +3 -3
- data/lib/mongoid/extensions/time_with_zone.rb +1 -1
- data/lib/mongoid/factory.rb +8 -6
- data/lib/mongoid/fields.rb +41 -8
- data/lib/mongoid/fields/foreign_key.rb +3 -3
- data/lib/mongoid/fields/localized.rb +1 -1
- data/lib/mongoid/fields/standard.rb +5 -17
- data/lib/mongoid/fields/validators/macro.rb +15 -5
- data/lib/mongoid/{finders.rb → findable.rb} +35 -7
- data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
- data/lib/mongoid/indexable/specification.rb +104 -0
- data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
- data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
- data/lib/mongoid/{callbacks.rb → interceptable.rb} +30 -62
- data/lib/mongoid/log_subscriber.rb +55 -0
- data/lib/mongoid/matchable.rb +152 -0
- data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/ne.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
- data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
- data/lib/mongoid/persistable.rb +216 -0
- data/lib/mongoid/persistable/creatable.rb +189 -0
- data/lib/mongoid/persistable/deletable.rb +149 -0
- data/lib/mongoid/persistable/destroyable.rb +60 -0
- data/lib/mongoid/persistable/incrementable.rb +36 -0
- data/lib/mongoid/persistable/logical.rb +38 -0
- data/lib/mongoid/persistable/poppable.rb +39 -0
- data/lib/mongoid/persistable/pullable.rb +55 -0
- data/lib/mongoid/persistable/pushable.rb +62 -0
- data/lib/mongoid/persistable/renamable.rb +35 -0
- data/lib/mongoid/persistable/savable.rb +52 -0
- data/lib/mongoid/persistable/settable.rb +33 -0
- data/lib/mongoid/persistable/unsettable.rb +36 -0
- data/lib/mongoid/persistable/updatable.rb +153 -0
- data/lib/mongoid/persistable/upsertable.rb +55 -0
- data/lib/mongoid/positional.rb +71 -0
- data/lib/mongoid/query_cache.rb +255 -0
- data/lib/mongoid/railtie.rb +34 -60
- data/lib/mongoid/railties/database.rake +9 -25
- data/lib/mongoid/relations.rb +11 -25
- data/lib/mongoid/relations/accessors.rb +15 -51
- data/lib/mongoid/relations/auto_save.rb +15 -36
- data/lib/mongoid/relations/binding.rb +2 -25
- data/lib/mongoid/relations/bindings/embedded/in.rb +1 -1
- data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
- data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -2
- data/lib/mongoid/relations/builder.rb +1 -1
- data/lib/mongoid/relations/builders.rb +2 -2
- data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -6
- data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
- data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
- data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
- data/lib/mongoid/relations/cascading.rb +3 -5
- data/lib/mongoid/relations/constraint.rb +1 -1
- data/lib/mongoid/relations/conversions.rb +1 -1
- data/lib/mongoid/relations/counter_cache.rb +39 -15
- data/lib/mongoid/relations/eager.rb +46 -0
- data/lib/mongoid/relations/eager/base.rb +149 -0
- data/lib/mongoid/relations/eager/belongs_to.rb +31 -0
- data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +47 -0
- data/lib/mongoid/relations/eager/has_many.rb +38 -0
- data/lib/mongoid/relations/eager/has_one.rb +30 -0
- data/lib/mongoid/relations/embedded/batchable.rb +4 -5
- data/lib/mongoid/relations/embedded/in.rb +4 -4
- data/lib/mongoid/relations/embedded/many.rb +14 -32
- data/lib/mongoid/relations/embedded/one.rb +1 -1
- data/lib/mongoid/relations/macros.rb +3 -4
- data/lib/mongoid/relations/many.rb +51 -31
- data/lib/mongoid/relations/marshalable.rb +3 -3
- data/lib/mongoid/relations/metadata.rb +14 -79
- data/lib/mongoid/relations/nested_builder.rb +2 -2
- data/lib/mongoid/relations/one.rb +1 -1
- data/lib/mongoid/relations/options.rb +1 -0
- data/lib/mongoid/relations/polymorphic.rb +0 -1
- data/lib/mongoid/relations/proxy.rb +21 -41
- data/lib/mongoid/relations/referenced/in.rb +4 -20
- data/lib/mongoid/relations/referenced/many.rb +22 -35
- data/lib/mongoid/relations/referenced/many_to_many.rb +19 -42
- data/lib/mongoid/relations/referenced/one.rb +6 -25
- data/lib/mongoid/relations/synchronization.rb +4 -4
- data/lib/mongoid/relations/targets/enumerable.rb +10 -10
- data/lib/mongoid/relations/touchable.rb +34 -1
- data/lib/mongoid/{reloading.rb → reloadable.rb} +7 -5
- data/lib/mongoid/{scoping.rb → scopable.rb} +36 -36
- data/lib/mongoid/selectable.rb +59 -0
- data/lib/mongoid/{serialization.rb → serializable.rb} +11 -2
- data/lib/mongoid/sessions.rb +37 -345
- data/lib/mongoid/sessions/factory.rb +2 -0
- data/lib/mongoid/sessions/options.rb +185 -0
- data/lib/mongoid/sessions/storage_options.rb +140 -0
- data/lib/mongoid/sessions/thread_options.rb +19 -0
- data/lib/mongoid/sessions/validators/storage.rb +16 -3
- data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
- data/lib/mongoid/{state.rb → stateful.rb} +13 -1
- data/lib/mongoid/support/query_counter.rb +23 -0
- data/lib/mongoid/tasks/database.rake +31 -0
- data/lib/mongoid/tasks/database.rb +107 -0
- data/lib/mongoid/threaded.rb +26 -172
- data/lib/mongoid/threaded/lifecycle.rb +0 -28
- data/lib/mongoid/timestamps/updated/short.rb +2 -2
- data/lib/mongoid/{hierarchy.rb → traversable.rb} +15 -7
- data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
- data/lib/mongoid/{validations → validatable}/associated.rb +4 -2
- data/lib/mongoid/{validations → validatable}/format.rb +1 -1
- data/lib/mongoid/{validations → validatable}/length.rb +1 -1
- data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
- data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
- data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
- data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
- data/lib/mongoid/{validations → validatable}/uniqueness.rb +25 -21
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +46 -25
- data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
- data/lib/rails/generators/mongoid_generator.rb +3 -40
- data/lib/rails/mongoid.rb +0 -122
- data/lib/support/ruby_version.rb +1 -1
- data/spec/app/models/account.rb +2 -6
- data/spec/app/models/acolyte.rb +2 -1
- data/spec/app/models/actor.rb +0 -1
- data/spec/app/models/address.rb +8 -3
- data/spec/app/models/animal.rb +1 -1
- data/spec/app/models/appointment.rb +3 -3
- data/spec/app/models/article.rb +1 -4
- data/spec/app/models/audio.rb +5 -0
- data/spec/app/models/author.rb +0 -2
- data/spec/app/models/band.rb +3 -2
- data/spec/app/models/bar.rb +1 -0
- data/spec/app/models/book.rb +1 -0
- data/spec/app/models/building.rb +0 -2
- data/spec/app/models/building_address.rb +0 -2
- data/spec/app/models/bus.rb +1 -1
- data/spec/app/models/canvas.rb +1 -1
- data/spec/app/models/contextable_item.rb +5 -0
- data/spec/app/models/contractor.rb +0 -2
- data/spec/app/models/country_code.rb +1 -1
- data/spec/app/models/definition.rb +2 -2
- data/spec/app/models/dog.rb +1 -1
- data/spec/app/models/draft.rb +9 -0
- data/spec/app/models/dragon.rb +4 -0
- data/spec/app/models/drug.rb +1 -3
- data/spec/app/models/dungeon.rb +4 -0
- data/spec/app/models/edit.rb +5 -0
- data/spec/app/models/even.rb +7 -0
- data/spec/app/models/event.rb +1 -1
- data/spec/app/models/filesystem.rb +1 -0
- data/spec/app/models/fish.rb +0 -1
- data/spec/app/models/fruits.rb +6 -0
- data/spec/app/models/game.rb +0 -2
- data/spec/app/models/house.rb +1 -3
- data/spec/app/models/id_key.rb +6 -0
- data/spec/app/models/item.rb +1 -5
- data/spec/app/models/jar.rb +1 -1
- data/spec/app/models/label.rb +4 -4
- data/spec/app/models/line_item.rb +1 -1
- data/spec/app/models/login.rb +1 -1
- data/spec/app/models/message.rb +8 -0
- data/spec/app/models/movie.rb +1 -0
- data/spec/app/models/name.rb +3 -3
- data/spec/app/models/note.rb +3 -1
- data/spec/app/models/odd.rb +7 -0
- data/spec/app/models/oscar.rb +1 -1
- data/spec/app/models/parent_doc.rb +1 -1
- data/spec/app/models/person.rb +16 -10
- data/spec/app/models/phone.rb +1 -3
- data/spec/app/models/player.rb +3 -3
- data/spec/app/models/post.rb +5 -3
- data/spec/app/models/preference.rb +1 -1
- data/spec/app/models/quiz.rb +0 -3
- data/spec/app/models/record.rb +10 -5
- data/spec/app/models/registry.rb +1 -1
- data/spec/app/models/server.rb +1 -1
- data/spec/app/models/service.rb +3 -3
- data/spec/app/models/sound.rb +5 -0
- data/spec/app/models/symptom.rb +1 -1
- data/spec/app/models/template.rb +1 -1
- data/spec/app/models/title.rb +0 -1
- data/spec/app/models/track.rb +5 -5
- data/spec/app/models/tree.rb +3 -3
- data/spec/app/models/video.rb +1 -5
- data/spec/app/models/wiki_page.rb +2 -5
- data/spec/app/models/word.rb +3 -0
- data/spec/app/models/word_origin.rb +1 -1
- data/spec/config/mongoid.yml +7 -8
- data/spec/helpers.rb +18 -0
- data/spec/mongoid/#atomic_spec.rb# +365 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
- data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
- data/spec/mongoid/atomic/paths_spec.rb +19 -19
- data/spec/mongoid/atomic_spec.rb +19 -19
- data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +474 -592
- data/spec/mongoid/attributes/readonly_spec.rb +58 -18
- data/spec/mongoid/attributes_spec.rb +349 -434
- data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +203 -153
- data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
- data/spec/mongoid/config/environment_spec.rb +3 -3
- data/spec/mongoid/config/options_spec.rb +6 -6
- data/spec/mongoid/config_spec.rb +24 -48
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +78 -38
- data/spec/mongoid/contextual/atomic_spec.rb +60 -56
- data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
- data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
- data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
- data/spec/mongoid/contextual/memory_spec.rb +156 -94
- data/spec/mongoid/contextual/mongo_spec.rb +238 -150
- data/spec/mongoid/contextual/none_spec.rb +127 -0
- data/spec/mongoid/contextual/text_search_spec.rb +209 -0
- data/spec/mongoid/copyable_spec.rb +56 -68
- data/spec/mongoid/criteria/findable_spec.rb +991 -0
- data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
- data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
- data/spec/mongoid/criteria/modifiable_spec.rb +1252 -0
- data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
- data/spec/mongoid/criteria_spec.rb +715 -2421
- data/spec/mongoid/document_spec.rb +171 -121
- data/spec/mongoid/equality_spec.rb +22 -22
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
- data/spec/mongoid/errors/callback_spec.rb +3 -3
- data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +33 -0
- data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
- data/spec/mongoid/errors/eager_load_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_scope_spec.rb +5 -5
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
- data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
- data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
- data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
- data/spec/mongoid/errors/mongoid_error_spec.rb +8 -8
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
- data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
- data/spec/mongoid/errors/no_parent_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
- data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
- data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
- data/spec/mongoid/errors/readonly_document_spec.rb +29 -0
- data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
- data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
- data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
- data/spec/mongoid/errors/validations_spec.rb +7 -7
- data/spec/mongoid/extensions/array_spec.rb +61 -61
- data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
- data/spec/mongoid/extensions/binary_spec.rb +12 -12
- data/spec/mongoid/extensions/boolean_spec.rb +18 -18
- data/spec/mongoid/extensions/date_spec.rb +13 -13
- data/spec/mongoid/extensions/date_time_spec.rb +8 -8
- data/spec/mongoid/extensions/false_class_spec.rb +5 -5
- data/spec/mongoid/extensions/float_spec.rb +29 -15
- data/spec/mongoid/extensions/hash_spec.rb +29 -29
- data/spec/mongoid/extensions/integer_spec.rb +15 -15
- data/spec/mongoid/extensions/module_spec.rb +2 -2
- data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
- data/spec/mongoid/extensions/object_id_spec.rb +134 -134
- data/spec/mongoid/extensions/object_spec.rb +26 -26
- data/spec/mongoid/extensions/range_spec.rb +61 -12
- data/spec/mongoid/extensions/regexp_spec.rb +4 -4
- data/spec/mongoid/extensions/set_spec.rb +4 -4
- data/spec/mongoid/extensions/string_spec.rb +35 -46
- data/spec/mongoid/extensions/symbol_spec.rb +9 -9
- data/spec/mongoid/extensions/time_spec.rb +49 -49
- data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
- data/spec/mongoid/extensions/true_class_spec.rb +5 -5
- data/spec/mongoid/extensions_spec.rb +29 -0
- data/spec/mongoid/factory_spec.rb +15 -15
- data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
- data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
- data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
- data/spec/mongoid/fields/localized_spec.rb +38 -23
- data/spec/mongoid/fields/standard_spec.rb +12 -12
- data/spec/mongoid/fields_spec.rb +263 -217
- data/spec/mongoid/findable_spec.rb +509 -0
- data/spec/mongoid/indexable/specification_spec.rb +102 -0
- data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
- data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
- data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +117 -116
- data/spec/mongoid/log_subscriber_spec.rb +75 -0
- data/spec/mongoid/loggable_spec.rb +1 -1
- data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
- data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
- data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
- data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
- data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
- data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
- data/spec/mongoid/matchable/in_spec.rb +49 -0
- data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
- data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
- data/spec/mongoid/matchable/ne_spec.rb +46 -0
- data/spec/mongoid/matchable/nin_spec.rb +48 -0
- data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
- data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
- data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
- data/spec/mongoid/persistable/creatable_spec.rb +553 -0
- data/spec/mongoid/persistable/deletable_spec.rb +218 -0
- data/spec/mongoid/persistable/destroyable_spec.rb +192 -0
- data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
- data/spec/mongoid/persistable/logical_spec.rb +143 -0
- data/spec/mongoid/persistable/poppable_spec.rb +115 -0
- data/spec/mongoid/persistable/pullable_spec.rb +228 -0
- data/spec/mongoid/persistable/pushable_spec.rb +258 -0
- data/spec/mongoid/persistable/renamable_spec.rb +135 -0
- data/spec/mongoid/persistable/savable_spec.rb +498 -0
- data/spec/mongoid/persistable/settable_spec.rb +162 -0
- data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
- data/spec/mongoid/persistable/updatable_spec.rb +558 -0
- data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
- data/spec/mongoid/persistable_spec.rb +206 -0
- data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +14 -19
- data/spec/mongoid/query_cache_spec.rb +263 -0
- data/spec/mongoid/railties/document_spec.rb +2 -2
- data/spec/mongoid/relations/accessors_spec.rb +53 -145
- data/spec/mongoid/relations/auto_save_spec.rb +37 -17
- data/spec/mongoid/relations/bindings/embedded/in_spec.rb +12 -12
- data/spec/mongoid/relations/bindings/embedded/many_spec.rb +3 -3
- data/spec/mongoid/relations/bindings/embedded/one_spec.rb +5 -5
- data/spec/mongoid/relations/bindings/referenced/in_spec.rb +26 -26
- data/spec/mongoid/relations/bindings/referenced/many_spec.rb +10 -10
- data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +19 -19
- data/spec/mongoid/relations/bindings/referenced/one_spec.rb +12 -12
- data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
- data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
- data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
- data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
- data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
- data/spec/mongoid/relations/builders/referenced/in_spec.rb +24 -35
- data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
- data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
- data/spec/mongoid/relations/builders/referenced/one_spec.rb +12 -25
- data/spec/mongoid/relations/builders_spec.rb +21 -21
- data/spec/mongoid/relations/cascading/delete_spec.rb +9 -9
- data/spec/mongoid/relations/cascading/destroy_spec.rb +6 -6
- data/spec/mongoid/relations/cascading/nullify_spec.rb +4 -4
- data/spec/mongoid/relations/cascading/restrict_spec.rb +7 -7
- data/spec/mongoid/relations/cascading_spec.rb +16 -16
- data/spec/mongoid/relations/constraint_spec.rb +8 -7
- data/spec/mongoid/relations/conversions_spec.rb +16 -14
- data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
- data/spec/mongoid/relations/cyclic_spec.rb +18 -18
- data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
- data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +117 -0
- data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
- data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
- data/spec/mongoid/relations/eager_spec.rb +228 -0
- data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
- data/spec/mongoid/relations/embedded/in_spec.rb +56 -57
- data/spec/mongoid/relations/embedded/many_spec.rb +467 -372
- data/spec/mongoid/relations/embedded/one_spec.rb +108 -141
- data/spec/mongoid/relations/macros_spec.rb +108 -102
- data/spec/mongoid/relations/metadata_spec.rb +180 -255
- data/spec/mongoid/relations/options_spec.rb +1 -1
- data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
- data/spec/mongoid/relations/proxy_spec.rb +2 -2
- data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
- data/spec/mongoid/relations/referenced/many_spec.rb +587 -527
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +401 -424
- data/spec/mongoid/relations/referenced/one_spec.rb +149 -264
- data/spec/mongoid/relations/reflections_spec.rb +6 -6
- data/spec/mongoid/relations/synchronization_spec.rb +46 -50
- data/spec/mongoid/relations/targets/enumerable_spec.rb +118 -118
- data/spec/mongoid/relations/touchable_spec.rb +333 -0
- data/spec/mongoid/relations_spec.rb +16 -15
- data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +38 -55
- data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +89 -164
- data/spec/mongoid/selectable_spec.rb +134 -0
- data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +129 -82
- data/spec/mongoid/sessions/factory_spec.rb +49 -28
- data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
- data/spec/mongoid/sessions/options_spec.rb +108 -0
- data/spec/mongoid/sessions_spec.rb +319 -178
- data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
- data/spec/mongoid/{state_spec.rb → stateful_spec.rb} +36 -11
- data/spec/mongoid/tasks/database_rake_spec.rb +285 -0
- data/spec/mongoid/tasks/database_spec.rb +160 -0
- data/spec/mongoid/threaded_spec.rb +17 -70
- data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
- data/spec/mongoid/timestamps/created_spec.rb +5 -5
- data/spec/mongoid/timestamps/timeless_spec.rb +6 -6
- data/spec/mongoid/timestamps/updated/short_spec.rb +11 -11
- data/spec/mongoid/timestamps/updated_spec.rb +9 -13
- data/spec/mongoid/timestamps_spec.rb +9 -13
- data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
- data/spec/mongoid/{validations → validatable}/associated_spec.rb +45 -22
- data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
- data/spec/mongoid/{validations → validatable}/length_spec.rb +14 -14
- data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
- data/spec/mongoid/{validations → validatable}/presence_spec.rb +37 -44
- data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +184 -192
- data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
- data/spec/mongoid_spec.rb +8 -8
- data/spec/rails/mongoid_spec.rb +19 -335
- data/spec/spec_helper.rb +31 -13
- metadata +303 -283
- data/lib/mongoid/atomic/positionable.rb +0 -73
- data/lib/mongoid/components.rb +0 -92
- data/lib/mongoid/config/inflections.rb +0 -6
- data/lib/mongoid/contextual/eager.rb +0 -158
- data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
- data/lib/mongoid/identity_map.rb +0 -163
- data/lib/mongoid/json.rb +0 -16
- data/lib/mongoid/matchers.rb +0 -32
- data/lib/mongoid/matchers/strategies.rb +0 -97
- data/lib/mongoid/multi_parameter_attributes.rb +0 -105
- data/lib/mongoid/nested_attributes.rb +0 -78
- data/lib/mongoid/observer.rb +0 -192
- data/lib/mongoid/paranoia.rb +0 -136
- data/lib/mongoid/persistence.rb +0 -357
- data/lib/mongoid/persistence/atomic.rb +0 -231
- data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
- data/lib/mongoid/persistence/atomic/bit.rb +0 -35
- data/lib/mongoid/persistence/atomic/inc.rb +0 -45
- data/lib/mongoid/persistence/atomic/operation.rb +0 -154
- data/lib/mongoid/persistence/atomic/pop.rb +0 -32
- data/lib/mongoid/persistence/atomic/pull.rb +0 -32
- data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
- data/lib/mongoid/persistence/atomic/push.rb +0 -25
- data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
- data/lib/mongoid/persistence/atomic/rename.rb +0 -30
- data/lib/mongoid/persistence/atomic/sets.rb +0 -28
- data/lib/mongoid/persistence/atomic/unset.rb +0 -27
- data/lib/mongoid/persistence/deletion.rb +0 -31
- data/lib/mongoid/persistence/insertion.rb +0 -38
- data/lib/mongoid/persistence/modification.rb +0 -35
- data/lib/mongoid/persistence/operations.rb +0 -214
- data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
- data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
- data/lib/mongoid/persistence/operations/insert.rb +0 -34
- data/lib/mongoid/persistence/operations/remove.rb +0 -33
- data/lib/mongoid/persistence/operations/update.rb +0 -59
- data/lib/mongoid/persistence/operations/upsert.rb +0 -28
- data/lib/mongoid/persistence/upsertion.rb +0 -31
- data/lib/mongoid/unit_of_work.rb +0 -61
- data/lib/mongoid/versioning.rb +0 -217
- data/lib/rack/mongoid.rb +0 -2
- data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
- data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
- data/spec/app/models/actor_observer.rb +0 -15
- data/spec/app/models/callback_recorder.rb +0 -25
- data/spec/app/models/paranoid_phone.rb +0 -25
- data/spec/app/models/paranoid_post.rb +0 -36
- data/spec/app/models/phone_observer.rb +0 -6
- data/spec/mongoid/attributes/processing_spec.rb +0 -149
- data/spec/mongoid/criterion/destructive_spec.rb +0 -101
- data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
- data/spec/mongoid/criterion/modification_spec.rb +0 -402
- data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
- data/spec/mongoid/finders_spec.rb +0 -321
- data/spec/mongoid/identity_map_spec.rb +0 -564
- data/spec/mongoid/json_spec.rb +0 -33
- data/spec/mongoid/matchers/in_spec.rb +0 -25
- data/spec/mongoid/matchers/ne_spec.rb +0 -25
- data/spec/mongoid/matchers/nin_spec.rb +0 -25
- data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
- data/spec/mongoid/observer_spec.rb +0 -290
- data/spec/mongoid/paranoia_spec.rb +0 -759
- data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
- data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
- data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
- data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
- data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
- data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
- data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
- data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
- data/spec/mongoid/persistence/atomic_spec.rb +0 -216
- data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
- data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
- data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
- data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
- data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
- data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
- data/spec/mongoid/persistence/operations_spec.rb +0 -313
- data/spec/mongoid/persistence_spec.rb +0 -2279
- data/spec/mongoid/unit_of_work_spec.rb +0 -196
- data/spec/mongoid/versioning_spec.rb +0 -540
- data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -1,46 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module Mongoid
|
3
|
-
module Persistence
|
4
|
-
module Operations
|
5
|
-
module Embedded
|
6
|
-
|
7
|
-
# Insert is a persistence command responsible for taking a document that
|
8
|
-
# has not been saved to the database and saving it. This specific class
|
9
|
-
# handles the case when the document is embedded in another.
|
10
|
-
#
|
11
|
-
# The underlying query resembles the following MongoDB query:
|
12
|
-
#
|
13
|
-
# collection.update(
|
14
|
-
# { "_id" : 1 },
|
15
|
-
# { "$push" : { "field" : "value" } },
|
16
|
-
# false
|
17
|
-
# );
|
18
|
-
class Insert
|
19
|
-
include Insertion
|
20
|
-
include Operations
|
21
|
-
include Mongoid::Atomic::Positionable
|
22
|
-
|
23
|
-
# Insert the new document in the database. If the document's parent is a
|
24
|
-
# new record, we will call save on the parent, otherwise we will $push
|
25
|
-
# the document onto the parent.
|
26
|
-
#
|
27
|
-
# @example Insert an embedded document.
|
28
|
-
# Insert.persist
|
29
|
-
#
|
30
|
-
# @return [ Document ] The document to be inserted.
|
31
|
-
def persist
|
32
|
-
prepare do
|
33
|
-
raise Errors::NoParent.new(document.class.name) unless parent
|
34
|
-
if parent.new_record?
|
35
|
-
parent.insert
|
36
|
-
else
|
37
|
-
selector = parent.atomic_selector
|
38
|
-
collection.find(selector).update(positionally(selector, inserts))
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module Mongoid
|
3
|
-
module Persistence
|
4
|
-
module Operations
|
5
|
-
module Embedded
|
6
|
-
|
7
|
-
# Remove is a persistence command responsible for deleting a document from
|
8
|
-
# the database.
|
9
|
-
#
|
10
|
-
# The underlying query resembles the following MongoDB query:
|
11
|
-
#
|
12
|
-
# collection.remove(
|
13
|
-
# { "_id" : 1 },
|
14
|
-
# false
|
15
|
-
# );
|
16
|
-
class Remove
|
17
|
-
include Deletion
|
18
|
-
include Operations
|
19
|
-
include Mongoid::Atomic::Positionable
|
20
|
-
|
21
|
-
# Remove the document from the database. If the parent is a new record,
|
22
|
-
# it will get removed in Ruby only. If the parent is not a new record
|
23
|
-
# then either an $unset or $set will occur, depending if it's an
|
24
|
-
# embeds_one or embeds_many.
|
25
|
-
#
|
26
|
-
# @example Remove an embedded document.
|
27
|
-
# RemoveEmbedded.persist
|
28
|
-
#
|
29
|
-
# @return [ true ] Always true.
|
30
|
-
def persist
|
31
|
-
prepare do |doc|
|
32
|
-
parent.remove_child(doc) if notifying_parent?
|
33
|
-
if parent.persisted?
|
34
|
-
selector = parent.atomic_selector
|
35
|
-
collection.find(selector).update(positionally(selector, deletes))
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module Mongoid
|
3
|
-
module Persistence
|
4
|
-
module Operations
|
5
|
-
|
6
|
-
# Insert is a persistence command responsible for taking a document that
|
7
|
-
# has not been saved to the database and saving it.
|
8
|
-
#
|
9
|
-
# The underlying query resembles the following MongoDB query:
|
10
|
-
#
|
11
|
-
# collection.insert(
|
12
|
-
# { "_id" : 1, "field" : "value" },
|
13
|
-
# false
|
14
|
-
# );
|
15
|
-
class Insert
|
16
|
-
include Insertion, Operations
|
17
|
-
|
18
|
-
# Insert the new document in the database. This delegates to the standard
|
19
|
-
# MongoDB collection's insert command.
|
20
|
-
#
|
21
|
-
# @example Insert the document.
|
22
|
-
# Insert.persist
|
23
|
-
#
|
24
|
-
# @return [ Document ] The document to be inserted.
|
25
|
-
def persist
|
26
|
-
prepare do |doc|
|
27
|
-
collection.insert(doc.as_document)
|
28
|
-
IdentityMap.set(doc)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module Mongoid
|
3
|
-
module Persistence
|
4
|
-
module Operations
|
5
|
-
|
6
|
-
# Remove is a persistence command responsible for deleting a document from
|
7
|
-
# the database.
|
8
|
-
#
|
9
|
-
# The underlying query resembles the following MongoDB query:
|
10
|
-
#
|
11
|
-
# collection.remove(
|
12
|
-
# { "_id" : 1 },
|
13
|
-
# false
|
14
|
-
# );
|
15
|
-
class Remove
|
16
|
-
include Deletion, Operations
|
17
|
-
|
18
|
-
# Remove the document from the database: delegates to the MongoDB
|
19
|
-
# collection remove method.
|
20
|
-
#
|
21
|
-
# @example Remove the document.
|
22
|
-
# Remove.persist
|
23
|
-
#
|
24
|
-
# @return [ true ] Always true.
|
25
|
-
def persist
|
26
|
-
prepare do |doc|
|
27
|
-
collection.find(doc.atomic_selector).remove
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module Mongoid
|
3
|
-
module Persistence
|
4
|
-
module Operations
|
5
|
-
|
6
|
-
# Update is a persistence command responsible for taking a document that
|
7
|
-
# has already been saved to the database and saving it, depending on
|
8
|
-
# whether or not the document has been modified.
|
9
|
-
#
|
10
|
-
# Before persisting the command will check via dirty attributes if the
|
11
|
-
# document has changed, if not, it will simply return true. If it has it
|
12
|
-
# will go through the validation steps, run callbacks, and set the changed
|
13
|
-
# fields atomically on the document. The underlying query resembles the
|
14
|
-
# following MongoDB query:
|
15
|
-
#
|
16
|
-
# collection.update(
|
17
|
-
# { "_id" : 1,
|
18
|
-
# { "$set" : { "field" : "value" },
|
19
|
-
# false,
|
20
|
-
# false
|
21
|
-
# );
|
22
|
-
#
|
23
|
-
# For embedded documents it will use the positional locator:
|
24
|
-
#
|
25
|
-
# collection.update(
|
26
|
-
# { "_id" : 1, "addresses._id" : 2 },
|
27
|
-
# { "$set" : { "addresses.$.field" : "value" },
|
28
|
-
# false,
|
29
|
-
# false
|
30
|
-
# );
|
31
|
-
#
|
32
|
-
class Update
|
33
|
-
include Modification
|
34
|
-
include Operations
|
35
|
-
include Mongoid::Atomic::Positionable
|
36
|
-
|
37
|
-
# Persist the document that is to be updated to the database. This will
|
38
|
-
# only write changed fields via MongoDB's $set modifier operation.
|
39
|
-
#
|
40
|
-
# @example Update the document.
|
41
|
-
# Update.persist
|
42
|
-
#
|
43
|
-
# @return [ true, false ] If the save passed.
|
44
|
-
def persist
|
45
|
-
prepare do
|
46
|
-
unless updates.empty?
|
47
|
-
collection.find(selector).update(positionally(selector, updates))
|
48
|
-
conflicts.each_pair do |key, value|
|
49
|
-
collection.find(selector).update(
|
50
|
-
positionally(selector, { key => value })
|
51
|
-
)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module Mongoid
|
3
|
-
module Persistence
|
4
|
-
module Operations
|
5
|
-
|
6
|
-
# Wraps behaviour for performing upserts in Mongodb. No matter if the
|
7
|
-
# document has been modified or not, it will be sent to the db and Mongo
|
8
|
-
# will determin whether or not to insert or update.
|
9
|
-
class Upsert
|
10
|
-
include Upsertion, Operations
|
11
|
-
|
12
|
-
# Persist the upsert operation.
|
13
|
-
#
|
14
|
-
# @example Execute the upsert.
|
15
|
-
# operation.persist
|
16
|
-
#
|
17
|
-
# @return [ true ] Always true.
|
18
|
-
#
|
19
|
-
# @since 3.0.0
|
20
|
-
def persist
|
21
|
-
prepare do
|
22
|
-
collection.find(selector).update(document.as_document, [ :upsert ])
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module Mongoid
|
3
|
-
module Persistence
|
4
|
-
|
5
|
-
# Contains common logic for upsert operations.
|
6
|
-
module Upsertion
|
7
|
-
|
8
|
-
# Wrap all the common upsert logic for root docments.
|
9
|
-
#
|
10
|
-
# @example Execute common upsert logic.
|
11
|
-
# prepare do |doc|
|
12
|
-
# collection.find({ :_id => 1 }).upsert({ name: "test" }, [ :upsert ])
|
13
|
-
# end
|
14
|
-
#
|
15
|
-
# @param [ Proc ] block The block to call.
|
16
|
-
#
|
17
|
-
# @return [ true, false ] If the save passed or not.
|
18
|
-
#
|
19
|
-
# @since 3.0.0
|
20
|
-
def prepare(&block)
|
21
|
-
return false if validating? && document.invalid?(:upsert)
|
22
|
-
result = document.run_callbacks(:upsert) do
|
23
|
-
yield(document); true
|
24
|
-
end
|
25
|
-
document.post_persist unless result == false
|
26
|
-
document.new_record = false
|
27
|
-
result
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
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
|