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
data/lib/mongoid.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "support/ruby_version"
|
3
|
+
|
4
|
+
require "delegate"
|
5
|
+
require "time"
|
6
|
+
require "set"
|
7
|
+
|
8
|
+
require "active_support/core_ext"
|
9
|
+
require "active_support/json"
|
10
|
+
require "active_support/inflector"
|
11
|
+
require "active_support/time_with_zone"
|
12
|
+
require "active_model"
|
13
|
+
|
14
|
+
require "origin"
|
15
|
+
require "moped"
|
16
|
+
|
17
|
+
require "mongoid/version"
|
18
|
+
require "mongoid/config"
|
19
|
+
require "mongoid/loggable"
|
20
|
+
require "mongoid/sessions"
|
21
|
+
require "mongoid/document"
|
22
|
+
require "mongoid/unit_of_work"
|
23
|
+
|
24
|
+
# If we are using Rails then we will include the Mongoid railtie. This has all
|
25
|
+
# the nifty initializers that Mongoid needs.
|
26
|
+
if defined?(Rails)
|
27
|
+
require "mongoid/railtie"
|
28
|
+
end
|
29
|
+
|
30
|
+
# If we are using any Rack based application then we need the Mongoid rack
|
31
|
+
# middleware to ensure our app is running properly.
|
32
|
+
if defined?(Rack)
|
33
|
+
require "rack/mongoid"
|
34
|
+
end
|
35
|
+
|
36
|
+
# add english load path by default
|
37
|
+
I18n.load_path << File.join(File.dirname(__FILE__), "config", "locales", "en.yml")
|
38
|
+
|
39
|
+
module Mongoid
|
40
|
+
extend Loggable
|
41
|
+
extend UnitOfWork
|
42
|
+
extend self
|
43
|
+
|
44
|
+
MONGODB_VERSION = "2.2.0"
|
45
|
+
|
46
|
+
# Sets the Mongoid configuration options. Best used by passing a block.
|
47
|
+
#
|
48
|
+
# @example Set up configuration options.
|
49
|
+
# Mongoid.configure do |config|
|
50
|
+
# config.use(name: "mongoid_test", host: "localhost", port: 27017)
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
# @return [ Config ] The configuration object.
|
54
|
+
#
|
55
|
+
# @since 1.0.0
|
56
|
+
def configure
|
57
|
+
block_given? ? yield(Config) : Config
|
58
|
+
end
|
59
|
+
|
60
|
+
# Convenience method for getting the default session.
|
61
|
+
#
|
62
|
+
# @example Get the default session.
|
63
|
+
# Mongoid.default_session
|
64
|
+
#
|
65
|
+
# @return [ Moped::Session ] The default session.
|
66
|
+
#
|
67
|
+
# @since 3.0.0
|
68
|
+
def default_session
|
69
|
+
Sessions.default
|
70
|
+
end
|
71
|
+
|
72
|
+
# Disconnect all active sessions.
|
73
|
+
#
|
74
|
+
# @example Disconnect all active sessions.
|
75
|
+
# Mongoid.disconnect_sessions
|
76
|
+
#
|
77
|
+
# @return [ true ] True.
|
78
|
+
#
|
79
|
+
# @since 3.1.0
|
80
|
+
def disconnect_sessions
|
81
|
+
Sessions.disconnect
|
82
|
+
end
|
83
|
+
|
84
|
+
# Convenience method for getting a named session.
|
85
|
+
#
|
86
|
+
# @example Get a named session.
|
87
|
+
# Mongoid.session(:default)
|
88
|
+
#
|
89
|
+
# @return [ Moped::Session ] The named session.
|
90
|
+
#
|
91
|
+
# @since 3.0.0
|
92
|
+
def session(name)
|
93
|
+
Sessions.with_name(name)
|
94
|
+
end
|
95
|
+
|
96
|
+
# Take all the public instance methods from the Config singleton and allow
|
97
|
+
# them to be accessed through the Mongoid module directly.
|
98
|
+
#
|
99
|
+
# @example Delegate the configuration methods.
|
100
|
+
# Mongoid.database = Mongo::Connection.new.db("test")
|
101
|
+
#
|
102
|
+
# @since 1.0.0
|
103
|
+
delegate(*(Config.public_instance_methods(false) - [ :logger=, :logger ] << { to: Config }))
|
104
|
+
end
|
@@ -0,0 +1,384 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "mongoid/atomic/modifiers"
|
3
|
+
require "mongoid/atomic/paths"
|
4
|
+
|
5
|
+
module Mongoid
|
6
|
+
|
7
|
+
# This module contains the logic for supporting atomic operations against the
|
8
|
+
# database.
|
9
|
+
module Atomic
|
10
|
+
extend ActiveSupport::Concern
|
11
|
+
|
12
|
+
UPDATES = [
|
13
|
+
:atomic_array_pushes,
|
14
|
+
:atomic_array_pulls,
|
15
|
+
:atomic_array_add_to_sets,
|
16
|
+
:atomic_pulls,
|
17
|
+
:delayed_atomic_sets,
|
18
|
+
:delayed_atomic_pulls,
|
19
|
+
:delayed_atomic_unsets
|
20
|
+
]
|
21
|
+
|
22
|
+
included do
|
23
|
+
|
24
|
+
# When MongoDB finally fully implements the positional operator, we can
|
25
|
+
# get rid of all indexing related code in Mongoid.
|
26
|
+
attr_accessor :_index
|
27
|
+
end
|
28
|
+
|
29
|
+
# Add the document as an atomic pull.
|
30
|
+
#
|
31
|
+
# @example Add the atomic pull.
|
32
|
+
# person.add_atomic_pull(address)
|
33
|
+
#
|
34
|
+
# @param [ Document ] The embedded document to pull.
|
35
|
+
#
|
36
|
+
# @since 2.2.0
|
37
|
+
def add_atomic_pull(document)
|
38
|
+
document.flagged_for_destroy = true
|
39
|
+
(delayed_atomic_pulls[document.metadata_name.to_s] ||= []).push(document)
|
40
|
+
end
|
41
|
+
|
42
|
+
# Add an atomic unset for the document.
|
43
|
+
#
|
44
|
+
# @example Add an atomic unset.
|
45
|
+
# document.add_atomic_unset(doc)
|
46
|
+
#
|
47
|
+
# @param [ Document ] document The child document.
|
48
|
+
#
|
49
|
+
# @return [ Array<Document> ] The children.
|
50
|
+
#
|
51
|
+
# @since 3.0.0
|
52
|
+
def add_atomic_unset(document)
|
53
|
+
document.flagged_for_destroy = true
|
54
|
+
(delayed_atomic_unsets[document.metadata_name.to_s] ||= []).push(document)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Returns path of the attribute for modification
|
58
|
+
#
|
59
|
+
# @example Get path of the attribute
|
60
|
+
# address.atomic_attribute_name(:city)
|
61
|
+
#
|
62
|
+
# @return [ String ] The path to the document attribute in the database
|
63
|
+
#
|
64
|
+
# @since 3.0.0
|
65
|
+
def atomic_attribute_name(name)
|
66
|
+
embedded? ? "#{atomic_position}.#{name}" : name
|
67
|
+
end
|
68
|
+
|
69
|
+
# For array fields these are the pushes that need to happen.
|
70
|
+
#
|
71
|
+
# @example Get the array pushes.
|
72
|
+
# person.atomic_array_pushes
|
73
|
+
#
|
74
|
+
# @return [ Hash ] The array pushes.
|
75
|
+
#
|
76
|
+
# @since 2.4.0
|
77
|
+
def atomic_array_pushes
|
78
|
+
@atomic_array_pushes ||= {}
|
79
|
+
end
|
80
|
+
|
81
|
+
# For array fields these are the pulls that need to happen.
|
82
|
+
#
|
83
|
+
# @example Get the array pulls.
|
84
|
+
# person.atomic_array_pulls
|
85
|
+
#
|
86
|
+
# @return [ Hash ] The array pulls.
|
87
|
+
#
|
88
|
+
# @since 2.4.0
|
89
|
+
def atomic_array_pulls
|
90
|
+
@atomic_array_pulls ||= {}
|
91
|
+
end
|
92
|
+
|
93
|
+
# For array fields these are the unique adds that need to happen.
|
94
|
+
#
|
95
|
+
# @example Get the array unique adds.
|
96
|
+
# person.atomic_array_add_to_sets
|
97
|
+
#
|
98
|
+
# @return [ Hash ] The array add_to_sets.
|
99
|
+
#
|
100
|
+
# @since 2.4.0
|
101
|
+
def atomic_array_add_to_sets
|
102
|
+
@atomic_array_add_to_sets ||= {}
|
103
|
+
end
|
104
|
+
|
105
|
+
# Get all the atomic updates that need to happen for the current
|
106
|
+
# +Document+. This includes all changes that need to happen in the
|
107
|
+
# entire hierarchy that exists below where the save call was made.
|
108
|
+
#
|
109
|
+
# @note MongoDB does not allow "conflicting modifications" to be
|
110
|
+
# performed in a single operation. Conflicting modifications are
|
111
|
+
# detected by the 'haveConflictingMod' function in MongoDB.
|
112
|
+
# Examination of the code suggests that two modifications (a $set
|
113
|
+
# and a $pushAll, for example) conflict if:
|
114
|
+
# (1) the key paths being modified are equal.
|
115
|
+
# (2) one key path is a prefix of the other.
|
116
|
+
# So a $set of 'addresses.0.street' will conflict with a $pushAll
|
117
|
+
# to 'addresses', and we will need to split our update into two
|
118
|
+
# pieces. We do not, however, attempt to match MongoDB's logic
|
119
|
+
# exactly. Instead, we assume that two updates conflict if the
|
120
|
+
# first component of the two key paths matches.
|
121
|
+
#
|
122
|
+
# @example Get the updates that need to occur.
|
123
|
+
# person.atomic_updates(children)
|
124
|
+
#
|
125
|
+
# @return [ Hash ] The updates and their modifiers.
|
126
|
+
#
|
127
|
+
# @since 2.1.0
|
128
|
+
def atomic_updates(use_indexes = false)
|
129
|
+
process_flagged_destroys
|
130
|
+
mods = Modifiers.new
|
131
|
+
generate_atomic_updates(mods, self)
|
132
|
+
_children.each do |child|
|
133
|
+
child.process_flagged_destroys
|
134
|
+
generate_atomic_updates(mods, child)
|
135
|
+
end
|
136
|
+
mods
|
137
|
+
end
|
138
|
+
alias :_updates :atomic_updates
|
139
|
+
|
140
|
+
# Get the removal modifier for the document. Will be nil on root
|
141
|
+
# documents, $unset on embeds_one, $set on embeds_many.
|
142
|
+
#
|
143
|
+
# @example Get the removal operator.
|
144
|
+
# name.atomic_delete_modifier
|
145
|
+
#
|
146
|
+
# @return [ String ] The pull or unset operation.
|
147
|
+
def atomic_delete_modifier
|
148
|
+
atomic_paths.delete_modifier
|
149
|
+
end
|
150
|
+
|
151
|
+
# Get the insertion modifier for the document. Will be nil on root
|
152
|
+
# documents, $set on embeds_one, $push on embeds_many.
|
153
|
+
#
|
154
|
+
# @example Get the insert operation.
|
155
|
+
# name.atomic_insert_modifier
|
156
|
+
#
|
157
|
+
# @return [ String ] The pull or set operator.
|
158
|
+
def atomic_insert_modifier
|
159
|
+
atomic_paths.insert_modifier
|
160
|
+
end
|
161
|
+
|
162
|
+
# Return the path to this +Document+ in JSON notation, used for atomic
|
163
|
+
# updates via $set in MongoDB.
|
164
|
+
#
|
165
|
+
# @example Get the path to this document.
|
166
|
+
# address.atomic_path
|
167
|
+
#
|
168
|
+
# @return [ String ] The path to the document in the database.
|
169
|
+
def atomic_path
|
170
|
+
atomic_paths.path
|
171
|
+
end
|
172
|
+
|
173
|
+
# Returns the positional operator of this document for modification.
|
174
|
+
#
|
175
|
+
# @example Get the positional operator.
|
176
|
+
# address.atomic_position
|
177
|
+
#
|
178
|
+
# @return [ String ] The positional operator with indexes.
|
179
|
+
def atomic_position
|
180
|
+
atomic_paths.position
|
181
|
+
end
|
182
|
+
|
183
|
+
# Get the atomic paths utility for this document.
|
184
|
+
#
|
185
|
+
# @example Get the atomic paths.
|
186
|
+
# document.atomic_paths
|
187
|
+
#
|
188
|
+
# @return [ Object ] The associated path.
|
189
|
+
#
|
190
|
+
# @since 2.1.0
|
191
|
+
def atomic_paths
|
192
|
+
@atomic_paths ||= metadata ? metadata.path(self) : Atomic::Paths::Root.new(self)
|
193
|
+
end
|
194
|
+
|
195
|
+
# Get all the attributes that need to be pulled.
|
196
|
+
#
|
197
|
+
# @example Get the pulls.
|
198
|
+
# person.atomic_pulls
|
199
|
+
#
|
200
|
+
# @return [ Array<Hash> ] The $pullAll operations.
|
201
|
+
#
|
202
|
+
# @since 2.2.0
|
203
|
+
def atomic_pulls
|
204
|
+
pulls = {}
|
205
|
+
delayed_atomic_pulls.each_pair do |_, docs|
|
206
|
+
path = nil
|
207
|
+
ids = docs.map do |doc|
|
208
|
+
path ||= doc.flag_as_destroyed
|
209
|
+
doc.id
|
210
|
+
end
|
211
|
+
pulls[path] = { "_id" => { "$in" => ids }} and path = nil
|
212
|
+
end
|
213
|
+
pulls
|
214
|
+
end
|
215
|
+
|
216
|
+
# Get all the push attributes that need to occur.
|
217
|
+
#
|
218
|
+
# @example Get the pushes.
|
219
|
+
# person.atomic_pushes
|
220
|
+
#
|
221
|
+
# @return [ Hash ] The $pushAll operations.
|
222
|
+
#
|
223
|
+
# @since 2.1.0
|
224
|
+
def atomic_pushes
|
225
|
+
pushable? ? { atomic_position => as_document } : {}
|
226
|
+
end
|
227
|
+
|
228
|
+
# Get all the attributes that need to be set.
|
229
|
+
#
|
230
|
+
# @example Get the sets.
|
231
|
+
# person.atomic_sets
|
232
|
+
#
|
233
|
+
# @return [ Hash ] The $set operations.
|
234
|
+
#
|
235
|
+
# @since 2.1.0
|
236
|
+
def atomic_sets
|
237
|
+
updateable? ? setters : settable? ? { atomic_path => as_document } : {}
|
238
|
+
end
|
239
|
+
|
240
|
+
# Get all the attributes that need to be unset.
|
241
|
+
#
|
242
|
+
# @example Get the unsets.
|
243
|
+
# person.atomic_unsets
|
244
|
+
#
|
245
|
+
# @return [ Array<Hash> ] The $unset operations.
|
246
|
+
#
|
247
|
+
# @since 2.2.0
|
248
|
+
def atomic_unsets
|
249
|
+
unsets = []
|
250
|
+
delayed_atomic_unsets.each_pair do |name, docs|
|
251
|
+
path = nil
|
252
|
+
docs.each do |doc|
|
253
|
+
path ||= doc.flag_as_destroyed
|
254
|
+
end
|
255
|
+
unsets.push(path || name)
|
256
|
+
end
|
257
|
+
unsets
|
258
|
+
end
|
259
|
+
|
260
|
+
# Get all the atomic sets that have had their saves delayed.
|
261
|
+
#
|
262
|
+
# @example Get the delayed atomic sets.
|
263
|
+
# person.delayed_atomic_sets
|
264
|
+
#
|
265
|
+
# @return [ Hash ] The delayed $sets.
|
266
|
+
#
|
267
|
+
# @since 2.3.0
|
268
|
+
def delayed_atomic_sets
|
269
|
+
@delayed_atomic_sets ||= {}
|
270
|
+
end
|
271
|
+
|
272
|
+
# Get a hash of atomic pulls that are pending.
|
273
|
+
#
|
274
|
+
# @example Get the atomic pulls.
|
275
|
+
# document.delayed_atomic_pulls
|
276
|
+
#
|
277
|
+
# @return [ Hash ] name/document pairs.
|
278
|
+
#
|
279
|
+
# @since 2.3.2
|
280
|
+
def delayed_atomic_pulls
|
281
|
+
@delayed_atomic_pulls ||= {}
|
282
|
+
end
|
283
|
+
|
284
|
+
# Get the delayed atomic unsets.
|
285
|
+
#
|
286
|
+
# @example Get the delayed atomic unsets.
|
287
|
+
# document.delayed_atomic_unsets
|
288
|
+
#
|
289
|
+
# @return [ Hash ] The atomic unsets
|
290
|
+
#
|
291
|
+
# @since 3.0.0
|
292
|
+
def delayed_atomic_unsets
|
293
|
+
@delayed_atomic_unsets ||= {}
|
294
|
+
end
|
295
|
+
|
296
|
+
# Flag the document as destroyed and return the atomic path.
|
297
|
+
#
|
298
|
+
# @example Flag destroyed and return path.
|
299
|
+
# document.flag_as_destroyed
|
300
|
+
#
|
301
|
+
# @return [ String ] The atomic path.
|
302
|
+
#
|
303
|
+
# @since 3.0.0
|
304
|
+
def flag_as_destroyed
|
305
|
+
self.destroyed = true
|
306
|
+
self.flagged_for_destroy = false
|
307
|
+
atomic_path
|
308
|
+
end
|
309
|
+
|
310
|
+
# Get the flagged destroys.
|
311
|
+
#
|
312
|
+
# @example Get the flagged destroy.
|
313
|
+
# document.flagged_destroys
|
314
|
+
#
|
315
|
+
# @return [ Array<Proc> ] The flagged destroys.
|
316
|
+
#
|
317
|
+
# @since 3.0.10
|
318
|
+
def flagged_destroys
|
319
|
+
@flagged_destroys ||= []
|
320
|
+
end
|
321
|
+
|
322
|
+
# Process all the pending flagged destroys from nested attributes.
|
323
|
+
#
|
324
|
+
# @example Process all the pending flagged destroys.
|
325
|
+
# document.process_flagged_destroys
|
326
|
+
#
|
327
|
+
# @return [ Array ] The cleared array.
|
328
|
+
#
|
329
|
+
# @since 3.0.10
|
330
|
+
def process_flagged_destroys
|
331
|
+
_assigning do
|
332
|
+
flagged_destroys.each do |block|
|
333
|
+
block.call
|
334
|
+
end
|
335
|
+
end
|
336
|
+
flagged_destroys.clear
|
337
|
+
end
|
338
|
+
|
339
|
+
private
|
340
|
+
|
341
|
+
# Generates the atomic updates in the correct order.
|
342
|
+
#
|
343
|
+
# @example Generate the updates.
|
344
|
+
# model.generate_atomic_updates(mods, doc)
|
345
|
+
#
|
346
|
+
# @param [ Modifiers ] mods The atomic modifications.
|
347
|
+
# @param [ Document ] doc The document to update for.
|
348
|
+
#
|
349
|
+
# @since 2.2.0
|
350
|
+
def generate_atomic_updates(mods, doc)
|
351
|
+
mods.unset(doc.atomic_unsets)
|
352
|
+
mods.pull(doc.atomic_pulls)
|
353
|
+
mods.set(doc.atomic_sets)
|
354
|
+
mods.set(doc.delayed_atomic_sets)
|
355
|
+
mods.push(doc.atomic_pushes)
|
356
|
+
mods.push(doc.atomic_array_pushes)
|
357
|
+
mods.add_to_set(doc.atomic_array_add_to_sets)
|
358
|
+
mods.pull_all(doc.atomic_array_pulls)
|
359
|
+
end
|
360
|
+
|
361
|
+
# Get the atomic updates for a touch operation. Should only include the
|
362
|
+
# updated_at field and the optional extra field.
|
363
|
+
#
|
364
|
+
# @api private
|
365
|
+
#
|
366
|
+
# @example Get the touch atomic updates.
|
367
|
+
# document.touch_atomic_updates
|
368
|
+
#
|
369
|
+
# @param [ Symbol ] field The optional field.
|
370
|
+
#
|
371
|
+
# @return [ Hash ] The atomic updates.
|
372
|
+
#
|
373
|
+
# @since 3.0.6
|
374
|
+
def touch_atomic_updates(field = nil)
|
375
|
+
updates = atomic_updates
|
376
|
+
return {} unless atomic_updates.has_key?("$set")
|
377
|
+
touches = {}
|
378
|
+
updates["$set"].each_pair do |key, value|
|
379
|
+
touches.merge!({ key => value }) if key =~ /updated_at|#{field}/
|
380
|
+
end
|
381
|
+
{ "$set" => touches }
|
382
|
+
end
|
383
|
+
end
|
384
|
+
end
|