mongoid 7.5.4 → 8.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (298) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/Rakefile +0 -25
  5. data/lib/config/locales/en.yml +46 -30
  6. data/lib/mongoid/association/accessors.rb +32 -3
  7. data/lib/mongoid/association/bindable.rb +48 -0
  8. data/lib/mongoid/association/builders.rb +4 -2
  9. data/lib/mongoid/association/eager_loadable.rb +29 -7
  10. data/lib/mongoid/association/embedded/batchable.rb +28 -5
  11. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  12. data/lib/mongoid/association/embedded/embedded_in.rb +2 -1
  13. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  14. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  15. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +40 -18
  16. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  17. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +21 -2
  18. data/lib/mongoid/association/macros.rb +2 -1
  19. data/lib/mongoid/association/many.rb +5 -0
  20. data/lib/mongoid/association/nested/many.rb +2 -1
  21. data/lib/mongoid/association/proxy.rb +12 -0
  22. data/lib/mongoid/association/referenced/auto_save.rb +3 -2
  23. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  24. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  25. data/lib/mongoid/association/referenced/belongs_to.rb +1 -1
  26. data/lib/mongoid/association/referenced/counter_cache.rb +8 -8
  27. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +64 -11
  28. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +4 -1
  29. data/lib/mongoid/association/referenced/has_many/enumerable.rb +10 -18
  30. data/lib/mongoid/association/referenced/has_many/proxy.rb +12 -9
  31. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  32. data/lib/mongoid/association/referenced/has_one/proxy.rb +8 -11
  33. data/lib/mongoid/association/referenced/syncable.rb +2 -2
  34. data/lib/mongoid/association/relatable.rb +38 -4
  35. data/lib/mongoid/attributes/processing.rb +9 -2
  36. data/lib/mongoid/attributes.rb +30 -27
  37. data/lib/mongoid/cacheable.rb +2 -2
  38. data/lib/mongoid/changeable.rb +37 -2
  39. data/lib/mongoid/clients/options.rb +4 -0
  40. data/lib/mongoid/clients/sessions.rb +2 -14
  41. data/lib/mongoid/config.rb +15 -11
  42. data/lib/mongoid/contextual/aggregable/memory.rb +23 -15
  43. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  44. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  45. data/lib/mongoid/contextual/memory.rb +55 -28
  46. data/lib/mongoid/contextual/mongo.rb +173 -262
  47. data/lib/mongoid/contextual/none.rb +33 -15
  48. data/lib/mongoid/copyable.rb +32 -8
  49. data/lib/mongoid/criteria/includable.rb +24 -20
  50. data/lib/mongoid/criteria/marshalable.rb +10 -2
  51. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -15
  52. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  53. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
  54. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  55. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  56. data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -16
  57. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  58. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  59. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  60. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +1 -1
  61. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
  62. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  63. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  64. data/lib/mongoid/criteria/queryable/optional.rb +3 -9
  65. data/lib/mongoid/criteria/queryable/options.rb +1 -1
  66. data/lib/mongoid/criteria/queryable/selectable.rb +2 -24
  67. data/lib/mongoid/criteria/queryable/selector.rb +90 -5
  68. data/lib/mongoid/criteria/queryable/smash.rb +39 -6
  69. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  70. data/lib/mongoid/criteria/queryable.rb +11 -6
  71. data/lib/mongoid/criteria.rb +1 -28
  72. data/lib/mongoid/deprecable.rb +36 -0
  73. data/lib/mongoid/deprecation.rb +25 -0
  74. data/lib/mongoid/document.rb +88 -33
  75. data/lib/mongoid/equality.rb +4 -4
  76. data/lib/mongoid/errors/document_not_found.rb +6 -2
  77. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  78. data/lib/mongoid/errors/invalid_field.rb +5 -1
  79. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  80. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  81. data/lib/mongoid/errors.rb +2 -2
  82. data/lib/mongoid/extensions/array.rb +8 -6
  83. data/lib/mongoid/extensions/big_decimal.rb +29 -10
  84. data/lib/mongoid/extensions/binary.rb +42 -0
  85. data/lib/mongoid/extensions/boolean.rb +8 -2
  86. data/lib/mongoid/extensions/date.rb +26 -20
  87. data/lib/mongoid/extensions/date_time.rb +1 -1
  88. data/lib/mongoid/extensions/float.rb +4 -5
  89. data/lib/mongoid/extensions/hash.rb +12 -5
  90. data/lib/mongoid/extensions/integer.rb +4 -5
  91. data/lib/mongoid/extensions/object.rb +2 -0
  92. data/lib/mongoid/extensions/range.rb +41 -10
  93. data/lib/mongoid/extensions/regexp.rb +11 -4
  94. data/lib/mongoid/extensions/set.rb +11 -4
  95. data/lib/mongoid/extensions/string.rb +2 -13
  96. data/lib/mongoid/extensions/symbol.rb +3 -14
  97. data/lib/mongoid/extensions/time.rb +27 -16
  98. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  99. data/lib/mongoid/extensions.rb +1 -0
  100. data/lib/mongoid/factory.rb +42 -7
  101. data/lib/mongoid/fields/foreign_key.rb +7 -0
  102. data/lib/mongoid/fields/validators/macro.rb +3 -9
  103. data/lib/mongoid/fields.rb +49 -7
  104. data/lib/mongoid/findable.rb +21 -16
  105. data/lib/mongoid/indexable/specification.rb +1 -1
  106. data/lib/mongoid/indexable/validators/options.rb +4 -1
  107. data/lib/mongoid/interceptable.rb +69 -9
  108. data/lib/mongoid/persistable/creatable.rb +14 -5
  109. data/lib/mongoid/persistable/updatable.rb +12 -5
  110. data/lib/mongoid/persistence_context.rb +8 -42
  111. data/lib/mongoid/query_cache.rb +6 -258
  112. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  113. data/lib/mongoid/reloadable.rb +7 -3
  114. data/lib/mongoid/scopable.rb +9 -11
  115. data/lib/mongoid/selectable.rb +1 -2
  116. data/lib/mongoid/shardable.rb +11 -35
  117. data/lib/mongoid/stateful.rb +27 -1
  118. data/lib/mongoid/timestamps/created.rb +1 -1
  119. data/lib/mongoid/timestamps/updated.rb +1 -1
  120. data/lib/mongoid/touchable.rb +2 -3
  121. data/lib/mongoid/traversable.rb +1 -0
  122. data/lib/mongoid/validatable/uniqueness.rb +2 -1
  123. data/lib/mongoid/version.rb +1 -1
  124. data/lib/mongoid/warnings.rb +3 -4
  125. data/lib/mongoid.rb +1 -0
  126. data/spec/config/mongoid.yml +16 -0
  127. data/spec/integration/app_spec.rb +8 -12
  128. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  129. data/spec/integration/associations/embedded_spec.rb +15 -0
  130. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  131. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  132. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  133. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  134. data/spec/integration/associations/has_one_spec.rb +97 -1
  135. data/spec/integration/associations/scope_option_spec.rb +1 -1
  136. data/spec/integration/callbacks_models.rb +95 -1
  137. data/spec/integration/callbacks_spec.rb +226 -4
  138. data/spec/integration/criteria/range_spec.rb +95 -1
  139. data/spec/integration/discriminator_key_spec.rb +115 -76
  140. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  141. data/spec/integration/i18n_fallbacks_spec.rb +1 -15
  142. data/spec/integration/matcher_examples_spec.rb +20 -13
  143. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  144. data/spec/integration/matcher_operator_spec.rb +3 -5
  145. data/spec/integration/persistence/range_field_spec.rb +350 -0
  146. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  147. data/spec/mongoid/association/depending_spec.rb +9 -9
  148. data/spec/mongoid/association/eager_spec.rb +2 -1
  149. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  150. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  151. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  152. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  153. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +198 -8
  154. data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
  155. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  156. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  157. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  158. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  159. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  160. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  161. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  162. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  163. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  164. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  165. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +38 -5
  166. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  167. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  168. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  169. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  170. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +62 -13
  171. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  172. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  173. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  174. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  175. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  176. data/spec/mongoid/association/syncable_spec.rb +14 -0
  177. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  178. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  179. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  180. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  181. data/spec/mongoid/attributes_spec.rb +480 -27
  182. data/spec/mongoid/cacheable_spec.rb +3 -3
  183. data/spec/mongoid/changeable_spec.rb +130 -13
  184. data/spec/mongoid/clients/factory_spec.rb +23 -30
  185. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  186. data/spec/mongoid/clients_spec.rb +2 -2
  187. data/spec/mongoid/config_spec.rb +52 -14
  188. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  189. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  190. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  191. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  192. data/spec/mongoid/contextual/memory_spec.rb +521 -14
  193. data/spec/mongoid/contextual/mongo_spec.rb +566 -416
  194. data/spec/mongoid/contextual/none_spec.rb +11 -19
  195. data/spec/mongoid/copyable_spec.rb +451 -1
  196. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  197. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  198. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  199. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  200. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  201. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  202. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  203. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  204. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  205. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  206. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  207. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  208. data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
  209. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  210. data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
  211. data/spec/mongoid/criteria/queryable/selector_spec.rb +16 -77
  212. data/spec/mongoid/criteria/queryable/storable_spec.rb +0 -72
  213. data/spec/mongoid/criteria_spec.rb +469 -1201
  214. data/spec/mongoid/document_fields_spec.rb +173 -24
  215. data/spec/mongoid/document_spec.rb +32 -41
  216. data/spec/mongoid/equality_spec.rb +12 -12
  217. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  218. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  219. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  220. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  221. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  222. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  223. data/spec/mongoid/extensions/array_spec.rb +16 -2
  224. data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
  225. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  226. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  227. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  228. data/spec/mongoid/extensions/date_spec.rb +71 -1
  229. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  230. data/spec/mongoid/extensions/float_spec.rb +48 -76
  231. data/spec/mongoid/extensions/hash_spec.rb +30 -0
  232. data/spec/mongoid/extensions/integer_spec.rb +45 -66
  233. data/spec/mongoid/extensions/range_spec.rb +255 -54
  234. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  235. data/spec/mongoid/extensions/set_spec.rb +106 -0
  236. data/spec/mongoid/extensions/string_spec.rb +53 -25
  237. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  238. data/spec/mongoid/extensions/time_spec.rb +634 -66
  239. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  240. data/spec/mongoid/factory_spec.rb +61 -1
  241. data/spec/mongoid/fields_spec.rb +321 -50
  242. data/spec/mongoid/findable_spec.rb +64 -29
  243. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  244. data/spec/mongoid/indexable_spec.rb +16 -19
  245. data/spec/mongoid/interceptable_spec.rb +584 -5
  246. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  247. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  248. data/spec/mongoid/mongoizable_spec.rb +285 -0
  249. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  250. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  251. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  252. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  253. data/spec/mongoid/persistence_context_spec.rb +24 -0
  254. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  255. data/spec/mongoid/query_cache_spec.rb +0 -154
  256. data/spec/mongoid/reloadable_spec.rb +35 -2
  257. data/spec/mongoid/scopable_spec.rb +36 -34
  258. data/spec/mongoid/shardable_models.rb +0 -14
  259. data/spec/mongoid/shardable_spec.rb +61 -153
  260. data/spec/mongoid/stateful_spec.rb +28 -0
  261. data/spec/mongoid/timestamps_spec.rb +390 -0
  262. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  263. data/spec/mongoid/touchable_spec.rb +116 -0
  264. data/spec/mongoid/touchable_spec_models.rb +12 -8
  265. data/spec/mongoid/traversable_spec.rb +4 -11
  266. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  267. data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
  268. data/spec/mongoid/warnings_spec.rb +35 -0
  269. data/spec/mongoid_spec.rb +1 -7
  270. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  271. data/spec/rails/mongoid_spec.rb +4 -16
  272. data/spec/shared/lib/mrss/event_subscriber.rb +5 -15
  273. data/spec/shared/lib/mrss/lite_constraints.rb +0 -8
  274. data/spec/shared/shlib/server.sh +5 -5
  275. data/spec/support/constraints.rb +24 -0
  276. data/spec/support/macros.rb +30 -0
  277. data/spec/support/models/augmentation.rb +12 -0
  278. data/spec/support/models/band.rb +3 -0
  279. data/spec/support/models/catalog.rb +24 -0
  280. data/spec/support/models/circus.rb +3 -0
  281. data/spec/support/models/fanatic.rb +8 -0
  282. data/spec/support/models/implant.rb +9 -0
  283. data/spec/support/models/label.rb +2 -0
  284. data/spec/support/models/passport.rb +9 -0
  285. data/spec/support/models/person.rb +1 -0
  286. data/spec/support/models/player.rb +2 -0
  287. data/spec/support/models/powerup.rb +12 -0
  288. data/spec/support/models/registry.rb +1 -0
  289. data/spec/support/models/school.rb +14 -0
  290. data/spec/support/models/shield.rb +18 -0
  291. data/spec/support/models/student.rb +14 -0
  292. data/spec/support/models/weapon.rb +12 -0
  293. data.tar.gz.sig +0 -0
  294. metadata +689 -657
  295. metadata.gz.sig +0 -0
  296. data/lib/mongoid/errors/eager_load.rb +0 -23
  297. data/lib/mongoid/errors/invalid_value.rb +0 -17
  298. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -142,107 +142,6 @@ describe Mongoid::Criteria::Queryable::Optional do
