mongoid 7.5.3 → 8.1.2

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 (417) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +3 -3
  4. data/README.md +6 -6
  5. data/Rakefile +25 -0
  6. data/lib/config/locales/en.yml +92 -43
  7. data/lib/mongoid/association/accessors.rb +40 -11
  8. data/lib/mongoid/association/bindable.rb +50 -2
  9. data/lib/mongoid/association/builders.rb +5 -3
  10. data/lib/mongoid/association/constrainable.rb +0 -1
  11. data/lib/mongoid/association/eager_loadable.rb +29 -7
  12. data/lib/mongoid/association/embedded/batchable.rb +34 -11
  13. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  14. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  15. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
  16. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
  17. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  18. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  19. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
  20. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +69 -45
  21. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  22. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
  23. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
  24. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  25. data/lib/mongoid/association/macros.rb +8 -1
  26. data/lib/mongoid/association/many.rb +11 -7
  27. data/lib/mongoid/association/nested/many.rb +5 -4
  28. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  29. data/lib/mongoid/association/nested/one.rb +45 -7
  30. data/lib/mongoid/association/one.rb +2 -2
  31. data/lib/mongoid/association/options.rb +9 -9
  32. data/lib/mongoid/association/proxy.rb +15 -4
  33. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  34. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  35. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  36. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  37. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  38. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  39. data/lib/mongoid/association/referenced/eager.rb +2 -2
  40. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  41. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  42. data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
  43. data/lib/mongoid/association/referenced/has_many/proxy.rb +29 -19
  44. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  45. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  46. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  47. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  48. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  49. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  50. data/lib/mongoid/association/reflections.rb +4 -4
  51. data/lib/mongoid/association/relatable.rb +44 -10
  52. data/lib/mongoid/association.rb +5 -5
  53. data/lib/mongoid/atomic/modifiers.rb +2 -2
  54. data/lib/mongoid/atomic.rb +7 -0
  55. data/lib/mongoid/attributes/dynamic.rb +4 -4
  56. data/lib/mongoid/attributes/nested.rb +6 -6
  57. data/lib/mongoid/attributes/processing.rb +37 -6
  58. data/lib/mongoid/attributes/projector.rb +2 -2
  59. data/lib/mongoid/attributes/readonly.rb +3 -3
  60. data/lib/mongoid/attributes.rb +51 -42
  61. data/lib/mongoid/changeable.rb +147 -14
  62. data/lib/mongoid/clients/options.rb +5 -1
  63. data/lib/mongoid/clients/sessions.rb +2 -14
  64. data/lib/mongoid/clients/storage_options.rb +2 -5
  65. data/lib/mongoid/clients/validators/storage.rb +3 -15
  66. data/lib/mongoid/collection_configurable.rb +58 -0
  67. data/lib/mongoid/composable.rb +2 -0
  68. data/lib/mongoid/config/defaults.rb +60 -0
  69. data/lib/mongoid/config/options.rb +3 -0
  70. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  71. data/lib/mongoid/config/validators/client.rb +6 -6
  72. data/lib/mongoid/config/validators.rb +1 -0
  73. data/lib/mongoid/config.rb +140 -18
  74. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  75. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  76. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  77. data/lib/mongoid/contextual/atomic.rb +1 -1
  78. data/lib/mongoid/contextual/geo_near.rb +7 -7
  79. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  80. data/lib/mongoid/contextual/memory.rb +285 -58
  81. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  82. data/lib/mongoid/contextual/mongo.rb +517 -346
  83. data/lib/mongoid/contextual/none.rb +193 -20
  84. data/lib/mongoid/contextual/queryable.rb +1 -1
  85. data/lib/mongoid/contextual.rb +14 -2
  86. data/lib/mongoid/copyable.rb +32 -8
  87. data/lib/mongoid/criteria/findable.rb +8 -5
  88. data/lib/mongoid/criteria/includable.rb +27 -22
  89. data/lib/mongoid/criteria/marshalable.rb +10 -2
  90. data/lib/mongoid/criteria/permission.rb +1 -1
  91. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  92. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
  93. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  94. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  95. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  96. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  97. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
  98. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
  99. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  100. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  101. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  102. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  103. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  104. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  105. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  106. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  107. data/lib/mongoid/criteria/queryable/key.rb +4 -4
  108. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  109. data/lib/mongoid/criteria/queryable/optional.rb +11 -17
  110. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  111. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  112. data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
  113. data/lib/mongoid/criteria/queryable/selector.rb +93 -8
  114. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  115. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  116. data/lib/mongoid/criteria/queryable.rb +12 -7
  117. data/lib/mongoid/criteria/scopable.rb +2 -2
  118. data/lib/mongoid/criteria/translator.rb +45 -0
  119. data/lib/mongoid/criteria.rb +20 -40
  120. data/lib/mongoid/deprecable.rb +36 -0
  121. data/lib/mongoid/deprecation.rb +25 -0
  122. data/lib/mongoid/document.rb +127 -35
  123. data/lib/mongoid/equality.rb +8 -8
  124. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  125. data/lib/mongoid/errors/document_not_found.rb +10 -6
  126. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  127. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  128. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  129. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  130. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  131. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  132. data/lib/mongoid/errors/invalid_field.rb +6 -2
  133. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  134. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  135. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  136. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  137. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  138. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  139. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  140. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  141. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  142. data/lib/mongoid/errors/no_client_database.rb +1 -1
  143. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  144. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  145. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  146. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  147. data/lib/mongoid/errors.rb +6 -3
  148. data/lib/mongoid/extensions/array.rb +9 -7
  149. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  150. data/lib/mongoid/extensions/binary.rb +42 -0
  151. data/lib/mongoid/extensions/boolean.rb +8 -2
  152. data/lib/mongoid/extensions/date.rb +26 -20
  153. data/lib/mongoid/extensions/date_time.rb +1 -1
  154. data/lib/mongoid/extensions/false_class.rb +1 -1
  155. data/lib/mongoid/extensions/float.rb +7 -4
  156. data/lib/mongoid/extensions/hash.rb +19 -8
  157. data/lib/mongoid/extensions/integer.rb +7 -4
  158. data/lib/mongoid/extensions/module.rb +1 -1
  159. data/lib/mongoid/extensions/object.rb +10 -8
  160. data/lib/mongoid/extensions/range.rb +41 -10
  161. data/lib/mongoid/extensions/regexp.rb +11 -4
  162. data/lib/mongoid/extensions/set.rb +11 -4
  163. data/lib/mongoid/extensions/string.rb +11 -22
  164. data/lib/mongoid/extensions/symbol.rb +4 -15
  165. data/lib/mongoid/extensions/time.rb +29 -16
  166. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  167. data/lib/mongoid/extensions/true_class.rb +1 -1
  168. data/lib/mongoid/extensions.rb +1 -0
  169. data/lib/mongoid/factory.rb +55 -7
  170. data/lib/mongoid/fields/foreign_key.rb +11 -4
  171. data/lib/mongoid/fields/localized.rb +19 -4
  172. data/lib/mongoid/fields/standard.rb +17 -7
  173. data/lib/mongoid/fields/validators/macro.rb +3 -9
  174. data/lib/mongoid/fields.rb +129 -20
  175. data/lib/mongoid/findable.rb +54 -24
  176. data/lib/mongoid/indexable/specification.rb +2 -2
  177. data/lib/mongoid/indexable/validators/options.rb +6 -2
  178. data/lib/mongoid/interceptable.rb +76 -15
  179. data/lib/mongoid/matchable.rb +1 -1
  180. data/lib/mongoid/matcher/eq_impl.rb +1 -1
  181. data/lib/mongoid/matcher/type.rb +1 -1
  182. data/lib/mongoid/matcher.rb +33 -13
  183. data/lib/mongoid/persistable/creatable.rb +19 -9
  184. data/lib/mongoid/persistable/deletable.rb +2 -2
  185. data/lib/mongoid/persistable/destroyable.rb +1 -1
  186. data/lib/mongoid/persistable/savable.rb +14 -2
  187. data/lib/mongoid/persistable/unsettable.rb +2 -2
  188. data/lib/mongoid/persistable/updatable.rb +69 -12
  189. data/lib/mongoid/persistable/upsertable.rb +21 -2
  190. data/lib/mongoid/persistable.rb +6 -3
  191. data/lib/mongoid/persistence_context.rb +6 -4
  192. data/lib/mongoid/query_cache.rb +13 -261
  193. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  194. data/lib/mongoid/railties/database.rake +7 -2
  195. data/lib/mongoid/reloadable.rb +10 -8
  196. data/lib/mongoid/scopable.rb +15 -13
  197. data/lib/mongoid/selectable.rb +1 -2
  198. data/lib/mongoid/serializable.rb +10 -6
  199. data/lib/mongoid/stateful.rb +57 -10
  200. data/lib/mongoid/tasks/database.rake +12 -0
  201. data/lib/mongoid/tasks/database.rb +20 -2
  202. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  203. data/lib/mongoid/threaded.rb +42 -12
  204. data/lib/mongoid/timestamps/created.rb +1 -1
  205. data/lib/mongoid/timestamps/updated.rb +2 -2
  206. data/lib/mongoid/touchable.rb +2 -3
  207. data/lib/mongoid/traversable.rb +5 -4
  208. data/lib/mongoid/utils.rb +22 -0
  209. data/lib/mongoid/validatable/localizable.rb +1 -1
  210. data/lib/mongoid/validatable/macros.rb +5 -7
  211. data/lib/mongoid/validatable/presence.rb +2 -2
  212. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  213. data/lib/mongoid/validatable.rb +9 -6
  214. data/lib/mongoid/version.rb +1 -1
  215. data/lib/mongoid/warnings.rb +19 -4
  216. data/lib/mongoid.rb +17 -3
  217. data/spec/config/mongoid.yml +16 -0
  218. data/spec/integration/app_spec.rb +10 -14
  219. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  220. data/spec/integration/associations/embedded_spec.rb +15 -0
  221. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  222. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  223. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  224. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  225. data/spec/integration/associations/has_one_spec.rb +97 -1
  226. data/spec/integration/associations/scope_option_spec.rb +1 -1
  227. data/spec/integration/callbacks_models.rb +132 -1
  228. data/spec/integration/callbacks_spec.rb +360 -4
  229. data/spec/integration/criteria/range_spec.rb +95 -1
  230. data/spec/integration/discriminator_key_spec.rb +118 -80
  231. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  232. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  233. data/spec/integration/matcher_examples_spec.rb +20 -13
  234. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  235. data/spec/integration/matcher_operator_spec.rb +3 -5
  236. data/spec/integration/persistence/range_field_spec.rb +350 -0
  237. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  238. data/spec/mongoid/association/depending_spec.rb +9 -9
  239. data/spec/mongoid/association/eager_spec.rb +2 -1
  240. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  241. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  242. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  243. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  244. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +255 -65
  245. data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
  246. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  247. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  248. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  249. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  250. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  251. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  252. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  253. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  254. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  255. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  256. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  257. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
  258. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  259. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  260. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  261. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  262. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +173 -177
  263. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  264. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  265. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  266. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  267. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  268. data/spec/mongoid/association/syncable_spec.rb +15 -1
  269. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  270. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  271. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  272. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  273. data/spec/mongoid/attributes_spec.rb +510 -33
  274. data/spec/mongoid/changeable_spec.rb +429 -37
  275. data/spec/mongoid/clients/factory_spec.rb +23 -30
  276. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  277. data/spec/mongoid/clients_spec.rb +149 -15
  278. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  279. data/spec/mongoid/config/defaults_spec.rb +160 -0
  280. data/spec/mongoid/config_spec.rb +214 -31
  281. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  282. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  283. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  284. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  285. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  286. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  287. data/spec/mongoid/contextual/mongo_spec.rb +1572 -435
  288. data/spec/mongoid/contextual/none_spec.rb +60 -21
  289. data/spec/mongoid/copyable_spec.rb +453 -11
  290. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  291. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  292. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  293. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  294. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  295. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  296. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  297. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  298. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  299. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  300. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  301. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  302. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  303. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  304. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  305. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  306. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  307. data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
  308. data/spec/mongoid/criteria/queryable/selector_spec.rb +90 -5
  309. data/spec/mongoid/criteria/queryable/storable_spec.rb +72 -0
  310. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  311. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  312. data/spec/mongoid/criteria_spec.rb +469 -1205
  313. data/spec/mongoid/document_fields_spec.rb +173 -24
  314. data/spec/mongoid/document_spec.rb +32 -41
  315. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  316. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  317. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  318. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  319. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  320. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  321. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  322. data/spec/mongoid/extensions/array_spec.rb +16 -2
  323. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  324. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  325. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  326. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  327. data/spec/mongoid/extensions/date_spec.rb +71 -1
  328. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  329. data/spec/mongoid/extensions/float_spec.rb +53 -74
  330. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  331. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  332. data/spec/mongoid/extensions/range_spec.rb +255 -54
  333. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  334. data/spec/mongoid/extensions/set_spec.rb +106 -0
  335. data/spec/mongoid/extensions/string_spec.rb +53 -25
  336. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  337. data/spec/mongoid/extensions/time_spec.rb +639 -106
  338. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  339. data/spec/mongoid/factory_spec.rb +61 -1
  340. data/spec/mongoid/fields/localized_spec.rb +80 -37
  341. data/spec/mongoid/fields_spec.rb +500 -84
  342. data/spec/mongoid/findable_spec.rb +450 -58
  343. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  344. data/spec/mongoid/indexable_spec.rb +55 -30
  345. data/spec/mongoid/interceptable_spec.rb +599 -8
  346. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  347. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  348. data/spec/mongoid/mongoizable_spec.rb +285 -0
  349. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  350. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  351. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  352. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  353. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  354. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  355. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  356. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  357. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  358. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  359. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  360. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  361. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  362. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  363. data/spec/mongoid/persistence_context_spec.rb +31 -57
  364. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  365. data/spec/mongoid/query_cache_spec.rb +56 -215
  366. data/spec/mongoid/reloadable_spec.rb +83 -6
  367. data/spec/mongoid/scopable_spec.rb +91 -1
  368. data/spec/mongoid/serializable_spec.rb +9 -30
  369. data/spec/mongoid/shardable_spec.rb +4 -4
  370. data/spec/mongoid/stateful_spec.rb +150 -8
  371. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  372. data/spec/mongoid/tasks/database_spec.rb +127 -0
  373. data/spec/mongoid/timestamps_spec.rb +392 -4
  374. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  375. data/spec/mongoid/touchable_spec.rb +390 -2
  376. data/spec/mongoid/touchable_spec_models.rb +14 -8
  377. data/spec/mongoid/traversable_spec.rb +13 -35
  378. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  379. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  380. data/spec/mongoid/warnings_spec.rb +35 -0
  381. data/spec/mongoid_spec.rb +34 -16
  382. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  383. data/spec/rails/mongoid_spec.rb +4 -16
  384. data/spec/spec_helper.rb +5 -0
  385. data/spec/support/constraints.rb +24 -0
  386. data/spec/support/immutable_ids.rb +118 -0
  387. data/spec/support/macros.rb +78 -0
  388. data/spec/support/models/artist.rb +0 -1
  389. data/spec/support/models/augmentation.rb +12 -0
  390. data/spec/support/models/band.rb +4 -0
  391. data/spec/support/models/book.rb +1 -0
  392. data/spec/support/models/building.rb +2 -0
  393. data/spec/support/models/catalog.rb +24 -0
  394. data/spec/support/models/circus.rb +3 -0
  395. data/spec/support/models/cover.rb +10 -0
  396. data/spec/support/models/fanatic.rb +8 -0
  397. data/spec/support/models/implant.rb +9 -0
  398. data/spec/support/models/label.rb +2 -0
  399. data/spec/support/models/passport.rb +9 -0
  400. data/spec/support/models/person.rb +2 -0
  401. data/spec/support/models/player.rb +2 -0
  402. data/spec/support/models/powerup.rb +12 -0
  403. data/spec/support/models/product.rb +1 -0
  404. data/spec/support/models/purse.rb +9 -0
  405. data/spec/support/models/registry.rb +1 -0
  406. data/spec/support/models/school.rb +14 -0
  407. data/spec/support/models/shield.rb +18 -0
  408. data/spec/support/models/student.rb +14 -0
  409. data/spec/support/models/weapon.rb +12 -0
  410. data.tar.gz.sig +0 -0
  411. metadata +718 -641
  412. metadata.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
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "mongoid/config/defaults"
3
4
  require "mongoid/config/environment"
