mongoid 7.4.3 → 8.0.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 (383) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/Rakefile +25 -0
  5. data/lib/config/locales/en.yml +52 -28
  6. data/lib/mongoid/association/accessors.rb +38 -9
  7. data/lib/mongoid/association/bindable.rb +50 -2
  8. data/lib/mongoid/association/builders.rb +4 -2
  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 +33 -10
  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/proxy.rb +2 -2
  15. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  16. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  17. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  18. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +65 -41
  19. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  20. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  21. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +23 -4
  22. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  23. data/lib/mongoid/association/macros.rb +28 -1
  24. data/lib/mongoid/association/many.rb +11 -7
  25. data/lib/mongoid/association/nested/many.rb +5 -4
  26. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  27. data/lib/mongoid/association/nested/one.rb +5 -5
  28. data/lib/mongoid/association/one.rb +2 -2
  29. data/lib/mongoid/association/options.rb +9 -9
  30. data/lib/mongoid/association/proxy.rb +14 -3
  31. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  32. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  33. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  34. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  35. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  36. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  37. data/lib/mongoid/association/referenced/eager.rb +2 -2
  38. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  39. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  40. data/lib/mongoid/association/referenced/has_many/enumerable.rb +20 -24
  41. data/lib/mongoid/association/referenced/has_many/proxy.rb +26 -16
  42. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  43. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  44. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  45. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  46. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  47. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  48. data/lib/mongoid/association/reflections.rb +2 -2
  49. data/lib/mongoid/association/relatable.rb +44 -10
  50. data/lib/mongoid/association.rb +5 -5
  51. data/lib/mongoid/atomic/modifiers.rb +2 -2
  52. data/lib/mongoid/atomic.rb +7 -0
  53. data/lib/mongoid/attributes/dynamic.rb +3 -3
  54. data/lib/mongoid/attributes/nested.rb +5 -5
  55. data/lib/mongoid/attributes/processing.rb +37 -6
  56. data/lib/mongoid/attributes/projector.rb +1 -1
  57. data/lib/mongoid/attributes/readonly.rb +2 -2
  58. data/lib/mongoid/attributes.rb +43 -40
  59. data/lib/mongoid/cacheable.rb +2 -2
  60. data/lib/mongoid/changeable.rb +43 -10
  61. data/lib/mongoid/clients/options.rb +5 -1
  62. data/lib/mongoid/clients/sessions.rb +2 -14
  63. data/lib/mongoid/clients/validators/storage.rb +3 -3
  64. data/lib/mongoid/config/options.rb +3 -0
  65. data/lib/mongoid/config/validators/client.rb +6 -6
  66. data/lib/mongoid/config.rb +62 -17
  67. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  68. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  69. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  70. data/lib/mongoid/contextual/atomic.rb +1 -1
  71. data/lib/mongoid/contextual/geo_near.rb +7 -7
  72. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  73. data/lib/mongoid/contextual/memory.rb +180 -21
  74. data/lib/mongoid/contextual/mongo.rb +260 -217
  75. data/lib/mongoid/contextual/none.rb +67 -5
  76. data/lib/mongoid/contextual/queryable.rb +1 -1
  77. data/lib/mongoid/contextual.rb +2 -2
  78. data/lib/mongoid/copyable.rb +32 -8
  79. data/lib/mongoid/criteria/findable.rb +7 -4
  80. data/lib/mongoid/criteria/includable.rb +24 -20
  81. data/lib/mongoid/criteria/marshalable.rb +10 -2
  82. data/lib/mongoid/criteria/permission.rb +1 -1
  83. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  84. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -14
  85. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  86. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  87. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  88. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  89. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -15
  90. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
  91. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  92. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  93. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  94. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  95. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  96. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  97. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  98. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  99. data/lib/mongoid/criteria/queryable/key.rb +3 -3
  100. data/lib/mongoid/criteria/queryable/mergeable.rb +21 -0
  101. data/lib/mongoid/criteria/queryable/optional.rb +5 -11
  102. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  103. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  104. data/lib/mongoid/criteria/queryable/selectable.rb +31 -37
  105. data/lib/mongoid/criteria/queryable/selector.rb +93 -8
  106. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  107. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  108. data/lib/mongoid/criteria/queryable.rb +12 -7
  109. data/lib/mongoid/criteria/scopable.rb +2 -2
  110. data/lib/mongoid/criteria/translator.rb +45 -0
  111. data/lib/mongoid/criteria.rb +16 -35
  112. data/lib/mongoid/deprecable.rb +37 -0
  113. data/lib/mongoid/deprecation.rb +25 -0
  114. data/lib/mongoid/document.rb +135 -34
  115. data/lib/mongoid/equality.rb +8 -8
  116. data/lib/mongoid/errors/document_not_found.rb +33 -12
  117. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  118. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  119. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  120. data/lib/mongoid/errors/invalid_field.rb +6 -2
  121. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  122. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  123. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  124. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  125. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  126. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  127. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  128. data/lib/mongoid/errors/no_client_database.rb +1 -1
  129. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  130. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  131. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  132. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  133. data/lib/mongoid/errors.rb +2 -2
  134. data/lib/mongoid/extensions/array.rb +9 -7
  135. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  136. data/lib/mongoid/extensions/binary.rb +42 -0
  137. data/lib/mongoid/extensions/boolean.rb +8 -2
  138. data/lib/mongoid/extensions/date.rb +26 -20
  139. data/lib/mongoid/extensions/date_time.rb +1 -1
  140. data/lib/mongoid/extensions/false_class.rb +1 -1
  141. data/lib/mongoid/extensions/float.rb +7 -4
  142. data/lib/mongoid/extensions/hash.rb +37 -8
  143. data/lib/mongoid/extensions/integer.rb +7 -4
  144. data/lib/mongoid/extensions/module.rb +1 -1
  145. data/lib/mongoid/extensions/object.rb +8 -6
  146. data/lib/mongoid/extensions/range.rb +41 -10
  147. data/lib/mongoid/extensions/regexp.rb +11 -4
  148. data/lib/mongoid/extensions/set.rb +11 -4
  149. data/lib/mongoid/extensions/string.rb +11 -22
  150. data/lib/mongoid/extensions/symbol.rb +4 -15
  151. data/lib/mongoid/extensions/time.rb +27 -16
  152. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  153. data/lib/mongoid/extensions/true_class.rb +1 -1
  154. data/lib/mongoid/extensions.rb +1 -0
  155. data/lib/mongoid/factory.rb +55 -7
  156. data/lib/mongoid/fields/foreign_key.rb +11 -4
  157. data/lib/mongoid/fields/localized.rb +9 -4
  158. data/lib/mongoid/fields/standard.rb +7 -7
  159. data/lib/mongoid/fields/validators/macro.rb +3 -9
  160. data/lib/mongoid/fields.rb +233 -40
  161. data/lib/mongoid/findable.rb +34 -13
  162. data/lib/mongoid/indexable/specification.rb +2 -2
  163. data/lib/mongoid/indexable/validators/options.rb +6 -2
  164. data/lib/mongoid/interceptable.rb +185 -16
  165. data/lib/mongoid/matchable.rb +1 -1
  166. data/lib/mongoid/matcher.rb +33 -13
  167. data/lib/mongoid/persistable/creatable.rb +18 -9
  168. data/lib/mongoid/persistable/deletable.rb +1 -1
  169. data/lib/mongoid/persistable/destroyable.rb +1 -1
  170. data/lib/mongoid/persistable/savable.rb +2 -2
  171. data/lib/mongoid/persistable/unsettable.rb +1 -1
  172. data/lib/mongoid/persistable/updatable.rb +19 -12
  173. data/lib/mongoid/persistable/upsertable.rb +1 -1
  174. data/lib/mongoid/persistable.rb +3 -3
  175. data/lib/mongoid/persistence_context.rb +63 -10
  176. data/lib/mongoid/query_cache.rb +8 -260
  177. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  178. data/lib/mongoid/reloadable.rb +10 -8
  179. data/lib/mongoid/scopable.rb +26 -22
  180. data/lib/mongoid/selectable.rb +1 -2
  181. data/lib/mongoid/serializable.rb +10 -6
  182. data/lib/mongoid/shardable.rb +35 -11
  183. data/lib/mongoid/stateful.rb +35 -9
  184. data/lib/mongoid/tasks/database.rb +0 -2
  185. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  186. data/lib/mongoid/threaded.rb +42 -12
  187. data/lib/mongoid/timestamps/created.rb +1 -1
  188. data/lib/mongoid/timestamps/updated.rb +2 -2
  189. data/lib/mongoid/touchable.rb +2 -3
  190. data/lib/mongoid/traversable.rb +5 -4
  191. data/lib/mongoid/validatable/localizable.rb +1 -1
  192. data/lib/mongoid/validatable/macros.rb +0 -2
  193. data/lib/mongoid/validatable/presence.rb +2 -2
  194. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  195. data/lib/mongoid/validatable.rb +6 -6
  196. data/lib/mongoid/version.rb +1 -1
  197. data/lib/mongoid/warnings.rb +28 -0
  198. data/lib/mongoid.rb +2 -0
  199. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -3
  200. data/spec/config/mongoid.yml +16 -0
  201. data/spec/integration/app_spec.rb +8 -12
  202. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  203. data/spec/integration/associations/embedded_spec.rb +15 -0
  204. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  205. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  206. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  207. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  208. data/spec/integration/associations/has_one_spec.rb +97 -1
  209. data/spec/integration/associations/scope_option_spec.rb +1 -1
  210. data/spec/integration/callbacks_models.rb +95 -1
  211. data/spec/integration/callbacks_spec.rb +246 -4
  212. data/spec/integration/criteria/range_spec.rb +95 -1
  213. data/spec/integration/discriminator_key_spec.rb +115 -76
  214. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  215. data/spec/integration/i18n_fallbacks_spec.rb +1 -17
  216. data/spec/integration/matcher_examples_spec.rb +20 -13
  217. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  218. data/spec/integration/matcher_operator_spec.rb +3 -5
  219. data/spec/integration/persistence/range_field_spec.rb +350 -0
  220. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  221. data/spec/mongoid/association/depending_spec.rb +9 -9
  222. data/spec/mongoid/association/eager_spec.rb +2 -1
  223. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  224. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  225. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  226. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  227. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +235 -40
  228. data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
  229. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  230. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  231. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  232. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  233. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  234. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  235. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  236. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  237. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  238. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  239. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +202 -201
  240. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  241. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  242. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  243. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +8 -8
  244. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +160 -119
  245. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  246. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  247. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  248. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  249. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  250. data/spec/mongoid/association/syncable_spec.rb +14 -0
  251. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  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 +551 -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 +23 -30
  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_spec.rb +78 -18
  263. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  264. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  265. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  266. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  267. data/spec/mongoid/contextual/memory_spec.rb +1336 -69
  268. data/spec/mongoid/contextual/mongo_spec.rb +1253 -247
  269. data/spec/mongoid/contextual/none_spec.rb +38 -0
  270. data/spec/mongoid/copyable_spec.rb +451 -1
  271. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  272. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  273. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  274. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  275. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  276. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  277. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  278. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  279. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  280. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  281. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +0 -59
  282. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  283. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  284. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  285. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  286. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  287. data/spec/mongoid/criteria/queryable/selectable_spec.rb +289 -124
  288. data/spec/mongoid/criteria/queryable/selector_spec.rb +89 -4
  289. data/spec/mongoid/criteria/queryable/storable_spec.rb +72 -0
  290. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  291. data/spec/mongoid/criteria_projection_spec.rb +0 -1
  292. data/spec/mongoid/criteria_spec.rb +475 -1199
  293. data/spec/mongoid/document_fields_spec.rb +173 -24
  294. data/spec/mongoid/document_spec.rb +32 -41
  295. data/spec/mongoid/errors/document_not_found_spec.rb +76 -0
  296. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  297. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  298. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  299. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  300. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  301. data/spec/mongoid/extensions/array_spec.rb +16 -2
  302. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  303. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  304. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  305. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  306. data/spec/mongoid/extensions/date_spec.rb +71 -1
  307. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  308. data/spec/mongoid/extensions/float_spec.rb +53 -74
  309. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  310. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  311. data/spec/mongoid/extensions/range_spec.rb +255 -54
  312. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  313. data/spec/mongoid/extensions/set_spec.rb +106 -0
  314. data/spec/mongoid/extensions/string_spec.rb +53 -25
  315. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  316. data/spec/mongoid/extensions/time_spec.rb +634 -66
  317. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  318. data/spec/mongoid/factory_spec.rb +61 -1
  319. data/spec/mongoid/fields/localized_spec.rb +37 -12
  320. data/spec/mongoid/fields_spec.rb +364 -50
  321. data/spec/mongoid/findable_spec.rb +80 -15
  322. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  323. data/spec/mongoid/indexable_spec.rb +39 -20
  324. data/spec/mongoid/interceptable_spec.rb +807 -27
  325. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  326. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  327. data/spec/mongoid/mongoizable_spec.rb +285 -0
  328. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  329. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  330. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  331. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  332. data/spec/mongoid/persistence_context_spec.rb +50 -1
  333. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  334. data/spec/mongoid/query_cache_spec.rb +0 -154
  335. data/spec/mongoid/reloadable_spec.rb +59 -2
  336. data/spec/mongoid/scopable_spec.rb +54 -16
  337. data/spec/mongoid/shardable_models.rb +14 -0
  338. data/spec/mongoid/shardable_spec.rb +157 -51
  339. data/spec/mongoid/stateful_spec.rb +28 -0
  340. data/spec/mongoid/timestamps_spec.rb +390 -0
  341. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  342. data/spec/mongoid/touchable_spec.rb +116 -0
  343. data/spec/mongoid/touchable_spec_models.rb +12 -8
  344. data/spec/mongoid/traversable_spec.rb +4 -11
  345. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  346. data/spec/mongoid/validatable/uniqueness_spec.rb +59 -31
  347. data/spec/mongoid/warnings_spec.rb +35 -0
  348. data/spec/mongoid_spec.rb +1 -1
  349. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  350. data/spec/rails/mongoid_spec.rb +4 -16
  351. data/spec/shared/lib/mrss/docker_runner.rb +7 -0
  352. data/spec/shared/lib/mrss/lite_constraints.rb +10 -2
  353. data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
  354. data/spec/shared/lib/mrss/utils.rb +28 -6
  355. data/spec/shared/share/Dockerfile.erb +36 -40
  356. data/spec/shared/shlib/server.sh +32 -8
  357. data/spec/shared/shlib/set_env.sh +4 -4
  358. data/spec/support/constraints.rb +24 -0
  359. data/spec/support/macros.rb +46 -0
  360. data/spec/support/models/augmentation.rb +12 -0
  361. data/spec/support/models/band.rb +3 -0
  362. data/spec/support/models/catalog.rb +24 -0
  363. data/spec/support/models/circus.rb +3 -0
  364. data/spec/support/models/code.rb +2 -0
  365. data/spec/support/models/fanatic.rb +8 -0
  366. data/spec/support/models/implant.rb +9 -0
  367. data/spec/support/models/label.rb +2 -0
  368. data/spec/support/models/passport.rb +9 -0
  369. data/spec/support/models/person.rb +2 -0
  370. data/spec/support/models/player.rb +2 -0
  371. data/spec/support/models/powerup.rb +12 -0
  372. data/spec/support/models/purse.rb +9 -0
  373. data/spec/support/models/registry.rb +1 -0
  374. data/spec/support/models/school.rb +14 -0
  375. data/spec/support/models/shield.rb +18 -0
  376. data/spec/support/models/student.rb +14 -0
  377. data/spec/support/models/weapon.rb +12 -0
  378. data.tar.gz.sig +4 -1
  379. metadata +682 -635
  380. metadata.gz.sig +0 -0
  381. data/lib/mongoid/errors/eager_load.rb +0 -23
  382. data/lib/mongoid/errors/invalid_value.rb +0 -17
  383. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -57,7 +57,9 @@ module Mongoid
