mongoid 7.5.0 → 8.0.2

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 (358) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/lib/config/locales/en.yml +47 -30
  5. data/lib/mongoid/association/accessors.rb +38 -9
  6. data/lib/mongoid/association/bindable.rb +50 -2
  7. data/lib/mongoid/association/builders.rb +4 -2
  8. data/lib/mongoid/association/constrainable.rb +0 -1
  9. data/lib/mongoid/association/eager_loadable.rb +29 -7
  10. data/lib/mongoid/association/embedded/batchable.rb +53 -13
  11. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  12. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  13. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -2
  14. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  15. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  16. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  17. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +50 -28
  18. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  19. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  20. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +23 -4
  21. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  22. data/lib/mongoid/association/macros.rb +2 -1
  23. data/lib/mongoid/association/many.rb +11 -7
  24. data/lib/mongoid/association/nested/many.rb +5 -4
  25. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  26. data/lib/mongoid/association/nested/one.rb +5 -5
  27. data/lib/mongoid/association/one.rb +2 -2
  28. data/lib/mongoid/association/options.rb +9 -9
  29. data/lib/mongoid/association/proxy.rb +14 -3
  30. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  31. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  32. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  33. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  34. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  35. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  36. data/lib/mongoid/association/referenced/eager.rb +2 -2
  37. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +66 -13
  38. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  39. data/lib/mongoid/association/referenced/has_many/enumerable.rb +20 -28
  40. data/lib/mongoid/association/referenced/has_many/proxy.rb +24 -18
  41. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  42. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  43. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  44. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  45. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  46. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  47. data/lib/mongoid/association/reflections.rb +2 -2
  48. data/lib/mongoid/association/relatable.rb +44 -10
  49. data/lib/mongoid/association.rb +5 -5
  50. data/lib/mongoid/atomic/modifiers.rb +2 -2
  51. data/lib/mongoid/atomic/paths/embedded/many.rb +19 -0
  52. data/lib/mongoid/attributes/dynamic.rb +3 -3
  53. data/lib/mongoid/attributes/nested.rb +5 -5
  54. data/lib/mongoid/attributes/processing.rb +10 -3
  55. data/lib/mongoid/attributes/projector.rb +1 -1
  56. data/lib/mongoid/attributes/readonly.rb +2 -2
  57. data/lib/mongoid/attributes.rb +43 -40
  58. data/lib/mongoid/changeable.rb +42 -7
  59. data/lib/mongoid/clients/options.rb +5 -1
  60. data/lib/mongoid/clients/sessions.rb +2 -14
  61. data/lib/mongoid/clients/validators/storage.rb +3 -3
  62. data/lib/mongoid/config/validators/client.rb +6 -6
  63. data/lib/mongoid/config.rb +27 -17
  64. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  65. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  66. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  67. data/lib/mongoid/contextual/atomic.rb +1 -1
  68. data/lib/mongoid/contextual/geo_near.rb +7 -7
  69. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  70. data/lib/mongoid/contextual/memory.rb +59 -32
  71. data/lib/mongoid/contextual/mongo.rb +184 -256
  72. data/lib/mongoid/contextual/none.rb +34 -16
  73. data/lib/mongoid/contextual/queryable.rb +1 -1
  74. data/lib/mongoid/contextual.rb +2 -2
  75. data/lib/mongoid/copyable.rb +32 -8
  76. data/lib/mongoid/criteria/findable.rb +7 -4
  77. data/lib/mongoid/criteria/includable.rb +24 -20
  78. data/lib/mongoid/criteria/marshalable.rb +10 -2
  79. data/lib/mongoid/criteria/permission.rb +1 -1
  80. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  81. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -15
  82. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  83. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  84. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  85. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  86. data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -16
  87. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  88. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  89. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  90. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  91. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  92. data/lib/mongoid/criteria/queryable/extensions/string.rb +3 -3
  93. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -2
  94. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  95. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  96. data/lib/mongoid/criteria/queryable/key.rb +3 -3
  97. data/lib/mongoid/criteria/queryable/optional.rb +5 -11
  98. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  99. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  100. data/lib/mongoid/criteria/queryable/selectable.rb +5 -27
  101. data/lib/mongoid/criteria/queryable/selector.rb +92 -7
  102. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  103. data/lib/mongoid/criteria/queryable.rb +12 -7
  104. data/lib/mongoid/criteria/scopable.rb +2 -2
  105. data/lib/mongoid/criteria.rb +15 -37
  106. data/lib/mongoid/deprecable.rb +36 -0
  107. data/lib/mongoid/deprecation.rb +25 -0
  108. data/lib/mongoid/document.rb +98 -36
  109. data/lib/mongoid/equality.rb +12 -12
  110. data/lib/mongoid/errors/document_not_found.rb +10 -6
  111. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  112. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  113. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  114. data/lib/mongoid/errors/invalid_field.rb +6 -2
  115. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  116. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  117. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  118. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  119. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  120. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  121. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  122. data/lib/mongoid/errors/no_client_database.rb +1 -1
  123. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  124. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  125. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  126. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  127. data/lib/mongoid/errors.rb +2 -2
  128. data/lib/mongoid/extensions/array.rb +9 -7
  129. data/lib/mongoid/extensions/big_decimal.rb +29 -10
  130. data/lib/mongoid/extensions/binary.rb +42 -0
  131. data/lib/mongoid/extensions/boolean.rb +8 -2
  132. data/lib/mongoid/extensions/date.rb +26 -20
  133. data/lib/mongoid/extensions/date_time.rb +1 -1
  134. data/lib/mongoid/extensions/false_class.rb +1 -1
  135. data/lib/mongoid/extensions/float.rb +4 -5
  136. data/lib/mongoid/extensions/hash.rb +13 -6
  137. data/lib/mongoid/extensions/integer.rb +4 -5
  138. data/lib/mongoid/extensions/module.rb +1 -1
  139. data/lib/mongoid/extensions/object.rb +8 -6
  140. data/lib/mongoid/extensions/range.rb +41 -10
  141. data/lib/mongoid/extensions/regexp.rb +11 -4
  142. data/lib/mongoid/extensions/set.rb +11 -4
  143. data/lib/mongoid/extensions/string.rb +11 -22
  144. data/lib/mongoid/extensions/symbol.rb +4 -15
  145. data/lib/mongoid/extensions/time.rb +27 -16
  146. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  147. data/lib/mongoid/extensions/true_class.rb +1 -1
  148. data/lib/mongoid/extensions.rb +1 -0
  149. data/lib/mongoid/factory.rb +42 -7
  150. data/lib/mongoid/fields/foreign_key.rb +11 -4
  151. data/lib/mongoid/fields/localized.rb +2 -2
  152. data/lib/mongoid/fields/standard.rb +7 -7
  153. data/lib/mongoid/fields/validators/macro.rb +3 -9
  154. data/lib/mongoid/fields.rb +57 -15
  155. data/lib/mongoid/findable.rb +28 -22
  156. data/lib/mongoid/indexable/specification.rb +2 -2
  157. data/lib/mongoid/indexable/validators/options.rb +6 -2
  158. data/lib/mongoid/interceptable.rb +73 -13
  159. data/lib/mongoid/matchable.rb +1 -1
  160. data/lib/mongoid/matcher.rb +12 -7
  161. data/lib/mongoid/persistable/creatable.rb +18 -9
  162. data/lib/mongoid/persistable/deletable.rb +1 -1
  163. data/lib/mongoid/persistable/destroyable.rb +1 -1
  164. data/lib/mongoid/persistable/savable.rb +2 -2
  165. data/lib/mongoid/persistable/unsettable.rb +1 -1
  166. data/lib/mongoid/persistable/updatable.rb +19 -12
  167. data/lib/mongoid/persistable/upsertable.rb +1 -1
  168. data/lib/mongoid/persistable.rb +3 -3
  169. data/lib/mongoid/persistence_context.rb +22 -5
  170. data/lib/mongoid/query_cache.rb +8 -260
  171. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  172. data/lib/mongoid/reloadable.rb +7 -3
  173. data/lib/mongoid/scopable.rb +17 -15
  174. data/lib/mongoid/selectable.rb +1 -2
  175. data/lib/mongoid/serializable.rb +10 -6
  176. data/lib/mongoid/stateful.rb +35 -9
  177. data/lib/mongoid/tasks/database.rb +0 -2
  178. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  179. data/lib/mongoid/threaded.rb +9 -9
  180. data/lib/mongoid/timestamps/created.rb +1 -1
  181. data/lib/mongoid/timestamps/updated.rb +2 -2
  182. data/lib/mongoid/touchable.rb +2 -3
  183. data/lib/mongoid/traversable.rb +4 -3
  184. data/lib/mongoid/validatable/localizable.rb +1 -1
  185. data/lib/mongoid/validatable/macros.rb +0 -2
  186. data/lib/mongoid/validatable/presence.rb +2 -2
  187. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  188. data/lib/mongoid/validatable.rb +6 -6
  189. data/lib/mongoid/version.rb +1 -1
  190. data/lib/mongoid/warnings.rb +3 -4
  191. data/lib/mongoid.rb +1 -0
  192. data/spec/config/mongoid.yml +16 -0
  193. data/spec/integration/app_spec.rb +8 -12
  194. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  195. data/spec/integration/associations/embedded_spec.rb +15 -0
  196. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  197. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  198. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  199. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  200. data/spec/integration/associations/has_one_spec.rb +97 -1
  201. data/spec/integration/associations/scope_option_spec.rb +1 -1
  202. data/spec/integration/callbacks_models.rb +95 -1
  203. data/spec/integration/callbacks_spec.rb +226 -4
  204. data/spec/integration/criteria/range_spec.rb +95 -1
  205. data/spec/integration/discriminator_key_spec.rb +115 -76
  206. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  207. data/spec/integration/i18n_fallbacks_spec.rb +1 -15
  208. data/spec/integration/matcher_examples_spec.rb +20 -13
  209. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  210. data/spec/integration/matcher_operator_spec.rb +3 -5
  211. data/spec/integration/persistence/range_field_spec.rb +350 -0
  212. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  213. data/spec/mongoid/association/depending_spec.rb +9 -9
  214. data/spec/mongoid/association/eager_spec.rb +2 -1
  215. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  216. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  217. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  218. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  219. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +219 -8
  220. data/spec/mongoid/association/embedded/embeds_many_models.rb +157 -0
  221. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  222. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  223. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  224. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  225. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  226. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  227. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  228. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  229. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  230. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  231. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +67 -4
  232. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  233. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  234. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  235. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  236. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +82 -13
  237. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  238. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  239. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  240. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  241. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  242. data/spec/mongoid/association/syncable_spec.rb +14 -0
  243. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  244. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  245. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  246. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  247. data/spec/mongoid/attributes_spec.rb +524 -27
  248. data/spec/mongoid/changeable_spec.rb +130 -13
  249. data/spec/mongoid/clients/factory_spec.rb +23 -30
  250. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  251. data/spec/mongoid/clients_spec.rb +32 -2
  252. data/spec/mongoid/config_spec.rb +58 -13
  253. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  254. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  255. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  256. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  257. data/spec/mongoid/contextual/memory_spec.rb +521 -14
  258. data/spec/mongoid/contextual/mongo_spec.rb +564 -394
  259. data/spec/mongoid/contextual/none_spec.rb +11 -19
  260. data/spec/mongoid/copyable_spec.rb +451 -1
  261. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  262. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  263. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  264. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  265. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  266. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  267. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  268. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  269. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  270. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  271. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  272. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  273. data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
  274. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  275. data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
  276. data/spec/mongoid/criteria/queryable/selector_spec.rb +14 -2
  277. data/spec/mongoid/criteria_spec.rb +469 -1201
  278. data/spec/mongoid/document_fields_spec.rb +173 -24
  279. data/spec/mongoid/document_spec.rb +32 -41
  280. data/spec/mongoid/equality_spec.rb +12 -12
  281. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  282. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  283. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  284. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  285. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  286. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  287. data/spec/mongoid/extensions/array_spec.rb +16 -2
  288. data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
  289. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  290. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  291. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  292. data/spec/mongoid/extensions/date_spec.rb +71 -1
  293. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  294. data/spec/mongoid/extensions/float_spec.rb +48 -76
  295. data/spec/mongoid/extensions/hash_spec.rb +30 -0
  296. data/spec/mongoid/extensions/integer_spec.rb +45 -66
  297. data/spec/mongoid/extensions/range_spec.rb +255 -54
  298. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  299. data/spec/mongoid/extensions/set_spec.rb +106 -0
  300. data/spec/mongoid/extensions/string_spec.rb +53 -25
  301. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  302. data/spec/mongoid/extensions/time_spec.rb +634 -66
  303. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  304. data/spec/mongoid/factory_spec.rb +61 -1
  305. data/spec/mongoid/fields_spec.rb +321 -50
  306. data/spec/mongoid/findable_spec.rb +64 -29
  307. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  308. data/spec/mongoid/indexable_spec.rb +39 -20
  309. data/spec/mongoid/interceptable_spec.rb +584 -5
  310. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  311. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  312. data/spec/mongoid/mongoizable_spec.rb +285 -0
  313. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  314. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  315. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  316. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  317. data/spec/mongoid/persistence_context_spec.rb +50 -1
  318. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  319. data/spec/mongoid/query_cache_spec.rb +0 -154
  320. data/spec/mongoid/reloadable_spec.rb +35 -2
  321. data/spec/mongoid/scopable_spec.rb +54 -16
  322. data/spec/mongoid/shardable_spec.rb +14 -0
  323. data/spec/mongoid/stateful_spec.rb +28 -0
  324. data/spec/mongoid/timestamps_spec.rb +390 -0
  325. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  326. data/spec/mongoid/touchable_spec.rb +116 -0
  327. data/spec/mongoid/touchable_spec_models.rb +12 -8
  328. data/spec/mongoid/traversable_spec.rb +4 -11
  329. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  330. data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
  331. data/spec/mongoid/warnings_spec.rb +35 -0
  332. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  333. data/spec/rails/mongoid_spec.rb +4 -16
  334. data/spec/shared/lib/mrss/event_subscriber.rb +5 -15
  335. data/spec/support/constraints.rb +24 -0
  336. data/spec/support/macros.rb +30 -0
  337. data/spec/support/models/augmentation.rb +12 -0
  338. data/spec/support/models/band.rb +3 -0
  339. data/spec/support/models/catalog.rb +24 -0
  340. data/spec/support/models/circus.rb +3 -0
  341. data/spec/support/models/fanatic.rb +8 -0
  342. data/spec/support/models/implant.rb +9 -0
  343. data/spec/support/models/label.rb +2 -0
  344. data/spec/support/models/passport.rb +9 -0
  345. data/spec/support/models/person.rb +1 -0
  346. data/spec/support/models/player.rb +2 -0
  347. data/spec/support/models/powerup.rb +12 -0
  348. data/spec/support/models/registry.rb +1 -0
  349. data/spec/support/models/school.rb +14 -0
  350. data/spec/support/models/shield.rb +18 -0
  351. data/spec/support/models/student.rb +14 -0
  352. data/spec/support/models/weapon.rb +12 -0
  353. data.tar.gz.sig +0 -0
  354. metadata +49 -13
  355. metadata.gz.sig +0 -0
  356. data/lib/mongoid/errors/eager_load.rb +0 -23
  357. data/lib/mongoid/errors/invalid_value.rb +0 -17
  358. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -56,7 +56,7 @@ module Mongoid
