mongoid 7.1.6 → 7.2.2
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 +31 -0
- 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/atomic/modifiers.rb +1 -1
- data/lib/mongoid/attributes.rb +8 -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 +103 -0
- data/lib/mongoid/matcher/all.rb +22 -0
- data/lib/mongoid/matcher/and.rb +21 -0
- data/lib/mongoid/matcher/elem_match.rb +36 -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 +31 -0
- data/lib/mongoid/matcher/expression_operator.rb +19 -0
- data/lib/mongoid/matcher/field_expression.rb +62 -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 +7 -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/lib/rails/generators/mongoid/config/config_generator.rb +8 -1
- data/spec/README.md +19 -4
- data/spec/integration/app_spec.rb +175 -88
- data/spec/integration/associations/embedded_spec.rb +94 -0
- data/spec/integration/associations/has_many_spec.rb +67 -14
- data/spec/integration/associations/has_one_spec.rb +67 -14
- 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/document_spec.rb +21 -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 +409 -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 +112 -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 +6 -6
- 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/attributes_spec.rb +241 -0
- 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/atomic_spec.rb +17 -4
- 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/numeric_keys.yml +104 -0
- data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
- data/spec/mongoid/matcher/extract_attribute_spec.rb +37 -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/persistable/settable_spec.rb +30 -0
- 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/bin/get-mongodb-download-url +17 -0
- data/spec/shared/lib/mrss/cluster_config.rb +11 -1
- data/spec/shared/lib/mrss/constraints.rb +34 -0
- data/spec/shared/lib/mrss/docker_runner.rb +265 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +16 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +3 -0
- data/spec/shared/lib/mrss/utils.rb +15 -0
- data/spec/shared/share/Dockerfile.erb +231 -0
- data/spec/shared/shlib/distro.sh +73 -0
- data/spec/shared/shlib/server.sh +290 -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 +1 -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 +0 -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 +0 -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 +9 -1
- metadata +648 -519
- 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
data/lib/mongoid/reloadable.rb
CHANGED
|
@@ -21,6 +21,11 @@ module Mongoid
|
|
|
21
21
|
#
|
|
22
22
|
# @since 1.0.0
|
|
23
23
|
def reload
|
|
24
|
+
if @atomic_selector
|
|
25
|
+
# Clear atomic_selector cache for sharded clusters. MONGOID-5076
|
|
26
|
+
remove_instance_variable('@atomic_selector')
|
|
27
|
+
end
|
|
28
|
+
|
|
24
29
|
reloaded = _reload
|
|
25
30
|
if Mongoid.raise_not_found_error && reloaded.empty?
|
|
26
31
|
raise Errors::DocumentNotFound.new(self.class, _id, _id)
|
|
@@ -60,7 +65,7 @@ module Mongoid
|
|
|
60
65
|
#
|
|
61
66
|
# @since 2.3.2
|
|
62
67
|
def reload_root_document
|
|
63
|
-
{}.merge(collection.find(
|
|
68
|
+
{}.merge(collection.find(atomic_selector, session: _session).read(mode: :primary).first || {})
|
|
64
69
|
end
|
|
65
70
|
|
|
66
71
|
# Reload the embedded document.
|
|
@@ -73,7 +78,7 @@ module Mongoid
|
|
|
73
78
|
# @since 2.3.2
|
|
74
79
|
def reload_embedded_document
|
|
75
80
|
extract_embedded_attributes({}.merge(
|
|
76
|
-
collection(_root).find(
|
|
81
|
+
collection(_root).find(_root.atomic_selector).read(mode: :primary).first
|
|
77
82
|
))
|
|
78
83
|
end
|
|
79
84
|
|
data/lib/mongoid/serializable.rb
CHANGED
|
@@ -80,7 +80,7 @@ module Mongoid
|
|
|
80
80
|
|
|
81
81
|
only = Array.wrap(options[:only]).map(&:to_s)
|
|
82
82
|
except = Array.wrap(options[:except]).map(&:to_s)
|
|
83
|
-
except |= [
|
|
83
|
+
except |= [self.class.discriminator_key] unless Mongoid.include_type_for_serialization
|
|
84
84
|
|
|
85
85
|
if !only.empty?
|
|
86
86
|
names &= only
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
# A class which sends values to the database as Strings but returns them to the user as Symbols.
|
|
5
|
+
module Mongoid
|
|
6
|
+
class StringifiedSymbol
|
|
7
|
+
|
|
8
|
+
class << self
|
|
9
|
+
|
|
10
|
+
# Convert the object from its mongo friendly ruby type to this type.
|
|
11
|
+
#
|
|
12
|
+
# @example Demongoize the object.
|
|
13
|
+
# Symbol.demongoize(object)
|
|
14
|
+
#
|
|
15
|
+
# @param [ Object ] object The object to demongoize.
|
|
16
|
+
#
|
|
17
|
+
# @return [ Symbol ] The object.
|
|
18
|
+
#
|
|
19
|
+
# @api private
|
|
20
|
+
def demongoize(object)
|
|
21
|
+
if object.nil?
|
|
22
|
+
object
|
|
23
|
+
else
|
|
24
|
+
object.to_s.to_sym
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Turn the object from the ruby type we deal with to a Mongo friendly
|
|
29
|
+
# type.
|
|
30
|
+
#
|
|
31
|
+
# @example Mongoize the object.
|
|
32
|
+
# Symbol.mongoize("123.11")
|
|
33
|
+
#
|
|
34
|
+
# @param [ Object ] object The object to mongoize.
|
|
35
|
+
#
|
|
36
|
+
# @return [ Symbol ] The object mongoized.
|
|
37
|
+
#
|
|
38
|
+
# @api private
|
|
39
|
+
def mongoize(object)
|
|
40
|
+
if object.nil?
|
|
41
|
+
object
|
|
42
|
+
else
|
|
43
|
+
object.to_s
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# @api private
|
|
48
|
+
def evolve(object)
|
|
49
|
+
mongoize(object)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
data/lib/mongoid/traversable.rb
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
# encoding: utf-8
|
|
3
3
|
|
|
4
|
+
require "mongoid/fields/validators/macro"
|
|
5
|
+
|
|
4
6
|
module Mongoid
|
|
5
7
|
|
|
6
8
|
# Provides behavior around traversing the document graph.
|
|
@@ -17,6 +19,105 @@ module Mongoid
|
|
|
17
19
|
@__parent = p
|
|
18
20
|
end
|
|
19
21
|
|
|
22
|
+
# Module used for prepending to the various discriminator_*= methods
|
|
23
|
+
#
|
|
24
|
+
# @api private
|
|
25
|
+
module DiscriminatorAssignment
|
|
26
|
+
def discriminator_key=(value)
|
|
27
|
+
if hereditary?
|
|
28
|
+
raise Errors::InvalidDiscriminatorKeyTarget.new(self, self.superclass)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
_mongoid_clear_types
|
|
32
|
+
|
|
33
|
+
if value
|
|
34
|
+
Mongoid::Fields::Validators::Macro.validate_field_name(self, value)
|
|
35
|
+
value = value.to_s
|
|
36
|
+
super
|
|
37
|
+
else
|
|
38
|
+
# When discriminator key is set to nil, replace the class's definition
|
|
39
|
+
# of the discriminator key reader (provided by class_attribute earlier)
|
|
40
|
+
# and re-delegate to Mongoid.
|
|
41
|
+
class << self
|
|
42
|
+
delegate :discriminator_key, to: ::Mongoid
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# This condition checks if the new discriminator key would overwrite
|
|
47
|
+
# an existing field.
|
|
48
|
+
# This condition also checks if the class has any descendants, because
|
|
49
|
+
# if it doesn't then it doesn't need a discriminator key.
|
|
50
|
+
if !fields.has_key?(self.discriminator_key) && !descendants.empty?
|
|
51
|
+
default_proc = lambda { self.class.discriminator_value }
|
|
52
|
+
field(self.discriminator_key, default: default_proc, type: String)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def discriminator_value=(value)
|
|
57
|
+
value ||= self.name
|
|
58
|
+
_mongoid_clear_types
|
|
59
|
+
add_discriminator_mapping(value)
|
|
60
|
+
@discriminator_value = value
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Module used for prepending the discriminator_value method.
|
|
65
|
+
#
|
|
66
|
+
# A separate module was needed because the subclasses of this class
|
|
67
|
+
# need to be manually prepended with the discriminator_value and can't
|
|
68
|
+
# rely on being a class_attribute because the .discriminator_value
|
|
69
|
+
# method is overriden by every subclass in the inherited method.
|
|
70
|
+
#
|
|
71
|
+
# @api private
|
|
72
|
+
module DiscriminatorRetrieval
|
|
73
|
+
|
|
74
|
+
# Get the name on the reading side if the discriminator_value is nil
|
|
75
|
+
def discriminator_value
|
|
76
|
+
@discriminator_value || self.name
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
included do
|
|
81
|
+
class_attribute :discriminator_key, instance_accessor: false
|
|
82
|
+
|
|
83
|
+
class << self
|
|
84
|
+
delegate :discriminator_key, to: ::Mongoid
|
|
85
|
+
prepend DiscriminatorAssignment
|
|
86
|
+
include DiscriminatorRetrieval
|
|
87
|
+
|
|
88
|
+
# @api private
|
|
89
|
+
#
|
|
90
|
+
# @return [ Hash<String, Class> ] The current mapping of discriminator_values to classes
|
|
91
|
+
attr_accessor :discriminator_mapping
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Add a discriminator mapping to the parent class. This mapping is used when
|
|
95
|
+
# receiving a document to identify its class.
|
|
96
|
+
#
|
|
97
|
+
# @param [ String ] value The discriminator_value that was just set
|
|
98
|
+
# @param [ Class ] The class the discriminator_value was set on
|
|
99
|
+
#
|
|
100
|
+
# @api private
|
|
101
|
+
def self.add_discriminator_mapping(value, klass=self)
|
|
102
|
+
self.discriminator_mapping ||= {}
|
|
103
|
+
self.discriminator_mapping[value] = klass
|
|
104
|
+
superclass.add_discriminator_mapping(value, klass) if hereditary?
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Get the discriminator mapping from the parent class. This method returns nil if there
|
|
108
|
+
# is no mapping for the given value.
|
|
109
|
+
#
|
|
110
|
+
# @param [ String ] value The discriminator_value to retrieve
|
|
111
|
+
#
|
|
112
|
+
# @return [ Class | nil ] klass The class corresponding to the given discriminator_value. If
|
|
113
|
+
# the value is not in the mapping, this method returns nil.
|
|
114
|
+
#
|
|
115
|
+
# @api private
|
|
116
|
+
def self.get_discriminator_mapping(value)
|
|
117
|
+
self.discriminator_mapping[value] if self.discriminator_mapping
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
20
121
|
# Get all child +Documents+ to this +Document+, going n levels deep if
|
|
21
122
|
# necessary. This is used when calling update persistence operations from
|
|
22
123
|
# the root document, where changes in the entire tree need to be
|
|
@@ -201,14 +302,20 @@ module Mongoid
|
|
|
201
302
|
subclass.pre_processed_defaults = pre_processed_defaults.dup
|
|
202
303
|
subclass.post_processed_defaults = post_processed_defaults.dup
|
|
203
304
|
subclass._declared_scopes = Hash.new { |hash,key| self._declared_scopes[key] }
|
|
305
|
+
subclass.discriminator_value = subclass.name
|
|
306
|
+
|
|
307
|
+
# We need to do this here because the discriminator_value method is
|
|
308
|
+
# overriden in the subclass above.
|
|
309
|
+
class << subclass
|
|
310
|
+
include DiscriminatorRetrieval
|
|
311
|
+
end
|
|
204
312
|
|
|
205
313
|
# We only need the _type field if inheritance is in play, but need to
|
|
206
314
|
# add to the root class as well for backwards compatibility.
|
|
207
|
-
unless fields.has_key?(
|
|
208
|
-
|
|
315
|
+
unless fields.has_key?(self.discriminator_key)
|
|
316
|
+
default_proc = lambda { self.class.discriminator_value }
|
|
317
|
+
field(self.discriminator_key, default: default_proc, type: String)
|
|
209
318
|
end
|
|
210
|
-
subclass_default = subclass.name || ->{ self.class.name }
|
|
211
|
-
subclass.field(:_type, default: subclass_default, type: String, overwrite: true)
|
|
212
319
|
end
|
|
213
320
|
end
|
|
214
321
|
end
|
data/lib/mongoid/version.rb
CHANGED
|
@@ -15,7 +15,14 @@ module Mongoid
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def app_name
|
|
18
|
-
Rails
|
|
18
|
+
app_cls = Rails.application.class
|
|
19
|
+
parent = begin
|
|
20
|
+
# Rails 6.1+
|
|
21
|
+
app_cls.module_parent_name
|
|
22
|
+
rescue NoMethodError
|
|
23
|
+
app_cls.parent.to_s
|
|
24
|
+
end
|
|
25
|
+
parent.underscore
|
|
19
26
|
end
|
|
20
27
|
|
|
21
28
|
def create_config_file
|
data/spec/README.md
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
# Running Mongoid Tests
|
|
2
2
|
|
|
3
|
-
##
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
## Quick Start
|
|
4
|
+
|
|
5
|
+
The test suite requires shared tooling that is stored in a separate repository
|
|
6
|
+
and is referenced as a submodule. After checking out the desired driver
|
|
7
|
+
branch, check out the matching submodules:
|
|
8
|
+
|
|
9
|
+
git submodule init
|
|
10
|
+
git submodule update
|
|
11
|
+
|
|
12
|
+
Spin up a MongoDB deployment against which to run the Mongoid specs.
|
|
13
|
+
Mongoid specs support a variety of MongoDB topologies, but the simplest is
|
|
14
|
+
a single MongoDB instance:
|
|
6
15
|
|
|
7
16
|
# Launch mongod in one terminal
|
|
8
17
|
mkdir /tmp/mdb
|
|
@@ -14,5 +23,11 @@ Run the test suite in a separate terminal:
|
|
|
14
23
|
|
|
15
24
|
|
|
16
25
|
## Caveats
|
|
26
|
+
|
|
17
27
|
### "Too many open files" error
|
|
18
|
-
|
|
28
|
+
|
|
29
|
+
On MacOS, you may encounter a "Too many open files" error on the MongoDB server
|
|
30
|
+
when running the tests. If this happens, stop the server, run the command
|
|
31
|
+
`ulimit -n 10000` in the same terminal session as the server, and restart
|
|
32
|
+
the server. This will increase the number of files that can be opened.
|
|
33
|
+
Then, re-run the tests.
|
|
@@ -13,109 +13,131 @@ describe 'Mongoid application tests' do
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
require 'fileutils'
|
|
16
|
-
require '
|
|
16
|
+
require 'mrss/child_process_helper'
|
|
17
17
|
require 'open-uri'
|
|
18
18
|
|
|
19
19
|
FileUtils.mkdir_p(TMP_BASE)
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
-
context 'demo application
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
context 'demo application' do
|
|
23
|
+
context 'sinatra' do
|
|
24
|
+
it 'runs' do
|
|
25
|
+
clone_application(
|
|
26
|
+
'https://github.com/mongoid/mongoid-demo',
|
|
27
|
+
subdir: 'sinatra-minimal',
|
|
28
|
+
) do
|
|
28
29
|
|
|
29
|
-
process = ChildProcess.build(*%w(bundle exec ruby app.rb))
|
|
30
|
-
process.environment.update(clean_env)
|
|
31
|
-
process.io.inherit!
|
|
32
|
-
process.start
|
|
33
|
-
|
|
34
|
-
begin
|
|
35
30
|
# JRuby needs a long timeout
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
uri = URI.parse('http://localhost:4567/posts')
|
|
40
|
-
resp = JSON.parse(uri.open.read)
|
|
41
|
-
ensure
|
|
42
|
-
Process.kill('TERM', process.pid)
|
|
43
|
-
status = process.wait
|
|
44
|
-
end
|
|
31
|
+
start_app(%w(bundle exec ruby app.rb), 4567, 40) do |port|
|
|
32
|
+
uri = URI.parse('http://localhost:4567/posts')
|
|
33
|
+
resp = JSON.parse(uri.open.read)
|
|
45
34
|
|
|
46
|
-
|
|
35
|
+
resp.should == []
|
|
47
36
|
|
|
48
|
-
|
|
37
|
+
end
|
|
38
|
+
end
|
|
49
39
|
end
|
|
50
40
|
end
|
|
51
|
-
end
|
|
52
41
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
subdir: 'rails-api',
|
|
60
|
-
rails_version: rails_version,
|
|
61
|
-
) do
|
|
62
|
-
|
|
63
|
-
process = ChildProcess.build(*%w(bundle exec rails s))
|
|
64
|
-
process.environment.update(clean_env)
|
|
65
|
-
process.io.inherit!
|
|
66
|
-
process.start
|
|
67
|
-
|
|
68
|
-
begin
|
|
69
|
-
# JRuby needs a long timeout
|
|
70
|
-
wait_for_port(3000, 30)
|
|
71
|
-
sleep 1
|
|
72
|
-
|
|
73
|
-
uri = URI.parse('http://localhost:3000/posts')
|
|
74
|
-
resp = JSON.parse(uri.open.read)
|
|
75
|
-
ensure
|
|
76
|
-
Process.kill('TERM', process.pid)
|
|
77
|
-
status = process.wait
|
|
78
|
-
end
|
|
42
|
+
context 'rails-api' do
|
|
43
|
+
it 'runs' do
|
|
44
|
+
clone_application(
|
|
45
|
+
'https://github.com/mongoid/mongoid-demo',
|
|
46
|
+
subdir: 'rails-api',
|
|
47
|
+
) do
|
|
79
48
|
|
|
80
|
-
|
|
49
|
+
# JRuby needs a long timeout
|
|
50
|
+
start_app(%w(bundle exec rails s), 3000, 50) do |port|
|
|
51
|
+
uri = URI.parse('http://localhost:3000/posts')
|
|
52
|
+
resp = JSON.parse(uri.open.read)
|
|
81
53
|
|
|
82
|
-
|
|
83
|
-
[0, 15, 143].should include(status)
|
|
54
|
+
resp.should == []
|
|
84
55
|
end
|
|
85
56
|
end
|
|
86
57
|
end
|
|
87
58
|
end
|
|
88
59
|
end
|
|
89
60
|
|
|
61
|
+
def start_app(cmd, port, timeout)
|
|
62
|
+
process = ChildProcess.build(*cmd)
|
|
63
|
+
process.environment.update(clean_env)
|
|
64
|
+
process.io.inherit!
|
|
65
|
+
process.start
|
|
66
|
+
|
|
67
|
+
begin
|
|
68
|
+
wait_for_port(port, timeout, process)
|
|
69
|
+
sleep 1
|
|
70
|
+
|
|
71
|
+
rv = yield port
|
|
72
|
+
ensure
|
|
73
|
+
# The process may have already died (due to an error exit) -
|
|
74
|
+
# in this case killing it will raise an exception.
|
|
75
|
+
Process.kill('TERM', process.pid) rescue nil
|
|
76
|
+
status = process.wait
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Exit should be either success or SIGTERM
|
|
80
|
+
[0, 15, 128 + 15].should include(status)
|
|
81
|
+
|
|
82
|
+
rv
|
|
83
|
+
end
|
|
84
|
+
|
|
90
85
|
context 'new application - rails' do
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
86
|
+
it 'creates' do
|
|
87
|
+
install_rails
|
|
88
|
+
|
|
89
|
+
Dir.chdir(TMP_BASE) do
|
|
90
|
+
FileUtils.rm_rf('mongoid-test')
|
|
91
|
+
Mrss::ChildProcessHelper.check_call(%w(rails new mongoid-test --skip-spring --skip-active-record), env: clean_env)
|
|
92
|
+
|
|
93
|
+
Dir.chdir('mongoid-test') do
|
|
94
|
+
adjust_app_gemfile
|
|
95
|
+
Mrss::ChildProcessHelper.check_call(%w(bundle install), env: clean_env)
|
|
96
|
+
|
|
97
|
+
Mrss::ChildProcessHelper.check_call(%w(rails g model post), env: clean_env)
|
|
98
|
+
Mrss::ChildProcessHelper.check_call(%w(rails g model comment post:belongs_to), env: clean_env)
|
|
99
|
+
|
|
100
|
+
# https://jira.mongodb.org/browse/MONGOID-4885
|
|
101
|
+
comment_text = File.read('app/models/comment.rb')
|
|
102
|
+
comment_text.should =~ /belongs_to :post/
|
|
103
|
+
comment_text.should_not =~ /embedded_in :post/
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it 'generates Mongoid config' do
|
|
109
|
+
install_rails
|
|
110
|
+
|
|
111
|
+
Dir.chdir(TMP_BASE) do
|
|
112
|
+
FileUtils.rm_rf('mongoid-test-config')
|
|
113
|
+
Mrss::ChildProcessHelper.check_call(%w(rails new mongoid-test-config --skip-spring --skip-active-record), env: clean_env)
|
|
114
|
+
|
|
115
|
+
Dir.chdir('mongoid-test-config') do
|
|
116
|
+
adjust_app_gemfile
|
|
117
|
+
Mrss::ChildProcessHelper.check_call(%w(bundle install), env: clean_env)
|
|
118
|
+
|
|
119
|
+
mongoid_config_file = File.join(TMP_BASE,'mongoid-test-config/config/mongoid.yml')
|
|
120
|
+
|
|
121
|
+
File.exist?(mongoid_config_file).should be false
|
|
122
|
+
Mrss::ChildProcessHelper.check_call(%w(rails g mongoid:config), env: clean_env)
|
|
123
|
+
File.exist?(mongoid_config_file).should be true
|
|
124
|
+
|
|
125
|
+
config_text = File.read(mongoid_config_file)
|
|
126
|
+
config_text.should =~ /mongoid_test_config_development/
|
|
127
|
+
config_text.should =~ /mongoid_test_config_test/
|
|
114
128
|
end
|
|
115
129
|
end
|
|
116
130
|
end
|
|
117
131
|
end
|
|
118
132
|
|
|
133
|
+
def install_rails
|
|
134
|
+
Mrss::ChildProcessHelper.check_call(%w(gem uni rails -a))
|
|
135
|
+
if (rails_version = SpecConfig.instance.rails_version) == 'master'
|
|
136
|
+
else
|
|
137
|
+
Mrss::ChildProcessHelper.check_call(%w(gem install rails --no-document -v) + [rails_version])
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
119
141
|
context 'local test applications' do
|
|
120
142
|
let(:client) { Mongoid.default_client }
|
|
121
143
|
|
|
@@ -136,7 +158,7 @@ describe 'Mongoid application tests' do
|
|
|
136
158
|
before do
|
|
137
159
|
Dir.chdir(APP_PATH) do
|
|
138
160
|
remove_bundler_req
|
|
139
|
-
ChildProcessHelper.check_call(%w(bundle install), env: env)
|
|
161
|
+
Mrss::ChildProcessHelper.check_call(%w(bundle install), env: env)
|
|
140
162
|
write_mongoid_yml
|
|
141
163
|
end
|
|
142
164
|
|
|
@@ -150,7 +172,7 @@ describe 'Mongoid application tests' do
|
|
|
150
172
|
end
|
|
151
173
|
index.should be nil
|
|
152
174
|
|
|
153
|
-
ChildProcessHelper.check_call(%w(rake db:mongoid:create_indexes),
|
|
175
|
+
Mrss::ChildProcessHelper.check_call(%w(bundle exec rake db:mongoid:create_indexes),
|
|
154
176
|
cwd: APP_PATH, env: env)
|
|
155
177
|
|
|
156
178
|
index = client['posts'].indexes.detect do |index|
|
|
@@ -165,13 +187,14 @@ describe 'Mongoid application tests' do
|
|
|
165
187
|
end
|
|
166
188
|
end
|
|
167
189
|
|
|
168
|
-
def clone_application(repo_url, subdir: nil
|
|
190
|
+
def clone_application(repo_url, subdir: nil)
|
|
169
191
|
Dir.chdir(TMP_BASE) do
|
|
170
192
|
FileUtils.rm_rf(File.basename(repo_url))
|
|
171
|
-
ChildProcessHelper.check_call(%w(git clone) + [repo_url])
|
|
193
|
+
Mrss::ChildProcessHelper.check_call(%w(git clone) + [repo_url])
|
|
172
194
|
Dir.chdir(File.join(*[File.basename(repo_url), subdir].compact)) do
|
|
173
|
-
adjust_app_gemfile
|
|
174
|
-
|
|
195
|
+
adjust_app_gemfile
|
|
196
|
+
adjust_rails_defaults
|
|
197
|
+
Mrss::ChildProcessHelper.check_call(%w(bundle install), env: clean_env)
|
|
175
198
|
puts `git diff`
|
|
176
199
|
|
|
177
200
|
write_mongoid_yml
|
|
@@ -181,11 +204,44 @@ describe 'Mongoid application tests' do
|
|
|
181
204
|
end
|
|
182
205
|
end
|
|
183
206
|
|
|
207
|
+
def parse_mongodb_uri(uri)
|
|
208
|
+
pre, query = uri.split('?', 2)
|
|
209
|
+
if pre =~ %r,\A(mongodb(?:.*?))://([^/]+)(?:/(.*))?\z,
|
|
210
|
+
protocol = $1
|
|
211
|
+
hosts = $2
|
|
212
|
+
database = $3
|
|
213
|
+
if database == ''
|
|
214
|
+
database = nil
|
|
215
|
+
end
|
|
216
|
+
else
|
|
217
|
+
raise ArgumentError, "Invalid MongoDB URI: #{uri}"
|
|
218
|
+
end
|
|
219
|
+
if query == ''
|
|
220
|
+
query = nil
|
|
221
|
+
end
|
|
222
|
+
{
|
|
223
|
+
protocol: protocol,
|
|
224
|
+
hosts: hosts,
|
|
225
|
+
database: database,
|
|
226
|
+
query: query,
|
|
227
|
+
}
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def build_mongodb_uri(parts)
|
|
231
|
+
"#{parts.fetch(:protocol)}://#{parts.fetch(:hosts)}/#{parts[:database]}?#{parts[:query]}"
|
|
232
|
+
end
|
|
233
|
+
|
|
184
234
|
def write_mongoid_yml
|
|
235
|
+
# HACK: the driver does not provide a MongoDB URI parser and assembler,
|
|
236
|
+
# and the Ruby standard library URI module doesn't handle multiple hosts.
|
|
237
|
+
parts = parse_mongodb_uri(SpecConfig.instance.uri_str)
|
|
238
|
+
parts[:database] = 'mongoid_test'
|
|
239
|
+
uri = build_mongodb_uri(parts)
|
|
240
|
+
p uri
|
|
185
241
|
env_config = {'clients' => {'default' => {
|
|
186
242
|
# TODO massive hack, will fail if uri specifies a database name or
|
|
187
243
|
# any uri options
|
|
188
|
-
'uri' =>
|
|
244
|
+
'uri' => uri,
|
|
189
245
|
}}}
|
|
190
246
|
config = {'development' => env_config, 'production' => env_config}
|
|
191
247
|
File.open('config/mongoid.yml', 'w') do |f|
|
|
@@ -193,7 +249,7 @@ describe 'Mongoid application tests' do
|
|
|
193
249
|
end
|
|
194
250
|
end
|
|
195
251
|
|
|
196
|
-
def adjust_app_gemfile(rails_version:
|
|
252
|
+
def adjust_app_gemfile(rails_version: SpecConfig.instance.rails_version)
|
|
197
253
|
remove_bundler_req
|
|
198
254
|
|
|
199
255
|
gemfile_lines = IO.readlines('Gemfile')
|
|
@@ -205,13 +261,41 @@ describe 'Mongoid application tests' do
|
|
|
205
261
|
gemfile_lines.delete_if do |line|
|
|
206
262
|
line =~ /rails/
|
|
207
263
|
end
|
|
208
|
-
|
|
264
|
+
if rails_version == 'master'
|
|
265
|
+
gemfile_lines << "gem 'rails', git: 'https://github.com/rails/rails'\n"
|
|
266
|
+
else
|
|
267
|
+
gemfile_lines << "gem 'rails', '~> #{rails_version}.0'\n"
|
|
268
|
+
end
|
|
209
269
|
end
|
|
210
270
|
File.open('Gemfile', 'w') do |f|
|
|
211
271
|
f << gemfile_lines.join
|
|
212
272
|
end
|
|
213
273
|
end
|
|
214
274
|
|
|
275
|
+
def adjust_rails_defaults(rails_version: SpecConfig.instance.rails_version)
|
|
276
|
+
if File.exist?('config/application.rb')
|
|
277
|
+
lines = IO.readlines('config/application.rb')
|
|
278
|
+
lines.each do |line|
|
|
279
|
+
line.gsub!(/config.load_defaults \d\.\d/, "config.load_defaults #{rails_version}")
|
|
280
|
+
end
|
|
281
|
+
File.open('config/application.rb', 'w') do |f|
|
|
282
|
+
f << lines.join
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
if rails_version == '5.1'
|
|
287
|
+
secrets = {
|
|
288
|
+
'development' => {
|
|
289
|
+
'secret_key_base' => 'abracadabra',
|
|
290
|
+
'my_secret_token' => 'very_secret',
|
|
291
|
+
},
|
|
292
|
+
}
|
|
293
|
+
File.open('config/secrets.yml', 'w') do |f|
|
|
294
|
+
f << YAML.dump(secrets)
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
end
|
|
298
|
+
|
|
215
299
|
def remove_bundler_req
|
|
216
300
|
lock_lines = IO.readlines('Gemfile.lock')
|
|
217
301
|
# Get rid of the bundled with line so that whatever bundler is installed
|
|
@@ -230,14 +314,14 @@ describe 'Mongoid application tests' do
|
|
|
230
314
|
# in `initialize': too long unix socket path (126bytes given but 108bytes max) (ArgumentError)
|
|
231
315
|
# Is it trying to create unix sockets in current directory?
|
|
232
316
|
# https://stackoverflow.com/questions/30302021/rails-runner-without-spring
|
|
233
|
-
ChildProcessHelper.check_call(%w(bin/spring binstub --remove --all), env: clean_env)
|
|
317
|
+
Mrss::ChildProcessHelper.check_call(%w(bin/spring binstub --remove --all), env: clean_env)
|
|
234
318
|
end
|
|
235
319
|
|
|
236
320
|
def clean_env
|
|
237
321
|
@clean_env ||= Hash[ENV.keys.grep(/BUNDLE|RUBYOPT/).map { |k| [k, nil ] }]
|
|
238
322
|
end
|
|
239
323
|
|
|
240
|
-
def wait_for_port(port, timeout)
|
|
324
|
+
def wait_for_port(port, timeout, process)
|
|
241
325
|
deadline = Time.now + timeout
|
|
242
326
|
loop do
|
|
243
327
|
begin
|
|
@@ -245,6 +329,9 @@ describe 'Mongoid application tests' do
|
|
|
245
329
|
return
|
|
246
330
|
end
|
|
247
331
|
rescue IOError, SystemCallError
|
|
332
|
+
unless process.alive?
|
|
333
|
+
raise "Process #{process} died while waiting for port #{port}"
|
|
334
|
+
end
|
|
248
335
|
if Time.now > deadline
|
|
249
336
|
raise
|
|
250
337
|
end
|