mongoid 7.5.4 → 8.1.9
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
- data/CHANGELOG.md +3 -3
- data/README.md +6 -6
- data/Rakefile +44 -46
- data/lib/config/locales/en.yml +92 -43
- data/lib/mongoid/association/accessors.rb +44 -11
- data/lib/mongoid/association/bindable.rb +50 -2
- data/lib/mongoid/association/builders.rb +5 -3
- data/lib/mongoid/association/constrainable.rb +0 -1
- data/lib/mongoid/association/eager_loadable.rb +32 -7
- data/lib/mongoid/association/embedded/batchable.rb +34 -11
- data/lib/mongoid/association/embedded/cyclic.rb +1 -1
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
- data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +85 -46
- data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
- data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
- data/lib/mongoid/association/macros.rb +8 -1
- data/lib/mongoid/association/many.rb +11 -7
- data/lib/mongoid/association/nested/many.rb +5 -4
- data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
- data/lib/mongoid/association/nested/one.rb +45 -7
- data/lib/mongoid/association/one.rb +2 -2
- data/lib/mongoid/association/options.rb +9 -9
- data/lib/mongoid/association/proxy.rb +15 -4
- data/lib/mongoid/association/referenced/auto_save.rb +4 -3
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
- data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
- data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
- data/lib/mongoid/association/referenced/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
- data/lib/mongoid/association/referenced/has_many/proxy.rb +40 -21
- data/lib/mongoid/association/referenced/has_many.rb +3 -3
- data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
- data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
- data/lib/mongoid/association/referenced/has_one.rb +3 -3
- data/lib/mongoid/association/referenced/syncable.rb +4 -4
- data/lib/mongoid/association/reflections.rb +4 -4
- data/lib/mongoid/association/relatable.rb +44 -10
- data/lib/mongoid/association.rb +5 -5
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic.rb +16 -7
- data/lib/mongoid/attributes/dynamic.rb +4 -4
- data/lib/mongoid/attributes/nested.rb +6 -6
- data/lib/mongoid/attributes/processing.rb +37 -6
- data/lib/mongoid/attributes/projector.rb +2 -2
- data/lib/mongoid/attributes/readonly.rb +11 -6
- data/lib/mongoid/attributes.rb +51 -42
- data/lib/mongoid/changeable.rb +147 -14
- data/lib/mongoid/clients/options.rb +5 -1
- data/lib/mongoid/clients/sessions.rb +2 -14
- data/lib/mongoid/clients/storage_options.rb +2 -5
- data/lib/mongoid/clients/validators/storage.rb +3 -15
- data/lib/mongoid/collection_configurable.rb +58 -0
- data/lib/mongoid/composable.rb +2 -0
- data/lib/mongoid/config/defaults.rb +60 -0
- data/lib/mongoid/config/options.rb +3 -0
- data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
- data/lib/mongoid/config/validators/client.rb +6 -6
- data/lib/mongoid/config/validators.rb +1 -0
- data/lib/mongoid/config.rb +153 -18
- data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
- data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
- data/lib/mongoid/contextual/aggregable/none.rb +1 -1
- data/lib/mongoid/contextual/atomic.rb +1 -1
- data/lib/mongoid/contextual/geo_near.rb +7 -7
- data/lib/mongoid/contextual/map_reduce.rb +2 -2
- data/lib/mongoid/contextual/memory.rb +285 -58
- data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
- data/lib/mongoid/contextual/mongo.rb +540 -346
- data/lib/mongoid/contextual/none.rb +193 -20
- data/lib/mongoid/contextual/queryable.rb +1 -1
- data/lib/mongoid/contextual.rb +14 -2
- data/lib/mongoid/copyable.rb +32 -8
- data/lib/mongoid/criteria/findable.rb +8 -5
- data/lib/mongoid/criteria/includable.rb +27 -22
- data/lib/mongoid/criteria/marshalable.rb +10 -2
- data/lib/mongoid/criteria/permission.rb +1 -1
- data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
- data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
- data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +15 -9
- data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
- data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
- data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
- data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
- data/lib/mongoid/criteria/queryable/key.rb +4 -4
- data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
- data/lib/mongoid/criteria/queryable/optional.rb +11 -17
- data/lib/mongoid/criteria/queryable/options.rb +2 -2
- data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
- data/lib/mongoid/criteria/queryable/selectable.rb +48 -39
- data/lib/mongoid/criteria/queryable/selector.rb +92 -7
- data/lib/mongoid/criteria/queryable/smash.rb +40 -7
- data/lib/mongoid/criteria/queryable.rb +12 -7
- data/lib/mongoid/criteria/scopable.rb +2 -2
- data/lib/mongoid/criteria/translator.rb +45 -0
- data/lib/mongoid/criteria.rb +20 -40
- data/lib/mongoid/deprecable.rb +37 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +135 -36
- data/lib/mongoid/equality.rb +9 -8
- data/lib/mongoid/errors/create_collection_failure.rb +33 -0
- data/lib/mongoid/errors/document_not_found.rb +10 -6
- data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
- data/lib/mongoid/errors/immutable_attribute.rb +26 -0
- data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
- data/lib/mongoid/errors/invalid_config_option.rb +1 -1
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_field.rb +6 -2
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
- data/lib/mongoid/errors/invalid_relation.rb +1 -1
- data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
- data/lib/mongoid/errors/invalid_session_use.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
- data/lib/mongoid/errors/mongoid_error.rb +3 -3
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
- data/lib/mongoid/errors/no_client_database.rb +1 -1
- data/lib/mongoid/errors/no_client_hosts.rb +1 -1
- data/lib/mongoid/errors/readonly_attribute.rb +1 -1
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
- data/lib/mongoid/errors/unknown_attribute.rb +1 -1
- data/lib/mongoid/errors.rb +6 -3
- data/lib/mongoid/extensions/array.rb +9 -7
- data/lib/mongoid/extensions/big_decimal.rb +33 -10
- data/lib/mongoid/extensions/binary.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +8 -2
- data/lib/mongoid/extensions/date.rb +26 -20
- data/lib/mongoid/extensions/date_time.rb +1 -1
- data/lib/mongoid/extensions/false_class.rb +1 -1
- data/lib/mongoid/extensions/float.rb +7 -4
- data/lib/mongoid/extensions/hash.rb +38 -9
- data/lib/mongoid/extensions/integer.rb +7 -4
- data/lib/mongoid/extensions/module.rb +1 -1
- data/lib/mongoid/extensions/object.rb +10 -8
- data/lib/mongoid/extensions/range.rb +41 -10
- data/lib/mongoid/extensions/regexp.rb +11 -4
- data/lib/mongoid/extensions/set.rb +11 -4
- data/lib/mongoid/extensions/string.rb +11 -22
- data/lib/mongoid/extensions/symbol.rb +4 -15
- data/lib/mongoid/extensions/time.rb +29 -16
- data/lib/mongoid/extensions/time_with_zone.rb +1 -2
- data/lib/mongoid/extensions/true_class.rb +1 -1
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/factory.rb +55 -7
- data/lib/mongoid/fields/foreign_key.rb +11 -4
- data/lib/mongoid/fields/localized.rb +19 -4
- data/lib/mongoid/fields/standard.rb +17 -7
- data/lib/mongoid/fields/validators/macro.rb +3 -9
- data/lib/mongoid/fields.rb +142 -28
- data/lib/mongoid/findable.rb +54 -24
- data/lib/mongoid/indexable/specification.rb +2 -2
- data/lib/mongoid/indexable/validators/options.rb +6 -2
- data/lib/mongoid/interceptable.rb +187 -16
- data/lib/mongoid/matchable.rb +1 -1
- data/lib/mongoid/matcher/eq_impl.rb +1 -1
- data/lib/mongoid/matcher/type.rb +1 -1
- data/lib/mongoid/matcher.rb +48 -14
- data/lib/mongoid/persistable/creatable.rb +19 -9
- data/lib/mongoid/persistable/deletable.rb +2 -2
- data/lib/mongoid/persistable/destroyable.rb +1 -1
- data/lib/mongoid/persistable/savable.rb +14 -2
- data/lib/mongoid/persistable/unsettable.rb +2 -2
- data/lib/mongoid/persistable/updatable.rb +69 -12
- data/lib/mongoid/persistable/upsertable.rb +21 -2
- data/lib/mongoid/persistable.rb +6 -3
- data/lib/mongoid/persistence_context.rb +6 -4
- data/lib/mongoid/query_cache.rb +13 -261
- data/lib/mongoid/railties/controller_runtime.rb +1 -1
- data/lib/mongoid/railties/database.rake +7 -2
- data/lib/mongoid/reloadable.rb +10 -8
- data/lib/mongoid/scopable.rb +15 -13
- data/lib/mongoid/selectable.rb +1 -2
- data/lib/mongoid/serializable.rb +17 -13
- data/lib/mongoid/stateful.rb +57 -10
- data/lib/mongoid/tasks/database.rake +12 -0
- data/lib/mongoid/tasks/database.rb +20 -2
- data/lib/mongoid/threaded/lifecycle.rb +5 -5
- data/lib/mongoid/threaded.rb +42 -12
- data/lib/mongoid/timestamps/created.rb +9 -2
- data/lib/mongoid/timestamps/updated.rb +2 -2
- data/lib/mongoid/touchable.rb +3 -4
- data/lib/mongoid/traversable.rb +41 -5
- data/lib/mongoid/utils.rb +22 -0
- data/lib/mongoid/validatable/associated.rb +98 -17
- data/lib/mongoid/validatable/localizable.rb +1 -1
- data/lib/mongoid/validatable/macros.rb +5 -7
- data/lib/mongoid/validatable/presence.rb +2 -2
- data/lib/mongoid/validatable/uniqueness.rb +9 -8
- data/lib/mongoid/validatable.rb +17 -6
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +19 -4
- data/lib/mongoid.rb +17 -3
- data/spec/config/mongoid.yml +16 -0
- data/spec/integration/app_spec.rb +24 -19
- data/spec/integration/associations/belongs_to_spec.rb +18 -0
- data/spec/integration/associations/embedded_spec.rb +15 -0
- data/spec/integration/associations/embeds_many_spec.rb +15 -2
- data/spec/integration/associations/embeds_one_spec.rb +18 -0
- data/spec/integration/associations/foreign_key_spec.rb +9 -0
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +61 -0
- data/spec/integration/associations/has_one_spec.rb +97 -1
- data/spec/integration/associations/scope_option_spec.rb +1 -1
- data/spec/integration/callbacks_models.rb +132 -1
- data/spec/integration/callbacks_spec.rb +381 -4
- data/spec/integration/criteria/range_spec.rb +95 -1
- data/spec/integration/discriminator_key_spec.rb +118 -80
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/i18n_fallbacks_spec.rb +3 -32
- data/spec/integration/matcher_examples_spec.rb +20 -13
- data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
- data/spec/integration/matcher_operator_spec.rb +3 -5
- data/spec/integration/persistence/range_field_spec.rb +350 -0
- data/spec/mongoid/association/counter_cache_spec.rb +1 -1
- data/spec/mongoid/association/depending_spec.rb +9 -9
- data/spec/mongoid/association/eager_spec.rb +26 -3
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +290 -65
- data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +16 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
- data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +19 -0
- data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +215 -177
- data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
- data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
- data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
- data/spec/mongoid/association/syncable_spec.rb +15 -1
- data/spec/mongoid/association_spec.rb +60 -0
- data/spec/mongoid/atomic/paths_spec.rb +0 -14
- data/spec/mongoid/attributes/nested_spec.rb +80 -11
- data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
- data/spec/mongoid/attributes/projector_spec.rb +1 -5
- data/spec/mongoid/attributes/readonly_spec.rb +19 -0
- data/spec/mongoid/attributes_spec.rb +526 -33
- data/spec/mongoid/changeable_spec.rb +429 -37
- data/spec/mongoid/clients/factory_spec.rb +23 -30
- data/spec/mongoid/clients/sessions_spec.rb +0 -38
- data/spec/mongoid/clients_spec.rb +149 -15
- data/spec/mongoid/collection_configurable_spec.rb +158 -0
- data/spec/mongoid/config/defaults_spec.rb +160 -0
- data/spec/mongoid/config_spec.rb +214 -31
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
- data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
- data/spec/mongoid/contextual/memory_spec.rb +850 -88
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
- data/spec/mongoid/contextual/mongo_spec.rb +2256 -1005
- data/spec/mongoid/contextual/none_spec.rb +60 -21
- data/spec/mongoid/copyable_spec.rb +453 -11
- data/spec/mongoid/criteria/findable_spec.rb +86 -210
- data/spec/mongoid/criteria/includable_spec.rb +1492 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
- data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +107 -86
- data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
- data/spec/mongoid/criteria/translator_spec.rb +132 -0
- data/spec/mongoid/criteria_projection_spec.rb +1 -5
- data/spec/mongoid/criteria_spec.rb +469 -1205
- data/spec/mongoid/document_fields_spec.rb +173 -24
- data/spec/mongoid/document_spec.rb +59 -41
- data/spec/mongoid/equality_spec.rb +6 -0
- data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
- data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
- data/spec/mongoid/extensions/array_spec.rb +16 -2
- data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
- data/spec/mongoid/extensions/binary_spec.rb +44 -9
- data/spec/mongoid/extensions/boolean_spec.rb +68 -82
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
- data/spec/mongoid/extensions/date_spec.rb +71 -1
- data/spec/mongoid/extensions/date_time_spec.rb +15 -9
- data/spec/mongoid/extensions/float_spec.rb +53 -74
- data/spec/mongoid/extensions/hash_spec.rb +33 -3
- data/spec/mongoid/extensions/integer_spec.rb +50 -64
- data/spec/mongoid/extensions/range_spec.rb +255 -54
- data/spec/mongoid/extensions/regexp_spec.rb +58 -33
- data/spec/mongoid/extensions/set_spec.rb +106 -0
- data/spec/mongoid/extensions/string_spec.rb +53 -25
- data/spec/mongoid/extensions/symbol_spec.rb +18 -25
- data/spec/mongoid/extensions/time_spec.rb +639 -106
- data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
- data/spec/mongoid/factory_spec.rb +61 -1
- data/spec/mongoid/fields/localized_spec.rb +80 -37
- data/spec/mongoid/fields_spec.rb +503 -87
- data/spec/mongoid/findable_spec.rb +450 -58
- data/spec/mongoid/indexable/specification_spec.rb +2 -2
- data/spec/mongoid/indexable_spec.rb +55 -30
- data/spec/mongoid/interceptable_spec.rb +904 -22
- data/spec/mongoid/interceptable_spec_models.rb +189 -22
- data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
- data/spec/mongoid/mongoizable_spec.rb +285 -0
- data/spec/mongoid/persistable/creatable_spec.rb +2 -2
- data/spec/mongoid/persistable/deletable_spec.rb +28 -8
- data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
- data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
- data/spec/mongoid/persistable/logical_spec.rb +37 -0
- data/spec/mongoid/persistable/poppable_spec.rb +36 -0
- data/spec/mongoid/persistable/pullable_spec.rb +72 -0
- data/spec/mongoid/persistable/pushable_spec.rb +72 -0
- data/spec/mongoid/persistable/renamable_spec.rb +36 -0
- data/spec/mongoid/persistable/savable_spec.rb +96 -0
- data/spec/mongoid/persistable/settable_spec.rb +37 -0
- data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
- data/spec/mongoid/persistable/updatable_spec.rb +20 -28
- data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
- data/spec/mongoid/persistence_context_spec.rb +31 -57
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
- data/spec/mongoid/query_cache_spec.rb +56 -215
- data/spec/mongoid/reloadable_spec.rb +83 -6
- data/spec/mongoid/scopable_spec.rb +91 -1
- data/spec/mongoid/serializable_spec.rb +25 -39
- data/spec/mongoid/shardable_spec.rb +4 -4
- data/spec/mongoid/stateful_spec.rb +150 -8
- data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
- data/spec/mongoid/tasks/database_spec.rb +127 -0
- data/spec/mongoid/timestamps/created_spec.rb +23 -0
- data/spec/mongoid/timestamps_spec.rb +392 -4
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +390 -2
- data/spec/mongoid/touchable_spec_models.rb +14 -8
- data/spec/mongoid/traversable_spec.rb +13 -35
- data/spec/mongoid/validatable/associated_spec.rb +27 -34
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/mongoid_spec.rb +34 -16
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
- data/spec/rails/mongoid_spec.rb +4 -16
- data/spec/spec_helper.rb +5 -0
- data/spec/support/constraints.rb +24 -0
- data/spec/support/immutable_ids.rb +118 -0
- data/spec/support/macros.rb +78 -0
- data/spec/support/models/artist.rb +0 -1
- data/spec/support/models/augmentation.rb +12 -0
- data/spec/support/models/band.rb +5 -0
- data/spec/support/models/book.rb +1 -0
- data/spec/support/models/building.rb +2 -0
- data/spec/support/models/catalog.rb +24 -0
- data/spec/support/models/circus.rb +3 -0
- data/spec/support/models/cover.rb +10 -0
- data/spec/support/models/fanatic.rb +8 -0
- data/spec/support/models/implant.rb +9 -0
- data/spec/support/models/label.rb +2 -0
- data/spec/support/models/lat_lng.rb +6 -0
- data/spec/support/models/name.rb +10 -0
- data/spec/support/models/passport.rb +9 -0
- data/spec/support/models/person.rb +2 -0
- data/spec/support/models/player.rb +2 -0
- data/spec/support/models/powerup.rb +12 -0
- data/spec/support/models/product.rb +1 -0
- data/spec/support/models/purse.rb +9 -0
- data/spec/support/models/registry.rb +1 -0
- data/spec/support/models/school.rb +14 -0
- data/spec/support/models/shield.rb +18 -0
- data/spec/support/models/student.rb +14 -0
- data/spec/support/models/weapon.rb +12 -0
- metadata +98 -96
- checksums.yaml.gz.sig +0 -0
- data/lib/mongoid/errors/eager_load.rb +0 -23
- data/lib/mongoid/errors/invalid_value.rb +0 -17
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
- data/spec/mongoid/errors/eager_load_spec.rb +0 -31
- data/spec/shared/LICENSE +0 -20
- data/spec/shared/bin/get-mongodb-download-url +0 -17
- data/spec/shared/bin/s3-copy +0 -45
- data/spec/shared/bin/s3-upload +0 -69
- data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
- data/spec/shared/lib/mrss/cluster_config.rb +0 -231
- data/spec/shared/lib/mrss/constraints.rb +0 -378
- data/spec/shared/lib/mrss/docker_runner.rb +0 -291
- data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
- data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
- data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
- data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
- data/spec/shared/lib/mrss/session_registry.rb +0 -69
- data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
- data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
- data/spec/shared/lib/mrss/utils.rb +0 -15
- data/spec/shared/share/Dockerfile.erb +0 -325
- data/spec/shared/share/haproxy-1.conf +0 -16
- data/spec/shared/share/haproxy-2.conf +0 -17
- data/spec/shared/shlib/config.sh +0 -27
- data/spec/shared/shlib/distro.sh +0 -74
- data/spec/shared/shlib/server.sh +0 -392
- data/spec/shared/shlib/set_env.sh +0 -169
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -3
@@ -1,210 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Mrss
|
4
|
-
# Test event subscriber.
|
5
|
-
class EventSubscriber
|
6
|
-
|
7
|
-
# The mappings of event names to types.
|
8
|
-
MAPPINGS = {
|
9
|
-
'topology_opening_event' => Mongo::Monitoring::Event::TopologyOpening,
|
10
|
-
'topology_description_changed_event' => Mongo::Monitoring::Event::TopologyChanged,
|
11
|
-
'topology_closed_event' => Mongo::Monitoring::Event::TopologyClosed,
|
12
|
-
'server_opening_event' => Mongo::Monitoring::Event::ServerOpening,
|
13
|
-
'server_description_changed_event' => Mongo::Monitoring::Event::ServerDescriptionChanged,
|
14
|
-
'server_closed_event' => Mongo::Monitoring::Event::ServerClosed
|
15
|
-
}.freeze
|
16
|
-
|
17
|
-
attr_reader :all_events
|
18
|
-
|
19
|
-
attr_reader :started_events
|
20
|
-
|
21
|
-
attr_reader :succeeded_events
|
22
|
-
|
23
|
-
attr_reader :failed_events
|
24
|
-
|
25
|
-
attr_reader :published_events
|
26
|
-
|
27
|
-
# @param [ String ] name Optional name for the event subscriber.
|
28
|
-
def initialize(name: nil)
|
29
|
-
@mutex = Mutex.new
|
30
|
-
clear_events!
|
31
|
-
@name = name
|
32
|
-
end
|
33
|
-
|
34
|
-
def to_s
|
35
|
-
%Q`#<EventSubscriber:#{@name ? "\"#{@name}\"" : '%x' % object_id} \
|
36
|
-
started=#{started_events.length} \
|
37
|
-
succeeded=#{succeeded_events.length} \
|
38
|
-
failed=#{failed_events.length} \
|
39
|
-
published=#{published_events.length}>`
|
40
|
-
end
|
41
|
-
|
42
|
-
alias :inspect :to_s
|
43
|
-
|
44
|
-
# Event retrieval
|
45
|
-
|
46
|
-
def select_started_events(cls)
|
47
|
-
started_events.select do |event|
|
48
|
-
event.is_a?(cls)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def select_succeeded_events(cls)
|
53
|
-
succeeded_events.select do |event|
|
54
|
-
event.is_a?(cls)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def select_completed_events(*classes)
|
59
|
-
(succeeded_events + failed_events).select do |event|
|
60
|
-
classes.any? { |c| c === event }
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def select_published_events(cls)
|
65
|
-
published_events.select do |event|
|
66
|
-
event.is_a?(cls)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
# Filters command started events for the specified command name.
|
71
|
-
def command_started_events(command_name)
|
72
|
-
started_events.select do |event|
|
73
|
-
event.command[command_name]
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def non_auth_command_started_events
|
78
|
-
started_events.reject do |event|
|
79
|
-
%w(authenticate getnonce saslSstart saslContinue).any? do |cmd|
|
80
|
-
event.command[cmd]
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
# Locates command stated events for the specified command name,
|
86
|
-
# asserts that there is exactly one such event, and returns it.
|
87
|
-
def single_command_started_event(command_name, include_auth: false, database_name: nil)
|
88
|
-
events = if include_auth
|
89
|
-
started_events
|
90
|
-
else
|
91
|
-
non_auth_command_started_events
|
92
|
-
end
|
93
|
-
get_one_event(events, command_name, 'started', database_name: database_name)
|
94
|
-
end
|
95
|
-
|
96
|
-
# Locates command succeeded events for the specified command name,
|
97
|
-
# asserts that there is exactly one such event, and returns it.
|
98
|
-
def single_command_succeeded_event(command_name, database_name: nil)
|
99
|
-
get_one_event(succeeded_events, command_name, 'succeeded', database_name: database_name)
|
100
|
-
end
|
101
|
-
|
102
|
-
def get_one_event(events, command_name, kind, database_name: nil)
|
103
|
-
events = events.select do |event|
|
104
|
-
event.command_name == command_name and
|
105
|
-
database_name.nil? || database_name == event.database_name
|
106
|
-
end
|
107
|
-
if events.length != 1
|
108
|
-
raise "Expected a single '#{command_name}' #{kind} event#{database_name ? " for '#{database_name}'" : ''} but we have #{events.length}"
|
109
|
-
end
|
110
|
-
events.first
|
111
|
-
end
|
112
|
-
|
113
|
-
# Get the first succeeded event published for the name, and then delete it.
|
114
|
-
#
|
115
|
-
# @param [ String ] name The event name.
|
116
|
-
#
|
117
|
-
# @return [ Event ] The matching event.
|
118
|
-
def first_event(name)
|
119
|
-
cls = MAPPINGS[name]
|
120
|
-
if cls.nil?
|
121
|
-
raise ArgumentError, "Bogus event name #{name}"
|
122
|
-
end
|
123
|
-
matching = succeeded_events.find do |event|
|
124
|
-
cls === event
|
125
|
-
end
|
126
|
-
succeeded_events.delete(matching)
|
127
|
-
matching
|
128
|
-
end
|
129
|
-
|
130
|
-
# Event recording
|
131
|
-
|
132
|
-
# Cache the started event.
|
133
|
-
#
|
134
|
-
# @param [ Event ] event The event.
|
135
|
-
def started(event)
|
136
|
-
@mutex.synchronize do
|
137
|
-
started_events << event
|
138
|
-
all_events << event
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
# Cache the succeeded event.
|
143
|
-
#
|
144
|
-
# @param [ Event ] event The event.
|
145
|
-
def succeeded(event)
|
146
|
-
@mutex.synchronize do
|
147
|
-
succeeded_events << event
|
148
|
-
all_events << event
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
# Cache the failed event.
|
153
|
-
#
|
154
|
-
# @param [ Event ] event The event.
|
155
|
-
def failed(event)
|
156
|
-
@mutex.synchronize do
|
157
|
-
failed_events << event
|
158
|
-
all_events << event
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
def published(event)
|
163
|
-
@mutex.synchronize do
|
164
|
-
published_events << event
|
165
|
-
all_events << event
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
# Clear all cached events.
|
170
|
-
def clear_events!
|
171
|
-
@all_events = []
|
172
|
-
@started_events = []
|
173
|
-
@succeeded_events = []
|
174
|
-
@failed_events = []
|
175
|
-
@published_events = []
|
176
|
-
self
|
177
|
-
end
|
178
|
-
end
|
179
|
-
# Only handles succeeded events correctly.
|
180
|
-
class PhasedEventSubscriber < EventSubscriber
|
181
|
-
def initialize
|
182
|
-
super
|
183
|
-
@phase_events = {}
|
184
|
-
end
|
185
|
-
|
186
|
-
def phase_finished(phase_index)
|
187
|
-
@phase_events[phase_index] = succeeded_events
|
188
|
-
@succeeded_events = []
|
189
|
-
end
|
190
|
-
|
191
|
-
def phase_events(phase_index)
|
192
|
-
@phase_events[phase_index]
|
193
|
-
end
|
194
|
-
|
195
|
-
def event_count
|
196
|
-
@phase_events.inject(0) do |sum, event|
|
197
|
-
sum + event.length
|
198
|
-
end
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
class VerboseEventSubscriber < EventSubscriber
|
203
|
-
%w(started succeeded failed published).each do |meth|
|
204
|
-
define_method(meth) do |event|
|
205
|
-
puts event.summary
|
206
|
-
super(event)
|
207
|
-
end
|
208
|
-
end
|
209
|
-
end
|
210
|
-
end
|
@@ -1,238 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
# encoding: utf-8
|
3
|
-
|
4
|
-
module Mrss
|
5
|
-
module LiteConstraints
|
6
|
-
|
7
|
-
# Constrain tests that use TimeoutInterrupt to MRI (and Unix).
|
8
|
-
def require_mri
|
9
|
-
before(:all) do
|
10
|
-
unless SpecConfig.instance.mri?
|
11
|
-
skip "MRI required, we have #{SpecConfig.instance.platform}"
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def require_jruby
|
17
|
-
before(:all) do
|
18
|
-
unless BSON::Environment.jruby?
|
19
|
-
skip "JRuby required, we have #{SpecConfig.instance.platform}"
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
# This is for marking tests that fail on JRuby that should
|
25
|
-
# in principle work (as opposed to being fundamentally incompatible
|
26
|
-
# with JRuby).
|
27
|
-
# Often times these failures happen only in Evergreen.
|
28
|
-
def fails_on_jruby(version=nil)
|
29
|
-
before(:all) do
|
30
|
-
if BSON::Environment.jruby?
|
31
|
-
if version
|
32
|
-
min_parts = version.split('.').map(&:to_i)
|
33
|
-
actual_parts = JRUBY_VERSION.split('.').map(&:to_i)[0...min_parts.length]
|
34
|
-
actual = actual_parts.join('.')
|
35
|
-
if actual <= version
|
36
|
-
skip "Fails on jruby through #{version}"
|
37
|
-
end
|
38
|
-
else
|
39
|
-
skip "Fails on jruby"
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
# Indicates that the respective test uses the internet in some capacity,
|
46
|
-
# for example the test resolves SRV DNS records.
|
47
|
-
def require_external_connectivity
|
48
|
-
before(:all) do
|
49
|
-
if ENV['EXTERNAL_DISABLED']
|
50
|
-
skip "Test requires external connectivity"
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def require_mongo_kerberos
|
56
|
-
before(:all) do
|
57
|
-
# TODO Use a more generic environment variable name if/when
|
58
|
-
# Mongoid tests get Kerberos configurations.
|
59
|
-
unless %w(1 yes true).include?(ENV['MONGO_RUBY_DRIVER_KERBEROS']&.downcase)
|
60
|
-
skip 'Set MONGO_RUBY_DRIVER_KERBEROS=1 in environment to run Kerberos unit tests'
|
61
|
-
end
|
62
|
-
require 'mongo_kerberos'
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def require_linting
|
67
|
-
before(:all) do
|
68
|
-
unless Mongo::Lint.enabled?
|
69
|
-
skip "Linting is not enabled"
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
# Some tests will fail if linting is enabled:
|
75
|
-
# 1. Tests that pass invalid options to client, etc. which the linter
|
76
|
-
# rejects.
|
77
|
-
# 2. Tests that set expectations on topologies, server descriptions, etc.
|
78
|
-
# (since setting expectations requires mutating said objects, and when
|
79
|
-
# linting is on those objects are frozen).
|
80
|
-
def require_no_linting
|
81
|
-
before(:all) do
|
82
|
-
if Mongo::Lint.enabled?
|
83
|
-
skip "Linting is enabled"
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
def require_libmongocrypt
|
89
|
-
before(:all) do
|
90
|
-
# If FLE is set in environment, the entire test run is supposed to
|
91
|
-
# include FLE therefore run the FLE tests.
|
92
|
-
if (ENV['LIBMONGOCRYPT_PATH'] || '').empty? && (ENV['FLE'] || '').empty?
|
93
|
-
skip 'Test requires path to libmongocrypt to be specified in LIBMONGOCRYPT_PATH env variable'
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def min_libmongocrypt_version(version)
|
99
|
-
require_libmongocrypt
|
100
|
-
before(:all) do
|
101
|
-
actual_version = Gem::Version.new(Mongo::Crypt::Binding.mongocrypt_version(nil))
|
102
|
-
min_version = Gem::Version.new(version)
|
103
|
-
unless actual_version >= min_version
|
104
|
-
skip "libmongocrypt version #{min_version} required, but version #{actual_version} is available"
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
def require_no_libmongocrypt
|
110
|
-
before(:all) do
|
111
|
-
if ENV['LIBMONGOCRYPT_PATH']
|
112
|
-
skip 'Test requires libmongocrypt to not be configured'
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
def require_aws_auth
|
118
|
-
before(:all) do
|
119
|
-
unless (ENV['AUTH'] || '') =~ /^aws/
|
120
|
-
skip 'This test requires AUTH=aws* and an appropriately configured runtime environment'
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
def require_ec2_host
|
126
|
-
before(:all) do
|
127
|
-
if $have_aws.nil?
|
128
|
-
$have_aws = begin
|
129
|
-
require 'open-uri'
|
130
|
-
begin
|
131
|
-
Timeout.timeout(3.81) do
|
132
|
-
URI.parse('http://169.254.169.254/latest/meta-data/profile').open.read
|
133
|
-
end
|
134
|
-
true
|
135
|
-
# When trying to use the EC2 metadata endpoint on ECS:
|
136
|
-
# Errno::EINVAL: Failed to open TCP connection to 169.254.169.254:80 (Invalid argument - connect(2) for "169.254.169.254" port 80)
|
137
|
-
rescue Timeout::Error, Errno::ETIMEDOUT, Errno::EINVAL, OpenURI::HTTPError => $aws_error
|
138
|
-
false
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|
142
|
-
unless $have_aws
|
143
|
-
skip "EC2 instance metadata is not available - assuming not running on an EC2 instance: #{$aws_error.class}: #{$aws_error}"
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
def require_stress
|
149
|
-
before(:all) do
|
150
|
-
if !SpecConfig.instance.stress?
|
151
|
-
skip 'Set STRESS=1 in environment to run stress tests'
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
def require_fork
|
157
|
-
before(:all) do
|
158
|
-
if !SpecConfig.instance.fork?
|
159
|
-
skip 'Set FORK=1 in environment to run fork tests'
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
def require_ocsp
|
165
|
-
before(:all) do
|
166
|
-
if !SpecConfig.instance.ocsp?
|
167
|
-
skip 'Set OCSP=1 in environment to run OCSP tests'
|
168
|
-
end
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
def require_ocsp_verifier
|
173
|
-
before(:all) do
|
174
|
-
if !SpecConfig.instance.ocsp_verifier?
|
175
|
-
skip 'Set OCSP_VERIFIER=1 in environment to run OCSP verifier tests'
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
def require_ocsp_connectivity
|
181
|
-
before(:all) do
|
182
|
-
if !SpecConfig.instance.ocsp_connectivity?
|
183
|
-
skip 'Set OCSP_CONNECTIVITY=pass or OCSP_CONNECTIVITY=fail in environment to run OCSP connectivity tests'
|
184
|
-
end
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
def require_active_support
|
189
|
-
before(:all) do
|
190
|
-
if !SpecConfig.instance.active_support?
|
191
|
-
skip 'This test requires ActiveSupport; set WITH_ACTIVE_SUPPORT=1 in environment'
|
192
|
-
end
|
193
|
-
end
|
194
|
-
end
|
195
|
-
|
196
|
-
def no_active_support
|
197
|
-
before(:all) do
|
198
|
-
if SpecConfig.instance.active_support?
|
199
|
-
skip 'This test requires no ActiveSupport; unset WITH_ACTIVE_SUPPORT in environment'
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
def require_fallbacks
|
205
|
-
before(:all) do
|
206
|
-
unless %w(yes true 1).include?((ENV['TEST_I18N_FALLBACKS'] || '').downcase)
|
207
|
-
skip 'Set TEST_I18N_FALLBACKS=1 environment variable to run these tests'
|
208
|
-
end
|
209
|
-
end
|
210
|
-
end
|
211
|
-
|
212
|
-
def require_no_fallbacks
|
213
|
-
before(:all) do
|
214
|
-
if %w(yes true 1).include?((ENV['TEST_I18N_FALLBACKS'] || '').downcase)
|
215
|
-
skip 'Set TEST_I18N_FALLBACKS=0 environment variable to run these tests'
|
216
|
-
end
|
217
|
-
end
|
218
|
-
end
|
219
|
-
|
220
|
-
# This is a macro for retrying flaky tests on CI that occasionally fail.
|
221
|
-
# Note that the tests will only be retried on CI.
|
222
|
-
#
|
223
|
-
# @param [ Integer ] :tries The number of times to retry.
|
224
|
-
# @param [ Integer ] :sleep The number of seconds to sleep in between retries.
|
225
|
-
# If nothing, or nil, is passed, we won't wait in between retries.
|
226
|
-
def retry_test(tries: 3, sleep: nil)
|
227
|
-
if %w(1 yes true).include?(ENV['CI'])
|
228
|
-
around do |example|
|
229
|
-
if sleep
|
230
|
-
example.run_with_retry retry: tries, retry_wait: sleep
|
231
|
-
else
|
232
|
-
example.run_with_retry retry: tries
|
233
|
-
end
|
234
|
-
end
|
235
|
-
end
|
236
|
-
end
|
237
|
-
end
|
238
|
-
end
|
@@ -1,120 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
# encoding: utf-8
|
3
|
-
|
4
|
-
autoload :JSON, 'json'
|
5
|
-
require 'open-uri'
|
6
|
-
|
7
|
-
module Mrss
|
8
|
-
class ServerVersionRegistry
|
9
|
-
class Error < StandardError
|
10
|
-
end
|
11
|
-
|
12
|
-
class UnknownVersion < Error
|
13
|
-
end
|
14
|
-
|
15
|
-
class MissingDownloadUrl < Error
|
16
|
-
end
|
17
|
-
|
18
|
-
class BrokenDownloadUrl < Error
|
19
|
-
end
|
20
|
-
|
21
|
-
def initialize(desired_version, arch)
|
22
|
-
@desired_version, @arch = desired_version, arch
|
23
|
-
end
|
24
|
-
|
25
|
-
attr_reader :desired_version, :arch
|
26
|
-
|
27
|
-
def download_url
|
28
|
-
@download_url ||= begin
|
29
|
-
version, version_ok = detect_version(current_catalog)
|
30
|
-
if version.nil?
|
31
|
-
version, full_version_ok = detect_version(full_catalog)
|
32
|
-
version_ok ||= full_version_ok
|
33
|
-
end
|
34
|
-
if version.nil?
|
35
|
-
if version_ok
|
36
|
-
raise MissingDownloadUrl, "No downloads for version #{desired_version}"
|
37
|
-
else
|
38
|
-
raise UnknownVersion, "No version #{desired_version}"
|
39
|
-
end
|
40
|
-
end
|
41
|
-
dl = version['downloads'].detect do |dl|
|
42
|
-
dl['archive']['url'].index("enterprise-#{arch}") &&
|
43
|
-
dl['arch'] == 'x86_64'
|
44
|
-
end
|
45
|
-
unless dl
|
46
|
-
raise MissingDownloadUrl, "No download for #{arch} for #{version['version']}"
|
47
|
-
end
|
48
|
-
url = dl['archive']['url']
|
49
|
-
end
|
50
|
-
rescue MissingDownloadUrl
|
51
|
-
if %w(2.6 3.0).include?(desired_version) && arch == 'ubuntu1604'
|
52
|
-
# 2.6 and 3.0 are only available for ubuntu1204 and ubuntu1404.
|
53
|
-
# Those ubuntus have ancient Pythons that don't work due to not
|
54
|
-
# implementing recent TLS protocols.
|
55
|
-
# Because of this we test on ubuntu1604 which has a newer Python.
|
56
|
-
# But we still need to retrieve ubuntu1404-targeting builds.
|
57
|
-
url = self.class.new('3.2', arch).download_url
|
58
|
-
unless url.include?('3.2.')
|
59
|
-
raise 'URL not in expected format'
|
60
|
-
end
|
61
|
-
url = case desired_version
|
62
|
-
when '2.6'
|
63
|
-
url.sub(/\b3\.2\.\d+/, '2.6.12')
|
64
|
-
when '3.0'
|
65
|
-
url.sub(/\b3\.2\.\d+/, '3.0.15')
|
66
|
-
else
|
67
|
-
raise NotImplementedError
|
68
|
-
end.sub('ubuntu1604', 'ubuntu1404')
|
69
|
-
else
|
70
|
-
raise
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
private
|
75
|
-
|
76
|
-
def uri_open(*args)
|
77
|
-
if RUBY_VERSION < '2.5'
|
78
|
-
open(*args)
|
79
|
-
else
|
80
|
-
URI.open(*args)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
def detect_version(catalog)
|
85
|
-
candidate_versions = catalog['versions'].select do |version|
|
86
|
-
version['version'].start_with?(desired_version) &&
|
87
|
-
!version['version'].include?('-')
|
88
|
-
end
|
89
|
-
version_ok = !candidate_versions.empty?
|
90
|
-
# Sometimes the download situation is borked and there is a release
|
91
|
-
# with no downloads... skip those.
|
92
|
-
version = candidate_versions.detect do |version|
|
93
|
-
!version['downloads'].empty?
|
94
|
-
end
|
95
|
-
# Allow RC releases if there isn't a GA release.
|
96
|
-
if version.nil?
|
97
|
-
candidate_versions = catalog['versions'].select do |version|
|
98
|
-
version['version'].start_with?(desired_version)
|
99
|
-
end
|
100
|
-
version_ok ||= !candidate_versions.empty?
|
101
|
-
version = candidate_versions.detect do |version|
|
102
|
-
!version['downloads'].empty?
|
103
|
-
end
|
104
|
-
end
|
105
|
-
[version, version_ok]
|
106
|
-
end
|
107
|
-
|
108
|
-
def current_catalog
|
109
|
-
@current_catalog ||= begin
|
110
|
-
JSON.load(uri_open('http://downloads.mongodb.org/current.json').read)
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
def full_catalog
|
115
|
-
@full_catalog ||= begin
|
116
|
-
JSON.load(uri_open('http://downloads.mongodb.org/full.json').read)
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
@@ -1,69 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
# encoding: utf-8
|
3
|
-
|
4
|
-
require 'singleton'
|
5
|
-
|
6
|
-
module Mrss
|
7
|
-
|
8
|
-
def self.patch_mongo_for_session_registry
|
9
|
-
|
10
|
-
Mongo::Client.class_eval do
|
11
|
-
alias :get_session_without_tracking :get_session
|
12
|
-
|
13
|
-
def get_session(options = {})
|
14
|
-
get_session_without_tracking(options).tap do |session|
|
15
|
-
SessionRegistry.instance.register(session) if session&.materialized?
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
Mongo::Session.class_eval do
|
21
|
-
alias :end_session_without_tracking :end_session
|
22
|
-
|
23
|
-
def end_session
|
24
|
-
SessionRegistry.instance.unregister(self)
|
25
|
-
end_session_without_tracking
|
26
|
-
end
|
27
|
-
|
28
|
-
alias :materialize_if_needed_without_tracking :materialize_if_needed
|
29
|
-
|
30
|
-
def materialize_if_needed
|
31
|
-
materialize_if_needed_without_tracking.tap do
|
32
|
-
SessionRegistry.instance.register(self)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
module Mrss
|
40
|
-
class SessionRegistry
|
41
|
-
include Singleton
|
42
|
-
|
43
|
-
def initialize
|
44
|
-
@registry = {}
|
45
|
-
end
|
46
|
-
|
47
|
-
def register(session)
|
48
|
-
@registry[session.session_id] = session if session
|
49
|
-
end
|
50
|
-
|
51
|
-
def unregister(session)
|
52
|
-
return if session.ended? || !session.materialized?
|
53
|
-
@registry.delete(session.session_id)
|
54
|
-
end
|
55
|
-
|
56
|
-
def verify_sessions_ended!
|
57
|
-
@registry.delete_if { |_, session| session.ended? }
|
58
|
-
|
59
|
-
unless @registry.empty?
|
60
|
-
sessions = @registry.map { |_, session| session }
|
61
|
-
raise "Session registry contains live sessions: #{sessions.join(', ')}"
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def clear_registry
|
66
|
-
@registry = {}
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
@@ -1,60 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
# encoding: utf-8
|
3
|
-
|
4
|
-
require 'singleton'
|
5
|
-
|
6
|
-
module Mrss
|
7
|
-
|
8
|
-
def self.patch_mongo_for_session_registry
|
9
|
-
|
10
|
-
Mongo::Client.class_eval do
|
11
|
-
alias :get_session_without_tracking :get_session
|
12
|
-
|
13
|
-
def get_session(options = {})
|
14
|
-
get_session_without_tracking(options).tap do |session|
|
15
|
-
SessionRegistry.instance.register(session)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
Mongo::Session.class_eval do
|
21
|
-
alias :end_session_without_tracking :end_session
|
22
|
-
|
23
|
-
def end_session
|
24
|
-
SessionRegistry.instance.unregister(self)
|
25
|
-
end_session_without_tracking
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
module Mrss
|
32
|
-
class SessionRegistry
|
33
|
-
include Singleton
|
34
|
-
|
35
|
-
def initialize
|
36
|
-
@registry = {}
|
37
|
-
end
|
38
|
-
|
39
|
-
def register(session)
|
40
|
-
@registry[session.session_id] = session if session
|
41
|
-
end
|
42
|
-
|
43
|
-
def unregister(session)
|
44
|
-
@registry.delete(session.session_id) unless session.ended?
|
45
|
-
end
|
46
|
-
|
47
|
-
def verify_sessions_ended!
|
48
|
-
@registry.delete_if { |_, session| session.ended? }
|
49
|
-
|
50
|
-
unless @registry.empty?
|
51
|
-
sessions = @registry.map { |_, session| session }
|
52
|
-
raise "Session registry contains live sessions: #{sessions.join(', ')}"
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def clear_registry
|
57
|
-
@registry = {}
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|