57
57
  # @return [ Mongo::Collection ] The collection for this persistence
58
58
  # context.
59
59
  def collection(parent = nil)
60
- parent ? parent.collection.with(client_options) : client[collection_name.to_sym]
60
+ parent ?
61
+ parent.collection.with(client_options.except(:database, "database")) :
62
+ client[collection_name.to_sym]
61
63
  end
62
64
 
63
65
  # Get the collection name for this persistence context.
@@ -116,12 +118,27 @@ module Mongoid
116
118
  #
117
119
  # @param [ Object ] other The object to be compared with this one.
118
120
  #
119
- # @return [ true, false ] Whether the two persistence contexts are equal.
121
+ # @return [ true | false ] Whether the two persistence contexts are equal.
120
122
  def ==(other)
121
123
  return false unless other.is_a?(PersistenceContext)
122
124
  options == other.options
123
125
  end
124
126
 
127
+ # Whether the client of the context can be reused later, and therefore should
128
+ # not be closed.
129
+ #
130
+ # If the persistence context is requested with :client option only, it means
131
+ # that the context should use a client configured in mongoid.yml.
132
+ # Such clients should not be closed when the context is cleared since they
133
+ # will be reused later.
134
+ #
135
+ # @return [ true | false ] True if client can be reused, otherwise false.
136
+ #
137
+ # @api private
138
+ def reusable_client?
139
+ @options.keys == [:client]
140
+ end
141
+
125
142
  private
