mongoid 7.5.4 → 8.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +48 -14
  181. data/lib/mongoid/persistable/creatable.rb +19 -9
  182. data/lib/mongoid/persistable/deletable.rb +2 -2
  183. data/lib/mongoid/persistable/destroyable.rb +1 -1
  184. data/lib/mongoid/persistable/savable.rb +14 -2
  185. data/lib/mongoid/persistable/unsettable.rb +2 -2
  186. data/lib/mongoid/persistable/updatable.rb +69 -12
  187. data/lib/mongoid/persistable/upsertable.rb +21 -2
  188. data/lib/mongoid/persistable.rb +6 -3
  189. data/lib/mongoid/persistence_context.rb +6 -4
  190. data/lib/mongoid/query_cache.rb +13 -261
  191. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  192. data/lib/mongoid/railties/database.rake +7 -2
  193. data/lib/mongoid/reloadable.rb +10 -8
  194. data/lib/mongoid/scopable.rb +15 -13
  195. data/lib/mongoid/selectable.rb +1 -2
  196. data/lib/mongoid/serializable.rb +17 -13
  197. data/lib/mongoid/stateful.rb +57 -10
  198. data/lib/mongoid/tasks/database.rake +12 -0
  199. data/lib/mongoid/tasks/database.rb +20 -2
  200. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  201. data/lib/mongoid/threaded.rb +42 -12
  202. data/lib/mongoid/timestamps/created.rb +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 +10 -5
  206. data/lib/mongoid/utils.rb +22 -0
  207. data/lib/mongoid/validatable/associated.rb +98 -17
  208. data/lib/mongoid/validatable/localizable.rb +1 -1
  209. data/lib/mongoid/validatable/macros.rb +5 -7
  210. data/lib/mongoid/validatable/presence.rb +2 -2
  211. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  212. data/lib/mongoid/validatable.rb +17 -6
  213. data/lib/mongoid/version.rb +1 -1
  214. data/lib/mongoid/warnings.rb +19 -4
  215. data/lib/mongoid.rb +17 -3
  216. data/spec/config/mongoid.yml +16 -0
  217. data/spec/integration/app_spec.rb +24 -19
  218. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  219. data/spec/integration/associations/embedded_spec.rb +15 -0
  220. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  221. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  222. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  223. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +61 -0
  224. data/spec/integration/associations/has_one_spec.rb +97 -1
  225. data/spec/integration/associations/scope_option_spec.rb +1 -1
  226. data/spec/integration/callbacks_models.rb +132 -1
  227. data/spec/integration/callbacks_spec.rb +381 -4
  228. data/spec/integration/criteria/range_spec.rb +95 -1
  229. data/spec/integration/discriminator_key_spec.rb +118 -80
  230. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  231. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  232. data/spec/integration/matcher_examples_spec.rb +20 -13
  233. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  234. data/spec/integration/matcher_operator_spec.rb +3 -5
  235. data/spec/integration/persistence/range_field_spec.rb +350 -0
  236. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  237. data/spec/mongoid/association/depending_spec.rb +9 -9
  238. data/spec/mongoid/association/eager_spec.rb +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 +19 -0
  254. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  255. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  256. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
  257. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  258. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  259. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  260. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  261. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +215 -177
  262. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  263. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  264. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  265. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  266. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  267. data/spec/mongoid/association/syncable_spec.rb +15 -1
  268. data/spec/mongoid/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 +27 -34
  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
@@ -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)
@@ -80,21 +80,54 @@ module Mongoid
80
80
  # @example Do any documents exist in the null context.
81
81
  # context.exists?
82
82
  #
83
+ # @example Do any documents exist for given _id.
84
+ # context.exists?(BSON::ObjectId(...))
85
+ #
86
+ # @example Do any documents exist for given conditions.
87
+ # context.exists?(name: "...")
88
+ #
89
+ # @param [ Hash | Object | false ] id_or_conditions an _id to
90
+ # search for, a hash of conditions, nil or false.
91
+ #
83
92
  # @return [ false ] Always false.
