mongoid 7.2.3 → 7.3.0

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.
Files changed (152) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/Rakefile +16 -0
  5. data/lib/config/locales/en.yml +2 -2
  6. data/lib/mongoid/association/accessors.rb +1 -1
  7. data/lib/mongoid/association/constrainable.rb +1 -1
  8. data/lib/mongoid/association/depending.rb +4 -4
  9. data/lib/mongoid/association/embedded/batchable.rb +1 -1
  10. data/lib/mongoid/association/embedded/embedded_in.rb +1 -1
  11. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +10 -3
  12. data/lib/mongoid/association/nested/many.rb +1 -1
  13. data/lib/mongoid/association/nested/one.rb +4 -2
  14. data/lib/mongoid/association/proxy.rb +6 -1
  15. data/lib/mongoid/association/referenced/auto_save.rb +2 -2
  16. data/lib/mongoid/association/referenced/has_many/enumerable.rb +493 -495
  17. data/lib/mongoid/association/referenced/has_many/proxy.rb +2 -2
  18. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +2 -2
  19. data/lib/mongoid/attributes.rb +24 -13
  20. data/lib/mongoid/attributes/projector.rb +120 -0
  21. data/lib/mongoid/cacheable.rb +2 -2
  22. data/lib/mongoid/clients.rb +1 -1
  23. data/lib/mongoid/clients/factory.rb +22 -8
  24. data/lib/mongoid/config.rb +19 -2
  25. data/lib/mongoid/contextual/aggregable/mongo.rb +10 -8
  26. data/lib/mongoid/copyable.rb +1 -1
  27. data/lib/mongoid/criteria.rb +4 -5
  28. data/lib/mongoid/criteria/findable.rb +1 -1
  29. data/lib/mongoid/criteria/queryable/expandable.rb +0 -24
  30. data/lib/mongoid/criteria/queryable/extensions.rb +0 -4
  31. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
  32. data/lib/mongoid/criteria/queryable/mergeable.rb +46 -20
  33. data/lib/mongoid/criteria/queryable/selectable.rb +8 -8
  34. data/lib/mongoid/document.rb +1 -15
  35. data/lib/mongoid/errors/delete_restriction.rb +8 -9
  36. data/lib/mongoid/evolvable.rb +1 -1
  37. data/lib/mongoid/extensions/boolean.rb +1 -2
  38. data/lib/mongoid/extensions/false_class.rb +1 -1
  39. data/lib/mongoid/extensions/hash.rb +2 -2
  40. data/lib/mongoid/extensions/true_class.rb +1 -1
  41. data/lib/mongoid/fields.rb +43 -5
  42. data/lib/mongoid/inspectable.rb +1 -1
  43. data/lib/mongoid/matcher.rb +7 -0
  44. data/lib/mongoid/matcher/bits.rb +41 -0
  45. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  46. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  47. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  48. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  49. data/lib/mongoid/matcher/expression.rb +4 -0
  50. data/lib/mongoid/matcher/field_operator.rb +6 -0
  51. data/lib/mongoid/matcher/mod.rb +17 -0
  52. data/lib/mongoid/matcher/type.rb +99 -0
  53. data/lib/mongoid/persistable/deletable.rb +1 -2
  54. data/lib/mongoid/persistable/destroyable.rb +8 -2
  55. data/lib/mongoid/persistable/updatable.rb +27 -2
  56. data/lib/mongoid/query_cache.rb +35 -29
  57. data/lib/mongoid/selectable.rb +5 -7
  58. data/lib/mongoid/shardable.rb +21 -5
  59. data/lib/mongoid/touchable.rb +23 -4
  60. data/lib/mongoid/version.rb +1 -1
  61. data/spec/integration/associations/embeds_many_spec.rb +44 -0
  62. data/spec/integration/associations/has_one_spec.rb +48 -0
  63. data/spec/integration/criteria/date_field_spec.rb +1 -1
  64. data/spec/integration/document_spec.rb +9 -0
  65. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  66. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  67. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  68. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  69. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  70. data/spec/integration/matcher_operator_data/in.yml +16 -0
  71. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  72. data/spec/integration/matcher_operator_data/type.yml +70 -0
  73. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  74. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  75. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  76. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  77. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  78. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  79. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  80. data/spec/integration/matcher_operator_data/type_decimal.yml +40 -0
  81. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  82. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  83. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  84. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  85. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  86. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  87. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  88. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  89. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  90. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  91. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  92. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  93. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  94. data/spec/lite_spec_helper.rb +2 -0
  95. data/spec/mongoid/association/depending_spec.rb +391 -352
  96. data/spec/mongoid/association/nested/one_spec.rb +18 -14
  97. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +25 -8
  98. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +1 -1
  99. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +1 -1
  100. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +1 -1
  101. data/spec/mongoid/association/referenced/has_one_models.rb +8 -0
  102. data/spec/mongoid/atomic/paths_spec.rb +64 -12
  103. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  104. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  105. data/spec/mongoid/attributes/projector_spec.rb +41 -0
  106. data/spec/mongoid/attributes_spec.rb +98 -6
  107. data/spec/mongoid/clients/factory_spec.rb +48 -0
  108. data/spec/mongoid/config_spec.rb +32 -0
  109. data/spec/mongoid/contextual/mongo_spec.rb +2 -2
  110. data/spec/mongoid/criteria/modifiable_spec.rb +1 -1
  111. data/spec/mongoid/criteria/queryable/expandable_spec.rb +0 -73
  112. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +1 -1
  113. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +105 -7
  114. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +229 -24
  115. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
  116. data/spec/mongoid/criteria/queryable/selectable_spec.rb +1 -565
  117. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
  118. data/spec/mongoid/criteria_projection_spec.rb +411 -0
  119. data/spec/mongoid/criteria_spec.rb +0 -275
  120. data/spec/mongoid/document_spec.rb +13 -13
  121. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
  122. data/spec/mongoid/extensions/false_class_spec.rb +1 -1
  123. data/spec/mongoid/extensions/string_spec.rb +5 -5
  124. data/spec/mongoid/extensions/true_class_spec.rb +1 -1
  125. data/spec/mongoid/fields/localized_spec.rb +4 -4
  126. data/spec/mongoid/fields_spec.rb +4 -4
  127. data/spec/mongoid/inspectable_spec.rb +12 -4
  128. data/spec/mongoid/persistable/deletable_spec.rb +175 -1
  129. data/spec/mongoid/persistable/destroyable_spec.rb +191 -3
  130. data/spec/mongoid/persistable/savable_spec.rb +3 -5
  131. data/spec/mongoid/persistable/upsertable_spec.rb +1 -1
  132. data/spec/mongoid/query_cache_middleware_spec.rb +8 -0
  133. data/spec/mongoid/reloadable_spec.rb +18 -1
  134. data/spec/mongoid/shardable_spec.rb +44 -0
  135. data/spec/mongoid/touchable_spec.rb +104 -16
  136. data/spec/mongoid/touchable_spec_models.rb +52 -0
  137. data/spec/mongoid/validatable_spec.rb +1 -1
  138. data/spec/spec_helper.rb +6 -2
  139. data/spec/support/client_registry.rb +9 -0
  140. data/spec/support/models/bolt.rb +8 -0
  141. data/spec/support/models/hole.rb +13 -0
  142. data/spec/support/models/mop.rb +0 -1
  143. data/spec/support/models/nut.rb +8 -0
  144. data/spec/support/models/person.rb +6 -0
  145. data/spec/support/models/sealer.rb +8 -0
  146. data/spec/support/models/shirt.rb +12 -0
  147. data/spec/support/models/spacer.rb +8 -0
  148. data/spec/support/models/threadlocker.rb +8 -0
  149. data/spec/support/models/washer.rb +8 -0
  150. metadata +97 -3
  151. metadata.gz.sig +5 -3
  152. data/spec/support/cluster_config.rb +0 -158
