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,117 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
require "spec_helper"
|
5
|
+
|
6
|
+
describe Mongoid::Atomic::Modifiers do
|
7
|
+
|
8
|
+
let(:modifiers) do
|
9
|
+
described_class.new
|
10
|
+
end
|
11
|
+
|
12
|
+
context 'when performing multiple operations with similar keys' do
|
13
|
+
|
14
|
+
let(:pushes) do
|
15
|
+
{ "addresses.0.locations" => { "street" => "Bond St" } }
|
16
|
+
end
|
17
|
+
|
18
|
+
let(:similar1) do
|
19
|
+
{ "dresses" => { "color" => "red" } }
|
20
|
+
end
|
21
|
+
|
22
|
+
let(:similar2) do
|
23
|
+
{ "ses.0.foo" => { "baz" => "qux" } }
|
24
|
+
end
|
25
|
+
|
26
|
+
before do
|
27
|
+
modifiers.send(operation, pushes)
|
28
|
+
modifiers.send(operation, similar1)
|
29
|
+
modifiers.send(operation, similar2)
|
30
|
+
end
|
31
|
+
|
32
|
+
context "push" do
|
33
|
+
let(:operation) { :push }
|
34
|
+
|
35
|
+
it "adds all modifiers to top level" do
|
36
|
+
expect(modifiers).to eq({ "$push" => {
|
37
|
+
"addresses.0.locations" => { '$each' => [{ "street" => "Bond St" }] },
|
38
|
+
"dresses" => { '$each' => [{ "color" => "red" }] },
|
39
|
+
"ses.0.foo" => { '$each' => [{ "baz" => "qux" }] }
|
40
|
+
} })
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "pull" do
|
45
|
+
let(:operation) { :pull }
|
46
|
+
|
47
|
+
it "adds all modifiers to top level" do
|
48
|
+
expect(modifiers).to eq({ "$pull" => {
|
49
|
+
"addresses.0.locations" => { "street" => "Bond St" },
|
50
|
+
"dresses" => { "color" => "red" },
|
51
|
+
"ses.0.foo" => { "baz" => "qux" },
|
52
|
+
} })
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context "pull_all" do
|
57
|
+
let(:operation) { :pull_all }
|
58
|
+
|
59
|
+
it "adds all modifiers to top level" do
|
60
|
+
expect(modifiers).to eq({ "$pullAll" => {
|
61
|
+
"addresses.0.locations" => { "street" => "Bond St" },
|
62
|
+
"dresses" => { "color" => "red" },
|
63
|
+
"ses.0.foo" => { "baz" => "qux" },
|
64
|
+
} })
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context "add_to_set" do
|
69
|
+
let(:operation) { :add_to_set }
|
70
|
+
|
71
|
+
it "adds all modifiers to top level" do
|
72
|
+
expect(modifiers).to eq({ "$addToSet" => {
|
73
|
+
"addresses.0.locations" => { '$each' => { "street" => "Bond St" } },
|
74
|
+
"dresses" => { '$each' => { "color" => "red" } },
|
75
|
+
"ses.0.foo" => { '$each' => { "baz" => "qux" } }
|
76
|
+
} })
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context "set" do
|
81
|
+
let(:operation) { :set }
|
82
|
+
|
83
|
+
it "adds all modifiers to top level" do
|
84
|
+
expect(modifiers).to eq({ "$set" => {
|
85
|
+
"addresses.0.locations" => { "street" => "Bond St" },
|
86
|
+
"dresses" => { "color" => "red" },
|
87
|
+
"ses.0.foo" => { "baz" => "qux" },
|
88
|
+
} })
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context "unset" do
|
93
|
+
let(:operation) { :unset }
|
94
|
+
|
95
|
+
let(:pushes) do
|
96
|
+
[:foobar]
|
97
|
+
end
|
98
|
+
|
99
|
+
let(:similar1) do
|
100
|
+
[:foo]
|
101
|
+
end
|
102
|
+
|
103
|
+
let(:similar2) do
|
104
|
+
[:bar]
|
105
|
+
end
|
106
|
+
|
107
|
+
it "adds all modifiers to top level" do
|
108
|
+
expect(modifiers).to eq("$unset" => {
|
109
|
+
foobar: true,
|
110
|
+
foo: true,
|
111
|
+
bar: true,
|
112
|
+
})
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
class Galaxy
|
2
|
+
include Mongoid::Document
|
3
|
+
|
4
|
+
field :age, type: Integer
|
5
|
+
|
6
|
+
before_validation :set_age
|
7
|
+
|
8
|
+
embeds_many :stars
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def set_age
|
13
|
+
self.age ||= 100_000
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Star
|
18
|
+
include Mongoid::Document
|
19
|
+
|
20
|
+
embedded_in :galaxy
|
21
|
+
|
22
|
+
field :age, type: Integer
|
23
|
+
|
24
|
+
before_validation :set_age
|
25
|
+
|
26
|
+
embeds_many :planets
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def set_age
|
31
|
+
self.age ||= 42_000
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class Planet
|
36
|
+
include Mongoid::Document
|
37
|
+
|
38
|
+
embedded_in :star
|
39
|
+
|
40
|
+
field :age, type: Integer
|
41
|
+
|
42
|
+
before_validation :set_age
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def set_age
|
47
|
+
self.age ||= 2_000
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,216 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
require 'spec_helper'
|
5
|
+
require_relative './callbacks_models'
|
6
|
+
|
7
|
+
describe 'callbacks integration tests' do
|
8
|
+
context 'when modifying attributes in a callback' do
|
9
|
+
|
10
|
+
context 'when creating top-level document' do
|
11
|
+
context 'top level document' do
|
12
|
+
let(:instance) do
|
13
|
+
Galaxy.create!
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'writes the attribute value into the model' do
|
17
|
+
instance.age.should == 100_000
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'persists the attribute value' do
|
21
|
+
Galaxy.find(instance.id).age.should == 100_000
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'embedded document' do
|
26
|
+
shared_examples 'persists the attribute value' do
|
27
|
+
it 'writes the attribute value into the model' do
|
28
|
+
instance.stars.first.age.should == 42_000
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'persists the attribute value' do
|
32
|
+
Galaxy.find(instance.id).stars.first.age.should == 42_000
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'set as a document instance' do
|
37
|
+
let(:instance) do
|
38
|
+
Galaxy.create!(stars: [Star.new])
|
39
|
+
end
|
40
|
+
|
41
|
+
include_examples 'persists the attribute value'
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'set as attributes on parent' do
|
45
|
+
let(:instance) do
|
46
|
+
Galaxy.create!(stars: [{}])
|
47
|
+
end
|
48
|
+
|
49
|
+
include_examples 'persists the attribute value'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'nested embedded document' do
|
54
|
+
shared_examples 'persists the attribute value' do
|
55
|
+
it 'writes the attribute value into the model' do
|
56
|
+
instance.stars.first.planets.first.age.should == 2_000
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'persists the attribute value' do
|
60
|
+
Galaxy.find(instance.id).stars.first.planets.first.age.should == 2_000
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'set as a document instance' do
|
65
|
+
let(:instance) do
|
66
|
+
Galaxy.create!(stars: [Star.new(
|
67
|
+
planets: [Planet.new],
|
68
|
+
)])
|
69
|
+
end
|
70
|
+
|
71
|
+
include_examples 'persists the attribute value'
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'set as attributes on parent' do
|
75
|
+
let(:instance) do
|
76
|
+
Galaxy.create!(stars: [
|
77
|
+
planets: [{}],
|
78
|
+
])
|
79
|
+
end
|
80
|
+
|
81
|
+
include_examples 'persists the attribute value'
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'when updating top-level document via #save' do
|
87
|
+
let!(:instance) do
|
88
|
+
Galaxy.create!
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'embedded document' do
|
92
|
+
shared_examples 'persists the attribute value' do
|
93
|
+
it 'writes the attribute value into the model' do
|
94
|
+
instance.stars.first.age.should == 42_000
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'persists the attribute value' do
|
98
|
+
Galaxy.find(instance.id).stars.first.age.should == 42_000
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context 'set as a document instance' do
|
103
|
+
before do
|
104
|
+
instance.stars = [Star.new]
|
105
|
+
instance.save!
|
106
|
+
end
|
107
|
+
|
108
|
+
include_examples 'persists the attribute value'
|
109
|
+
end
|
110
|
+
|
111
|
+
context 'set as attributes on parent' do
|
112
|
+
before do
|
113
|
+
instance.stars = [{}]
|
114
|
+
instance.save!
|
115
|
+
end
|
116
|
+
|
117
|
+
include_examples 'persists the attribute value'
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
context 'nested embedded document' do
|
122
|
+
shared_examples 'persists the attribute value' do
|
123
|
+
it 'writes the attribute value into the model' do
|
124
|
+
instance.stars.first.planets.first.age.should == 2_000
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'persists the attribute value' do
|
128
|
+
Galaxy.find(instance.id).stars.first.planets.first.age.should == 2_000
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
context 'set as a document instance' do
|
133
|
+
before do
|
134
|
+
instance.stars = [Star.new(planets: [Planet.new])]
|
135
|
+
instance.save!
|
136
|
+
end
|
137
|
+
|
138
|
+
include_examples 'persists the attribute value'
|
139
|
+
end
|
140
|
+
|
141
|
+
context 'set as attributes on parent' do
|
142
|
+
before do
|
143
|
+
instance.stars = [planets: [{}]]
|
144
|
+
instance.save!
|
145
|
+
end
|
146
|
+
|
147
|
+
include_examples 'persists the attribute value'
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
context 'when updating top-level document via #update_attributes' do
|
153
|
+
let!(:instance) do
|
154
|
+
Galaxy.create!
|
155
|
+
end
|
156
|
+
|
157
|
+
context 'embedded document' do
|
158
|
+
shared_examples 'persists the attribute value' do
|
159
|
+
it 'writes the attribute value into the model' do
|
160
|
+
instance.stars.first.age.should == 42_000
|
161
|
+
end
|
162
|
+
|
163
|
+
it 'persists the attribute value' do
|
164
|
+
Galaxy.find(instance.id).stars.first.age.should == 42_000
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
context 'set as a document instance' do
|
169
|
+
before do
|
170
|
+
instance.update_attributes(stars: [Star.new])
|
171
|
+
end
|
172
|
+
|
173
|
+
include_examples 'persists the attribute value'
|
174
|
+
end
|
175
|
+
|
176
|
+
context 'set as attributes on parent' do
|
177
|
+
before do
|
178
|
+
instance.update_attributes(stars: [{}])
|
179
|
+
end
|
180
|
+
|
181
|
+
include_examples 'persists the attribute value'
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
context 'nested embedded document' do
|
186
|
+
shared_examples 'persists the attribute value' do
|
187
|
+
it 'writes the attribute value into the model' do
|
188
|
+
instance.stars.first.planets.first.age.should == 2_000
|
189
|
+
end
|
190
|
+
|
191
|
+
it 'persists the attribute value' do
|
192
|
+
pending 'MONGOID-4476'
|
193
|
+
|
194
|
+
Galaxy.find(instance.id).stars.first.planets.first.age.should == 2_000
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
context 'set as a document instance' do
|
199
|
+
before do
|
200
|
+
instance.update_attributes(stars: [Star.new(planets: [Planet.new])])
|
201
|
+
end
|
202
|
+
|
203
|
+
include_examples 'persists the attribute value'
|
204
|
+
end
|
205
|
+
|
206
|
+
context 'set as attributes on parent' do
|
207
|
+
before do
|
208
|
+
instance.update_attributes(stars: [planets: [{}]])
|
209
|
+
end
|
210
|
+
|
211
|
+
include_examples 'persists the attribute value'
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
@@ -0,0 +1,354 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
require 'spec_helper'
|
5
|
+
|
6
|
+
describe "#discriminator_key" do
|
7
|
+
|
8
|
+
context "when the discriminator key is not set on a class" do
|
9
|
+
let(:piano) do
|
10
|
+
Piano.new
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:guitar) do
|
14
|
+
Guitar.new
|
15
|
+
end
|
16
|
+
|
17
|
+
it "sets the child discriminator key to _type: Piano" do
|
18
|
+
expect(piano._type).to eq("Piano")
|
19
|
+
end
|
20
|
+
|
21
|
+
it "sets the child discriminator key to _type: Guitar" do
|
22
|
+
expect(guitar._type).to eq("Guitar")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context "when the discriminator key is changed in the parent" do
|
27
|
+
before do
|
28
|
+
Instrument.discriminator_key = "hello2"
|
29
|
+
end
|
30
|
+
|
31
|
+
after do
|
32
|
+
Instrument.discriminator_key = nil
|
33
|
+
end
|
34
|
+
|
35
|
+
let(:piano) do
|
36
|
+
Piano.new
|
37
|
+
end
|
38
|
+
|
39
|
+
let(:guitar) do
|
40
|
+
Guitar.new
|
41
|
+
end
|
42
|
+
|
43
|
+
it "changes in the child class: Piano" do
|
44
|
+
expect(piano.hello2).to eq("Piano")
|
45
|
+
end
|
46
|
+
|
47
|
+
it "changes in the child class: Guitar" do
|
48
|
+
expect(guitar.hello2).to eq("Guitar")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "when the discriminator key is changed at the base level" do
|
53
|
+
context "after class creation" do
|
54
|
+
before do
|
55
|
+
class GlobalIntDiscriminatorParent
|
56
|
+
include Mongoid::Document
|
57
|
+
end
|
58
|
+
|
59
|
+
class GlobalIntDiscriminatorChild < GlobalIntDiscriminatorParent
|
60
|
+
end
|
61
|
+
|
62
|
+
Mongoid.discriminator_key = "test"
|
63
|
+
end
|
64
|
+
|
65
|
+
after do
|
66
|
+
Mongoid.discriminator_key = "_type"
|
67
|
+
end
|
68
|
+
|
69
|
+
let(:child) do
|
70
|
+
GlobalIntDiscriminatorChild.new
|
71
|
+
end
|
72
|
+
|
73
|
+
it "has a discriminator key _type" do
|
74
|
+
expect(child._type).to eq("GlobalIntDiscriminatorChild")
|
75
|
+
end
|
76
|
+
|
77
|
+
it "does not have the new global value as a field" do
|
78
|
+
expect(defined?(child.test)).to be nil
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "before class creation" do
|
83
|
+
before do
|
84
|
+
Mongoid.discriminator_key = "test"
|
85
|
+
|
86
|
+
class PreGlobalIntDiscriminatorParent
|
87
|
+
include Mongoid::Document
|
88
|
+
end
|
89
|
+
|
90
|
+
class PreGlobalIntDiscriminatorChild < PreGlobalIntDiscriminatorParent
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
after do
|
95
|
+
Mongoid.discriminator_key = "_type"
|
96
|
+
end
|
97
|
+
|
98
|
+
let(:child) do
|
99
|
+
PreGlobalIntDiscriminatorChild.new
|
100
|
+
end
|
101
|
+
|
102
|
+
it "creates a field with new discriminator key" do
|
103
|
+
expect(child.test).to eq("PreGlobalIntDiscriminatorChild")
|
104
|
+
end
|
105
|
+
|
106
|
+
it "does not have the default value as a field" do
|
107
|
+
expect(defined?(child._type)).to be nil
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context "when the discriminator key is changed in the parent" do
|
113
|
+
context "after child class creation" do
|
114
|
+
before do
|
115
|
+
class LocalIntDiscriminatorParent
|
116
|
+
include Mongoid::Document
|
117
|
+
end
|
118
|
+
|
119
|
+
class LocalIntDiscriminatorChild < LocalIntDiscriminatorParent
|
120
|
+
end
|
121
|
+
|
122
|
+
LocalIntDiscriminatorParent.discriminator_key = "test2"
|
123
|
+
end
|
124
|
+
|
125
|
+
let(:child) do
|
126
|
+
LocalIntDiscriminatorChild.new
|
127
|
+
end
|
128
|
+
|
129
|
+
it "still has _type field in the child" do
|
130
|
+
expect(child._type).to include("LocalIntDiscriminatorChild")
|
131
|
+
end
|
132
|
+
|
133
|
+
it "has the new field in the child" do
|
134
|
+
expect(child.test2).to include("LocalIntDiscriminatorChild")
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
context "before child class creation" do
|
139
|
+
before do
|
140
|
+
class PreLocalIntDiscriminatorParent
|
141
|
+
include Mongoid::Document
|
142
|
+
self.discriminator_key = "test2"
|
143
|
+
end
|
144
|
+
|
145
|
+
class PreLocalIntDiscriminatorChild < PreLocalIntDiscriminatorParent
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
let(:child) do
|
150
|
+
PreLocalIntDiscriminatorChild.new
|
151
|
+
end
|
152
|
+
|
153
|
+
it "creates a new field in the child" do
|
154
|
+
expect(child.test2).to include("PreLocalIntDiscriminatorChild")
|
155
|
+
end
|
156
|
+
|
157
|
+
it "does not have the default value as a field" do
|
158
|
+
expect(defined?(child._type)).to be nil
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
context "when adding to the db" do
|
164
|
+
context "when changing the discriminator_key" do
|
165
|
+
before do
|
166
|
+
class DBDiscriminatorParent
|
167
|
+
include Mongoid::Document
|
168
|
+
self.discriminator_key = "dkey"
|
169
|
+
end
|
170
|
+
|
171
|
+
class DBDiscriminatorChild < DBDiscriminatorParent
|
172
|
+
end
|
173
|
+
DBDiscriminatorChild.create!
|
174
|
+
end
|
175
|
+
|
176
|
+
it "has the correct count" do
|
177
|
+
expect(DBDiscriminatorChild.count).to eq(1)
|
178
|
+
end
|
179
|
+
|
180
|
+
it "has the correct count in the parent" do
|
181
|
+
expect(DBDiscriminatorParent.count).to eq(1)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
context "when changing the discriminator_key after saving to the db" do
|
186
|
+
before do
|
187
|
+
class DBDiscriminatorParent
|
188
|
+
include Mongoid::Document
|
189
|
+
end
|
190
|
+
|
191
|
+
class DBDiscriminatorChild < DBDiscriminatorParent
|
192
|
+
end
|
193
|
+
DBDiscriminatorChild.create!
|
194
|
+
DBDiscriminatorParent.discriminator_key = "dkey2"
|
195
|
+
DBDiscriminatorChild.create!
|
196
|
+
end
|
197
|
+
|
198
|
+
it "only finds the documents with the new discriminator key" do
|
199
|
+
expect(DBDiscriminatorChild.count).to eq(1)
|
200
|
+
end
|
201
|
+
|
202
|
+
it "has the correct count in the parent" do
|
203
|
+
expect(DBDiscriminatorParent.count).to eq(2)
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
context "documentation tests" do
|
209
|
+
|
210
|
+
context "Example 1" do
|
211
|
+
before do
|
212
|
+
class Example1Shape
|
213
|
+
include Mongoid::Document
|
214
|
+
field :x, type: Integer
|
215
|
+
field :y, type: Integer
|
216
|
+
embedded_in :canvas
|
217
|
+
|
218
|
+
self.discriminator_key = "shape_type"
|
219
|
+
end
|
220
|
+
|
221
|
+
class Example1Circle < Example1Shape
|
222
|
+
field :radius, type: Float
|
223
|
+
end
|
224
|
+
|
225
|
+
class Example1Rectangle < Example1Shape
|
226
|
+
field :width, type: Float
|
227
|
+
field :height, type: Float
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
let(:rectangle) do
|
232
|
+
Example1Rectangle.new
|
233
|
+
end
|
234
|
+
|
235
|
+
let(:circle) do
|
236
|
+
Example1Circle.new
|
237
|
+
end
|
238
|
+
|
239
|
+
it "has the new discriminator key: Rectangle" do
|
240
|
+
expect(rectangle.shape_type).to eq("Example1Rectangle")
|
241
|
+
end
|
242
|
+
|
243
|
+
it "does not have the default discriminator key: Rectangle" do
|
244
|
+
expect(defined?(rectangle._type)).to be nil
|
245
|
+
end
|
246
|
+
|
247
|
+
it "has the new discriminator key: Circle" do
|
248
|
+
expect(circle.shape_type).to eq("Example1Circle")
|
249
|
+
end
|
250
|
+
|
251
|
+
it "does not have the default discriminator key: Circle" do
|
252
|
+
expect(defined?(circle._type)).to be nil
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
context "Example 2" do
|
257
|
+
before do
|
258
|
+
class Example2Shape
|
259
|
+
include Mongoid::Document
|
260
|
+
field :x, type: Integer
|
261
|
+
field :y, type: Integer
|
262
|
+
embedded_in :canvas
|
263
|
+
end
|
264
|
+
|
265
|
+
class Example2Circle < Example2Shape
|
266
|
+
field :radius, type: Float
|
267
|
+
end
|
268
|
+
|
269
|
+
class Example2Rectangle < Example2Shape
|
270
|
+
field :width, type: Float
|
271
|
+
field :height, type: Float
|
272
|
+
end
|
273
|
+
|
274
|
+
Example2Shape.discriminator_key = "shape_type"
|
275
|
+
end
|
276
|
+
|
277
|
+
let(:rectangle) do
|
278
|
+
Example2Rectangle.new
|
279
|
+
end
|
280
|
+
|
281
|
+
let(:circle) do
|
282
|
+
Example2Circle.new
|
283
|
+
end
|
284
|
+
|
285
|
+
it "has the new discriminator key: Rectangle" do
|
286
|
+
expect(rectangle.shape_type).to eq("Example2Rectangle")
|
287
|
+
end
|
288
|
+
|
289
|
+
it "has default discriminator key: Rectangle" do
|
290
|
+
expect(rectangle._type).to eq("Example2Rectangle")
|
291
|
+
end
|
292
|
+
|
293
|
+
it "has the new discriminator key: Circle" do
|
294
|
+
expect(circle.shape_type).to eq("Example2Circle")
|
295
|
+
end
|
296
|
+
|
297
|
+
it "has default discriminator key: Circle" do
|
298
|
+
expect(circle._type).to eq("Example2Circle")
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
context "Example 3" do
|
303
|
+
before do
|
304
|
+
|
305
|
+
Mongoid.discriminator_key = "shape_type"
|
306
|
+
|
307
|
+
class Example3Shape
|
308
|
+
include Mongoid::Document
|
309
|
+
field :x, type: Integer
|
310
|
+
field :y, type: Integer
|
311
|
+
embedded_in :canvas
|
312
|
+
end
|
313
|
+
|
314
|
+
class Example3Circle < Example3Shape
|
315
|
+
field :radius, type: Float
|
316
|
+
end
|
317
|
+
|
318
|
+
class Example3Rectangle < Example3Shape
|
319
|
+
field :width, type: Float
|
320
|
+
field :height, type: Float
|
321
|
+
end
|
322
|
+
|
323
|
+
end
|
324
|
+
|
325
|
+
after do
|
326
|
+
Mongoid.discriminator_key = "_type"
|
327
|
+
end
|
328
|
+
|
329
|
+
let(:rectangle) do
|
330
|
+
Example3Rectangle.new
|
331
|
+
end
|
332
|
+
|
333
|
+
let(:circle) do
|
334
|
+
Example3Circle.new
|
335
|
+
end
|
336
|
+
|
337
|
+
it "has the new discriminator key: Rectangle" do
|
338
|
+
expect(rectangle.shape_type).to eq("Example3Rectangle")
|
339
|
+
end
|
340
|
+
|
341
|
+
it "does not have the default discriminator key: Rectangle" do
|
342
|
+
expect(defined?(rectangle._type)).to be nil
|
343
|
+
end
|
344
|
+
|
345
|
+
it "has the new discriminator key: Circle" do
|
346
|
+
expect(circle.shape_type).to eq("Example3Circle")
|
347
|
+
end
|
348
|
+
|
349
|
+
it "does not have the default discriminator key: Circle" do
|
350
|
+
expect(defined?(circle._type)).to be nil
|
351
|
+
end
|
352
|
+
end
|
353
|
+
end
|
354
|
+
end
|