56
56
  # @example Check if frozen
57
57
  # document.frozen?
58
58
  #
59
- # @return [ true, false ] True if frozen, else false.
59
+ # @return [ true | false ] True if frozen, else false.
60
60
  def frozen?
61
61
  attributes.frozen?
62
62
  end
@@ -100,21 +100,8 @@ module Mongoid
100
100
  # @param [ Hash ] attrs The attributes to set up the document with.
101
101
  #
102
102
  # @return [ Document ] A new document.
103
- def initialize(attrs = nil)
104
- @__parent = nil
105
- _building do
106
- @new_record = true
107
- @attributes ||= {}
108
- apply_pre_processed_defaults
109
- apply_default_scoping
110
- process_attributes(attrs) do
111
- yield(self) if block_given?
112
- end
113
- apply_post_processed_defaults
114
- # @todo: #2586: Need to have access to parent document in these
115
- # callbacks.
116
- run_callbacks(:initialize) unless _initialize_callbacks.empty?
117
- end
103
+ def initialize(attrs = nil, &block)
104
+ construct_document(attrs, execute_callbacks: true, &block)
118
105
  end
119
106
 
120
107
  # Return the model name of the document.
@@ -137,18 +124,6 @@ module Mongoid
137
124
  (persisted? || destroyed?) ? [ _id.to_s ] : nil
