mongoid 7.5.4 → 8.1.9

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 (446) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -3
  3. data/README.md +6 -6
  4. data/Rakefile +44 -46
  5. data/lib/config/locales/en.yml +92 -43
  6. data/lib/mongoid/association/accessors.rb +44 -11
  7. data/lib/mongoid/association/bindable.rb +50 -2
  8. data/lib/mongoid/association/builders.rb +5 -3
  9. data/lib/mongoid/association/constrainable.rb +0 -1
  10. data/lib/mongoid/association/eager_loadable.rb +32 -7
  11. data/lib/mongoid/association/embedded/batchable.rb +34 -11
  12. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  13. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  14. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
  15. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
  16. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  17. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  18. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
  19. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +85 -46
  20. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  21. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
  22. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
  23. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  24. data/lib/mongoid/association/macros.rb +8 -1
  25. data/lib/mongoid/association/many.rb +11 -7
  26. data/lib/mongoid/association/nested/many.rb +5 -4
  27. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  28. data/lib/mongoid/association/nested/one.rb +45 -7
  29. data/lib/mongoid/association/one.rb +2 -2
  30. data/lib/mongoid/association/options.rb +9 -9
  31. data/lib/mongoid/association/proxy.rb +15 -4
  32. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  33. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  34. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  35. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  36. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  37. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  38. data/lib/mongoid/association/referenced/eager.rb +2 -2
  39. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  40. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  41. data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
  42. data/lib/mongoid/association/referenced/has_many/proxy.rb +40 -21
  43. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  44. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  45. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  46. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  47. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  48. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  49. data/lib/mongoid/association/reflections.rb +4 -4
  50. data/lib/mongoid/association/relatable.rb +44 -10
  51. data/lib/mongoid/association.rb +5 -5
  52. data/lib/mongoid/atomic/modifiers.rb +2 -2
  53. data/lib/mongoid/atomic.rb +16 -7
  54. data/lib/mongoid/attributes/dynamic.rb +4 -4
  55. data/lib/mongoid/attributes/nested.rb +6 -6
  56. data/lib/mongoid/attributes/processing.rb +37 -6
  57. data/lib/mongoid/attributes/projector.rb +2 -2
  58. data/lib/mongoid/attributes/readonly.rb +11 -6
  59. data/lib/mongoid/attributes.rb +51 -42
  60. data/lib/mongoid/changeable.rb +147 -14
  61. data/lib/mongoid/clients/options.rb +5 -1
  62. data/lib/mongoid/clients/sessions.rb +2 -14
  63. data/lib/mongoid/clients/storage_options.rb +2 -5
  64. data/lib/mongoid/clients/validators/storage.rb +3 -15
  65. data/lib/mongoid/collection_configurable.rb +58 -0
  66. data/lib/mongoid/composable.rb +2 -0
  67. data/lib/mongoid/config/defaults.rb +60 -0
  68. data/lib/mongoid/config/options.rb +3 -0
  69. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  70. data/lib/mongoid/config/validators/client.rb +6 -6
  71. data/lib/mongoid/config/validators.rb +1 -0
  72. data/lib/mongoid/config.rb +153 -18
  73. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  74. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  75. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  76. data/lib/mongoid/contextual/atomic.rb +1 -1
  77. data/lib/mongoid/contextual/geo_near.rb +7 -7
  78. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  79. data/lib/mongoid/contextual/memory.rb +285 -58
  80. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  81. data/lib/mongoid/contextual/mongo.rb +540 -346
  82. data/lib/mongoid/contextual/none.rb +193 -20
  83. data/lib/mongoid/contextual/queryable.rb +1 -1
  84. data/lib/mongoid/contextual.rb +14 -2
  85. data/lib/mongoid/copyable.rb +32 -8
  86. data/lib/mongoid/criteria/findable.rb +8 -5
  87. data/lib/mongoid/criteria/includable.rb +27 -22
  88. data/lib/mongoid/criteria/marshalable.rb +10 -2
  89. data/lib/mongoid/criteria/permission.rb +1 -1
  90. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  91. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
  92. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  93. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  94. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  95. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  96. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
  97. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +15 -9
  98. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  99. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  100. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  101. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  102. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  103. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  104. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  105. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  106. data/lib/mongoid/criteria/queryable/key.rb +4 -4
  107. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  108. data/lib/mongoid/criteria/queryable/optional.rb +11 -17
  109. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  110. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  111. data/lib/mongoid/criteria/queryable/selectable.rb +48 -39
  112. data/lib/mongoid/criteria/queryable/selector.rb +92 -7
  113. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  114. data/lib/mongoid/criteria/queryable.rb +12 -7
  115. data/lib/mongoid/criteria/scopable.rb +2 -2
  116. data/lib/mongoid/criteria/translator.rb +45 -0
  117. data/lib/mongoid/criteria.rb +20 -40
  118. data/lib/mongoid/deprecable.rb +37 -0
  119. data/lib/mongoid/deprecation.rb +25 -0
  120. data/lib/mongoid/document.rb +135 -36
  121. data/lib/mongoid/equality.rb +9 -8
  122. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  123. data/lib/mongoid/errors/document_not_found.rb +10 -6
  124. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  125. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  126. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  127. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  128. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  129. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  130. data/lib/mongoid/errors/invalid_field.rb +6 -2
  131. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  132. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  133. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  134. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  135. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  136. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  137. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  138. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  139. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  140. data/lib/mongoid/errors/no_client_database.rb +1 -1
  141. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  142. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  143. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  144. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  145. data/lib/mongoid/errors.rb +6 -3
  146. data/lib/mongoid/extensions/array.rb +9 -7
  147. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  148. data/lib/mongoid/extensions/binary.rb +42 -0
  149. data/lib/mongoid/extensions/boolean.rb +8 -2
  150. data/lib/mongoid/extensions/date.rb +26 -20
  151. data/lib/mongoid/extensions/date_time.rb +1 -1
  152. data/lib/mongoid/extensions/false_class.rb +1 -1
  153. data/lib/mongoid/extensions/float.rb +7 -4
  154. data/lib/mongoid/extensions/hash.rb +38 -9
  155. data/lib/mongoid/extensions/integer.rb +7 -4
  156. data/lib/mongoid/extensions/module.rb +1 -1
  157. data/lib/mongoid/extensions/object.rb +10 -8
  158. data/lib/mongoid/extensions/range.rb +41 -10
  159. data/lib/mongoid/extensions/regexp.rb +11 -4
  160. data/lib/mongoid/extensions/set.rb +11 -4
  161. data/lib/mongoid/extensions/string.rb +11 -22
  162. data/lib/mongoid/extensions/symbol.rb +4 -15
  163. data/lib/mongoid/extensions/time.rb +29 -16
  164. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  165. data/lib/mongoid/extensions/true_class.rb +1 -1
  166. data/lib/mongoid/extensions.rb +1 -0
  167. data/lib/mongoid/factory.rb +55 -7
  168. data/lib/mongoid/fields/foreign_key.rb +11 -4
  169. data/lib/mongoid/fields/localized.rb +19 -4
  170. data/lib/mongoid/fields/standard.rb +17 -7
  171. data/lib/mongoid/fields/validators/macro.rb +3 -9
  172. data/lib/mongoid/fields.rb +142 -28
  173. data/lib/mongoid/findable.rb +54 -24
  174. data/lib/mongoid/indexable/specification.rb +2 -2
  175. data/lib/mongoid/indexable/validators/options.rb +6 -2
  176. data/lib/mongoid/interceptable.rb +187 -16
  177. data/lib/mongoid/matchable.rb +1 -1
  178. data/lib/mongoid/matcher/eq_impl.rb +1 -1
  179. data/lib/mongoid/matcher/type.rb +1 -1
  180. data/lib/mongoid/matcher.rb +48 -14
  181. data/lib/mongoid/persistable/creatable.rb +19 -9
  182. data/lib/mongoid/persistable/deletable.rb +2 -2
  183. data/lib/mongoid/persistable/destroyable.rb +1 -1
  184. data/lib/mongoid/persistable/savable.rb +14 -2
  185. data/lib/mongoid/persistable/unsettable.rb +2 -2
  186. data/lib/mongoid/persistable/updatable.rb +69 -12
  187. data/lib/mongoid/persistable/upsertable.rb +21 -2
  188. data/lib/mongoid/persistable.rb +6 -3
  189. data/lib/mongoid/persistence_context.rb +6 -4
  190. data/lib/mongoid/query_cache.rb +13 -261
  191. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  192. data/lib/mongoid/railties/database.rake +7 -2
  193. data/lib/mongoid/reloadable.rb +10 -8
  194. data/lib/mongoid/scopable.rb +15 -13
  195. data/lib/mongoid/selectable.rb +1 -2
  196. data/lib/mongoid/serializable.rb +17 -13
  197. data/lib/mongoid/stateful.rb +57 -10
  198. data/lib/mongoid/tasks/database.rake +12 -0
  199. data/lib/mongoid/tasks/database.rb +20 -2
  200. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  201. data/lib/mongoid/threaded.rb +42 -12
  202. data/lib/mongoid/timestamps/created.rb +9 -2
  203. data/lib/mongoid/timestamps/updated.rb +2 -2
  204. data/lib/mongoid/touchable.rb +3 -4
  205. data/lib/mongoid/traversable.rb +41 -5
  206. data/lib/mongoid/utils.rb +22 -0
  207. data/lib/mongoid/validatable/associated.rb +98 -17
  208. data/lib/mongoid/validatable/localizable.rb +1 -1
  209. data/lib/mongoid/validatable/macros.rb +5 -7
  210. data/lib/mongoid/validatable/presence.rb +2 -2
  211. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  212. data/lib/mongoid/validatable.rb +17 -6
  213. data/lib/mongoid/version.rb +1 -1
  214. data/lib/mongoid/warnings.rb +19 -4
  215. data/lib/mongoid.rb +17 -3
  216. data/spec/config/mongoid.yml +16 -0
  217. data/spec/integration/app_spec.rb +24 -19
  218. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  219. data/spec/integration/associations/embedded_spec.rb +15 -0
  220. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  221. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  222. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  223. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +61 -0
  224. data/spec/integration/associations/has_one_spec.rb +97 -1
  225. data/spec/integration/associations/scope_option_spec.rb +1 -1
  226. data/spec/integration/callbacks_models.rb +132 -1
  227. data/spec/integration/callbacks_spec.rb +381 -4
  228. data/spec/integration/criteria/range_spec.rb +95 -1
  229. data/spec/integration/discriminator_key_spec.rb +118 -80
  230. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  231. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  232. data/spec/integration/matcher_examples_spec.rb +20 -13
  233. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  234. data/spec/integration/matcher_operator_spec.rb +3 -5
  235. data/spec/integration/persistence/range_field_spec.rb +350 -0
  236. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  237. data/spec/mongoid/association/depending_spec.rb +9 -9
  238. data/spec/mongoid/association/eager_spec.rb +26 -3
  239. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  240. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  241. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  242. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  243. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +290 -65
  244. data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
  245. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +16 -0
  246. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  247. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  248. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  249. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  250. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  251. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  252. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  253. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +19 -0
  254. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  255. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  256. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
  257. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  258. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  259. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  260. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  261. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +215 -177
  262. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  263. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  264. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  265. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  266. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  267. data/spec/mongoid/association/syncable_spec.rb +15 -1
  268. data/spec/mongoid/association_spec.rb +60 -0
  269. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  270. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  271. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  272. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  273. data/spec/mongoid/attributes/readonly_spec.rb +19 -0
  274. data/spec/mongoid/attributes_spec.rb +526 -33
  275. data/spec/mongoid/changeable_spec.rb +429 -37
  276. data/spec/mongoid/clients/factory_spec.rb +23 -30
  277. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  278. data/spec/mongoid/clients_spec.rb +149 -15
  279. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  280. data/spec/mongoid/config/defaults_spec.rb +160 -0
  281. data/spec/mongoid/config_spec.rb +214 -31
  282. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  283. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  284. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  285. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  286. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  287. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  288. data/spec/mongoid/contextual/mongo_spec.rb +2256 -1005
  289. data/spec/mongoid/contextual/none_spec.rb +60 -21
  290. data/spec/mongoid/copyable_spec.rb +453 -11
  291. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  292. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  293. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  294. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  295. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  296. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  297. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  298. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  299. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  300. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  301. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  302. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  303. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  304. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  305. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  306. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  307. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  308. data/spec/mongoid/criteria/queryable/selectable_spec.rb +107 -86
  309. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
  310. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  311. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  312. data/spec/mongoid/criteria_spec.rb +469 -1205
  313. data/spec/mongoid/document_fields_spec.rb +173 -24
  314. data/spec/mongoid/document_spec.rb +59 -41
  315. data/spec/mongoid/equality_spec.rb +6 -0
  316. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  317. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  318. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  319. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  320. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  321. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  322. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  323. data/spec/mongoid/extensions/array_spec.rb +16 -2
  324. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  325. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  326. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  327. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  328. data/spec/mongoid/extensions/date_spec.rb +71 -1
  329. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  330. data/spec/mongoid/extensions/float_spec.rb +53 -74
  331. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  332. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  333. data/spec/mongoid/extensions/range_spec.rb +255 -54
  334. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  335. data/spec/mongoid/extensions/set_spec.rb +106 -0
  336. data/spec/mongoid/extensions/string_spec.rb +53 -25
  337. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  338. data/spec/mongoid/extensions/time_spec.rb +639 -106
  339. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  340. data/spec/mongoid/factory_spec.rb +61 -1
  341. data/spec/mongoid/fields/localized_spec.rb +80 -37
  342. data/spec/mongoid/fields_spec.rb +503 -87
  343. data/spec/mongoid/findable_spec.rb +450 -58
  344. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  345. data/spec/mongoid/indexable_spec.rb +55 -30
  346. data/spec/mongoid/interceptable_spec.rb +904 -22
  347. data/spec/mongoid/interceptable_spec_models.rb +189 -22
  348. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  349. data/spec/mongoid/mongoizable_spec.rb +285 -0
  350. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  351. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  352. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  353. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  354. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  355. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  356. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  357. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  358. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  359. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  360. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  361. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  362. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  363. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  364. data/spec/mongoid/persistence_context_spec.rb +31 -57
  365. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  366. data/spec/mongoid/query_cache_spec.rb +56 -215
  367. data/spec/mongoid/reloadable_spec.rb +83 -6
  368. data/spec/mongoid/scopable_spec.rb +91 -1
  369. data/spec/mongoid/serializable_spec.rb +25 -39
  370. data/spec/mongoid/shardable_spec.rb +4 -4
  371. data/spec/mongoid/stateful_spec.rb +150 -8
  372. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  373. data/spec/mongoid/tasks/database_spec.rb +127 -0
  374. data/spec/mongoid/timestamps/created_spec.rb +23 -0
  375. data/spec/mongoid/timestamps_spec.rb +392 -4
  376. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  377. data/spec/mongoid/touchable_spec.rb +390 -2
  378. data/spec/mongoid/touchable_spec_models.rb +14 -8
  379. data/spec/mongoid/traversable_spec.rb +13 -35
  380. data/spec/mongoid/validatable/associated_spec.rb +27 -34
  381. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  382. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  383. data/spec/mongoid/warnings_spec.rb +35 -0
  384. data/spec/mongoid_spec.rb +34 -16
  385. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  386. data/spec/rails/mongoid_spec.rb +4 -16
  387. data/spec/spec_helper.rb +5 -0
  388. data/spec/support/constraints.rb +24 -0
  389. data/spec/support/immutable_ids.rb +118 -0
  390. data/spec/support/macros.rb +78 -0
  391. data/spec/support/models/artist.rb +0 -1
  392. data/spec/support/models/augmentation.rb +12 -0
  393. data/spec/support/models/band.rb +5 -0
  394. data/spec/support/models/book.rb +1 -0
  395. data/spec/support/models/building.rb +2 -0
  396. data/spec/support/models/catalog.rb +24 -0
  397. data/spec/support/models/circus.rb +3 -0
  398. data/spec/support/models/cover.rb +10 -0
  399. data/spec/support/models/fanatic.rb +8 -0
  400. data/spec/support/models/implant.rb +9 -0
  401. data/spec/support/models/label.rb +2 -0
  402. data/spec/support/models/lat_lng.rb +6 -0
  403. data/spec/support/models/name.rb +10 -0
  404. data/spec/support/models/passport.rb +9 -0
  405. data/spec/support/models/person.rb +2 -0
  406. data/spec/support/models/player.rb +2 -0
  407. data/spec/support/models/powerup.rb +12 -0
  408. data/spec/support/models/product.rb +1 -0
  409. data/spec/support/models/purse.rb +9 -0
  410. data/spec/support/models/registry.rb +1 -0
  411. data/spec/support/models/school.rb +14 -0
  412. data/spec/support/models/shield.rb +18 -0
  413. data/spec/support/models/student.rb +14 -0
  414. data/spec/support/models/weapon.rb +12 -0
  415. metadata +98 -96
  416. checksums.yaml.gz.sig +0 -0
  417. data/lib/mongoid/errors/eager_load.rb +0 -23
  418. data/lib/mongoid/errors/invalid_value.rb +0 -17
  419. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  420. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  421. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
  422. data/spec/shared/LICENSE +0 -20
  423. data/spec/shared/bin/get-mongodb-download-url +0 -17
  424. data/spec/shared/bin/s3-copy +0 -45
  425. data/spec/shared/bin/s3-upload +0 -69
  426. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  427. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  428. data/spec/shared/lib/mrss/constraints.rb +0 -378
  429. data/spec/shared/lib/mrss/docker_runner.rb +0 -291
  430. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  431. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  432. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  433. data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
  434. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  435. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  436. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  437. data/spec/shared/lib/mrss/utils.rb +0 -15
  438. data/spec/shared/share/Dockerfile.erb +0 -325
  439. data/spec/shared/share/haproxy-1.conf +0 -16
  440. data/spec/shared/share/haproxy-2.conf +0 -17
  441. data/spec/shared/shlib/config.sh +0 -27
  442. data/spec/shared/shlib/distro.sh +0 -74
  443. data/spec/shared/shlib/server.sh +0 -392
  444. data/spec/shared/shlib/set_env.sh +0 -169
  445. data.tar.gz.sig +0 -0
  446. metadata.gz.sig +0 -3