@@ -0,0 +1,16 @@
1
+ - name: existing field - matches array
2
+ document:
3
+ prices: [1, 2, 3]
4
+ query:
5
+ prices:
6
+ $type: 4
7
+ matches: true
8
+ min_server_version: 3.6
9
+
10
+ - name: existing field - does not match array
11
+ document:
12
+ pi: 3
13
+ query:
14
+ pi:
15
+ $type: 4
16
+ matches: false
@@ -0,0 +1,18 @@
1
+ - name: existing field - matches binData
2
+ document:
3
+ price: !ruby/object:BSON::Binary
4
+ data: !binary |-
5
+ IW==
6
+ type: :generic
7
+ query:
8
+ price:
9
+ $type: 5
10
+ matches: true
11
+
12
+ - name: existing field - does not match binData
13
+ document:
14
+ price: 5
15
+ query:
16
+ price:
17
+ $type: 5
18
+ matches: false
@@ -0,0 +1,39 @@
1
+ - name: true value - matches
2
+ document:
3
+ status: true
4
+ query:
5
+ status:
6
+ $type: 8
7
+ matches: true
8
+
9
+ - name: false value - matches
10
+ document:
11
+ status: false
12
+ query:
13
+ status:
14
+ $type: 8
15
+ matches: true
16
+
17
+ - name: nil value - does not match
18
+ document:
19
+ status:
20
+ query:
21
+ status:
22
+ $type: 8
23
+ matches: false
24
+
25
+ - name: integer field - does not match
26
+ document:
27
+ pi: 3
28
+ query:
29
+ pi:
30
+ $type: 8
31
+ matches: false
32
+
33
+ - name: missing value - does not match
34
+ document:
35
+ x:
36
+ query:
37
+ status:
38
+ $type: 8
39
+ matches: false
@@ -0,0 +1,26 @@
1
+ - name: existing field - matches Code
2
+ document:
3
+ code: !ruby/object:BSON::Code
4
+ javascript: "var foo = 42;"
5
+ query:
6
+ code:
7
+ $type: 13
8
+ matches: true
9
+
10
+ - name: existing field - does not match Code
11
+ document:
12
+ code: 42
13
+ query:
14
+ code:
15
+ $type: 13
16
+ matches: false
17
+
18
+ - name: Code with Scope - does not match
19
+ document:
20
+ code: !ruby/object:BSON::CodeWithScope
21
+ javascript: "this.value = name"
22
+ scope: {name: "sid"}
23
+ query:
24
+ code:
25
+ $type: 13
26
+ matches: false
@@ -0,0 +1,26 @@
1
+ - name: existing field - matches Code with Scope
2
+ document:
3
+ code: !ruby/object:BSON::CodeWithScope
4
+ javascript: "this.value = name"
5
+ scope: {name: "sid"}
6
+ query:
7
+ code:
8
+ $type: 15
9
+ matches: true
10
+
11
+ - name: existing field - does not match Code with Scope
12
+ document:
13
+ code: 42
14
+ query:
15
+ code:
16
+ $type: 15
17
+ matches: false
18
+
19
+ - name: Code - does not match
20
+ document:
21
+ code: !ruby/object:BSON::Code
22
+ javascript: "var foo = 42;"
23
+ query:
24
+ code:
25
+ $type: 15
26
+ matches: false
@@ -0,0 +1,39 @@
1
+ - name: existing field - matches date with date_field
2
+ document:
3
+ date_field: 2020-11-19
4
+ query:
5
+ date_field:
6
+ $type: 9
7
+ matches: true
8
+
9
+ - name: existing field - matches date with time_field
10
+ document:
11
+ time_field: 2020-11-19 00:00:00
12
+ query:
13
+ time_field:
14
+ $type: 9
15
+ matches: true
16
+
17
+ - name: existing field - matches date with datetime_field
18
+ document:
19
+ datetime_field: 2020-11-19 00:00:00
20
+ query:
21
+ datetime_field:
22
+ $type: 9
23
+ matches: true
24
+
25
+ - name: existing field - matches date with default field
26
+ document:
27
+ day: 2020-11-19
28
+ query:
29
+ day:
30
+ $type: 9
31
+ matches: true
32
+
33
+ - name: existing field - does not match date
34
+ document:
35
+ name: 3
36
+ query:
37
+ name:
38
+ $type: 9
39
+ matches: false
@@ -0,0 +1,19 @@
1
+ - name: existing field - matches DBPointer
2
+ document:
3
+ ptr: !ruby/object:BSON::DbPointer
4
+ ref: "collection"
5
+ id: !ruby/object:BSON::ObjectId
6
+ raw_data: !binary |-
7
+ Xt0Zj+G4MlyV5hyJ
8
+ query:
9
+ ptr:
10
+ $type: 12
11
+ matches: true
12
+
13
+ - name: existing field - does not match DBPointer
14
+ document:
15
+ ptr: 3
16
+ query:
17
+ ptr:
18
+ $type: 12
19
+ matches: false
@@ -0,0 +1,40 @@
1
+ - name: Decimal128 in untyped field - matches
2
+ document:
3
+ number: !ruby/object:BSON::Decimal128
4
+ low: 4224
5
+ high: 3475653012423180288
6
+ query:
7
+ number:
8
+ $type: 19
9
+ matches: true
10
+ min_server_version: 3.4
11
+
12
+ - name: Decimal128 field - matches
13
+ document:
14
+ decimal128_field: !ruby/object:BSON::Decimal128
15
+ low: 4224
16
+ high: 3475653012423180288
17
+ query:
18
+ decimal128_field:
19
+ $type: 19
20
+ matches: true
21
+ min_server_version: 3.4
22
+
23
+ - name: existing field - does not match decimal
24
+ document:
25
+ name: "foo"
26
+ query:
27
+ name:
28
+ $type: 19
29
+ matches: false
30
+ min_server_version: 3.4
31
+
32
+ - name: BigDecimal field - does not match
33
+ document:
34
+ big_decimal_field: !ruby/object:BigDecimal
35
+ 18:0.42e2
36
+ query:
37
+ big_decimal_field:
38
+ $type: 19
39
+ matches: false
40
+ min_server_version: 3.4
@@ -0,0 +1,15 @@
1
+ - name: float - matches
2
+ document:
3
+ pi: 3.14
4
+ query:
5
+ pi:
6
+ $type: 1
7
+ matches: true
8
+
9
+ - name: integer - does not match
10
+ document:
11
+ pi: 3
12
+ query:
13
+ pi:
14
+ $type: 1
15
+ matches: false
@@ -0,0 +1,33 @@
1
+ - name: bson int32 - matches
2
+ document:
3
+ pi: !ruby/object:BSON::Int32
4
+ value: 3
5
+ query:
6
+ pi:
7
+ $type: 16
8
+ matches: true
9
+
10
+ - name: small integer - matches
11
+ document:
12
+ pi: 3
13
+ query:
14
+ pi:
15
+ $type: 16
16
+ matches: true
17
+
18
+ - name: big integer - does not match
19
+ document:
20
+ # Exactly 2**32
21
+ pi: 4294967296
22
+ query:
23
+ pi:
24
+ $type: 16
25
+ matches: false
26
+
27
+ - name: float - does not match
28
+ document:
29
+ pi: 3.14
30
+ query:
31
+ pi:
32
+ $type: 16
33
+ matches: false
@@ -0,0 +1,33 @@
1
+ - name: bson int64 - matches
2
+ document:
3
+ number: !ruby/object:BSON::Int64
4
+ value: 392141
5
+ query:
6
+ number:
7
+ $type: 18
8
+ matches: true
9
+
10
+ - name: small integer - does not match
11
+ document:
12
+ pi: 3
13
+ query:
14
+ pi:
15
+ $type: 18
16
+ matches: false
17
+
18
+ - name: big integer - matches
19
+ document:
20
+ # Exactly 2**32
21
+ pi: 4294967296
22
+ query:
23
+ pi:
24
+ $type: 18
25
+ matches: true
26
+
27
+ - name: existing field - does not match long
28
+ document:
29
+ name: "foo"
30
+ query:
31
+ name:
32
+ $type: 18
33
+ matches: false
@@ -0,0 +1,17 @@
1
+ - name: existing field - matches MaxKey
2
+ document:
3
+ pi: !ruby/object:BSON::MaxKey
4
+ # dummy field so MaxKey gets constructed
5
+ test: 42
6
+ query:
7
+ pi:
8
+ $type: 127
9
+ matches: true
10
+
11
+ - name: existing field - does not match MaxKey
12
+ document:
13
+ pi: 3
14
+ query:
15
+ pi:
16
+ $type: 127
17
+ matches: false
@@ -0,0 +1,17 @@
1
+ - name: existing field - matches MinKey
2
+ document:
3
+ pi: !ruby/object:BSON::MinKey
4
+ # dummy field so MinKey gets constructed
5
+ test: 42
6
+ query:
7
+ pi:
8
+ $type: -1
9
+ matches: true
10
+
11
+ - name: existing field - does not match MinKey
12
+ document:
13
+ pi: 3
14
+ query:
15
+ pi:
16
+ $type: -1
17
+ matches: false
@@ -0,0 +1,23 @@
1
+ - name: existing field - matches
2
+ document:
3
+ name:
4
+ query:
5
+ name:
6
+ $type: 10
7
+ matches: true
8
+
9
+ - name: missing field - does not match
10
+ document:
11
+ x:
12
+ query:
13
+ name:
14
+ $type: 10
15
+ matches: false
16
+
17
+ - name: existing field - does not match
18
+ document:
19
+ pi: 3
20
+ query:
21
+ pi:
22
+ $type: 10
23
+ matches: false
@@ -0,0 +1,23 @@
1
+ - name: hash value - matches
2
+ document:
3
+ name: {first_name: "bob"}
4
+ query:
5
+ name:
6
+ $type: 3
7
+ matches: true
8
+
9
+ - name: array value - does not match
10
+ document:
11
+ name: [1]
12
+ query:
13
+ name:
14
+ $type: 3
15
+ matches: false
16
+
17
+ - name: existing field - does not match Object
18
+ document:
19
+ pi: 3
20
+ query:
21
+ pi:
22
+ $type: 3
23
+ matches: false
@@ -0,0 +1,25 @@
1
+ - name: existing field - matches ObjectId
2
+ document:
3
+ new_id: !ruby/object:BSON::ObjectId
4
+ raw_data: !binary |-
5
+ Xt0Zj+G4MlyV5hyJ
6
+ query:
7
+ new_id:
8
+ $type: 7
9
+ matches: true
10
+
11
+ - name: integer - does not match
12
+ document:
13
+ pi: 3
14
+ query:
15
+ pi:
16
+ $type: 7
17
+ matches: false
18
+
19
+ - name: string - does not match
20
+ document:
21
+ pi: hello
22
+ query:
23
+ pi:
24
+ $type: 7
25
+ matches: false
@@ -0,0 +1,44 @@
1
+ - name: bson regexp in untyped field - matches
2
+ document:
3
+ name: !ruby/object:BSON::Regexp::Raw
4
+ pattern: /test/
5
+ options: ''
6
+ query:
7
+ name:
8
+ $type: 11
9
+ matches: true
10
+
11
+ - name: ruby regexp in untyped field - matches
12
+ document:
13
+ name: /test/
14
+ query:
15
+ name:
16
+ $type: 11
17
+ # Regexp is serialized as a string
18
+ matches: false
19
+
20
+ - name: ruby regexp field - matches
21
+ document:
22
+ regexp_field: /test/
23
+ query:
24
+ regexp_field:
25
+ $type: 11
26
+ matches: true
27
+
28
+ - name: bson regexp field - matches
29
+ document:
30
+ bson_regexp_field: !ruby/object:BSON::Regexp::Raw
31
+ pattern: /test/
32
+ options: ''
33
+ query:
34
+ bson_regexp_field:
35
+ $type: 11
36
+ matches: true
37
+
38
+ - name: existing field - does not match regex
39
+ document:
40
+ pi: 3
41
+ query:
42
+ pi:
43
+ $type: 11
44
+ matches: false