84
- def exists?; false; end
93
+ def exists?(id_or_conditions = :none); false; end
85
94
 
86
95
  # Pluck the field values in null context.
87
96
  #
88
97
  # @example Get the values for null context.
89
98
  # context.pluck(:name)
90
99
  #
91
- # @param [ String, Symbol, Array ] args Field or fields to pluck.
100
+ # @param [ [ String | Symbol ]... ] *_fields Field(s) to pluck.
92
101
  #
93
102
  # @return [ Array ] An empty Array.
94
- def pluck(*args)
103
+ def pluck(*_fields)
95
104
  []
96
105
  end
97
106
 
107
+ # Pick the field values in null context.
108
+ #
109
+ # @example Get the value for null context.
110
+ # context.pick(:name)
111
+ #
112
+ # @param [ [ String | Symbol ]... ] *_fields Field(s) to pick.
113
+ #
114
+ # @return [ nil ] Always return nil.
115
+ def pick(*_fields)
116
+ nil
117
+ end
118
+
119
+ # Tally the field values in null context.
120
+ #
121
+ # @example Get the values for null context.
122
+ # context.tally(:name)
123
+ #
124
+ # @param [ String | Symbol ] _field Field to tally.
125
+ #
126
+ # @return [ Hash ] An empty Hash.
127
+ def tally(_field)
128
+ {}
129
+ end
130
+
98
131
  # Create the new null context.
99
132
  #
100
133
  # @example Create the new context.
@@ -110,14 +143,21 @@ module Mongoid
110
143
  # @example Get the first document in null context.
111
144
  # context.first
112
145
  #
113
- # @param [ Integer | Hash ] limit_or_opts The number of documents to
114
- # return, or a hash of options.
146
+ # @param [ Integer ] limit The number of documents to return.
115
147
  #
116
- # @return [ nil ] Always nil.
117
- def first(limit_or_opts = nil)
118
- if !limit_or_opts.nil? && !limit_or_opts.is_a?(Hash)
119
- []
120
- end
148
+ # @return [ [] | nil ] Empty array or nil.
149
+ def first(limit = nil)
150
+ [] unless limit.nil?
151
+ end
152
+
153
+ # Always raises an error.
154
+ #
155
+ # @example Get the first document in null context.
156
+ # context.first!
157
+ #
158
+ # @raises [ Mongoid::Errors::DocumentNotFound ] always raises.
159
+ def first!
160
+ raise_document_not_found_error
121
161
  end
122
162
 
123
163
  # Always returns nil.
@@ -125,14 +165,21 @@ module Mongoid
125
165
  # @example Get the last document in null context.
126
166
  # context.last
127
167
  #
128
- # @param [ Integer | Hash ] limit_or_opts The number of documents to
129
- # return, or a hash of options.
168
+ # @param [ Integer ] limit The number of documents to return.
130
169
  #
131
- # @return [ nil ] Always nil.
132
- def last(limit_or_opts = nil)
133
- if !limit_or_opts.nil? && !limit_or_opts.is_a?(Hash)
134
- []
135
- end
170
+ # @return [ [] | nil ] Empty array or nil.
171
+ def last(limit = nil)
172
+ [] unless limit.nil?
173
+ end
174
+
175
+ # Always raises an error.
176
+ #
177
+ # @example Get the last document in null context.
178
+ # context.last!
179
+ #
180
+ # @raises [ Mongoid::Errors::DocumentNotFound ] always raises.
181
+ def last!
182
+ raise_document_not_found_error
136
183
  end
137
184
 
138
185
  # Returns nil or empty array.
@@ -154,7 +201,127 @@ module Mongoid
154
201
  #
155
202
  # @raises [ Mongoid::Errors::DocumentNotFound ] always raises.
156
203
  def take!