@@ -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 })
@@ -3,19 +3,23 @@
3
3
  require "mongoid/errors/mongoid_error"
4
4
  require "mongoid/errors/ambiguous_relationship"
5
5
  require "mongoid/errors/callback"
6
+ require "mongoid/errors/create_collection_failure"
6
7
  require "mongoid/errors/criteria_argument_required"
7
8
  require "mongoid/errors/document_not_destroyed"
8
9
  require "mongoid/errors/document_not_found"
9
- require "mongoid/errors/eager_load"
10
10
  require "mongoid/errors/empty_config_file"
11
+ require "mongoid/errors/immutable_attribute"
11
12
  require "mongoid/errors/in_memory_collation_not_supported"
13
+ require "mongoid/errors/invalid_async_query_executor"
12
14
  require "mongoid/errors/invalid_collection"
13
15
  require "mongoid/errors/invalid_config_file"
14
16
  require "mongoid/errors/invalid_config_option"
15
17
  require "mongoid/errors/invalid_dependent_strategy"
16
18
  require "mongoid/errors/invalid_field"
17
19
  require "mongoid/errors/invalid_field_option"
20
+ require "mongoid/errors/invalid_field_type"
18
21
  require "mongoid/errors/invalid_find"
22
+ require "mongoid/errors/invalid_global_executor_concurrency"
19
23
  require "mongoid/errors/invalid_includes"