126
143
 
127
144
  def set_options!(opts)
@@ -167,13 +184,12 @@ module Mongoid
167
184
  # PersistenceContext.set(model)
168
185
  #
169
186
  # @param [ Object ] object The class or model instance.
170
- # @param [ Hash, Mongoid::PersistenceContext ] options_or_context The persistence
187
+ # @param [ Hash | Mongoid::PersistenceContext ] options_or_context The persistence
171
188
  # options or a persistence context object.
172
189
  #
173
190
  # @return [ Mongoid::PersistenceContext ] The persistence context for the object.
174
191
  def set(object, options_or_context)
175
- key = "[mongoid][#{object.object_id}]:context"
176
- existing_context = Thread.current[key]
192
+ existing_context = get_context(object)
177
193
  existing_options = if existing_context
178
194
  existing_context.options
179
195
  else
@@ -184,7 +200,7 @@ module Mongoid
184
200
  end
185
201
  new_options = existing_options.merge(options_or_context)
186
202
  context = PersistenceContext.new(object, new_options)
187
- Thread.current[key] = context
203
+ store_context(object, context)
188
204
  end
189
205
 
190
206
  # Get the persistence context for a particular class or model instance.
@@ -196,7 +212,7 @@ module Mongoid
196
212
  #
197
213
  # @return [ Mongoid::PersistenceContext ] The persistence context for the object.