4
5
  require "mongoid/config/options"
5
6
  require "mongoid/config/validators"
@@ -11,6 +12,7 @@ module Mongoid
11
12
  module Config
12
13
  extend Forwardable
13
14
  extend Options
15
+ extend Defaults
14
16
  extend self
15
17
 
16
18
  def_delegators ::Mongoid, :logger, :logger=
@@ -70,57 +72,125 @@ module Mongoid
70
72
 
71
73
  # Use ActiveSupport's time zone in time operations instead of the
72
74
  # Ruby default time zone.
75
+ # @deprecated
73
76
  option :use_activesupport_time_zone, default: true
74
77
 
75
78
  # Return stored times as UTC.
76
79
  option :use_utc, default: false
77
80
 
81
+ # Store BigDecimals as Decimal128s instead of strings in the db.
82
+ option :map_big_decimal_to_decimal128, default: true
83
+
78
84
  # Update embedded documents correctly when setting it, unsetting it
79
85
  # and resetting it. See MONGOID-5206 and MONGOID-5240 for more details.
80
- option :broken_updates, default: true
86
+ option :broken_updates, default: false
81
87
 
82
88
  # Maintain legacy behavior of === on Mongoid documents, which returns
83
89
  # true in a number of cases where Ruby's === implementation would
84
90
  # return false.