138
125
  end
139
126
 
140
- # Return an array with this +Document+ only in it.
141
- #
142
- # @example Return the document in an array.
143
- # document.to_a
144
- #
145
- # @return [ Array<Document> ] An array with the document as its only item.
146
- #
147
- # @deprecated
148
- def to_a
149
- [ self ]
150
- end
151
-
152
127
  # Return a hash of the entire document hierarchy from this document and
153
128
  # below. Used when the attributes are needed for everything and not just
154
129
  # the current document.
@@ -175,14 +150,14 @@ module Mongoid
175
150
  #
176
151
  # @param [ Hash ] options The options.
177
152
  #
178
- # @option options [ true, false ] :compact (Deprecated) Whether to include fields
153
+ # @option options [ true | false ] :compact (Deprecated) Whether to include fields
179
154
  # with nil values in the json document.
180
155
  #
181
156
  # @return [ Hash ] The document as json.
182
157
  def as_json(options = nil)
183
158
  rv = super
184
159
  if options && options[:compact]
185
- Mongoid.logger.warn('#as_json :compact option is deprecated. Please call #compact on the returned Hash object instead.')
160
+ Mongoid::Warnings.warn_as_json_compact_deprecated
186
161
  rv = rv.compact
187
162
  end
188
163
  rv