142
142
  it_behaves_like "a cloning option"
143
143
  end
144
144
  end
145
-
146
- context "when using the mongo-1.x driver syntax" do
147
-
148
- let(:query) do
149
- Mongoid::Query.new({}, {}, :mongo1x)
150
- end
151
-
152
- context "when provided symbols" do
153
-
154
- let(:selection) do
155
- query.send(method, :field_one, :field_two)
156
- end
157
-
158
- it "adds the sorting criteria" do
159
- expect(selection.options).to eq(
160
- { sort: [[ :field_one, 1 ], [ :field_two, 1 ]]}
161
- )
162
- end
163
-
164
- it_behaves_like "a cloning option"
165
- end
166
-
167
- context "when provided an array of symbols" do
168
-
169
- let(:selection) do
170
- query.send(method, [ :field_one, :field_two ])
171
- end
172
-
173
- it "adds the sorting criteria" do
174
- expect(selection.options).to eq(
175
- { sort: [[ :field_one, 1 ], [ :field_two, 1 ]]}
176
- )
177
- end
178
-
179
- it_behaves_like "a cloning option"
180
- end
181
-
182
- context "when provided strings" do
183
-
184
- let(:selection) do
185
- query.send(method, "field_one", "field_two")
186
- end
187
-
188
- it "adds the sorting criteria" do
189
- expect(selection.options).to eq(
190
- { sort: [[ "field_one", 1 ], [ "field_two", 1 ]]}
191
- )
192
- end
193
-
194
- it_behaves_like "a cloning option"
195
- end
196
-
197
- context "when provided an array of strings" do
198
-
199
- let(:selection) do
200
- query.send(method, [ "field_one", "field_two" ])
201
- end
202
-
203
- it "adds the sorting criteria" do
204
- expect(selection.options).to eq(
205
- { sort: [[ "field_one", 1 ], [ "field_two", 1 ]]}
206
- )
207
- end
208
-
209
- it_behaves_like "a cloning option"
210
- end
211
-
212
- context "when provided no options" do
213
-
214
- let(:selection) do
215
- query.send(method)
216
- end
217
-
218
- it "does not add any sorting criteria" do
219
- expect(selection.options).to be_empty
220
- end
221
-
222
- it "returns the query" do
223
- expect(selection).to eq(query)
224
- end
225
-
226
- it_behaves_like "a cloning option"
227
- end
228
-
229
- context "when provided nil" do
230
-
231
- let(:selection) do
232
- query.send(method, nil)
233
- end
234
-
235
- it "does not add any sorting criteria" do
236
- expect(selection.options).to be_empty
237
- end
238
-
239
- it "returns the query" do
240
- expect(selection).to eq(query)
241
- end
242
-
243
- it_behaves_like "a cloning option"
244
- end
245
- end
246
145
  end