85
- option :legacy_triple_equals, default: true
91
+ option :legacy_triple_equals, default: false
86
92
 
87
93
  # When exiting a nested `with_scope' block, set the current scope to
88
94
  # nil instead of the parent scope for backwards compatibility.
89
- option :broken_scoping, default: true
95
+ option :broken_scoping, default: false
90
96
 
91
97
  # Maintain broken behavior of sum over empty result sets for backwards
92
98
  # compatibility.
93
- option :broken_aggregables, default: true
99
+ option :broken_aggregables, default: false
94
100
 
95
101
  # Ignore aliased fields in embedded documents when performing pluck and
96
102
  # distinct operations, for backwards compatibility.
97
- option :broken_alias_handling, default: true
103
+ option :broken_alias_handling, default: false
98
104
 
99
105
  # Maintain broken `and' behavior when using the same operator on the same
100
106
  # field multiple times for backwards compatibility.
101
- option :broken_and, default: true
107
+ option :broken_and, default: false
102
108
 
103
109
  # Use millisecond precision when comparing Time objects with the _matches?
104
110
  # function.
105
- option :compare_time_by_ms, default: false
111
+ option :compare_time_by_ms, default: true
106
112
 
107
113
  # Use bson-ruby's implementation of as_json for BSON::ObjectId instead of