@@ -230,6 +205,38 @@ module Mongoid
230
205
 
231
206
  private
232
207
 
208
+ # Does the construction of a document.
209
+ #
210
+ # @param [ Hash ] attrs The attributes to set up the document with.
211
+ # @param [ true | false ] execute_callbacks Flag specifies whether callbacks
212
+ # should be run.
213
+ #
214
+ # @return [ Document ] A new document.
215
+ #
216
+ # @api private
217
+ def construct_document(attrs = nil, execute_callbacks: true)
218
+ @__parent = nil
219
+ _building do
220
+ @new_record = true
221
+ @attributes ||= {}
222
+ apply_pre_processed_defaults
223
+ apply_default_scoping
224
+ process_attributes(attrs) do
225
+ yield(self) if block_given?
226
+ end
227
+ @attributes_before_type_cast = @attributes.merge(attributes_before_type_cast)
228
+
229
+ if execute_callbacks
230
+ apply_post_processed_defaults
231
+ run_callbacks(:initialize) unless _initialize_callbacks.empty?
232
+ else
233
+ pending_callbacks << :apply_post_processed_defaults
234
+ pending_callbacks << :initialize
235
+ end
236
+ end
237
+ self
238
+ end
239
+
233
240
  # Returns the logger
234
241
  #
235
242
  # @return [ Logger ] The configured logger or a default Logger instance.
@@ -247,6 +254,14 @@ module Mongoid
247
254
  @model_cache_key ||= self.class.model_name.cache_key
248
255
  end
249
256
 
257
+ # Returns a hash of the attributes.
258
+ #
259
+ # Note this method modifies the attributes hash that already exists on the
260
+ # class and returns it. This means that the hash returned by this method
261
+ # refers to the same hash as calling #attributes on the instance. See
262
+ # MONGOID-4476 for an explanation on how this is used.
263
+ #
264
+ # @return [ Hash ] The attributes hash.
250
265
  def as_attributes
251
266
  return attributes if frozen?
252
267
  embedded_relations.each_pair do |name, meta|
@@ -275,20 +290,67 @@ module Mongoid
275
290
  # @param [ Hash ] attrs The hash of attributes to instantiate with.
276
291
  # @param [ Integer ] selected_fields The selected fields from the
277
292
  # criteria.
