mongoid 7.4.0 → 8.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (391) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/lib/config/locales/en.yml +52 -28
  5. data/lib/mongoid/association/accessors.rb +38 -9
  6. data/lib/mongoid/association/bindable.rb +50 -2
  7. data/lib/mongoid/association/builders.rb +4 -2
  8. data/lib/mongoid/association/constrainable.rb +0 -1
  9. data/lib/mongoid/association/eager_loadable.rb +29 -7
  10. data/lib/mongoid/association/embedded/batchable.rb +53 -13
  11. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  12. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  13. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -2
  14. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  15. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  16. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  17. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +50 -28
  18. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  19. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  20. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +23 -4
  21. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  22. data/lib/mongoid/association/macros.rb +22 -1
  23. data/lib/mongoid/association/many.rb +11 -7
  24. data/lib/mongoid/association/nested/many.rb +5 -4
  25. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  26. data/lib/mongoid/association/nested/one.rb +5 -5
  27. data/lib/mongoid/association/one.rb +2 -2
  28. data/lib/mongoid/association/options.rb +9 -9
  29. data/lib/mongoid/association/proxy.rb +14 -3
  30. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  31. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  32. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  33. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  34. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  35. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  36. data/lib/mongoid/association/referenced/eager.rb +2 -2
  37. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +66 -13
  38. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  39. data/lib/mongoid/association/referenced/has_many/enumerable.rb +20 -24
  40. data/lib/mongoid/association/referenced/has_many/proxy.rb +24 -18
  41. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  42. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  43. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  44. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  45. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  46. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  47. data/lib/mongoid/association/reflections.rb +2 -2
  48. data/lib/mongoid/association/relatable.rb +44 -10
  49. data/lib/mongoid/association.rb +5 -5
  50. data/lib/mongoid/atomic/modifiers.rb +2 -2
  51. data/lib/mongoid/atomic/paths/embedded/many.rb +19 -0
  52. data/lib/mongoid/attributes/dynamic.rb +3 -3
  53. data/lib/mongoid/attributes/nested.rb +5 -5
  54. data/lib/mongoid/attributes/processing.rb +10 -3
  55. data/lib/mongoid/attributes/projector.rb +1 -1
  56. data/lib/mongoid/attributes/readonly.rb +2 -2
  57. data/lib/mongoid/attributes.rb +43 -40
  58. data/lib/mongoid/cacheable.rb +2 -2
  59. data/lib/mongoid/changeable.rb +42 -7
  60. data/lib/mongoid/clients/options.rb +5 -1
  61. data/lib/mongoid/clients/sessions.rb +2 -14
  62. data/lib/mongoid/clients/validators/storage.rb +3 -3
  63. data/lib/mongoid/config/environment.rb +20 -4
  64. data/lib/mongoid/config/validators/client.rb +6 -6
  65. data/lib/mongoid/config.rb +32 -17
  66. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  67. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  68. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  69. data/lib/mongoid/contextual/atomic.rb +1 -1
  70. data/lib/mongoid/contextual/geo_near.rb +7 -7
  71. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  72. data/lib/mongoid/contextual/memory.rb +180 -21
  73. data/lib/mongoid/contextual/mongo.rb +237 -217
  74. data/lib/mongoid/contextual/none.rb +67 -5
  75. data/lib/mongoid/contextual/queryable.rb +1 -1
  76. data/lib/mongoid/contextual.rb +2 -2
  77. data/lib/mongoid/copyable.rb +32 -8
  78. data/lib/mongoid/criteria/findable.rb +7 -4
  79. data/lib/mongoid/criteria/includable.rb +24 -20
  80. data/lib/mongoid/criteria/marshalable.rb +10 -2
  81. data/lib/mongoid/criteria/permission.rb +1 -1
  82. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  83. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -13
  84. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  85. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  86. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  87. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  88. data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -14
  89. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  90. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  91. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  92. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  93. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  94. data/lib/mongoid/criteria/queryable/extensions/string.rb +3 -3
  95. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -2
  96. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  97. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  98. data/lib/mongoid/criteria/queryable/key.rb +3 -3
  99. data/lib/mongoid/criteria/queryable/mergeable.rb +21 -0
  100. data/lib/mongoid/criteria/queryable/optional.rb +5 -11
  101. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  102. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  103. data/lib/mongoid/criteria/queryable/selectable.rb +31 -37
  104. data/lib/mongoid/criteria/queryable/selector.rb +92 -7
  105. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  106. data/lib/mongoid/criteria/queryable.rb +12 -7
  107. data/lib/mongoid/criteria/scopable.rb +2 -2
  108. data/lib/mongoid/criteria.rb +15 -35
  109. data/lib/mongoid/deprecable.rb +36 -0
  110. data/lib/mongoid/deprecation.rb +25 -0
  111. data/lib/mongoid/document.rb +98 -34
  112. data/lib/mongoid/equality.rb +12 -12
  113. data/lib/mongoid/errors/document_not_found.rb +33 -12
  114. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  115. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  116. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  117. data/lib/mongoid/errors/invalid_field.rb +6 -2
  118. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  119. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  120. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  121. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  122. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  123. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  124. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  125. data/lib/mongoid/errors/no_client_database.rb +1 -1
  126. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  127. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  128. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  129. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  130. data/lib/mongoid/errors.rb +2 -2
  131. data/lib/mongoid/extensions/array.rb +9 -7
  132. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  133. data/lib/mongoid/extensions/binary.rb +42 -0
  134. data/lib/mongoid/extensions/boolean.rb +8 -2
  135. data/lib/mongoid/extensions/date.rb +26 -20
  136. data/lib/mongoid/extensions/date_time.rb +1 -1
  137. data/lib/mongoid/extensions/false_class.rb +1 -1
  138. data/lib/mongoid/extensions/float.rb +7 -4
  139. data/lib/mongoid/extensions/hash.rb +13 -6
  140. data/lib/mongoid/extensions/integer.rb +7 -4
  141. data/lib/mongoid/extensions/module.rb +1 -1
  142. data/lib/mongoid/extensions/object.rb +8 -6
  143. data/lib/mongoid/extensions/range.rb +41 -10
  144. data/lib/mongoid/extensions/regexp.rb +11 -4
  145. data/lib/mongoid/extensions/set.rb +11 -4
  146. data/lib/mongoid/extensions/string.rb +11 -22
  147. data/lib/mongoid/extensions/symbol.rb +4 -15
  148. data/lib/mongoid/extensions/time.rb +27 -16
  149. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  150. data/lib/mongoid/extensions/true_class.rb +1 -1
  151. data/lib/mongoid/extensions.rb +1 -0
  152. data/lib/mongoid/factory.rb +42 -7
  153. data/lib/mongoid/fields/foreign_key.rb +11 -4
  154. data/lib/mongoid/fields/localized.rb +9 -4
  155. data/lib/mongoid/fields/standard.rb +7 -7
  156. data/lib/mongoid/fields/validators/macro.rb +3 -9
  157. data/lib/mongoid/fields.rb +201 -35
  158. data/lib/mongoid/findable.rb +34 -13
  159. data/lib/mongoid/indexable/specification.rb +2 -2
  160. data/lib/mongoid/indexable/validators/options.rb +6 -2
  161. data/lib/mongoid/interceptable.rb +73 -13
  162. data/lib/mongoid/matchable.rb +1 -1
  163. data/lib/mongoid/matcher.rb +12 -7
  164. data/lib/mongoid/persistable/creatable.rb +18 -9
  165. data/lib/mongoid/persistable/deletable.rb +1 -1
  166. data/lib/mongoid/persistable/destroyable.rb +1 -1
  167. data/lib/mongoid/persistable/savable.rb +2 -2
  168. data/lib/mongoid/persistable/unsettable.rb +1 -1
  169. data/lib/mongoid/persistable/updatable.rb +19 -12
  170. data/lib/mongoid/persistable/upsertable.rb +2 -2
  171. data/lib/mongoid/persistable.rb +3 -3
  172. data/lib/mongoid/persistence_context.rb +63 -10
  173. data/lib/mongoid/query_cache.rb +8 -260
  174. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  175. data/lib/mongoid/reloadable.rb +7 -3
  176. data/lib/mongoid/scopable.rb +26 -22
  177. data/lib/mongoid/selectable.rb +1 -2
  178. data/lib/mongoid/serializable.rb +10 -6
  179. data/lib/mongoid/stateful.rb +35 -9
  180. data/lib/mongoid/tasks/database.rb +0 -2
  181. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  182. data/lib/mongoid/threaded.rb +12 -12
  183. data/lib/mongoid/timestamps/created.rb +1 -1
  184. data/lib/mongoid/timestamps/updated.rb +2 -2
  185. data/lib/mongoid/touchable.rb +2 -3
  186. data/lib/mongoid/traversable.rb +8 -4
  187. data/lib/mongoid/validatable/localizable.rb +1 -1
  188. data/lib/mongoid/validatable/macros.rb +0 -2
  189. data/lib/mongoid/validatable/presence.rb +2 -2
  190. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  191. data/lib/mongoid/validatable.rb +6 -6
  192. data/lib/mongoid/version.rb +1 -1
  193. data/lib/mongoid/warnings.rb +28 -0
  194. data/lib/mongoid.rb +2 -0
  195. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +11 -5
  196. data/spec/config/mongoid.yml +16 -0
  197. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  198. data/spec/integration/app_spec.rb +28 -26
  199. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  200. data/spec/integration/associations/embedded_dirty_spec.rb +28 -0
  201. data/spec/integration/associations/embedded_spec.rb +15 -0
  202. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  203. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  204. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  205. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  206. data/spec/integration/associations/has_one_spec.rb +97 -1
  207. data/spec/integration/associations/scope_option_spec.rb +1 -1
  208. data/spec/integration/callbacks_models.rb +95 -1
  209. data/spec/integration/callbacks_spec.rb +226 -4
  210. data/spec/integration/criteria/range_spec.rb +95 -1
  211. data/spec/integration/discriminator_key_spec.rb +115 -76
  212. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  213. data/spec/integration/i18n_fallbacks_spec.rb +1 -17
  214. data/spec/integration/matcher_examples_spec.rb +20 -13
  215. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  216. data/spec/integration/matcher_operator_spec.rb +3 -5
  217. data/spec/integration/persistence/range_field_spec.rb +350 -0
  218. data/spec/lite_spec_helper.rb +1 -1
  219. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  220. data/spec/mongoid/association/depending_spec.rb +9 -9
  221. data/spec/mongoid/association/eager_spec.rb +2 -1
  222. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  223. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  224. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  225. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  226. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +219 -8
  227. data/spec/mongoid/association/embedded/embeds_many_models.rb +157 -0
  228. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  229. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  230. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  231. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  232. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  233. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  234. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  235. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  236. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  237. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  238. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +67 -4
  239. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  240. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  241. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  242. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +8 -8
  243. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +82 -13
  244. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  245. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  246. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  247. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  248. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  249. data/spec/mongoid/association/syncable_spec.rb +14 -0
  250. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  251. data/spec/mongoid/atomic_spec.rb +22 -0
  252. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  253. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  254. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  255. data/spec/mongoid/attributes_spec.rb +524 -27
  256. data/spec/mongoid/cacheable_spec.rb +3 -3
  257. data/spec/mongoid/changeable_spec.rb +130 -13
  258. data/spec/mongoid/clients/factory_spec.rb +34 -42
  259. data/spec/mongoid/clients/options_spec.rb +1 -0
  260. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  261. data/spec/mongoid/clients_spec.rb +57 -2
  262. data/spec/mongoid/config/environment_spec.rb +39 -1
  263. data/spec/mongoid/config_spec.rb +104 -13
  264. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  265. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  266. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  267. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  268. data/spec/mongoid/contextual/memory_spec.rb +1336 -69
  269. data/spec/mongoid/contextual/mongo_spec.rb +1105 -174
  270. data/spec/mongoid/contextual/none_spec.rb +38 -0
  271. data/spec/mongoid/copyable_spec.rb +451 -1
  272. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  273. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  274. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  275. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  276. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  277. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  278. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  279. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  280. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  281. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  282. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  283. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  284. data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
  285. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  286. data/spec/mongoid/criteria/queryable/selectable_spec.rb +289 -124
  287. data/spec/mongoid/criteria/queryable/selector_spec.rb +14 -2
  288. data/spec/mongoid/criteria_projection_spec.rb +0 -1
  289. data/spec/mongoid/criteria_spec.rb +475 -1199
  290. data/spec/mongoid/document_fields_spec.rb +173 -24
  291. data/spec/mongoid/document_spec.rb +32 -41
  292. data/spec/mongoid/equality_spec.rb +12 -12
  293. data/spec/mongoid/errors/document_not_found_spec.rb +76 -0
  294. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  295. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  296. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  297. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  298. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  299. data/spec/mongoid/extensions/array_spec.rb +16 -2
  300. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  301. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  302. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  303. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  304. data/spec/mongoid/extensions/date_spec.rb +71 -1
  305. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  306. data/spec/mongoid/extensions/float_spec.rb +53 -74
  307. data/spec/mongoid/extensions/hash_spec.rb +30 -0
  308. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  309. data/spec/mongoid/extensions/range_spec.rb +255 -54
  310. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  311. data/spec/mongoid/extensions/set_spec.rb +106 -0
  312. data/spec/mongoid/extensions/string_spec.rb +53 -25
  313. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  314. data/spec/mongoid/extensions/time_spec.rb +634 -66
  315. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  316. data/spec/mongoid/factory_spec.rb +61 -1
  317. data/spec/mongoid/fields/localized_spec.rb +37 -12
  318. data/spec/mongoid/fields_spec.rb +321 -50
  319. data/spec/mongoid/findable_spec.rb +80 -15
  320. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  321. data/spec/mongoid/indexable_spec.rb +39 -20
  322. data/spec/mongoid/interceptable_spec.rb +584 -5
  323. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  324. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  325. data/spec/mongoid/mongoizable_spec.rb +285 -0
  326. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  327. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  328. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  329. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  330. data/spec/mongoid/persistence_context_spec.rb +50 -1
  331. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  332. data/spec/mongoid/query_cache_spec.rb +0 -154
  333. data/spec/mongoid/reloadable_spec.rb +35 -2
  334. data/spec/mongoid/scopable_spec.rb +54 -16
  335. data/spec/mongoid/shardable_spec.rb +14 -0
  336. data/spec/mongoid/stateful_spec.rb +28 -0
  337. data/spec/mongoid/timestamps_spec.rb +390 -0
  338. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  339. data/spec/mongoid/touchable_spec.rb +116 -0
  340. data/spec/mongoid/touchable_spec_models.rb +12 -8
  341. data/spec/mongoid/traversable_spec.rb +4 -11
  342. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  343. data/spec/mongoid/validatable/uniqueness_spec.rb +59 -31
  344. data/spec/mongoid/warnings_spec.rb +35 -0
  345. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  346. data/spec/rails/mongoid_spec.rb +4 -16
  347. data/spec/shared/lib/mrss/constraints.rb +8 -16
  348. data/spec/shared/lib/mrss/docker_runner.rb +23 -3
  349. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  350. data/spec/shared/lib/mrss/lite_constraints.rb +32 -1
  351. data/spec/shared/share/Dockerfile.erb +34 -48
  352. data/spec/shared/shlib/config.sh +27 -0
  353. data/spec/shared/shlib/server.sh +32 -19
  354. data/spec/shared/shlib/set_env.sh +37 -0
  355. data/spec/support/constraints.rb +24 -0
  356. data/spec/support/macros.rb +55 -0
  357. data/spec/support/models/augmentation.rb +12 -0
  358. data/spec/support/models/band.rb +3 -0
  359. data/spec/support/models/catalog.rb +24 -0
  360. data/spec/support/models/circus.rb +3 -0
  361. data/spec/support/models/code.rb +2 -0
  362. data/spec/support/models/fanatic.rb +8 -0
  363. data/spec/support/models/implant.rb +9 -0
  364. data/spec/support/models/label.rb +2 -0
  365. data/spec/support/models/membership.rb +1 -0
  366. data/spec/support/models/passport.rb +9 -0
  367. data/spec/support/models/person.rb +1 -0
  368. data/spec/support/models/player.rb +2 -0
  369. data/spec/support/models/powerup.rb +12 -0
  370. data/spec/support/models/registry.rb +1 -0
  371. data/spec/support/models/school.rb +14 -0
  372. data/spec/support/models/shield.rb +18 -0
  373. data/spec/support/models/student.rb +14 -0
  374. data/spec/support/models/weapon.rb +12 -0
  375. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  376. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  377. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  378. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  379. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  380. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  381. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  382. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  383. data/spec/support/schema_maps/schema_map_local.json +18 -0
  384. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  385. data/spec/support/spec_config.rb +4 -0
  386. data.tar.gz.sig +0 -0
  387. metadata +682 -619
  388. metadata.gz.sig +0 -0
  389. data/lib/mongoid/errors/eager_load.rb +0 -23
  390. data/lib/mongoid/errors/invalid_value.rb +0 -17
  391. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -40,7 +40,7 @@ module Mongoid