108
114
  # the one monkey-patched into Mongoid.
109
- option :object_id_as_json_oid, default: true
115
+ option :object_id_as_json_oid, default: false
110
116
 
111
117
  # Maintain legacy behavior of pluck and distinct, which does not
112
118
  # demongoize the values on returning them.
113
- option :legacy_pluck_distinct, default: true
119
+ option :legacy_pluck_distinct, default: false
114
120
 
115
121
  # Combine chained operators, which use the same field and operator,
116
122
  # using and's instead of overwriting them.
117
- option :overwrite_chained_operators, default: true
123
+ option :overwrite_chained_operators, default: false
118
124
 
119
125
  # When this flag is true, the attributes method on a document will return
120
126
  # a BSON::Document when that document is retrieved from the database, and
121
127
  # a Hash otherwise. When this flag is false, the attributes method will
122
128
  # always return a Hash.
123
- option :legacy_attributes, default: true
129
+ option :legacy_attributes, default: false
130
+
131
+ # Allow BSON::Decimal128 to be parsed and returned directly in
132
+ # field values. When BSON 5 is present and the this option is set to false
133
+ # (the default), BSON::Decimal128 values in the database will be returned
134
+ # as BigDecimal.
135
+ #
136
+ # @note this option only has effect when BSON 5+ is present. Otherwise,
137
+ # the setting is ignored.
138
+ option :allow_bson5_decimal128, default: false, on_change: -> (allow) do
139
+ if BSON::VERSION >= '5.0.0'
140
+ if allow
141
+ BSON::Registry.register(BSON::Decimal128::BSON_TYPE, BSON::Decimal128)
142
+ else
143
+ BSON::Registry.register(BSON::Decimal128::BSON_TYPE, BigDecimal)
144
+ end
145
+ end
146
+ end
147
+
148
+ # Sets the async_query_executor for the application. By default the thread pool executor
149
+ # is set to `:immediate. Options are:
150
+ #
151
+ # - :immediate - Initializes a single +Concurrent::ImmediateExecutor+
152
+ # - :global_thread_pool - Initializes a single +Concurrent::ThreadPoolExecutor+
153
+ # that uses the +async_query_concurrency+ for the +max_threads+ value.
154
+ option :async_query_executor, default: :immediate
155
+
156
+ # Defines how many asynchronous queries can be executed concurrently.
157
+ # This option should be set only if `async_query_executor` is set
158
+ # to `:global_thread_pool`.
159
+ option :global_executor_concurrency, default: nil
160
+
161
+ # When this flag is false, a document will become read-only only once the
162
+ # #readonly! method is called, and an error will be raised on attempting
163
+ # to save or update such documents, instead of just on delete. When this
164
+ # flag is true, a document is only read-only if it has been projected
165
+ # using #only or #without, and read-only documents will not be
166
+ # deletable/destroyable, but they will be savable/updatable.
167
+ # When this feature flag is turned on, the read-only state will be reset on
168
+ # reload, but when it is turned off, it won't be.
169
+ option :legacy_readonly, default: true
170
+
171
+ # When this flag is true, any attempt to change the _id of a persisted
172
+ # document will raise an exception (`Errors::ImmutableAttribute`).
173
+ # This will be the default in 9.0. When this flag is false (the default
174
+ # in 8.x), changing the _id of a persisted document might be ignored,
175
+ # or it might work, depending on the situation.
176
+ option :immutable_ids, default: false
177
+
178
+ # When this flag is true, callbacks for every embedded document will be
179
+ # called only once, even if the embedded document is embedded in multiple
180
+ # documents in the root document's dependencies graph.
181
+ # This will be the default in 9.0. Setting this flag to false restores the
182
+ # pre-9.0 behavior, where callbacks are called for every occurrence of an
183
+ # embedded document. The pre-9.0 behavior leads to a problem that for multi
184
+ # level nested documents callbacks are called multiple times.
185
+ # See https://jira.mongodb.org/browse/MONGOID-5542
186
+ option :prevent_multiple_calls_of_embedded_callbacks, default: false
187
+
188
+ # Returns the Config singleton, for use in the configure DSL.
189
+ #
190
+ # @return [ self ] The Config singleton.
191
+ def config
192
+ self
193
+ end
124
194
 