293
+ # @param [ true | false ] execute_callbacks Flag specifies whether callbacks
294
+ # should be run.
295
+ #
296
+ # @return [ Document ] A new document.
297
+ def instantiate(attrs = nil, selected_fields = nil, &block)
298
+ instantiate_document(attrs, selected_fields, execute_callbacks: true, &block)
299
+ end
300
+
301
+ # Instantiate the document.
302
+ #
303
+ # @param [ Hash ] attrs The hash of attributes to instantiate with.
304
+ # @param [ Integer ] selected_fields The selected fields from the
305
+ # criteria.
306
+ # @param [ true | false ] execute_callbacks Flag specifies whether callbacks
307
+ # should be run.
278
308
  #
279
309
  # @return [ Document ] A new document.
280
- def instantiate(attrs = nil, selected_fields = nil)
281
- attributes = attrs || {}
310
+ #
311
+ # @api private
312
+ def instantiate_document(attrs = nil, selected_fields = nil, execute_callbacks: true)
313
+ attributes = if Mongoid.legacy_attributes
314
+ attrs
315
+ else
316
+ attrs&.to_h
317
+ end || {}
318
+
282
319
  doc = allocate
283
320
  doc.__selected_fields = selected_fields
284
321
  doc.instance_variable_set(:@attributes, attributes)
285
- doc.apply_defaults
286
- yield(doc) if block_given?
287
- doc.run_callbacks(:find) unless doc._find_callbacks.empty?
288
- doc.run_callbacks(:initialize) unless doc._initialize_callbacks.empty?
322
+ # TODO: remove the to_h when the legacy_attributes flag is removed.
323
+ # The to_h ensures that we don't accidentally make attributes_before_type_cast
324
+ # a BSON::Document.
325
+ doc.instance_variable_set(:@attributes_before_type_cast, attributes&.to_h.dup)
326
+
327
+ if execute_callbacks
328
+ doc.apply_defaults
329
+ yield(doc) if block_given?
330
+ doc.run_callbacks(:find) unless doc._find_callbacks.empty?
331
+ doc.run_callbacks(:initialize) unless doc._initialize_callbacks.empty?
332
+ else
333
+ yield(doc) if block_given?
334
+ doc.pending_callbacks += [:apply_defaults, :find, :initialize]
335
+ end
336
+
289
337
  doc
290
338
  end
291
339
 
340
+ # Allocates and constructs a document.
341
+ #
342
+ # @param [ Hash ] attrs The attributes to set up the document with.
343
+ # @param [ true | false ] execute_callbacks Flag specifies whether callbacks
344
+ # should be run.
345
+ #
346
+ # @return [ Document ] A new document.
347
+ #
348
+ # @api private
349
+ def construct_document(attrs = nil, execute_callbacks: true)
350
+ doc = allocate
351
+ doc.send(:construct_document, attrs, execute_callbacks: execute_callbacks)
352
+ end
353
+
292
354
  # Returns all types to query for when using this class as the base.
293
355
  #
294
356
  # @example Get the types.
@@ -26,9 +26,9 @@ module Mongoid
26
26
  # @example Compare for equality.
27
27
  # document == other
28
28
  #
29
- # @param [ Document, Object ] other The other object to compare with.
29
+ # @param [ Document | Object ] other The other object to compare with.
30
30
  #
31
- # @return [ true, false ] True if the ids are equal, false if not.
31
+ # @return [ true | false ] True if the ids are equal, false if not.
32
32
  def ==(other)
33
33
  self.class == other.class &&
34
34
  attributes["_id"] == other.attributes["_id"]
@@ -39,14 +39,14 @@ module Mongoid
39
39
  # @example Compare the classes.
40
40
  # document === other
41
41
  #
42
- # @param [ Document, Object ] other The other object to compare with.
42
+ # @param [ Document | Object ] other The other object to compare with.
43
43
  #
44
- # @return [ true, false ] True if the classes are equal, false if not.
44
+ # @return [ true | false ] True if the classes are equal, false if not.
45
45
  def ===(other)
46
46
  if Mongoid.legacy_triple_equals
47
- super
48
- else
49
47
  other.class == Class ? self.class === other : self == other
48
+ else
49
+ super
50
50
  end
51
51
  end
52
52
 
@@ -55,9 +55,9 @@ module Mongoid
55
55
  # @example Perform equality checking.
56
56
  # document.eql?(other)
57
57
  #
58
- # @param [ Document, Object ] other The object to check against.
58
+ # @param [ Document | Object ] other The object to check against.
59
59
  #
60
- # @return [ true, false ] True if equal, false if not.
60
+ # @return [ true | false ] True if equal, false if not.
61
61
  def eql?(other)
62
62
  self == (other)
63
63
  end
@@ -68,14 +68,14 @@ module Mongoid
68
68
  # @example Compare the classes.
69
69
  # document === other
70
70
  #
71
- # @param [ Document, Object ] other The other object to compare with.
71
+ # @param [ Document | Object ] other The other object to compare with.
72
72
  #
73
- # @return [ true, false ] True if the classes are equal, false if not.
73
+ # @return [ true | false ] True if the classes are equal, false if not.
74
74
  def ===(other)
75
75
  if Mongoid.legacy_triple_equals