198
214
  def get(object)
199
- Thread.current["[mongoid][#{object.object_id}]:context"]
215
+ get_context(object)
200
216
  end
201
217
 
202
218
  # Clear the persistence context for a particular class or model instance.
@@ -204,18 +220,55 @@ module Mongoid
204
220
  # @example Clear the persistence context for a class or model instance.
205
221
  # PersistenceContext.clear(model)
206
222
  #
207
- # @param [ Class, Object ] object The class or model instance.
223
+ # @param [ Class | Object ] object The class or model instance.
208
224
  # @param [ Mongo::Cluster ] cluster The original cluster before this context was used.
209
225
  # @param [ Mongoid::PersistenceContext ] original_context The original persistence
210
226
  # context that was set before this context was used.
211
227
  def clear(object, cluster = nil, original_context = nil)
212
228
  if context = get(object)
213
229
  unless cluster.nil? || context.cluster.equal?(cluster)
214
- context.client.close
230
+ context.client.close unless context.reusable_client?
215
231
  end
216
232
  end
217
233
  ensure
218
- Thread.current["[mongoid][#{object.object_id}]:context"] = original_context
234
+ store_context(object, original_context)
235
+ end
236
+
237
+ private
238
+
239
+ # Key to store persistence contexts in the thread local storage.
240
+ #
241
+ # @api private
242
+ PERSISTENCE_CONTEXT_KEY = :"[mongoid]:persistence_context"
243
+
244
+ # Get the persistence context for a given object from the thread local
245
+ # storage.
246
+ #
247
+ # @param [ Object ] object Object to get the persistance context for.
248
+ #
249
+ # @return [ Mongoid::PersistenceContext | nil ] The persistence context
250
+ # for the object if previously stored, otherwise nil.
251
+ #
252
+ # @api private
253
+ def get_context(object)
254
+ Thread.current[PERSISTENCE_CONTEXT_KEY] ||= {}
255
+ Thread.current[PERSISTENCE_CONTEXT_KEY][object.object_id]
256
+ end
257
+
258
+ # Store persistence context for a given object in the thread local
259
+ # storage.
260
+ #
261
+ # @param [ Object ] object Object to store the persistance context for.
262
+ # @param [ Mongoid::PersistenceContext ] context Context to store
263
+ #
264
+ # @api private
265
+ def store_context(object, context)
266
+ if context.nil?
267
+ Thread.current[PERSISTENCE_CONTEXT_KEY]&.delete(object.object_id)
268
+ else
269
+ Thread.current[PERSISTENCE_CONTEXT_KEY] ||= {}
270
+ Thread.current[PERSISTENCE_CONTEXT_KEY][object.object_id] = context
271
+ end
219
272
  end