125
195
  # Has Mongoid been configured? This is checking that at least a valid
126
196
  # client config exists.
@@ -128,7 +198,7 @@ module Mongoid
128
198
  # @example Is Mongoid configured?
129
199
  # config.configured?
130
200
  #
131
- # @return [ true, false ] If Mongoid is configured.
201
+ # @return [ true | false ] If Mongoid is configured.
132
202
  def configured?
133
203
  clients.key?(:default)
134
204
  end
@@ -169,7 +239,7 @@ module Mongoid
169
239
  # Mongoid.load!("/path/to/mongoid.yml")
170
240
  #
171
241
  # @param [ String ] path The path to the file.
172
- # @param [ String, Symbol ] environment The environment to load.
242
+ # @param [ String | Symbol ] environment The environment to load.
173
243
  def load!(path, environment = nil)
174
244
  settings = Environment.load_yaml(path, environment)
175
245
  if settings.present?
@@ -203,6 +273,17 @@ module Mongoid
203
273
  end
204
274
  end
205
275
 
276
+ # Deregister a model in the application with Mongoid.
277
+ #
278
+ # @param [ Class ] klass The model to deregister.
279
+ #
280
+ # @api private
281
+ def deregister_model(klass)
282
+ LOCK.synchronize do
283
+ models.delete(klass)
284
+ end
285
+ end
286
+
206
287
  # From a hash of settings, load all the configuration.