40
40
  #
41
41
  # @param [ Array ] other The other array.
42
42
  #
43
- # @return [ true, false ] If the objects are equal.
43
+ # @return [ true | false ] If the objects are equal.
44
44
  def ==(other)
45
45
  other.is_a?(None)
46
46
  end
@@ -50,7 +50,7 @@ module Mongoid
50
50
  # @example Get the distinct values in null context.
51
51
  # context.distinct(:name)
52
52
  #
53
- # @param [ String, Symbol ] _field The name of the field.
53
+ # @param [ String | Symbol ] _field The name of the field.
54
54
  #
55
55
  # @return [ Array ] An empty Array.
56
56
  def distinct(_field)
@@ -88,13 +88,37 @@ module Mongoid
88
88
  # @example Get the values for null context.
89
89
  # context.pluck(:name)
90
90
  #
91
- # @param [ String, Symbol, Array ] args Field or fields to pluck.
91
+ # @param [ String | Symbol ] *_fields Field(s) to pluck.
92
92
  #
93
93
  # @return [ Array ] An empty Array.
94
- def pluck(*args)
94
+ def pluck(*_fields)
95
95
  []
96
96
  end
97
97
 
98
+ # Pick the field values in null context.
99
+ #
100
+ # @example Get the value for null context.
101
+ # context.pick(:name)
102
+ #
103
+ # @param [ String | Symbol ] *_fields Field or fields to pick.
104
+ #
105
+ # @return [ nil ] Always reeturn nil.
106
+ def pick(*_fields)
107
+ nil
108
+ end
109
+
110
+ # Tally the field values in null context.
111
+ #
112
+ # @example Get the values for null context.
113
+ # context.tally(:name)
114
+ #
115
+ # @param [ String | Symbol ] _field Field to tally.
116
+ #
117
+ # @return [ Hash ] An empty Hash.
118
+ def tally(_field)
119
+ {}
120
+ end
121
+
98
122
  # Create the new null context.