157
- raise Errors::DocumentNotFound.new(klass, nil, nil)
204
+ raise_document_not_found_error
205
+ end
206
+
207
+ # Always returns nil.
208
+ #
209
+ # @example Get the second document in null context.
210
+ # context.second
211
+ #
212
+ # @return [ nil ] Always nil.
213
+ def second
214
+ nil
215
+ end
216
+
217
+ # Always raises an error.
218
+ #
219
+ # @example Get the second document in null context.
220
+ # context.second!
221
+ #
222
+ # @raises [ Mongoid::Errors::DocumentNotFound ] always raises.
223
+ def second!
224
+ raise_document_not_found_error
225
+ end
226
+
227
+ # Always returns nil.
228
+ #
229
+ # @example Get the third document in null context.
230
+ # context.third
231
+ #
232
+ # @return [ nil ] Always nil.
233
+ def third
234
+ nil
235
+ end
236
+
237
+ # Always raises an error.
238
+ #
239
+ # @example Get the third document in null context.
240
+ # context.third!
241
+ #
242
+ # @raises [ Mongoid::Errors::DocumentNotFound ] always raises.
243
+ def third!
244
+ raise_document_not_found_error
245
+ end
246
+
247
+ # Always returns nil.
248
+ #
249
+ # @example Get the fourth document in null context.
250
+ # context.fourth
251
+ #
252
+ # @return [ nil ] Always nil.
253
+ def fourth
254
+ nil
255
+ end
256
+
257
+ # Always raises an error.
258
+ #
259
+ # @example Get the fourth document in null context.
260
+ # context.fourth!
261
+ #
262
+ # @raises [ Mongoid::Errors::DocumentNotFound ] always raises.
263
+ def fourth!
264
+ raise_document_not_found_error
265
+ end
266
+
267
+ # Always returns nil.
268
+ #
269
+ # @example Get the fifth document in null context.
270
+ # context.fifth
271
+ #
272
+ # @return [ nil ] Always nil.
273
+ def fifth
274
+ nil
275
+ end
276
+
277
+ # Always raises an error.
278
+ #
279
+ # @example Get the fifth document in null context.
280
+ # context.fifth!
281
+ #
282
+ # @raises [ Mongoid::Errors::DocumentNotFound ] always raises.
283
+ def fifth!
284
+ raise_document_not_found_error
285
+ end
286
+
287
+ # Always returns nil.
288
+ #
289
+ # @example Get the second to last document in null context.
290
+ # context.second_to_last
291
+ #
292
+ # @return [ nil ] Always nil.
293
+ def second_to_last
294
+ nil
295
+ end
296
+
297
+ # Always raises an error.
298
+ #
299
+ # @example Get the second to last document in null context.
300
+ # context.second_to_last!
301
+ #
302
+ # @raises [ Mongoid::Errors::DocumentNotFound ] always raises.
303
+ def second_to_last!
304
+ raise_document_not_found_error
305
+ end
306
+
307
+ # Always returns nil.
308
+ #
309
+ # @example Get the third to last document in null context.
310
+ # context.third_to_last
311
+ #
312
+ # @return [ nil ] Always nil.
313
+ def third_to_last
314
+ nil
315
+ end
316
+
317
+ # Always raises an error.
318
+ #
319
+ # @example Get the third to last document in null context.
320
+ # context.third_to_last!
321
+ #
322
+ # @raises [ Mongoid::Errors::DocumentNotFound ] always raises.
323
+ def third_to_last!
324
+ raise_document_not_found_error
158
325
  end
159
326
 
160
327
  # Always returns zero.
@@ -170,6 +337,12 @@ module Mongoid
170
337
 
171
338
  alias :find_first :first
172
339
  alias :one :first
340
+
341
+ private
342
+
343
+ def raise_document_not_found_error
344
+ raise Errors::DocumentNotFound.new(klass, nil, nil)
345
+ end
173
346
  end