207
288
  #
208
289
  # @example Load the configuration.
@@ -213,6 +294,7 @@ module Mongoid
213
294
  configuration = settings.with_indifferent_access
214
295
  self.options = configuration[:options]
215
296
  self.clients = configuration[:clients]
297
+ Mongo.options = configuration[:driver_options] || {}
216
298
  set_log_levels
217
299
  end
218
300
 
@@ -221,9 +303,9 @@ module Mongoid
221
303
  # @example Override the database globally.
222
304
  # config.override_database(:optional)
223
305
  #
224
- # @param [ String, Symbol ] name The name of the database.
306
+ # @param [ String | Symbol ] name The name of the database.
225
307
  #
226
- # @return [ String, Symbol ] The global override.
308
+ # @return [ String | Symbol ] The global override.
227
309
  def override_database(name)
228
310
  Threaded.database_override = name
229
311
  end
@@ -233,9 +315,9 @@ module Mongoid
233
315
  # @example Override the client globally.
234
316
  # config.override_client(:optional)
235
317
  #
236
- # @param [ String, Symbol ] name The name of the client.
318
+ # @param [ String | Symbol ] name The name of the client.
237
319
  #
238
- # @return [ String, Symbol ] The global override.
320
+ # @return [ String | Symbol ] The global override.
239
321
  def override_client(name)
240
322
  Threaded.client_override = name ? name.to_s : nil
241
323
  end
@@ -274,6 +356,7 @@ module Mongoid
274
356
  # @param [ Hash ] options The configuration options.
275
357
  def options=(options)
276
358
  if options
359
+ Validators::AsyncQueryExecutor.validate(options)
277
360
  options.each_pair do |option, value|
278
361
  Validators::Option.validate(option)
279
362
  send("#{option}=", value)
@@ -306,7 +389,7 @@ module Mongoid
306
389
  # @example Is the application using passenger?
307
390
  # config.running_with_passenger?
308
391
  #
309
- # @return [ true, false ] If the app is deployed on Passenger.
392
+ # @return [ true | false ] If the app is deployed on Passenger.
310
393
  def running_with_passenger?
311
394
  @running_with_passenger ||= defined?(PhusionPassenger)
312
395
  end
@@ -341,5 +424,44 @@ module Mongoid
341
424
  client
342
425
  end
343
426
  end
427
+
428
+ module DeprecatedOptions
429
+ OPTIONS = %i[ use_activesupport_time_zone
430
+ broken_aggregables
431
+ broken_alias_handling
432
+ broken_and
433
+ broken_scoping
434
+ broken_updates
435
+ compare_time_by_ms
436
+ legacy_attributes
437
+ legacy_pluck_distinct
438
+ legacy_triple_equals
439
+ object_id_as_json_oid
440
+ overwrite_chained_operators ]
441
+
442
+ if RUBY_VERSION < '3.0'
443
+ def self.prepended(klass)
444
+ klass.class_eval do
445
+ OPTIONS.each do |option|
446
+ alias_method :"#{option}_without_deprecation=", :"#{option}="
447
+
448
+ define_method(:"#{option}=") do |value|
449
+ Mongoid::Warnings.send(:"warn_#{option}_deprecated")
450
+ send(:"#{option}_without_deprecation=", value)
451
+ end
452
+ end
453
+ end
454
+ end
455
+ else
456
+ OPTIONS.each do |option|
457
+ define_method(:"#{option}=") do |value|
458
+ Mongoid::Warnings.send(:"warn_#{option}_deprecated")
459
+ super(value)
460
+ end
461
+ end
462
+ end
463
+ end
464
+
465
+ prepend DeprecatedOptions
344
466
  end
345
467
  end
@@ -9,7 +9,7 @@ module Mongoid
9
9
  # Get all the aggregate values for the provided field.
10
10
  # Provided for interface consistency with Aggregable::Mongo.
11
11
  #
12
- # @param [ String, Symbol ] field The field name.
12
+ # @param [ String | Symbol ] field The field name.
13
13
  #
14
14
  # @return [ Hash ] A Hash containing the aggregate values.
15
15
  # If no documents are present, then returned Hash will have
@@ -27,9 +27,13 @@ module Mongoid
27
27
  #