99
123
  #
100
124
  # @example Create the new context.
@@ -105,13 +129,51 @@ module Mongoid
105
129
  @criteria, @klass = criteria, criteria.klass
106
130
  end
107
131
 
132
+ # Always returns nil.
133
+ #
134
+ # @example Get the first document in null context.
135
+ # context.first
136
+ #
137
+ # @param [ Integer ] limit The number of documents to return.
138
+ #
139
+ # @return [ nil ] Always nil.
140
+ def first(limit = nil)
141
+ [] unless limit.nil?
142
+ end
143
+
108
144
  # Always returns nil.
109
145
  #
110
146
  # @example Get the last document in null context.
111
147
  # context.last
112
148
  #
149
+ # @param [ Integer ] limit The number of documents to return.
150
+ #
113
151
  # @return [ nil ] Always nil.
114
- def last; nil; end
152
+ def last(limit = nil)
153
+ [] unless limit.nil?
154
+ end
155
+
156
+ # Returns nil or empty array.
157
+ #
158
+ # @example Take a document in null context.
159
+ # context.take
160
+ #
161
+ # @param [ Integer | nil ] limit The number of documents to take or nil.
162
+ #
163
+ # @return [ [] | nil ] Empty array or nil.
164
+ def take(limit = nil)
165
+ limit ? [] : nil
166
+ end
167
+
168
+ # Always raises an error.
169
+ #
170
+ # @example Take a document in null context.
171
+ # context.take!
172
+ #
173
+ # @raises [ Mongoid::Errors::DocumentNotFound ] always raises.
174
+ def take!
175
+ raise Errors::DocumentNotFound.new(klass, nil, nil)
176
+ end
115
177
 