220
273
  end
221
274
  end
@@ -4,28 +4,8 @@ module Mongoid
4
4
 
5
5
  # A cache of database queries on a per-request basis.
6
6
  module QueryCache
7
- # @api private
8
- LEGACY_WARNING = <<~DOC
9
- You are using the legacy Mongoid query cache which has known issues.
10
- Please upgrade the `mongo' gem to at least 2.14.0 to use the improved driver query cache.
11
- Refer to: https://docs.mongodb.com/mongoid/current/tutorials/mongoid-queries/#the-improved-driver-query-cache
12
- DOC
13
7
 
14
8
  class << self
15
- # Get the cached queries.
16
- #
17
- # @example Get the cached queries from the current thread.
18
- # QueryCache.cache_table
19
- #
20
- # @return [ Hash ] The hash of cached queries.
21
- # @api private
22
- def cache_table
23
- if defined?(Mongo::QueryCache)
24
- raise NotImplementedError, "Mongoid does not expose driver's query cache table"
25
- else
26
- Thread.current["[mongoid]:query_cache"] ||= {}
27
- end
28
- end
29
9
 
30
10
  # Clear the query cache.
31
11
  #
@@ -34,11 +14,7 @@ module Mongoid
34
14
  #
35
15
  # @return [ nil ] Always nil.
36
16
  def clear_cache
37
- if defined?(Mongo::QueryCache)
38
- Mongo::QueryCache.clear
39
- else
40
- Thread.current["[mongoid]:query_cache"] = nil
41
- end
17
+ Mongo::QueryCache.clear
42
18
  end
43
19
 
44
20
  # Set whether the cache is enabled.
@@ -46,13 +22,9 @@ module Mongoid
46
22
  # @example Set if the cache is enabled.
47
23
  # QueryCache.enabled = true
48
24
  #
49
- # @param [ true, false ] value The enabled value.
25
+ # @param [ true | false ] value The enabled value.
50
26
  def enabled=(value)
51
- if defined?(Mongo::QueryCache)
52
- Mongo::QueryCache.enabled = value
53
- else
54
- Thread.current["[mongoid]:query_cache:enabled"] = value
55
- end
27
+ Mongo::QueryCache.enabled = value
56
28
  end
57
29
 
58
30
  # Is the query cache enabled on the current thread?
@@ -60,13 +32,9 @@ module Mongoid
60
32
  # @example Is the query cache enabled?
61
33
  # QueryCache.enabled?
62
34
  #
63
- # @return [ true, false ] If the cache is enabled.
35
+ # @return [ true | false ] If the cache is enabled.
64
36
  def enabled?
65
- if defined?(Mongo::QueryCache)
66
- Mongo::QueryCache.enabled?
67
- else
68
- !!Thread.current["[mongoid]:query_cache:enabled"]
69
- end
37
+ Mongo::QueryCache.enabled?
70
38
  end
71
39
 
72
40
  # Execute the block while using the query cache.
@@ -76,21 +44,7 @@ module Mongoid
76
44
  #
77
45
  # @return [ Object ] The result of the block.
78
46
  def cache(&block)
79
- if defined?(Mongo::QueryCache)
80
- Mongo::QueryCache.cache(&block)
81
- else
82
- @legacy_query_cache_warned ||= begin
83
- Mongoid.logger.warn(LEGACY_WARNING)
84
- true
85
- end
86
- enabled = QueryCache.enabled?
87
- QueryCache.enabled = true
88
- begin
89
- yield
90
- ensure
91
- QueryCache.enabled = enabled
92
- end
93
- end
47
+ Mongo::QueryCache.cache(&block)
94
48
  end
95
49
 
96
50
  # Execute the block with the query cache disabled.
@@ -100,217 +54,11 @@ module Mongoid
100
54
  #
101
55
  # @return [ Object ] The result of the block.
102
56
  def uncached(&block)
103
- if defined?(Mongo::QueryCache)
104
- Mongo::QueryCache.uncached(&block)
105
- else
106
- enabled = QueryCache.enabled?
107
- QueryCache.enabled = false
108
- begin
109
- yield
110
- ensure
111
- QueryCache.enabled = enabled
112
- end
113
- end
114
- end
115
- end
116
-
117
- if defined?(Mongo::QueryCache::Middleware)
118
- Middleware = Mongo::QueryCache::Middleware
119
- else
120
- # The middleware to be added to a rack application in order to activate the
121
- # query cache.
122
- class Middleware
123
-
124
- # Instantiate the middleware.
125
- #
126
- # @example Create the new middleware.
127
- # Middleware.new(app)
128
- #
129
- # @param [ Object ] app The rack application stack.
130
- def initialize(app)
131
- @app = app
132
- end
133
-
134
- # Execute the request, wrapping in a query cache.
135
- #
136
- # @example Execute the request.
137
- # middleware.call(env)
138
- #
139
- # @param [ Object ] env The environment.
140
- #
141
- # @return [ Object ] The result of the call.
142
- def call(env)
143
- QueryCache.cache do
144
- @app.call(env)
145
- end
146
- ensure
147
- QueryCache.clear_cache
148
- end
149
- end
150
- end
151
-
152
- # A Cursor that attempts to load documents from memory first before hitting
153
- # the database if the same query has already been executed.
154
- # @deprecated This class is only used with driver versions 2.13 and lower.
155
- class CachedCursor < Mongo::Cursor
156
-
157
- # We iterate over the cached documents if they exist already in the
158
- # cursor otherwise proceed as normal.
159
- #
160
- # @example Iterate over the documents.
161
- # cursor.each do |doc|
162
- # # ...
163
- # end
164
- def each
165
- if @cached_documents
166
- @cached_documents.each do |doc|
167
- yield doc
168
- end
169
- else
170
- super
171
- end
172
- end
173
-
174
- # Get a human-readable string representation of +Cursor+.
175
- #
176
- # @example Inspect the cursor.
177
- # cursor.inspect
178
- #
179
- # @return [ String ] A string representation of a +Cursor+ instance.
180
- def inspect
181
- "#<Mongoid::QueryCache::CachedCursor:0x#{object_id} @view=#{@view.inspect}>"
182
- end
183
-
184
- private
185
-
186
- def process(result)
187
- documents = super
188
- if @cursor_id.zero? && !@after_first_batch
189
- @cached_documents ||= []
190
- @cached_documents.concat(documents)
191
- end
192
- @after_first_batch = true
193
- documents
194
- end
195
- end
196
-
197
- # Included to add behavior for clearing out the query cache on certain
198
- # operations.
199
- # @deprecated This module is only used with driver versions 2.13 and lower.
200
- module Base
201
-
202
- def alias_query_cache_clear(*method_names)
203
- method_names.each do |method_name|
204
- define_method("#{method_name}_with_clear_cache") do |*args|
205
- QueryCache.clear_cache
206
- send("#{method_name}_without_clear_cache", *args)
207
- end
208
-
209
- alias_method "#{method_name}_without_clear_cache", method_name
210
- alias_method method_name, "#{method_name}_with_clear_cache"
211
- end
57
+ Mongo::QueryCache.uncached(&block)
212
58
  end
213
59
  end
214
60
 
215
- # Contains enhancements to the Mongo::Collection::View in order to get a
216
- # cached cursor or a regular cursor on iteration.
217
- # @deprecated This module is only used with driver versions 2.13 and lower.
218
- module View
219
- extend ActiveSupport::Concern
220
-
221
- included do
222
- extend QueryCache::Base
223
- alias_query_cache_clear :delete_one,
224
- :delete_many,
225
- :update_one,
226
- :update_many,
227
- :replace_one,
228
- :find_one_and_delete,
229
- :find_one_and_replace,
230
- :find_one_and_update
231
- end
232
-
233
- # Override the default enumeration to handle if the cursor can be cached
234
- # or not.
235
- #
236
- # @example Iterate over the view.
237
- # view.each do |doc|
238
- # # ...
239
- # end
240
- def each
241
- if system_collection? || !QueryCache.enabled? || (respond_to?(:write?, true) && write?)
242
- super
243
- else
244
- @cursor = nil
245
- unless @cursor = cached_cursor
246
- session = client.send(:get_session, @options)
247
- read_with_retry(session, server_selector) do |server|
248
- result = send_initial_query(server, session)
249
- if result.cursor_id == 0 || result.cursor_id.nil?
250
- @cursor = CachedCursor.new(view, result, server, session: session)
251
- QueryCache.cache_table[cache_key] = @cursor
252
- else
253
- @cursor = Mongo::Cursor.new(view, result, server, session: session)
254
- end
255
- end
256
- end
257
- if block_given?
258
- if limit
259
- @cursor.to_a[0...limit].each do |doc|
260
- yield doc
261
- end
262
- else
263
- @cursor.each do |doc|
264
- yield doc
265
- end
266
- end
267
- else
268
- @cursor.to_enum
269
- end
270
- end
271
- end
272
-
273
- private
274
-
275
- def cached_cursor
276
- if limit
277
- key = [ collection.namespace, selector, nil, skip, sort, projection, collation ]
278
- cursor = QueryCache.cache_table[key]
279
- end
280
- cursor || QueryCache.cache_table[cache_key]
281
- end
282
-
283
- def cache_key
284
- [ collection.namespace, selector, limit, skip, sort, projection, collation ]
285
- end
286
-
287
- def system_collection?
288
- collection.name.start_with?('system.')
289
- end
290
- end
291
-
292
- # Adds behavior to the query cache for collections.
293
- # @deprecated This module is only used with driver versions 2.13 and lower.
294
- module Collection
295
- extend ActiveSupport::Concern
296
-
297
- included do
298
- extend QueryCache::Base
299
- alias_query_cache_clear :insert_one, :insert_many
300
- end
301
- end
302
-
303
- # Bypass the query cache when reloading a document.
304
- module Document
305
- def reload
306
- QueryCache.uncached { super }
307
- end
308
- end
61
+ Middleware = Mongo::QueryCache::Middleware
309
62
  end
310
63
  end
311
64
 
312
- unless defined?(Mongo::QueryCache)
313
- Mongo::Collection.__send__(:include, Mongoid::QueryCache::Collection)
314
- Mongo::Collection::View.__send__(:include, Mongoid::QueryCache::View)
315
- Mongoid::Document.__send__(:include, Mongoid::QueryCache::Document)
316
- end
@@ -62,7 +62,7 @@ module Mongoid
62
62
  def started _; end
63
63
 
64
64
  def _completed e
65
- Collector.runtime += e.duration
65
+ Collector.runtime += e.duration * 1000
66
66
  end
67
67
  alias :succeeded :_completed
68
68
  alias :failed :_completed
@@ -16,18 +16,20 @@ module Mongoid
16
16
  #
17
17
  # @return [ Document ] The document, reloaded.
18
18
  def reload
19
- if @atomic_selector
20
- # Clear atomic_selector cache for sharded clusters. MONGOID-5076
21
- remove_instance_variable('@atomic_selector')
22
- end
23
-
24
19
  reloaded = _reload
25
20
  if Mongoid.raise_not_found_error && (reloaded.nil? || reloaded.empty?)
26
- raise Errors::DocumentNotFound.new(self.class, _id, _id)
21
+ shard_keys = atomic_selector.with_indifferent_access.slice(*shard_key_fields, :_id)
22
+ raise Errors::DocumentNotFound.new(self.class, _id, shard_keys)
27
23
  end
24
+
25
+ reset_atomic_updates!
26
+
28
27
  @attributes = reloaded
29
- @attributes_before_type_cast = {}
30
- changed_attributes.clear
28
+ @attributes_before_type_cast = @attributes.dup
29
+ @changed_attributes = {}
30
+ @previous_changes = {}
31
+ @previous_attributes = {}
32
+ @previously_new_record = false
31
33
  reset_readonly
32
34
  apply_defaults
33
35
  reload_relations
@@ -23,7 +23,7 @@ module Mongoid
23
23
  # @example Apply the default scoping.
24
24
  # document.apply_default_scoping
25
25
  #
26
- # @return [ true, false ] If default scoping was applied.
26
+ # @return [ true | false ] If default scoping was applied.
27
27
  def apply_default_scoping
28
28
  if default_scoping
29
29
  default_scoping.call.selector.each do |field, value|
@@ -74,7 +74,7 @@ module Mongoid
74
74
  # default_scope ->{ where(active: true) }
75
75
  # end
76
76
  #
77
- # @param [ Proc, Criteria ] value The default scope.
77
+ # @param [ Proc | Criteria ] value The default scope.
78
78
  #
79
79
  # @raise [ Errors::InvalidScope ] If the scope is not a proc or criteria.
80
80
  #
@@ -90,7 +90,7 @@ module Mongoid
90
90
  # @example Can the default scope be applied?
91
91
  # Band.default_scopable?
92
92
  #
93
- # @return [ true, false ] If the default scope can be applied.
93
+ # @return [ true | false ] If the default scope can be applied.
94
94
  def default_scopable?
95
95
  default_scoping? && !Threaded.without_default_scope?(self)
96
96
  end
@@ -168,9 +168,11 @@ module Mongoid
168
168
  # Band.where(name: "Depeche Mode")
169
169
  # end
170
170
  #
171
- # @note This will force the default scope to be removed.
171
+ # @note This will force the default scope to be removed, but will not
172
+ # remove scopes declared with ``.with_scope``. This will be changed
173
+ # in Mongoid 9.
172
174
  #
173
- # @return [ Criteria, Object ] The unscoped criteria or result of the
175
+ # @return [ Criteria | Object ] The unscoped criteria or result of the
174
176
  # block.
175
177
  def unscoped
176
178
  if block_given?
@@ -240,7 +242,7 @@ module Mongoid
240
242
  # @example Warn or raise error if name exists.
241
243
  # Model.valid_scope_name?("test")
242
244
  #
243
- # @param [ String, Symbol ] name The name of the scope.
245
+ # @param [ String | Symbol ] name The name of the scope.
244
246
  #
245
247
  # @raise [ Errors::ScopeOverwrite ] If the name exists and configured to
246
248
  # raise the error.
@@ -249,12 +251,12 @@ module Mongoid
249
251
  if Mongoid.scope_overwrite_exception
250
252
  raise Errors::ScopeOverwrite.new(self.name, name)
251
253
  else
252
- if Mongoid.logger
253
- Mongoid.logger.warn(
254
- "Creating scope :#{name}. " +
255
- "Overwriting existing method #{self.name}.#{name}."
256
- )
257
- end
254
+ Mongoid.logger.warn(
255
+ "Creating scope :#{name} which conflicts with #{self.name}.#{name}. " +
256
+ "Calls to `Mongoid::Criteria##{name}` will delegate to " +
257
+ "`Mongoid::Criteria##{name}` for criteria with klass #{self.name} " +
258
+ "and will ignore the declared scope."
259
+ )
258
260
  end
