mongoid 7.1.2 → 7.2.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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/README.md +9 -2
- data/Rakefile +45 -5
- data/lib/config/locales/en.yml +38 -2
- data/lib/mongoid.rb +23 -0
- data/lib/mongoid/association/accessors.rb +37 -2
- data/lib/mongoid/association/depending.rb +1 -6
- data/lib/mongoid/association/many.rb +3 -3
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +36 -1
- data/lib/mongoid/association/referenced/has_many/proxy.rb +8 -1
- data/lib/mongoid/association/referenced/has_one/buildable.rb +9 -1
- data/lib/mongoid/association/referenced/has_one/proxy.rb +6 -1
- data/lib/mongoid/atomic/modifiers.rb +1 -1
- data/lib/mongoid/attributes/dynamic.rb +1 -1
- data/lib/mongoid/clients/factory.rb +19 -2
- data/lib/mongoid/clients/options.rb +8 -8
- data/lib/mongoid/clients/sessions.rb +20 -4
- data/lib/mongoid/clients/storage_options.rb +5 -5
- data/lib/mongoid/composable.rb +1 -0
- data/lib/mongoid/config.rb +3 -0
- data/lib/mongoid/contextual/mongo.rb +23 -4
- data/lib/mongoid/copyable.rb +7 -3
- data/lib/mongoid/criteria.rb +57 -7
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +12 -0
- data/lib/mongoid/criteria/queryable/key.rb +1 -1
- data/lib/mongoid/criteria/queryable/mergeable.rb +2 -2
- data/lib/mongoid/criteria/queryable/selectable.rb +21 -6
- data/lib/mongoid/criteria/queryable/selector.rb +3 -3
- data/lib/mongoid/criteria/queryable/storable.rb +3 -3
- data/lib/mongoid/document.rb +15 -3
- data/lib/mongoid/errors.rb +7 -0
- data/lib/mongoid/errors/invalid_discriminator_key_target.rb +25 -0
- data/lib/mongoid/errors/invalid_elem_match_operator.rb +33 -0
- data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +26 -0
- data/lib/mongoid/errors/invalid_expression_operator.rb +28 -0
- data/lib/mongoid/errors/invalid_field_operator.rb +33 -0
- data/lib/mongoid/errors/invalid_query.rb +41 -0
- data/lib/mongoid/errors/no_client_config.rb +2 -2
- data/lib/mongoid/errors/no_default_client.rb +1 -1
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/factory.rb +27 -10
- data/lib/mongoid/fields.rb +3 -0
- data/lib/mongoid/fields/validators/macro.rb +26 -10
- data/lib/mongoid/findable.rb +50 -14
- data/lib/mongoid/indexable.rb +2 -2
- data/lib/mongoid/matchable.rb +1 -149
- data/lib/mongoid/matcher.rb +127 -0
- data/lib/mongoid/matcher/all.rb +22 -0
- data/lib/mongoid/matcher/and.rb +21 -0
- data/lib/mongoid/matcher/elem_match.rb +35 -0
- data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
- data/lib/mongoid/matcher/eq.rb +11 -0
- data/lib/mongoid/matcher/eq_impl.rb +32 -0
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
- data/lib/mongoid/matcher/exists.rb +15 -0
- data/lib/mongoid/matcher/expression.rb +40 -0
- data/lib/mongoid/matcher/expression_operator.rb +19 -0
- data/lib/mongoid/matcher/field_expression.rb +63 -0
- data/lib/mongoid/matcher/field_operator.rb +52 -0
- data/lib/mongoid/matcher/gt.rb +17 -0
- data/lib/mongoid/matcher/gte.rb +17 -0
- data/lib/mongoid/matcher/in.rb +25 -0
- data/lib/mongoid/matcher/lt.rb +17 -0
- data/lib/mongoid/matcher/lte.rb +17 -0
- data/lib/mongoid/matcher/ne.rb +16 -0
- data/lib/mongoid/matcher/nin.rb +11 -0
- data/lib/mongoid/matcher/nor.rb +25 -0
- data/lib/mongoid/matcher/not.rb +29 -0
- data/lib/mongoid/matcher/or.rb +21 -0
- data/lib/mongoid/matcher/regex.rb +41 -0
- data/lib/mongoid/matcher/size.rb +26 -0
- data/lib/mongoid/persistable/deletable.rb +1 -1
- data/lib/mongoid/query_cache.rb +81 -37
- data/lib/mongoid/reloadable.rb +2 -2
- data/lib/mongoid/serializable.rb +1 -1
- data/lib/mongoid/stringified_symbol.rb +53 -0
- data/lib/mongoid/tasks/database.rb +38 -3
- data/lib/mongoid/traversable.rb +111 -4
- data/lib/mongoid/version.rb +1 -1
- data/spec/README.md +19 -4
- data/spec/integration/app_spec.rb +85 -23
- data/spec/integration/associations/embedded_spec.rb +94 -0
- data/spec/integration/associations/embeds_many_spec.rb +24 -0
- data/spec/integration/associations/embeds_one_spec.rb +24 -0
- data/spec/integration/associations/has_many_spec.rb +129 -0
- data/spec/integration/associations/has_one_spec.rb +129 -0
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
- data/spec/integration/atomic/modifiers_spec.rb +117 -0
- data/spec/integration/bson_regexp_raw_spec.rb +20 -0
- data/spec/integration/criteria/date_field_spec.rb +41 -0
- data/spec/integration/discriminator_key_spec.rb +354 -0
- data/spec/integration/discriminator_value_spec.rb +207 -0
- data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -41
- data/spec/integration/matcher_operator_data/all.yml +140 -0
- data/spec/integration/matcher_operator_data/and.yml +93 -0
- data/spec/integration/matcher_operator_data/elem_match.yml +363 -0
- data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
- data/spec/integration/matcher_operator_data/eq.yml +191 -0
- data/spec/integration/matcher_operator_data/exists.yml +213 -0
- data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
- data/spec/integration/matcher_operator_data/gt.yml +132 -0
- data/spec/integration/matcher_operator_data/gte.yml +132 -0
- data/spec/integration/matcher_operator_data/implicit.yml +331 -0
- data/spec/integration/matcher_operator_data/implicit_traversal.yml +16 -0
- data/spec/integration/matcher_operator_data/in.yml +194 -0
- data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
- data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
- data/spec/integration/matcher_operator_data/lt.yml +132 -0
- data/spec/integration/matcher_operator_data/lte.yml +132 -0
- data/spec/integration/matcher_operator_data/multiple.yml +29 -0
- data/spec/integration/matcher_operator_data/ne.yml +150 -0
- data/spec/integration/matcher_operator_data/nin.yml +114 -0
- data/spec/integration/matcher_operator_data/nor.yml +126 -0
- data/spec/integration/matcher_operator_data/not.yml +196 -0
- data/spec/integration/matcher_operator_data/or.yml +137 -0
- data/spec/integration/matcher_operator_data/regex.yml +174 -0
- data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
- data/spec/integration/matcher_operator_data/size.yml +174 -0
- data/spec/integration/matcher_operator_spec.rb +100 -0
- data/spec/integration/matcher_spec.rb +189 -0
- data/spec/integration/server_query_spec.rb +142 -0
- data/spec/integration/shardable_spec.rb +20 -4
- data/spec/integration/stringified_symbol_field_spec.rb +190 -0
- data/spec/lite_spec_helper.rb +4 -2
- data/spec/mongoid/association/accessors_spec.rb +238 -63
- data/spec/mongoid/association/depending_spec.rb +78 -26
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +33 -0
- data/spec/mongoid/association/embedded/embeds_many_models.rb +1 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +1 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +138 -0
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +105 -0
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +460 -186
- data/spec/mongoid/association/referenced/has_many_models.rb +21 -0
- data/spec/mongoid/association/referenced/has_one_models.rb +21 -0
- data/spec/mongoid/association/referenced/has_one_spec.rb +1 -1
- data/spec/mongoid/atomic/modifiers_spec.rb +47 -0
- data/spec/mongoid/atomic_spec.rb +23 -0
- data/spec/mongoid/attributes/nested_spec.rb +1 -1
- data/spec/mongoid/clients/factory_spec.rb +45 -8
- data/spec/mongoid/clients/options_spec.rb +9 -9
- data/spec/mongoid/clients/sessions_spec.rb +1 -6
- data/spec/mongoid/config_spec.rb +28 -0
- data/spec/mongoid/contextual/geo_near_spec.rb +11 -2
- data/spec/mongoid/contextual/mongo_spec.rb +70 -16
- data/spec/mongoid/copyable_spec.rb +197 -18
- data/spec/mongoid/copyable_spec_models.rb +28 -0
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +19 -7
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +28 -1
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +84 -82
- data/spec/mongoid/criteria_spec.rb +204 -39
- data/spec/mongoid/document_spec.rb +89 -15
- data/spec/mongoid/equality_spec.rb +0 -1
- data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_config_spec.rb +2 -2
- data/spec/mongoid/errors/no_client_database_spec.rb +3 -3
- data/spec/mongoid/errors/no_client_hosts_spec.rb +3 -3
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +85 -0
- data/spec/mongoid/factory_spec.rb +261 -28
- data/spec/mongoid/fields_spec.rb +72 -3
- data/spec/mongoid/findable_spec.rb +32 -0
- data/spec/mongoid/indexable_spec.rb +28 -2
- data/spec/mongoid/inspectable_spec.rb +29 -2
- data/spec/mongoid/interceptable_spec.rb +2 -2
- data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +259 -0
- data/spec/mongoid/matcher/extract_attribute_spec.rb +47 -0
- data/spec/mongoid/persistable/creatable_spec.rb +108 -25
- data/spec/mongoid/persistable/deletable_spec.rb +86 -0
- data/spec/mongoid/persistable/savable_spec.rb +174 -16
- data/spec/mongoid/query_cache_middleware_spec.rb +16 -3
- data/spec/mongoid/query_cache_spec.rb +496 -28
- data/spec/mongoid/reloadable_spec.rb +72 -0
- data/spec/mongoid/serializable_spec.rb +21 -3
- data/spec/mongoid/traversable_spec.rb +1100 -0
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/constraints.rb +303 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
- data/spec/spec_helper.rb +4 -2
- data/spec/support/constraints.rb +20 -222
- data/spec/support/helpers.rb +1 -1
- data/spec/{app → support}/models/account.rb +0 -0
- data/spec/{app → support}/models/acolyte.rb +0 -0
- data/spec/{app → support}/models/actor.rb +1 -1
- data/spec/{app → support}/models/actress.rb +0 -0
- data/spec/{app → support}/models/address.rb +0 -0
- data/spec/{app → support}/models/address_component.rb +0 -0
- data/spec/{app → support}/models/address_number.rb +0 -0
- data/spec/{app → support}/models/agency.rb +0 -0
- data/spec/{app → support}/models/agent.rb +0 -0
- data/spec/{app → support}/models/album.rb +0 -0
- data/spec/{app → support}/models/alert.rb +0 -0
- data/spec/{app → support}/models/animal.rb +0 -0
- data/spec/{app → support}/models/answer.rb +0 -0
- data/spec/{app → support}/models/appointment.rb +0 -0
- data/spec/support/models/armrest.rb +10 -0
- data/spec/{app → support}/models/array_field.rb +0 -0
- data/spec/{app → support}/models/article.rb +0 -0
- data/spec/{app → support}/models/artist.rb +0 -0
- data/spec/{app → support}/models/artwork.rb +0 -0
- data/spec/{app → support}/models/audio.rb +0 -0
- data/spec/{app → support}/models/augmentation.rb +0 -0
- data/spec/{app → support}/models/author.rb +0 -0
- data/spec/{app → support}/models/baby.rb +0 -0
- data/spec/{app → support}/models/band.rb +0 -0
- data/spec/{app → support}/models/bar.rb +0 -0
- data/spec/{app → support}/models/basic.rb +0 -0
- data/spec/{app → support}/models/bed.rb +0 -0
- data/spec/{app → support}/models/big_palette.rb +0 -0
- data/spec/{app → support}/models/birthday.rb +0 -0
- data/spec/{app → support}/models/bomb.rb +0 -0
- data/spec/{app → support}/models/book.rb +0 -0
- data/spec/{app → support}/models/breed.rb +0 -0
- data/spec/{app → support}/models/browser.rb +1 -1
- data/spec/{app → support}/models/building.rb +0 -0
- data/spec/{app → support}/models/building_address.rb +0 -0
- data/spec/{app → support}/models/bus.rb +0 -0
- data/spec/{app → support}/models/business.rb +0 -0
- data/spec/{app → support}/models/callback_test.rb +0 -0
- data/spec/{app → support}/models/canvas.rb +1 -1
- data/spec/{app → support}/models/car.rb +0 -0
- data/spec/{app → support}/models/cat.rb +0 -0
- data/spec/{app → support}/models/category.rb +0 -0
- data/spec/{app → support}/models/child.rb +0 -0
- data/spec/{app → support}/models/child_doc.rb +0 -0
- data/spec/{app → support}/models/church.rb +0 -0
- data/spec/{app → support}/models/circle.rb +0 -0
- data/spec/{app → support}/models/circuit.rb +0 -0
- data/spec/{app → support}/models/circus.rb +0 -0
- data/spec/{app → support}/models/code.rb +0 -0
- data/spec/{app → support}/models/coding.rb +1 -1
- data/spec/{app → support}/models/coding/pull_request.rb +0 -0
- data/spec/{app → support}/models/comment.rb +0 -0
- data/spec/{app → support}/models/company.rb +0 -0
- data/spec/{app → support}/models/consumption_period.rb +0 -0
- data/spec/{app → support}/models/contextable_item.rb +0 -0
- data/spec/{app → support}/models/contractor.rb +0 -0
- data/spec/{app → support}/models/cookie.rb +0 -0
- data/spec/{app → support}/models/country_code.rb +0 -0
- data/spec/{app → support}/models/courier_job.rb +0 -0
- data/spec/support/models/crate.rb +13 -0
- data/spec/support/models/deed.rb +8 -0
- data/spec/{app → support}/models/definition.rb +0 -0
- data/spec/{app → support}/models/delegating_patient.rb +0 -0
- data/spec/{app → support}/models/description.rb +0 -0
- data/spec/{app → support}/models/dictionary.rb +0 -0
- data/spec/{app → support}/models/division.rb +0 -0
- data/spec/{app → support}/models/doctor.rb +0 -0
- data/spec/{app → support}/models/dog.rb +0 -0
- data/spec/{app → support}/models/dokument.rb +0 -0
- data/spec/{app → support}/models/draft.rb +0 -0
- data/spec/{app → support}/models/dragon.rb +0 -0
- data/spec/{app → support}/models/driver.rb +1 -1
- data/spec/{app → support}/models/drug.rb +0 -0
- data/spec/{app → support}/models/dungeon.rb +0 -0
- data/spec/{app → support}/models/edit.rb +0 -0
- data/spec/{app → support}/models/email.rb +0 -0
- data/spec/{app → support}/models/employer.rb +0 -0
- data/spec/{app → support}/models/entry.rb +0 -0
- data/spec/{app → support}/models/eraser.rb +0 -0
- data/spec/{app → support}/models/even.rb +0 -0
- data/spec/{app → support}/models/event.rb +0 -0
- data/spec/{app → support}/models/exhibition.rb +0 -0
- data/spec/{app → support}/models/exhibitor.rb +0 -0
- data/spec/{app → support}/models/explosion.rb +0 -0
- data/spec/{app → support}/models/eye.rb +0 -0
- data/spec/{app → support}/models/eye_bowl.rb +0 -0
- data/spec/{app → support}/models/face.rb +0 -0
- data/spec/{app → support}/models/favorite.rb +0 -0
- data/spec/{app → support}/models/filesystem.rb +0 -0
- data/spec/{app → support}/models/fire_hydrant.rb +0 -0
- data/spec/{app → support}/models/firefox.rb +0 -0
- data/spec/{app → support}/models/fish.rb +0 -0
- data/spec/{app → support}/models/folder.rb +0 -0
- data/spec/{app → support}/models/folder_item.rb +0 -0
- data/spec/{app → support}/models/fruits.rb +0 -0
- data/spec/{app → support}/models/game.rb +0 -0
- data/spec/{app → support}/models/ghost.rb +0 -0
- data/spec/support/models/guitar.rb +5 -0
- data/spec/{app → support}/models/home.rb +0 -0
- data/spec/{app → support}/models/house.rb +0 -0
- data/spec/{app → support}/models/html_writer.rb +0 -0
- data/spec/{app → support}/models/id_key.rb +0 -0
- data/spec/support/models/idnodef.rb +8 -0
- data/spec/{app → support}/models/image.rb +0 -0
- data/spec/{app → support}/models/implant.rb +0 -0
- data/spec/support/models/instrument.rb +9 -0
- data/spec/{app → support}/models/item.rb +1 -1
- data/spec/{app → support}/models/jar.rb +0 -0
- data/spec/{app → support}/models/kaleidoscope.rb +0 -0
- data/spec/{app → support}/models/kangaroo.rb +0 -0
- data/spec/{app → support}/models/label.rb +0 -0
- data/spec/{app → support}/models/language.rb +0 -0
- data/spec/{app → support}/models/lat_lng.rb +0 -0
- data/spec/{app → support}/models/league.rb +0 -0
- data/spec/{app → support}/models/learner.rb +0 -0
- data/spec/{app → support}/models/line_item.rb +0 -0
- data/spec/{app → support}/models/location.rb +0 -0
- data/spec/{app → support}/models/login.rb +0 -0
- data/spec/{app → support}/models/manufacturer.rb +0 -0
- data/spec/{app → support}/models/meat.rb +0 -0
- data/spec/{app → support}/models/membership.rb +0 -0
- data/spec/{app → support}/models/message.rb +0 -0
- data/spec/{app → support}/models/minim.rb +0 -0
- data/spec/{app → support}/models/mixed_drink.rb +0 -0
- data/spec/support/models/mop.rb +16 -0
- data/spec/{app → support}/models/movie.rb +0 -0
- data/spec/{app → support}/models/my_hash.rb +0 -0
- data/spec/{app → support}/models/name.rb +0 -0
- data/spec/{app → support}/models/name_only.rb +0 -0
- data/spec/{app → support}/models/node.rb +0 -0
- data/spec/{app → support}/models/note.rb +0 -0
- data/spec/{app → support}/models/odd.rb +0 -0
- data/spec/support/models/order.rb +11 -0
- data/spec/{app → support}/models/ordered_post.rb +0 -0
- data/spec/{app → support}/models/ordered_preference.rb +0 -0
- data/spec/{app → support}/models/oscar.rb +0 -0
- data/spec/{app → support}/models/other_owner_object.rb +0 -0
- data/spec/{app → support}/models/override.rb +0 -0
- data/spec/{app → support}/models/ownable.rb +0 -0
- data/spec/{app → support}/models/owner.rb +2 -0
- data/spec/{app → support}/models/pack.rb +0 -0
- data/spec/{app → support}/models/page.rb +0 -0
- data/spec/{app → support}/models/page_question.rb +0 -0
- data/spec/{app → support}/models/palette.rb +1 -1
- data/spec/{app → support}/models/parent.rb +0 -0
- data/spec/{app → support}/models/parent_doc.rb +0 -0
- data/spec/{app → support}/models/passport.rb +1 -0
- data/spec/{app → support}/models/patient.rb +0 -0
- data/spec/{app → support}/models/pdf_writer.rb +0 -0
- data/spec/{app → support}/models/pencil.rb +0 -0
- data/spec/{app → support}/models/person.rb +3 -1
- data/spec/{app → support}/models/pet.rb +0 -0
- data/spec/{app → support}/models/pet_owner.rb +0 -0
- data/spec/{app → support}/models/phone.rb +1 -0
- data/spec/support/models/piano.rb +5 -0
- data/spec/{app → support}/models/pizza.rb +0 -0
- data/spec/{app → support}/models/player.rb +0 -0
- data/spec/{app → support}/models/post.rb +0 -0
- data/spec/{app → support}/models/post_genre.rb +0 -0
- data/spec/{app → support}/models/powerup.rb +0 -0
- data/spec/{app → support}/models/preference.rb +0 -0
- data/spec/{app → support}/models/princess.rb +0 -0
- data/spec/{app → support}/models/product.rb +0 -0
- data/spec/support/models/profile.rb +18 -0
- data/spec/{app → support}/models/pronunciation.rb +0 -0
- data/spec/{app → support}/models/pub.rb +0 -0
- data/spec/support/models/publication.rb +5 -0
- data/spec/{app → support}/models/publication/encyclopedia.rb +0 -0
- data/spec/{app → support}/models/publication/review.rb +0 -0
- data/spec/{app → support}/models/purchase.rb +0 -0
- data/spec/{app → support}/models/question.rb +0 -0
- data/spec/{app → support}/models/quiz.rb +0 -0
- data/spec/{app → support}/models/rating.rb +0 -0
- data/spec/{app → support}/models/record.rb +0 -0
- data/spec/{app → support}/models/registry.rb +0 -0
- data/spec/{app → support}/models/role.rb +0 -0
- data/spec/{app → support}/models/root_category.rb +0 -0
- data/spec/{app → support}/models/sandwich.rb +0 -0
- data/spec/{app → support}/models/scheduler.rb +0 -0
- data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -2
- data/spec/support/models/seat.rb +25 -0
- data/spec/{app → support}/models/seo.rb +0 -0
- data/spec/{app → support}/models/series.rb +1 -0
- data/spec/{app → support}/models/server.rb +0 -0
- data/spec/{app → support}/models/service.rb +0 -0
- data/spec/{app → support}/models/shape.rb +2 -2
- data/spec/{app → support}/models/shelf.rb +0 -0
- data/spec/{app → support}/models/shipment_address.rb +0 -0
- data/spec/{app → support}/models/shipping_container.rb +0 -0
- data/spec/{app → support}/models/shipping_pack.rb +0 -0
- data/spec/{app → support}/models/shop.rb +0 -0
- data/spec/{app → support}/models/short_agent.rb +0 -0
- data/spec/{app → support}/models/short_quiz.rb +0 -0
- data/spec/{app → support}/models/simple.rb +0 -0
- data/spec/{app → support}/models/slave.rb +0 -0
- data/spec/{app → support}/models/song.rb +0 -0
- data/spec/{app → support}/models/sound.rb +0 -0
- data/spec/{app → support}/models/square.rb +0 -0
- data/spec/{app → support}/models/staff.rb +0 -0
- data/spec/{app → support}/models/store_as_dup_test1.rb +0 -0
- data/spec/{app → support}/models/store_as_dup_test2.rb +0 -0
- data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
- data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
- data/spec/{app → support}/models/strategy.rb +0 -0
- data/spec/{app → support}/models/sub_item.rb +0 -0
- data/spec/{app → support}/models/subscription.rb +0 -0
- data/spec/{app → support}/models/survey.rb +0 -0
- data/spec/{app → support}/models/symptom.rb +0 -0
- data/spec/support/models/system_role.rb +7 -0
- data/spec/{app → support}/models/tag.rb +0 -0
- data/spec/{app → support}/models/target.rb +0 -0
- data/spec/{app → support}/models/template.rb +0 -0
- data/spec/{app → support}/models/thing.rb +0 -0
- data/spec/{app → support}/models/title.rb +0 -0
- data/spec/{app → support}/models/tool.rb +2 -2
- data/spec/{app → support}/models/topping.rb +0 -0
- data/spec/support/models/toy.rb +10 -0
- data/spec/{app → support}/models/track.rb +0 -0
- data/spec/{app → support}/models/translation.rb +0 -0
- data/spec/{app → support}/models/tree.rb +0 -0
- data/spec/{app → support}/models/truck.rb +2 -0
- data/spec/{app → support}/models/updatable.rb +0 -0
- data/spec/{app → support}/models/user.rb +0 -0
- data/spec/{app → support}/models/user_account.rb +0 -0
- data/spec/{app → support}/models/validation_callback.rb +0 -0
- data/spec/{app → support}/models/vehicle.rb +7 -2
- data/spec/{app → support}/models/version.rb +0 -0
- data/spec/{app → support}/models/vertex.rb +0 -0
- data/spec/{app → support}/models/vet_visit.rb +0 -0
- data/spec/{app → support}/models/video.rb +0 -0
- data/spec/{app → support}/models/video_game.rb +0 -0
- data/spec/{app → support}/models/weapon.rb +0 -0
- data/spec/{app → support}/models/wiki_page.rb +1 -0
- data/spec/{app → support}/models/word.rb +0 -0
- data/spec/{app → support}/models/word_origin.rb +0 -0
- data/spec/{app → support}/models/writer.rb +2 -2
- data/spec/support/session_registry.rb +50 -0
- data/spec/support/spec_config.rb +1 -1
- metadata +857 -739
- metadata.gz.sig +0 -0
- data/lib/mongoid/matchable/all.rb +0 -30
- data/lib/mongoid/matchable/and.rb +0 -32
- data/lib/mongoid/matchable/default.rb +0 -121
- data/lib/mongoid/matchable/elem_match.rb +0 -36
- data/lib/mongoid/matchable/eq.rb +0 -23
- data/lib/mongoid/matchable/exists.rb +0 -25
- data/lib/mongoid/matchable/gt.rb +0 -25
- data/lib/mongoid/matchable/gte.rb +0 -25
- data/lib/mongoid/matchable/in.rb +0 -26
- data/lib/mongoid/matchable/lt.rb +0 -25
- data/lib/mongoid/matchable/lte.rb +0 -25
- data/lib/mongoid/matchable/ne.rb +0 -23
- data/lib/mongoid/matchable/nin.rb +0 -24
- data/lib/mongoid/matchable/nor.rb +0 -38
- data/lib/mongoid/matchable/or.rb +0 -35
- data/lib/mongoid/matchable/regexp.rb +0 -30
- data/lib/mongoid/matchable/size.rb +0 -23
- data/spec/app/models/publication.rb +0 -5
- data/spec/mongoid/matchable/all_spec.rb +0 -34
- data/spec/mongoid/matchable/and_spec.rb +0 -190
- data/spec/mongoid/matchable/default_spec.rb +0 -140
- data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
- data/spec/mongoid/matchable/eq_spec.rb +0 -49
- data/spec/mongoid/matchable/exists_spec.rb +0 -60
- data/spec/mongoid/matchable/gt_spec.rb +0 -89
- data/spec/mongoid/matchable/gte_spec.rb +0 -87
- data/spec/mongoid/matchable/in_spec.rb +0 -52
- data/spec/mongoid/matchable/lt_spec.rb +0 -88
- data/spec/mongoid/matchable/lte_spec.rb +0 -88
- data/spec/mongoid/matchable/ne_spec.rb +0 -49
- data/spec/mongoid/matchable/nin_spec.rb +0 -51
- data/spec/mongoid/matchable/nor_spec.rb +0 -210
- data/spec/mongoid/matchable/or_spec.rb +0 -134
- data/spec/mongoid/matchable/regexp_spec.rb +0 -62
- data/spec/mongoid/matchable/size_spec.rb +0 -28
- data/spec/mongoid/matchable_spec.rb +0 -856
- data/spec/support/child_process_helper.rb +0 -76
- data/spec/support/lite_constraints.rb +0 -22
|
@@ -237,9 +237,9 @@ module Mongoid
|
|
|
237
237
|
# Similarly, this method should never need to expand a literal value
|
|
238
238
|
# and an operator at the same time.
|
|
239
239
|
#
|
|
240
|
-
# @param [ Hash ] Criteria including Key instances.
|
|
240
|
+
# @param [ Hash ] expr Criteria including Key instances.
|
|
241
241
|
#
|
|
242
|
-
# @return [ Hash ]
|
|
242
|
+
# @return [ Hash ] The expanded criteria.
|
|
243
243
|
private def _mongoid_expand_keys(expr)
|
|
244
244
|
unless expr.is_a?(Hash)
|
|
245
245
|
raise ArgumentError, 'Argument must be a Hash'
|
|
@@ -219,32 +219,44 @@ module Mongoid
|
|
|
219
219
|
# Source: https://docs.mongodb.com/manual/reference/operator/query/box/
|
|
220
220
|
#
|
|
221
221
|
# @example Add a geo intersect criterion for a line.
|
|
222
|
-
# query.
|
|
222
|
+
# query.geo_spatial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
|
|
223
223
|
#
|
|
224
224
|
# @example Add a geo intersect criterion for a point.
|
|
225
|
-
# query.
|
|
225
|
+
# query.geo_spatial(:location.intersects_point => [[ 1, 10 ]])
|
|
226
226
|
#
|
|
227
227
|
# @example Add a geo intersect criterion for a polygon.
|
|
228
|
-
# query.
|
|
228
|
+
# query.geo_spatial(:location.intersects_polygon => [[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]])
|
|
229
229
|
#
|
|
230
230
|
# @example Add a geo within criterion for a polygon.
|
|
231
|
-
# query.
|
|
231
|
+
# query.geo_spatial(:location.within_polygon => [[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]])
|
|
232
232
|
#
|
|
233
233
|
# @example Add a geo within criterion for a box.
|
|
234
|
-
# query.
|
|
234
|
+
# query.geo_spatial(:location.within_box => [[ 1, 10 ], [ 2, 10 ])
|
|
235
235
|
#
|
|
236
236
|
# @param [ Hash ] criterion The criterion.
|
|
237
237
|
#
|
|
238
238
|
# @return [ Selectable ] The cloned selectable.
|
|
239
|
+
def geo_spatial(criterion)
|
|
240
|
+
if criterion.nil?
|
|
241
|
+
raise Errors::CriteriaArgumentRequired, :geo_spatial
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
__merge__(criterion)
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
# Alias for +geo_spatial+.
|
|
239
248
|
#
|
|
240
|
-
# @
|
|
249
|
+
# @deprecated
|
|
241
250
|
def geo_spacial(criterion)
|
|
251
|
+
# Duplicate method body so that we can raise this exception with
|
|
252
|
+
# geo_spacial as the indicated operator rather than geo_spatial.
|
|
242
253
|
if criterion.nil?
|
|
243
254
|
raise Errors::CriteriaArgumentRequired, :geo_spacial
|
|
244
255
|
end
|
|
245
256
|
|
|
246
257
|
__merge__(criterion)
|
|
247
258
|
end
|
|
259
|
+
|
|
248
260
|
key :intersects_line, :override, "$geoIntersects", "$geometry" do |value|
|
|
249
261
|
{ "type" => LINE_STRING, "coordinates" => value }
|
|
250
262
|
end
|
|
@@ -872,6 +884,9 @@ module Mongoid
|
|
|
872
884
|
end
|
|
873
885
|
|
|
874
886
|
clone.tap do |query|
|
|
887
|
+
unless Hash === criterion
|
|
888
|
+
raise Errors::InvalidQuery, "Expression must be a Hash: #{Errors::InvalidQuery.truncate_expr(criterion)}"
|
|
889
|
+
end
|
|
875
890
|
criterion.each do |field, value|
|
|
876
891
|
field_s = field.to_s
|
|
877
892
|
if field_s[0] == ?$
|
|
@@ -84,16 +84,16 @@ module Mongoid
|
|
|
84
84
|
# Evolves a multi-list selection, like an $and or $or criterion, and
|
|
85
85
|
# performs the necessary serialization.
|
|
86
86
|
#
|
|
87
|
-
# @api private
|
|
88
|
-
#
|
|
89
87
|
# @example Evolve the multi-selection.
|
|
90
88
|
# selector.evolve_multi([{ field: "value" }])
|
|
91
89
|
#
|
|
92
|
-
# @param [ Array<Hash> ]
|
|
90
|
+
# @param [ Array<Hash> ] specs The multi-selection.
|
|
93
91
|
#
|
|
94
92
|
# @return [ Array<Hash> ] The serialized values.
|
|
95
93
|
#
|
|
96
94
|
# @since 1.0.0
|
|
95
|
+
#
|
|
96
|
+
# @api private
|
|
97
97
|
def evolve_multi(specs)
|
|
98
98
|
unless specs.is_a?(Array)
|
|
99
99
|
raise ArgumentError, "specs is not an array: #{specs.inspect}"
|
|
@@ -74,7 +74,7 @@ module Mongoid
|
|
|
74
74
|
#
|
|
75
75
|
# This method takes the operator and the operator value expression
|
|
76
76
|
# separately for callers' convenience. It can be considered to
|
|
77
|
-
# handle storing the hash
|
|
77
|
+
# handle storing the hash +{operator => op_expr}+.
|
|
78
78
|
#
|
|
79
79
|
# If the selector consists of a single condition which is the specified
|
|
80
80
|
# operator (on the top level), the new condition given in op_expr is
|
|
@@ -115,7 +115,7 @@ module Mongoid
|
|
|
115
115
|
end
|
|
116
116
|
|
|
117
117
|
unless op_expr.is_a?(Array)
|
|
118
|
-
raise
|
|
118
|
+
raise Errors::InvalidQuery, "#{operator} argument must be an array: #{Errors::InvalidQuery.truncate_expr(op_expr)}"
|
|
119
119
|
end
|
|
120
120
|
|
|
121
121
|
if selector.length == 1 && selector.keys.first == operator
|
|
@@ -141,7 +141,7 @@ module Mongoid
|
|
|
141
141
|
#
|
|
142
142
|
# This method takes the operator and the operator value expression
|
|
143
143
|
# separately for callers' convenience. It can be considered to
|
|
144
|
-
# handle storing the hash
|
|
144
|
+
# handle storing the hash +{operator => op_expr}+.
|
|
145
145
|
#
|
|
146
146
|
# The operator value can be of any type.
|
|
147
147
|
#
|
data/lib/mongoid/document.rb
CHANGED
|
@@ -233,8 +233,8 @@ module Mongoid
|
|
|
233
233
|
became.errors.instance_variable_set(:@messages, errors.instance_variable_get(:@messages))
|
|
234
234
|
became.instance_variable_set(:@new_record, new_record?)
|
|
235
235
|
became.instance_variable_set(:@destroyed, destroyed?)
|
|
236
|
-
became.changed_attributes[
|
|
237
|
-
became.
|
|
236
|
+
became.changed_attributes[klass.discriminator_key] = self.class.discriminator_value
|
|
237
|
+
became[klass.discriminator_key] = klass.discriminator_value
|
|
238
238
|
|
|
239
239
|
# mark embedded docs as persisted
|
|
240
240
|
embedded_relations.each_pair do |name, meta|
|
|
@@ -353,7 +353,19 @@ module Mongoid
|
|
|
353
353
|
#
|
|
354
354
|
# @since 1.0.0
|
|
355
355
|
def _types
|
|
356
|
-
@_type ||= (descendants + [ self ]).uniq.map(&:
|
|
356
|
+
@_type ||= (descendants + [ self ]).uniq.map(&:discriminator_value)
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
# Clear the @_type cache. This is generally called when changing the discriminator
|
|
360
|
+
# key/value on a class.
|
|
361
|
+
#
|
|
362
|
+
# @example Get the types.
|
|
363
|
+
# document._mongoid_clear_types
|
|
364
|
+
#
|
|
365
|
+
# @api private
|
|
366
|
+
def _mongoid_clear_types
|
|
367
|
+
@_type = nil
|
|
368
|
+
superclass._mongoid_clear_types if hereditary?
|
|
357
369
|
end
|
|
358
370
|
|
|
359
371
|
# Set the i18n scope to overwrite ActiveModel.
|
data/lib/mongoid/errors.rb
CHANGED
|
@@ -20,6 +20,13 @@ require "mongoid/errors/invalid_index"
|
|
|
20
20
|
require "mongoid/errors/invalid_options"
|
|
21
21
|
require "mongoid/errors/invalid_path"
|
|
22
22
|
require "mongoid/errors/invalid_persistence_option"
|
|
23
|
+
require "mongoid/errors/invalid_query"
|
|
24
|
+
# Must be after invalid_query.
|
|
25
|
+
require "mongoid/errors/invalid_discriminator_key_target"
|
|
26
|
+
require "mongoid/errors/invalid_elem_match_operator"
|
|
27
|
+
require "mongoid/errors/invalid_estimated_count_criteria"
|
|
28
|
+
require "mongoid/errors/invalid_expression_operator"
|
|
29
|
+
require "mongoid/errors/invalid_field_operator"
|
|
23
30
|
require "mongoid/errors/invalid_relation"
|
|
24
31
|
require "mongoid/errors/invalid_relation_option"
|
|
25
32
|
require "mongoid/errors/invalid_scope"
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
module Mongoid
|
|
5
|
+
module Errors
|
|
6
|
+
|
|
7
|
+
# Creates the exception raised when trying to set or get the
|
|
8
|
+
# discriminator key on a child class.
|
|
9
|
+
#
|
|
10
|
+
# @param [ String ] class_name The class name.
|
|
11
|
+
# @param [ String ] operator The class' superclass.
|
|
12
|
+
#
|
|
13
|
+
# @api private
|
|
14
|
+
class InvalidDiscriminatorKeyTarget < MongoidError
|
|
15
|
+
def initialize(class_name, superclass)
|
|
16
|
+
super(
|
|
17
|
+
compose_message(
|
|
18
|
+
"invalid_discriminator_key_target",
|
|
19
|
+
{ class_name: class_name, superclass: superclass }
|
|
20
|
+
)
|
|
21
|
+
)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
module Mongoid
|
|
5
|
+
module Errors
|
|
6
|
+
|
|
7
|
+
# Raised when invalid field-level operator is passed to the $elemMatch
|
|
8
|
+
# embedded matcher.
|
|
9
|
+
class InvalidElemMatchOperator < InvalidQuery
|
|
10
|
+
|
|
11
|
+
# @api private
|
|
12
|
+
VALID_OPERATORS = %w(
|
|
13
|
+
and all eq exists gt gte in lt lte ne nin nor not or regex size
|
|
14
|
+
).freeze
|
|
15
|
+
|
|
16
|
+
# Creates the exception.
|
|
17
|
+
#
|
|
18
|
+
# @param [ String ] operator The operator that was used.
|
|
19
|
+
#
|
|
20
|
+
# @api private
|
|
21
|
+
def initialize(operator)
|
|
22
|
+
@operator = operator
|
|
23
|
+
super(compose_message("invalid_elem_match_operator",
|
|
24
|
+
operator: operator,
|
|
25
|
+
valid_operators: VALID_OPERATORS.map { |op| "'$#{op}'" }.join(', '),
|
|
26
|
+
))
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# @return [ String ] The operator that was used.
|
|
30
|
+
attr_reader :operator
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
module Mongoid
|
|
5
|
+
module Errors
|
|
6
|
+
|
|
7
|
+
class InvalidEstimatedCountCriteria < MongoidError
|
|
8
|
+
|
|
9
|
+
# Creates the exception raised when trying to call estimated_count
|
|
10
|
+
# on a filtered criteria.
|
|
11
|
+
#
|
|
12
|
+
# @param [ String ] class_name The klass of the criteria used to call
|
|
13
|
+
# estimated count.
|
|
14
|
+
#
|
|
15
|
+
# @api private
|
|
16
|
+
def initialize(class_name)
|
|
17
|
+
super(
|
|
18
|
+
compose_message(
|
|
19
|
+
"invalid_estimated_count_criteria",
|
|
20
|
+
{ class_name: class_name }
|
|
21
|
+
)
|
|
22
|
+
)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
module Mongoid
|
|
5
|
+
module Errors
|
|
6
|
+
|
|
7
|
+
# Raised when invalid expression-level operator is passed to an
|
|
8
|
+
# embedded matcher.
|
|
9
|
+
class InvalidExpressionOperator < InvalidQuery
|
|
10
|
+
|
|
11
|
+
# Creates the exception.
|
|
12
|
+
#
|
|
13
|
+
# @param [ String ] operator The operator that was used.
|
|
14
|
+
#
|
|
15
|
+
# @api private
|
|
16
|
+
def initialize(operator)
|
|
17
|
+
@operator = operator
|
|
18
|
+
super(compose_message("invalid_expression_operator",
|
|
19
|
+
operator: operator,
|
|
20
|
+
valid_operators: "'$and', '$nor', '$or'",
|
|
21
|
+
))
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @return [ String ] The operator that was used.
|
|
25
|
+
attr_reader :operator
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
module Mongoid
|
|
5
|
+
module Errors
|
|
6
|
+
|
|
7
|
+
# Raised when invalid field-level operator is passed to an
|
|
8
|
+
# embedded matcher.
|
|
9
|
+
class InvalidFieldOperator < InvalidQuery
|
|
10
|
+
|
|
11
|
+
# @api private
|
|
12
|
+
VALID_OPERATORS = %w(
|
|
13
|
+
all elemMatch eq exists gt gte in lt lte ne nin not regex size
|
|
14
|
+
).freeze
|
|
15
|
+
|
|
16
|
+
# Creates the exception.
|
|
17
|
+
#
|
|
18
|
+
# @param [ String ] operator The operator that was used.
|
|
19
|
+
#
|
|
20
|
+
# @api private
|
|
21
|
+
def initialize(operator)
|
|
22
|
+
@operator = operator
|
|
23
|
+
super(compose_message("invalid_field_operator",
|
|
24
|
+
operator: operator,
|
|
25
|
+
valid_operators: VALID_OPERATORS.map { |op| "'$#{op}'" }.join(', '),
|
|
26
|
+
))
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# @return [ String ] The operator that was used.
|
|
30
|
+
attr_reader :operator
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
module Mongoid
|
|
5
|
+
module Errors
|
|
6
|
+
|
|
7
|
+
# Raised when invalid query is passed to an embedded matcher, or an
|
|
8
|
+
# invalid query fragment is passed to the query builder (Criteria object).
|
|
9
|
+
class InvalidQuery < MongoidError
|
|
10
|
+
|
|
11
|
+
# Create the new invalid query error.
|
|
12
|
+
#
|
|
13
|
+
# @api private
|
|
14
|
+
def initialize(msg)
|
|
15
|
+
super
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Stringifies the argument using #inspect and truncates the result to
|
|
19
|
+
# about 100 characters.
|
|
20
|
+
#
|
|
21
|
+
# @param [ Object ] expr An expression to stringify and truncate.
|
|
22
|
+
#
|
|
23
|
+
# @api private
|
|
24
|
+
def self.truncate_expr(expr)
|
|
25
|
+
unless expr.is_a?(String)
|
|
26
|
+
expr = expr.inspect
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
if expr.length > 103
|
|
30
|
+
expr = if expr =~ /\A<#((?:.|\n)*)>\z/
|
|
31
|
+
"<##{expr.slice(0, 97)}...>"
|
|
32
|
+
else
|
|
33
|
+
expr.slice(0, 100) + '...'
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
expr
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -11,9 +11,9 @@ module Mongoid
|
|
|
11
11
|
# Create the new error.
|
|
12
12
|
#
|
|
13
13
|
# @example Create the error.
|
|
14
|
-
# NoClientConfig.new(:
|
|
14
|
+
# NoClientConfig.new(:analytics)
|
|
15
15
|
#
|
|
16
|
-
# @param [ String
|
|
16
|
+
# @param [ String | Symbol ] name The name of the client.
|
|
17
17
|
#
|
|
18
18
|
# @since 3.0.0
|
|
19
19
|
def initialize(name)
|
|
@@ -10,7 +10,7 @@ module Mongoid
|
|
|
10
10
|
# Create the new error with the defined client names.
|
|
11
11
|
#
|
|
12
12
|
# @example Create the new error.
|
|
13
|
-
# NoDefaultClient.new([ :
|
|
13
|
+
# NoDefaultClient.new([ :analytics ])
|
|
14
14
|
#
|
|
15
15
|
# @param [ Array<Symbol> ] keys The defined clients.
|
|
16
16
|
#
|
data/lib/mongoid/extensions.rb
CHANGED
|
@@ -38,6 +38,7 @@ require "mongoid/extensions/range"
|
|
|
38
38
|
require "mongoid/extensions/regexp"
|
|
39
39
|
require "mongoid/extensions/set"
|
|
40
40
|
require "mongoid/extensions/string"
|
|
41
|
+
require "mongoid/stringified_symbol"
|
|
41
42
|
require "mongoid/extensions/symbol"
|
|
42
43
|
require "mongoid/extensions/time"
|
|
43
44
|
require "mongoid/extensions/time_with_zone"
|
data/lib/mongoid/factory.rb
CHANGED
|
@@ -7,10 +7,18 @@ module Mongoid
|
|
|
7
7
|
module Factory
|
|
8
8
|
extend self
|
|
9
9
|
|
|
10
|
+
# @deprecated
|
|
10
11
|
TYPE = "_type".freeze
|
|
11
12
|
|
|
12
13
|
# Builds a new +Document+ from the supplied attributes.
|
|
13
14
|
#
|
|
15
|
+
# This method either instantiats klass or a descendant of klass if the attributes include
|
|
16
|
+
# klass' discriminator key.
|
|
17
|
+
#
|
|
18
|
+
# If the attributes contain the discriminator key (which is _type by default) and the
|
|
19
|
+
# discriminator value does not correspond to a descendant of klass then this method
|
|
20
|
+
# would create an instance of klass.
|
|
21
|
+
#
|
|
14
22
|
# @example Build the document.
|
|
15
23
|
# Mongoid::Factory.build(Person, { "name" => "Durran" })
|
|
16
24
|
#
|
|
@@ -20,9 +28,10 @@ module Mongoid
|
|
|
20
28
|
# @return [ Document ] The instantiated document.
|
|
21
29
|
def build(klass, attributes = nil)
|
|
22
30
|
attributes ||= {}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
31
|
+
dvalue = attributes[klass.discriminator_key] || attributes[klass.discriminator_key.to_sym]
|
|
32
|
+
type = klass.get_discriminator_mapping(dvalue)
|
|
33
|
+
if type
|
|
34
|
+
type.new(attributes)
|
|
26
35
|
else
|
|
27
36
|
klass.new(attributes)
|
|
28
37
|
end
|
|
@@ -31,6 +40,10 @@ module Mongoid
|
|
|
31
40
|
# Builds a new +Document+ from the supplied attributes loaded from the
|
|
32
41
|
# database.
|
|
33
42
|
#
|
|
43
|
+
# If the attributes contain the discriminator key (which is _type by default) and the
|
|
44
|
+
# discriminator value does not correspond to a descendant of klass then this method
|
|
45
|
+
# raises an UnknownModel error.
|
|
46
|
+
#
|
|
34
47
|
# If a criteria object is given, it is used in two ways:
|
|
35
48
|
# 1. If the criteria has a list of fields specified via #only,
|
|
36
49
|
# only those fields are populated in the returned document.
|
|
@@ -54,7 +67,7 @@ module Mongoid
|
|
|
54
67
|
if criteria
|
|
55
68
|
selected_fields ||= criteria.options[:fields]
|
|
56
69
|
end
|
|
57
|
-
type = (attributes || {})[
|
|
70
|
+
type = (attributes || {})[klass.discriminator_key]
|
|
58
71
|
if type.blank?
|
|
59
72
|
obj = klass.instantiate(attributes, selected_fields)
|
|
60
73
|
if criteria && criteria.association && criteria.parent_document
|
|
@@ -62,13 +75,17 @@ module Mongoid
|
|
|
62
75
|
end
|
|
63
76
|
obj
|
|
64
77
|
else
|
|
65
|
-
|
|
78
|
+
constantized = klass.get_discriminator_mapping(type)
|
|
66
79
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
80
|
+
unless constantized
|
|
81
|
+
camelized = type.camelize
|
|
82
|
+
|
|
83
|
+
# Check if the class exists
|
|
84
|
+
begin
|
|
85
|
+
constantized = camelized.constantize
|
|
86
|
+
rescue NameError
|
|
87
|
+
raise Errors::UnknownModel.new(camelized, type)
|
|
88
|
+
end
|
|
72
89
|
end
|
|
73
90
|
|
|
74
91
|
# Check if the class is a Document class
|