mongoid 7.5.4 → 8.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (442) 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 +29 -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 +3 -3
  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 +47 -38
  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 +127 -35
  121. data/lib/mongoid/equality.rb +8 -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 +186 -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 +33 -13
  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 +10 -6
  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 +1 -1
  203. data/lib/mongoid/timestamps/updated.rb +2 -2
  204. data/lib/mongoid/touchable.rb +3 -4
  205. data/lib/mongoid/traversable.rb +5 -4
  206. data/lib/mongoid/utils.rb +22 -0
  207. data/lib/mongoid/validatable/associated.rb +96 -18
  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 +13 -16
  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 +2 -1
  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 +15 -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/atomic/paths_spec.rb +0 -14
  269. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  270. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  271. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  272. data/spec/mongoid/attributes_spec.rb +526 -33
  273. data/spec/mongoid/changeable_spec.rb +429 -37
  274. data/spec/mongoid/clients/factory_spec.rb +23 -30
  275. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  276. data/spec/mongoid/clients_spec.rb +149 -15
  277. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  278. data/spec/mongoid/config/defaults_spec.rb +160 -0
  279. data/spec/mongoid/config_spec.rb +214 -31
  280. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  281. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  282. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  283. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  284. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  285. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  286. data/spec/mongoid/contextual/mongo_spec.rb +2256 -1005
  287. data/spec/mongoid/contextual/none_spec.rb +60 -21
  288. data/spec/mongoid/copyable_spec.rb +453 -11
  289. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  290. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  291. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  292. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  293. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  294. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  295. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  296. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  297. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  298. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  299. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  300. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  301. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  302. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  303. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  304. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  305. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  306. data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
  307. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
  308. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  309. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  310. data/spec/mongoid/criteria_spec.rb +469 -1205
  311. data/spec/mongoid/document_fields_spec.rb +173 -24
  312. data/spec/mongoid/document_spec.rb +32 -41
  313. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  314. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  315. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  316. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  317. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  318. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  319. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  320. data/spec/mongoid/extensions/array_spec.rb +16 -2
  321. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  322. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  323. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  324. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  325. data/spec/mongoid/extensions/date_spec.rb +71 -1
  326. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  327. data/spec/mongoid/extensions/float_spec.rb +53 -74
  328. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  329. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  330. data/spec/mongoid/extensions/range_spec.rb +255 -54
  331. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  332. data/spec/mongoid/extensions/set_spec.rb +106 -0
  333. data/spec/mongoid/extensions/string_spec.rb +53 -25
  334. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  335. data/spec/mongoid/extensions/time_spec.rb +639 -106
  336. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  337. data/spec/mongoid/factory_spec.rb +61 -1
  338. data/spec/mongoid/fields/localized_spec.rb +80 -37
  339. data/spec/mongoid/fields_spec.rb +503 -87
  340. data/spec/mongoid/findable_spec.rb +450 -58
  341. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  342. data/spec/mongoid/indexable_spec.rb +55 -30
  343. data/spec/mongoid/interceptable_spec.rb +824 -22
  344. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  345. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  346. data/spec/mongoid/mongoizable_spec.rb +285 -0
  347. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  348. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  349. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  350. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  351. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  352. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  353. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  354. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  355. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  356. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  357. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  358. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  359. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  360. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  361. data/spec/mongoid/persistence_context_spec.rb +31 -57
  362. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  363. data/spec/mongoid/query_cache_spec.rb +56 -215
  364. data/spec/mongoid/reloadable_spec.rb +83 -6
  365. data/spec/mongoid/scopable_spec.rb +91 -1
  366. data/spec/mongoid/serializable_spec.rb +25 -39
  367. data/spec/mongoid/shardable_spec.rb +4 -4
  368. data/spec/mongoid/stateful_spec.rb +150 -8
  369. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  370. data/spec/mongoid/tasks/database_spec.rb +127 -0
  371. data/spec/mongoid/timestamps_spec.rb +392 -4
  372. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  373. data/spec/mongoid/touchable_spec.rb +390 -2
  374. data/spec/mongoid/touchable_spec_models.rb +14 -8
  375. data/spec/mongoid/traversable_spec.rb +13 -35
  376. data/spec/mongoid/validatable/associated_spec.rb +13 -30
  377. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  378. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  379. data/spec/mongoid/warnings_spec.rb +35 -0
  380. data/spec/mongoid_spec.rb +34 -16
  381. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  382. data/spec/rails/mongoid_spec.rb +4 -16
  383. data/spec/spec_helper.rb +5 -0
  384. data/spec/support/constraints.rb +24 -0
  385. data/spec/support/immutable_ids.rb +118 -0
  386. data/spec/support/macros.rb +78 -0
  387. data/spec/support/models/artist.rb +0 -1
  388. data/spec/support/models/augmentation.rb +12 -0
  389. data/spec/support/models/band.rb +5 -0
  390. data/spec/support/models/book.rb +1 -0
  391. data/spec/support/models/building.rb +2 -0
  392. data/spec/support/models/catalog.rb +24 -0
  393. data/spec/support/models/circus.rb +3 -0
  394. data/spec/support/models/cover.rb +10 -0
  395. data/spec/support/models/fanatic.rb +8 -0
  396. data/spec/support/models/implant.rb +9 -0
  397. data/spec/support/models/label.rb +2 -0
  398. data/spec/support/models/lat_lng.rb +6 -0
  399. data/spec/support/models/name.rb +10 -0
  400. data/spec/support/models/passport.rb +9 -0
  401. data/spec/support/models/person.rb +2 -0
  402. data/spec/support/models/player.rb +2 -0
  403. data/spec/support/models/powerup.rb +12 -0
  404. data/spec/support/models/product.rb +1 -0
  405. data/spec/support/models/purse.rb +9 -0
  406. data/spec/support/models/registry.rb +1 -0
  407. data/spec/support/models/school.rb +14 -0
  408. data/spec/support/models/shield.rb +18 -0
  409. data/spec/support/models/student.rb +14 -0
  410. data/spec/support/models/weapon.rb +12 -0
  411. metadata +101 -96
  412. checksums.yaml.gz.sig +0 -0
  413. data/lib/mongoid/errors/eager_load.rb +0 -23
  414. data/lib/mongoid/errors/invalid_value.rb +0 -17
  415. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  416. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  417. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
  418. data/spec/shared/LICENSE +0 -20
  419. data/spec/shared/bin/get-mongodb-download-url +0 -17
  420. data/spec/shared/bin/s3-copy +0 -45
  421. data/spec/shared/bin/s3-upload +0 -69
  422. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  423. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  424. data/spec/shared/lib/mrss/constraints.rb +0 -378
  425. data/spec/shared/lib/mrss/docker_runner.rb +0 -291
  426. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  427. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  428. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  429. data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
  430. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  431. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  432. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  433. data/spec/shared/lib/mrss/utils.rb +0 -15
  434. data/spec/shared/share/Dockerfile.erb +0 -325
  435. data/spec/shared/share/haproxy-1.conf +0 -16
  436. data/spec/shared/share/haproxy-2.conf +0 -17
  437. data/spec/shared/shlib/config.sh +0 -27
  438. data/spec/shared/shlib/distro.sh +0 -74
  439. data/spec/shared/shlib/server.sh +0 -392
  440. data/spec/shared/shlib/set_env.sh +0 -169
  441. data.tar.gz.sig +0 -0
  442. metadata.gz.sig +0 -3
@@ -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
@@ -12,13 +12,20 @@ module Mongoid
12
12
  # @example Mongoize the object.
13
13
  # Regexp.mongoize(/\A[abc]/)
14
14
  #
15
- # @param [ Regexp, String ] object The object to mongoize.
15
+ # @param [ Object ] object The object to mongoize.
16
16
  #
17
- # @return [ Regexp ] The object mongoized.
17
+ # @return [ Regexp | nil ] The object mongoized or nil.
18
18
  def mongoize(object)
19
- return nil if object.nil?
20
- ::Regexp.new(object)
19
+ return if object.nil?
20
+ case object
21
+ when String then ::Regexp.new(object)
22
+ when ::Regexp then object
23
+ when BSON::Regexp::Raw then object.compile
24
+ end
25
+ rescue RegexpError
26
+ nil
21
27
  end
28
+ alias :demongoize :mongoize
22
29
  end
23
30
  end
24
31
  end