28
28
  # @param [ Symbol ] field The field to average.
29
29
  #
30
- # @return [ Float ] The average.
30
+ # @return [ Numeric ] The average.
31
31
  def avg(field)
32
- count > 0 ? sum(field).to_f / count.to_f : nil
32
+ total = count { |doc| !doc.send(field).nil? }
33
+ return nil unless total > 0
34
+
35
+ total = total.to_f if total.is_a?(Integer)
36
+ sum(field) / total
33
37
  end
34
38
 
35
39
  # Get the max value of the provided field. If provided a block, will
@@ -46,10 +50,12 @@ module Mongoid
46
50
  #
47
51
  # @param [ Symbol ] field The field to max.
48
52
  #
49
- # @return [ Float, Document ] The max value or document with the max
53
+ # @return [ Numeric | Document ] The max value or document with the max
50
54
  # value.
51
55
  def max(field = nil)
52
- block_given? ? super() : aggregate_by(field, :max_by)
56
+ return super() if block_given?
57
+
58
+ aggregate_by(field, :max)
53
59
  end
54
60
 
55
61
  # Get the min value of the provided field. If provided a block, will
@@ -66,10 +72,12 @@ module Mongoid
66
72
  #
67
73
  # @param [ Symbol ] field The field to min.
68
74
  #
69
- # @return [ Float, Document ] The min value or document with the min
75
+ # @return [ Numeric | Document ] The min value or document with the min
70
76
  # value.
71
77
  def min(field = nil)
72
- block_given? ? super() : aggregate_by(field, :min_by)
78
+ return super() if block_given?
79
+
80
+ aggregate_by(field, :min)
73
81
  end
74
82
 
75
83
  # Get the sum value of the provided field. If provided a block, will
@@ -83,13 +91,11 @@ module Mongoid
83
91
  #
84
92
  # @param [ Symbol ] field The field to sum.
85
93
  #
86
- # @return [ Float ] The sum value.
94
+ # @return [ Numeric ] The sum value.
87
95
  def sum(field = nil)
88
- if block_given?
89
- super()
90
- else
91
- count > 0 ? super(0) { |doc| doc.public_send(field) } : 0
92
- end
96
+ return super() if block_given?
97
+
98
+ aggregate_by(field, :sum) || 0
93
99
  end
94
100
 
95
101
  private
@@ -99,14 +105,16 @@ module Mongoid
99
105
  # @api private
100
106
  #
101
107
  # @example Aggregate by the field and method.
102
- # aggregable.aggregate_by(:name, :min_by)
108
+ # aggregable.aggregate_by(:likes, :min_by)
103
109
  #
104
110
  # @param [ Symbol ] field The field to aggregate on.
105
111
  # @param [ Symbol ] method The method (min_by or max_by).
106
112
  #
107
- # @return [ Integer ] The aggregate.
113
+ # @return [ Numeric | nil ] The aggregate.
108
114
  def aggregate_by(field, method)
109
- count > 0 ? send(method) { |doc| doc.public_send(field) }.public_send(field) : nil
115
+ return nil unless any?
116
+
117
+ map { |doc| doc.public_send(field) }.compact.public_send(method)
110
118
  end
111
119
  end
112
120
  end
@@ -20,13 +20,13 @@ module Mongoid
20
20
  # # "avg" => 750.0
21
21
  # # }
22
22
  #
23
- # @param [ String, Symbol ] field The field name.
23
+ # @param [ String | Symbol ] field The field name.
24
24
  #
25
25
  # @return [ Hash ] A Hash containing the aggregate values.
26
26
  # If no documents are found, then returned Hash will have
27
27
  # count, sum of 0 and max, min, avg of nil.
28
28
  def aggregates(field)
29
- result = collection.find.aggregate(pipeline(field), session: _session).to_a
29
+ result = collection.aggregate(pipeline(field), session: _session).to_a
30
30
  if result.empty?
31
31
  if Mongoid.broken_aggregables
32
32
  { "count" => 0, "sum" => nil, "avg" => nil, "min" => nil, "max" => nil }
@@ -64,7 +64,7 @@ module Mongoid
64
64
  #
65
65
  # @param [ Symbol ] field The field to max.
66
66
  #
67
- # @return [ Float, Document ] The max value or document with the max
67
+ # @return [ Float | Document ] The max value or document with the max
68
68
  # value.
69
69
  def max(field = nil)
70
70
  block_given? ? super() : aggregates(field)["max"]
@@ -84,7 +84,7 @@ module Mongoid
84
84
  #
85
85
  # @param [ Symbol ] field The field to min.
86
86
  #
87
- # @return [ Float, Document ] The min value or document with the min
87
+ # @return [ Float | Document ] The min value or document with the min
88
88
  # value.
89
89
  def min(field = nil)
90
90
  block_given? ? super() : aggregates(field)["min"]