116
178
  # Always returns zero.
117
179
  #
@@ -14,7 +14,7 @@ module Mongoid
14
14
  # @example Is the context empty?
15
15
  # context.blank?
16
16
  #
17
- # @return [ true, false ] If the context is empty.
17
+ # @return [ true | false ] If the context is empty.
18
18
  def blank?
19
19
  !exists?
20
20
  end
@@ -30,7 +30,7 @@ module Mongoid
30
30
  # @example Get the context.
31
31
  # criteria.context
32
32
  #
33
- # @return [ Memory, Mongo ] The context.
33
+ # @return [ Memory | Mongo ] The context.
34
34
  def context
35
35
  @context ||= create_context
36
36
  end
@@ -45,7 +45,7 @@ module Mongoid
45
45
  # @example Create the context.
46
46
  # contextual.create_context
47
47
  #
48
- # @return [ Mongo, Memory ] The context.
48
+ # @return [ Mongo | Memory ] The context.
49
49
  def create_context
50
50
  return None.new(self) if empty_and_chainable?
51
51
  embedded ? Memory.new(self) : Mongo.new(self)
@@ -10,7 +10,11 @@ module Mongoid
10
10
  # the exception of the document's id, and will reset all the
11
11
  # instance variables.
12
12
  #
13
- # This clone also includes embedded documents.
13
+ # This clone also includes embedded documents. If there is an _id field in
14
+ # the embedded document, it will be maintained, unlike the root's _id.
15
+ #
16
+ # If cloning an embedded child, the embedded parent is not cloned and the
17
+ # embedded_in association is not set.
14
18
  #