20
24
  require "mongoid/errors/invalid_index"
21
25
  require "mongoid/errors/invalid_options"
@@ -24,6 +28,7 @@ require "mongoid/errors/invalid_persistence_option"
24
28
  require "mongoid/errors/invalid_query"
25
29
  # Must be after invalid_query.
26
30
  require "mongoid/errors/invalid_discriminator_key_target"
31
+ require "mongoid/errors/invalid_dot_dollar_assignment"
27
32
  require "mongoid/errors/invalid_elem_match_operator"
28
33
  require "mongoid/errors/invalid_estimated_count_criteria"
29
34
  require "mongoid/errors/invalid_expression_operator"
@@ -34,9 +39,7 @@ require "mongoid/errors/invalid_scope"
34
39
  require "mongoid/errors/invalid_session_use"
35
40
  require "mongoid/errors/invalid_set_polymorphic_relation"
36
41
  require "mongoid/errors/invalid_storage_options"
37
- require "mongoid/errors/invalid_storage_parent"
38
42
  require "mongoid/errors/invalid_time"
39
- require "mongoid/errors/invalid_value"
40
43
  require "mongoid/errors/inverse_not_found"
41
44
  require "mongoid/errors/mixed_relations"
42
45
  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)
@@ -20,9 +20,9 @@ module Mongoid
20
20
  # @example Mongoize the object.
