mongoid 3.1.7 → 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 +470 -9
- data/README.md +10 -7
- data/lib/config/locales/en.yml +34 -20
- 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 +3 -14
- 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 -99
- 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/memory.rb +2 -2
- data/lib/mongoid/contextual/aggregable/mongo.rb +5 -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/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 +39 -24
- 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 +15 -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} +35 -7
- 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 +1 -1
- data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
- data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
- data/lib/mongoid/matchable.rb +152 -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/persistable.rb +216 -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/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/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/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 +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/relations.rb +11 -25
- 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/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/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 +26 -172
- data/lib/mongoid/timestamps/updated/short.rb +2 -2
- data/lib/mongoid/{hierarchy.rb → traversable.rb} +15 -7
- 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/{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 +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/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/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 +334 -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 +46 -38
- data/spec/mongoid/contextual/atomic_spec.rb +59 -55
- 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 +713 -2419
- 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/{matchers → matchable}/ne_spec.rb +3 -3
- data/spec/mongoid/matchable/nin_spec.rb +48 -0
- data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
- data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
- data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
- data/spec/mongoid/persistable/creatable_spec.rb +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} +9 -9
- 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 -350
- data/spec/spec_helper.rb +26 -15
- metadata +262 -247
- 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/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/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,105 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
|
|
4
|
-
# Adds Rails' multi-parameter attribute support to Mongoid.
|
|
5
|
-
#
|
|
6
|
-
# @todo: Durran: This module needs an overhaul.
|
|
7
|
-
module MultiParameterAttributes
|
|
8
|
-
|
|
9
|
-
module Errors
|
|
10
|
-
|
|
11
|
-
# Raised when an error occurred while doing a mass assignment to an
|
|
12
|
-
# attribute through the <tt>attributes=</tt> method. The exception
|
|
13
|
-
# has an +attribute+ property that is the name of the offending attribute.
|
|
14
|
-
class AttributeAssignmentError < Mongoid::Errors::MongoidError
|
|
15
|
-
attr_reader :exception, :attribute
|
|
16
|
-
|
|
17
|
-
def initialize(message, exception, attribute)
|
|
18
|
-
@exception = exception
|
|
19
|
-
@attribute = attribute
|
|
20
|
-
@message = message
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# Raised when there are multiple errors while doing a mass assignment
|
|
25
|
-
# through the +attributes+ method. The exception has an +errors+
|
|
26
|
-
# property that contains an array of AttributeAssignmentError
|
|
27
|
-
# objects, each corresponding to the error while assigning to an
|
|
28
|
-
# attribute.
|
|
29
|
-
class MultiparameterAssignmentErrors < Mongoid::Errors::MongoidError
|
|
30
|
-
attr_reader :errors
|
|
31
|
-
|
|
32
|
-
def initialize(errors)
|
|
33
|
-
@errors = errors
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
# Process the provided attributes casting them to their proper values if a
|
|
39
|
-
# field exists for them on the document. This will be limited to only the
|
|
40
|
-
# attributes provided in the suppied +Hash+ so that no extra nil values get
|
|
41
|
-
# put into the document's attributes.
|
|
42
|
-
#
|
|
43
|
-
# @example Process the attributes.
|
|
44
|
-
# person.process_attributes(:title => "sir", :age => 40)
|
|
45
|
-
#
|
|
46
|
-
# @param [ Hash ] attrs The attributes to set.
|
|
47
|
-
# @param [ Symbol ] role A role for scoped mass assignment.
|
|
48
|
-
# @param [ Boolean ] guard_protected_attributes False to skip mass assignment protection.
|
|
49
|
-
#
|
|
50
|
-
# @since 2.0.0.rc.7
|
|
51
|
-
def process_attributes(attrs = nil, role = :default, guard_protected_attributes = true)
|
|
52
|
-
if attrs
|
|
53
|
-
errors = []
|
|
54
|
-
attributes = attrs.class.new
|
|
55
|
-
attributes.permitted = true if attrs.respond_to?(:permitted?) && attrs.permitted?
|
|
56
|
-
multi_parameter_attributes = {}
|
|
57
|
-
|
|
58
|
-
attrs.each_pair do |key, value|
|
|
59
|
-
if key =~ /\A([^\(]+)\((\d+)([if])\)$/
|
|
60
|
-
key, index = $1, $2.to_i
|
|
61
|
-
(multi_parameter_attributes[key] ||= {})[index] = value.empty? ? nil : value.send("to_#{$3}")
|
|
62
|
-
else
|
|
63
|
-
attributes[key] = value
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
multi_parameter_attributes.each_pair do |key, values|
|
|
68
|
-
begin
|
|
69
|
-
values = (values.keys.min..values.keys.max).map { |i| values[i] }
|
|
70
|
-
field = self.class.fields[database_field_name(key)]
|
|
71
|
-
attributes[key] = instantiate_object(field, values)
|
|
72
|
-
rescue => e
|
|
73
|
-
errors << Errors::AttributeAssignmentError.new(
|
|
74
|
-
"error on assignment #{values.inspect} to #{key}", e, key
|
|
75
|
-
)
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
unless errors.empty?
|
|
80
|
-
raise Errors::MultiparameterAssignmentErrors.new(errors),
|
|
81
|
-
"#{errors.size} error(s) on assignment of multiparameter attributes"
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
super attributes, role, guard_protected_attributes
|
|
85
|
-
else
|
|
86
|
-
super
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
protected
|
|
91
|
-
|
|
92
|
-
def instantiate_object(field, values_with_empty_parameters)
|
|
93
|
-
return nil if values_with_empty_parameters.all? { |v| v.nil? }
|
|
94
|
-
values = values_with_empty_parameters.collect { |v| v.nil? ? 1 : v }
|
|
95
|
-
klass = field.type
|
|
96
|
-
if klass == DateTime || klass == Date || klass == Time
|
|
97
|
-
field.mongoize(values)
|
|
98
|
-
elsif klass
|
|
99
|
-
klass.new(*values)
|
|
100
|
-
else
|
|
101
|
-
values
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
end
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
|
|
4
|
-
# Mongoid's implementation of Rails' nested attributes.
|
|
5
|
-
module NestedAttributes
|
|
6
|
-
extend ActiveSupport::Concern
|
|
7
|
-
|
|
8
|
-
included do
|
|
9
|
-
class_attribute :nested_attributes
|
|
10
|
-
self.nested_attributes = {}
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
module ClassMethods
|
|
14
|
-
|
|
15
|
-
REJECT_ALL_BLANK_PROC = ->(attributes){
|
|
16
|
-
attributes.all? { |key, value| key == '_destroy' || value.blank? }
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
# Used when needing to update related models from a parent relation. Can
|
|
20
|
-
# be used on embedded or referenced relations.
|
|
21
|
-
#
|
|
22
|
-
# @example Defining nested attributes.
|
|
23
|
-
#
|
|
24
|
-
# class Person
|
|
25
|
-
# include Mongoid::Document
|
|
26
|
-
#
|
|
27
|
-
# embeds_many :addresses
|
|
28
|
-
# embeds_one :game
|
|
29
|
-
# references_many :posts
|
|
30
|
-
#
|
|
31
|
-
# accepts_nested_attributes_for :addresses, :game, :posts
|
|
32
|
-
# end
|
|
33
|
-
#
|
|
34
|
-
# @param [ Array<Symbol>, Hash ] *args A list of relation names, followed
|
|
35
|
-
# by a hash of options.
|
|
36
|
-
#
|
|
37
|
-
# @option *args [ true, false ] :allow_destroy Can deletion occur?
|
|
38
|
-
# @option *args [ Proc, Symbol ] :reject_if Block or symbol pointing
|
|
39
|
-
# to a class method to reject documents with.
|
|
40
|
-
# @option *args [ Integer ] :limit The max number to create.
|
|
41
|
-
# @option *args [ true, false ] :update_only Only update existing docs.
|
|
42
|
-
def accepts_nested_attributes_for(*args)
|
|
43
|
-
options = args.extract_options!
|
|
44
|
-
options[:reject_if] = REJECT_ALL_BLANK_PROC if options[:reject_if] == :all_blank
|
|
45
|
-
args.each do |name|
|
|
46
|
-
meth = "#{name}_attributes="
|
|
47
|
-
self.nested_attributes["#{name}_attributes"] = meth
|
|
48
|
-
metadata = relations[name.to_s]
|
|
49
|
-
raise Errors::NestedAttributesMetadataNotFound.new(self, name) unless metadata
|
|
50
|
-
autosave_nested_attributes(metadata)
|
|
51
|
-
re_define_method(meth) do |attrs|
|
|
52
|
-
_assigning do
|
|
53
|
-
metadata.nested_builder(attrs, options).build(self, mass_assignment_options)
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
private
|
|
60
|
-
|
|
61
|
-
# Add the autosave information for the nested relation.
|
|
62
|
-
#
|
|
63
|
-
# @api private
|
|
64
|
-
#
|
|
65
|
-
# @example Add the autosave if appropriate.
|
|
66
|
-
# Person.autosave_nested_attributes(metadata)
|
|
67
|
-
#
|
|
68
|
-
# @param [ Metadata ] metadata The existing relation metadata.
|
|
69
|
-
#
|
|
70
|
-
# @since 3.1.4
|
|
71
|
-
def autosave_nested_attributes(metadata)
|
|
72
|
-
unless metadata.autosave == false
|
|
73
|
-
autosave(metadata.merge!(autosave: true))
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
end
|
data/lib/mongoid/observer.rb
DELETED
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
|
|
4
|
-
# Observer classes respond to life cycle callbacks to implement trigger-like
|
|
5
|
-
# behavior outside the original class. This is a great way to reduce the
|
|
6
|
-
# clutter that normally comes when the model class is burdened with
|
|
7
|
-
# functionality that doesn't pertain to the core responsibility of the
|
|
8
|
-
# class. Mongoid's observers work similar to ActiveRecord's. Example:
|
|
9
|
-
#
|
|
10
|
-
# class CommentObserver < Mongoid::Observer
|
|
11
|
-
# def after_save(comment)
|
|
12
|
-
# Notifications.comment(
|
|
13
|
-
# "admin@do.com", "New comment was posted", comment
|
|
14
|
-
# ).deliver
|
|
15
|
-
# end
|
|
16
|
-
# end
|
|
17
|
-
#
|
|
18
|
-
# This Observer sends an email when a Comment#save is finished.
|
|
19
|
-
#
|
|
20
|
-
# class ContactObserver < Mongoid::Observer
|
|
21
|
-
# def after_create(contact)
|
|
22
|
-
# contact.logger.info('New contact added!')
|
|
23
|
-
# end
|
|
24
|
-
#
|
|
25
|
-
# def after_destroy(contact)
|
|
26
|
-
# contact.logger.warn("Contact with an id of #{contact.id} was destroyed!")
|
|
27
|
-
# end
|
|
28
|
-
# end
|
|
29
|
-
#
|
|
30
|
-
# This Observer uses logger to log when specific callbacks are triggered.
|
|
31
|
-
#
|
|
32
|
-
# == Observing a class that can't be inferred
|
|
33
|
-
#
|
|
34
|
-
# Observers will by default be mapped to the class with which they share a
|
|
35
|
-
# name. So CommentObserver will be tied to observing Comment,
|
|
36
|
-
# ProductManagerObserver to ProductManager, and so on. If you want to
|
|
37
|
-
# name your observer differently than the class you're interested in
|
|
38
|
-
# observing, you can use the Observer.observe class method which takes
|
|
39
|
-
# either the concrete class (Product) or a symbol for that class (:product):
|
|
40
|
-
#
|
|
41
|
-
# class AuditObserver < Mongoid::Observer
|
|
42
|
-
# observe :account
|
|
43
|
-
#
|
|
44
|
-
# def after_update(account)
|
|
45
|
-
# AuditTrail.new(account, "UPDATED")
|
|
46
|
-
# end
|
|
47
|
-
# end
|
|
48
|
-
#
|
|
49
|
-
# If the audit observer needs to watch more than one kind of object,
|
|
50
|
-
# this can be specified with multiple arguments:
|
|
51
|
-
#
|
|
52
|
-
# class AuditObserver < Mongoid::Observer
|
|
53
|
-
# observe :account, :balance
|
|
54
|
-
#
|
|
55
|
-
# def after_update(record)
|
|
56
|
-
# AuditTrail.new(record, "UPDATED")
|
|
57
|
-
# end
|
|
58
|
-
# end
|
|
59
|
-
#
|
|
60
|
-
# The AuditObserver will now act on both updates to Account and Balance
|
|
61
|
-
# by treating them both as records.
|
|
62
|
-
#
|
|
63
|
-
# == Available callback methods
|
|
64
|
-
#
|
|
65
|
-
# * after_initialize
|
|
66
|
-
# * before_validation
|
|
67
|
-
# * after_validation
|
|
68
|
-
# * before_create
|
|
69
|
-
# * around_create
|
|
70
|
-
# * after_create
|
|
71
|
-
# * before_update
|
|
72
|
-
# * around_update
|
|
73
|
-
# * after_update
|
|
74
|
-
# * before_upsert
|
|
75
|
-
# * around_upsert
|
|
76
|
-
# * after_upsert
|
|
77
|
-
# * before_save
|
|
78
|
-
# * around_save
|
|
79
|
-
# * after_save
|
|
80
|
-
# * before_destroy
|
|
81
|
-
# * around_destroy
|
|
82
|
-
# * after_destroy
|
|
83
|
-
#
|
|
84
|
-
# == Storing Observers in Rails
|
|
85
|
-
#
|
|
86
|
-
# If you're using Mongoid within Rails, observer classes are usually stored
|
|
87
|
-
# in +app/models+ with the naming convention of +app/models/audit_observer.rb+.
|
|
88
|
-
#
|
|
89
|
-
# == Configuration
|
|
90
|
-
#
|
|
91
|
-
# In order to activate an observer, list it in the +config.mongoid.observers+
|
|
92
|
-
# configuration setting in your +config/application.rb+ file.
|
|
93
|
-
#
|
|
94
|
-
# config.mongoid.observers = :comment_observer, :signup_observer
|
|
95
|
-
#
|
|
96
|
-
# Observers will not be invoked unless you define them in your
|
|
97
|
-
# application configuration.
|
|
98
|
-
#
|
|
99
|
-
# == Loading
|
|
100
|
-
#
|
|
101
|
-
# Observers register themselves with the model class that they observe,
|
|
102
|
-
# since it is the class that notifies them of events when they occur.
|
|
103
|
-
# As a side-effect, when an observer is loaded, its corresponding model
|
|
104
|
-
# class is loaded.
|
|
105
|
-
#
|
|
106
|
-
# Observers are loaded after the application initializers, so that
|
|
107
|
-
# observed models can make use of extensions. If by any chance you are
|
|
108
|
-
# using observed models in the initialization, you can
|
|
109
|
-
# still load their observers by calling +ModelObserver.instance+ before.
|
|
110
|
-
# Observers are singletons and that call instantiates and registers them.
|
|
111
|
-
class Observer < ActiveModel::Observer
|
|
112
|
-
|
|
113
|
-
private
|
|
114
|
-
|
|
115
|
-
# Adds the specified observer to the class.
|
|
116
|
-
#
|
|
117
|
-
# @example Add the observer.
|
|
118
|
-
# observer.add_observer!(Document)
|
|
119
|
-
#
|
|
120
|
-
# @param [ Class ] klass The child observer to add.
|
|
121
|
-
#
|
|
122
|
-
# @since 2.0.0.rc.8
|
|
123
|
-
def add_observer!(klass)
|
|
124
|
-
super and define_callbacks(klass)
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
# Defines all the callbacks for each observer of the model.
|
|
128
|
-
#
|
|
129
|
-
# @example Define all the callbacks.
|
|
130
|
-
# observer.define_callbacks(Document)
|
|
131
|
-
#
|
|
132
|
-
# @param [ Class ] klass The model to define them on.
|
|
133
|
-
#
|
|
134
|
-
# @since 2.0.0.rc.8
|
|
135
|
-
def define_callbacks(klass)
|
|
136
|
-
observer = self
|
|
137
|
-
observer_name = observer.class.name.underscore.gsub('/', '__')
|
|
138
|
-
Mongoid::Callbacks.observables.each do |callback|
|
|
139
|
-
next unless respond_to?(callback)
|
|
140
|
-
callback_meth = :"_notify_#{observer_name}_for_#{callback}"
|
|
141
|
-
unless klass.respond_to?(callback_meth)
|
|
142
|
-
klass.send(:define_method, callback_meth) do |&block|
|
|
143
|
-
if value = observer.update(callback, self, &block)
|
|
144
|
-
value
|
|
145
|
-
else
|
|
146
|
-
block.call if block
|
|
147
|
-
end
|
|
148
|
-
end
|
|
149
|
-
klass.send(callback, callback_meth)
|
|
150
|
-
end
|
|
151
|
-
end
|
|
152
|
-
self
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
# Are the observers disabled for the object?
|
|
156
|
-
#
|
|
157
|
-
# @api private
|
|
158
|
-
#
|
|
159
|
-
# @example If the observer disabled?
|
|
160
|
-
# Observer.disabled_for(band)
|
|
161
|
-
#
|
|
162
|
-
# @param [ Document ] object The model instance.
|
|
163
|
-
#
|
|
164
|
-
# @return [ true, false ] If the observer is disabled.
|
|
165
|
-
def disabled_for?(object)
|
|
166
|
-
klass = object.class
|
|
167
|
-
return false unless klass.respond_to?(:observers)
|
|
168
|
-
klass.observers.disabled_for?(self) || Mongoid.observers.disabled_for?(self)
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
class << self
|
|
172
|
-
|
|
173
|
-
# Attaches the observer to the specified classes.
|
|
174
|
-
#
|
|
175
|
-
# @example Attach the BandObserver to the class Artist.
|
|
176
|
-
# class BandObserver < Mongoid::Observer
|
|
177
|
-
# observe :artist
|
|
178
|
-
# end
|
|
179
|
-
#
|
|
180
|
-
# @param [ Array<Symbol> ] models The names of the models.
|
|
181
|
-
#
|
|
182
|
-
# @since 3.0.15
|
|
183
|
-
def observe(*models)
|
|
184
|
-
models.flatten!
|
|
185
|
-
models.collect! do |model|
|
|
186
|
-
model.respond_to?(:to_sym) ? model.to_s.camelize.constantize : model
|
|
187
|
-
end
|
|
188
|
-
singleton_class.redefine_method(:observed_classes) { models }
|
|
189
|
-
end
|
|
190
|
-
end
|
|
191
|
-
end
|
|
192
|
-
end
|
data/lib/mongoid/paranoia.rb
DELETED
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
|
|
4
|
-
# Include this module to get soft deletion of root level documents.
|
|
5
|
-
# This will add a deleted_at field to the +Document+, managed automatically.
|
|
6
|
-
# Potentially incompatible with unique indices. (if collisions with deleted items)
|
|
7
|
-
#
|
|
8
|
-
# @example Make a document paranoid.
|
|
9
|
-
# class Person
|
|
10
|
-
# include Mongoid::Document
|
|
11
|
-
# include Mongoid::Paranoia
|
|
12
|
-
# end
|
|
13
|
-
module Paranoia
|
|
14
|
-
extend ActiveSupport::Concern
|
|
15
|
-
|
|
16
|
-
included do
|
|
17
|
-
field :deleted_at, type: Time
|
|
18
|
-
self.paranoid = true
|
|
19
|
-
|
|
20
|
-
default_scope where(deleted_at: nil)
|
|
21
|
-
scope :deleted, ne(deleted_at: nil)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# Delete the paranoid +Document+ from the database completely. This will
|
|
25
|
-
# run the destroy callbacks.
|
|
26
|
-
#
|
|
27
|
-
# @example Hard destroy the document.
|
|
28
|
-
# document.destroy!
|
|
29
|
-
#
|
|
30
|
-
# @return [ true, false ] If the operation succeeded.
|
|
31
|
-
#
|
|
32
|
-
# @since 1.0.0
|
|
33
|
-
def destroy!
|
|
34
|
-
run_callbacks(:destroy) { delete! }
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
# Delete the paranoid +Document+ from the database completely.
|
|
38
|
-
#
|
|
39
|
-
# @example Hard delete the document.
|
|
40
|
-
# document.delete!
|
|
41
|
-
#
|
|
42
|
-
# @return [ true, false ] If the operation succeeded.
|
|
43
|
-
#
|
|
44
|
-
# @since 1.0.0
|
|
45
|
-
def delete!
|
|
46
|
-
Persistence::Operations.remove(self).persist
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
# Delete the +Document+, will set the deleted_at timestamp and not actually
|
|
50
|
-
# delete it.
|
|
51
|
-
#
|
|
52
|
-
# @example Soft remove the document.
|
|
53
|
-
# document.remove
|
|
54
|
-
#
|
|
55
|
-
# @param [ Hash ] options The database options.
|
|
56
|
-
#
|
|
57
|
-
# @return [ true ] True.
|
|
58
|
-
#
|
|
59
|
-
# @since 1.0.0
|
|
60
|
-
def remove(options = {})
|
|
61
|
-
cascade!
|
|
62
|
-
time = self.deleted_at = Time.now
|
|
63
|
-
paranoid_collection.find(atomic_selector).
|
|
64
|
-
update({ "$set" => { paranoid_field => time }})
|
|
65
|
-
@destroyed = true
|
|
66
|
-
IdentityMap.remove(self)
|
|
67
|
-
true
|
|
68
|
-
end
|
|
69
|
-
alias :delete :remove
|
|
70
|
-
|
|
71
|
-
# Determines if this document is destroyed.
|
|
72
|
-
#
|
|
73
|
-
# @example Is the document destroyed?
|
|
74
|
-
# person.destroyed?
|
|
75
|
-
#
|
|
76
|
-
# @return [ true, false ] If the document is destroyed.
|
|
77
|
-
#
|
|
78
|
-
# @since 1.0.0
|
|
79
|
-
def destroyed?
|
|
80
|
-
(@destroyed ||= false) || !!deleted_at
|
|
81
|
-
end
|
|
82
|
-
alias :deleted? :destroyed?
|
|
83
|
-
|
|
84
|
-
def persisted?
|
|
85
|
-
!new_record? && !(@destroyed ||= false)
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
# Restores a previously soft-deleted document. Handles this by removing the
|
|
89
|
-
# deleted_at flag.
|
|
90
|
-
#
|
|
91
|
-
# @example Restore the document from deleted state.
|
|
92
|
-
# document.restore
|
|
93
|
-
#
|
|
94
|
-
# @return [ Time ] The time the document had been deleted.
|
|
95
|
-
#
|
|
96
|
-
# @since 1.0.0
|
|
97
|
-
def restore
|
|
98
|
-
paranoid_collection.find(atomic_selector).
|
|
99
|
-
update({ "$unset" => { paranoid_field => true }})
|
|
100
|
-
attributes.delete("deleted_at")
|
|
101
|
-
@destroyed = false
|
|
102
|
-
true
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
# Returns a string representing the documents's key suitable for use in URLs.
|
|
106
|
-
def to_param
|
|
107
|
-
new_record? ? nil : to_key.join('-')
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
private
|
|
111
|
-
|
|
112
|
-
# Get the collection to be used for paranoid operations.
|
|
113
|
-
#
|
|
114
|
-
# @example Get the paranoid collection.
|
|
115
|
-
# document.paranoid_collection
|
|
116
|
-
#
|
|
117
|
-
# @return [ Collection ] The root collection.
|
|
118
|
-
#
|
|
119
|
-
# @since 2.3.1
|
|
120
|
-
def paranoid_collection
|
|
121
|
-
embedded? ? _root.collection : self.collection
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
# Get the field to be used for paranoid operations.
|
|
125
|
-
#
|
|
126
|
-
# @example Get the paranoid field.
|
|
127
|
-
# document.paranoid_field
|
|
128
|
-
#
|
|
129
|
-
# @return [ String ] The deleted at field.
|
|
130
|
-
#
|
|
131
|
-
# @since 2.3.1
|
|
132
|
-
def paranoid_field
|
|
133
|
-
embedded? ? "#{atomic_position}.deleted_at" : "deleted_at"
|
|
134
|
-
end
|
|
135
|
-
end
|
|
136
|
-
end
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Persistence
|
|
4
|
-
module Atomic
|
|
5
|
-
|
|
6
|
-
# This class provides the ability to perform an explicit $addToSet
|
|
7
|
-
# modification on a specific field.
|
|
8
|
-
class AddToSet
|
|
9
|
-
include Operation
|
|
10
|
-
|
|
11
|
-
# Sends the atomic $addToSet operation to the database.
|
|
12
|
-
#
|
|
13
|
-
# @example Persist the new values.
|
|
14
|
-
# addToSet.persist
|
|
15
|
-
#
|
|
16
|
-
# @return [ Object ] The new array value.
|
|
17
|
-
#
|
|
18
|
-
# @since 2.0.0
|
|
19
|
-
def persist
|
|
20
|
-
prepare do
|
|
21
|
-
document[field] = [] unless document[field]
|
|
22
|
-
values = document.send(field)
|
|
23
|
-
Array.wrap(value).each do |val|
|
|
24
|
-
values.push(val) unless values.include?(val)
|
|
25
|
-
end
|
|
26
|
-
execute("$addToSet")
|
|
27
|
-
values
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# Get the atomic operation to perform.
|
|
32
|
-
#
|
|
33
|
-
# @example Get the operation.
|
|
34
|
-
# add_to_set.operation("$addToSet")
|
|
35
|
-
#
|
|
36
|
-
# @param [ String ] modifier The modifier to use.
|
|
37
|
-
#
|
|
38
|
-
# @return [ Hash ] The atomic operation for the field and addition.
|
|
39
|
-
#
|
|
40
|
-
# @since 2.0.0
|
|
41
|
-
def operation(modifier)
|
|
42
|
-
{ modifier => { path => value.is_a?(Array) ? { "$each" => value } : value}}
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
end
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Persistence
|
|
4
|
-
module Atomic
|
|
5
|
-
|
|
6
|
-
# This operation is for performing $bit atomic operations against the
|
|
7
|
-
# database.
|
|
8
|
-
class Bit
|
|
9
|
-
include Operation
|
|
10
|
-
|
|
11
|
-
# Execute the bitwise operation. This correlates to a $bit in MongoDB.
|
|
12
|
-
#
|
|
13
|
-
# @example Execute the op.
|
|
14
|
-
# bit.persist
|
|
15
|
-
#
|
|
16
|
-
# @return [ Integer ] The new value.
|
|
17
|
-
#
|
|
18
|
-
# @since 2.1.0
|
|
19
|
-
def persist
|
|
20
|
-
prepare do
|
|
21
|
-
current = document[field]
|
|
22
|
-
return nil unless current
|
|
23
|
-
document[field] = value.inject(current) do |result, (bit, val)|
|
|
24
|
-
result = result & val if bit.to_s == "and"
|
|
25
|
-
result = result | val if bit.to_s == "or"
|
|
26
|
-
result
|
|
27
|
-
end
|
|
28
|
-
execute("$bit")
|
|
29
|
-
document[field]
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Persistence
|
|
4
|
-
module Atomic
|
|
5
|
-
|
|
6
|
-
# This class provides atomic $inc behaviour.
|
|
7
|
-
class Inc
|
|
8
|
-
include Operation
|
|
9
|
-
|
|
10
|
-
# Sends the atomic $inc operation to the database.
|
|
11
|
-
#
|
|
12
|
-
# @example Persist the new values.
|
|
13
|
-
# inc.persist
|
|
14
|
-
#
|
|
15
|
-
# @return [ Object ] The new numeric value.
|
|
16
|
-
#
|
|
17
|
-
# @since 2.0.0
|
|
18
|
-
def persist
|
|
19
|
-
prepare do
|
|
20
|
-
current = document[field] || 0
|
|
21
|
-
document[field] = current + value
|
|
22
|
-
execute("$inc")
|
|
23
|
-
document[field]
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
private
|
|
28
|
-
|
|
29
|
-
# In case we need to cast going to the database.
|
|
30
|
-
#
|
|
31
|
-
# @api private
|
|
32
|
-
#
|
|
33
|
-
# @example Cast the value.
|
|
34
|
-
# operation.cast_value
|
|
35
|
-
#
|
|
36
|
-
# @return [ Integer, Float ] The value casted.
|
|
37
|
-
#
|
|
38
|
-
# @since 3.0.3
|
|
39
|
-
def cast_value
|
|
40
|
-
value.__to_inc__
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|