mongoid 7.4.0 → 8.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.md +3 -3
- data/lib/config/locales/en.yml +51 -28
- data/lib/mongoid/association/accessors.rb +32 -3
- data/lib/mongoid/association/bindable.rb +48 -0
- data/lib/mongoid/association/builders.rb +4 -2
- data/lib/mongoid/association/eager_loadable.rb +29 -7
- data/lib/mongoid/association/embedded/batchable.rb +48 -8
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
- data/lib/mongoid/association/embedded/embedded_in.rb +2 -1
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +40 -18
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +21 -2
- data/lib/mongoid/association/macros.rb +22 -1
- data/lib/mongoid/association/many.rb +5 -0
- data/lib/mongoid/association/nested/many.rb +2 -1
- data/lib/mongoid/association/proxy.rb +12 -0
- data/lib/mongoid/association/referenced/auto_save.rb +3 -2
- 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.rb +1 -1
- data/lib/mongoid/association/referenced/counter_cache.rb +8 -8
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +64 -11
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +4 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +10 -14
- data/lib/mongoid/association/referenced/has_many/proxy.rb +12 -9
- data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/has_one/proxy.rb +8 -11
- data/lib/mongoid/association/referenced/syncable.rb +2 -2
- data/lib/mongoid/association/relatable.rb +38 -4
- data/lib/mongoid/atomic/paths/embedded/many.rb +19 -0
- data/lib/mongoid/attributes/processing.rb +9 -2
- data/lib/mongoid/attributes.rb +30 -27
- data/lib/mongoid/changeable.rb +37 -2
- data/lib/mongoid/clients/options.rb +4 -0
- data/lib/mongoid/clients/sessions.rb +2 -14
- data/lib/mongoid/config/environment.rb +20 -4
- data/lib/mongoid/config.rb +25 -10
- data/lib/mongoid/contextual/aggregable/memory.rb +23 -15
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +2 -2
- data/lib/mongoid/contextual/memory.rb +176 -17
- data/lib/mongoid/contextual/mongo.rb +226 -206
- data/lib/mongoid/contextual/none.rb +66 -4
- data/lib/mongoid/copyable.rb +32 -8
- data/lib/mongoid/criteria/includable.rb +24 -20
- data/lib/mongoid/criteria/marshalable.rb +10 -2
- data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -13
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
- 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 +0 -14
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
- 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 +1 -1
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
- 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/mergeable.rb +21 -0
- data/lib/mongoid/criteria/queryable/optional.rb +3 -9
- data/lib/mongoid/criteria/queryable/options.rb +1 -1
- data/lib/mongoid/criteria/queryable/selectable.rb +28 -34
- data/lib/mongoid/criteria/queryable/selector.rb +89 -4
- data/lib/mongoid/criteria/queryable/smash.rb +39 -6
- data/lib/mongoid/criteria/queryable.rb +11 -6
- data/lib/mongoid/criteria.rb +1 -26
- data/lib/mongoid/deprecable.rb +36 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +96 -32
- data/lib/mongoid/errors/document_not_found.rb +29 -8
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_field.rb +5 -1
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
- data/lib/mongoid/errors.rb +2 -2
- data/lib/mongoid/extensions/array.rb +8 -6
- data/lib/mongoid/extensions/big_decimal.rb +29 -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/float.rb +4 -5
- data/lib/mongoid/extensions/hash.rb +12 -5
- data/lib/mongoid/extensions/integer.rb +4 -5
- data/lib/mongoid/extensions/object.rb +2 -0
- 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 +2 -13
- data/lib/mongoid/extensions/symbol.rb +3 -14
- data/lib/mongoid/extensions/time.rb +27 -16
- data/lib/mongoid/extensions/time_with_zone.rb +1 -2
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/factory.rb +42 -7
- data/lib/mongoid/fields/foreign_key.rb +7 -0
- data/lib/mongoid/fields/validators/macro.rb +3 -9
- data/lib/mongoid/fields.rb +194 -28
- data/lib/mongoid/findable.rb +27 -7
- data/lib/mongoid/indexable/specification.rb +1 -1
- data/lib/mongoid/indexable/validators/options.rb +4 -1
- data/lib/mongoid/interceptable.rb +69 -9
- data/lib/mongoid/persistable/creatable.rb +14 -5
- data/lib/mongoid/persistable/updatable.rb +12 -5
- data/lib/mongoid/persistable/upsertable.rb +1 -1
- data/lib/mongoid/persistence_context.rb +19 -2
- data/lib/mongoid/query_cache.rb +6 -258
- data/lib/mongoid/railties/controller_runtime.rb +1 -1
- data/lib/mongoid/reloadable.rb +7 -3
- data/lib/mongoid/selectable.rb +1 -2
- data/lib/mongoid/stateful.rb +27 -1
- data/lib/mongoid/timestamps/created.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +1 -1
- data/lib/mongoid/touchable.rb +2 -3
- data/lib/mongoid/traversable.rb +5 -1
- data/lib/mongoid/validatable/uniqueness.rb +2 -1
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +28 -0
- data/lib/mongoid.rb +2 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +11 -5
- data/spec/config/mongoid.yml +16 -0
- data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
- data/spec/integration/app_spec.rb +28 -26
- data/spec/integration/associations/belongs_to_spec.rb +18 -0
- data/spec/integration/associations/embedded_dirty_spec.rb +28 -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 +21 -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 +95 -1
- data/spec/integration/callbacks_spec.rb +226 -4
- data/spec/integration/criteria/range_spec.rb +95 -1
- data/spec/integration/discriminator_key_spec.rb +115 -76
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- 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/lite_spec_helper.rb +1 -1
- 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 +2 -1
- 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 +69 -9
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +219 -8
- data/spec/mongoid/association/embedded/embeds_many_models.rb +157 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -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_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 +15 -0
- data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +67 -4
- 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 +8 -8
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +82 -13
- 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 +14 -0
- data/spec/mongoid/atomic/paths_spec.rb +0 -14
- data/spec/mongoid/atomic_spec.rb +22 -0
- 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_spec.rb +524 -27
- data/spec/mongoid/changeable_spec.rb +130 -13
- data/spec/mongoid/clients/factory_spec.rb +34 -42
- data/spec/mongoid/clients/options_spec.rb +1 -0
- data/spec/mongoid/clients/sessions_spec.rb +0 -38
- data/spec/mongoid/clients_spec.rb +32 -2
- data/spec/mongoid/config/environment_spec.rb +39 -1
- data/spec/mongoid/config_spec.rb +104 -13
- 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 +1337 -69
- data/spec/mongoid/contextual/mongo_spec.rb +1105 -172
- data/spec/mongoid/contextual/none_spec.rb +38 -0
- data/spec/mongoid/copyable_spec.rb +451 -1
- 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/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 +0 -484
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +289 -124
- data/spec/mongoid/criteria/queryable/selector_spec.rb +14 -2
- data/spec/mongoid/criteria_spec.rb +474 -1198
- data/spec/mongoid/document_fields_spec.rb +173 -24
- data/spec/mongoid/document_spec.rb +32 -41
- data/spec/mongoid/errors/document_not_found_spec.rb +76 -0
- 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/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 +697 -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 +48 -76
- data/spec/mongoid/extensions/hash_spec.rb +30 -0
- data/spec/mongoid/extensions/integer_spec.rb +45 -66
- 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 +634 -66
- data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
- data/spec/mongoid/factory_spec.rb +61 -1
- data/spec/mongoid/fields_spec.rb +321 -50
- data/spec/mongoid/findable_spec.rb +80 -15
- data/spec/mongoid/indexable/specification_spec.rb +2 -2
- data/spec/mongoid/indexable_spec.rb +16 -19
- data/spec/mongoid/interceptable_spec.rb +584 -5
- data/spec/mongoid/interceptable_spec_models.rb +235 -4
- 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 +2 -2
- data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
- data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
- data/spec/mongoid/persistence_context_spec.rb +50 -1
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
- data/spec/mongoid/query_cache_spec.rb +0 -154
- data/spec/mongoid/reloadable_spec.rb +35 -2
- data/spec/mongoid/scopable_spec.rb +21 -1
- data/spec/mongoid/shardable_spec.rb +14 -0
- data/spec/mongoid/stateful_spec.rb +28 -0
- data/spec/mongoid/timestamps_spec.rb +390 -0
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +116 -0
- data/spec/mongoid/touchable_spec_models.rb +12 -8
- data/spec/mongoid/traversable_spec.rb +4 -11
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
- data/spec/rails/mongoid_spec.rb +4 -16
- data/spec/shared/lib/mrss/constraints.rb +8 -16
- data/spec/shared/lib/mrss/docker_runner.rb +23 -3
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +32 -1
- data/spec/shared/share/Dockerfile.erb +34 -48
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/server.sh +32 -19
- data/spec/shared/shlib/set_env.sh +37 -0
- data/spec/support/constraints.rb +24 -0
- data/spec/support/macros.rb +39 -0
- data/spec/support/models/augmentation.rb +12 -0
- data/spec/support/models/band.rb +3 -0
- data/spec/support/models/catalog.rb +24 -0
- data/spec/support/models/circus.rb +3 -0
- data/spec/support/models/code.rb +2 -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/membership.rb +1 -0
- data/spec/support/models/passport.rb +9 -0
- data/spec/support/models/person.rb +1 -0
- data/spec/support/models/player.rb +2 -0
- data/spec/support/models/powerup.rb +12 -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
- data/spec/support/schema_maps/schema_map_aws.json +17 -0
- data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_azure.json +17 -0
- data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_gcp.json +17 -0
- data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_kmip.json +17 -0
- data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_local.json +18 -0
- data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/spec_config.rb +4 -0
- data.tar.gz.sig +0 -0
- metadata +76 -13
- metadata.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/errors/eager_load_spec.rb +0 -31
data/lib/mongoid/stateful.rb
CHANGED
@@ -6,7 +6,15 @@ module Mongoid
|
|
6
6
|
# document can transition through.
|
7
7
|
module Stateful
|
8
8
|
|
9
|
-
attr_writer :destroyed, :flagged_for_destroy, :
|
9
|
+
attr_writer :destroyed, :flagged_for_destroy, :previously_new_record
|
10
|
+
|
11
|
+
def new_record=(new_value)
|
12
|
+
@new_record ||= false
|
13
|
+
if @new_record && !new_value
|
14
|
+
@previously_new_record = true
|
15
|
+
end
|
16
|
+
@new_record = new_value
|
17
|
+
end
|
10
18
|
|
11
19
|
# Returns true if the +Document+ has not been persisted to the database,
|
12
20
|
# false if it has. This is determined by the variable @new_record
|
@@ -20,6 +28,15 @@ module Mongoid
|
|
20
28
|
@new_record ||= false
|
21
29
|
end
|
22
30
|
|
31
|
+
# Returns true if this document was just created -- that is, prior to the last
|
32
|
+
# save, the object didn't exist in the database and new_record? would have
|
33
|
+
# returned true.
|
34
|
+
#
|
35
|
+
# @return [ true, false ] True if was just created, false if not.
|
36
|
+
def previously_new_record?
|
37
|
+
@previously_new_record ||= false
|
38
|
+
end
|
39
|
+
|
23
40
|
# Checks if the document has been saved to the database. Returns false
|
24
41
|
# if the document has been destroyed.
|
25
42
|
#
|
@@ -31,6 +48,15 @@ module Mongoid
|
|
31
48
|
!new_record? && !destroyed?
|
32
49
|
end
|
33
50
|
|
51
|
+
# Checks if the document was previously saved to the database
|
52
|
+
# but now it has been deleted.
|
53
|
+
#
|
54
|
+
# @return [ true, false ] True if was persisted but now destroyed,
|
55
|
+
# otherwise false.
|
56
|
+
def previously_persisted?
|
57
|
+
!new_record? && destroyed?
|
58
|
+
end
|
59
|
+
|
34
60
|
# Returns whether or not the document has been flagged for deletion, but
|
35
61
|
# not destroyed yet. Used for atomic pulls of child documents.
|
36
62
|
#
|
data/lib/mongoid/touchable.rb
CHANGED
@@ -19,10 +19,10 @@ module Mongoid
|
|
19
19
|
#
|
20
20
|
# @param [ Symbol ] field The name of an additional field to update.
|
21
21
|
#
|
22
|
-
# @return [ true/false ] false if
|
22
|
+
# @return [ true/false ] false if document is new_record otherwise true.
|
23
23
|
def touch(field = nil)
|
24
24
|
return false if _root.new_record?
|
25
|
-
current = Time.now
|
25
|
+
current = Time.configured.now
|
26
26
|
field = database_field_name(field)
|
27
27
|
write_attribute(:updated_at, current) if respond_to?("updated_at=")
|
28
28
|
write_attribute(field, current) if field
|
@@ -60,7 +60,6 @@ module Mongoid
|
|
60
60
|
|
61
61
|
# Callbacks are invoked on the composition root first and on the
|
62
62
|
# leaf-most embedded document last.
|
63
|
-
# TODO add tests, see MONGOID-5015.
|
64
63
|
run_callbacks(:touch)
|
65
64
|
true
|
66
65
|
end
|
data/lib/mongoid/traversable.rb
CHANGED
@@ -178,7 +178,10 @@ module Mongoid
|
|
178
178
|
to_expand = []
|
179
179
|
expanding.each do |child|
|
180
180
|
next if expanded[child]
|
181
|
-
expanded
|
181
|
+
# Don't mark expanded if _id is nil, since documents are compared by
|
182
|
+
# their _ids, multiple embedded documents with nil ids will compare
|
183
|
+
# equally, and some documents will not be expanded.
|
184
|
+
expanded[child] = true if child._id
|
182
185
|
children << child
|
183
186
|
to_expand += child._children
|
184
187
|
end
|
@@ -230,6 +233,7 @@ module Mongoid
|
|
230
233
|
def remove_child(child)
|
231
234
|
name = child.association_name
|
232
235
|
if child.embedded_one?
|
236
|
+
self.attributes.delete(child._association.store_as)
|
233
237
|
remove_ivar(name)
|
234
238
|
else
|
235
239
|
relation = send(name)
|
@@ -16,7 +16,7 @@ module Mongoid
|
|
16
16
|
# end
|
17
17
|
#
|
18
18
|
# It is also possible to limit the uniqueness constraint to a set of
|
19
|
-
#
|
19
|
+
# documents matching certain conditions:
|
20
20
|
# class Person
|
21
21
|
# include Mongoid::Document
|
22
22
|
# field :title
|
@@ -242,6 +242,7 @@ module Mongoid
|
|
242
242
|
relation = document._parent.send(document.association_name)
|
243
243
|
criteria = create_criteria(relation, document, attribute, value)
|
244
244
|
criteria = criteria.merge(options[:conditions].call) if options[:conditions]
|
245
|
+
criteria = criteria.limit(2)
|
245
246
|
add_error(document, attribute, value) if criteria.count > 1
|
246
247
|
end
|
247
248
|
|
data/lib/mongoid/version.rb
CHANGED
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
|
5
|
+
# Encapsulates behavior around logging and caching warnings so they are only
|
6
|
+
# logged once.
|
7
|
+
#
|
8
|
+
# @api private
|
9
|
+
module Warnings
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def warning(id, message)
|
13
|
+
singleton_class.class_eval do
|
14
|
+
define_method("warn_#{id}") do
|
15
|
+
unless instance_variable_get("@#{id}")
|
16
|
+
Mongoid.logger.warn(message)
|
17
|
+
instance_variable_set("@#{id}", true)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
warning :geo_haystack_deprecated, 'The geoHaystack type is deprecated.'
|
25
|
+
warning :as_json_compact_deprecated, '#as_json :compact option is deprecated. Please call #compact on the returned Hash object instead.'
|
26
|
+
warning :symbol_type_deprecated, 'The BSON Symbol type is deprecated by MongoDB. Please use String or StringifiedSymbol field types instead of the Symbol field type'
|
27
|
+
end
|
28
|
+
end
|
data/lib/mongoid.rb
CHANGED
@@ -16,6 +16,7 @@ require "mongo"
|
|
16
16
|
require 'mongo/active_support'
|
17
17
|
|
18
18
|
require "mongoid/version"
|
19
|
+
require "mongoid/deprecable"
|
19
20
|
require "mongoid/config"
|
20
21
|
require "mongoid/persistence_context"
|
21
22
|
require "mongoid/loggable"
|
@@ -23,6 +24,7 @@ require "mongoid/clients"
|
|
23
24
|
require "mongoid/document"
|
24
25
|
require "mongoid/tasks/database"
|
25
26
|
require "mongoid/query_cache"
|
27
|
+
require "mongoid/warnings"
|
26
28
|
|
27
29
|
# If we are using Rails then we will include the Mongoid railtie. This has all
|
28
30
|
# the nifty initializers that Mongoid needs.
|
@@ -80,8 +80,13 @@ development:
|
|
80
80
|
# (default: 10)
|
81
81
|
# connect_timeout: 10
|
82
82
|
|
83
|
-
#
|
84
|
-
#
|
83
|
+
# How long to wait for a response for each operation sent to the
|
84
|
+
# server. This timeout should be set to a value larger than the
|
85
|
+
# processing time for the longest operation that will be executed
|
86
|
+
# by the application. Note that this is a client-side timeout;
|
87
|
+
# the server may continue executing an operation after the client
|
88
|
+
# aborts it with the SocketTimeout exception.
|
89
|
+
# (default: nil, meaning no timeout)
|
85
90
|
# socket_timeout: 5
|
86
91
|
|
87
92
|
# The name of the replica set to connect to. Servers provided as seeds that do
|
@@ -120,9 +125,6 @@ development:
|
|
120
125
|
# database name is not explicitly defined. (default: nil)
|
121
126
|
# app_name: MyApplicationName
|
122
127
|
|
123
|
-
# Create indexes in background by default. (default: false)
|
124
|
-
# background_indexing: false
|
125
|
-
|
126
128
|
# Mark belongs_to associations as required by default, so that saving a
|
127
129
|
# model with a missing belongs_to association will trigger a validation
|
128
130
|
# error. (default: true)
|
@@ -167,6 +169,10 @@ development:
|
|
167
169
|
# (default: false)
|
168
170
|
# use_utc: false
|
169
171
|
|
172
|
+
# (Deprecated) In MongoDB 4.0 and earlier, set whether to create
|
173
|
+
# indexes in the background by default. (default: false)
|
174
|
+
# background_indexing: false
|
175
|
+
|
170
176
|
test:
|
171
177
|
clients:
|
172
178
|
default:
|
data/spec/config/mongoid.yml
CHANGED
@@ -40,6 +40,22 @@ test:
|
|
40
40
|
app_name: 'testing'
|
41
41
|
background_indexing: false
|
42
42
|
join_contexts: false
|
43
|
+
driver_options:
|
44
|
+
broken_view_options: false
|
45
|
+
# Don't set validate_update_replace here, as it is used to check if the
|
46
|
+
# default driver options are kept in Mongoid.
|
47
|
+
test_nil:
|
48
|
+
clients:
|
49
|
+
default:
|
50
|
+
database: mongoid_test
|
51
|
+
hosts:
|
52
|
+
<% SpecConfig.instance.addresses.each do |address| %>
|
53
|
+
- <%= address %>
|
54
|
+
<% end %>
|
55
|
+
driver_options:
|
56
|
+
broken_view_options:
|
57
|
+
validate_update_replace: false
|
58
|
+
|
43
59
|
test_with_max_staleness:
|
44
60
|
clients:
|
45
61
|
default:
|
@@ -0,0 +1,27 @@
|
|
1
|
+
test:
|
2
|
+
clients:
|
3
|
+
default:
|
4
|
+
database: mongoid_test
|
5
|
+
hosts:
|
6
|
+
<% SpecConfig.instance.addresses.each do |address| %>
|
7
|
+
- <%= address %>
|
8
|
+
<% end %>
|
9
|
+
options:
|
10
|
+
auto_encryption_options:
|
11
|
+
key_vault_namespace: 'admin.datakeys'
|
12
|
+
kms_providers:
|
13
|
+
local:
|
14
|
+
key: "z7iYiYKLuYymEWtk4kfny1ESBwwFdA58qMqff96A8ghiOcIK75lJGPUIocku8LOFjQuEgeIP4xlln3s7r93FV9J5sAE7zg8U"
|
15
|
+
schema_map:
|
16
|
+
blog_development.comments:
|
17
|
+
properties:
|
18
|
+
message:
|
19
|
+
encrypt:
|
20
|
+
keyId:
|
21
|
+
- !ruby/object:BSON::Binary
|
22
|
+
data: !binary |-
|
23
|
+
R/AgNcxASFiiJWKXqWGo5w==
|
24
|
+
type: :uuid
|
25
|
+
bsonType: "string"
|
26
|
+
algorithm: "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
|
27
|
+
bsonType: "object"
|
@@ -5,6 +5,11 @@ require 'spec_helper'
|
|
5
5
|
BASE = File.join(File.dirname(__FILE__), '../..')
|
6
6
|
TMP_BASE = File.join(BASE, 'tmp')
|
7
7
|
|
8
|
+
def check_call(cmd, **opts)
|
9
|
+
puts "Executing #{cmd.join(' ')}"
|
10
|
+
Mrss::ChildProcessHelper.check_call(cmd, **opts)
|
11
|
+
end
|
12
|
+
|
8
13
|
describe 'Mongoid application tests' do
|
9
14
|
before(:all) do
|
10
15
|
unless SpecConfig.instance.app_tests?
|
@@ -87,14 +92,14 @@ describe 'Mongoid application tests' do
|
|
87
92
|
|
88
93
|
Dir.chdir(TMP_BASE) do
|
89
94
|
FileUtils.rm_rf('mongoid-test')
|
90
|
-
|
95
|
+
check_call(%w(rails new mongoid-test --skip-spring --skip-active-record), env: clean_env)
|
91
96
|
|
92
97
|
Dir.chdir('mongoid-test') do
|
93
98
|
adjust_app_gemfile
|
94
|
-
|
99
|
+
check_call(%w(bundle install), env: clean_env)
|
95
100
|
|
96
|
-
|
97
|
-
|
101
|
+
check_call(%w(rails g model post), env: clean_env)
|
102
|
+
check_call(%w(rails g model comment post:belongs_to), env: clean_env)
|
98
103
|
|
99
104
|
# https://jira.mongodb.org/browse/MONGOID-4885
|
100
105
|
comment_text = File.read('app/models/comment.rb')
|
@@ -109,16 +114,16 @@ describe 'Mongoid application tests' do
|
|
109
114
|
|
110
115
|
Dir.chdir(TMP_BASE) do
|
111
116
|
FileUtils.rm_rf('mongoid-test-config')
|
112
|
-
|
117
|
+
check_call(%w(rails new mongoid-test-config --skip-spring --skip-active-record), env: clean_env)
|
113
118
|
|
114
119
|
Dir.chdir('mongoid-test-config') do
|
115
120
|
adjust_app_gemfile
|
116
|
-
|
121
|
+
check_call(%w(bundle install), env: clean_env)
|
117
122
|
|
118
123
|
mongoid_config_file = File.join(TMP_BASE,'mongoid-test-config/config/mongoid.yml')
|
119
124
|
|
120
125
|
File.exist?(mongoid_config_file).should be false
|
121
|
-
|
126
|
+
check_call(%w(rails g mongoid:config), env: clean_env)
|
122
127
|
File.exist?(mongoid_config_file).should be true
|
123
128
|
|
124
129
|
config_text = File.read(mongoid_config_file)
|
@@ -130,10 +135,11 @@ describe 'Mongoid application tests' do
|
|
130
135
|
end
|
131
136
|
|
132
137
|
def install_rails
|
133
|
-
|
138
|
+
check_call(%w(gem uni rails -a))
|
134
139
|
if (rails_version = SpecConfig.instance.rails_version) == 'master'
|
135
140
|
else
|
136
|
-
|
141
|
+
check_call(%w(gem list))
|
142
|
+
check_call(%w(gem install rails --no-document -v) + ["~> #{rails_version}.0"])
|
137
143
|
end
|
138
144
|
end
|
139
145
|
|
@@ -157,7 +163,15 @@ describe 'Mongoid application tests' do
|
|
157
163
|
before do
|
158
164
|
Dir.chdir(APP_PATH) do
|
159
165
|
remove_bundler_req
|
160
|
-
|
166
|
+
|
167
|
+
if BSON::Environment.jruby?
|
168
|
+
# Remove existing Gemfile.lock - see
|
169
|
+
# https://github.com/rubygems/rubygems/issues/3231
|
170
|
+
require 'fileutils'
|
171
|
+
FileUtils.rm_f('Gemfile.lock')
|
172
|
+
end
|
173
|
+
|
174
|
+
check_call(%w(bundle install), env: env)
|
161
175
|
write_mongoid_yml
|
162
176
|
end
|
163
177
|
|
@@ -171,7 +185,7 @@ describe 'Mongoid application tests' do
|
|
171
185
|
end
|
172
186
|
index.should be nil
|
173
187
|
|
174
|
-
|
188
|
+
check_call(%w(bundle exec rake db:mongoid:create_indexes -t),
|
175
189
|
cwd: APP_PATH, env: env)
|
176
190
|
|
177
191
|
index = client['posts'].indexes.detect do |index|
|
@@ -189,11 +203,11 @@ describe 'Mongoid application tests' do
|
|
189
203
|
def clone_application(repo_url, subdir: nil)
|
190
204
|
Dir.chdir(TMP_BASE) do
|
191
205
|
FileUtils.rm_rf(File.basename(repo_url))
|
192
|
-
|
206
|
+
check_call(%w(git clone) + [repo_url])
|
193
207
|
Dir.chdir(File.join(*[File.basename(repo_url), subdir].compact)) do
|
194
208
|
adjust_app_gemfile
|
195
209
|
adjust_rails_defaults
|
196
|
-
|
210
|
+
check_call(%w(bundle install), env: clean_env)
|
197
211
|
puts `git diff`
|
198
212
|
|
199
213
|
write_mongoid_yml
|
@@ -281,18 +295,6 @@ describe 'Mongoid application tests' do
|
|
281
295
|
f << lines.join
|
282
296
|
end
|
283
297
|
end
|
284
|
-
|
285
|
-
if rails_version == '5.1'
|
286
|
-
secrets = {
|
287
|
-
'development' => {
|
288
|
-
'secret_key_base' => 'abracadabra',
|
289
|
-
'my_secret_token' => 'very_secret',
|
290
|
-
},
|
291
|
-
}
|
292
|
-
File.open('config/secrets.yml', 'w') do |f|
|
293
|
-
f << YAML.dump(secrets)
|
294
|
-
end
|
295
|
-
end
|
296
298
|
end
|
297
299
|
|
298
300
|
def remove_bundler_req
|
@@ -316,7 +318,7 @@ describe 'Mongoid application tests' do
|
|
316
318
|
# in `initialize': too long unix socket path (126bytes given but 108bytes max) (ArgumentError)
|
317
319
|
# Is it trying to create unix sockets in current directory?
|
318
320
|
# https://stackoverflow.com/questions/30302021/rails-runner-without-spring
|
319
|
-
|
321
|
+
check_call(%w(bin/spring binstub --remove --all), env: clean_env)
|
320
322
|
end
|
321
323
|
|
322
324
|
def clean_env
|
@@ -12,4 +12,22 @@ describe 'belongs_to associations' do
|
|
12
12
|
expect(child).to be_valid
|
13
13
|
end
|
14
14
|
end
|
15
|
+
|
16
|
+
context 'when an anonymous class defines a belongs_to association' do
|
17
|
+
let(:klass) do
|
18
|
+
Class.new do
|
19
|
+
include Mongoid::Document
|
20
|
+
belongs_to :movie
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'loads the association correctly' do
|
25
|
+
expect { klass }.to_not raise_error
|
26
|
+
expect { klass.new.movie }.to_not raise_error
|
27
|
+
instance = klass.new
|
28
|
+
movie = Movie.new
|
29
|
+
instance.movie = movie
|
30
|
+
expect(instance.movie).to eq movie
|
31
|
+
end
|
32
|
+
end
|
15
33
|
end
|
@@ -24,6 +24,34 @@ describe 'embedded associations' do
|
|
24
24
|
it 'performs dirty tracking efficiently' do
|
25
25
|
subject.changed?.should be false
|
26
26
|
end
|
27
|
+
|
28
|
+
it 'calculates the descendants properly' do
|
29
|
+
expect(subject._descendants.length).to eq(40)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'when association is cyclic and the _id is nil' do
|
34
|
+
before do
|
35
|
+
# create deeply nested record
|
36
|
+
a = EmmOuter.create(level: 0)
|
37
|
+
level = 1
|
38
|
+
iter = a.inners.create(id: nil, level: level)
|
39
|
+
loop do
|
40
|
+
iter.friends.create(id: nil, level: (level += 1))
|
41
|
+
iter = iter.friends[0]
|
42
|
+
break if level == 40
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
let(:subject) { EmmOuter.first }
|
47
|
+
|
48
|
+
it 'performs dirty tracking efficiently' do
|
49
|
+
subject.changed?.should be false
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'calculates the descendants properly' do
|
53
|
+
expect(subject._descendants.length).to eq(40)
|
54
|
+
end
|
27
55
|
end
|
28
56
|
end
|
29
57
|
end
|
@@ -265,4 +265,19 @@ describe 'embedded associations' do
|
|
265
265
|
end
|
266
266
|
end
|
267
267
|
end
|
268
|
+
|
269
|
+
context "when summing properties on an embedded child" do
|
270
|
+
let(:user) { EmmUser.new }
|
271
|
+
before do
|
272
|
+
user.orders.build(amount: 200)
|
273
|
+
expect(user.orders.sum(:amount)).to eq(200)
|
274
|
+
|
275
|
+
user.orders.delete_all
|
276
|
+
user.orders.build(amount: 500)
|
277
|
+
end
|
278
|
+
|
279
|
+
it "the cache is cleared after deletion" do
|
280
|
+
expect(user.orders.sum(:amount)).to eq(500)
|
281
|
+
end
|
282
|
+
end
|
268
283
|
end
|
@@ -172,8 +172,6 @@ describe 'embeds_many associations' do
|
|
172
172
|
# Mongoid uses the new value of `x` in the $pullAll query,
|
173
173
|
# which doesn't match the document that is in the database,
|
174
174
|
# resulting in the empty array assignment not taking effect.
|
175
|
-
pending 'MONGOID-5037'
|
176
|
-
|
177
175
|
canvas.shapes.first.x = 1
|
178
176
|
canvas.shapes = []
|
179
177
|
canvas.save!
|
@@ -203,4 +201,19 @@ describe 'embeds_many associations' do
|
|
203
201
|
end
|
204
202
|
end
|
205
203
|
end
|
204
|
+
|
205
|
+
context 'when an anonymous class defines an embeds_many association' do
|
206
|
+
let(:klass) do
|
207
|
+
Class.new do
|
208
|
+
include Mongoid::Document
|
209
|
+
embeds_many :addresses
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
it 'loads the association correctly' do
|
214
|
+
expect { klass }.to_not raise_error
|
215
|
+
expect { klass.new.addresses }.to_not raise_error
|
216
|
+
expect(klass.new.addresses.build).to be_a Address
|
217
|
+
end
|
218
|
+
end
|
206
219
|
end
|
@@ -20,4 +20,22 @@ describe 'embeds_one associations' do
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
23
|
+
|
24
|
+
context 'when an anonymous class defines an embeds_one association' do
|
25
|
+
let(:klass) do
|
26
|
+
Class.new do
|
27
|
+
include Mongoid::Document
|
28
|
+
embeds_one :address
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'loads the association correctly' do
|
33
|
+
expect { klass }.to_not raise_error
|
34
|
+
expect { klass.new.address }.to_not raise_error
|
35
|
+
instance = klass.new
|
36
|
+
address = Address.new
|
37
|
+
instance.address = address
|
38
|
+
expect(instance.address).to eq address
|
39
|
+
end
|
40
|
+
end
|
23
41
|
end
|
@@ -27,6 +27,15 @@ describe 'Association foreign key configuration' do
|
|
27
27
|
expect(email.company.id).to eq(company.id)
|
28
28
|
end
|
29
29
|
|
30
|
+
it "has the correct criteria" do
|
31
|
+
company = ForeignKeySpec::Company.create!(c: "3")
|
32
|
+
email = ForeignKeySpec::Email.create!(company: company)
|
33
|
+
|
34
|
+
criteria = ForeignKeySpec::Email.where(company: company)
|
35
|
+
|
36
|
+
expect(criteria.selector).to eq({ "c_ref" => "3" })
|
37
|
+
end
|
38
|
+
|
30
39
|
context 'with default scope' do
|
31
40
|
context 'using default scope' do
|
32
41
|
it 'looks up child' do
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe 'has_and_belongs_to_many associations' do
|
6
|
+
|
7
|
+
context 'when an anonymous class defines a has_and_belongs_to_many association' do
|
8
|
+
let(:klass) do
|
9
|
+
Class.new do
|
10
|
+
include Mongoid::Document
|
11
|
+
has_and_belongs_to_many :movies, inverse_of: nil
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'loads the association correctly' do
|
16
|
+
expect { klass }.to_not raise_error
|
17
|
+
expect { klass.new.movies }.to_not raise_error
|
18
|
+
expect(klass.new.movies.build).to be_a Movie
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|