mongoid_rails4 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 +7 -0
- data/CHANGELOG.md +3213 -0
- data/LICENSE +20 -0
- data/README.md +62 -0
- data/Rakefile +35 -0
- data/lib/config/locales/en.yml +448 -0
- data/lib/mongoid.rb +104 -0
- data/lib/mongoid/atomic.rb +384 -0
- data/lib/mongoid/atomic/modifiers.rb +317 -0
- data/lib/mongoid/atomic/paths.rb +3 -0
- data/lib/mongoid/atomic/paths/embedded.rb +28 -0
- data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
- data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
- data/lib/mongoid/atomic/paths/root.rb +39 -0
- data/lib/mongoid/attributes.rb +284 -0
- data/lib/mongoid/attributes/dynamic.rb +154 -0
- data/lib/mongoid/attributes/nested.rb +82 -0
- data/lib/mongoid/attributes/processing.rb +147 -0
- data/lib/mongoid/attributes/readonly.rb +56 -0
- data/lib/mongoid/changeable.rb +379 -0
- data/lib/mongoid/composable.rb +104 -0
- data/lib/mongoid/config.rb +263 -0
- data/lib/mongoid/config/environment.rb +44 -0
- data/lib/mongoid/config/options.rb +74 -0
- data/lib/mongoid/config/validators.rb +3 -0
- data/lib/mongoid/config/validators/option.rb +25 -0
- data/lib/mongoid/config/validators/session.rb +140 -0
- data/lib/mongoid/contextual.rb +54 -0
- data/lib/mongoid/contextual/aggregable/memory.rb +109 -0
- data/lib/mongoid/contextual/aggregable/mongo.rb +147 -0
- data/lib/mongoid/contextual/atomic.rb +180 -0
- data/lib/mongoid/contextual/command.rb +61 -0
- data/lib/mongoid/contextual/eager.rb +158 -0
- data/lib/mongoid/contextual/find_and_modify.rb +69 -0
- data/lib/mongoid/contextual/geo_near.rb +238 -0
- data/lib/mongoid/contextual/map_reduce.rb +324 -0
- data/lib/mongoid/contextual/memory.rb +440 -0
- data/lib/mongoid/contextual/mongo.rb +676 -0
- data/lib/mongoid/contextual/queryable.rb +25 -0
- data/lib/mongoid/contextual/text_search.rb +180 -0
- data/lib/mongoid/copyable.rb +67 -0
- data/lib/mongoid/criteria.rb +562 -0
- data/lib/mongoid/criteria/findable.rb +179 -0
- data/lib/mongoid/criteria/inspectable.rb +25 -0
- data/lib/mongoid/criteria/marshalable.rb +50 -0
- data/lib/mongoid/criteria/modifiable.rb +189 -0
- data/lib/mongoid/criteria/scopable.rb +158 -0
- data/lib/mongoid/document.rb +361 -0
- data/lib/mongoid/equality.rb +66 -0
- data/lib/mongoid/errors.rb +40 -0
- data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
- data/lib/mongoid/errors/callback.rb +25 -0
- data/lib/mongoid/errors/delete_restriction.rb +29 -0
- data/lib/mongoid/errors/document_not_found.rb +111 -0
- data/lib/mongoid/errors/eager_load.rb +22 -0
- data/lib/mongoid/errors/invalid_collection.rb +18 -0
- data/lib/mongoid/errors/invalid_config_option.rb +27 -0
- data/lib/mongoid/errors/invalid_field.rb +64 -0
- data/lib/mongoid/errors/invalid_field_option.rb +35 -0
- data/lib/mongoid/errors/invalid_find.rb +19 -0
- data/lib/mongoid/errors/invalid_includes.rb +32 -0
- data/lib/mongoid/errors/invalid_index.rb +28 -0
- data/lib/mongoid/errors/invalid_options.rb +28 -0
- data/lib/mongoid/errors/invalid_path.rb +21 -0
- data/lib/mongoid/errors/invalid_scope.rb +24 -0
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
- data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
- data/lib/mongoid/errors/invalid_time.rb +22 -0
- data/lib/mongoid/errors/inverse_not_found.rb +29 -0
- data/lib/mongoid/errors/mixed_relations.rb +32 -0
- data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
- data/lib/mongoid/errors/mongoid_error.rb +92 -0
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
- data/lib/mongoid/errors/no_default_session.rb +23 -0
- data/lib/mongoid/errors/no_environment.rb +19 -0
- data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
- data/lib/mongoid/errors/no_metadata.rb +21 -0
- data/lib/mongoid/errors/no_parent.rb +24 -0
- data/lib/mongoid/errors/no_session_config.rb +22 -0
- data/lib/mongoid/errors/no_session_database.rb +27 -0
- data/lib/mongoid/errors/no_session_hosts.rb +27 -0
- data/lib/mongoid/errors/no_sessions_config.rb +20 -0
- data/lib/mongoid/errors/readonly_attribute.rb +25 -0
- data/lib/mongoid/errors/scope_overwrite.rb +21 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +20 -0
- data/lib/mongoid/errors/unknown_attribute.rb +25 -0
- data/lib/mongoid/errors/unsaved_document.rb +19 -0
- data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
- data/lib/mongoid/errors/validations.rb +29 -0
- data/lib/mongoid/evolvable.rb +19 -0
- data/lib/mongoid/extensions.rb +35 -0
- data/lib/mongoid/extensions/array.rb +180 -0
- data/lib/mongoid/extensions/big_decimal.rb +69 -0
- data/lib/mongoid/extensions/boolean.rb +21 -0
- data/lib/mongoid/extensions/date.rb +77 -0
- data/lib/mongoid/extensions/date_time.rb +73 -0
- data/lib/mongoid/extensions/false_class.rb +38 -0
- data/lib/mongoid/extensions/float.rb +56 -0
- data/lib/mongoid/extensions/hash.rb +209 -0
- data/lib/mongoid/extensions/integer.rb +67 -0
- data/lib/mongoid/extensions/module.rb +28 -0
- data/lib/mongoid/extensions/nil_class.rb +33 -0
- data/lib/mongoid/extensions/object.rb +274 -0
- data/lib/mongoid/extensions/object_id.rb +54 -0
- data/lib/mongoid/extensions/range.rb +79 -0
- data/lib/mongoid/extensions/regexp.rb +27 -0
- data/lib/mongoid/extensions/set.rb +55 -0
- data/lib/mongoid/extensions/string.rb +199 -0
- data/lib/mongoid/extensions/symbol.rb +54 -0
- data/lib/mongoid/extensions/time.rb +88 -0
- data/lib/mongoid/extensions/time_with_zone.rb +56 -0
- data/lib/mongoid/extensions/true_class.rb +38 -0
- data/lib/mongoid/factory.rb +46 -0
- data/lib/mongoid/fields.rb +542 -0
- data/lib/mongoid/fields/foreign_key.rb +174 -0
- data/lib/mongoid/fields/localized.rb +73 -0
- data/lib/mongoid/fields/standard.rb +273 -0
- data/lib/mongoid/fields/validators.rb +2 -0
- data/lib/mongoid/fields/validators/macro.rb +92 -0
- data/lib/mongoid/findable.rb +133 -0
- data/lib/mongoid/identity_map.rb +163 -0
- data/lib/mongoid/indexable.rb +147 -0
- data/lib/mongoid/indexable/specification.rb +115 -0
- data/lib/mongoid/indexable/validators/options.rb +103 -0
- data/lib/mongoid/inspectable.rb +59 -0
- data/lib/mongoid/interceptable.rb +265 -0
- data/lib/mongoid/loggable.rb +69 -0
- data/lib/mongoid/matchable.rb +152 -0
- data/lib/mongoid/matchable/all.rb +27 -0
- data/lib/mongoid/matchable/and.rb +30 -0
- data/lib/mongoid/matchable/default.rb +72 -0
- data/lib/mongoid/matchable/exists.rb +23 -0
- data/lib/mongoid/matchable/gt.rb +21 -0
- data/lib/mongoid/matchable/gte.rb +21 -0
- data/lib/mongoid/matchable/in.rb +24 -0
- data/lib/mongoid/matchable/lt.rb +21 -0
- data/lib/mongoid/matchable/lte.rb +21 -0
- data/lib/mongoid/matchable/ne.rb +21 -0
- data/lib/mongoid/matchable/nin.rb +21 -0
- data/lib/mongoid/matchable/or.rb +33 -0
- data/lib/mongoid/matchable/size.rb +21 -0
- data/lib/mongoid/persistable.rb +207 -0
- data/lib/mongoid/persistable/creatable.rb +189 -0
- data/lib/mongoid/persistable/deletable.rb +149 -0
- data/lib/mongoid/persistable/destroyable.rb +55 -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 +151 -0
- data/lib/mongoid/persistable/upsertable.rb +55 -0
- data/lib/mongoid/positional.rb +71 -0
- data/lib/mongoid/railtie.rb +156 -0
- data/lib/mongoid/railties/database.rake +97 -0
- data/lib/mongoid/railties/document.rb +12 -0
- data/lib/mongoid/relations.rb +162 -0
- data/lib/mongoid/relations/accessors.rb +299 -0
- data/lib/mongoid/relations/auto_save.rb +106 -0
- data/lib/mongoid/relations/binding.rb +218 -0
- data/lib/mongoid/relations/bindings.rb +9 -0
- data/lib/mongoid/relations/bindings/embedded/in.rb +63 -0
- data/lib/mongoid/relations/bindings/embedded/many.rb +50 -0
- data/lib/mongoid/relations/bindings/embedded/one.rb +55 -0
- data/lib/mongoid/relations/bindings/referenced/in.rb +65 -0
- data/lib/mongoid/relations/bindings/referenced/many.rb +42 -0
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +67 -0
- data/lib/mongoid/relations/bindings/referenced/one.rb +44 -0
- data/lib/mongoid/relations/builder.rb +57 -0
- data/lib/mongoid/relations/builders.rb +104 -0
- data/lib/mongoid/relations/builders/embedded/in.rb +29 -0
- data/lib/mongoid/relations/builders/embedded/many.rb +36 -0
- data/lib/mongoid/relations/builders/embedded/one.rb +30 -0
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +174 -0
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +126 -0
- data/lib/mongoid/relations/builders/referenced/in.rb +26 -0
- data/lib/mongoid/relations/builders/referenced/many.rb +27 -0
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +40 -0
- data/lib/mongoid/relations/builders/referenced/one.rb +26 -0
- data/lib/mongoid/relations/cascading.rb +56 -0
- data/lib/mongoid/relations/cascading/delete.rb +44 -0
- data/lib/mongoid/relations/cascading/destroy.rb +43 -0
- data/lib/mongoid/relations/cascading/nullify.rb +35 -0
- data/lib/mongoid/relations/cascading/restrict.rb +39 -0
- data/lib/mongoid/relations/constraint.rb +49 -0
- data/lib/mongoid/relations/conversions.rb +34 -0
- data/lib/mongoid/relations/counter_cache.rb +105 -0
- data/lib/mongoid/relations/cyclic.rb +107 -0
- data/lib/mongoid/relations/embedded/batchable.rb +355 -0
- data/lib/mongoid/relations/embedded/in.rb +231 -0
- data/lib/mongoid/relations/embedded/many.rb +639 -0
- data/lib/mongoid/relations/embedded/one.rb +223 -0
- data/lib/mongoid/relations/macros.rb +356 -0
- data/lib/mongoid/relations/many.rb +208 -0
- data/lib/mongoid/relations/marshalable.rb +32 -0
- data/lib/mongoid/relations/metadata.rb +1174 -0
- data/lib/mongoid/relations/nested_builder.rb +74 -0
- data/lib/mongoid/relations/one.rb +48 -0
- data/lib/mongoid/relations/options.rb +48 -0
- data/lib/mongoid/relations/polymorphic.rb +39 -0
- data/lib/mongoid/relations/proxy.rb +270 -0
- data/lib/mongoid/relations/referenced/in.rb +297 -0
- data/lib/mongoid/relations/referenced/many.rb +787 -0
- data/lib/mongoid/relations/referenced/many_to_many.rb +486 -0
- data/lib/mongoid/relations/referenced/one.rb +290 -0
- data/lib/mongoid/relations/reflections.rb +62 -0
- data/lib/mongoid/relations/synchronization.rb +169 -0
- data/lib/mongoid/relations/targets.rb +2 -0
- data/lib/mongoid/relations/targets/enumerable.rb +473 -0
- data/lib/mongoid/relations/touchable.rb +94 -0
- data/lib/mongoid/reloadable.rb +95 -0
- data/lib/mongoid/scopable.rb +379 -0
- data/lib/mongoid/selectable.rb +59 -0
- data/lib/mongoid/serializable.rb +170 -0
- data/lib/mongoid/sessions.rb +330 -0
- data/lib/mongoid/sessions/factory.rb +129 -0
- data/lib/mongoid/sessions/mongo_uri.rb +93 -0
- data/lib/mongoid/sessions/options.rb +141 -0
- data/lib/mongoid/sessions/validators.rb +2 -0
- data/lib/mongoid/sessions/validators/storage.rb +49 -0
- data/lib/mongoid/shardable.rb +65 -0
- data/lib/mongoid/state.rb +97 -0
- data/lib/mongoid/threaded.rb +383 -0
- data/lib/mongoid/threaded/lifecycle.rb +164 -0
- data/lib/mongoid/timestamps.rb +15 -0
- data/lib/mongoid/timestamps/created.rb +30 -0
- data/lib/mongoid/timestamps/created/short.rb +19 -0
- data/lib/mongoid/timestamps/short.rb +10 -0
- data/lib/mongoid/timestamps/updated.rb +39 -0
- data/lib/mongoid/timestamps/updated/short.rb +19 -0
- data/lib/mongoid/traversable.rb +192 -0
- data/lib/mongoid/unit_of_work.rb +61 -0
- data/lib/mongoid/validatable.rb +180 -0
- data/lib/mongoid/validatable/associated.rb +48 -0
- data/lib/mongoid/validatable/format.rb +20 -0
- data/lib/mongoid/validatable/length.rb +20 -0
- data/lib/mongoid/validatable/localizable.rb +30 -0
- data/lib/mongoid/validatable/macros.rb +94 -0
- data/lib/mongoid/validatable/presence.rb +86 -0
- data/lib/mongoid/validatable/queryable.rb +30 -0
- data/lib/mongoid/validatable/uniqueness.rb +330 -0
- data/lib/mongoid/version.rb +4 -0
- data/lib/rack/mongoid.rb +2 -0
- data/lib/rack/mongoid/middleware/identity_map.rb +39 -0
- data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +76 -0
- data/lib/rails/generators/mongoid/model/model_generator.rb +25 -0
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +19 -0
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
- data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +4 -0
- data/lib/rails/generators/mongoid_generator.rb +65 -0
- data/lib/rails/mongoid.rb +180 -0
- data/lib/support/ruby_version.rb +26 -0
- data/spec/app/models/account.rb +28 -0
- data/spec/app/models/acolyte.rb +17 -0
- data/spec/app/models/actor.rb +18 -0
- data/spec/app/models/actress.rb +2 -0
- data/spec/app/models/address.rb +77 -0
- data/spec/app/models/address_component.rb +5 -0
- data/spec/app/models/address_number.rb +6 -0
- data/spec/app/models/agency.rb +5 -0
- data/spec/app/models/agent.rb +12 -0
- data/spec/app/models/album.rb +14 -0
- data/spec/app/models/alert.rb +5 -0
- data/spec/app/models/animal.rb +25 -0
- data/spec/app/models/answer.rb +4 -0
- data/spec/app/models/appointment.rb +7 -0
- data/spec/app/models/article.rb +10 -0
- data/spec/app/models/artist.rb +66 -0
- data/spec/app/models/artwork.rb +4 -0
- data/spec/app/models/audio.rb +5 -0
- data/spec/app/models/augmentation.rb +11 -0
- data/spec/app/models/author.rb +4 -0
- data/spec/app/models/band.rb +26 -0
- data/spec/app/models/bar.rb +10 -0
- data/spec/app/models/basic.rb +6 -0
- data/spec/app/models/bed.rb +1 -0
- data/spec/app/models/big_palette.rb +2 -0
- data/spec/app/models/birthday.rb +13 -0
- data/spec/app/models/book.rb +13 -0
- data/spec/app/models/breed.rb +4 -0
- data/spec/app/models/browser.rb +6 -0
- data/spec/app/models/building.rb +5 -0
- data/spec/app/models/building_address.rb +5 -0
- data/spec/app/models/bus.rb +7 -0
- data/spec/app/models/business.rb +5 -0
- data/spec/app/models/callback_recorder.rb +25 -0
- data/spec/app/models/callback_test.rb +9 -0
- data/spec/app/models/canvas.rb +25 -0
- data/spec/app/models/car.rb +1 -0
- data/spec/app/models/cat.rb +8 -0
- data/spec/app/models/category.rb +8 -0
- data/spec/app/models/child.rb +4 -0
- data/spec/app/models/child_doc.rb +22 -0
- data/spec/app/models/church.rb +4 -0
- data/spec/app/models/circle.rb +3 -0
- data/spec/app/models/circuit.rb +4 -0
- data/spec/app/models/circus.rb +7 -0
- data/spec/app/models/code.rb +5 -0
- data/spec/app/models/comment.rb +16 -0
- data/spec/app/models/contractor.rb +5 -0
- data/spec/app/models/cookie.rb +6 -0
- data/spec/app/models/country_code.rb +8 -0
- data/spec/app/models/definition.rb +7 -0
- data/spec/app/models/description.rb +11 -0
- data/spec/app/models/dictionary.rb +10 -0
- data/spec/app/models/division.rb +10 -0
- data/spec/app/models/doctor.rb +12 -0
- data/spec/app/models/dog.rb +7 -0
- data/spec/app/models/dokument.rb +5 -0
- data/spec/app/models/dragon.rb +4 -0
- data/spec/app/models/driver.rb +7 -0
- data/spec/app/models/drug.rb +6 -0
- data/spec/app/models/dungeon.rb +4 -0
- data/spec/app/models/email.rb +6 -0
- data/spec/app/models/employer.rb +5 -0
- data/spec/app/models/entry.rb +6 -0
- data/spec/app/models/eraser.rb +1 -0
- data/spec/app/models/event.rb +22 -0
- data/spec/app/models/exhibition.rb +4 -0
- data/spec/app/models/exhibitor.rb +5 -0
- data/spec/app/models/eye.rb +9 -0
- data/spec/app/models/eye_bowl.rb +9 -0
- data/spec/app/models/face.rb +8 -0
- data/spec/app/models/favorite.rb +6 -0
- data/spec/app/models/filesystem.rb +5 -0
- data/spec/app/models/fire_hydrant.rb +6 -0
- data/spec/app/models/firefox.rb +4 -0
- data/spec/app/models/fish.rb +7 -0
- data/spec/app/models/folder.rb +7 -0
- data/spec/app/models/folder_item.rb +9 -0
- data/spec/app/models/fruits.rb +28 -0
- data/spec/app/models/game.rb +19 -0
- data/spec/app/models/ghost.rb +7 -0
- data/spec/app/models/home.rb +4 -0
- data/spec/app/models/house.rb +6 -0
- data/spec/app/models/html_writer.rb +3 -0
- data/spec/app/models/image.rb +22 -0
- data/spec/app/models/implant.rb +16 -0
- data/spec/app/models/item.rb +8 -0
- data/spec/app/models/jar.rb +7 -0
- data/spec/app/models/label.rb +40 -0
- data/spec/app/models/language.rb +5 -0
- data/spec/app/models/lat_lng.rb +15 -0
- data/spec/app/models/league.rb +11 -0
- data/spec/app/models/learner.rb +2 -0
- data/spec/app/models/line_item.rb +6 -0
- data/spec/app/models/location.rb +8 -0
- data/spec/app/models/login.rb +8 -0
- data/spec/app/models/manufacturer.rb +7 -0
- data/spec/app/models/meat.rb +4 -0
- data/spec/app/models/membership.rb +4 -0
- data/spec/app/models/mixed_drink.rb +4 -0
- data/spec/app/models/movie.rb +13 -0
- data/spec/app/models/my_hash.rb +2 -0
- data/spec/app/models/name.rb +23 -0
- data/spec/app/models/node.rb +5 -0
- data/spec/app/models/note.rb +12 -0
- data/spec/app/models/ordered_post.rb +6 -0
- data/spec/app/models/ordered_preference.rb +6 -0
- data/spec/app/models/oscar.rb +15 -0
- data/spec/app/models/override.rb +16 -0
- data/spec/app/models/ownable.rb +6 -0
- data/spec/app/models/owner.rb +6 -0
- data/spec/app/models/pack.rb +3 -0
- data/spec/app/models/page.rb +5 -0
- data/spec/app/models/page_question.rb +4 -0
- data/spec/app/models/palette.rb +7 -0
- data/spec/app/models/parent.rb +5 -0
- data/spec/app/models/parent_doc.rb +6 -0
- data/spec/app/models/passport.rb +5 -0
- data/spec/app/models/patient.rb +9 -0
- data/spec/app/models/pdf_writer.rb +3 -0
- data/spec/app/models/pencil.rb +1 -0
- data/spec/app/models/person.rb +205 -0
- data/spec/app/models/pet.rb +23 -0
- data/spec/app/models/pet_owner.rb +6 -0
- data/spec/app/models/phone.rb +11 -0
- data/spec/app/models/pizza.rb +7 -0
- data/spec/app/models/player.rb +35 -0
- data/spec/app/models/post.rb +44 -0
- data/spec/app/models/powerup.rb +11 -0
- data/spec/app/models/preference.rb +9 -0
- data/spec/app/models/princess.rb +8 -0
- data/spec/app/models/product.rb +15 -0
- data/spec/app/models/profile.rb +5 -0
- data/spec/app/models/pronunciation.rb +5 -0
- data/spec/app/models/purchase.rb +4 -0
- data/spec/app/models/question.rb +8 -0
- data/spec/app/models/quiz.rb +7 -0
- data/spec/app/models/rating.rb +8 -0
- data/spec/app/models/record.rb +46 -0
- data/spec/app/models/registry.rb +4 -0
- data/spec/app/models/role.rb +7 -0
- data/spec/app/models/root_category.rb +4 -0
- data/spec/app/models/sandwich.rb +4 -0
- data/spec/app/models/scheduler.rb +7 -0
- data/spec/app/models/seo.rb +7 -0
- data/spec/app/models/series.rb +4 -0
- data/spec/app/models/server.rb +13 -0
- data/spec/app/models/service.rb +22 -0
- data/spec/app/models/shape.rb +12 -0
- data/spec/app/models/shelf.rb +5 -0
- data/spec/app/models/shipping_container.rb +5 -0
- data/spec/app/models/shipping_pack.rb +3 -0
- data/spec/app/models/shop.rb +6 -0
- data/spec/app/models/short_agent.rb +4 -0
- data/spec/app/models/short_quiz.rb +5 -0
- data/spec/app/models/slave.rb +6 -0
- data/spec/app/models/song.rb +8 -0
- data/spec/app/models/sound.rb +5 -0
- data/spec/app/models/square.rb +4 -0
- data/spec/app/models/strategy.rb +3 -0
- data/spec/app/models/sub_item.rb +3 -0
- data/spec/app/models/subscription.rb +4 -0
- data/spec/app/models/survey.rb +5 -0
- data/spec/app/models/symptom.rb +6 -0
- data/spec/app/models/tag.rb +8 -0
- data/spec/app/models/target.rb +5 -0
- data/spec/app/models/template.rb +5 -0
- data/spec/app/models/thing.rb +9 -0
- data/spec/app/models/title.rb +3 -0
- data/spec/app/models/tool.rb +8 -0
- data/spec/app/models/topping.rb +5 -0
- data/spec/app/models/track.rb +38 -0
- data/spec/app/models/translation.rb +5 -0
- data/spec/app/models/tree.rb +9 -0
- data/spec/app/models/truck.rb +3 -0
- data/spec/app/models/user.rb +21 -0
- data/spec/app/models/user_account.rb +10 -0
- data/spec/app/models/validation_callback.rb +10 -0
- data/spec/app/models/vehicle.rb +11 -0
- data/spec/app/models/version.rb +5 -0
- data/spec/app/models/vet_visit.rb +5 -0
- data/spec/app/models/video.rb +13 -0
- data/spec/app/models/weapon.rb +11 -0
- data/spec/app/models/wiki_page.rb +14 -0
- data/spec/app/models/word.rb +15 -0
- data/spec/app/models/word_origin.rb +11 -0
- data/spec/app/models/writer.rb +11 -0
- data/spec/config/mongoid.yml +38 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +456 -0
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +118 -0
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +110 -0
- data/spec/mongoid/atomic/paths/root_spec.rb +48 -0
- data/spec/mongoid/atomic/paths_spec.rb +270 -0
- data/spec/mongoid/atomic_spec.rb +365 -0
- data/spec/mongoid/attributes/nested_spec.rb +4832 -0
- data/spec/mongoid/attributes/readonly_spec.rb +169 -0
- data/spec/mongoid/attributes_spec.rb +1412 -0
- data/spec/mongoid/changeable_spec.rb +1507 -0
- data/spec/mongoid/composable_spec.rb +24 -0
- data/spec/mongoid/config/environment_spec.rb +83 -0
- data/spec/mongoid/config/options_spec.rb +56 -0
- data/spec/mongoid/config_spec.rb +318 -0
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +293 -0
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +455 -0
- data/spec/mongoid/contextual/atomic_spec.rb +529 -0
- data/spec/mongoid/contextual/find_and_modify_spec.rb +220 -0
- data/spec/mongoid/contextual/geo_near_spec.rb +405 -0
- data/spec/mongoid/contextual/map_reduce_spec.rb +464 -0
- data/spec/mongoid/contextual/memory_spec.rb +1236 -0
- data/spec/mongoid/contextual/mongo_spec.rb +1843 -0
- data/spec/mongoid/contextual/text_search_spec.rb +207 -0
- data/spec/mongoid/copyable_spec.rb +393 -0
- data/spec/mongoid/criteria/findable_spec.rb +1189 -0
- data/spec/mongoid/criteria/inspectable_spec.rb +27 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +28 -0
- data/spec/mongoid/criteria/modifiable_spec.rb +1063 -0
- data/spec/mongoid/criteria/scopable_spec.rb +391 -0
- data/spec/mongoid/criteria_spec.rb +3821 -0
- data/spec/mongoid/document_spec.rb +1205 -0
- data/spec/mongoid/equality_spec.rb +241 -0
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +29 -0
- data/spec/mongoid/errors/callback_spec.rb +29 -0
- data/spec/mongoid/errors/delete_restriction_spec.rb +29 -0
- data/spec/mongoid/errors/document_not_found_spec.rb +104 -0
- data/spec/mongoid/errors/eager_load_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_collection_spec.rb +36 -0
- data/spec/mongoid/errors/invalid_config_option_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_field_option_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_field_spec.rb +37 -0
- data/spec/mongoid/errors/invalid_find_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_includes_spec.rb +40 -0
- data/spec/mongoid/errors/invalid_index_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_options_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_path_spec.rb +23 -0
- data/spec/mongoid/errors/invalid_scope_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +17 -0
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_time_spec.rb +29 -0
- data/spec/mongoid/errors/inverse_not_found_spec.rb +29 -0
- data/spec/mongoid/errors/mixed_relations_spec.rb +29 -0
- data/spec/mongoid/errors/mixed_session_configuration_spec.rb +29 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +48 -0
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +29 -0
- data/spec/mongoid/errors/no_environment_spec.rb +29 -0
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +29 -0
- data/spec/mongoid/errors/no_metadata_spec.rb +23 -0
- data/spec/mongoid/errors/no_parent_spec.rb +29 -0
- data/spec/mongoid/errors/no_session_config_spec.rb +29 -0
- data/spec/mongoid/errors/no_session_database_spec.rb +29 -0
- data/spec/mongoid/errors/no_session_hosts_spec.rb +29 -0
- data/spec/mongoid/errors/no_sessions_config_spec.rb +29 -0
- data/spec/mongoid/errors/readonly_attribute_spec.rb +29 -0
- data/spec/mongoid/errors/scope_overwrite_spec.rb +29 -0
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +29 -0
- data/spec/mongoid/errors/unknown_attribute_spec.rb +29 -0
- data/spec/mongoid/errors/unsaved_document_spec.rb +37 -0
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +29 -0
- data/spec/mongoid/errors/validations_spec.rb +45 -0
- data/spec/mongoid/extensions/array_spec.rb +638 -0
- data/spec/mongoid/extensions/big_decimal_spec.rb +104 -0
- data/spec/mongoid/extensions/binary_spec.rb +60 -0
- data/spec/mongoid/extensions/boolean_spec.rb +135 -0
- data/spec/mongoid/extensions/date_spec.rb +235 -0
- data/spec/mongoid/extensions/date_time_spec.rb +155 -0
- data/spec/mongoid/extensions/false_class_spec.rb +42 -0
- data/spec/mongoid/extensions/float_spec.rb +133 -0
- data/spec/mongoid/extensions/hash_spec.rb +333 -0
- data/spec/mongoid/extensions/integer_spec.rb +136 -0
- data/spec/mongoid/extensions/module_spec.rb +42 -0
- data/spec/mongoid/extensions/nil_class_spec.rb +11 -0
- data/spec/mongoid/extensions/object_id_spec.rb +946 -0
- data/spec/mongoid/extensions/object_spec.rb +292 -0
- data/spec/mongoid/extensions/range_spec.rb +105 -0
- data/spec/mongoid/extensions/regexp_spec.rb +47 -0
- data/spec/mongoid/extensions/set_spec.rb +33 -0
- data/spec/mongoid/extensions/string_spec.rb +357 -0
- data/spec/mongoid/extensions/symbol_spec.rb +76 -0
- data/spec/mongoid/extensions/time_spec.rb +467 -0
- data/spec/mongoid/extensions/time_with_zone_spec.rb +405 -0
- data/spec/mongoid/extensions/true_class_spec.rb +42 -0
- data/spec/mongoid/extensions_spec.rb +15 -0
- data/spec/mongoid/factory_spec.rb +185 -0
- data/spec/mongoid/fields/foreign_key_spec.rb +694 -0
- data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +184 -0
- data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +201 -0
- data/spec/mongoid/fields/localized_spec.rb +386 -0
- data/spec/mongoid/fields/standard_spec.rb +166 -0
- data/spec/mongoid/fields_spec.rb +1229 -0
- data/spec/mongoid/findable_spec.rb +342 -0
- data/spec/mongoid/identity_map_spec.rb +564 -0
- data/spec/mongoid/indexable/specification_spec.rb +87 -0
- data/spec/mongoid/indexable_spec.rb +504 -0
- data/spec/mongoid/inspectable_spec.rb +49 -0
- data/spec/mongoid/interceptable_spec.rb +1564 -0
- data/spec/mongoid/loggable_spec.rb +21 -0
- data/spec/mongoid/matchable/all_spec.rb +31 -0
- data/spec/mongoid/matchable/and_spec.rb +162 -0
- data/spec/mongoid/matchable/default_spec.rb +130 -0
- data/spec/mongoid/matchable/exists_spec.rb +57 -0
- data/spec/mongoid/matchable/gt_spec.rb +75 -0
- data/spec/mongoid/matchable/gte_spec.rb +74 -0
- data/spec/mongoid/matchable/in_spec.rb +25 -0
- data/spec/mongoid/matchable/lt_spec.rb +74 -0
- data/spec/mongoid/matchable/lte_spec.rb +74 -0
- data/spec/mongoid/matchable/ne_spec.rb +25 -0
- data/spec/mongoid/matchable/nin_spec.rb +25 -0
- data/spec/mongoid/matchable/or_spec.rb +106 -0
- data/spec/mongoid/matchable/size_spec.rb +25 -0
- data/spec/mongoid/matchable_spec.rb +532 -0
- data/spec/mongoid/persistable/creatable_spec.rb +512 -0
- data/spec/mongoid/persistable/deletable_spec.rb +205 -0
- data/spec/mongoid/persistable/destroyable_spec.rb +148 -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 +432 -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 +522 -0
- data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
- data/spec/mongoid/persistable_spec.rb +206 -0
- data/spec/mongoid/positional_spec.rb +227 -0
- data/spec/mongoid/railties/document_spec.rb +24 -0
- data/spec/mongoid/relations/accessors_spec.rb +736 -0
- data/spec/mongoid/relations/auto_save_spec.rb +261 -0
- data/spec/mongoid/relations/bindings/embedded/in_spec.rb +171 -0
- data/spec/mongoid/relations/bindings/embedded/many_spec.rb +54 -0
- data/spec/mongoid/relations/bindings/embedded/one_spec.rb +77 -0
- data/spec/mongoid/relations/bindings/referenced/in_spec.rb +241 -0
- data/spec/mongoid/relations/bindings/referenced/many_spec.rb +153 -0
- data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +178 -0
- data/spec/mongoid/relations/bindings/referenced/one_spec.rb +131 -0
- data/spec/mongoid/relations/builders/embedded/in_spec.rb +34 -0
- data/spec/mongoid/relations/builders/embedded/many_spec.rb +132 -0
- data/spec/mongoid/relations/builders/embedded/one_spec.rb +99 -0
- data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +234 -0
- data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +250 -0
- data/spec/mongoid/relations/builders/referenced/in_spec.rb +241 -0
- data/spec/mongoid/relations/builders/referenced/many_spec.rb +137 -0
- data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +178 -0
- data/spec/mongoid/relations/builders/referenced/one_spec.rb +124 -0
- data/spec/mongoid/relations/builders_spec.rb +226 -0
- data/spec/mongoid/relations/cascading/delete_spec.rb +101 -0
- data/spec/mongoid/relations/cascading/destroy_spec.rb +47 -0
- data/spec/mongoid/relations/cascading/nullify_spec.rb +32 -0
- data/spec/mongoid/relations/cascading/restrict_spec.rb +68 -0
- data/spec/mongoid/relations/cascading_spec.rb +355 -0
- data/spec/mongoid/relations/constraint_spec.rb +74 -0
- data/spec/mongoid/relations/conversions_spec.rb +126 -0
- data/spec/mongoid/relations/counter_cache_spec.rb +205 -0
- data/spec/mongoid/relations/cyclic_spec.rb +156 -0
- data/spec/mongoid/relations/embedded/dirty_spec.rb +65 -0
- data/spec/mongoid/relations/embedded/in_spec.rb +579 -0
- data/spec/mongoid/relations/embedded/many_spec.rb +3781 -0
- data/spec/mongoid/relations/embedded/one_spec.rb +1014 -0
- data/spec/mongoid/relations/macros_spec.rb +613 -0
- data/spec/mongoid/relations/metadata_spec.rb +1917 -0
- data/spec/mongoid/relations/options_spec.rb +35 -0
- data/spec/mongoid/relations/polymorphic_spec.rb +128 -0
- data/spec/mongoid/relations/proxy_spec.rb +48 -0
- data/spec/mongoid/relations/referenced/in_spec.rb +1435 -0
- data/spec/mongoid/relations/referenced/many_spec.rb +3546 -0
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +3556 -0
- data/spec/mongoid/relations/referenced/one_spec.rb +1289 -0
- data/spec/mongoid/relations/reflections_spec.rb +101 -0
- data/spec/mongoid/relations/synchronization_spec.rb +449 -0
- data/spec/mongoid/relations/targets/enumerable_spec.rb +1710 -0
- data/spec/mongoid/relations/touchable_spec.rb +296 -0
- data/spec/mongoid/relations_spec.rb +188 -0
- data/spec/mongoid/reloadable_spec.rb +305 -0
- data/spec/mongoid/scopable_spec.rb +926 -0
- data/spec/mongoid/selectable_spec.rb +134 -0
- data/spec/mongoid/serializable_spec.rb +862 -0
- data/spec/mongoid/sessions/factory_spec.rb +312 -0
- data/spec/mongoid/sessions/mongo_uri_spec.rb +103 -0
- data/spec/mongoid/sessions/options_spec.rb +71 -0
- data/spec/mongoid/sessions_spec.rb +1078 -0
- data/spec/mongoid/shardable_spec.rb +61 -0
- data/spec/mongoid/state_spec.rb +102 -0
- data/spec/mongoid/threaded_spec.rb +258 -0
- data/spec/mongoid/timestamps/created/short_spec.rb +51 -0
- data/spec/mongoid/timestamps/created_spec.rb +44 -0
- data/spec/mongoid/timestamps/updated/short_spec.rb +90 -0
- data/spec/mongoid/timestamps/updated_spec.rb +86 -0
- data/spec/mongoid/timestamps_spec.rb +112 -0
- data/spec/mongoid/traversable_spec.rb +244 -0
- data/spec/mongoid/unit_of_work_spec.rb +196 -0
- data/spec/mongoid/validatable/associated_spec.rb +183 -0
- data/spec/mongoid/validatable/format_spec.rb +83 -0
- data/spec/mongoid/validatable/length_spec.rb +119 -0
- data/spec/mongoid/validatable/numericality_spec.rb +30 -0
- data/spec/mongoid/validatable/presence_spec.rb +511 -0
- data/spec/mongoid/validatable/uniqueness_spec.rb +2305 -0
- data/spec/mongoid/validatable_spec.rb +309 -0
- data/spec/mongoid_spec.rb +74 -0
- data/spec/rack/mongoid/middleware/identity_map_spec.rb +72 -0
- data/spec/rails/mongoid_spec.rb +462 -0
- data/spec/spec_helper.rb +103 -0
- metadata +1159 -0
@@ -0,0 +1,115 @@
|
|
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, :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
|
40
|
+
end
|
41
|
+
|
42
|
+
# Get an array of the fields, in order, that are part of the index.
|
43
|
+
#
|
44
|
+
# @example Get the index fields.
|
45
|
+
# specification.fields
|
46
|
+
#
|
47
|
+
# @return [ Array<Symbol> ] The names of the fields.
|
48
|
+
#
|
49
|
+
# @since 4.0.0
|
50
|
+
def fields
|
51
|
+
key.keys
|
52
|
+
end
|
53
|
+
|
54
|
+
# Instantiate a new index specification.
|
55
|
+
#
|
56
|
+
# @example Create the new specification.
|
57
|
+
# Specification.new(Band, { name: 1 }, background: true)
|
58
|
+
#
|
59
|
+
# @param [ Class ] klass The class the index is defined on.
|
60
|
+
# @param [ Hash ] key The hash of name/direction pairs.
|
61
|
+
# @param [ Hash ] opts the index options.
|
62
|
+
#
|
63
|
+
# @since 4.0.0
|
64
|
+
def initialize(klass, key, opts = nil)
|
65
|
+
options = opts || {}
|
66
|
+
Validators::Options.validate(klass, key, options)
|
67
|
+
@klass = klass
|
68
|
+
@key = normalize_key(key)
|
69
|
+
@options = normalize_options(options.dup)
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
# Normalize the spec, in case aliased fields are provided.
|
75
|
+
#
|
76
|
+
# @api private
|
77
|
+
#
|
78
|
+
# @example Normalize the spec.
|
79
|
+
# specification.normalize_key(name: 1)
|
80
|
+
#
|
81
|
+
# @param [ Hash ] key The index key(s).
|
82
|
+
#
|
83
|
+
# @return [ Hash ] The normalized specification.
|
84
|
+
#
|
85
|
+
# @since 4.0.0
|
86
|
+
def normalize_key(key)
|
87
|
+
normalized = {}
|
88
|
+
key.each_pair do |name, direction|
|
89
|
+
normalized[klass.database_field_name(name).to_sym] = direction
|
90
|
+
end
|
91
|
+
normalized
|
92
|
+
end
|
93
|
+
|
94
|
+
# Normalize the index options, if any are provided.
|
95
|
+
#
|
96
|
+
# @api private
|
97
|
+
#
|
98
|
+
# @example Normalize the index options.
|
99
|
+
# specification.normalize_options(drop_dups: true)
|
100
|
+
#
|
101
|
+
# @param [ Hash ] options The index options.
|
102
|
+
#
|
103
|
+
# @return [ Hash ] The normalized options.
|
104
|
+
#
|
105
|
+
# @since 4.0.0
|
106
|
+
def normalize_options(opts)
|
107
|
+
options = {}
|
108
|
+
opts.each_pair do |option, value|
|
109
|
+
options[MAPPINGS[option] || option] = value
|
110
|
+
end
|
111
|
+
options
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Indexable
|
4
|
+
module Validators
|
5
|
+
|
6
|
+
# Validates the options passed to the index macro.
|
7
|
+
module Options
|
8
|
+
extend self
|
9
|
+
|
10
|
+
VALID_OPTIONS = [
|
11
|
+
:background,
|
12
|
+
:database,
|
13
|
+
:default_language,
|
14
|
+
:drop_dups,
|
15
|
+
:name,
|
16
|
+
:sparse,
|
17
|
+
:unique,
|
18
|
+
:max,
|
19
|
+
:min,
|
20
|
+
:bits,
|
21
|
+
:bucket_size,
|
22
|
+
:expire_after_seconds,
|
23
|
+
:weights
|
24
|
+
]
|
25
|
+
|
26
|
+
VALID_TYPES = [
|
27
|
+
1,
|
28
|
+
-1,
|
29
|
+
"2d",
|
30
|
+
"2dsphere",
|
31
|
+
"geoHaystack",
|
32
|
+
"text",
|
33
|
+
"hashed"
|
34
|
+
]
|
35
|
+
|
36
|
+
# Validate the index specification.
|
37
|
+
#
|
38
|
+
# @example Validate the index spec.
|
39
|
+
# Options.validate(Band, name: 1)
|
40
|
+
#
|
41
|
+
# @param [ Class ] klass The model class.
|
42
|
+
# @param [ Hash ] spec The index specification.
|
43
|
+
# @param [ Hash ] options The index options.
|
44
|
+
#
|
45
|
+
# @raise [ Errors::InvalidIndex ] If validation failed.
|
46
|
+
#
|
47
|
+
# @since 3.0.0
|
48
|
+
def validate(klass, spec, options)
|
49
|
+
validate_spec(klass, spec, options)
|
50
|
+
validate_options(klass, spec, options)
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
# Validates the options of the index spec.
|
56
|
+
#
|
57
|
+
# @api private
|
58
|
+
#
|
59
|
+
# @example Validate the options.
|
60
|
+
# Options.validate_options(Band, name: 1)
|
61
|
+
#
|
62
|
+
# @param [ Class ] klass The model class.
|
63
|
+
# @param [ Hash ] spec The index specification.
|
64
|
+
# @param [ Hash ] options The index options.
|
65
|
+
#
|
66
|
+
# @raise [ Errors::InvalidIndex ] If validation failed.
|
67
|
+
#
|
68
|
+
# @since 3.0.0
|
69
|
+
def validate_options(klass, spec, options)
|
70
|
+
options.each_pair do |name, value|
|
71
|
+
unless VALID_OPTIONS.include?(name)
|
72
|
+
raise Errors::InvalidIndex.new(klass, spec, options)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# Validates the index spec.
|
78
|
+
#
|
79
|
+
# @api private
|
80
|
+
#
|
81
|
+
# @example Validate the spec.
|
82
|
+
# Options.validate_spec(Band, name: 1)
|
83
|
+
#
|
84
|
+
# @param [ Class ] klass The model class.
|
85
|
+
# @param [ Hash ] spec The index specification.
|
86
|
+
# @param [ Hash ] options The index options.
|
87
|
+
#
|
88
|
+
# @raise [ Errors::InvalidIndex ] If validation failed.
|
89
|
+
#
|
90
|
+
# @since 3.0.0
|
91
|
+
def validate_spec(klass, spec, options)
|
92
|
+
raise Errors::InvalidIndex.new(klass, spec, options) if !spec.is_a?(::Hash)
|
93
|
+
spec.each_pair do |name, value|
|
94
|
+
next if name == :options
|
95
|
+
unless VALID_TYPES.include?(value)
|
96
|
+
raise Errors::InvalidIndex.new(klass, spec, options)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
|
4
|
+
# Contains the bahviour around inspecting documents via inspect.
|
5
|
+
#
|
6
|
+
# @since 4.0.0
|
7
|
+
module Inspectable
|
8
|
+
|
9
|
+
# Returns the class name plus its attributes. If using dynamic fields will
|
10
|
+
# include those as well.
|
11
|
+
#
|
12
|
+
# @example Inspect the document.
|
13
|
+
# person.inspect
|
14
|
+
#
|
15
|
+
# @return [ String ] A nice pretty string to look at.
|
16
|
+
#
|
17
|
+
# @since 1.0.0
|
18
|
+
def inspect
|
19
|
+
inspection = []
|
20
|
+
inspection.concat(inspect_fields).concat(inspect_dynamic_fields)
|
21
|
+
"#<#{self.class.name} _id: #{id}, #{inspection * ', '}>"
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
# Get an array of inspected fields for the document.
|
27
|
+
#
|
28
|
+
# @api private
|
29
|
+
#
|
30
|
+
# @example Inspect the defined fields.
|
31
|
+
# document.inspect_fields
|
32
|
+
#
|
33
|
+
# @return [ String ] An array of pretty printed field values.
|
34
|
+
#
|
35
|
+
# @since 1.0.0
|
36
|
+
def inspect_fields
|
37
|
+
fields.map do |name, field|
|
38
|
+
unless name == "_id"
|
39
|
+
as = field.options[:as]
|
40
|
+
"#{name}#{as ? "(#{as})" : nil}: #{@attributes[name].inspect}"
|
41
|
+
end
|
42
|
+
end.compact
|
43
|
+
end
|
44
|
+
|
45
|
+
# Get an array of inspected dynamic fields for the document.
|
46
|
+
#
|
47
|
+
# @api private
|
48
|
+
#
|
49
|
+
# @example Inspect the dynamic fields.
|
50
|
+
# document.inspect_dynamic_fields
|
51
|
+
#
|
52
|
+
# @return [ String ] An array of pretty printed dynamic field values.
|
53
|
+
#
|
54
|
+
# @since 1.0.0
|
55
|
+
def inspect_dynamic_fields
|
56
|
+
[]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,265 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
|
4
|
+
# This module contains all the callback hooks for Mongoid.
|
5
|
+
#
|
6
|
+
# @since 4.0.0
|
7
|
+
module Interceptable
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
CALLBACKS = [
|
11
|
+
:after_build,
|
12
|
+
:after_create,
|
13
|
+
:after_destroy,
|
14
|
+
:after_find,
|
15
|
+
:after_initialize,
|
16
|
+
:after_save,
|
17
|
+
:after_touch,
|
18
|
+
:after_update,
|
19
|
+
:after_upsert,
|
20
|
+
:after_validation,
|
21
|
+
:around_create,
|
22
|
+
:around_destroy,
|
23
|
+
:around_save,
|
24
|
+
:around_update,
|
25
|
+
:around_upsert,
|
26
|
+
:before_create,
|
27
|
+
:before_destroy,
|
28
|
+
:before_save,
|
29
|
+
:before_update,
|
30
|
+
:before_upsert,
|
31
|
+
:before_validation
|
32
|
+
].freeze
|
33
|
+
|
34
|
+
included do
|
35
|
+
extend ActiveModel::Callbacks
|
36
|
+
include ActiveModel::Validations::Callbacks
|
37
|
+
|
38
|
+
define_model_callbacks :build, :find, :initialize, :touch, only: :after
|
39
|
+
define_model_callbacks :create, :destroy, :save, :update, :upsert
|
40
|
+
|
41
|
+
attr_accessor :before_callback_halted
|
42
|
+
end
|
43
|
+
|
44
|
+
# Is the provided type of callback executable by this document?
|
45
|
+
#
|
46
|
+
# @example Is the callback executable?
|
47
|
+
# document.callback_executable?(:save)
|
48
|
+
#
|
49
|
+
# @param [ Symbol ] kin The type of callback.
|
50
|
+
#
|
51
|
+
# @return [ true, false ] If the callback can be executed.
|
52
|
+
#
|
53
|
+
# @since 3.0.6
|
54
|
+
def callback_executable?(kind)
|
55
|
+
respond_to?("_#{kind}_callbacks")
|
56
|
+
end
|
57
|
+
|
58
|
+
# Is the document currently in a state that could potentially require
|
59
|
+
# callbacks to be executed?
|
60
|
+
#
|
61
|
+
# @example Is the document in a callback state?
|
62
|
+
# document.in_callback_state?(:update)
|
63
|
+
#
|
64
|
+
# @param [ Symbol ] kind The callback kind.
|
65
|
+
#
|
66
|
+
# @return [ true, false ] If the document is in a callback state.
|
67
|
+
#
|
68
|
+
# @since 3.1.0
|
69
|
+
def in_callback_state?(kind)
|
70
|
+
[ :create, :destroy ].include?(kind) || new_record? || flagged_for_destroy? || changed?
|
71
|
+
end
|
72
|
+
|
73
|
+
# Run only the after callbacks for the specific event.
|
74
|
+
#
|
75
|
+
# @note ActiveSupport does not allow this type of behaviour by default, so
|
76
|
+
# Mongoid has to get around it and implement itself.
|
77
|
+
#
|
78
|
+
# @example Run only the after save callbacks.
|
79
|
+
# model.run_after_callbacks(:save)
|
80
|
+
#
|
81
|
+
# @param [ Array<Symbol> ] kinds The events that are occurring.
|
82
|
+
#
|
83
|
+
# @return [ Object ] The result of the chain executing.
|
84
|
+
#
|
85
|
+
# @since 3.0.0
|
86
|
+
def run_after_callbacks(*kinds)
|
87
|
+
kinds.each do |kind|
|
88
|
+
run_targeted_callbacks(:after, kind)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# Run only the before callbacks for the specific event.
|
93
|
+
#
|
94
|
+
# @note ActiveSupport does not allow this type of behaviour by default, so
|
95
|
+
# Mongoid has to get around it and implement itself.
|
96
|
+
#
|
97
|
+
# @example Run only the before save callbacks.
|
98
|
+
# model.run_before_callbacks(:save, :create)
|
99
|
+
#
|
100
|
+
# @param [ Array<Symbol> ] kinds The events that are occurring.
|
101
|
+
#
|
102
|
+
# @return [ Object ] The result of the chain executing.
|
103
|
+
#
|
104
|
+
# @since 3.0.0
|
105
|
+
def run_before_callbacks(*kinds)
|
106
|
+
kinds.each do |kind|
|
107
|
+
run_targeted_callbacks(:before, kind)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
# Run the callbacks for the document. This overrides active support's
|
112
|
+
# functionality to cascade callbacks to embedded documents that have been
|
113
|
+
# flagged as such.
|
114
|
+
#
|
115
|
+
# @example Run the callbacks.
|
116
|
+
# run_callbacks :save do
|
117
|
+
# save!
|
118
|
+
# end
|
119
|
+
#
|
120
|
+
# @param [ Symbol ] kind The type of callback to execute.
|
121
|
+
# @param [ Array ] *args Any options.
|
122
|
+
#
|
123
|
+
# @return [ Document ] The document
|
124
|
+
#
|
125
|
+
# @since 2.3.0
|
126
|
+
def run_callbacks(kind, *args, &block)
|
127
|
+
cascadable_children(kind).each do |child|
|
128
|
+
unless child.run_callbacks(child_callback_type(kind, child), *args)
|
129
|
+
return false
|
130
|
+
end
|
131
|
+
end
|
132
|
+
callback_executable?(kind) ? super(kind, *args, &block) : true
|
133
|
+
end
|
134
|
+
|
135
|
+
private
|
136
|
+
|
137
|
+
# We need to hook into this for autosave, since we don't want it firing if
|
138
|
+
# the before callbacks were halted.
|
139
|
+
#
|
140
|
+
# @api private
|
141
|
+
#
|
142
|
+
# @example Was a before callback halted?
|
143
|
+
# document.before_callback_halted?
|
144
|
+
#
|
145
|
+
# @return [ true, false ] If a before callback was halted.
|
146
|
+
#
|
147
|
+
# @since 3.0.3
|
148
|
+
def before_callback_halted?
|
149
|
+
!!@before_callback_halted
|
150
|
+
end
|
151
|
+
|
152
|
+
# Get all the child embedded documents that are flagged as cascadable.
|
153
|
+
#
|
154
|
+
# @example Get all the cascading children.
|
155
|
+
# document.cascadable_children(:update)
|
156
|
+
#
|
157
|
+
# @param [ Symbol ] kind The type of callback.
|
158
|
+
#
|
159
|
+
# @return [ Array<Document> ] The children.
|
160
|
+
#
|
161
|
+
# @since 2.3.0
|
162
|
+
def cascadable_children(kind, children = Set.new)
|
163
|
+
embedded_relations.each_pair do |name, metadata|
|
164
|
+
next unless metadata.cascading_callbacks?
|
165
|
+
without_autobuild do
|
166
|
+
delayed_pulls = delayed_atomic_pulls[name]
|
167
|
+
delayed_unsets = delayed_atomic_unsets[name]
|
168
|
+
children.merge(delayed_pulls) if delayed_pulls
|
169
|
+
children.merge(delayed_unsets) if delayed_unsets
|
170
|
+
relation = send(name)
|
171
|
+
Array.wrap(relation).each do |child|
|
172
|
+
next if children.include?(child)
|
173
|
+
children.add(child) if cascadable_child?(kind, child)
|
174
|
+
child.send(:cascadable_children, kind, children)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
children.to_a
|
179
|
+
end
|
180
|
+
|
181
|
+
# Determine if the child should fire the callback.
|
182
|
+
#
|
183
|
+
# @example Should the child fire the callback?
|
184
|
+
# document.cascadable_child?(:update, doc)
|
185
|
+
#
|
186
|
+
# @param [ Symbol ] kind The type of callback.
|
187
|
+
# @param [ Document ] child The child document.
|
188
|
+
#
|
189
|
+
# @return [ true, false ] If the child should fire the callback.
|
190
|
+
#
|
191
|
+
# @since 2.3.0
|
192
|
+
def cascadable_child?(kind, child)
|
193
|
+
if kind == :initialize || kind == :find
|
194
|
+
return false
|
195
|
+
end
|
196
|
+
child.callback_executable?(kind) ? child.in_callback_state?(kind) : false
|
197
|
+
end
|
198
|
+
|
199
|
+
# Get the name of the callback that the child should fire. This changes
|
200
|
+
# depending on whether or not the child is new. A persisted parent with a
|
201
|
+
# new child would fire :update from the parent, but needs to fire :create
|
202
|
+
# on the child.
|
203
|
+
#
|
204
|
+
# @example Get the callback type.
|
205
|
+
# document.child_callback_type(:update, doc)
|
206
|
+
#
|
207
|
+
# @param [ Symbol ] kind The type of callback.
|
208
|
+
# @param [ Document ] child The child document
|
209
|
+
#
|
210
|
+
# @return [ Symbol ] The name of the callback.
|
211
|
+
#
|
212
|
+
# @since 2.3.0
|
213
|
+
def child_callback_type(kind, child)
|
214
|
+
if kind == :update
|
215
|
+
return :create if child.new_record?
|
216
|
+
return :destroy if child.flagged_for_destroy?
|
217
|
+
kind
|
218
|
+
else
|
219
|
+
kind
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
# We need to hook into this for autosave, since we don't want it firing if
|
224
|
+
# the before callbacks were halted.
|
225
|
+
#
|
226
|
+
# @api private
|
227
|
+
#
|
228
|
+
# @example Hook into the halt.
|
229
|
+
# document.halted_callback_hook(filter)
|
230
|
+
#
|
231
|
+
# @param [ Symbol ] filter The callback that halted.
|
232
|
+
#
|
233
|
+
# @since 3.0.3
|
234
|
+
def halted_callback_hook(filter)
|
235
|
+
@before_callback_halted = true
|
236
|
+
end
|
237
|
+
|
238
|
+
# Run only the callbacks for the target location (before, after, around)
|
239
|
+
# and kind (save, update, create).
|
240
|
+
#
|
241
|
+
# @example Run the targeted callbacks.
|
242
|
+
# model.run_targeted_callbacks(:before, :save)
|
243
|
+
#
|
244
|
+
# @param [ Symbol ] place The time to run, :before, :after, :around.
|
245
|
+
# @param [ Symbol ] kind The type of callback, :save, :create, :update.
|
246
|
+
#
|
247
|
+
# @return [ Object ] The result of the chain execution.
|
248
|
+
#
|
249
|
+
# @since 3.0.0
|
250
|
+
def run_targeted_callbacks(place, kind)
|
251
|
+
name = "_run__#{place}__#{kind}__callbacks"
|
252
|
+
unless respond_to?(name)
|
253
|
+
chain = ActiveSupport::Callbacks::CallbackChain.new(name, {})
|
254
|
+
send("_#{kind}_callbacks").each do |callback|
|
255
|
+
chain.push(callback) if callback.kind == place
|
256
|
+
end
|
257
|
+
class_eval <<-EOM
|
258
|
+
def #{name}() #{chain.compile} end
|
259
|
+
protected :#{name}
|
260
|
+
EOM
|
261
|
+
end
|
262
|
+
send(name)
|
263
|
+
end
|
264
|
+
end
|
265
|
+
end
|