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,147 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Attributes
|
4
|
+
|
5
|
+
# This module contains the behavior for processing attributes.
|
6
|
+
module Processing
|
7
|
+
|
8
|
+
# Process the provided attributes casting them to their proper values if a
|
9
|
+
# field exists for them on the document. This will be limited to only the
|
10
|
+
# attributes provided in the suppied +Hash+ so that no extra nil values get
|
11
|
+
# put into the document's attributes.
|
12
|
+
#
|
13
|
+
# @example Process the attributes.
|
14
|
+
# person.process_attributes(:title => "sir", :age => 40)
|
15
|
+
#
|
16
|
+
# @param [ Hash ] attrs The attributes to set.
|
17
|
+
#
|
18
|
+
# @since 2.0.0.rc.7
|
19
|
+
def process_attributes(attrs = nil)
|
20
|
+
attrs ||= {}
|
21
|
+
if !attrs.empty?
|
22
|
+
attrs = sanitize_for_mass_assignment(attrs)
|
23
|
+
attrs.each_pair do |key, value|
|
24
|
+
next if pending_attribute?(key, value)
|
25
|
+
process_attribute(key, value)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
yield self if block_given?
|
29
|
+
process_pending
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
# If the key provided is the name of a relation or a nested attribute, we
|
35
|
+
# need to wait until all other attributes are set before processing
|
36
|
+
# these.
|
37
|
+
#
|
38
|
+
# @example Is the attribute pending?
|
39
|
+
# document.pending_attribute?(:name, "Durran")
|
40
|
+
#
|
41
|
+
# @param [ Symbol ] key The name of the attribute.
|
42
|
+
# @param [ Object ] value The value of the attribute.
|
43
|
+
#
|
44
|
+
# @return [ true, false ] True if pending, false if not.
|
45
|
+
#
|
46
|
+
# @since 2.0.0.rc.7
|
47
|
+
def pending_attribute?(key, value)
|
48
|
+
name = key.to_s
|
49
|
+
if relations.has_key?(name)
|
50
|
+
pending_relations[name] = value
|
51
|
+
return true
|
52
|
+
end
|
53
|
+
if nested_attributes.has_key?(name)
|
54
|
+
pending_nested[name] = value
|
55
|
+
return true
|
56
|
+
end
|
57
|
+
return false
|
58
|
+
end
|
59
|
+
|
60
|
+
# Get all the pending relations that need to be set.
|
61
|
+
#
|
62
|
+
# @example Get the pending relations.
|
63
|
+
# document.pending_relations
|
64
|
+
#
|
65
|
+
# @return [ Hash ] The pending relations in key/value pairs.
|
66
|
+
#
|
67
|
+
# @since 2.0.0.rc.7
|
68
|
+
def pending_relations
|
69
|
+
@pending_relations ||= {}
|
70
|
+
end
|
71
|
+
|
72
|
+
# Get all the pending nested attributes that need to be set.
|
73
|
+
#
|
74
|
+
# @example Get the pending nested attributes.
|
75
|
+
# document.pending_nested
|
76
|
+
#
|
77
|
+
# @return [ Hash ] The pending nested attributes in key/value pairs.
|
78
|
+
#
|
79
|
+
# @since 2.0.0.rc.7
|
80
|
+
def pending_nested
|
81
|
+
@pending_nested ||= {}
|
82
|
+
end
|
83
|
+
|
84
|
+
# If the attribute is dynamic, add a field for it with a type of object
|
85
|
+
# and then either way set the value.
|
86
|
+
#
|
87
|
+
# @example Process the attribute.
|
88
|
+
# document.process_attribute(name, value)
|
89
|
+
#
|
90
|
+
# @param [ Symbol ] name The name of the field.
|
91
|
+
# @param [ Object ] value The value of the field.
|
92
|
+
#
|
93
|
+
# @since 2.0.0.rc.7
|
94
|
+
def process_attribute(name, value)
|
95
|
+
responds = respond_to?("#{name}=")
|
96
|
+
raise Errors::UnknownAttribute.new(self.class, name) unless responds
|
97
|
+
send("#{name}=", value)
|
98
|
+
end
|
99
|
+
|
100
|
+
# Process all the pending nested attributes that needed to wait until
|
101
|
+
# ids were set to fire off.
|
102
|
+
#
|
103
|
+
# @example Process the nested attributes.
|
104
|
+
# document.process_nested
|
105
|
+
#
|
106
|
+
# @since 2.0.0.rc.7
|
107
|
+
def process_nested
|
108
|
+
pending_nested.each_pair do |name, value|
|
109
|
+
send("#{name}=", value)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# Process all the pending items, then clear them out.
|
114
|
+
#
|
115
|
+
# @example Process the pending items.
|
116
|
+
# document.process_pending
|
117
|
+
#
|
118
|
+
# @param [ Hash ] options The mass assignment options.
|
119
|
+
#
|
120
|
+
# @since 2.0.0.rc.7
|
121
|
+
def process_pending
|
122
|
+
process_nested and process_relations
|
123
|
+
pending_nested.clear and pending_relations.clear
|
124
|
+
end
|
125
|
+
|
126
|
+
# Process all the pending relations that needed to wait until ids were set
|
127
|
+
# to fire off.
|
128
|
+
#
|
129
|
+
# @example Process the relations.
|
130
|
+
# document.process_relations
|
131
|
+
#
|
132
|
+
# @param [ Hash ] options The mass assignment options.
|
133
|
+
#
|
134
|
+
# @since 2.0.0.rc.7
|
135
|
+
def process_relations
|
136
|
+
pending_relations.each_pair do |name, value|
|
137
|
+
metadata = relations[name]
|
138
|
+
if value.is_a?(Hash)
|
139
|
+
metadata.nested_builder(value, {}).build(self)
|
140
|
+
else
|
141
|
+
send("#{name}=", value)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Attributes
|
4
|
+
|
5
|
+
# This module defines behaviour for readonly attributes.
|
6
|
+
module Readonly
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
class_attribute :readonly_attributes
|
11
|
+
self.readonly_attributes = ::Set.new
|
12
|
+
end
|
13
|
+
|
14
|
+
# Are we able to write the attribute with the provided name?
|
15
|
+
#
|
16
|
+
# @example Can we write the attribute?
|
17
|
+
# model.attribute_writable?(:title)
|
18
|
+
#
|
19
|
+
# @param [ String, Symbol ] name The name of the field.
|
20
|
+
#
|
21
|
+
# @return [ true, false ] If the document is new, or if the field is not
|
22
|
+
# readonly.
|
23
|
+
#
|
24
|
+
# @since 3.0.0
|
25
|
+
def attribute_writable?(name)
|
26
|
+
new_record? || !readonly_attributes.include?(name.to_s)
|
27
|
+
end
|
28
|
+
|
29
|
+
module ClassMethods
|
30
|
+
|
31
|
+
# Defines an attribute as readonly. This will ensure that the value for
|
32
|
+
# the attribute is only set when the document is new or we are
|
33
|
+
# creating. In other cases, the field write will be ignored with the
|
34
|
+
# exception of #remove_attribute and #update_attribute, where an error
|
35
|
+
# will get raised.
|
36
|
+
#
|
37
|
+
# @example Flag fields as readonly.
|
38
|
+
# class Band
|
39
|
+
# include Mongoid::Document
|
40
|
+
# field :name, type: String
|
41
|
+
# field :genre, type: String
|
42
|
+
# attr_readonly :name, :genre
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
# @param [ Array<Symbol> ] names The names of the fields.
|
46
|
+
#
|
47
|
+
# @since 3.0.0
|
48
|
+
def attr_readonly(*names)
|
49
|
+
names.each do |name|
|
50
|
+
readonly_attributes << name.to_s
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,379 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
|
4
|
+
# Defines behaviour for dirty tracking.
|
5
|
+
#
|
6
|
+
# @since 4.0.0
|
7
|
+
module Changeable
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
# Get the changed attributes for the document.
|
11
|
+
#
|
12
|
+
# @example Get the changed attributes.
|
13
|
+
# model.changed
|
14
|
+
#
|
15
|
+
# @return [ Array<String> ] The changed attributes.
|
16
|
+
#
|
17
|
+
# @since 2.4.0
|
18
|
+
def changed
|
19
|
+
changed_attributes.keys
|
20
|
+
end
|
21
|
+
|
22
|
+
# Has the document changed?
|
23
|
+
#
|
24
|
+
# @example Has the document changed?
|
25
|
+
# model.changed?
|
26
|
+
#
|
27
|
+
# @return [ true, false ] If the document is changed.
|
28
|
+
#
|
29
|
+
# @since 2.4.0
|
30
|
+
def changed?
|
31
|
+
changes.values.any? { |val| val } || children_changed?
|
32
|
+
end
|
33
|
+
|
34
|
+
# Have any children (embedded documents) of this document changed?
|
35
|
+
#
|
36
|
+
# @example Have any children changed?
|
37
|
+
# model.children_changed?
|
38
|
+
#
|
39
|
+
# @return [ true, false ] If any children have changed.
|
40
|
+
#
|
41
|
+
# @since 2.4.1
|
42
|
+
def children_changed?
|
43
|
+
_children.any? do |child|
|
44
|
+
child.changed?
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Get the attribute changes.
|
49
|
+
#
|
50
|
+
# @example Get the attribute changes.
|
51
|
+
# model.changed_attributes
|
52
|
+
#
|
53
|
+
# @return [ Hash<String, Object> ] The attribute changes.
|
54
|
+
#
|
55
|
+
# @since 2.4.0
|
56
|
+
def changed_attributes
|
57
|
+
@changed_attributes ||= {}
|
58
|
+
end
|
59
|
+
|
60
|
+
# Get all the changes for the document.
|
61
|
+
#
|
62
|
+
# @example Get all the changes.
|
63
|
+
# model.changes
|
64
|
+
#
|
65
|
+
# @return [ Hash<String, Array<Object, Object> ] The changes.
|
66
|
+
#
|
67
|
+
# @since 2.4.0
|
68
|
+
def changes
|
69
|
+
_changes = {}
|
70
|
+
changed.each do |attr|
|
71
|
+
change = attribute_change(attr)
|
72
|
+
_changes[attr] = change if change
|
73
|
+
end
|
74
|
+
_changes
|
75
|
+
end
|
76
|
+
|
77
|
+
# Call this method after save, so the changes can be properly switched.
|
78
|
+
#
|
79
|
+
# This will unset the memoized children array, set new record to
|
80
|
+
# false, set the document as validated, and move the dirty changes.
|
81
|
+
#
|
82
|
+
# @example Move the changes to previous.
|
83
|
+
# person.move_changes
|
84
|
+
#
|
85
|
+
# @since 2.1.0
|
86
|
+
def move_changes
|
87
|
+
@_children = nil
|
88
|
+
@previous_changes = changes
|
89
|
+
Atomic::UPDATES.each do |update|
|
90
|
+
send(update).clear
|
91
|
+
end
|
92
|
+
changed_attributes.clear
|
93
|
+
end
|
94
|
+
|
95
|
+
# Things that need to execute after a document has been persisted.
|
96
|
+
#
|
97
|
+
# @example Handle post persistence.
|
98
|
+
# document.post_persist
|
99
|
+
#
|
100
|
+
# @since 3.0.0
|
101
|
+
def post_persist
|
102
|
+
reset_persisted_children
|
103
|
+
move_changes
|
104
|
+
end
|
105
|
+
|
106
|
+
# Get the previous changes on the document.
|
107
|
+
#
|
108
|
+
# @example Get the previous changes.
|
109
|
+
# model.previous_changes
|
110
|
+
#
|
111
|
+
# @return [ Hash<String, Array<Object, Object> ] The previous changes.
|
112
|
+
#
|
113
|
+
# @since 2.4.0
|
114
|
+
def previous_changes
|
115
|
+
@previous_changes ||= {}
|
116
|
+
end
|
117
|
+
|
118
|
+
# Remove a change from the dirty attributes hash. Used by the single field
|
119
|
+
# atomic updators.
|
120
|
+
#
|
121
|
+
# @example Remove a flagged change.
|
122
|
+
# model.remove_change(:field)
|
123
|
+
#
|
124
|
+
# @param [ Symbol, String ] name The name of the field.
|
125
|
+
#
|
126
|
+
# @since 2.1.0
|
127
|
+
def remove_change(name)
|
128
|
+
changed_attributes.delete(name.to_s)
|
129
|
+
end
|
130
|
+
|
131
|
+
# Gets all the new values for each of the changed fields, to be passed to
|
132
|
+
# a MongoDB $set modifier.
|
133
|
+
#
|
134
|
+
# @example Get the setters for the atomic updates.
|
135
|
+
# person = Person.new(:title => "Sir")
|
136
|
+
# person.title = "Madam"
|
137
|
+
# person.setters # returns { "title" => "Madam" }
|
138
|
+
#
|
139
|
+
# @return [ Hash ] A +Hash+ of atomic setters.
|
140
|
+
#
|
141
|
+
# @since 2.0.0
|
142
|
+
def setters
|
143
|
+
mods = {}
|
144
|
+
changes.each_pair do |name, changes|
|
145
|
+
if changes
|
146
|
+
old, new = changes
|
147
|
+
field = fields[name]
|
148
|
+
key = atomic_attribute_name(name)
|
149
|
+
if field && field.resizable?
|
150
|
+
field.add_atomic_changes(self, name, key, mods, new, old)
|
151
|
+
else
|
152
|
+
mods[key] = new unless atomic_unsets.include?(key)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
mods
|
157
|
+
end
|
158
|
+
|
159
|
+
private
|
160
|
+
|
161
|
+
# Get the old and new value for the provided attribute.
|
162
|
+
#
|
163
|
+
# @example Get the attribute change.
|
164
|
+
# model.attribute_change("name")
|
165
|
+
#
|
166
|
+
# @param [ String ] attr The name of the attribute.
|
167
|
+
#
|
168
|
+
# @return [ Array<Object> ] The old and new values.
|
169
|
+
#
|
170
|
+
# @since 2.1.0
|
171
|
+
def attribute_change(attr)
|
172
|
+
attr = database_field_name(attr)
|
173
|
+
[changed_attributes[attr], attributes[attr]] if attribute_changed?(attr)
|
174
|
+
end
|
175
|
+
|
176
|
+
# Determine if a specific attribute has changed.
|
177
|
+
#
|
178
|
+
# @example Has the attribute changed?
|
179
|
+
# model.attribute_changed?("name")
|
180
|
+
#
|
181
|
+
# @param [ String ] attr The name of the attribute.
|
182
|
+
#
|
183
|
+
# @return [ true, false ] Whether the attribute has changed.
|
184
|
+
#
|
185
|
+
# @since 2.1.6
|
186
|
+
def attribute_changed?(attr)
|
187
|
+
attr = database_field_name(attr)
|
188
|
+
return false unless changed_attributes.has_key?(attr)
|
189
|
+
changed_attributes[attr] != attributes[attr]
|
190
|
+
end
|
191
|
+
|
192
|
+
# Get whether or not the field has a different value from the default.
|
193
|
+
#
|
194
|
+
# @example Is the field different from the default?
|
195
|
+
# model.attribute_changed_from_default?
|
196
|
+
#
|
197
|
+
# @param [ String ] attr The name of the attribute.
|
198
|
+
#
|
199
|
+
# @return [ true, false ] If the attribute differs.
|
200
|
+
#
|
201
|
+
# @since 3.0.0
|
202
|
+
def attribute_changed_from_default?(attr)
|
203
|
+
field = fields[attr]
|
204
|
+
return false unless field
|
205
|
+
attributes[attr] != field.eval_default(self)
|
206
|
+
end
|
207
|
+
|
208
|
+
# Get the previous value for the attribute.
|
209
|
+
#
|
210
|
+
# @example Get the previous value.
|
211
|
+
# model.attribute_was("name")
|
212
|
+
#
|
213
|
+
# @param [ String ] attr The attribute name.
|
214
|
+
#
|
215
|
+
# @since 2.4.0
|
216
|
+
def attribute_was(attr)
|
217
|
+
attr = database_field_name(attr)
|
218
|
+
attribute_changed?(attr) ? changed_attributes[attr] : attributes[attr]
|
219
|
+
end
|
220
|
+
|
221
|
+
# Flag an attribute as going to change.
|
222
|
+
#
|
223
|
+
# @example Flag the attribute.
|
224
|
+
# model.attribute_will_change!("name")
|
225
|
+
#
|
226
|
+
# @param [ String ] attr The name of the attribute.
|
227
|
+
#
|
228
|
+
# @return [ Object ] The old value.
|
229
|
+
#
|
230
|
+
# @since 2.3.0
|
231
|
+
def attribute_will_change!(attr)
|
232
|
+
unless changed_attributes.has_key?(attr)
|
233
|
+
changed_attributes[attr] = read_attribute(attr).__deep_copy__
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
# Set the attribute back to its old value.
|
238
|
+
#
|
239
|
+
# @example Reset the attribute.
|
240
|
+
# model.reset_attribute!("name")
|
241
|
+
#
|
242
|
+
# @param [ String ] attr The name of the attribute.
|
243
|
+
#
|
244
|
+
# @return [ Object ] The old value.
|
245
|
+
#
|
246
|
+
# @since 2.4.0
|
247
|
+
def reset_attribute!(attr)
|
248
|
+
attr = database_field_name(attr)
|
249
|
+
attributes[attr] = changed_attributes.delete(attr) if attribute_changed?(attr)
|
250
|
+
end
|
251
|
+
|
252
|
+
module ClassMethods
|
253
|
+
|
254
|
+
private
|
255
|
+
|
256
|
+
# Generate all the dirty methods needed for the attribute.
|
257
|
+
#
|
258
|
+
# @example Generate the dirty methods.
|
259
|
+
# Model.create_dirty_methods("name", "name")
|
260
|
+
#
|
261
|
+
# @param [ String ] name The name of the field.
|
262
|
+
# @param [ String ] name The name of the accessor.
|
263
|
+
#
|
264
|
+
# @return [ Module ] The fields module.
|
265
|
+
#
|
266
|
+
# @since 2.4.0
|
267
|
+
def create_dirty_methods(name, meth)
|
268
|
+
create_dirty_change_accessor(name, meth)
|
269
|
+
create_dirty_change_check(name, meth)
|
270
|
+
create_dirty_change_flag(name, meth)
|
271
|
+
create_dirty_default_change_check(name, meth)
|
272
|
+
create_dirty_previous_value_accessor(name, meth)
|
273
|
+
create_dirty_reset(name, meth)
|
274
|
+
end
|
275
|
+
|
276
|
+
# Creates the dirty change accessor.
|
277
|
+
#
|
278
|
+
# @example Create the accessor.
|
279
|
+
# Model.create_dirty_change_accessor("name", "alias")
|
280
|
+
#
|
281
|
+
# @param [ String ] name The attribute name.
|
282
|
+
# @param [ String ] meth The name of the accessor.
|
283
|
+
#
|
284
|
+
# @since 3.0.0
|
285
|
+
def create_dirty_change_accessor(name, meth)
|
286
|
+
generated_methods.module_eval do
|
287
|
+
re_define_method("#{meth}_change") do
|
288
|
+
attribute_change(name)
|
289
|
+
end
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
# Creates the dirty change check.
|
294
|
+
#
|
295
|
+
# @example Create the check.
|
296
|
+
# Model.create_dirty_change_check("name", "alias")
|
297
|
+
#
|
298
|
+
# @param [ String ] name The attribute name.
|
299
|
+
# @param [ String ] meth The name of the accessor.
|
300
|
+
#
|
301
|
+
# @since 3.0.0
|
302
|
+
def create_dirty_change_check(name, meth)
|
303
|
+
generated_methods.module_eval do
|
304
|
+
re_define_method("#{meth}_changed?") do
|
305
|
+
attribute_changed?(name)
|
306
|
+
end
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
# Creates the dirty default change check.
|
311
|
+
#
|
312
|
+
# @example Create the check.
|
313
|
+
# Model.create_dirty_default_change_check("name", "alias")
|
314
|
+
#
|
315
|
+
# @param [ String ] name The attribute name.
|
316
|
+
# @param [ String ] meth The name of the accessor.
|
317
|
+
#
|
318
|
+
# @since 3.0.0
|
319
|
+
def create_dirty_default_change_check(name, meth)
|
320
|
+
generated_methods.module_eval do
|
321
|
+
re_define_method("#{meth}_changed_from_default?") do
|
322
|
+
attribute_changed_from_default?(name)
|
323
|
+
end
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
327
|
+
# Creates the dirty change previous value accessor.
|
328
|
+
#
|
329
|
+
# @example Create the accessor.
|
330
|
+
# Model.create_dirty_previous_value_accessor("name", "alias")
|
331
|
+
#
|
332
|
+
# @param [ String ] name The attribute name.
|
333
|
+
# @param [ String ] meth The name of the accessor.
|
334
|
+
#
|
335
|
+
# @since 3.0.0
|
336
|
+
def create_dirty_previous_value_accessor(name, meth)
|
337
|
+
generated_methods.module_eval do
|
338
|
+
re_define_method("#{meth}_was") do
|
339
|
+
attribute_was(name)
|
340
|
+
end
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
# Creates the dirty change flag.
|
345
|
+
#
|
346
|
+
# @example Create the flag.
|
347
|
+
# Model.create_dirty_change_flag("name", "alias")
|
348
|
+
#
|
349
|
+
# @param [ String ] name The attribute name.
|
350
|
+
# @param [ String ] meth The name of the accessor.
|
351
|
+
#
|
352
|
+
# @since 3.0.0
|
353
|
+
def create_dirty_change_flag(name, meth)
|
354
|
+
generated_methods.module_eval do
|
355
|
+
re_define_method("#{meth}_will_change!") do
|
356
|
+
attribute_will_change!(name)
|
357
|
+
end
|
358
|
+
end
|
359
|
+
end
|
360
|
+
|
361
|
+
# Creates the dirty change reset.
|
362
|
+
#
|
363
|
+
# @example Create the reset.
|
364
|
+
# Model.create_dirty_reset("name", "alias")
|
365
|
+
#
|
366
|
+
# @param [ String ] name The attribute name.
|
367
|
+
# @param [ String ] meth The name of the accessor.
|
368
|
+
#
|
369
|
+
# @since 3.0.0
|
370
|
+
def create_dirty_reset(name, meth)
|
371
|
+
generated_methods.module_eval do
|
372
|
+
re_define_method("reset_#{meth}!") do
|
373
|
+
reset_attribute!(name)
|
374
|
+
end
|
375
|
+
end
|
376
|
+
end
|
377
|
+
end
|
378
|
+
end
|
379
|
+
end
|