mongoid 7.1.5 → 7.2.1
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 +33 -7
- data/lib/config/locales/en.yml +37 -1
- data/lib/mongoid.rb +23 -0
- data/lib/mongoid/association/depending.rb +1 -6
- data/lib/mongoid/association/many.rb +3 -3
- 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 +17 -0
- 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/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 -7
- data/lib/mongoid/criteria/queryable/storable.rb +3 -3
- data/lib/mongoid/document.rb +18 -5
- 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/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 +22 -9
- data/lib/mongoid/findable.rb +50 -14
- data/lib/mongoid/indexable.rb +2 -2
- data/lib/mongoid/interceptable.rb +3 -1
- 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 +48 -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 +64 -62
- 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/traversable.rb +111 -4
- data/lib/mongoid/version.rb +1 -1
- data/spec/README.md +19 -4
- data/spec/integration/app_spec.rb +46 -13
- 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 +108 -13
- data/spec/integration/associations/has_one_spec.rb +108 -13
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
- data/spec/integration/atomic/modifiers_spec.rb +117 -0
- data/spec/integration/callbacks_models.rb +49 -0
- data/spec/integration/callbacks_spec.rb +216 -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/gt_types.yml +63 -0
- data/spec/integration/matcher_operator_data/gte.yml +132 -0
- data/spec/integration/matcher_operator_data/gte_types.yml +15 -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/lt_types.yml +15 -0
- data/spec/integration/matcher_operator_data/lte.yml +132 -0
- data/spec/integration/matcher_operator_data/lte_types.yml +15 -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/ne_types.yml +15 -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/stringified_symbol_field_spec.rb +190 -0
- data/spec/lite_spec_helper.rb +4 -3
- data/spec/mongoid/association/depending_spec.rb +78 -26
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +50 -0
- 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_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/paths_spec.rb +41 -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 +37 -0
- data/spec/mongoid/clients/sessions_spec.rb +1 -6
- data/spec/mongoid/config_spec.rb +28 -0
- 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/selectable_logical_spec.rb +36 -0
- 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/extensions/stringified_symbol_spec.rb +85 -0
- data/spec/mongoid/factory_spec.rb +261 -28
- data/spec/mongoid/fields_spec.rb +48 -2
- 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 +442 -41
- 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/cluster_config.rb +211 -0
- data/spec/shared/lib/mrss/constraints.rb +330 -0
- data/spec/shared/lib/mrss/docker_runner.rb +262 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +69 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
- data/spec/shared/share/Dockerfile.erb +229 -0
- data/spec/shared/shlib/distro.sh +73 -0
- data/spec/shared/shlib/server.sh +270 -0
- data/spec/shared/shlib/set_env.sh +128 -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/customer.rb +11 -0
- data/spec/support/models/customer_address.rb +12 -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 +6 -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 +0 -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 +0 -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/spec_config.rb +1 -1
- metadata +895 -755
- 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
@@ -0,0 +1,127 @@
|
|
1
|
+
module Mongoid
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
module Matcher
|
5
|
+
|
6
|
+
# Extracts field values in the document at the specified key.
|
7
|
+
#
|
8
|
+
# The document can be a Hash or a model instance.
|
9
|
+
#
|
10
|
+
# The key is a valid MongoDB dot notation key. The following use cases are
|
11
|
+
# supported:
|
12
|
+
#
|
13
|
+
# - Simple field traversal (`foo`) - retrieves the field `foo` in the
|
14
|
+
# current document.
|
15
|
+
# - Hash/embedded document field traversal (`foo.bar`) - retrieves the
|
16
|
+
# field `foo` in the current document, then retrieves the field `bar`
|
17
|
+
# from the value of `foo`. Each path segment could descend into an
|
18
|
+
# embedded document or a hash field.
|
19
|
+
# - Array element retrieval (`foo.N`) - retrieves the Nth array element
|
20
|
+
# from the field `foo` which must be an array. N must be a non-negative
|
21
|
+
# integer.
|
22
|
+
# - Array traversal (`foo.bar`) - if `foo` is an array field, and
|
23
|
+
# the elements of `foo` are hashes or embedded documents, this returns
|
24
|
+
# an array of values of the `bar` field in each of the hashes in the
|
25
|
+
# `foo` array.
|
26
|
+
#
|
27
|
+
# The return value is a two-element array. The first element is the value
|
28
|
+
# retrieved, or an array of values. The second element is a boolean flag
|
29
|
+
# indicating whether an array was expanded at any point during the key
|
30
|
+
# traversal (because the respective document field was an array).
|
31
|
+
#
|
32
|
+
# @param [ Document | Hash ] document The document to extract from.
|
33
|
+
# @param [ String ] key The key path to extract.
|
34
|
+
#
|
35
|
+
# @return [ Array<true | false, Object | Array, true | false> ]
|
36
|
+
# Whether the value existed in the document, the extracted value
|
37
|
+
# and the array expansion flag.
|
38
|
+
module_function def extract_attribute(document, key)
|
39
|
+
if document.respond_to?(:as_attributes, true)
|
40
|
+
# If a document has hash fields, as_attributes would keep those fields
|
41
|
+
# as Hash instances which do not offer indifferent access.
|
42
|
+
# Convert to BSON::Document to get indifferent access on hash fields.
|
43
|
+
document = BSON::Document.new(document.send(:as_attributes))
|
44
|
+
end
|
45
|
+
|
46
|
+
src = document
|
47
|
+
expanded = false
|
48
|
+
exists = true
|
49
|
+
|
50
|
+
key.to_s.split('.').each do |field|
|
51
|
+
if (index = field.to_i).to_s == field
|
52
|
+
# Array indexing
|
53
|
+
if Array === src
|
54
|
+
exists = index < src.length
|
55
|
+
src = src[index]
|
56
|
+
else
|
57
|
+
# Trying to index something that is not an array
|
58
|
+
exists = false
|
59
|
+
src = nil
|
60
|
+
end
|
61
|
+
else
|
62
|
+
case src
|
63
|
+
when nil
|
64
|
+
exists = false
|
65
|
+
when Hash
|
66
|
+
exists = src.key?(field)
|
67
|
+
src = src[field]
|
68
|
+
when Array
|
69
|
+
expanded = true
|
70
|
+
exists = false
|
71
|
+
new = []
|
72
|
+
src.each do |doc|
|
73
|
+
case doc
|
74
|
+
when Hash
|
75
|
+
if doc.key?(field)
|
76
|
+
v = doc[field]
|
77
|
+
case v
|
78
|
+
when Array
|
79
|
+
new += v
|
80
|
+
else
|
81
|
+
new += [v]
|
82
|
+
end
|
83
|
+
exists = true
|
84
|
+
end
|
85
|
+
else
|
86
|
+
# Trying to hash index into a value that is not a hash
|
87
|
+
end
|
88
|
+
end
|
89
|
+
src = new
|
90
|
+
else
|
91
|
+
# Trying to descend into a field that is not a hash using
|
92
|
+
# dot notation.
|
93
|
+
exists = false
|
94
|
+
src = nil
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
[exists, src, expanded]
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
require 'mongoid/matcher/all'
|
105
|
+
require 'mongoid/matcher/and'
|
106
|
+
require 'mongoid/matcher/elem_match'
|
107
|
+
require 'mongoid/matcher/elem_match_expression'
|
108
|
+
require 'mongoid/matcher/eq'
|
109
|
+
require 'mongoid/matcher/eq_impl'
|
110
|
+
require 'mongoid/matcher/eq_impl_with_regexp'
|
111
|
+
require 'mongoid/matcher/exists'
|
112
|
+
require 'mongoid/matcher/expression'
|
113
|
+
require 'mongoid/matcher/field_expression'
|
114
|
+
require 'mongoid/matcher/gt'
|
115
|
+
require 'mongoid/matcher/gte'
|
116
|
+
require 'mongoid/matcher/in'
|
117
|
+
require 'mongoid/matcher/lt'
|
118
|
+
require 'mongoid/matcher/lte'
|
119
|
+
require 'mongoid/matcher/ne'
|
120
|
+
require 'mongoid/matcher/nin'
|
121
|
+
require 'mongoid/matcher/nor'
|
122
|
+
require 'mongoid/matcher/not'
|
123
|
+
require 'mongoid/matcher/or'
|
124
|
+
require 'mongoid/matcher/regex'
|
125
|
+
require 'mongoid/matcher/size'
|
126
|
+
require 'mongoid/matcher/expression_operator'
|
127
|
+
require 'mongoid/matcher/field_operator'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Mongoid
|
2
|
+
module Matcher
|
3
|
+
|
4
|
+
# @api private
|
5
|
+
module All
|
6
|
+
module_function def matches?(exists, value, condition)
|
7
|
+
unless Array === condition
|
8
|
+
raise Errors::InvalidQuery, "$all argument must be an array: #{Errors::InvalidQuery.truncate_expr(condition)}"
|
9
|
+
end
|
10
|
+
|
11
|
+
!condition.empty? && condition.all? do |c|
|
12
|
+
case c
|
13
|
+
when ::Regexp, BSON::Regexp::Raw
|
14
|
+
Regex.matches_array_or_scalar?(value, c)
|
15
|
+
else
|
16
|
+
EqImpl.matches?(true, value, c, '$all')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Mongoid
|
2
|
+
module Matcher
|
3
|
+
|
4
|
+
# @api private
|
5
|
+
module And
|
6
|
+
module_function def matches?(document, expr)
|
7
|
+
unless expr.is_a?(Array)
|
8
|
+
raise Errors::InvalidQuery, "$and argument must be an array: #{Errors::InvalidQuery.truncate_expr(expr)}"
|
9
|
+
end
|
10
|
+
|
11
|
+
if expr.empty?
|
12
|
+
raise Errors::InvalidQuery, "$and argument must be a non-empty array: #{Errors::InvalidQuery.truncate_expr(expr)}"
|
13
|
+
end
|
14
|
+
|
15
|
+
expr.all? do |sub_expr|
|
16
|
+
Expression.matches?(document, sub_expr)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Mongoid
|
2
|
+
module Matcher
|
3
|
+
|
4
|
+
# @api private
|
5
|
+
module ElemMatch
|
6
|
+
module_function def matches?(exists, value, condition)
|
7
|
+
unless Hash === condition
|
8
|
+
raise Errors::InvalidQuery, "$elemMatch requires a Hash operand: #{Errors::InvalidQuery.truncate_expr(condition)}"
|
9
|
+
end
|
10
|
+
if Array === value && !value.empty?
|
11
|
+
value.any? do |v|
|
12
|
+
ElemMatchExpression.matches?(v, condition)
|
13
|
+
end
|
14
|
+
else
|
15
|
+
# Validate the condition is valid, even though we will never attempt
|
16
|
+
# matching it.
|
17
|
+
condition.each do |k, v|
|
18
|
+
if k.to_s.start_with?('$')
|
19
|
+
begin
|
20
|
+
ExpressionOperator.get(k)
|
21
|
+
rescue Mongoid::Errors::InvalidExpressionOperator
|
22
|
+
begin
|
23
|
+
FieldOperator.get(k)
|
24
|
+
rescue Mongoid::Errors::InvalidFieldOperator => exc
|
25
|
+
raise Mongoid::Errors::InvalidElemMatchOperator.new(exc.operator)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
false
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Mongoid
|
2
|
+
module Matcher
|
3
|
+
|
4
|
+
# $elemMatch argument can be a top-level expression and some specific
|
5
|
+
# operator combinations like $not with a regular expression.
|
6
|
+
#
|
7
|
+
# @api private
|
8
|
+
module ElemMatchExpression
|
9
|
+
module_function def matches?(document, expr)
|
10
|
+
Expression.matches?(document, expr)
|
11
|
+
rescue Mongoid::Errors::InvalidExpressionOperator
|
12
|
+
begin
|
13
|
+
FieldExpression.matches?(true, document, expr)
|
14
|
+
rescue Mongoid::Errors::InvalidFieldOperator => exc
|
15
|
+
raise Mongoid::Errors::InvalidElemMatchOperator.new(exc.operator)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Mongoid
|
2
|
+
module Matcher
|
3
|
+
|
4
|
+
# This module is used by $eq and other operators that need to perform
|
5
|
+
# the matching that $eq performs (for example, $ne which negates the result
|
6
|
+
# of $eq). Unlike $eq this module takes an original operator as an
|
7
|
+
# additional argument to +matches?+ to provide the correct exception
|
8
|
+
# messages reflecting the operator that was first invoked.
|
9
|
+
#
|
10
|
+
# @api private
|
11
|
+
module EqImpl
|
12
|
+
module_function def matches?(exists, value, condition, original_operator)
|
13
|
+
case condition
|
14
|
+
when Range
|
15
|
+
# Since $ne invokes $eq, the exception message needs to handle
|
16
|
+
# both operators.
|
17
|
+
raise Errors::InvalidQuery, "Range is not supported as an argument to '#{original_operator}'"
|
18
|
+
=begin
|
19
|
+
if value.is_a?(Array)
|
20
|
+
value.any? { |elt| condition.include?(elt) }
|
21
|
+
else
|
22
|
+
condition.include?(value)
|
23
|
+
end
|
24
|
+
=end
|
25
|
+
else
|
26
|
+
value == condition ||
|
27
|
+
value.is_a?(Array) && value.include?(condition)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Mongoid
|
2
|
+
module Matcher
|
3
|
+
|
4
|
+
# This is an internal equality implementation that performs exact
|
5
|
+
# comparisons and regular expression matches.
|
6
|
+
#
|
7
|
+
# @api private
|
8
|
+
module EqImplWithRegexp
|
9
|
+
module_function def matches?(original_operator, value, condition)
|
10
|
+
case condition
|
11
|
+
when Regexp
|
12
|
+
value =~ condition
|
13
|
+
when ::BSON::Regexp::Raw
|
14
|
+
value =~ condition.compile
|
15
|
+
else
|
16
|
+
value == condition
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Mongoid
|
2
|
+
module Matcher
|
3
|
+
|
4
|
+
# @api private
|
5
|
+
module Exists
|
6
|
+
module_function def matches?(exists, value, condition)
|
7
|
+
case condition
|
8
|
+
when Range
|
9
|
+
raise Errors::InvalidQuery, "$exists argument cannot be a Range: #{Errors::InvalidQuery.truncate_expr(condition)}"
|
10
|
+
end
|
11
|
+
exists == (condition || false)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Mongoid
|
2
|
+
module Matcher
|
3
|
+
|
4
|
+
# @api private
|
5
|
+
module Expression
|
6
|
+
module_function def matches?(document, expr)
|
7
|
+
if expr.nil?
|
8
|
+
raise Errors::InvalidQuery, "Nil condition in expression context"
|
9
|
+
end
|
10
|
+
unless Hash === expr
|
11
|
+
raise Errors::InvalidQuery, "MQL query must be provided as a Hash"
|
12
|
+
end
|
13
|
+
expr.all? do |k, expr_v|
|
14
|
+
k = k.to_s
|
15
|
+
if k.start_with?('$')
|
16
|
+
ExpressionOperator.get(k).matches?(document, expr_v)
|
17
|
+
else
|
18
|
+
exists, value, expanded = Matcher.extract_attribute(document, k)
|
19
|
+
# The value may have been expanded into an array, but then
|
20
|
+
# array may have been shrunk back to a scalar (or hash) when
|
21
|
+
# path contained a numeric position.
|
22
|
+
# Do not treat a hash as an array here (both are iterable).
|
23
|
+
if expanded && Array === value
|
24
|
+
if value == []
|
25
|
+
# Empty array is technically equivalent to exists: false.
|
26
|
+
FieldExpression.matches?(false, nil, expr_v)
|
27
|
+
else
|
28
|
+
value.any? do |v|
|
29
|
+
FieldExpression.matches?(true, v, expr_v)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
else
|
33
|
+
FieldExpression.matches?(exists, value, expr_v)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Mongoid
|
2
|
+
module Matcher
|
3
|
+
|
4
|
+
# @api private
|
5
|
+
module ExpressionOperator
|
6
|
+
MAP = {
|
7
|
+
'$and' => And,
|
8
|
+
'$nor' => Nor,
|
9
|
+
'$or' => Or,
|
10
|
+
}.freeze
|
11
|
+
|
12
|
+
module_function def get(op)
|
13
|
+
MAP.fetch(op)
|
14
|
+
rescue KeyError
|
15
|
+
raise Errors::InvalidExpressionOperator.new(op)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Mongoid
|
2
|
+
module Matcher
|
3
|
+
|
4
|
+
# @api private
|
5
|
+
module FieldExpression
|
6
|
+
module_function def matches?(exists, value, condition)
|
7
|
+
if condition.is_a?(Hash)
|
8
|
+
condition.all? do |k, cond_v|
|
9
|
+
k = k.to_s
|
10
|
+
if k.start_with?('$')
|
11
|
+
if %w($regex $options).include?(k)
|
12
|
+
unless condition.key?('$regex')
|
13
|
+
raise Errors::InvalidQuery, "$regex is required if $options is given: #{Errors::InvalidQuery.truncate_expr(condition)}"
|
14
|
+
end
|
15
|
+
|
16
|
+
if k == '$regex'
|
17
|
+
if options = condition['$options']
|
18
|
+
cond_v = case cond_v
|
19
|
+
when Regexp
|
20
|
+
BSON::Regexp::Raw.new(cond_v.source, options)
|
21
|
+
when BSON::Regexp::Raw
|
22
|
+
BSON::Regexp::Raw.new(cond_v.pattern, options)
|
23
|
+
else
|
24
|
+
BSON::Regexp::Raw.new(cond_v, options)
|
25
|
+
end
|
26
|
+
elsif String === cond_v
|
27
|
+
cond_v = BSON::Regexp::Raw.new(cond_v)
|
28
|
+
end
|
29
|
+
|
30
|
+
FieldOperator.get(k).matches?(exists, value, cond_v)
|
31
|
+
else
|
32
|
+
# $options are matched as part of $regex
|
33
|
+
true
|
34
|
+
end
|
35
|
+
else
|
36
|
+
FieldOperator.get(k).matches?(exists, value, cond_v)
|
37
|
+
end
|
38
|
+
elsif Hash === value
|
39
|
+
sub_exists, sub_value, expanded =
|
40
|
+
Matcher.extract_attribute(value, k)
|
41
|
+
if expanded
|
42
|
+
sub_value.any? do |sub_v|
|
43
|
+
Eq.matches?(true, sub_v, cond_v)
|
44
|
+
end
|
45
|
+
else
|
46
|
+
Eq.matches?(sub_exists, sub_value, cond_v)
|
47
|
+
end
|
48
|
+
else
|
49
|
+
false
|
50
|
+
end
|
51
|
+
end
|
52
|
+
else
|
53
|
+
case condition
|
54
|
+
when ::Regexp, BSON::Regexp::Raw
|
55
|
+
Regex.matches_array_or_scalar?(value, condition)
|
56
|
+
else
|
57
|
+
Eq.matches?(exists, value, condition)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|