259
261
  end
260
262
  end
@@ -289,15 +291,17 @@ module Mongoid
289
291
  # @return [ Method ] The defined method.
290
292
  def define_scope_method(name)
291
293
  singleton_class.class_eval do
292
- define_method(name) do |*args|
293
- scoping = _declared_scopes[name]
294
- scope = instance_exec(*args, &scoping[:scope])
295
- extension = scoping[:extension]
296
- to_merge = scope || queryable
297
- criteria = to_merge.empty_and_chainable? ? to_merge : with_default_scope.merge(to_merge)
298
- criteria.extend(extension)
299
- criteria
300
- end
294
+ ruby2_keywords(
295
+ define_method(name) do |*args|
296
+ scoping = _declared_scopes[name]
297
+ scope = instance_exec(*args, &scoping[:scope])
298
+ extension = scoping[:extension]
299
+ to_merge = scope || queryable
300
+ criteria = to_merge.empty_and_chainable? ? to_merge : with_default_scope.merge(to_merge)
301
+ criteria.extend(extension)
302
+ criteria
303
+ end
304
+ )
301
305
  end
302
306
  end
303
307
 
@@ -309,7 +313,7 @@ module Mongoid
309
313
  # @example Process the default scope.
310
314
  # Model.process_default_scope(value)