247
146
  end
248
147
 
@@ -415,107 +314,6 @@ describe Mongoid::Criteria::Queryable::Optional do
415
314
  it_behaves_like "a cloning option"
416
315
  end
417
316
  end
418
-
419
- context "when using the mongo-1.x driver syntax" do
420
-
421
- let(:query) do
422
- Mongoid::Query.new({}, {}, :mongo1x)
423
- end
424
-
425
- context "when provided symbols" do
426
-
427
- let(:selection) do
428
- query.send(method, :field_one, :field_two)
429
- end
430
-
431
- it "adds the sorting criteria" do
432
- expect(selection.options).to eq(
433
- { sort: [[ :field_one, -1 ], [ :field_two, -1 ]]}
434
- )
435
- end
436
-
437
- it_behaves_like "a cloning option"
438
- end
439
-
440
- context "when provided an array of symbols" do
441
-
442
- let(:selection) do
443
- query.send(method, [ :field_one, :field_two ])
444
- end
445
-
446
- it "adds the sorting criteria" do
447
- expect(selection.options).to eq(
448
- { sort: [[ :field_one, -1 ], [ :field_two, -1 ]]}
449
- )
450
- end
451
-
452
- it_behaves_like "a cloning option"
453
- end
454
-
455
- context "when provided strings" do
456
-
457
- let(:selection) do
458
- query.send(method, "field_one", "field_two")
459
- end
460
-
461
- it "adds the sorting criteria" do
462
- expect(selection.options).to eq(
463
- { sort: [[ "field_one", -1 ], [ "field_two", -1 ]]}
464
- )
465
- end
466
-
467
- it_behaves_like "a cloning option"
468
- end
469
-
470
- context "when provided an array of strings" do
471
-
472
- let(:selection) do
473
- query.send(method, [ "field_one", "field_two" ])
474
- end
475
-
476
- it "adds the sorting criteria" do
477
- expect(selection.options).to eq(
478
- { sort: [[ "field_one", -1 ], [ "field_two", -1 ]]}
479
- )
480
- end
481
-
482
- it_behaves_like "a cloning option"
483
- end
484
-
485
- context "when provided no options" do
486
-
487
- let(:selection) do
488
- query.send(method)
489
- end
490
-
491
- it "does not add any sorting criteria" do
492
- expect(selection.options).to be_empty
493
- end
494
-
495
- it "returns the query" do
496
- expect(selection).to eq(query)
497
- end
498
-
499
- it_behaves_like "a cloning option"
500
- end
501
-
502
- context "when provided nil" do
503
-
504
- let(:selection) do
505
- query.send(method, nil)
506
- end
507
-
508
- it "does not add any sorting criteria" do
509
- expect(selection.options).to be_empty
510
- end
511
-
512
- it "returns the query" do
513
- expect(selection).to eq(query)
514
- end
515
-
516
- it_behaves_like "a cloning option"
517
- end
518
- end
519
317
  end