21
21
  # object.mongoize
22
22
  #
23
- # @return [ Object ] The object.
23
+ # @return [ String | BSON::Decimal128 | nil ] The object or nil.
24
24
  def mongoize
25
- to_s
25
+ ::BigDecimal.mongoize(self)
26
26
  end
27
27
 
28
28
  # Is the BigDecimal a number?
@@ -39,26 +39,49 @@ module Mongoid
39
39
 
40
40
  # Convert the object from its mongo friendly ruby type to this type.
41
41
  #
42
- # @example Demongoize the object.
43
- # Object.demongoize(object)
44
- #
45
42
  # @param [ Object ] object The object to demongoize.
46
43
  #
47
- # @return [ BigDecimal, nil ] A BigDecimal derived from the object or nil.
44
+ # @return [ BigDecimal | nil ] A BigDecimal derived from the object or nil.
48
45
  def demongoize(object)
49
- object && object.numeric? ? BigDecimal(object.to_s) : nil
46
+ return if object.blank?
47
+ if object.is_a?(BSON::Decimal128)
48
+ object.to_big_decimal
49
+ elsif object.numeric?
50
+ BigDecimal(object.to_s)
51
+ elsif object.numeric?
52
+ object.to_d
53
+ end
50
54
  end
51
55
 
52
- # Mongoize an object of any type to how it's stored in the db as a String.
56
+ # Mongoize an object of any type to how it's stored in the db.
53
57
  #