15
19
  # @example Clone the document.
16
20
  # document.clone
@@ -19,19 +23,42 @@ module Mongoid
19
23
  def clone
20
24
  # @note This next line is here to address #2704, even though having an
21
25
  # _id and id field in the document would cause problems with Mongoid
22
- # elsewhere.
26
+ # elsewhere. Note this is only done on the root document as we want
27
+ # to maintain the same _id on the embedded documents.
23
28
  attrs = clone_document.except(*self.class.id_fields)
29
+ Copyable.clone_with_hash(self.class, attrs)
30
+ end
31
+ alias :dup :clone
32
+
33
+ private
34
+
35
+ # Create clone of a document of the given klass with the given attributes
36
+ # hash. This is used recursively so that embedded associations are cloned
37
+ # safely.
38
+ #
39
+ # @param klass [ Class ] The class of the document to create.
40
+ # @param attrs [ Hash ] The hash of the attributes.
41
+ #
42
+ # @return [ Document ] The new document.
43
+ def self.clone_with_hash(klass, attrs)
24
44
  dynamic_attrs = {}
25
- _attribute_names = self.attribute_names
45
+ _attribute_names = klass.attribute_names
26
46
  attrs.reject! do |attr_name, value|
27
47
  unless _attribute_names.include?(attr_name)
28
48
  dynamic_attrs[attr_name] = value
29
49
  true
30
50
  end
31
51
  end
32
- self.class.new(attrs).tap do |object|
52
+
53
+ Factory.build(klass, attrs).tap do |object|
33
54
  dynamic_attrs.each do |attr_name, value|
34
- if object.respond_to?("#{attr_name}=")
55
+ assoc = object.embedded_relations[attr_name]
56
+ if assoc&.one? && Hash === value
57
+ object.send("#{attr_name}=", clone_with_hash(assoc.klass, value))
58
+ elsif assoc&.many? && Array === value
59
+ docs = value.map { |h| clone_with_hash(assoc.klass, h) }
60
+ object.send("#{attr_name}=", docs)
61
+ elsif object.respond_to?("#{attr_name}=")
35
62
  object.send("#{attr_name}=", value)
36
63
  else
37
64
  object.attributes[attr_name] = value
@@ -39,9 +66,6 @@ module Mongoid
39
66
  end
40
67
  end
41
68
  end
42
- alias :dup :clone
43
-
44
- private
45
69
 
46
70
  # Clone the document attributes
47
71
  #
@@ -10,11 +10,11 @@ module Mongoid
10
10
  # criteria.execute_or_raise(id)
11
11
  #
12
12
  # @param [ Object ] ids The arguments passed.
13
- # @param [ true, false ] multi Whether there arguments were a list.
13
+ # @param [ true | false ] multi Whether there arguments were a list.
14
14
  #
15
15
  # @raise [ Errors::DocumentNotFound ] If nothing returned.
16
16
  #
17
- # @return [ Document, Array<Document> ] The document(s).
17
+ # @return [ Document | Array<Document> ] The document(s).
18
18
  def execute_or_raise(ids, multi)
19
19
  result = multiple_from_db(ids)
20
20
  check_for_missing_documents!(result, ids)
@@ -23,15 +23,18 @@ module Mongoid
23
23
 
24
24
  # Find the matchind document(s) in the criteria for the provided ids.
25
25
  #
26
+ # @note Each argument can be an individual id, an array of ids or
27
+ # a nested array. Each array will be flattened.
28
+ #
26
29
  # @example Find by an id.
27
30
  # criteria.find(BSON::ObjectId.new)
28
31
  #
29
32
  # @example Find by multiple ids.
30
33
  # criteria.find([ BSON::ObjectId.new, BSON::ObjectId.new ])
31
34
  #
32
- # @param [ Array<BSON::ObjectId> ] args The ids to search for.
35
+ # @param [ Object | Array<Object> ] *args The ids to search for.
33
36
  #
34
- # @return [ Array<Document>, Document ] The matching document(s).
37
+ # @return [ Document | Array<Document> ] The matching document(s).
35
38
  def find(*args)
36
39
  ids = args.__find_args__
37
40
  raise_invalid if ids.any?(&:nil?)