520
318
  end
521
319
 
@@ -1172,288 +970,6 @@ describe Mongoid::Criteria::Queryable::Optional do
1172
970
  it_behaves_like "a cloning option"
1173
971
  end
1174
972
  end
1175
-
1176
- context "when using the mongo-1.x driver syntax" do
1177
-
1178
- let(:query) do
1179
- Mongoid::Query.new({}, {}, :mongo1x)
1180
- end
1181
-
1182
- context "when provided a hash" do
1183
-
1184
- context "when the hash has integer values" do
1185
-
1186
- let(:selection) do
1187
- query.send("#{method}", field_one: 1, field_two: -1)
1188
- end
1189
-
1190
- it "adds the sorting criteria" do
1191
- expect(selection.options).to eq(
1192
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1193
- )
1194
- end
1195
-
1196
- it_behaves_like "a cloning option"
1197
- end
1198
-
1199
- context "when the hash has symbol values" do
1200
-
1201
- let(:selection) do
1202
- query.send("#{method}", field_one: :asc, field_two: :desc)
1203
- end
1204
-
1205
- it "adds the sorting criteria" do
1206
- expect(selection.options).to eq(
1207
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1208
- )
1209
- end
1210
-
1211
- it_behaves_like "a cloning option"
1212
- end
1213
-
1214
- context "when the hash has string values" do
1215
-
1216
- let(:selection) do
1217
- query.send("#{method}", field_one: "asc", field_two: "desc")
1218
- end
1219
-
1220
- it "adds the sorting criteria" do
1221
- expect(selection.options).to eq(
1222
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1223
- )
1224
- end
1225
-
1226
- it_behaves_like "a cloning option"
1227
- end
1228
- end
1229
-
1230
- context "when provided an array" do
1231
-
1232
- context "when the array is multi-dimensional" do
1233
-
1234
- context "when the arrays have integer values" do
1235
-
1236
- let(:selection) do
1237
- query.send("#{method}", [[ :field_one, 1 ],[ :field_two, -1 ]])
1238
- end
1239
-
1240
- it "adds the sorting criteria" do
1241
- expect(selection.options).to eq(
1242
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1243
- )
1244
- end
1245
-
1246
- it_behaves_like "a cloning option"
1247
- end
1248
-
1249
- context "when the arrays have symbol values" do
1250
-
1251
- let(:selection) do
1252
- query.send("#{method}", [[ :field_one, :asc ],[ :field_two, :desc ]])
1253
- end
1254
-
1255
- it "adds the sorting criteria" do
1256
- expect(selection.options).to eq(
1257
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1258
- )
1259
- end
1260
-
1261
- it_behaves_like "a cloning option"
1262
- end
1263
-
1264
- context "when the arrays have string values" do
1265
-
1266
- let(:selection) do
1267
- query.send("#{method}", [[ :field_one, "asc" ],[ :field_two, "desc" ]])
1268
- end
1269
-
1270
- it "adds the sorting criteria" do
1271
- expect(selection.options).to eq(
1272
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1273
- )
1274
- end
1275
-
1276
- it_behaves_like "a cloning option"
1277
- end
1278
- end
1279
-
1280
- context "when the array is selectable keys" do
1281
-
1282
- let(:selection) do
1283
- query.send("#{method}", [ :field_one.asc, :field_two.desc ])
1284
- end
1285
-
1286
- it "adds the sorting criteria" do
1287
- expect(selection.options).to eq(
1288
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1289
- )
1290
- end
1291
-
1292
- it_behaves_like "a cloning option"
1293
- end
1294
- end
1295
-
1296
- context "when provided values" do
1297
-
1298
- context "when the values are arrays" do
1299
-
1300
- context "when the values have integer directions" do
1301
-
1302
- let(:selection) do
1303
- query.send("#{method}", [ :field_one, 1 ],[ :field_two, -1 ])
1304
- end
1305
-
1306
- it "adds the sorting criteria" do
1307
- expect(selection.options).to eq(
1308
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1309
- )
1310
- end
1311
-
1312
- it_behaves_like "a cloning option"
1313
- end
1314
-
1315
- context "when the values have symbol directions" do
1316
-
1317
- let(:selection) do
1318
- query.send("#{method}", [ :field_one, :asc ],[ :field_two, :desc ])
1319
- end
1320
-
1321
- it "adds the sorting criteria" do
1322
- expect(selection.options).to eq(
1323
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1324
- )
1325
- end
1326
-
1327
- it_behaves_like "a cloning option"
1328
- end
1329
-
1330
- context "when the values have string directions" do
1331
-
1332
- let(:selection) do
1333
- query.send("#{method}", [ :field_one, "asc" ],[ :field_two, "desc" ])
1334
- end
1335
-
1336
- it "adds the sorting criteria" do
1337
- expect(selection.options).to eq(
1338
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1339
- )
1340
- end
1341
-
1342
- it_behaves_like "a cloning option"
1343
- end
1344
- end
1345
-
1346
- context "when the values are selectable keys" do
1347
-
1348
- let(:selection) do
1349
- query.send("#{method}", :field_one.asc, :field_two.desc)
1350
- end
1351
-
1352
- it "adds the sorting criteria" do
1353
- expect(selection.options).to eq(
1354
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1355
- )
1356
- end
1357
-
1358
- it_behaves_like "a cloning option"
1359
- end
1360
- end
1361
-
1362
- context "when provided a string" do
1363
-
1364
- context "when the direction is lowercase" do
1365
-
1366
- context "when abbreviated" do
1367
-
1368
- let(:selection) do
1369
- query.send("#{method}", "field_one asc, field_two desc")
1370
- end
1371
-
1372
- it "adds the sorting criteria" do
1373
- expect(selection.options).to eq(
1374
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1375
- )
1376
- end
1377
-
1378
- it_behaves_like "a cloning option"
1379
- end
1380
-
1381
- context "when spelled out" do
1382
-
1383
- let(:selection) do
1384
- query.send("#{method}", "field_one ascending, field_two descending")
1385
- end
1386
-
1387
- it "adds the sorting criteria" do
1388
- expect(selection.options).to eq(
1389
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1390
- )
1391
- end
1392
-
1393
- it_behaves_like "a cloning option"
1394
- end
1395
- end
1396
-
1397
- context "when the direction is uppercase" do
1398
-
1399
- context "when abbreviated" do
1400
-
1401
- let(:selection) do
1402
- query.send("#{method}", "field_one ASC, field_two DESC")
1403
- end
1404
-
1405
- it "adds the sorting criteria" do
1406
- expect(selection.options).to eq(
1407
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1408
- )
1409
- end
1410
-
1411
- it_behaves_like "a cloning option"
1412
- end
1413
-
1414
- context "when spelled out" do
1415
-
1416
- let(:selection) do
1417
- query.send("#{method}", "field_one ASCENDING, field_two DESCENDING")
1418
- end
1419
-
1420
- it "adds the sorting criteria" do
1421
- expect(selection.options).to eq(
1422
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1423
- )
1424
- end
1425
-
1426
- it_behaves_like "a cloning option"
1427
- end
1428
- end
1429
- end
1430
-
1431
- context "when provided no options" do
1432
-
1433
- let(:selection) do
1434
- query.order_by
1435
- end
1436
-
1437
- it "returns the query" do
1438
- expect(selection).to eq(query)
1439
- end
1440
-
1441
- it_behaves_like "a cloning option"
1442
- end
1443
-
1444
- context "when provided nil" do
1445
-
1446
- let(:selection) do
1447
- query.send("#{method}", nil)
1448
- end
1449
-
1450
- it "returns the query" do
1451
- expect(selection).to eq(query)
1452
- end
1453
-
1454
- it_behaves_like "a cloning option"
1455
- end
1456
- end
1457
973
  end
