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
@@ -2,5 +2,5 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  module Mongoid
5
- VERSION = "7.2.3"
5
+ VERSION = "7.3.0"
6
6
  end
@@ -21,4 +21,48 @@ describe 'embeds_many associations' do
21
21
  end
22
22
  end
23
23
  end
24
+
25
+ context 'clearing association when parent is not saved' do
26
+ let!(:parent) { Canvas.create!(shapes: [Shape.new]) }
27
+
28
+ let(:unsaved_parent) { Canvas.new(id: parent.id, shapes: [Shape.new]) }
29
+
30
+ context "using #clear" do
31
+ it 'deletes the target from the database' do
32
+ unsaved_parent.shapes.clear
33
+
34
+ unsaved_parent.shapes.should be_empty
35
+
36
+ unsaved_parent.new_record?.should be true
37
+ parent.reload
38
+ parent.shapes.should be_empty
39
+ end
40
+ end
41
+
42
+ shared_examples 'does not delete the target from the database' do
43
+ it 'does not delete the target from the database' do
44
+ unsaved_parent.shapes.should be_empty
45
+
46
+ unsaved_parent.new_record?.should be true
47
+ parent.reload
48
+ parent.shapes.length.should == 1
49
+ end
50
+ end
51
+
52
+ context "using #delete_all" do
53
+ before do
54
+ unsaved_parent.shapes.delete_all
55
+ end
56
+
57
+ include_examples 'does not delete the target from the database'
58
+ end
59
+
60
+ context "using #destroy_all" do
61
+ before do
62
+ unsaved_parent.shapes.destroy_all
63
+ end
64
+
65
+ include_examples 'does not delete the target from the database'
66
+ end
67
+ end
24
68
  end
@@ -67,6 +67,54 @@ describe 'has_one associations' do
67
67
  end
68
68
  end
69
69
 
70
+ context 'when calling methods on target' do
71
+ let(:parent) do
72
+ HomCollege.create!.tap do |college|
73
+ HomAccreditation.create!(college: college)
74
+ end
75
+ end
76
+
77
+ shared_examples 'delegates to the field' do |reloaded: false|
78
+ context 'non-conflicting field name' do
79
+ it 'delegates to the field' do
80
+ parent.accreditation.price.should == 42
81
+ end
82
+
83
+ context 'using send' do
84
+ it 'delegates to the field' do
85
+ parent.accreditation.send(:price).should == 42
86
+ end
87
+ end
88
+ end
89
+
90
+ context 'field name that conflicts with Kernel' do
91
+ it 'delegates to the field' do
92
+ parent.accreditation.format.should == 'fmt'
93
+ end
94
+
95
+ context 'using send' do
96
+ it 'delegates to the field' do
97
+ if reloaded
98
+ pending 'MONGOID-4018'
99
+ end
100
+
101
+ parent.accreditation.send(:format).should == 'fmt'
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ include_examples 'delegates to the field'
108
+
109
+ context 'after reloading parent' do
110
+ before do
111
+ parent.reload
112
+ end
113
+
114
+ include_examples 'delegates to the field', reloaded: true
115
+ end
116
+ end
117
+
70
118
  context 'when child does not have parent association' do
71
119
  context 'Child.new' do
72
120
  it 'creates a child instance' do
@@ -12,7 +12,7 @@ describe 'Queries on Date fields' do
12
12
 
13
13
  shared_examples 'converts to beginning of day in UTC' do
14
14
  it 'converts to beginning of day in UTC' do
15
- selector['founded'].should == arg.dup.beginning_of_day.utc.beginning_of_day
15
+ selector['founded'].should == Time.utc(arg.year, arg.month, arg.day)
16
16
  end
17
17
  end
18
18
 
@@ -20,6 +20,15 @@ describe Mongoid::Document do
20
20
  end
21
21
  end
22
22
 
23
+ context 'when id is unaliased' do
24
+ it 'persists separate id and _id values' do
25
+ shirt = Shirt.create!(id: 'hello', _id: 'foo')
26
+ shirt = Shirt.find(shirt._id)
27
+ shirt.id.should == 'hello'
28
+ shirt._id.should == 'foo'
29
+ end
30
+ end
31
+
23
32
  describe '#reload' do
24
33
  context 'when changing shard key value' do
25
34
  require_topology :sharded