76
- other.is_a?(self)
77
- else
78
76
  other.class == Class ? self <= other : other.is_a?(self)
77
+ else
78
+ other.is_a?(self)
79
79
  end
80
80
  end
81
81
  end
@@ -19,8 +19,9 @@ module Mongoid
19
19
  # DocumentNotFound.new(Person, :ssn => "1234", :name => "Helen")
20
20
  #
21
21
  # @param [ Class ] klass The model class.
22
- # @param [ Hash, Array, Object ] params The attributes or ids.
23
- # @param [ Array ] unmatched The unmatched ids, if appropriate
22
+ # @param [ Hash | Array | Object ] params The attributes or ids.
23
+ # @param [ Array | Hash ] unmatched The unmatched ids, if appropriate. If
24
+ # there is a shard key this will be a hash.
24
25
  def initialize(klass, params, unmatched = nil)
25
26
  if !unmatched && !params.is_a?(Hash)
26
27
  unmatched = Array(params) if params
@@ -35,7 +36,8 @@ module Mongoid
35
36
  searched: searched(params),
36
37
  attributes: params,
37
38
  total: total(params),
38
- missing: missing(unmatched)
39
+ missing: missing(unmatched),
40
+ shard_key: shard_key(unmatched)
39
41
  }
40
42
  )
41
43
  )
@@ -48,12 +50,14 @@ module Mongoid
48
50
  # @example Get the missing string.
49
51
  # error.missing(1)
50
52
  #
51
- # @param [ Object, Array ] unmatched The ids that did not match.
53
+ # @param [ Object | Array ] unmatched The ids that did not match.
52
54
  #
53
55
  # @return [ String ] The missing string.
54
56
  def missing(unmatched)
55
57
  if unmatched.is_a?(::Array)
56
58
  unmatched.join(", ")
59
+ elsif unmatched.is_a?(::Hash)
60
+ unmatched[:_id] || unmatched["_id"]
57
61
  else
58
62
  unmatched
59
63
  end
@@ -64,7 +68,7 @@ module Mongoid
64
68
  # @example Get the searched string.
65
69
  # error.searched(1)
66
70
  #
67
- # @param [ Object, Array ] params The ids that were searched for.
71
+ # @param [ Object | Array ] params The ids that were searched for.
68
72
  #
69
73
  # @return [ String ] The searched string.
70
74
  def searched(params)
@@ -80,7 +84,7 @@ module Mongoid
80
84
  # @example Get the total.
81
85
  # error.total([ 1, 2, 3 ])
82
86
  #
83
- # @param [ Object, Array ] params What was searched for.
87
+ # @param [ Object | Array ] params What was searched for.
84
88
  #
85
89
  # @return [ Integer ] The total number.
86
90
  def total(params)
@@ -12,7 +12,7 @@ module Mongoid
12
12
  # @example Create the new error.
13
13
  # InvalidConfigOption.new(:name, [ :option ])
14
14
  #
15
- # @param [ Symbol, String ] name The attempted config option name.
15
+ # @param [ Symbol | String ] name The attempted config option name.
16
16
  def initialize(name)