1458
974
  end
1459
975
 
@@ -1344,6 +1344,34 @@ describe Mongoid::Criteria::Queryable::Selectable do
1344
1344
  )
1345
1345
  end
1346
1346
  end
1347
+
1348
+ context 'when any_of has multiple arguments' do
1349
+
1350
+ let(:selection) do
1351
+ query.or(field: [ 1, 2 ]).where(foo: 'bar').any_of({a: 1}, {b: 2})
1352
+ end
1353
+
1354
+ it 'adds the new condition to top level' do
1355
+ expect(selection.selector).to eq(
1356
+ '$or' => [{'field' => [1, 2]}],
1357
+ 'foo' => 'bar',
1358
+ '$and' => [{'$or' => [{'a' => 1}, {'b' => 2}]}],
1359
+ )
1360
+ end
1361
+
1362
+ context 'when query already has a top-level $and' do
1363
+ let(:selection) do
1364
+ query.or(field: [ 1, 2 ]).where('$and' => [foo: 'bar']).any_of({a: 1}, {b: 2})
1365
+ end
1366
+
1367
+ it 'adds the new condition to top level $and' do
1368
+ expect(selection.selector).to eq(
1369
+ '$or' => [{'field' => [1, 2]}],
1370
+ '$and' => [{'foo' => 'bar'}, {'$or' => [{'a' => 1}, {'b' => 2}]}],
1371
+ )
1372
+ end
1373
+ end
1374
+ end
1347
1375
  end
1348
1376
 
1349
1377
  context "when provided multiple criteria" do
@@ -2065,5 +2093,27 @@ describe Mongoid::Criteria::Queryable::Selectable do
2065
2093
  end
2066
2094
  end
2067
2095
  end
2096
+
2097
+ # This test confirms that MONGOID-5097 has been repaired.
2098
+ context "when using exists on a field of type Time" do
2099
+ let(:criteria) do
2100
+ Dictionary.any_of({:published.exists => true}, published: nil)
2101
+ end
2102
+
2103
+ it "doesn't raise an error" do
2104
+ expect do
2105
+ criteria
2106
+ end.to_not raise_error
2107
+ end
2108
+
2109
+ it "generates the correct selector" do
2110
+ expect(criteria.selector).to eq({
2111
+ "$or" => [ {
2112
+ "published" => { "$exists" => true }
2113
+ }, {
2114
+ "published" => nil
2115
+ } ] } )
2116
+ end
2117
+ end
2068
2118
  end
2069
2119
  end