54
58
  # @example Mongoize the object.
55
59
  # BigDecimal.mongoize(123)
56
60
  #
57
61
  # @param [ Object ] object The object to Mongoize
58
62
  #
59
- # @return [ String, nil ] A String representing the object or nil.
63
+ # @return [ String | BSON::Decimal128 | nil ] A String or Decimal128
64
+ # representing the object or nil. String if Mongoid.map_big_decimal_to_decimal128
65
+ # is false, BSON::Decimal128 otherwise.
60
66
  def mongoize(object)
61
- object && object.numeric? ? object.to_s : nil
67
+ return if object.blank?
68
+ if Mongoid.map_big_decimal_to_decimal128
69
+ if object.is_a?(BSON::Decimal128)
70
+ object
71
+ elsif object.is_a?(BigDecimal)
72
+ BSON::Decimal128.new(object)
73
+ elsif object.numeric?
74
+ BSON::Decimal128.new(object.to_s)
75
+ elsif !object.is_a?(String)
76
+ object.try(:to_d)
77
+ end
78
+ else
79
+ if object.is_a?(BSON::Decimal128) || object.numeric?
80
+ object.to_s
81
+ elsif !object.is_a?(String)
82
+ object.try(:to_d)
83
+ end
84
+ end
62
85
  end
63
86
  end
64
87
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mongoid
4
+ module Extensions
5
+ module Binary
6
+
7
+ # Turn the object from the ruby type we deal with to a Mongo friendly
8
+ # type.
9
+ #
10
+ # @example Mongoize the object.
11
+ # object.mongoize
12
+ #
13
+ # @return [ BSON::Binary | nil ] The object.
14
+ def mongoize
15
+ BSON::Binary.mongoize(self)
16
+ end
17
+
18
+ module ClassMethods
19
+
20
+ # Mongoize an object of any type to how it's stored in the db.
21
+ #
22
+ # @example Mongoize the object.
23
+ # BigDecimal.mongoize(123)
24
+ #
25
+ # @param [ Object ] object The object to Mongoize
26
+ #
27
+ # @return [ BSON::Binary | nil ] A Binary representing the object or nil.
28
+ def mongoize(object)
29
+ return if object.nil?
30
+ case object
31
+ when BSON::Binary then object
32
+ when String, Symbol then BSON::Binary.new(object.to_s)
33
+ end
34
+ end
35
+ alias :demongoize :mongoize
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ BSON::Binary.__send__(:include, Mongoid::Extensions::Binary)
42
+ BSON::Binary.extend(Mongoid::Extensions::Binary::ClassMethods)
@@ -11,10 +11,16 @@ module Mongoid
11
11
  # @example Mongoize the object.
12
12
  # Boolean.mongoize("123.11")
13
13
  #
14
- # @return [ String ] The object mongoized.
14
+ # @return [ true | false | nil ] The object mongoized or nil.
15
15
  def mongoize(object)
