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,56 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Extensions
|
4
|
+
module TimeWithZone
|
5
|
+
|
6
|
+
# Turn the object from the ruby type we deal with to a Mongo friendly
|
7
|
+
# type.
|
8
|
+
#
|
9
|
+
# @example Mongoize the object.
|
10
|
+
# date_time.mongoize
|
11
|
+
#
|
12
|
+
# @return [ Time ] The object mongoized.
|
13
|
+
#
|
14
|
+
# @since 3.0.0
|
15
|
+
def mongoize
|
16
|
+
::ActiveSupport::TimeWithZone.mongoize(self)
|
17
|
+
end
|
18
|
+
|
19
|
+
module ClassMethods
|
20
|
+
|
21
|
+
# Convert the object from its mongo friendly ruby type to this type.
|
22
|
+
#
|
23
|
+
# @example Demongoize the object.
|
24
|
+
# TimeWithZone.demongoize(object)
|
25
|
+
#
|
26
|
+
# @param [ Time ] object The time from Mongo.
|
27
|
+
#
|
28
|
+
# @return [ TimeWithZone ] The object as a date.
|
29
|
+
#
|
30
|
+
# @since 3.0.0
|
31
|
+
def demongoize(object)
|
32
|
+
return nil if object.blank?
|
33
|
+
::Time.demongoize(object).in_time_zone
|
34
|
+
end
|
35
|
+
|
36
|
+
# Turn the object from the ruby type we deal with to a Mongo friendly
|
37
|
+
# type.
|
38
|
+
#
|
39
|
+
# @example Mongoize the object.
|
40
|
+
# TimeWithZone.mongoize("2012-1-1")
|
41
|
+
#
|
42
|
+
# @param [ Object ] object The object to convert.
|
43
|
+
#
|
44
|
+
# @return [ Time ] The object mongoized.
|
45
|
+
#
|
46
|
+
# @since 3.0.0
|
47
|
+
def mongoize(object)
|
48
|
+
::Time.mongoize(object)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
::ActiveSupport::TimeWithZone.__send__(:include, Mongoid::Extensions::TimeWithZone)
|
56
|
+
::ActiveSupport::TimeWithZone.__send__(:extend, Mongoid::Extensions::TimeWithZone::ClassMethods)
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Extensions
|
4
|
+
module TrueClass
|
5
|
+
|
6
|
+
# Get the value of the object as a mongo friendy sort value.
|
7
|
+
#
|
8
|
+
# @example Get the object as sort criteria.
|
9
|
+
# object.__sortable__
|
10
|
+
#
|
11
|
+
# @return [ Integer ] 1.
|
12
|
+
#
|
13
|
+
# @since 3.0.0
|
14
|
+
def __sortable__
|
15
|
+
1
|
16
|
+
end
|
17
|
+
|
18
|
+
# Is the passed value a boolean?
|
19
|
+
#
|
20
|
+
# @example Is the value a boolean type?
|
21
|
+
# true.is_a?(Boolean)
|
22
|
+
#
|
23
|
+
# @param [ Class ] other The class to check.
|
24
|
+
#
|
25
|
+
# @return [ true, false ] If the other is a boolean.
|
26
|
+
#
|
27
|
+
# @since 1.0.0
|
28
|
+
def is_a?(other)
|
29
|
+
if other == ::Boolean || other.class == ::Boolean
|
30
|
+
return true
|
31
|
+
end
|
32
|
+
super(other)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
::TrueClass.__send__(:include, Mongoid::Extensions::TrueClass)
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
|
4
|
+
# Instantiates documents that came from the database.
|
5
|
+
module Factory
|
6
|
+
extend self
|
7
|
+
|
8
|
+
# Builds a new +Document+ from the supplied attributes.
|
9
|
+
#
|
10
|
+
# @example Build the document.
|
11
|
+
# Mongoid::Factory.build(Person, { "name" => "Durran" })
|
12
|
+
#
|
13
|
+
# @param [ Class ] klass The class to instantiate from if _type is not present.
|
14
|
+
# @param [ Hash ] attributes The document attributes.
|
15
|
+
# @param [ Hash ] options The mass assignment scoping options.
|
16
|
+
#
|
17
|
+
# @return [ Document ] The instantiated document.
|
18
|
+
def build(klass, attributes = nil)
|
19
|
+
type = (attributes || {})["_type"]
|
20
|
+
if type && klass._types.include?(type)
|
21
|
+
type.constantize.new(attributes)
|
22
|
+
else
|
23
|
+
klass.new(attributes)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Builds a new +Document+ from the supplied attributes loaded from the
|
28
|
+
# database.
|
29
|
+
#
|
30
|
+
# @example Build the document.
|
31
|
+
# Mongoid::Factory.from_db(Person, { "name" => "Durran" })
|
32
|
+
#
|
33
|
+
# @param [ Class ] klass The class to instantiate from if _type is not present.
|
34
|
+
# @param [ Hash ] attributes The document attributes.
|
35
|
+
#
|
36
|
+
# @return [ Document ] The instantiated document.
|
37
|
+
def from_db(klass, attributes = nil, criteria_instance_id = nil)
|
38
|
+
type = (attributes || {})["_type"]
|
39
|
+
if type.blank?
|
40
|
+
klass.instantiate(attributes, criteria_instance_id)
|
41
|
+
else
|
42
|
+
type.camelize.constantize.instantiate(attributes, criteria_instance_id)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,542 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "mongoid/fields/standard"
|
3
|
+
require "mongoid/fields/foreign_key"
|
4
|
+
require "mongoid/fields/localized"
|
5
|
+
require "mongoid/fields/validators"
|
6
|
+
|
7
|
+
module Mongoid
|
8
|
+
|
9
|
+
# This module defines behaviour for fields.
|
10
|
+
module Fields
|
11
|
+
extend ActiveSupport::Concern
|
12
|
+
|
13
|
+
included do
|
14
|
+
class_attribute :aliased_fields
|
15
|
+
class_attribute :localized_fields
|
16
|
+
class_attribute :fields
|
17
|
+
class_attribute :pre_processed_defaults
|
18
|
+
class_attribute :post_processed_defaults
|
19
|
+
|
20
|
+
self.aliased_fields = { "id" => "_id" }
|
21
|
+
self.fields = {}
|
22
|
+
self.localized_fields = {}
|
23
|
+
self.pre_processed_defaults = []
|
24
|
+
self.post_processed_defaults = []
|
25
|
+
|
26
|
+
field(
|
27
|
+
:_id,
|
28
|
+
default: ->{ Moped::BSON::ObjectId.new },
|
29
|
+
pre_processed: true,
|
30
|
+
type: Moped::BSON::ObjectId
|
31
|
+
)
|
32
|
+
|
33
|
+
alias :id :_id
|
34
|
+
alias :id= :_id=
|
35
|
+
end
|
36
|
+
|
37
|
+
# Apply all default values to the document which are not procs.
|
38
|
+
#
|
39
|
+
# @example Apply all the non-proc defaults.
|
40
|
+
# model.apply_pre_processed_defaults
|
41
|
+
#
|
42
|
+
# @return [ Array<String ] The names of the non-proc defaults.
|
43
|
+
#
|
44
|
+
# @since 2.4.0
|
45
|
+
def apply_pre_processed_defaults
|
46
|
+
pre_processed_defaults.each do |name|
|
47
|
+
apply_default(name)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Apply all default values to the document which are procs.
|
52
|
+
#
|
53
|
+
# @example Apply all the proc defaults.
|
54
|
+
# model.apply_post_processed_defaults
|
55
|
+
#
|
56
|
+
# @return [ Array<String ] The names of the proc defaults.
|
57
|
+
#
|
58
|
+
# @since 2.4.0
|
59
|
+
def apply_post_processed_defaults
|
60
|
+
post_processed_defaults.each do |name|
|
61
|
+
apply_default(name)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Applies a single default value for the given name.
|
66
|
+
#
|
67
|
+
# @example Apply a single default.
|
68
|
+
# model.apply_default("name")
|
69
|
+
#
|
70
|
+
# @param [ String ] name The name of the field.
|
71
|
+
#
|
72
|
+
# @since 2.4.0
|
73
|
+
def apply_default(name)
|
74
|
+
unless attributes.has_key?(name)
|
75
|
+
if field = fields[name]
|
76
|
+
default = field.eval_default(self)
|
77
|
+
unless default.nil? || field.lazy?
|
78
|
+
attribute_will_change!(name)
|
79
|
+
attributes[name] = default
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# Apply all the defaults at once.
|
86
|
+
#
|
87
|
+
# @example Apply all the defaults.
|
88
|
+
# model.apply_defaults
|
89
|
+
#
|
90
|
+
# @since 2.4.0
|
91
|
+
def apply_defaults
|
92
|
+
apply_pre_processed_defaults
|
93
|
+
apply_post_processed_defaults
|
94
|
+
end
|
95
|
+
|
96
|
+
# Returns an array of names for the attributes available on this object.
|
97
|
+
#
|
98
|
+
# Provides the field names in an ORM-agnostic way. Rails v3.1+ uses this
|
99
|
+
# method to automatically wrap params in JSON requests.
|
100
|
+
#
|
101
|
+
# @example Get the field names
|
102
|
+
# docment.attribute_names
|
103
|
+
#
|
104
|
+
# @return [ Array<String> ] The field names
|
105
|
+
#
|
106
|
+
# @since 3.0.0
|
107
|
+
def attribute_names
|
108
|
+
self.class.attribute_names
|
109
|
+
end
|
110
|
+
|
111
|
+
# Get the name of the provided field as it is stored in the database.
|
112
|
+
# Used in determining if the field is aliased or not.
|
113
|
+
#
|
114
|
+
# @example Get the database field name.
|
115
|
+
# model.database_field_name(:authorization)
|
116
|
+
#
|
117
|
+
# @param [ String, Symbol ] name The name to get.
|
118
|
+
#
|
119
|
+
# @return [ String ] The name of the field as it's stored in the db.
|
120
|
+
#
|
121
|
+
# @since 3.0.7
|
122
|
+
def database_field_name(name)
|
123
|
+
self.class.database_field_name(name)
|
124
|
+
end
|
125
|
+
|
126
|
+
# Is the provided field a lazy evaluation?
|
127
|
+
#
|
128
|
+
# @example If the field is lazy settable.
|
129
|
+
# doc.lazy_settable?(field, nil)
|
130
|
+
#
|
131
|
+
# @param [ Field ] field The field.
|
132
|
+
# @param [ Object ] value The current value.
|
133
|
+
#
|
134
|
+
# @return [ true, false ] If we set the field lazily.
|
135
|
+
#
|
136
|
+
# @since 3.1.0
|
137
|
+
def lazy_settable?(field, value)
|
138
|
+
!frozen? && value.nil? && field.lazy?
|
139
|
+
end
|
140
|
+
|
141
|
+
# Is the document using object ids?
|
142
|
+
#
|
143
|
+
# @note Refactored from using delegate for class load performance.
|
144
|
+
#
|
145
|
+
# @example Is the document using object ids?
|
146
|
+
# model.using_object_ids?
|
147
|
+
#
|
148
|
+
# @return [ true, false ] Using object ids.
|
149
|
+
def using_object_ids?
|
150
|
+
self.class.using_object_ids?
|
151
|
+
end
|
152
|
+
|
153
|
+
class << self
|
154
|
+
|
155
|
+
# Stores the provided block to be run when the option name specified is
|
156
|
+
# defined on a field.
|
157
|
+
#
|
158
|
+
# No assumptions are made about what sort of work the handler might
|
159
|
+
# perform, so it will always be called if the `option_name` key is
|
160
|
+
# provided in the field definition -- even if it is false or nil.
|
161
|
+
#
|
162
|
+
# @example
|
163
|
+
# Mongoid::Fields.option :required do |model, field, value|
|
164
|
+
# model.validates_presence_of field if value
|
165
|
+
# end
|
166
|
+
#
|
167
|
+
# @param [ Symbol ] option_name the option name to match against
|
168
|
+
# @param [ Proc ] block the handler to execute when the option is
|
169
|
+
# provided.
|
170
|
+
#
|
171
|
+
# @since 2.1.0
|
172
|
+
def option(option_name, &block)
|
173
|
+
options[option_name] = block
|
174
|
+
end
|
175
|
+
|
176
|
+
# Return a map of custom option names to their handlers.
|
177
|
+
#
|
178
|
+
# @example
|
179
|
+
# Mongoid::Fields.options
|
180
|
+
# # => { :required => #<Proc:0x00000100976b38> }
|
181
|
+
#
|
182
|
+
# @return [ Hash ] the option map
|
183
|
+
#
|
184
|
+
# @since 2.1.0
|
185
|
+
def options
|
186
|
+
@options ||= {}
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
module ClassMethods
|
191
|
+
|
192
|
+
# Returns an array of names for the attributes available on this object.
|
193
|
+
#
|
194
|
+
# Provides the field names in an ORM-agnostic way. Rails v3.1+ uses this
|
195
|
+
# method to automatically wrap params in JSON requests.
|
196
|
+
#
|
197
|
+
# @example Get the field names
|
198
|
+
# Model.attribute_names
|
199
|
+
#
|
200
|
+
# @return [ Array<String> ] The field names
|
201
|
+
#
|
202
|
+
# @since 3.0.0
|
203
|
+
def attribute_names
|
204
|
+
fields.keys
|
205
|
+
end
|
206
|
+
|
207
|
+
# Get the name of the provided field as it is stored in the database.
|
208
|
+
# Used in determining if the field is aliased or not.
|
209
|
+
#
|
210
|
+
# @example Get the database field name.
|
211
|
+
# Model.database_field_name(:authorization)
|
212
|
+
#
|
213
|
+
# @param [ String, Symbol ] name The name to get.
|
214
|
+
#
|
215
|
+
# @return [ String ] The name of the field as it's stored in the db.
|
216
|
+
#
|
217
|
+
# @since 3.0.7
|
218
|
+
def database_field_name(name)
|
219
|
+
return nil unless name
|
220
|
+
normalized = name.to_s
|
221
|
+
aliased_fields[normalized] || normalized
|
222
|
+
end
|
223
|
+
|
224
|
+
# Defines all the fields that are accessible on the Document
|
225
|
+
# For each field that is defined, a getter and setter will be
|
226
|
+
# added as an instance method to the Document.
|
227
|
+
#
|
228
|
+
# @example Define a field.
|
229
|
+
# field :score, :type => Integer, :default => 0
|
230
|
+
#
|
231
|
+
# @param [ Symbol ] name The name of the field.
|
232
|
+
# @param [ Hash ] options The options to pass to the field.
|
233
|
+
#
|
234
|
+
# @option options [ Class ] :type The type of the field.
|
235
|
+
# @option options [ String ] :label The label for the field.
|
236
|
+
# @option options [ Object, Proc ] :default The field's default
|
237
|
+
#
|
238
|
+
# @return [ Field ] The generated field
|
239
|
+
def field(name, options = {})
|
240
|
+
named = name.to_s
|
241
|
+
Validators::Macro.validate(self, name, options)
|
242
|
+
added = add_field(named, options)
|
243
|
+
descendants.each do |subclass|
|
244
|
+
subclass.add_field(named, options)
|
245
|
+
end
|
246
|
+
added
|
247
|
+
end
|
248
|
+
|
249
|
+
# Replace a field with a new type.
|
250
|
+
#
|
251
|
+
# @example Replace the field.
|
252
|
+
# Model.replace_field("_id", String)
|
253
|
+
#
|
254
|
+
# @param [ String ] name The name of the field.
|
255
|
+
# @param [ Class ] type The new type of field.
|
256
|
+
#
|
257
|
+
# @return [ Serializable ] The new field.
|
258
|
+
#
|
259
|
+
# @since 2.1.0
|
260
|
+
def replace_field(name, type)
|
261
|
+
remove_defaults(name)
|
262
|
+
add_field(name, fields[name].options.merge(type: type))
|
263
|
+
end
|
264
|
+
|
265
|
+
# Convenience method for determining if we are using +Moped::BSON::ObjectIds+ as
|
266
|
+
# our id.
|
267
|
+
#
|
268
|
+
# @example Does this class use object ids?
|
269
|
+
# person.using_object_ids?
|
270
|
+
#
|
271
|
+
# @return [ true, false ] If the class uses Moped::BSON::ObjectIds for the id.
|
272
|
+
#
|
273
|
+
# @since 1.0.0
|
274
|
+
def using_object_ids?
|
275
|
+
fields["_id"].object_id_field?
|
276
|
+
end
|
277
|
+
|
278
|
+
protected
|
279
|
+
|
280
|
+
# Add the defaults to the model. This breaks them up between ones that
|
281
|
+
# are procs and ones that are not.
|
282
|
+
#
|
283
|
+
# @example Add to the defaults.
|
284
|
+
# Model.add_defaults(field)
|
285
|
+
#
|
286
|
+
# @param [ Field ] field The field to add for.
|
287
|
+
#
|
288
|
+
# @since 2.4.0
|
289
|
+
def add_defaults(field)
|
290
|
+
default, name = field.default_val, field.name.to_s
|
291
|
+
remove_defaults(name)
|
292
|
+
unless default.nil?
|
293
|
+
if field.pre_processed?
|
294
|
+
pre_processed_defaults.push(name)
|
295
|
+
else
|
296
|
+
post_processed_defaults.push(name)
|
297
|
+
end
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
# Define a field attribute for the +Document+.
|
302
|
+
#
|
303
|
+
# @example Set the field.
|
304
|
+
# Person.add_field(:name, :default => "Test")
|
305
|
+
#
|
306
|
+
# @param [ Symbol ] name The name of the field.
|
307
|
+
# @param [ Hash ] options The hash of options.
|
308
|
+
def add_field(name, options = {})
|
309
|
+
aliased = options[:as]
|
310
|
+
aliased_fields[aliased.to_s] = name if aliased
|
311
|
+
field = field_for(name, options)
|
312
|
+
fields[name] = field
|
313
|
+
add_defaults(field)
|
314
|
+
create_accessors(name, name, options)
|
315
|
+
create_accessors(name, aliased, options) if aliased
|
316
|
+
process_options(field)
|
317
|
+
create_dirty_methods(name, name)
|
318
|
+
create_dirty_methods(name, aliased) if aliased
|
319
|
+
field
|
320
|
+
end
|
321
|
+
|
322
|
+
# Run through all custom options stored in Mongoid::Fields.options and
|
323
|
+
# execute the handler if the option is provided.
|
324
|
+
#
|
325
|
+
# @example
|
326
|
+
# Mongoid::Fields.option :custom do
|
327
|
+
# puts "called"
|
328
|
+
# end
|
329
|
+
#
|
330
|
+
# field = Mongoid::Fields.new(:test, :custom => true)
|
331
|
+
# Person.process_options(field)
|
332
|
+
# # => "called"
|
333
|
+
#
|
334
|
+
# @param [ Field ] field the field to process
|
335
|
+
def process_options(field)
|
336
|
+
field_options = field.options
|
337
|
+
|
338
|
+
Fields.options.each_pair do |option_name, handler|
|
339
|
+
if field_options.has_key?(option_name)
|
340
|
+
handler.call(self, field, field_options[option_name])
|
341
|
+
end
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
# Create the field accessors.
|
346
|
+
#
|
347
|
+
# @example Generate the accessors.
|
348
|
+
# Person.create_accessors(:name, "name")
|
349
|
+
# person.name #=> returns the field
|
350
|
+
# person.name = "" #=> sets the field
|
351
|
+
# person.name? #=> Is the field present?
|
352
|
+
# person.name_before_type_cast #=> returns the field before type cast
|
353
|
+
#
|
354
|
+
# @param [ Symbol ] name The name of the field.
|
355
|
+
# @param [ Symbol ] meth The name of the accessor.
|
356
|
+
# @param [ Hash ] options The options.
|
357
|
+
#
|
358
|
+
# @since 2.0.0
|
359
|
+
def create_accessors(name, meth, options = {})
|
360
|
+
field = fields[name]
|
361
|
+
|
362
|
+
create_field_getter(name, meth, field)
|
363
|
+
create_field_getter_before_type_cast(name, meth)
|
364
|
+
create_field_setter(name, meth, field)
|
365
|
+
create_field_check(name, meth)
|
366
|
+
|
367
|
+
if options[:localize]
|
368
|
+
create_translations_getter(name, meth)
|
369
|
+
create_translations_setter(name, meth, field)
|
370
|
+
localized_fields[name] = field
|
371
|
+
end
|
372
|
+
end
|
373
|
+
|
374
|
+
# Create the getter method for the provided field.
|
375
|
+
#
|
376
|
+
# @example Create the getter.
|
377
|
+
# Model.create_field_getter("name", "name", field)
|
378
|
+
#
|
379
|
+
# @param [ String ] name The name of the attribute.
|
380
|
+
# @param [ String ] meth The name of the method.
|
381
|
+
# @param [ Field ] field The field.
|
382
|
+
#
|
383
|
+
# @since 2.4.0
|
384
|
+
def create_field_getter(name, meth, field)
|
385
|
+
generated_methods.module_eval do
|
386
|
+
re_define_method(meth) do
|
387
|
+
raw = read_attribute(name)
|
388
|
+
if lazy_settable?(field, raw)
|
389
|
+
write_attribute(name, field.eval_default(self))
|
390
|
+
else
|
391
|
+
value = field.demongoize(raw)
|
392
|
+
attribute_will_change!(name) if value.resizable?
|
393
|
+
value
|
394
|
+
end
|
395
|
+
end
|
396
|
+
end
|
397
|
+
end
|
398
|
+
|
399
|
+
# Create the getter_before_type_cast method for the provided field. If
|
400
|
+
# the attribute has been assigned, return the attribute before it was
|
401
|
+
# type cast. Otherwise, delegate to the getter.
|
402
|
+
#
|
403
|
+
# @example Create the getter_before_type_cast.
|
404
|
+
# Model.create_field_getter_before_type_cast("name", "name")
|
405
|
+
#
|
406
|
+
# @param [ String ] name The name of the attribute.
|
407
|
+
# @param [ String ] meth The name of the method.
|
408
|
+
#
|
409
|
+
# @since 3.1.0
|
410
|
+
def create_field_getter_before_type_cast(name, meth)
|
411
|
+
generated_methods.module_eval do
|
412
|
+
re_define_method("#{meth}_before_type_cast") do
|
413
|
+
if has_attribute_before_type_cast?(name)
|
414
|
+
read_attribute_before_type_cast(name)
|
415
|
+
else
|
416
|
+
send meth
|
417
|
+
end
|
418
|
+
end
|
419
|
+
end
|
420
|
+
end
|
421
|
+
|
422
|
+
# Create the setter method for the provided field.
|
423
|
+
#
|
424
|
+
# @example Create the setter.
|
425
|
+
# Model.create_field_setter("name", "name")
|
426
|
+
#
|
427
|
+
# @param [ String ] name The name of the attribute.
|
428
|
+
# @param [ String ] meth The name of the method.
|
429
|
+
# @param [ Field ] field The field.
|
430
|
+
#
|
431
|
+
# @since 2.4.0
|
432
|
+
def create_field_setter(name, meth, field)
|
433
|
+
generated_methods.module_eval do
|
434
|
+
re_define_method("#{meth}=") do |value|
|
435
|
+
val = write_attribute(name, value)
|
436
|
+
if field.foreign_key?
|
437
|
+
remove_ivar(field.metadata.name)
|
438
|
+
end
|
439
|
+
val
|
440
|
+
end
|
441
|
+
end
|
442
|
+
end
|
443
|
+
|
444
|
+
# Create the check method for the provided field.
|
445
|
+
#
|
446
|
+
# @example Create the check.
|
447
|
+
# Model.create_field_check("name", "name")
|
448
|
+
#
|
449
|
+
# @param [ String ] name The name of the attribute.
|
450
|
+
# @param [ String ] meth The name of the method.
|
451
|
+
#
|
452
|
+
# @since 2.4.0
|
453
|
+
def create_field_check(name, meth)
|
454
|
+
generated_methods.module_eval do
|
455
|
+
re_define_method("#{meth}?") do
|
456
|
+
attr = read_attribute(name)
|
457
|
+
attr == true || attr.present?
|
458
|
+
end
|
459
|
+
end
|
460
|
+
end
|
461
|
+
|
462
|
+
# Create the translation getter method for the provided field.
|
463
|
+
#
|
464
|
+
# @example Create the translation getter.
|
465
|
+
# Model.create_translations_getter("name", "name")
|
466
|
+
#
|
467
|
+
# @param [ String ] name The name of the attribute.
|
468
|
+
# @param [ String ] meth The name of the method.
|
469
|
+
#
|
470
|
+
# @since 2.4.0
|
471
|
+
def create_translations_getter(name, meth)
|
472
|
+
generated_methods.module_eval do
|
473
|
+
re_define_method("#{meth}_translations") do
|
474
|
+
(attributes[name] ||= {}).with_indifferent_access
|
475
|
+
end
|
476
|
+
alias_method :"#{meth}_t", :"#{meth}_translations"
|
477
|
+
end
|
478
|
+
end
|
479
|
+
|
480
|
+
# Create the translation setter method for the provided field.
|
481
|
+
#
|
482
|
+
# @example Create the translation setter.
|
483
|
+
# Model.create_translations_setter("name", "name")
|
484
|
+
#
|
485
|
+
# @param [ String ] name The name of the attribute.
|
486
|
+
# @param [ String ] meth The name of the method.
|
487
|
+
# @param [ Field ] field The field.
|
488
|
+
#
|
489
|
+
# @since 2.4.0
|
490
|
+
def create_translations_setter(name, meth, field)
|
491
|
+
generated_methods.module_eval do
|
492
|
+
re_define_method("#{meth}_translations=") do |value|
|
493
|
+
attribute_will_change!(name)
|
494
|
+
if value
|
495
|
+
value.update_values do |_value|
|
496
|
+
field.type.mongoize(_value)
|
497
|
+
end
|
498
|
+
end
|
499
|
+
attributes[name] = value
|
500
|
+
end
|
501
|
+
alias_method :"#{meth}_t=", :"#{meth}_translations="
|
502
|
+
end
|
503
|
+
end
|
504
|
+
|
505
|
+
# Include the field methods as a module, so they can be overridden.
|
506
|
+
#
|
507
|
+
# @example Include the fields.
|
508
|
+
# Person.generated_methods
|
509
|
+
#
|
510
|
+
# @return [ Module ] The module of generated methods.
|
511
|
+
#
|
512
|
+
# @since 2.0.0
|
513
|
+
def generated_methods
|
514
|
+
@generated_methods ||= begin
|
515
|
+
mod = Module.new
|
516
|
+
include(mod)
|
517
|
+
mod
|
518
|
+
end
|
519
|
+
end
|
520
|
+
|
521
|
+
# Remove the default keys for the provided name.
|
522
|
+
#
|
523
|
+
# @example Remove the default keys.
|
524
|
+
# Model.remove_defaults(name)
|
525
|
+
#
|
526
|
+
# @param [ String ] name The field name.
|
527
|
+
#
|
528
|
+
# @since 2.4.0
|
529
|
+
def remove_defaults(name)
|
530
|
+
pre_processed_defaults.delete_one(name)
|
531
|
+
post_processed_defaults.delete_one(name)
|
532
|
+
end
|
533
|
+
|
534
|
+
def field_for(name, options)
|
535
|
+
opts = options.merge(klass: self)
|
536
|
+
return Fields::Localized.new(name, opts) if options[:localize]
|
537
|
+
return Fields::ForeignKey.new(name, opts) if options[:identity]
|
538
|
+
Fields::Standard.new(name, opts)
|
539
|
+
end
|
540
|
+
end
|
541
|
+
end
|
542
|
+
end
|