@@ -26,15 +26,12 @@ module Mongoid
26
26
  #
27
27
  # @return [ Criteria ] The cloned criteria.
28
28
  def includes(*relations)
29
- extract_includes_list(klass, relations)
29
+ extract_includes_list(klass, nil, relations)
30
30
  clone
31
31
  end
32
32
 
33
33
  # Get a list of criteria that are to be executed for eager loading.
34
34
  #
35
- # @example Get the eager loading inclusions.
36
- # Person.includes(:game).inclusions
37
- #
38
35
  # @return [ Array<Association> ] The inclusions.
39
36
  def inclusions
40
37
  @inclusions ||= []
@@ -42,9 +39,6 @@ module Mongoid
42
39
 
43
40
  # Set the inclusions for the criteria.
44
41
  #
45
- # @example Set the inclusions.
46
- # criteria.inclusions = [ association ]
47
- #
48
42
  # @param [ Array<Association> ] value The inclusions.
49
43
  #
50
44
  # @return [ Array<Association> ] The new inclusions.
@@ -56,30 +50,40 @@ module Mongoid
56
50
 
57
51
  # Add an inclusion definition to the list of inclusions for the criteria.
58
52
  #
59
- # @example Add an inclusion.
60
- # criteria.add_inclusion(Person, :posts)
61
- #
62
- # @param [ Class, String, Symbol ] _klass The class or string/symbol of the class name.
63
- # @param [ Symbol ] association The association.
64
- #
65
- # @raise [ Errors::InvalidIncludes ] If no association is found.
66
- def add_inclusion(_klass, association)
67
- inclusions.push(association) unless inclusions.include?(association)
53
+ # @param [ Association ] association The association.
54
+ # @param [ String ] parent The name of the association above this one in
55
+ # the inclusion tree, if it is a nested inclusion.
56
+ def add_inclusion(association, parent = nil)
57
+ if assoc = inclusions.detect { |a| a == association }
58
+ assoc.parent_inclusions.push(parent) if parent
59
+ else
60
+ assoc = association.dup
61
+ assoc.parent_inclusions = []
62
+ assoc.parent_inclusions.push(parent) if parent
63
+ inclusions.push(assoc)
64
+ end
68
65
  end
69
66
 
70
- def extract_includes_list(_parent_class, *relations_list)
67
+ # Iterate through the list of relations and create the inclusions list.
68
+ #
69
+ # @param [ Class | String | Symbol ] _parent_class The class from which the
70
+ # association originates.
71
+ # @param [ String ] parent The name of the association above this one in
72
+ # the inclusion tree, if it is a nested inclusion.
73
+ # @param relations_list The names of the associations to eager load.
74
+ def extract_includes_list(_parent_class, parent, *relations_list)
71
75
  relations_list.flatten.each do |relation_object|
72
76
  if relation_object.is_a?(Hash)
73
77
  relation_object.each do |relation, _includes|
74
78
  association = _parent_class.reflect_on_association(relation)
75
79
  raise Errors::InvalidIncludes.new(_klass, [ relation ]) unless association
76
- add_inclusion(_parent_class, association)
77
- extract_includes_list(association.klass, _includes)
80
+ add_inclusion(association, parent)
81
+ extract_includes_list(association.klass, association.name, _includes)
78
82
  end
79
83
  else
80
84
  association = _parent_class.reflect_on_association(relation_object)
81
85
  raise Errors::InvalidIncludes.new(_parent_class, [ relation_object ]) unless association
82
- add_inclusion(_parent_class, association)
86
+ add_inclusion(association, parent)
83
87
  end
84
88
  end
85
89
  end
@@ -9,9 +9,12 @@ module Mongoid
9
9
  # @example Dump the criteria.
10
10
  # Marshal.dump(criteria)
11
11
  #
12
+ # Note :mongo is written here for backwards compatibility with Mongoid 7
13
+ # and earlier.
14
+ #
12
15
  # @return [ Array<Object> ] The dumped data.
13
16
  def marshal_dump
14
- data = [ klass, driver, inclusions, documents, strategy, negating ]
17
+ data = [ klass, :mongo, inclusions, documents, strategy, negating ]
15
18
  data.push(scoping_options).push(dump_hash(:selector)).push(dump_hash(:options))
16
19
  end
17
20
 
@@ -23,7 +26,12 @@ module Mongoid
23
26
  # @param [ Array ] data The raw data.
24
27
  def marshal_load(data)
25
28
  @scoping_options, raw_selector, raw_options = data.pop(3)
26
- @klass, @driver, @inclusions, @documents, @strategy, @negating = data
29
+ @klass, driver, @inclusions, @documents, @strategy, @negating = data
30
+
31
+ if driver == :mongo1x
32
+ raise NotImplementedError, "Mongoid no longer supports marshalling with driver version 1.x."
33
+ end
34
+
27
35
  @selector = load_hash(Queryable::Selector, raw_selector)
28
36
  @options = load_hash(Queryable::Options, raw_options)
29
37
  end
@@ -54,7 +54,7 @@ module Mongoid
54
54
  # @api private
55
55
  #
56
56
  # @param [ Object ] criteria
57
- # @return [ Boolean ] if should permit
57
+ # @return [ true | false ] if should permit
58
58
  def should_permit?(criteria)
59
59
  if criteria.respond_to?(:permitted?)
60
60
  return criteria.permitted?