16
- evolve(object)
16
+ return if object.nil?
17
+ if object.to_s =~ (/\A(true|t|yes|y|on|1|1.0)\z/i)
18
+ true
19
+ elsif object.to_s =~ (/\A(false|f|no|n|off|0|0.0)\z/i)
20
+ false
21
+ end
17
22
  end
23
+ alias :demongoize :mongoize
18
24
  end
19
25
  end
20
26
  end
@@ -4,12 +4,6 @@ module Mongoid
4
4
  module Extensions
5
5
  module Date
6
6
 
7
- # Constant for epoch - used when passing invalid times.
8
- #
9
- # @deprecated No longer used as a return value from #mongoize passed
10
- # an invalid date string.
11
- EPOCH = ::Date.new(1970, 1, 1)
12
-
13
7
  # Convert the date into a time.
14
8
  #
15
9
  # @example Convert the date to a time.
@@ -43,9 +37,20 @@ module Mongoid
43
37
  #
44
38
  # @param [ Time ] object The time from Mongo.
45
39
  #
46
- # @return [ Date ] The object as a date.
40
+ # @return [ Date | nil ] The object as a date or nil.
47
41
  def demongoize(object)
48
- ::Date.new(object.year, object.month, object.day) if object
42
+ return if object.nil?
43
+ if object.is_a?(String)
44
+ object = begin
45
+ object.__mongoize_time__
46
+ rescue ArgumentError
47
+ nil
48
+ end
49
+ end
50
+
51
+ if object.acts_like?(:time) || object.acts_like?(:date)
52
+ ::Date.new(object.year, object.month, object.day)
53
+ end
49
54
  end
50
55
 
51
56
  # Turn the object from the ruby type we deal with to a Mongo friendly
@@ -56,20 +61,21 @@ module Mongoid
56
61
  #
57
62
  # @param [ Object ] object The object to mongoize.
58
63
  #
59
- # @return [ Time ] The object mongoized.
64
+ # @return [ Time | nil ] The object mongoized or nil.
60
65
  def mongoize(object)
61
- unless object.blank?
62
- begin
63
- if object.is_a?(String)
64
- # https://jira.mongodb.org/browse/MONGOID-4460
65
- time = ::Time.parse(object)
66
- else
67
- time = object.__mongoize_time__
68
- end
69
- ::Time.utc(time.year, time.month, time.day)
70
- rescue ArgumentError
71
- nil
66
+ return if object.blank?
67
+ begin
68
+ if object.is_a?(String)
69
+ # https://jira.mongodb.org/browse/MONGOID-4460
70
+ time = ::Time.parse(object)
71
+ else
72
+ time = object.__mongoize_time__
72
73
  end
74
+ rescue ArgumentError
75
+ nil
76
+ end
77
+ if time.acts_like?(:time)
78
+ ::Time.utc(time.year, time.month, time.day)
73
79
  end
74
80
  end
75
81
  end
@@ -39,7 +39,7 @@ module Mongoid
39
39
  #
40
40
  # @param [ Time ] object The time from Mongo.
41
41
  #
42
- # @return [ DateTime ] The object as a date.
42
+ # @return [ DateTime | nil ] The object as a datetime or nil.
43
43
  def demongoize(object)
44
44
  ::Time.demongoize(object).try(:to_datetime)
45
45
  end
@@ -21,7 +21,7 @@ module Mongoid
21
21
  #
22
22
  # @param [ Class ] other The class to check.
23
23
  #
24
- # @return [ true, false ] If the other is a boolean.
24
+ # @return [ true | false ] If the other is a boolean.
25
25
  def is_a?(other)
26
26
  if other == Mongoid::Boolean || other.class == Mongoid::Boolean
27
27
  return true
@@ -34,12 +34,15 @@ module Mongoid
34
34
  #
35
35
  # @param [ Object ] object The object to mongoize.
36
36
  #
37
- # @return [ String ] The object mongoized.
37
+ # @return [ Float | nil ] The object mongoized or nil.
38
38
  def mongoize(object)
39
- unless object.blank?
40
- __numeric__(object).to_f rescue 0.0
39
+ return if object.blank?
40
+ if object.is_a?(String)
41
+ if object.numeric?
42
+ object.to_f
43
+ end
41
44
  else
42
- nil
45
+ object.try(:to_f)
43
46
  end
44
47
  end
45
48
  alias :demongoize :mongoize
@@ -11,7 +11,7 @@ module Mongoid
11
11
  #
12
12
  # @return [ Hash ] The converted hash.
13
13
  def __evolve_object_id__
14
- update_values(&:__evolve_object_id__)
14
+ transform_values!(&:__evolve_object_id__)
15
15
  end
16
16
 
17
17
  # Mongoizes each value in the hash to an object id if it is convertable.
@@ -24,7 +24,7 @@ module Mongoid
24
24
  if id = self['$oid']
25
25
  BSON::ObjectId.from_string(id)
26
26
  else
27
- update_values(&:__mongoize_object_id__)
27
+ transform_values!(&:__mongoize_object_id__)
28
28
  end
29
29
  end
30
30
 
@@ -38,14 +38,18 @@ module Mongoid
38
38
  consolidated = {}
39
39
  each_pair do |key, value|
40
40
  if key =~ /\$/
