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
|
@@ -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)
|
|
@@ -17,6 +12,19 @@ class Symbol
|
|
|
17
12
|
remove_method :size if instance_methods.include? :size # temporal fix for ruby 1.9
|
|
18
13
|
end
|
|
19
14
|
|
|
15
|
+
class BSON::Document
|
|
16
|
+
# We need to override this as ActiveSupport creates a new Object, instead of a new Hash
|
|
17
|
+
# see https://github.com/rails/rails/commit/f1bad130d0c9bd77c94e43b696adca56c46a66aa
|
|
18
|
+
def transform_keys
|
|
19
|
+
return enum_for(:transform_keys) unless block_given?
|
|
20
|
+
result = {}
|
|
21
|
+
each_key do |key|
|
|
22
|
+
result[yield(key)] = self[key]
|
|
23
|
+
end
|
|
24
|
+
result
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
20
28
|
require "mongoid/extensions/array"
|
|
21
29
|
require "mongoid/extensions/big_decimal"
|
|
22
30
|
require "mongoid/extensions/boolean"
|
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
|
#
|
|
@@ -85,21 +90,24 @@ module Mongoid
|
|
|
85
90
|
with_default_scope.find(*args)
|
|
86
91
|
end
|
|
87
92
|
|
|
88
|
-
# Find the first +Document+ given the conditions
|
|
89
|
-
#
|
|
93
|
+
# Find the first +Document+ given the conditions.
|
|
94
|
+
# If a matching Document is not found and
|
|
95
|
+
# Mongoid.raise_not_found_error is true it raises
|
|
96
|
+
# Mongoid::Errors::DocumentNotFound, return null nil elsewise.
|
|
90
97
|
#
|
|
91
98
|
# @example Find the document by attribute other than id
|
|
92
99
|
# Person.find_by(:username => "superuser")
|
|
93
100
|
#
|
|
94
101
|
# @param [ Hash ] attrs The attributes to check.
|
|
95
102
|
#
|
|
96
|
-
# @raise [ Errors::DocumentNotFound ] If no document found
|
|
103
|
+
# @raise [ Errors::DocumentNotFound ] If no document found
|
|
104
|
+
# and Mongoid.raise_not_found_error is true.
|
|
97
105
|
#
|
|
98
|
-
# @return [ Document ] A matching document.
|
|
106
|
+
# @return [ Document, nil ] A matching document.
|
|
99
107
|
#
|
|
100
108
|
# @since 3.0.0
|
|
101
109
|
def find_by(attrs = {})
|
|
102
|
-
result = where(attrs).
|
|
110
|
+
result = where(attrs).find_first
|
|
103
111
|
if result.nil? && Mongoid.raise_not_found_error
|
|
104
112
|
raise(Errors::DocumentNotFound.new(self, attrs))
|
|
105
113
|
end
|
|
@@ -107,6 +115,25 @@ module Mongoid
|
|
|
107
115
|
result
|
|
108
116
|
end
|
|
109
117
|
|
|
118
|
+
# Find the first +Document+ given the conditions, or raises
|
|
119
|
+
# Mongoid::Errors::DocumentNotFound
|
|
120
|
+
#
|
|
121
|
+
# @example Find the document by attribute other than id
|
|
122
|
+
# Person.find_by(:username => "superuser")
|
|
123
|
+
#
|
|
124
|
+
# @param [ Hash ] attrs The attributes to check.
|
|
125
|
+
#
|
|
126
|
+
# @raise [ Errors::DocumentNotFound ] If no document found.
|
|
127
|
+
#
|
|
128
|
+
# @return [ Document ] A matching document.
|
|
129
|
+
#
|
|
130
|
+
def find_by!(attrs = {})
|
|
131
|
+
result = where(attrs).find_first
|
|
132
|
+
raise(Errors::DocumentNotFound.new(self, attrs)) unless result
|
|
133
|
+
yield(result) if result && block_given?
|
|
134
|
+
result
|
|
135
|
+
end
|
|
136
|
+
|
|
110
137
|
# Find the first +Document+ given the conditions.
|
|
111
138
|
#
|
|
112
139
|
# @example Find the first document.
|
|
@@ -116,6 +143,7 @@ module Mongoid
|
|
|
116
143
|
def first
|
|
117
144
|
with_default_scope.first
|
|
118
145
|
end
|
|
146
|
+
alias :one :first
|
|
119
147
|
|
|
120
148
|
# Find the last +Document+ given the conditions.
|
|
121
149
|
#
|
|
@@ -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,
|