17
17
  super(
18
18
  compose_message(
@@ -13,7 +13,7 @@ module Mongoid
13
13
  #
14
14
  # @param [ Mongoid::Association ] association The association for which this
15
15
  # dependency is defined.
16
- # @param [ Symbol, String ] invalid_strategy The attempted invalid strategy.
16
+ # @param [ Symbol | String ] invalid_strategy The attempted invalid strategy.
17
17
  # @param [ Array<Symbol> ] valid_strategies The valid strategies.
18
18
  def initialize(association, invalid_strategy, valid_strategies)
19
19
  super(
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mongoid
4
+ module Errors
5
+
6
+ # This error is raised when trying to use the setter for a field that starts
7
+ # with a dollar sign ($) or contains a dot/period (.).
8
+ class InvalidDotDollarAssignment < MongoidError
9
+
10
+ # Create the new error.
11
+ #
12
+ # @param [ Class ] klass The class of the document.
13
+ # @param [ Class ] attr The attribute attempted to be written.
14
+ #
15
+ # @api private
16
+ def initialize(klass, attr)
17
+ super(
18
+ compose_message("invalid_dot_dollar_assignment", { klass: klass, attr: attr })
19
+ )
20
+ end
21
+ end
22
+ end
23
+ end
@@ -12,14 +12,18 @@ module Mongoid
12
12
  # @example Create the error.
13
13
  # InvalidField.new(person, :crazy_method_name)
14
14
  #
15
+ # @api private
16
+ #
15
17
  # @param [ Class ] klass The document class.
18
+ # @param [ Symbol ] field The field name.
16
19
  # @param [ Symbol ] name The method name.
17
- def initialize(klass, name)
20
+ def initialize(klass, field, name)
18
21
  super(
19
22
  compose_message(
20
23
  "invalid_field",
21
24
  {
22
25
  name: name,
26
+ field: field,
23
27
  origin: origin(klass, name),
24
28
  file: location(klass, name)[0],
25
29
  line: location(klass, name)[1]
@@ -38,7 +42,7 @@ module Mongoid
38
42
  # @param [ Class ] klass The document class.
39
43
  # @param [ Symbol ] name The method name.
40
44
  #
41
- # @return [ Class, Module ] The originating class or module.
45
+ # @return [ Class | Module ] The originating class or module.
42
46
  def origin(klass, name)
43
47
  klass.instance_method(name).owner
44
48
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mongoid
4
+ module Errors
5
+
6
+ # This error is raised when trying to define a field using a :type option value
7
+ # that is not present in the field type mapping.
8
+ class InvalidFieldType < MongoidError
9
+
10
+ # Create the new error.
11
+ #
12
+ # @example Instantiate the error.
13
+ # InvalidFieldType.new('Person', 'first_name', 'stringgy')
14
+ #
15
+ # @param [ String ] klass The model class.
16
+ # @param [ String ] field The field on which the invalid type is used.
17
+ # @param [ Symbol | String ] type The value of the field :type option.
18
+ def initialize(klass, field, type)
19
+ super(
20
+ compose_message('invalid_field_type',
21
+ klass: klass, field: field, type_inspection: type.inspect)
22
+ )
23
+ end
24
+ end
25
+ end
26
+ end
@@ -38,7 +38,7 @@ module Mongoid
38
38
  # @param [ Class ] klass The document class.
39
39
  # @param [ Symbol ] name The method name.
40
40
  #
41
- # @return [ Class, Module ] The originating class or module.
41
+ # @return [ Class | Module ] The originating class or module.
42
42
  def origin(klass, name)
43
43
  klass.instance_method(name).owner
44
44
  end
@@ -12,7 +12,7 @@ module Mongoid
12
12
  # InvalidRelationOption.new(Person, invalid_option: 'make_me_a_sandwich')
13
13
  #
14
14
  # @param [ Class ] klass The model class.
15
- # @param [ String, Symbol ] name The association name.
15
+ # @param [ String | Symbol ] name The association name.
16
16
  # @param [ Symbol ] option The invalid option.
17
17
  # @param [ Array<Symbol> ] valid_options The valid option.
18
18
  def initialize(klass, name, option, valid_options)
@@ -12,7 +12,7 @@ module Mongoid
12
12
  # @example Create the error.
13
13
  # InvalidSessionUse.new(:invalid_session_use)
14
14
  #
15
- # @param [ :invalid_session_use, :invalid_session_nesting ] error_type The type of session misuse.
15
+ # @param [ :invalid_session_use | :invalid_session_nesting ] error_type The type of session misuse.
16
16
  def initialize(error_type)
17
17
  super(compose_message(error_type.to_s))
18
18
  end
@@ -12,7 +12,7 @@ module Mongoid
12
12
  # InvalidStorageOptions.new(Person, invalid_option: 'name')
13
13
  #
14
14
  # @param [ Class ] klass The model class.
15
- # @param [ Hash, String, Symbol ] options The provided options.
15
+ # @param [ Hash | String | Symbol ] options The provided options.
16
16
  def initialize(klass, options)
17
17
  super(
18
18
  compose_message(
@@ -53,7 +53,7 @@ module Mongoid
53
53
  # @example Create the problem.
54
54
  # error.problem("error", {})
55
55
  #
56
- # @param [ String, Symbol ] key The error key.
56
+ # @param [ String | Symbol ] key The error key.
57
57
  # @param [ Hash ] attributes The attributes to interpolate.
58
58
  #
59
59
  # @return [ String ] The problem.
@@ -66,7 +66,7 @@ module Mongoid
66
66
  # @example Create the summary.
67
67
  # error.summary("error", {})
68
68
  #
69
- # @param [ String, Symbol ] key The error key.
69
+ # @param [ String | Symbol ] key The error key.
70
70
  # @param [ Hash ] attributes The attributes to interpolate.
71
71
  #
72
72
  # @return [ String ] The summary.
@@ -79,7 +79,7 @@ module Mongoid
79
79
  # @example Create the resolution.
80
80
  # error.resolution("error", {})
81
81
  #
82
- # @param [ String, Symbol ] key The error key.
82
+ # @param [ String | Symbol ] key The error key.
83
83
  # @param [ Hash ] attributes The attributes to interpolate.
84
84
  #
85
85
  # @return [ String ] The resolution.
@@ -13,7 +13,7 @@ module Mongoid
13
13
  # NestedAttributesMetadataNotFound.new(klass, name)
14
14
  #
15
15
  # @param [ Class ] klass The class of the document.
16
- # @param [ Symbol, String ] name The name of the association
16
+ # @param [ Symbol | String ] name The name of the association
17
17
  def initialize(klass, name)
18
18
  super(
19
19
  compose_message(
@@ -11,7 +11,7 @@ module Mongoid
11
11
  # @example Create the new error.
12
12
  # NoClientDatabase.new(:default, {}})
13
13
  #
14
- # @param [ Symbol, String ] name The db config key.
14
+ # @param [ Symbol | String ] name The db config key.
15
15
  # @param [ Hash ] config The hash configuration options.
16
16
  def initialize(name, config)
17
17
  super(
@@ -11,7 +11,7 @@ module Mongoid
11
11
  # @example Create the new error.
12
12
  # NoClientHosts.new(:default, {}})
13
13
  #
14
- # @param [ Symbol, String ] name The db config key.
14
+ # @param [ Symbol | String ] name The db config key.
15
15
  # @param [ Hash ] config The hash configuration options.
16
16
  def initialize(name, config)
17
17
  super(
@@ -12,7 +12,7 @@ module Mongoid
12
12
  # @example Create the new error.
13
13
  # ReadonlyAttribute.new(:title, "mr")
14
14
  #
15
- # @param [ Symbol, String ] name The name of the attribute.
15
+ # @param [ Symbol | String ] name The name of the attribute.
16
16
  # @param [ Object ] value The attempted set value.
17
17
  def initialize(name, value)
18
18
  super(
@@ -3,7 +3,7 @@
3
3
  module Mongoid
4
4
  module Errors
5
5
 
6
- # This error is raised when trying to create set nested records above the
6
+ # This error is raised when trying to create set nested documents above the
7
7
  # specified :limit
8
8
  #
9
9
  # @example Create the error.
@@ -13,7 +13,7 @@ module Mongoid
13
13
  # UnknownAttribute.new(Person, "gender")
14
14
  #
15
15
  # @param [ Class ] klass The model class.
16
- # @param [ String, Symbol ] name The name of the attribute.
16
+ # @param [ String | Symbol ] name The name of the attribute.
17
17
  def initialize(klass, name)
18
18
  super(
19
19
  compose_message("unknown_attribute", { klass: klass.name, name: name })
@@ -6,7 +6,6 @@ require "mongoid/errors/callback"
6
6
  require "mongoid/errors/criteria_argument_required"
7
7
  require "mongoid/errors/document_not_destroyed"
8
8
  require "mongoid/errors/document_not_found"
9
- require "mongoid/errors/eager_load"
10
9
  require "mongoid/errors/empty_config_file"
11
10
  require "mongoid/errors/in_memory_collation_not_supported"
12
11
  require "mongoid/errors/invalid_collection"
@@ -15,6 +14,7 @@ require "mongoid/errors/invalid_config_option"
15
14
  require "mongoid/errors/invalid_dependent_strategy"
16
15
  require "mongoid/errors/invalid_field"
17
16
  require "mongoid/errors/invalid_field_option"
17
+ require "mongoid/errors/invalid_field_type"
18
18
  require "mongoid/errors/invalid_find"
19
19
  require "mongoid/errors/invalid_includes"
20
20
  require "mongoid/errors/invalid_index"
@@ -24,6 +24,7 @@ require "mongoid/errors/invalid_persistence_option"
24
24
  require "mongoid/errors/invalid_query"
25
25
  # Must be after invalid_query.
26
26
  require "mongoid/errors/invalid_discriminator_key_target"
27
+ require "mongoid/errors/invalid_dot_dollar_assignment"
27
28
  require "mongoid/errors/invalid_elem_match_operator"
28
29
  require "mongoid/errors/invalid_estimated_count_criteria"
29
30
  require "mongoid/errors/invalid_expression_operator"
@@ -36,7 +37,6 @@ require "mongoid/errors/invalid_set_polymorphic_relation"
36
37
  require "mongoid/errors/invalid_storage_options"
37
38
  require "mongoid/errors/invalid_storage_parent"
38
39
  require "mongoid/errors/invalid_time"
39
- require "mongoid/errors/invalid_value"
40
40
  require "mongoid/errors/inverse_not_found"
41
41
  require "mongoid/errors/mixed_relations"
42
42
  require "mongoid/errors/mixed_client_configuration"
@@ -76,7 +76,7 @@ module Mongoid
76
76
  # @example Is this multi args?
77
77
  # [ 1, 2, 3 ].multi_arged?
78
78
  #
79
- # @return [ true, false ] If the array is multi args.
79
+ # @return [ true | false ] If the array is multi args.
80
80
  def multi_arged?
81
81
  !first.is_a?(Hash) && first.resizable? || size > 1
82
82
  end
@@ -87,7 +87,7 @@ module Mongoid
87
87
  # @example Mongoize the object.
88
88
  # object.mongoize
89
89
  #
90
- # @return [ Array ] The object.
90
+ # @return [ Array | nil ] The object or nil.
91
91
  def mongoize
92
92
  ::Array.mongoize(self)
93
93
  end
@@ -144,12 +144,12 @@ module Mongoid
144
144
  #
145
145
  # @param [ Object ] object The object to mongoize.
146
146
  #
147
- # @return [ Array ] The object mongoized.
147
+ # @return [ Array | nil ] The object mongoized or nil.
148
148
  def mongoize(object)
149
- if object.is_a?(::Array)
150
- evolve(object).collect{ |obj| obj.class.mongoize(obj) }
151
- else
152
- evolve(object)
149
+ return if object.nil?
150
+ case object
151
+ when ::Array, ::Set
152
+ object.map(&:mongoize)
153
153
  end
154
154
  end
155
155
 
@@ -169,3 +169,5 @@ end
169
169
 
170
170
  ::Array.__send__(:include, Mongoid::Extensions::Array)
171
171
  ::Array.extend(Mongoid::Extensions::Array::ClassMethods)
172
+
173
+ ::Mongoid.deprecate(Array, :blank_criteria)