@@ -115,7 +115,7 @@ module Mongoid
115
115
  # @example Get the pipeline.
116
116
  # aggregable.pipeline(:likes)
117
117
  #
118
- # @param [ String, Symbol ] field The name of the field.
118
+ # @param [ String | Symbol ] field The name of the field.
119
119
  #
120
120
  # @return [ Array ] The array of pipeline operators.
121
121
  def pipeline(field)
@@ -11,7 +11,7 @@ module Mongoid
11
11
  # Get all the aggregate values for the provided field in null context.
12
12
  # Provided for interface consistency with Aggregable::Mongo.
13
13
  #
14
- # @param [ String, Symbol ] _field The field name.
14
+ # @param [ String | Symbol ] _field The field name.
15
15
  #
16
16
  # @return [ Hash ] A Hash with count, sum of 0 and max, min, avg of nil.
17
17
  def aggregates(_field)
@@ -150,7 +150,7 @@ module Mongoid
150
150
  # @example Unset the field on the matches.
151
151
  # context.unset(:name)
152
152
  #
153
- # @param [ String | Symbol | Array<String|Symbol> | Hash ] args
153
+ # @param [ [ String | Symbol | Array<String | Symbol> | Hash ]... ] *args
154
154
  # The name(s) of the field(s) to unset.
155
155
  # If a Hash is specified, its keys will be used irrespective of what
156
156
  # each key's value is, even if the value is nil or false.
@@ -16,7 +16,7 @@ module Mongoid
16
16
  # @example Get the average distance.
17
17
  # geo_near.average_distance
18
18
  #
19
- # @return [ Float, nil ] The average distance.
19
+ # @return [ Float | nil ] The average distance.
20
20
  def average_distance
21
21
  average = stats["avgDistance"]
22
22
  (average.nil? || average.nan?) ? nil : average
@@ -46,7 +46,7 @@ module Mongoid
46
46
  # @example Provide the distance multiplier.
47
47
  # geo_near.distance_multiplier(13113.1)
48
48
  #
49
- # @param [ Integer, Float ] value The distance multiplier.
49
+ # @param [ Integer | Float ] value The distance multiplier.
50
50
  #
51
51
  # @return [ GeoNear ] The GeoNear wrapper.
52
52
  def distance_multiplier(value)
@@ -98,9 +98,9 @@ module Mongoid
98
98
  # @example Get the max distance.
99
99
  # geo_near.max_distance
100
100
  #
101
- # @param [ Integer, Float ] value The maximum distance.
101
+ # @param [ Integer | Float ] value The maximum distance.
102
102
  #
103
- # @return [ GeoNear, Float ] The GeoNear command or the value.
103
+ # @return [ GeoNear | Float ] The GeoNear command or the value.
104
104
  def max_distance(value = nil)
105
105
  if value
106
106
  command[:maxDistance] = value
@@ -115,7 +115,7 @@ module Mongoid
115
115
  # @example Set the min distance.
116
116
  # geo_near.min_distance(0.5)
117
117
  #
118
- # @param [ Integer, Float ] value The minimum distance.
118
+ # @param [ Integer | Float ] value The minimum distance.
119
119
  #
120
120
  # @return [ GeoNear ] The GeoNear command.
121
121
  def min_distance(value)
@@ -139,7 +139,7 @@ module Mongoid
139
139
  # @example Set the unique flag.
140
140
  # geo_near.unique(false)
141
141
  #
142
- # @param [ true, false ] value Whether to return unique documents.
142
+ # @param [ true | false ] value Whether to return unique documents.
143
143
  #
144
144
  # @return [ GeoNear ] The command.
145
145
  def unique(value = true)
@@ -211,7 +211,7 @@ module Mongoid
211
211
  # @example Get the documents.
212
212
  # geo_near.documents
213
213
  #
214
- # @return [ Array, Cursor ] The documents.
214
+ # @return [ Array | Cursor ] The documents.
215
215
  def documents
216
216
  results["results"].map do |attributes|
217
217
  doc = Factory.from_db(criteria.klass, attributes["obj"], criteria)
@@ -121,7 +121,7 @@ module Mongoid
121
121
  # @return [ MapReduce ] The map/reduce object.
122
122
  def out(location)
123
123
  normalized = location.dup
124
- normalized.update_values do |value|
124
+ normalized.transform_values! do |value|
125
125
  value.is_a?(::Symbol) ? value.to_s : value
126
126
  end
127
127
  @map_reduce = @map_reduce.out(normalized)
@@ -147,7 +147,7 @@ module Mongoid
147
147
  def raw
148
148
  validate_out!
149
149
  cmd = command
150
- opts = { read: cmd.delete(:read) } if cmd[:read]
150
+ opts = { read: criteria.options.fetch(:read) } if criteria.options[:read]
151
151
  @map_reduce.database.command(cmd, (opts || {}).merge(session: _session)).first
152
152
  end
153
153
  alias :results :raw