@@ -0,0 +1,159 @@
1
+ - name: existing field - matches with int
2
+ document:
3
+ a: 20
4
+ binaryValueofA: "00010100"
5
+ query:
6
+ a:
7
+ $bitsAllClear: 35
8
+ matches: true
9
+ min_server_version: 3.2
10
+
11
+ - name: existing field - does not match with int
12
+ document:
13
+ a: 20
14
+ binaryValueofA: "00010100"
15
+ query:
16
+ a:
17
+ $bitsAllClear: 24
18
+ matches: false
19
+ min_server_version: 3.2
20
+
21
+ - name: existing field - matches with binData
22
+ document:
23
+ a: 20
24
+ binaryValueofA: "00010100"
25
+ query:
26
+ a:
27
+ $bitsAllClear: !ruby/object:BSON::Binary
28
+ data: !binary |-
29
+ IW==
30
+ type: :generic
31
+ matches: true
32
+ min_server_version: 3.2
33
+
34
+ - name: existing field - does not match with binData
35
+ document:
36
+ a: 21
37
+ binaryValueofA: "00010101"
38
+ query:
39
+ a:
40
+ $bitsAllClear: !ruby/object:BSON::Binary
41
+ data: !binary |-
42
+ IW==
43
+ type: :generic
44
+ matches: false
45
+ min_server_version: 3.2
46
+
47
+ - name: existing binData field matches
48
+ document:
49
+ a: !ruby/object:BSON::Binary
50
+ data: !binary |-
51
+ IW==
52
+ type: :generic
53
+ query:
54
+ a:
55
+ $bitsAllClear: 20
56
+ matches: true
57
+ min_server_version: 3.2
58
+
59
+ - name: existing binData field does not match
60
+ document:
61
+ a: !ruby/object:BSON::Binary
62
+ data: !binary |-
63
+ IW==
64
+ type: :generic
65
+ query:
66
+ a:
67
+ $bitsAllClear: 15
68
+ matches: false
69
+ min_server_version: 3.2
70
+
71
+ - name: existing field - matches with array
72
+ document:
73
+ a: 20
74
+ binaryValueofA: "00010100"
75
+ query:
76
+ a:
77
+ $bitsAllClear: [0, 3]
78
+ matches: true
79
+ min_server_version: 3.2
80
+
81
+ - name: existing field - does not match with array
82
+ document:
83
+ a: 20
84
+ binaryValueofA: "00010100"
85
+ query:
86
+ a:
87
+ $bitsAllClear: [0, 2]
88
+ matches: false
89
+ min_server_version: 3.2
90
+
91
+ - name: float condition representable as an integer
92
+ document:
93
+ a: 20
94
+ binaryValueofA: "00010100"
95
+ query:
96
+ a:
97
+ $bitsAllClear: 35.0
98
+ matches: true
99
+ min_server_version: 3.2
100
+
101
+ - name: float condition not representable as an integer
102
+ document:
103
+ a: 20
104
+ binaryValueofA: "00010100"
105
+ query:
106
+ a:
107
+ $bitsAllClear: 35.1
108
+ error: true
109
+ min_server_version: 3.2
110
+
111
+ - name: string condition
112
+ document:
113
+ a: 54
114
+ binaryValueofA: "00110110"
115
+ query:
116
+ a:
117
+ $bitsAllClear: hello
118
+ error: true
119
+ min_server_version: 3.2
120
+
121
+ - name: empty array condition
122
+ document:
123
+ a: 20
124
+ binaryValueofA: "00010100"
125
+ query:
126
+ a:
127
+ $bitsAllClear: []
128
+ matches: true
129
+ min_server_version: 3.2
130
+
131
+ - name: integer 0 condition
132
+ document:
133
+ a: 20
134
+ binaryValueofA: "00010100"
135
+ query:
136
+ a:
137
+ $bitsAllClear: 0
138
+ matches: true
139
+ min_server_version: 3.2
140
+
141
+ - name: negative integer condition
142
+ document:
143
+ a: 54
144
+ binaryValueofA: "00110110"
145
+ query:
146
+ a:
147
+ $bitsAllClear: -1
148
+ error: true
149
+ min_server_version: 3.2
150
+
151
+ - name: negative float condition
152
+ document:
153
+ a: 54
154
+ binaryValueofA: "00110110"
155
+ query:
156
+ a:
157
+ $bitsAllClear: -1.0
158
+ error: true
159
+ min_server_version: 3.2
@@ -0,0 +1,159 @@
1
+ - name: existing field - matches with int
2
+ document:
3
+ a: 54
4
+ binaryValueofA: "00110110"
5
+ query:
6
+ a:
7
+ $bitsAllSet: 50
8
+ matches: true
9
+ min_server_version: 3.2
10
+
11
+ - name: existing field - does not match with int
12
+ document:
13
+ a: 52
14
+ binaryValueofA: "00110100"
15
+ query:
16
+ a:
17
+ $bitsAllSet: 50
18
+ matches: false
19
+ min_server_version: 3.2
20
+
21
+ - name: existing field - matches with binData
22
+ document:
23
+ a: 54
24
+ binaryValueofA: "00110110"
25
+ query:
26
+ a:
27
+ $bitsAllSet: !ruby/object:BSON::Binary
28
+ data: !binary |-
29
+ Ng==
30
+ type: :generic
31
+ matches: true
32
+ min_server_version: 3.2
33
+
34
+ - name: existing field - does not match with binData
35
+ document:
36
+ a: 21
37
+ binaryValueofA: "00010101"
38
+ query:
39
+ a:
40
+ $bitsAllSet: !ruby/object:BSON::Binary
41
+ data: !binary |-
42
+ MC==
43
+ type: :generic
44
+ matches: false
45
+ min_server_version: 3.2
46
+
47
+ - name: existing binData field matches
48
+ document:
49
+ a: !ruby/object:BSON::Binary
50
+ data: !binary |-
51
+ Ng==
52
+ type: :generic
53
+ query:
54
+ a:
55
+ $bitsAllSet: 48
56
+ matches: true
57
+ min_server_version: 3.2
58
+
59
+ - name: existing binData field does not match
60
+ document:
61
+ a: !ruby/object:BSON::Binary
62
+ data: !binary |-
63
+ MC==
64
+ type: :generic
65
+ query:
66
+ a:
67
+ $bitsAllSet: 54
68
+ matches: false
69
+ min_server_version: 3.2
70
+
71
+ - name: existing field - matches with array
72
+ document:
73
+ a: 20
74
+ binaryValueofA: "00010100"
75
+ query:
76
+ a:
77
+ $bitsAllSet: [2, 4]
78
+ matches: true
79
+ min_server_version: 3.2
80
+
81
+ - name: existing field - does not match with array
82
+ document:
83
+ a: 20
84
+ binaryValueofA: "00010100"
85
+ query:
86
+ a:
87
+ $bitsAllSet: [0, 3]
88
+ matches: false
89
+ min_server_version: 3.2
90
+
91
+ - name: float condition representable as an integer
92
+ document:
93
+ a: 54
94
+ binaryValueofA: "00110110"
95
+ query:
96
+ a:
97
+ $bitsAllSet: 50.0
98
+ matches: true
99
+ min_server_version: 3.2
100
+
101
+ - name: float condition not representable as an integer
102
+ document:
103
+ a: 54
104
+ binaryValueofA: "00110110"
105
+ query:
106
+ a:
107
+ $bitsAllSet: 50.1
108
+ error: true
109
+ min_server_version: 3.2
110
+
111
+ - name: string condition
112
+ document:
113
+ a: 54
114
+ binaryValueofA: "00110110"
115
+ query:
116
+ a:
117
+ $bitsAllSet: hello
118
+ error: true
119
+ min_server_version: 3.2
120
+
121
+ - name: empty array condition
122
+ document:
123
+ a: 54
124
+ binaryValueofA: "00110110"
125
+ query:
126
+ a:
127
+ $bitsAllSet: []
128
+ matches: true
129
+ min_server_version: 3.2
130
+
131
+ - name: integer 0 condition
132
+ document:
133
+ a: 54
134
+ binaryValueofA: "00110110"
135
+ query:
136
+ a:
137
+ $bitsAllSet: 0
138
+ matches: true
139
+ min_server_version: 3.2
140
+
141
+ - name: negative integer condition
142
+ document:
143
+ a: 54
144
+ binaryValueofA: "00110110"
145
+ query:
146
+ a:
147
+ $bitsAllSet: -1
148
+ error: true
149
+ min_server_version: 3.2
150
+
151
+ - name: negative float condition
152
+ document:
153
+ a: 54
154
+ binaryValueofA: "00110110"
155
+ query:
156
+ a:
157
+ $bitsAllSet: -1.0
158
+ error: true
159
+ min_server_version: 3.2