mongoid 3.1.6 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +432 -8
- data/README.md +5 -6
- data/lib/config/locales/en.yml +32 -18
- data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
- data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
- data/lib/mongoid/atomic/paths/embedded.rb +0 -30
- data/lib/mongoid/atomic/paths/root.rb +0 -13
- data/lib/mongoid/atomic.rb +1 -12
- data/lib/mongoid/attributes/dynamic.rb +154 -0
- data/lib/mongoid/attributes/nested.rb +82 -0
- data/lib/mongoid/attributes/processing.rb +13 -66
- data/lib/mongoid/attributes.rb +63 -101
- data/lib/mongoid/{dirty.rb → changeable.rb} +32 -2
- data/lib/mongoid/composable.rb +105 -0
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/config.rb +3 -9
- data/lib/mongoid/contextual/aggregable/mongo.rb +7 -9
- data/lib/mongoid/contextual/atomic.rb +53 -53
- data/lib/mongoid/contextual/geo_near.rb +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +4 -2
- data/lib/mongoid/contextual/memory.rb +18 -6
- data/lib/mongoid/contextual/mongo.rb +64 -56
- data/lib/mongoid/contextual/none.rb +90 -0
- data/lib/mongoid/contextual/text_search.rb +178 -0
- data/lib/mongoid/contextual.rb +2 -0
- data/lib/mongoid/copyable.rb +2 -3
- data/lib/mongoid/{criterion → criteria}/findable.rb +7 -47
- data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
- data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
- data/lib/mongoid/{criterion → criteria}/modifiable.rb +28 -8
- data/lib/mongoid/criteria/permission.rb +70 -0
- data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
- data/lib/mongoid/criteria.rb +39 -34
- data/lib/mongoid/document.rb +32 -17
- data/lib/mongoid/errors/document_not_destroyed.rb +25 -0
- data/lib/mongoid/errors/document_not_found.rb +2 -1
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_parent.rb +26 -0
- data/lib/mongoid/errors/invalid_value.rb +16 -0
- data/lib/mongoid/errors/mongoid_error.rb +1 -1
- data/lib/mongoid/errors/readonly_document.rb +24 -0
- data/lib/mongoid/errors.rb +4 -1
- data/lib/mongoid/extensions/array.rb +3 -3
- data/lib/mongoid/extensions/big_decimal.rb +1 -1
- data/lib/mongoid/extensions/boolean.rb +15 -17
- data/lib/mongoid/extensions/date.rb +1 -1
- data/lib/mongoid/extensions/date_time.rb +3 -3
- data/lib/mongoid/extensions/float.rb +2 -1
- data/lib/mongoid/extensions/hash.rb +3 -3
- data/lib/mongoid/extensions/integer.rb +1 -1
- data/lib/mongoid/extensions/object.rb +7 -7
- data/lib/mongoid/extensions/object_id.rb +5 -5
- data/lib/mongoid/extensions/range.rb +9 -3
- data/lib/mongoid/extensions/regexp.rb +1 -1
- data/lib/mongoid/extensions/set.rb +1 -1
- data/lib/mongoid/extensions/string.rb +6 -18
- data/lib/mongoid/extensions/symbol.rb +1 -1
- data/lib/mongoid/extensions/time.rb +3 -3
- data/lib/mongoid/extensions/time_with_zone.rb +1 -1
- data/lib/mongoid/extensions.rb +2 -7
- data/lib/mongoid/factory.rb +8 -6
- data/lib/mongoid/fields/foreign_key.rb +3 -3
- data/lib/mongoid/fields/localized.rb +1 -1
- data/lib/mongoid/fields/standard.rb +5 -17
- data/lib/mongoid/fields/validators/macro.rb +15 -5
- data/lib/mongoid/fields.rb +41 -8
- data/lib/mongoid/{finders.rb → findable.rb} +8 -2
- data/lib/mongoid/indexable/specification.rb +104 -0
- data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
- data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
- data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
- data/lib/mongoid/{callbacks.rb → interceptable.rb} +30 -62
- data/lib/mongoid/log_subscriber.rb +55 -0
- data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/ne.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
- data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
- data/lib/mongoid/matchable.rb +152 -0
- data/lib/mongoid/persistable/creatable.rb +188 -0
- data/lib/mongoid/persistable/deletable.rb +149 -0
- data/lib/mongoid/persistable/destroyable.rb +60 -0
- data/lib/mongoid/persistable/incrementable.rb +36 -0
- data/lib/mongoid/persistable/logical.rb +38 -0
- data/lib/mongoid/persistable/poppable.rb +39 -0
- data/lib/mongoid/persistable/pullable.rb +55 -0
- data/lib/mongoid/persistable/pushable.rb +62 -0
- data/lib/mongoid/persistable/renamable.rb +35 -0
- data/lib/mongoid/persistable/savable.rb +52 -0
- data/lib/mongoid/persistable/settable.rb +33 -0
- data/lib/mongoid/persistable/unsettable.rb +36 -0
- data/lib/mongoid/persistable/updatable.rb +152 -0
- data/lib/mongoid/persistable/upsertable.rb +55 -0
- data/lib/mongoid/persistable.rb +216 -0
- data/lib/mongoid/positional.rb +71 -0
- data/lib/mongoid/query_cache.rb +247 -0
- data/lib/mongoid/railtie.rb +32 -45
- data/lib/mongoid/railties/database.rake +9 -25
- data/lib/mongoid/relations/accessors.rb +13 -49
- data/lib/mongoid/relations/auto_save.rb +15 -36
- data/lib/mongoid/relations/binding.rb +1 -24
- data/lib/mongoid/relations/bindings/embedded/in.rb +1 -1
- data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
- data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +3 -1
- data/lib/mongoid/relations/builder.rb +1 -1
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -5
- data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
- data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
- data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
- data/lib/mongoid/relations/builders.rb +2 -2
- data/lib/mongoid/relations/cascading.rb +3 -5
- data/lib/mongoid/relations/constraint.rb +1 -1
- data/lib/mongoid/relations/conversions.rb +1 -1
- data/lib/mongoid/relations/counter_cache.rb +39 -15
- data/lib/mongoid/relations/eager/base.rb +149 -0
- data/lib/mongoid/relations/eager/belongs_to.rb +31 -0
- data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +47 -0
- data/lib/mongoid/relations/eager/has_many.rb +38 -0
- data/lib/mongoid/relations/eager/has_one.rb +30 -0
- data/lib/mongoid/relations/eager.rb +46 -0
- data/lib/mongoid/relations/embedded/batchable.rb +4 -5
- data/lib/mongoid/relations/embedded/in.rb +4 -4
- data/lib/mongoid/relations/embedded/many.rb +14 -32
- data/lib/mongoid/relations/embedded/one.rb +1 -1
- data/lib/mongoid/relations/macros.rb +3 -4
- data/lib/mongoid/relations/many.rb +30 -31
- data/lib/mongoid/relations/marshalable.rb +3 -3
- data/lib/mongoid/relations/metadata.rb +14 -79
- data/lib/mongoid/relations/nested_builder.rb +2 -2
- data/lib/mongoid/relations/options.rb +1 -0
- data/lib/mongoid/relations/polymorphic.rb +0 -1
- data/lib/mongoid/relations/proxy.rb +21 -41
- data/lib/mongoid/relations/referenced/in.rb +4 -20
- data/lib/mongoid/relations/referenced/many.rb +19 -32
- data/lib/mongoid/relations/referenced/many_to_many.rb +15 -38
- data/lib/mongoid/relations/referenced/one.rb +6 -25
- data/lib/mongoid/relations/synchronization.rb +3 -3
- data/lib/mongoid/relations/touchable.rb +34 -1
- data/lib/mongoid/relations.rb +11 -25
- data/lib/mongoid/{reloading.rb → reloadable.rb} +6 -4
- data/lib/mongoid/{scoping.rb → scopable.rb} +36 -36
- data/lib/mongoid/selectable.rb +59 -0
- data/lib/mongoid/{serialization.rb → serializable.rb} +11 -2
- data/lib/mongoid/sessions/factory.rb +2 -0
- data/lib/mongoid/sessions/options.rb +180 -0
- data/lib/mongoid/sessions/storage_options.rb +140 -0
- data/lib/mongoid/sessions/thread_options.rb +19 -0
- data/lib/mongoid/sessions/validators/storage.rb +16 -3
- data/lib/mongoid/sessions.rb +37 -345
- data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
- data/lib/mongoid/{state.rb → stateful.rb} +13 -1
- data/lib/mongoid/support/query_counter.rb +23 -0
- data/lib/mongoid/tasks/database.rake +31 -0
- data/lib/mongoid/tasks/database.rb +107 -0
- data/lib/mongoid/threaded/lifecycle.rb +0 -28
- data/lib/mongoid/threaded.rb +0 -157
- data/lib/mongoid/timestamps/updated/short.rb +2 -2
- data/lib/mongoid/{hierarchy.rb → traversable.rb} +9 -5
- data/lib/mongoid/{validations → validatable}/associated.rb +4 -2
- data/lib/mongoid/{validations → validatable}/format.rb +1 -1
- data/lib/mongoid/{validations → validatable}/length.rb +1 -1
- data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
- data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
- data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
- data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
- data/lib/mongoid/{validations → validatable}/uniqueness.rb +23 -19
- data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid.rb +10 -76
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +13 -24
- data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
- data/lib/rails/generators/mongoid_generator.rb +3 -40
- data/lib/rails/mongoid.rb +0 -122
- data/lib/support/ruby_version.rb +1 -1
- data/spec/app/models/account.rb +2 -6
- data/spec/app/models/acolyte.rb +2 -1
- data/spec/app/models/actor.rb +0 -1
- data/spec/app/models/address.rb +8 -3
- data/spec/app/models/animal.rb +1 -1
- data/spec/app/models/appointment.rb +3 -3
- data/spec/app/models/article.rb +1 -4
- data/spec/app/models/audio.rb +5 -0
- data/spec/app/models/author.rb +0 -2
- data/spec/app/models/band.rb +3 -2
- data/spec/app/models/bar.rb +1 -0
- data/spec/app/models/book.rb +1 -0
- data/spec/app/models/building.rb +0 -2
- data/spec/app/models/building_address.rb +0 -2
- data/spec/app/models/bus.rb +1 -1
- data/spec/app/models/canvas.rb +1 -1
- data/spec/app/models/contractor.rb +0 -2
- data/spec/app/models/country_code.rb +1 -1
- data/spec/app/models/definition.rb +2 -2
- data/spec/app/models/dog.rb +1 -1
- data/spec/app/models/draft.rb +9 -0
- data/spec/app/models/dragon.rb +4 -0
- data/spec/app/models/drug.rb +1 -3
- data/spec/app/models/dungeon.rb +4 -0
- data/spec/app/models/edit.rb +5 -0
- data/spec/app/models/even.rb +7 -0
- data/spec/app/models/event.rb +1 -1
- data/spec/app/models/filesystem.rb +1 -0
- data/spec/app/models/fish.rb +0 -1
- data/spec/app/models/fruits.rb +6 -0
- data/spec/app/models/game.rb +0 -2
- data/spec/app/models/house.rb +1 -3
- data/spec/app/models/item.rb +1 -5
- data/spec/app/models/jar.rb +1 -1
- data/spec/app/models/label.rb +4 -4
- data/spec/app/models/line_item.rb +1 -1
- data/spec/app/models/login.rb +1 -1
- data/spec/app/models/message.rb +8 -0
- data/spec/app/models/movie.rb +1 -0
- data/spec/app/models/name.rb +3 -3
- data/spec/app/models/note.rb +3 -1
- data/spec/app/models/odd.rb +7 -0
- data/spec/app/models/oscar.rb +1 -1
- data/spec/app/models/parent_doc.rb +1 -1
- data/spec/app/models/person.rb +16 -10
- data/spec/app/models/phone.rb +1 -3
- data/spec/app/models/player.rb +3 -3
- data/spec/app/models/post.rb +5 -3
- data/spec/app/models/preference.rb +1 -1
- data/spec/app/models/quiz.rb +0 -3
- data/spec/app/models/record.rb +10 -5
- data/spec/app/models/registry.rb +1 -1
- data/spec/app/models/server.rb +1 -1
- data/spec/app/models/service.rb +3 -3
- data/spec/app/models/sound.rb +5 -0
- data/spec/app/models/symptom.rb +1 -1
- data/spec/app/models/template.rb +1 -1
- data/spec/app/models/title.rb +0 -1
- data/spec/app/models/track.rb +5 -5
- data/spec/app/models/tree.rb +3 -3
- data/spec/app/models/video.rb +1 -5
- data/spec/app/models/wiki_page.rb +2 -5
- data/spec/app/models/word.rb +3 -0
- data/spec/app/models/word_origin.rb +1 -1
- data/spec/config/mongoid.yml +7 -8
- data/spec/helpers.rb +18 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
- data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
- data/spec/mongoid/atomic/paths_spec.rb +19 -19
- data/spec/mongoid/atomic_spec.rb +19 -19
- data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +335 -448
- data/spec/mongoid/attributes/readonly_spec.rb +58 -18
- data/spec/mongoid/attributes_spec.rb +315 -436
- data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +203 -153
- data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
- data/spec/mongoid/config/environment_spec.rb +3 -3
- data/spec/mongoid/config/options_spec.rb +6 -6
- data/spec/mongoid/config_spec.rb +24 -48
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +78 -38
- data/spec/mongoid/contextual/atomic_spec.rb +68 -58
- data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
- data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
- data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
- data/spec/mongoid/contextual/memory_spec.rb +151 -94
- data/spec/mongoid/contextual/mongo_spec.rb +238 -150
- data/spec/mongoid/contextual/none_spec.rb +127 -0
- data/spec/mongoid/contextual/text_search_spec.rb +209 -0
- data/spec/mongoid/copyable_spec.rb +56 -68
- data/spec/mongoid/criteria/findable_spec.rb +991 -0
- data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
- data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
- data/spec/mongoid/criteria/modifiable_spec.rb +1255 -0
- data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
- data/spec/mongoid/criteria_spec.rb +578 -2295
- data/spec/mongoid/document_spec.rb +166 -120
- data/spec/mongoid/equality_spec.rb +22 -22
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
- data/spec/mongoid/errors/callback_spec.rb +3 -3
- data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +33 -0
- data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
- data/spec/mongoid/errors/eager_load_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_scope_spec.rb +5 -5
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
- data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
- data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
- data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
- data/spec/mongoid/errors/mongoid_error_spec.rb +8 -8
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
- data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
- data/spec/mongoid/errors/no_parent_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
- data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
- data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
- data/spec/mongoid/errors/readonly_document_spec.rb +29 -0
- data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
- data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
- data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
- data/spec/mongoid/errors/validations_spec.rb +7 -7
- data/spec/mongoid/extensions/array_spec.rb +61 -61
- data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
- data/spec/mongoid/extensions/binary_spec.rb +12 -12
- data/spec/mongoid/extensions/boolean_spec.rb +18 -18
- data/spec/mongoid/extensions/date_spec.rb +13 -13
- data/spec/mongoid/extensions/date_time_spec.rb +8 -8
- data/spec/mongoid/extensions/false_class_spec.rb +5 -5
- data/spec/mongoid/extensions/float_spec.rb +29 -15
- data/spec/mongoid/extensions/hash_spec.rb +29 -29
- data/spec/mongoid/extensions/integer_spec.rb +15 -15
- data/spec/mongoid/extensions/module_spec.rb +2 -2
- data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
- data/spec/mongoid/extensions/object_id_spec.rb +134 -134
- data/spec/mongoid/extensions/object_spec.rb +26 -26
- data/spec/mongoid/extensions/range_spec.rb +61 -12
- data/spec/mongoid/extensions/regexp_spec.rb +4 -4
- data/spec/mongoid/extensions/set_spec.rb +4 -4
- data/spec/mongoid/extensions/string_spec.rb +35 -46
- data/spec/mongoid/extensions/symbol_spec.rb +9 -9
- data/spec/mongoid/extensions/time_spec.rb +49 -49
- data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
- data/spec/mongoid/extensions/true_class_spec.rb +5 -5
- data/spec/mongoid/extensions_spec.rb +15 -0
- data/spec/mongoid/factory_spec.rb +15 -15
- data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
- data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
- data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
- data/spec/mongoid/fields/localized_spec.rb +38 -23
- data/spec/mongoid/fields/standard_spec.rb +12 -12
- data/spec/mongoid/fields_spec.rb +263 -217
- data/spec/mongoid/{finders_spec.rb → findable_spec.rb} +127 -27
- data/spec/mongoid/indexable/specification_spec.rb +102 -0
- data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
- data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
- data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +117 -116
- data/spec/mongoid/log_subscriber_spec.rb +75 -0
- data/spec/mongoid/loggable_spec.rb +1 -1
- data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
- data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
- data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
- data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
- data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
- data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
- data/spec/mongoid/matchable/in_spec.rb +49 -0
- data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
- data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
- data/spec/mongoid/matchable/ne_spec.rb +46 -0
- data/spec/mongoid/matchable/nin_spec.rb +48 -0
- data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
- data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
- data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
- data/spec/mongoid/persistable/creatable_spec.rb +512 -0
- data/spec/mongoid/persistable/deletable_spec.rb +218 -0
- data/spec/mongoid/persistable/destroyable_spec.rb +192 -0
- data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
- data/spec/mongoid/persistable/logical_spec.rb +143 -0
- data/spec/mongoid/persistable/poppable_spec.rb +115 -0
- data/spec/mongoid/persistable/pullable_spec.rb +228 -0
- data/spec/mongoid/persistable/pushable_spec.rb +258 -0
- data/spec/mongoid/persistable/renamable_spec.rb +135 -0
- data/spec/mongoid/persistable/savable_spec.rb +461 -0
- data/spec/mongoid/persistable/settable_spec.rb +139 -0
- data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
- data/spec/mongoid/persistable/updatable_spec.rb +558 -0
- data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
- data/spec/mongoid/persistable_spec.rb +206 -0
- data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +9 -9
- data/spec/mongoid/query_cache_spec.rb +231 -0
- data/spec/mongoid/railties/document_spec.rb +2 -2
- data/spec/mongoid/relations/accessors_spec.rb +53 -145
- data/spec/mongoid/relations/auto_save_spec.rb +37 -17
- data/spec/mongoid/relations/bindings/embedded/in_spec.rb +12 -12
- data/spec/mongoid/relations/bindings/embedded/many_spec.rb +3 -3
- data/spec/mongoid/relations/bindings/embedded/one_spec.rb +5 -5
- data/spec/mongoid/relations/bindings/referenced/in_spec.rb +26 -26
- data/spec/mongoid/relations/bindings/referenced/many_spec.rb +10 -10
- data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +19 -19
- data/spec/mongoid/relations/bindings/referenced/one_spec.rb +12 -12
- data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
- data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
- data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
- data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
- data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
- data/spec/mongoid/relations/builders/referenced/in_spec.rb +24 -35
- data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
- data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
- data/spec/mongoid/relations/builders/referenced/one_spec.rb +12 -25
- data/spec/mongoid/relations/builders_spec.rb +21 -21
- data/spec/mongoid/relations/cascading/delete_spec.rb +9 -9
- data/spec/mongoid/relations/cascading/destroy_spec.rb +6 -6
- data/spec/mongoid/relations/cascading/nullify_spec.rb +4 -4
- data/spec/mongoid/relations/cascading/restrict_spec.rb +7 -7
- data/spec/mongoid/relations/cascading_spec.rb +16 -16
- data/spec/mongoid/relations/constraint_spec.rb +8 -7
- data/spec/mongoid/relations/conversions_spec.rb +16 -14
- data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
- data/spec/mongoid/relations/cyclic_spec.rb +18 -18
- data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
- data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +117 -0
- data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
- data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
- data/spec/mongoid/relations/eager_spec.rb +228 -0
- data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
- data/spec/mongoid/relations/embedded/in_spec.rb +56 -57
- data/spec/mongoid/relations/embedded/many_spec.rb +393 -372
- data/spec/mongoid/relations/embedded/one_spec.rb +108 -141
- data/spec/mongoid/relations/macros_spec.rb +108 -102
- data/spec/mongoid/relations/metadata_spec.rb +180 -255
- data/spec/mongoid/relations/options_spec.rb +1 -1
- data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
- data/spec/mongoid/relations/proxy_spec.rb +2 -2
- data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
- data/spec/mongoid/relations/referenced/many_spec.rb +434 -527
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +352 -424
- data/spec/mongoid/relations/referenced/one_spec.rb +149 -264
- data/spec/mongoid/relations/reflections_spec.rb +6 -6
- data/spec/mongoid/relations/synchronization_spec.rb +46 -50
- data/spec/mongoid/relations/targets/enumerable_spec.rb +118 -118
- data/spec/mongoid/relations/touchable_spec.rb +333 -0
- data/spec/mongoid/relations_spec.rb +16 -15
- data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +20 -60
- data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +89 -164
- data/spec/mongoid/selectable_spec.rb +134 -0
- data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +129 -82
- data/spec/mongoid/sessions/factory_spec.rb +49 -28
- data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
- data/spec/mongoid/sessions/options_spec.rb +107 -0
- data/spec/mongoid/sessions_spec.rb +289 -178
- data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
- data/spec/mongoid/{state_spec.rb → stateful_spec.rb} +36 -11
- data/spec/mongoid/tasks/database_rake_spec.rb +285 -0
- data/spec/mongoid/tasks/database_spec.rb +160 -0
- data/spec/mongoid/threaded_spec.rb +17 -70
- data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
- data/spec/mongoid/timestamps/created_spec.rb +5 -5
- data/spec/mongoid/timestamps/timeless_spec.rb +6 -6
- data/spec/mongoid/timestamps/updated/short_spec.rb +11 -11
- data/spec/mongoid/timestamps/updated_spec.rb +9 -13
- data/spec/mongoid/timestamps_spec.rb +9 -13
- data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
- data/spec/mongoid/{validations → validatable}/associated_spec.rb +45 -22
- data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
- data/spec/mongoid/{validations → validatable}/length_spec.rb +14 -14
- data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
- data/spec/mongoid/{validations → validatable}/presence_spec.rb +37 -44
- data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +184 -192
- data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
- data/spec/mongoid_spec.rb +8 -8
- data/spec/rails/mongoid_spec.rb +19 -335
- data/spec/spec_helper.rb +29 -13
- metadata +296 -283
- data/lib/mongoid/atomic/positionable.rb +0 -73
- data/lib/mongoid/components.rb +0 -92
- data/lib/mongoid/config/inflections.rb +0 -6
- data/lib/mongoid/contextual/eager.rb +0 -158
- data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
- data/lib/mongoid/identity_map.rb +0 -163
- data/lib/mongoid/json.rb +0 -16
- data/lib/mongoid/matchers/strategies.rb +0 -97
- data/lib/mongoid/matchers.rb +0 -32
- data/lib/mongoid/multi_parameter_attributes.rb +0 -105
- data/lib/mongoid/nested_attributes.rb +0 -78
- data/lib/mongoid/observer.rb +0 -192
- data/lib/mongoid/paranoia.rb +0 -136
- data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
- data/lib/mongoid/persistence/atomic/bit.rb +0 -35
- data/lib/mongoid/persistence/atomic/inc.rb +0 -45
- data/lib/mongoid/persistence/atomic/operation.rb +0 -154
- data/lib/mongoid/persistence/atomic/pop.rb +0 -32
- data/lib/mongoid/persistence/atomic/pull.rb +0 -32
- data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
- data/lib/mongoid/persistence/atomic/push.rb +0 -25
- data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
- data/lib/mongoid/persistence/atomic/rename.rb +0 -30
- data/lib/mongoid/persistence/atomic/sets.rb +0 -28
- data/lib/mongoid/persistence/atomic/unset.rb +0 -27
- data/lib/mongoid/persistence/atomic.rb +0 -231
- data/lib/mongoid/persistence/deletion.rb +0 -31
- data/lib/mongoid/persistence/insertion.rb +0 -38
- data/lib/mongoid/persistence/modification.rb +0 -35
- data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
- data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
- data/lib/mongoid/persistence/operations/insert.rb +0 -34
- data/lib/mongoid/persistence/operations/remove.rb +0 -33
- data/lib/mongoid/persistence/operations/update.rb +0 -59
- data/lib/mongoid/persistence/operations/upsert.rb +0 -28
- data/lib/mongoid/persistence/operations.rb +0 -214
- data/lib/mongoid/persistence/upsertion.rb +0 -31
- data/lib/mongoid/persistence.rb +0 -357
- data/lib/mongoid/unit_of_work.rb +0 -61
- data/lib/mongoid/versioning.rb +0 -217
- data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
- data/lib/rack/mongoid.rb +0 -2
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
- data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
- data/spec/app/models/actor_observer.rb +0 -15
- data/spec/app/models/callback_recorder.rb +0 -25
- data/spec/app/models/paranoid_phone.rb +0 -25
- data/spec/app/models/paranoid_post.rb +0 -36
- data/spec/app/models/phone_observer.rb +0 -6
- data/spec/mongoid/attributes/processing_spec.rb +0 -149
- data/spec/mongoid/criterion/destructive_spec.rb +0 -101
- data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
- data/spec/mongoid/criterion/modification_spec.rb +0 -402
- data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
- data/spec/mongoid/identity_map_spec.rb +0 -564
- data/spec/mongoid/json_spec.rb +0 -33
- data/spec/mongoid/matchers/in_spec.rb +0 -25
- data/spec/mongoid/matchers/ne_spec.rb +0 -25
- data/spec/mongoid/matchers/nin_spec.rb +0 -25
- data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
- data/spec/mongoid/observer_spec.rb +0 -290
- data/spec/mongoid/paranoia_spec.rb +0 -759
- data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
- data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
- data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
- data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
- data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
- data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
- data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
- data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
- data/spec/mongoid/persistence/atomic_spec.rb +0 -216
- data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
- data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
- data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
- data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
- data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
- data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
- data/spec/mongoid/persistence/operations_spec.rb +0 -313
- data/spec/mongoid/persistence_spec.rb +0 -2279
- data/spec/mongoid/unit_of_work_spec.rb +0 -196
- data/spec/mongoid/versioning_spec.rb +0 -540
- data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
|
@@ -104,19 +104,19 @@ module Mongoid
|
|
|
104
104
|
send(name, *args) if name && respond_to?(name)
|
|
105
105
|
end
|
|
106
106
|
|
|
107
|
-
# Get the value for an instance variable or
|
|
107
|
+
# Get the value for an instance variable or false if it doesn't exist.
|
|
108
108
|
#
|
|
109
109
|
# @example Get the value for an instance var.
|
|
110
110
|
# document.ivar("person")
|
|
111
111
|
#
|
|
112
112
|
# @param [ String ] name The name of the variable.
|
|
113
113
|
#
|
|
114
|
-
# @return [ Object,
|
|
114
|
+
# @return [ Object, false ] The value or false.
|
|
115
115
|
#
|
|
116
116
|
# @since 2.0.0.rc.1
|
|
117
117
|
def ivar(name)
|
|
118
|
-
if instance_variable_defined?("
|
|
119
|
-
return instance_variable_get("
|
|
118
|
+
if instance_variable_defined?("@_#{name}")
|
|
119
|
+
return instance_variable_get("@_#{name}")
|
|
120
120
|
else
|
|
121
121
|
false
|
|
122
122
|
end
|
|
@@ -170,8 +170,8 @@ module Mongoid
|
|
|
170
170
|
#
|
|
171
171
|
# @since 2.1.0
|
|
172
172
|
def remove_ivar(name)
|
|
173
|
-
if instance_variable_defined?("
|
|
174
|
-
return remove_instance_variable("
|
|
173
|
+
if instance_variable_defined?("@_#{name}")
|
|
174
|
+
return remove_instance_variable("@_#{name}")
|
|
175
175
|
else
|
|
176
176
|
false
|
|
177
177
|
end
|
|
@@ -271,4 +271,4 @@ module Mongoid
|
|
|
271
271
|
end
|
|
272
272
|
|
|
273
273
|
::Object.__send__(:include, Mongoid::Extensions::Object)
|
|
274
|
-
::Object.
|
|
274
|
+
::Object.extend(Mongoid::Extensions::Object::ClassMethods)
|
|
@@ -8,7 +8,7 @@ module Mongoid
|
|
|
8
8
|
# @example Evolve the object id.
|
|
9
9
|
# object_id.__evolve_object_id__
|
|
10
10
|
#
|
|
11
|
-
# @return [
|
|
11
|
+
# @return [ BSON::ObjectId ] self.
|
|
12
12
|
#
|
|
13
13
|
# @since 3.0.0
|
|
14
14
|
def __evolve_object_id__
|
|
@@ -25,7 +25,7 @@ module Mongoid
|
|
|
25
25
|
#
|
|
26
26
|
# @param [ Object ] object The object to evolve.
|
|
27
27
|
#
|
|
28
|
-
# @return [
|
|
28
|
+
# @return [ BSON::ObjectId ] The object id.
|
|
29
29
|
#
|
|
30
30
|
# @since 3.0.0
|
|
31
31
|
def evolve(object)
|
|
@@ -39,7 +39,7 @@ module Mongoid
|
|
|
39
39
|
#
|
|
40
40
|
# @param [ Object ] object The object to convert.
|
|
41
41
|
#
|
|
42
|
-
# @return [
|
|
42
|
+
# @return [ BSON::ObjectId ] The object id.
|
|
43
43
|
#
|
|
44
44
|
# @since 3.0.0
|
|
45
45
|
def mongoize(object)
|
|
@@ -50,5 +50,5 @@ module Mongoid
|
|
|
50
50
|
end
|
|
51
51
|
end
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
BSON::ObjectId.__send__(:include, Mongoid::Extensions::ObjectId)
|
|
54
|
+
BSON::ObjectId.extend(Mongoid::Extensions::ObjectId::ClassMethods)
|
|
@@ -53,7 +53,7 @@ module Mongoid
|
|
|
53
53
|
#
|
|
54
54
|
# @since 3.0.0
|
|
55
55
|
def demongoize(object)
|
|
56
|
-
object.nil? ? nil : ::Range.new(object["min"], object["max"])
|
|
56
|
+
object.nil? ? nil : ::Range.new(object["min"], object["max"], object["exclude_end"])
|
|
57
57
|
end
|
|
58
58
|
|
|
59
59
|
# Turn the object from the ruby type we deal with to a Mongo friendly
|
|
@@ -68,7 +68,13 @@ module Mongoid
|
|
|
68
68
|
#
|
|
69
69
|
# @since 3.0.0
|
|
70
70
|
def mongoize(object)
|
|
71
|
-
|
|
71
|
+
return nil if object.nil?
|
|
72
|
+
return object if object.is_a?(::Hash)
|
|
73
|
+
hash = { "min" => object.first, "max" => object.last }
|
|
74
|
+
if object.respond_to?(:exclude_end?) && object.exclude_end?
|
|
75
|
+
hash.merge!("exclude_end" => true)
|
|
76
|
+
end
|
|
77
|
+
hash
|
|
72
78
|
end
|
|
73
79
|
end
|
|
74
80
|
end
|
|
@@ -76,4 +82,4 @@ module Mongoid
|
|
|
76
82
|
end
|
|
77
83
|
|
|
78
84
|
::Range.__send__(:include, Mongoid::Extensions::Range)
|
|
79
|
-
::Range.
|
|
85
|
+
::Range.extend(Mongoid::Extensions::Range::ClassMethods)
|
|
@@ -11,7 +11,7 @@ module Mongoid
|
|
|
11
11
|
# @example Evolve the string.
|
|
12
12
|
# "test".__evolve_object_id__
|
|
13
13
|
#
|
|
14
|
-
# @return [ String,
|
|
14
|
+
# @return [ String, BSON::ObjectId ] The evolved string.
|
|
15
15
|
#
|
|
16
16
|
# @since 3.0.0
|
|
17
17
|
def __evolve_object_id__
|
|
@@ -23,7 +23,7 @@ module Mongoid
|
|
|
23
23
|
# @example Evolve the string.
|
|
24
24
|
# "test".__mongoize_object_id__
|
|
25
25
|
#
|
|
26
|
-
# @return [ String,
|
|
26
|
+
# @return [ String, BSON::ObjectId, nil ] The mongoized string.
|
|
27
27
|
#
|
|
28
28
|
# @since 3.0.0
|
|
29
29
|
def __mongoize_object_id__
|
|
@@ -96,18 +96,6 @@ module Mongoid
|
|
|
96
96
|
delete("=").sub(/\_before\_type\_cast$/, '')
|
|
97
97
|
end
|
|
98
98
|
|
|
99
|
-
# Convert the string to an array with the string in it.
|
|
100
|
-
#
|
|
101
|
-
# @example Convert the string to an array.
|
|
102
|
-
# "Testing".to_a
|
|
103
|
-
#
|
|
104
|
-
# @return [ Array ] An array with only the string in it.
|
|
105
|
-
#
|
|
106
|
-
# @since 1.0.0
|
|
107
|
-
def to_a
|
|
108
|
-
[ self ]
|
|
109
|
-
end
|
|
110
|
-
|
|
111
99
|
# Is this string a writer?
|
|
112
100
|
#
|
|
113
101
|
# @example Is the string a setter method?
|
|
@@ -129,7 +117,7 @@ module Mongoid
|
|
|
129
117
|
#
|
|
130
118
|
# @since 3.0.15
|
|
131
119
|
def valid_method_name?
|
|
132
|
-
/[@$"]/ !~
|
|
120
|
+
/[@$"]/ !~ self
|
|
133
121
|
end
|
|
134
122
|
|
|
135
123
|
# Does the string end with _before_type_cast?
|
|
@@ -165,11 +153,11 @@ module Mongoid
|
|
|
165
153
|
# @example Convert to the object id.
|
|
166
154
|
# string.convert_to_object_id
|
|
167
155
|
#
|
|
168
|
-
# @return [ String,
|
|
156
|
+
# @return [ String, BSON::ObjectId ] The string or the id.
|
|
169
157
|
#
|
|
170
158
|
# @since 3.0.0
|
|
171
159
|
def convert_to_object_id
|
|
172
|
-
|
|
160
|
+
BSON::ObjectId.legal?(self) ? BSON::ObjectId.from_string(self) : self
|
|
173
161
|
end
|
|
174
162
|
|
|
175
163
|
module ClassMethods
|
|
@@ -208,4 +196,4 @@ module Mongoid
|
|
|
208
196
|
end
|
|
209
197
|
|
|
210
198
|
::String.__send__(:include, Mongoid::Extensions::String)
|
|
211
|
-
::String.
|
|
199
|
+
::String.extend(Mongoid::Extensions::String::ClassMethods)
|
|
@@ -68,8 +68,8 @@ module Mongoid
|
|
|
68
68
|
return nil if object.blank?
|
|
69
69
|
begin
|
|
70
70
|
time = object.__mongoize_time__
|
|
71
|
-
if
|
|
72
|
-
::Time.at(time.to_i,
|
|
71
|
+
if object.respond_to?(:sec_fraction)
|
|
72
|
+
::Time.at(time.to_i, object.sec_fraction * 10**6).utc
|
|
73
73
|
elsif time.respond_to?(:subsec)
|
|
74
74
|
::Time.at(time.to_i, time.subsec * 10**6).utc
|
|
75
75
|
else
|
|
@@ -85,4 +85,4 @@ module Mongoid
|
|
|
85
85
|
end
|
|
86
86
|
|
|
87
87
|
::Time.__send__(:include, Mongoid::Extensions::Time)
|
|
88
|
-
::Time.
|
|
88
|
+
::Time.extend(Mongoid::Extensions::Time::ClassMethods)
|
|
@@ -53,4 +53,4 @@ module Mongoid
|
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
::ActiveSupport::TimeWithZone.__send__(:include, Mongoid::Extensions::TimeWithZone)
|
|
56
|
-
::ActiveSupport::TimeWithZone.
|
|
56
|
+
::ActiveSupport::TimeWithZone.extend(Mongoid::Extensions::TimeWithZone::ClassMethods)
|
data/lib/mongoid/extensions.rb
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
class Boolean; end
|
|
4
|
-
end
|
|
5
|
-
|
|
6
|
-
class Moped::BSON::ObjectId
|
|
7
|
-
undef :as_json
|
|
2
|
+
class BSON::ObjectId
|
|
8
3
|
def as_json(options = nil)
|
|
9
|
-
to_s
|
|
4
|
+
{ "$oid" => to_s }
|
|
10
5
|
end
|
|
11
6
|
def to_xml(options = nil)
|
|
12
7
|
ActiveSupport::XmlMini.to_tag(options[:root], self.to_s, options)
|
data/lib/mongoid/factory.rb
CHANGED
|
@@ -15,12 +15,12 @@ module Mongoid
|
|
|
15
15
|
# @param [ Hash ] options The mass assignment scoping options.
|
|
16
16
|
#
|
|
17
17
|
# @return [ Document ] The instantiated document.
|
|
18
|
-
def build(klass, attributes = nil
|
|
18
|
+
def build(klass, attributes = nil)
|
|
19
19
|
type = (attributes || {})["_type"]
|
|
20
20
|
if type && klass._types.include?(type)
|
|
21
|
-
type.constantize.new(attributes
|
|
21
|
+
type.constantize.new(attributes)
|
|
22
22
|
else
|
|
23
|
-
klass.new(attributes
|
|
23
|
+
klass.new(attributes)
|
|
24
24
|
end
|
|
25
25
|
end
|
|
26
26
|
|
|
@@ -32,14 +32,16 @@ module Mongoid
|
|
|
32
32
|
#
|
|
33
33
|
# @param [ Class ] klass The class to instantiate from if _type is not present.
|
|
34
34
|
# @param [ Hash ] attributes The document attributes.
|
|
35
|
+
# @param [ Array ] selected_fields If instantiated from a criteria using
|
|
36
|
+
# #only we give the document a list of the selected fields.
|
|
35
37
|
#
|
|
36
38
|
# @return [ Document ] The instantiated document.
|
|
37
|
-
def from_db(klass, attributes = nil,
|
|
39
|
+
def from_db(klass, attributes = nil, selected_fields = nil)
|
|
38
40
|
type = (attributes || {})["_type"]
|
|
39
41
|
if type.blank?
|
|
40
|
-
klass.instantiate(attributes,
|
|
42
|
+
klass.instantiate(attributes, selected_fields)
|
|
41
43
|
else
|
|
42
|
-
type.camelize.constantize.instantiate(attributes,
|
|
44
|
+
type.camelize.constantize.instantiate(attributes, selected_fields)
|
|
43
45
|
end
|
|
44
46
|
end
|
|
45
47
|
end
|
|
@@ -99,12 +99,12 @@ module Mongoid
|
|
|
99
99
|
end
|
|
100
100
|
end
|
|
101
101
|
|
|
102
|
-
# Is the field a
|
|
102
|
+
# Is the field a BSON::ObjectId?
|
|
103
103
|
#
|
|
104
|
-
# @example Is the field a
|
|
104
|
+
# @example Is the field a BSON::ObjectId?
|
|
105
105
|
# field.object_id_field?
|
|
106
106
|
#
|
|
107
|
-
# @return [ true, false ] If the field is a
|
|
107
|
+
# @return [ true, false ] If the field is a BSON::ObjectId.
|
|
108
108
|
#
|
|
109
109
|
# @since 2.2.0
|
|
110
110
|
def object_id_field?
|
|
@@ -63,7 +63,7 @@ module Mongoid
|
|
|
63
63
|
def lookup(object)
|
|
64
64
|
locale = ::I18n.locale
|
|
65
65
|
if ::I18n.respond_to?(:fallbacks)
|
|
66
|
-
object[::I18n.fallbacks[locale].map(&:to_s).find{ |loc| object
|
|
66
|
+
object[::I18n.fallbacks[locale].map(&:to_s).find{ |loc| object.has_key?(loc) }]
|
|
67
67
|
else
|
|
68
68
|
object[locale.to_s]
|
|
69
69
|
end
|
|
@@ -50,7 +50,7 @@ module Mongoid
|
|
|
50
50
|
#
|
|
51
51
|
# @since 2.1.8
|
|
52
52
|
def eval_default(doc)
|
|
53
|
-
if fields =
|
|
53
|
+
if fields = doc.__selected_fields
|
|
54
54
|
evaluated_default(doc) if included?(fields)
|
|
55
55
|
else
|
|
56
56
|
evaluated_default(doc)
|
|
@@ -131,16 +131,16 @@ module Mongoid
|
|
|
131
131
|
@metadata ||= options[:metadata]
|
|
132
132
|
end
|
|
133
133
|
|
|
134
|
-
# Is the field a
|
|
134
|
+
# Is the field a BSON::ObjectId?
|
|
135
135
|
#
|
|
136
|
-
# @example Is the field a
|
|
136
|
+
# @example Is the field a BSON::ObjectId?
|
|
137
137
|
# field.object_id_field?
|
|
138
138
|
#
|
|
139
|
-
# @return [ true, false ] If the field is a
|
|
139
|
+
# @return [ true, false ] If the field is a BSON::ObjectId.
|
|
140
140
|
#
|
|
141
141
|
# @since 2.2.0
|
|
142
142
|
def object_id_field?
|
|
143
|
-
@object_id_field ||= (type ==
|
|
143
|
+
@object_id_field ||= (type == BSON::ObjectId)
|
|
144
144
|
end
|
|
145
145
|
|
|
146
146
|
# Does the field pre-process its default value?
|
|
@@ -168,18 +168,6 @@ module Mongoid
|
|
|
168
168
|
@type ||= options[:type] || Object
|
|
169
169
|
end
|
|
170
170
|
|
|
171
|
-
# Is this field included in versioned attributes?
|
|
172
|
-
#
|
|
173
|
-
# @example Is the field versioned?
|
|
174
|
-
# field.versioned?
|
|
175
|
-
#
|
|
176
|
-
# @return [ true, false ] If the field is included in versioning.
|
|
177
|
-
#
|
|
178
|
-
# @since 2.1.0
|
|
179
|
-
def versioned?
|
|
180
|
-
@versioned ||= (options[:versioned].nil? ? true : options[:versioned])
|
|
181
|
-
end
|
|
182
|
-
|
|
183
171
|
private
|
|
184
172
|
|
|
185
173
|
# Get the name of the default method for this field.
|
|
@@ -17,7 +17,7 @@ module Mongoid
|
|
|
17
17
|
:pre_processed,
|
|
18
18
|
:subtype,
|
|
19
19
|
:type,
|
|
20
|
-
:
|
|
20
|
+
:overwrite
|
|
21
21
|
]
|
|
22
22
|
|
|
23
23
|
# Validate the field definition.
|
|
@@ -31,7 +31,7 @@ module Mongoid
|
|
|
31
31
|
#
|
|
32
32
|
# @since 3.0.0
|
|
33
33
|
def validate(klass, name, options)
|
|
34
|
-
validate_name(klass, name)
|
|
34
|
+
validate_name(klass, name, options)
|
|
35
35
|
validate_options(klass, name, options)
|
|
36
36
|
end
|
|
37
37
|
|
|
@@ -50,9 +50,19 @@ module Mongoid
|
|
|
50
50
|
# @raise [ Errors::InvalidField ] If the name is not allowed.
|
|
51
51
|
#
|
|
52
52
|
# @since 3.0.0
|
|
53
|
-
def validate_name(klass, name)
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
def validate_name(klass, name, options)
|
|
54
|
+
[name, "#{name}?".to_sym, "#{name}=".to_sym].each do |n|
|
|
55
|
+
if Mongoid.destructive_fields.include?(n)
|
|
56
|
+
raise Errors::InvalidField.new(klass, n)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
if !options[:overwrite] && klass.fields.keys.include?(name.to_s)
|
|
61
|
+
if Mongoid.duplicate_fields_exception
|
|
62
|
+
raise Errors::InvalidField.new(klass, name)
|
|
63
|
+
else
|
|
64
|
+
Mongoid.logger.warn("Overwriting existing field #{name} in class #{klass.name}.") if Mongoid.logger
|
|
65
|
+
end
|
|
56
66
|
end
|
|
57
67
|
end
|
|
58
68
|
|
data/lib/mongoid/fields.rb
CHANGED
|
@@ -10,6 +10,28 @@ module Mongoid
|
|
|
10
10
|
module Fields
|
|
11
11
|
extend ActiveSupport::Concern
|
|
12
12
|
|
|
13
|
+
# For fields defined with symbols use the correct class.
|
|
14
|
+
#
|
|
15
|
+
# @since 4.0.0
|
|
16
|
+
TYPE_MAPPINGS = {
|
|
17
|
+
array: Array,
|
|
18
|
+
big_decimal: BigDecimal,
|
|
19
|
+
binary: BSON::Binary,
|
|
20
|
+
boolean: Mongoid::Boolean,
|
|
21
|
+
date: Date,
|
|
22
|
+
date_time: DateTime,
|
|
23
|
+
float: Float,
|
|
24
|
+
hash: Hash,
|
|
25
|
+
integer: Integer,
|
|
26
|
+
object_id: BSON::ObjectId,
|
|
27
|
+
range: Range,
|
|
28
|
+
regexp: Regexp,
|
|
29
|
+
set: Set,
|
|
30
|
+
string: String,
|
|
31
|
+
symbol: Symbol,
|
|
32
|
+
time: Time
|
|
33
|
+
}.with_indifferent_access
|
|
34
|
+
|
|
13
35
|
included do
|
|
14
36
|
class_attribute :aliased_fields
|
|
15
37
|
class_attribute :localized_fields
|
|
@@ -25,15 +47,13 @@ module Mongoid
|
|
|
25
47
|
|
|
26
48
|
field(
|
|
27
49
|
:_id,
|
|
28
|
-
default: ->{
|
|
50
|
+
default: ->{ BSON::ObjectId.new },
|
|
29
51
|
pre_processed: true,
|
|
30
|
-
type:
|
|
52
|
+
type: BSON::ObjectId
|
|
31
53
|
)
|
|
32
54
|
|
|
33
55
|
alias :id :_id
|
|
34
56
|
alias :id= :_id=
|
|
35
|
-
|
|
36
|
-
attr_protected(:id, :_id, :_type) if Mongoid.protect_sensitive_fields?
|
|
37
57
|
end
|
|
38
58
|
|
|
39
59
|
# Apply all default values to the document which are not procs.
|
|
@@ -264,13 +284,13 @@ module Mongoid
|
|
|
264
284
|
add_field(name, fields[name].options.merge(type: type))
|
|
265
285
|
end
|
|
266
286
|
|
|
267
|
-
# Convenience method for determining if we are using +
|
|
287
|
+
# Convenience method for determining if we are using +BSON::ObjectIds+ as
|
|
268
288
|
# our id.
|
|
269
289
|
#
|
|
270
290
|
# @example Does this class use object ids?
|
|
271
291
|
# person.using_object_ids?
|
|
272
292
|
#
|
|
273
|
-
# @return [ true, false ] If the class uses
|
|
293
|
+
# @return [ true, false ] If the class uses BSON::ObjectIds for the id.
|
|
274
294
|
#
|
|
275
295
|
# @since 1.0.0
|
|
276
296
|
def using_object_ids?
|
|
@@ -434,10 +454,11 @@ module Mongoid
|
|
|
434
454
|
def create_field_setter(name, meth, field)
|
|
435
455
|
generated_methods.module_eval do
|
|
436
456
|
re_define_method("#{meth}=") do |value|
|
|
437
|
-
write_attribute(name, value)
|
|
457
|
+
val = write_attribute(name, value)
|
|
438
458
|
if field.foreign_key?
|
|
439
459
|
remove_ivar(field.metadata.name)
|
|
440
460
|
end
|
|
461
|
+
val
|
|
441
462
|
end
|
|
442
463
|
end
|
|
443
464
|
end
|
|
@@ -472,8 +493,9 @@ module Mongoid
|
|
|
472
493
|
def create_translations_getter(name, meth)
|
|
473
494
|
generated_methods.module_eval do
|
|
474
495
|
re_define_method("#{meth}_translations") do
|
|
475
|
-
attributes[name] ||= {}
|
|
496
|
+
(attributes[name] ||= {}).with_indifferent_access
|
|
476
497
|
end
|
|
498
|
+
alias_method :"#{meth}_t", :"#{meth}_translations"
|
|
477
499
|
end
|
|
478
500
|
end
|
|
479
501
|
|
|
@@ -498,6 +520,7 @@ module Mongoid
|
|
|
498
520
|
end
|
|
499
521
|
attributes[name] = value
|
|
500
522
|
end
|
|
523
|
+
alias_method :"#{meth}_t=", :"#{meth}_translations="
|
|
501
524
|
end
|
|
502
525
|
end
|
|
503
526
|
|
|
@@ -532,10 +555,20 @@ module Mongoid
|
|
|
532
555
|
|
|
533
556
|
def field_for(name, options)
|
|
534
557
|
opts = options.merge(klass: self)
|
|
558
|
+
type_mapping = TYPE_MAPPINGS[options[:type]]
|
|
559
|
+
opts[:type] = type_mapping || unmapped_type(options)
|
|
535
560
|
return Fields::Localized.new(name, opts) if options[:localize]
|
|
536
561
|
return Fields::ForeignKey.new(name, opts) if options[:identity]
|
|
537
562
|
Fields::Standard.new(name, opts)
|
|
538
563
|
end
|
|
564
|
+
|
|
565
|
+
def unmapped_type(options)
|
|
566
|
+
if "Boolean" == options[:type].to_s
|
|
567
|
+
Mongoid::Boolean
|
|
568
|
+
else
|
|
569
|
+
options[:type] || Object
|
|
570
|
+
end
|
|
571
|
+
end
|
|
539
572
|
end
|
|
540
573
|
end
|
|
541
574
|
end
|
|
@@ -3,7 +3,9 @@ module Mongoid
|
|
|
3
3
|
|
|
4
4
|
# This module defines the finder methods that hang off the document at the
|
|
5
5
|
# class level.
|
|
6
|
-
|
|
6
|
+
#
|
|
7
|
+
# @since 4.0.0
|
|
8
|
+
module Findable
|
|
7
9
|
extend Origin::Forwardable
|
|
8
10
|
|
|
9
11
|
select_with :with_default_scope
|
|
@@ -19,6 +21,7 @@ module Mongoid
|
|
|
19
21
|
:extras,
|
|
20
22
|
:find_and_modify,
|
|
21
23
|
:find_or_create_by,
|
|
24
|
+
:find_or_create_by!,
|
|
22
25
|
:find_or_initialize_by,
|
|
23
26
|
:first_or_create,
|
|
24
27
|
:first_or_create!,
|
|
@@ -29,8 +32,10 @@ module Mongoid
|
|
|
29
32
|
:map_reduce,
|
|
30
33
|
:max,
|
|
31
34
|
:min,
|
|
35
|
+
:none,
|
|
32
36
|
:pluck,
|
|
33
37
|
:sum,
|
|
38
|
+
:text_search,
|
|
34
39
|
:update,
|
|
35
40
|
:update_all, to: :with_default_scope
|
|
36
41
|
|
|
@@ -76,7 +81,7 @@ module Mongoid
|
|
|
76
81
|
# on the conditions provided and the first parameter.
|
|
77
82
|
#
|
|
78
83
|
# @example Find a single document by an id.
|
|
79
|
-
# Person.find(
|
|
84
|
+
# Person.find(BSON::ObjectId)
|
|
80
85
|
#
|
|
81
86
|
# @param [ Array ] args An assortment of finder options.
|
|
82
87
|
#
|
|
@@ -116,6 +121,7 @@ module Mongoid
|
|
|
116
121
|
def first
|
|
117
122
|
with_default_scope.first
|
|
118
123
|
end
|
|
124
|
+
alias :one :first
|
|
119
125
|
|
|
120
126
|
# Find the last +Document+ given the conditions.
|
|
121
127
|
#
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Indexable
|
|
4
|
+
|
|
5
|
+
# Encapsulates behaviour around an index specification.
|
|
6
|
+
#
|
|
7
|
+
# @since 4.0.0
|
|
8
|
+
class Specification
|
|
9
|
+
|
|
10
|
+
# The mappings of nice Ruby-style names to the corresponding MongoDB
|
|
11
|
+
# name.
|
|
12
|
+
#
|
|
13
|
+
# @since 4.0.0
|
|
14
|
+
MAPPINGS = {
|
|
15
|
+
bucket_size: :bucketSize,
|
|
16
|
+
drop_dups: :dropDups,
|
|
17
|
+
expire_after_seconds: :expireAfterSeconds
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
# @!attribute klass
|
|
21
|
+
# @return [ Class ] The class the index is defined on.
|
|
22
|
+
# @!attribute key
|
|
23
|
+
# @return [ Hash ] The index key.
|
|
24
|
+
# @!attribute options
|
|
25
|
+
# @return [ Hash ] The index options.
|
|
26
|
+
attr_reader :klass, :key, :fields, :options
|
|
27
|
+
|
|
28
|
+
# Is this index specification equal to another?
|
|
29
|
+
#
|
|
30
|
+
# @example Check equality of the specifications.
|
|
31
|
+
# specification == other
|
|
32
|
+
#
|
|
33
|
+
# @param [ Specification ] other The spec to compare against.
|
|
34
|
+
#
|
|
35
|
+
# @return [ true, false ] If the specs are equal.
|
|
36
|
+
#
|
|
37
|
+
# @since 4.0.0
|
|
38
|
+
def ==(other)
|
|
39
|
+
fields == other.fields && key == other.key
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Instantiate a new index specification.
|
|
43
|
+
#
|
|
44
|
+
# @example Create the new specification.
|
|
45
|
+
# Specification.new(Band, { name: 1 }, background: true)
|
|
46
|
+
#
|
|
47
|
+
# @param [ Class ] klass The class the index is defined on.
|
|
48
|
+
# @param [ Hash ] key The hash of name/direction pairs.
|
|
49
|
+
# @param [ Hash ] opts the index options.
|
|
50
|
+
#
|
|
51
|
+
# @since 4.0.0
|
|
52
|
+
def initialize(klass, key, opts = nil)
|
|
53
|
+
options = opts || {}
|
|
54
|
+
Validators::Options.validate(klass, key, options)
|
|
55
|
+
@klass = klass
|
|
56
|
+
@key = normalize_key(key)
|
|
57
|
+
@fields = @key.keys
|
|
58
|
+
@options = normalize_options(options.dup)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
private
|
|
62
|
+
|
|
63
|
+
# Normalize the spec, in case aliased fields are provided.
|
|
64
|
+
#
|
|
65
|
+
# @api private
|
|
66
|
+
#
|
|
67
|
+
# @example Normalize the spec.
|
|
68
|
+
# specification.normalize_key(name: 1)
|
|
69
|
+
#
|
|
70
|
+
# @param [ Hash ] key The index key(s).
|
|
71
|
+
#
|
|
72
|
+
# @return [ Hash ] The normalized specification.
|
|
73
|
+
#
|
|
74
|
+
# @since 4.0.0
|
|
75
|
+
def normalize_key(key)
|
|
76
|
+
normalized = {}
|
|
77
|
+
key.each_pair do |name, direction|
|
|
78
|
+
normalized[klass.database_field_name(name).to_sym] = direction
|
|
79
|
+
end
|
|
80
|
+
normalized
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Normalize the index options, if any are provided.
|
|
84
|
+
#
|
|
85
|
+
# @api private
|
|
86
|
+
#
|
|
87
|
+
# @example Normalize the index options.
|
|
88
|
+
# specification.normalize_options(drop_dups: true)
|
|
89
|
+
#
|
|
90
|
+
# @param [ Hash ] options The index options.
|
|
91
|
+
#
|
|
92
|
+
# @return [ Hash ] The normalized options.
|
|
93
|
+
#
|
|
94
|
+
# @since 4.0.0
|
|
95
|
+
def normalize_options(opts)
|
|
96
|
+
options = {}
|
|
97
|
+
opts.each_pair do |option, value|
|
|
98
|
+
options[MAPPINGS[option] || option] = value
|
|
99
|
+
end
|
|
100
|
+
options
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
module Mongoid
|
|
3
|
-
module
|
|
3
|
+
module Indexable
|
|
4
4
|
module Validators
|
|
5
5
|
|
|
6
6
|
# Validates the options passed to the index macro.
|
|
@@ -10,6 +10,7 @@ module Mongoid
|
|
|
10
10
|
VALID_OPTIONS = [
|
|
11
11
|
:background,
|
|
12
12
|
:database,
|
|
13
|
+
:default_language,
|
|
13
14
|
:drop_dups,
|
|
14
15
|
:name,
|
|
15
16
|
:sparse,
|