@@ -20,7 +20,7 @@ module Mongoid
20
20
  # @example Is the aggregable aggregating?
21
21
  # aggregable.aggregating?
22
22
  #
23
- # @return [ true, false ] If the aggregable is aggregating.
23
+ # @return [ true | false ] If the aggregable is aggregating.
24
24
  def aggregating?
25
25
  !!@aggregating
26
26
  end
@@ -69,7 +69,7 @@ module Mongoid
69
69
  # @example Add an unwind to the pipeline.
70
70
  # aggregable.unwind(:field)
71
71
  #
72
- # @param [ String, Symbol ] field The name of the field to unwind.
72
+ # @param [ String | Symbol ] field The name of the field to unwind.
73
73
  #
74
74
  # @return [ Aggregable ] The aggregable.
75
75
  def unwind(field)
@@ -108,18 +108,6 @@ module Mongoid
108
108
  { first => last.to_direction }
109
109
  end
110
110
 
111
- # Update all the values in the hash with the provided block.
112
- #
113
- # @example Update the values in place.
114
- # [ 1, 2, 3 ].update_values(&:to_s)
115
- #
116
- # @param [ Proc ] block The block to execute on each value.
117
- #
118
- # @return [ Array ] the array.
119
- def update_values(&block)
120
- replace(map(&block))
121
- end
122
-
123
111
  private
124
112
 
125
113
  # Converts the array to a multi-dimensional array.
@@ -145,7 +133,8 @@ module Mongoid
145
133
  #
146
134
  # @return [ Object ] The evolved object.
147
135
  def evolve(object)
148
- if object.is_a?(::Array)
136
+ case object
137
+ when ::Array, ::Set
149
138
  object.map { |obj| obj.class.evolve(obj) }
150
139
  else
151
140
  object
@@ -12,18 +12,39 @@ module Mongoid
12
12
  module BigDecimal
13
13
  module ClassMethods
14
14
 
15
- # Evolves the big decimal into a MongoDB friendly value - in this case
16
- # a string.
15
+ # Evolves the big decimal into a MongoDB friendly value.
17
16
  #
18
17
  # @example Evolve the big decimal
19
18
  # BigDecimal.evolve(decimal)
20
19
  #
21
20
  # @param [ BigDecimal ] object The object to convert.
22
21
  #
23
- # @return [ String ] The big decimal as a string.
22
+ # @return [ Object ] The big decimal as a string, a Decimal128,
23
+ # or the inputted object if it is uncastable.
24
24
  def evolve(object)
25
25
  __evolve__(object) do |obj|
26
- obj ? obj.to_s : obj
26
+ return if obj.nil?
27
+ case obj
28
+ when ::BigDecimal
29
+ if Mongoid.map_big_decimal_to_decimal128
30
+ BSON::Decimal128.new(obj)
31
+ else
32
+ obj.to_s
33
+ end
34
+ # Always return on string for backwards compatibility with querying
35
+ # string-backed BigDecimal fields.
36
+ when BSON::Decimal128, String then obj
37
+ else
38
+ if obj.numeric?
39
+ if Mongoid.map_big_decimal_to_decimal128
40
+ BSON::Decimal128.new(object.to_s)
41
+ else
42
+ obj.to_s
43
+ end
44
+ else
45
+ obj
46
+ end
47
+ end
27
48
  end
28
49
  end
29
50
  end
@@ -17,10 +17,10 @@ module Mongoid
17
17
  #
18
18
  # @param [ Object ] object The object to evolve.
19
19
  #
20
- # @return [ true, false ] The boolean value.
20
+ # @return [ true | false ] The boolean value.
21
21
  def evolve(object)
22
22
  __evolve__(object) do |obj|
23
- obj.to_s =~ (/\A(true|t|yes|y|on|1|1.0)\z/i) ? true : false
23
+ mongoize(obj)
24
24
  end
25
25
  end
26
26
  end
@@ -45,7 +45,12 @@ module Mongoid
45
45
  #
46
46
  # @return [ Time ] The evolved date.
47
47
  def evolve(object)
48
- object.__evolve_date__
48
+ res = begin
49
+ object.try(:__evolve_date__)
50
+ rescue ArgumentError
51
+ nil
52
+ end
53
+ res.nil? ? object : res
49
54
  end
50
55
  end
51
56
  end
@@ -34,7 +34,12 @@ module Mongoid
34
34
  #
35
35
  # @return [ Time ] The evolved date time.
36
36
  def evolve(object)
37
- object.__evolve_time__
37
+ res = begin
38
+ object.try(:__evolve_time__)
39
+ rescue ArgumentError
40
+ nil
41
+ end
42
+ res.nil? ? object : res
38
43
  end
39
44
  end
40
45
  end
@@ -134,20 +134,6 @@ module Mongoid
134
134
  replacement
135
135
  end
136
136
 
137
- # Update all the values in the hash with the provided block.
138
- #
139
- # @example Update the values in place.
140
- # { field: "1" }.update_values(&:to_i)
141
- #
142
- # @param [ Proc ] block The block to execute on each value.
143
- #
144
- # @return [ Hash ] the hash.
145
- def update_values(&block)
146
- each_pair do |key, value|
147
- store(key, block[value])
148
- end
149
- end
150
-
151
137
  private
152
138
 
153
139
  # Apply the provided strategy for the hash with the given object.
@@ -51,7 +51,7 @@ module Mongoid
51
51
  #