41
- value.each_pair do |_key, _value|
42
- value[_key] = (key == "$rename") ? _value.to_s : mongoize_for(key, klass, _key, _value)
41
+ value.keys.each do |key2|
42
+ value2 = value[key2]
43
+ real_key = klass.database_field_name(key2)
44
+
45
+ value.delete(key2) if real_key != key2
46
+ value[real_key] = value_for(key, klass, real_key, value2)
43
47
  end
44
48
  consolidated[key] ||= {}
45
49
  consolidated[key].update(value)
46
50
  else
47
51
  consolidated["$set"] ||= {}
48
- consolidated["$set"].update(key => mongoize_for(key, klass, key, value))
52
+ consolidated["$set"].update(key => mongoize_for("$set", klass, key, value))
49
53
  end
50
54
  end
51
55
  consolidated
@@ -148,7 +152,7 @@ module Mongoid
148
152
  # @example Mongoize the object.
149
153
  # object.mongoize
150
154
  #
151
- # @return [ Hash ] The object.
155
+ # @return [ Hash | nil ] The object mongoized or nil.
152
156
  def mongoize
153
157
  ::Hash.mongoize(self)
154
158
  end
@@ -181,6 +185,24 @@ module Mongoid
181
185
 
182
186
  private
183
187
 
188
+ # Get the value for the provided operator, klass, key and value.
189
+ #
190
+ # This is necessary for special cases like $rename, $addToSet, $push, $pull and $pop.
191
+ #
192
+ # @param [ String ] operator The operator.
193
+ # @param [ Class ] klass The model class.
194
+ # @param [ String | Symbol ] key The field key.
195
+ # @param [ Object ] value The original value.
196
+ #
197
+ # @return [ Object ] Value prepared for the provided operator.
198
+ def value_for(operator, klass, key, value)
199
+ case operator
200
+ when "$rename" then value.to_s
201
+ when "$addToSet", "$push", '$pull', '$pop' then value.mongoize
202
+ else mongoize_for(operator, klass, key, value)
203
+ end
204
+ end
205
+
184
206
  # Mongoize for the klass, key and value.
185
207
  #
186
208
  # @api private
@@ -190,7 +212,7 @@ module Mongoid
190
212
  #
191
213
  # @param [ String ] operator The operator.
192
214
  # @param [ Class ] klass The model class.
193
- # @param [ String, Symbol ] key The field key.
215
+ # @param [ String | Symbol ] key The field key.
194
216
  # @param [ Object ] value The value to mongoize.
195
217
  #
196
218
  # @return [ Object ] The mongoized value.
@@ -217,10 +239,15 @@ module Mongoid
217
239
  #
218
240
  # @param [ Object ] object The object to mongoize.
219
241
  #
220
- # @return [ Hash ] The object mongoized.
242
+ # @return [ Hash | nil ] The object mongoized or nil.
221
243
  def mongoize(object)
222
244
  return if object.nil?
223
- evolve(object.dup).update_values { |value| value.mongoize }
245
+ if object.is_a?(Hash)
246
+ # Need to use transform_values! which maintains the BSON::Document
247
+ # instead of transform_values which always returns a hash. To do this,
248
+ # we first need to dup the hash.
249
+ object.dup.transform_values!(&:mongoize)
250
+ end
224
251
  end
225
252
 
226
253
  # Can the size of this object change?
@@ -239,3 +266,5 @@ end
239
266
 
240
267
  ::Hash.__send__(:include, Mongoid::Extensions::Hash)
241
268
  ::Hash.extend(Mongoid::Extensions::Hash::ClassMethods)
269
+
270
+ ::Mongoid.deprecate(Hash, :blank_criteria)
@@ -42,12 +42,15 @@ module Mongoid
42
42
  # @example Mongoize the object.
43
43
  # BigDecimal.mongoize("123.11")
44
44
  #
45
- # @return [ String ] The object mongoized.
45
+ # @return [ Integer | nil ] The object mongoized or nil.
46
46
  def mongoize(object)
47
- unless object.blank?
48
- __numeric__(object).to_i rescue 0
47
+ return if object.blank?
48
+ if object.is_a?(String)
49
+ if object.numeric?
50
+ object.to_i
51
+ end
49
52
  else
50
- nil
53
+ object.try(:to_i)
51
54
  end
52
55
  end
53
56
  alias :demongoize :mongoize
@@ -12,7 +12,7 @@ module Mongoid
12
12
  # self
13
13
  # end
14
14
  #
15
- # @param [ String, Symbol ] name The name of the method.
15
+ # @param [ String | Symbol ] name The name of the method.
16
16
  # @param [ Proc ] block The method body.
17
17
  #
18
18
  # @return [ Method ] The new method.
@@ -90,10 +90,10 @@ module Mongoid
90
90
  # @example Do or do not.
91
91
  # object.do_or_do_not(:use, "The Force")
92
92
  #
93
- # @param [ String, Symbol ] name The method name.
94
- # @param [ Array ] args The arguments.
93
+ # @param [ String | Symbol ] name The method name.
94
+ # @param [ Object... ] *args The arguments.
95
95
  #