174
347
  end
175
348
  end
@@ -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,11 +30,23 @@ 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
37
37
 
38
+ # Instructs the context to schedule an asynchronous loading of documents
39
+ # specified by the criteria.
40
+ #
41
+ # Note that depending on the context and on the Mongoid configuration,
42
+ # documents can be loaded synchronously on the caller's thread.
43
+ #
44
+ # @return [ Criteria ] Returns self.
45
+ def load_async
46
+ context.load_async if context.respond_to?(:load_async)
47
+ self
48
+ end
49
+
38
50
  private
39
51
 
40
52
  # Create the context for the queries to execute. Will be memory for
@@ -45,7 +57,7 @@ module Mongoid
45
57
  # @example Create the context.
46
58
  # contextual.create_context
47
59
  #
48
- # @return [ Mongo, Memory ] The context.
60
+ # @return [ Mongo | Memory ] The context.
49
61
  def create_context
50
62
  return None.new(self) if empty_and_chainable?
51
63
  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,18 +10,21 @@ 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)
21
21
  multi ? result : result.first
22
22
  end
23
23
 
24
- # Find the matchind document(s) in the criteria for the provided ids.
24
+ # Find the matching document(s) in the criteria for the provided id(s).
25
+ #
26
+ # @note Each argument can be an individual id, an array of ids or
27
+ # a nested array. Each array will be flattened.
25
28
  #
26
29
  # @example Find by an id.
27
30
  # criteria.find(BSON::ObjectId.new)
@@ -29,9 +32,9 @@ module Mongoid
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 id(s) to find.
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?)
@@ -21,20 +21,17 @@ module Mongoid
21
21
  # @example Eager load the provided associations.
22
22
  # Person.includes(:posts, :game)
23
23
  #
24
- # @param [ Array<Symbol>, Array<Hash> ] relations The names of the associations to eager
25
- # load.
24
+ # @param [ [ Symbol | Hash ]... ] *relations The names of the association(s)
25
+ # to eager load.
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,41 @@ 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 [ [ Symbol | Hash | Array<Symbol | Hash> ]... ] *relations_list
74
+ # The names of the association(s) to eager load.
75
+ def extract_includes_list(_parent_class, parent, *relations_list)
71
76
  relations_list.flatten.each do |relation_object|
72
77
  if relation_object.is_a?(Hash)
73
78
  relation_object.each do |relation, _includes|
74
79
  association = _parent_class.reflect_on_association(relation)
75
80
  raise Errors::InvalidIncludes.new(_klass, [ relation ]) unless association
76
- add_inclusion(_parent_class, association)
77
- extract_includes_list(association.klass, _includes)
81
+ add_inclusion(association, parent)
82
+ extract_includes_list(association.klass, association.name, _includes)
78
83
  end
79
84
  else
80
85
  association = _parent_class.reflect_on_association(relation_object)
81
86
  raise Errors::InvalidIncludes.new(_parent_class, [ relation_object ]) unless association
82
- add_inclusion(_parent_class, association)
87
+ add_inclusion(association, parent)
83
88
  end
84
89
  end
85
90
  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)
@@ -105,21 +105,7 @@ module Mongoid
105
105
  #
106
106
  # @return [ Hash ] The field/direction pair.
107
107
  def __sort_pair__
108
- { first => last.to_direction }
109
- end
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
- #
120
- # @deprecated
121
- def update_values(&block)
122
- replace(map(&block))
108
+ { first => Mongoid::Criteria::Translator.to_direction(last) }
123
109
  end
124
110
 
125
111
  private
@@ -147,7 +133,8 @@ module Mongoid
147
133
  #
148
134
  # @return [ Object ] The evolved object.
149
135
  def evolve(object)
150
- if object.is_a?(::Array)
136
+ case object
137
+ when ::Array, ::Set
151
138
  object.map { |obj| obj.class.evolve(obj) }
152
139
  else
153
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