52
52
  # @return [ Object ] The converted number.
53
53
  def __numeric__(object)
54
- object.to_s =~ /(\A[-+]?[0-9]+\z)|(\.0+\z)|(\.\z)/ ? object.to_i : Float(object)
54
+ object.to_s.match?(/\A[-+]?[0-9]*[0-9.]0*\z/) ? object.to_i : Float(object)
55
55
  end
56
56
 
57
57
  # Evolve the object to an integer.
@@ -167,7 +167,8 @@ module Mongoid
167
167
  when ::Range
168
168
  object.__evolve_range__
169
169
  else
170
- yield(object)
170
+ res = yield(object)
171
+ res.nil? ? object : res
171
172
  end
172
173
  end
173
174
  end
@@ -43,13 +43,21 @@ module Mongoid
43
43
  # @example Evolve the range.
44
44
  # (11231312..213123131).__evolve_range__
45
45
  #
46
+ # @param [ Object ] serializer The optional serializer for the field.
47
+ #
46
48
  # @return [ Hash ] The $gte/$lte range query.
47
- def __evolve_range__
49
+ #
50
+ # @api private
51
+ def __evolve_range__(serializer: nil)
48
52
  __evolve_range_naive__.transform_values! do |value|
49
- case value
50
- when Time, DateTime then value.__evolve_time__
51
- when Date then value.__evolve_date__
52
- else value
53
+ if serializer
54
+ serializer.evolve(value)
55
+ else
56
+ case value
57
+ when Time, DateTime then value.__evolve_time__
58
+ when Date then value.__evolve_date__
59
+ else value
60
+ end
53
61
  end
54
62
  end
55
63
  end
@@ -23,12 +23,12 @@ module Mongoid
23
23
  # @example Evolve the object to a regex.
24
24
  # Regexp.evolve("\A[123]")
25
25
  #
26
- # @param [ Regexp, String ] object The object to evolve.
26
+ # @param [ Regexp | String ] object The object to evolve.
27
27
  #
28
28
  # @return [ Regexp ] The evolved regex.
29
29
  def evolve(object)
30
30
  __evolve__(object) do |obj|
31
- ::Regexp.new(obj)
31
+ mongoize(obj)
32
32
  end
33
33
  end
34
34
  end
@@ -50,7 +50,7 @@ module Mongoid
50
50
  # @example Evolve the object to a regex.
51
51
  # BSON::Regexp::Raw.evolve("\\A[123]")
52
52
  #
53
- # @param [ BSON::Regexp::Raw, String ] object The object to evolve.
53
+ # @param [ BSON::Regexp::Raw | String ] object The object to evolve.
54
54
  #
55
55
  # @return [ BSON::Regexp::Raw ] The evolved raw regex.
56
56
  def evolve(object)
@@ -16,7 +16,7 @@ module Mongoid
16
16
  # @example Evolve the set.
17
17
  # Set.evolve(set)
18
18
  #
19
- # @param [ Set, Object ] object The object to evolve.
19
+ # @param [ Set | Object ] object The object to evolve.
20
20
  #
21
21
  # @return [ Array ] The evolved set.
22
22
  def evolve(object)
@@ -60,7 +60,7 @@ module Mongoid
60
60
  # "field".__expr_part__(value)
61
61
  #
62
62
  # @param [ Object ] value The value of the criteria.
63
- # @param [ true, false ] negating If the selection should be negated.
63
+ # @param [ true | false ] negating If the selection should be negated.
64
64
  #
65
65
  # @return [ Hash ] The selection.
66
66
  def __expr_part__(value, negating = false)
@@ -84,9 +84,9 @@ module Mongoid
84
84
  # @example Get the value as an expression.
85
85
  # String.__expr_part__("field", value)
86
86
  #
87
- # @param [ String, Symbol ] key The field key.
87
+ # @param [ String | Symbol ] key The field key.
88
88
  # @param [ Object ] value The value of the criteria.
89
- # @param [ true, false ] negating If the selection should be negated.
89
+ # @param [ true | false ] negating If the selection should be negated.
90
90
  #
91
91
  # @return [ Hash ] The selection.
92
92
  def __expr_part__(key, value, negating = false)
@@ -14,7 +14,7 @@ module Mongoid
14
14
  # :field.__expr_part__(value)
15
15
  #
16
16
  # @param [ Object ] value The value of the criteria.
17
- # @param [ true, false ] negating If the selection should be negated.
17
+ # @param [ true | false ] negating If the selection should be negated.
18
18
  #
19
19
  # @return [ Hash ] The selection.
20
20
  def __expr_part__(value, negating = false)
@@ -59,7 +59,9 @@ module Mongoid
59
59
  #
60
60
  # @return [ Symbol ] The value as a symbol.
61
61
  def evolve(object)
62
- __evolve__(object) { |obj| obj.to_sym }
62
+ __evolve__(object) do |obj|
63
+ obj.try(:to_sym)
64
+ end
63
65
  end
64
66
  end
65
67
  end
@@ -42,7 +42,12 @@ module Mongoid
42
42
  #
43
43
  # @return [ Time ] The evolved date time.
44
44
  def evolve(object)
45
- object.__evolve_time__
45
+ res = begin
46
+ object.try(:__evolve_time__)
47
+ rescue ArgumentError
48
+ nil
49
+ end
50
+ res.nil? ? object : res
46
51
  end
47
52
  end
48
53
  end