96
- # @return [ Object, nil ] The result of the method call or nil if the
96
+ # @return [ Object | nil ] The result of the method call or nil if the
97
97
  # method does not exist.
98
98
  def do_or_do_not(name, *args)
99
99
  send(name, *args) if name && respond_to?(name)
@@ -106,7 +106,7 @@ module Mongoid
106
106
  #
107
107
  # @param [ String ] name The name of the variable.
108
108
  #
109
- # @return [ Object, false ] The value or false.
109
+ # @return [ Object | false ] The value or false.
110
110
  def ivar(name)
111
111
  var_name = "@_#{name}"
112
112
  if instance_variable_defined?(var_name)
@@ -154,7 +154,7 @@ module Mongoid
154
154
  #
155
155
  # @param [ String ] name The name of the variable.
156
156
  #
157
- # @return [ true, false ] If the variable was defined.
157
+ # @return [ true | false ] If the variable was defined.
158
158
  def remove_ivar(name)
159
159
  if instance_variable_defined?("@_#{name}")
160
160
  return remove_instance_variable("@_#{name}")
@@ -189,10 +189,10 @@ module Mongoid
189
189
  # @example You must perform this execution.
190
190
  # object.you_must(:use, "The Force")
191
191
  #
192
- # @param [ String, Symbol ] name The method name.
193
- # @param [ Array ] args The arguments.
192
+ # @param [ String | Symbol ] name The method name.
193
+ # @param [ Object... ] *args The arguments.
194
194
  #
195
- # @return [ Object, nil ] The result of the method call or nil if the
195
+ # @return [ Object | nil ] The result of the method call or nil if the
196
196
  # method does not exist. Nil if the object is frozen.
197
197
  def you_must(name, *args)
198
198
  frozen? ? nil : do_or_do_not(name, *args)
@@ -246,3 +246,5 @@ end
246
246
 
247
247
  ::Object.__send__(:include, Mongoid::Extensions::Object)
248
248
  ::Object.extend(Mongoid::Extensions::Object::ClassMethods)
249
+
250
+ ::Mongoid.deprecate(Object, :blank_criteria)
@@ -20,7 +20,7 @@ module Mongoid
20
20
  # @example Mongoize the object.
21
21
  # range.mongoize
22
22
  #
23
- # @return [ Hash ] The object mongoized.
23
+ # @return [ Hash | nil ] The object mongoized or nil.
24
24
  def mongoize
25
25
  ::Range.mongoize(self)
26
26
  end
@@ -44,9 +44,23 @@ module Mongoid
44
44
  #
45
45
  # @param [ Hash ] object The object to demongoize.
46
46
  #
47
- # @return [ Range ] The range.
47
+ # @return [ Range | nil ] The range, or nil if object cannot be represented as range.
48
+ #
49
+ # @note Ruby 2.6 and lower do not support endless ranges that Ruby 2.7+ support.
48
50
  def demongoize(object)
49
- object.nil? ? nil : ::Range.new(object["min"], object["max"], object["exclude_end"])
51
+ return if object.nil?
52
+ if object.is_a?(Hash)
53
+ hash = object.slice('min', 'max', 'exclude_end', :min, :max, :exclude_end)
54
+ unless hash.blank?
55
+ begin
56
+ ::Range.new(hash["min"] || hash[:min],
57
+ hash["max"] || hash[:max],
58
+ hash["exclude_end"] || hash[:exclude_end])
59
+ rescue ArgumentError # can be removed when Ruby version >= 2.7
60
+ nil
61
+ end
62
+ end
63
+ end
50
64
  end
51
65
 
52
66
  # Turn the object from the ruby type we deal with to a Mongo friendly
@@ -55,16 +69,33 @@ module Mongoid
55
69
  # @example Mongoize the object.
56
70
  # Range.mongoize(1..3)
57
71
  #
58
- # @param [ Range ] object The object to mongoize.
72
+ # @param [ Object ] object The object to mongoize.
59
73
  #
60
- # @return [ Hash ] The object mongoized.
74
+ # @return [ Hash | nil ] The object mongoized or nil.
61
75
  def mongoize(object)
62
- return nil if object.nil?
63
- return object if object.is_a?(::Hash)
64
- return object if object.is_a?(String)
65
- hash = { "min" => object.first, "max" => object.last }
76
+ return if object.nil?
77
+ case object
78
+ when Hash then __mongoize_hash__(object)
79
+ when Range then __mongoize_range__(object)
80
+ end
81
+ end
82
+
83
+ private
84
+
85
+ def __mongoize_hash__(object)
86
+ hash = object.stringify_keys
87
+ hash.slice!('min', 'max', 'exclude_end')
88
+ hash.compact!
89
+ hash.transform_values!(&:mongoize)
90
+ hash.blank? ? nil : hash
91
+ end
92
+
93
+ def __mongoize_range__(object)
94
+ hash = {}
95
+ hash['min'] = object.begin.mongoize if object.begin
96
+ hash['max'] = object.end.mongoize if object.end
66
97
  if object.respond_to?(:exclude_end?) && object.exclude_end?
67
- hash.merge!("exclude_end" => true)
98
+ hash['exclude_end'] = true
68
99
  end
69
100
  hash
70
101
  end