311
315
  #
312
- # @param [ Criteria, Proc ] value The default scope value.
316
+ # @param [ Criteria | Proc ] value The default scope value.
313
317
  def process_default_scope(value)
314
318
  if existing = default_scoping
315
319
  ->{ existing.call.merge(value.to_proc.call) }
@@ -15,8 +15,7 @@ module Mongoid
15
15
  #
16
16
  # @return [ Hash ] The document's selector.
17
17
  def atomic_selector
18
- @atomic_selector ||=
19
- (embedded? ? embedded_atomic_selector : root_atomic_selector_in_db)
18
+ embedded? ? embedded_atomic_selector : root_atomic_selector_in_db
20
19
  end
21
20
 
22
21
  private
@@ -33,10 +33,14 @@ module Mongoid
33
33
  #
34
34
  # @param [ Hash ] options The options to pass.
35
35
  #
36
- # @option options [ Symbol ] :include What associations to include.
37
- # @option options [ Symbol ] :only Limit the fields to only these.
38
- # @option options [ Symbol ] :except Dont include these fields.
39
- # @option options [ Symbol ] :methods What methods to include.
36
+ # @option options [ Symbol | String | Array<Symbol | String> ] :except
37
+ # Do not include these field(s).
38
+ # @option options [ Symbol | String | Array<Symbol | String> ] :include
39
+ # Which association(s) to include.
40
+ # @option options [ Symbol | String | Array<Symbol | String> ] :only
41
+ # Limit the field(s) to only these.
42
+ # @option options [ Symbol | String | Array<Symbol | String> ] :methods
43
+ # What methods to include.
40
44
  #
41
45
  # @return [ Hash ] The document, ready to be serialized.
42
46
  def serializable_hash(options = nil)
@@ -137,7 +141,7 @@ module Mongoid
137
141
  # @example Get the association names.
138
142
  # document.relation_names(:include => [ :addresses ])
139
143
  #
140
- # @param [ Hash, Symbol, Array<Symbol> ] inclusions The inclusions.
144
+ # @param [ Hash | Symbol | Array<Symbol> ] inclusions The inclusions.
141
145
  #
142
146
  # @return [ Array<Symbol> ] The names of the included associations.
143
147
  def relation_names(inclusions)
@@ -150,7 +154,7 @@ module Mongoid
150
154
  # @example Get the association options.
151
155
  # document.relation_names(:include => [ :addresses ])
152
156
  #
153
- # @param [ Hash, Symbol, Array<Symbol> ] inclusions The inclusions.
157
+ # @param [ Hash | Symbol | Array<Symbol> ] inclusions The inclusions.
154
158
  # @param [ Hash ] options The options.
155
159
  # @param [ Symbol ] name The name of the association.
156
160
  #