mongoid 7.5.4 → 8.1.9

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 (446) 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 +32 -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 +11 -6
  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 +48 -39
  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 +135 -36
  121. data/lib/mongoid/equality.rb +9 -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 +187 -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 +9 -2
  203. data/lib/mongoid/timestamps/updated.rb +2 -2
  204. data/lib/mongoid/touchable.rb +3 -4
  205. data/lib/mongoid/traversable.rb +41 -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 +26 -3
  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/association_spec.rb +60 -0
  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/readonly_spec.rb +19 -0
  274. data/spec/mongoid/attributes_spec.rb +526 -33
  275. data/spec/mongoid/changeable_spec.rb +429 -37
  276. data/spec/mongoid/clients/factory_spec.rb +23 -30
  277. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  278. data/spec/mongoid/clients_spec.rb +149 -15
  279. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  280. data/spec/mongoid/config/defaults_spec.rb +160 -0
  281. data/spec/mongoid/config_spec.rb +214 -31
  282. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  283. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  284. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  285. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  286. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  287. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  288. data/spec/mongoid/contextual/mongo_spec.rb +2256 -1005
  289. data/spec/mongoid/contextual/none_spec.rb +60 -21
  290. data/spec/mongoid/copyable_spec.rb +453 -11
  291. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  292. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  293. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  294. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  295. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  296. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  297. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  298. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  299. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  300. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  301. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  302. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  303. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  304. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  305. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  306. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  307. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  308. data/spec/mongoid/criteria/queryable/selectable_spec.rb +107 -86
  309. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
  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 +59 -41
  315. data/spec/mongoid/equality_spec.rb +6 -0
  316. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  317. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  318. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  319. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  320. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  321. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  322. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  323. data/spec/mongoid/extensions/array_spec.rb +16 -2
  324. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  325. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  326. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  327. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  328. data/spec/mongoid/extensions/date_spec.rb +71 -1
  329. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  330. data/spec/mongoid/extensions/float_spec.rb +53 -74
  331. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  332. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  333. data/spec/mongoid/extensions/range_spec.rb +255 -54
  334. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  335. data/spec/mongoid/extensions/set_spec.rb +106 -0
  336. data/spec/mongoid/extensions/string_spec.rb +53 -25
  337. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  338. data/spec/mongoid/extensions/time_spec.rb +639 -106
  339. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  340. data/spec/mongoid/factory_spec.rb +61 -1
  341. data/spec/mongoid/fields/localized_spec.rb +80 -37
  342. data/spec/mongoid/fields_spec.rb +503 -87
  343. data/spec/mongoid/findable_spec.rb +450 -58
  344. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  345. data/spec/mongoid/indexable_spec.rb +55 -30
  346. data/spec/mongoid/interceptable_spec.rb +904 -22
  347. data/spec/mongoid/interceptable_spec_models.rb +189 -22
  348. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  349. data/spec/mongoid/mongoizable_spec.rb +285 -0
  350. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  351. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  352. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  353. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  354. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  355. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  356. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  357. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  358. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  359. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  360. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  361. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  362. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  363. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  364. data/spec/mongoid/persistence_context_spec.rb +31 -57
  365. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  366. data/spec/mongoid/query_cache_spec.rb +56 -215
  367. data/spec/mongoid/reloadable_spec.rb +83 -6
  368. data/spec/mongoid/scopable_spec.rb +91 -1
  369. data/spec/mongoid/serializable_spec.rb +25 -39
  370. data/spec/mongoid/shardable_spec.rb +4 -4
  371. data/spec/mongoid/stateful_spec.rb +150 -8
  372. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  373. data/spec/mongoid/tasks/database_spec.rb +127 -0
  374. data/spec/mongoid/timestamps/created_spec.rb +23 -0
  375. data/spec/mongoid/timestamps_spec.rb +392 -4
  376. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  377. data/spec/mongoid/touchable_spec.rb +390 -2
  378. data/spec/mongoid/touchable_spec_models.rb +14 -8
  379. data/spec/mongoid/traversable_spec.rb +13 -35
  380. data/spec/mongoid/validatable/associated_spec.rb +27 -34
  381. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  382. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  383. data/spec/mongoid/warnings_spec.rb +35 -0
  384. data/spec/mongoid_spec.rb +34 -16
  385. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  386. data/spec/rails/mongoid_spec.rb +4 -16
  387. data/spec/spec_helper.rb +5 -0
  388. data/spec/support/constraints.rb +24 -0
  389. data/spec/support/immutable_ids.rb +118 -0
  390. data/spec/support/macros.rb +78 -0
  391. data/spec/support/models/artist.rb +0 -1
  392. data/spec/support/models/augmentation.rb +12 -0
  393. data/spec/support/models/band.rb +5 -0
  394. data/spec/support/models/book.rb +1 -0
  395. data/spec/support/models/building.rb +2 -0
  396. data/spec/support/models/catalog.rb +24 -0
  397. data/spec/support/models/circus.rb +3 -0
  398. data/spec/support/models/cover.rb +10 -0
  399. data/spec/support/models/fanatic.rb +8 -0
  400. data/spec/support/models/implant.rb +9 -0
  401. data/spec/support/models/label.rb +2 -0
  402. data/spec/support/models/lat_lng.rb +6 -0
  403. data/spec/support/models/name.rb +10 -0
  404. data/spec/support/models/passport.rb +9 -0
  405. data/spec/support/models/person.rb +2 -0
  406. data/spec/support/models/player.rb +2 -0
  407. data/spec/support/models/powerup.rb +12 -0
  408. data/spec/support/models/product.rb +1 -0
  409. data/spec/support/models/purse.rb +9 -0
  410. data/spec/support/models/registry.rb +1 -0
  411. data/spec/support/models/school.rb +14 -0
  412. data/spec/support/models/shield.rb +18 -0
  413. data/spec/support/models/student.rb +14 -0
  414. data/spec/support/models/weapon.rb +12 -0
  415. metadata +98 -96
  416. checksums.yaml.gz.sig +0 -0
  417. data/lib/mongoid/errors/eager_load.rb +0 -23
  418. data/lib/mongoid/errors/invalid_value.rb +0 -17
  419. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  420. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  421. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
  422. data/spec/shared/LICENSE +0 -20
  423. data/spec/shared/bin/get-mongodb-download-url +0 -17
  424. data/spec/shared/bin/s3-copy +0 -45
  425. data/spec/shared/bin/s3-upload +0 -69
  426. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  427. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  428. data/spec/shared/lib/mrss/constraints.rb +0 -378
  429. data/spec/shared/lib/mrss/docker_runner.rb +0 -291
  430. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  431. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  432. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  433. data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
  434. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  435. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  436. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  437. data/spec/shared/lib/mrss/utils.rb +0 -15
  438. data/spec/shared/share/Dockerfile.erb +0 -325
  439. data/spec/shared/share/haproxy-1.conf +0 -16
  440. data/spec/shared/share/haproxy-2.conf +0 -17
  441. data/spec/shared/shlib/config.sh +0 -27
  442. data/spec/shared/shlib/distro.sh +0 -74
  443. data/spec/shared/shlib/server.sh +0 -392
  444. data/spec/shared/shlib/set_env.sh +0 -169
  445. data.tar.gz.sig +0 -0
  446. metadata.gz.sig +0 -3
@@ -42,6 +42,16 @@ module Mongoid
42
42
  # @api private
43
43
  IDS = [ :_id, '_id', ].freeze
44
44
 
45
+ # BSON classes that are not supported as field types
46
+ #
47
+ # @api private
48
+ INVALID_BSON_CLASSES = [ BSON::Decimal128, BSON::Int32, BSON::Int64 ].freeze
49
+
50
+ # The suffix for generated translated fields.
51
+ #
52
+ # @api private
53
+ TRANSLATIONS_SFX = '_translations'
54
+
45
55
  module ClassMethods
46
56
  # Returns the list of id fields for this model class, as both strings
47
57
  # and symbols.
@@ -94,8 +104,8 @@ module Mongoid
94
104
  ar.each_with_index do |fn, i|
95
105
  key = fn
96
106
  unless klass.fields.key?(fn) || klass.relations.key?(fn)
97
- if tr = fn.match(/(.*)_translations\z/)&.captures&.first
98
- key = tr
107
+ if fn.end_with?(TRANSLATIONS_SFX)
108
+ key = fn.delete_suffix(TRANSLATIONS_SFX)
99
109
  else
100
110
  key = fn
101
111
  end
@@ -142,7 +152,7 @@ module Mongoid
142
152
  # @example Apply all the non-proc defaults.
143
153
  # model.apply_pre_processed_defaults
144
154
  #
145
- # @return [ Array<String ] The names of the non-proc defaults.
155
+ # @return [ Array<String> ] The names of the non-proc defaults.
146
156
  def apply_pre_processed_defaults
147
157
  pre_processed_defaults.each do |name|
148
158
  apply_default(name)
@@ -154,8 +164,9 @@ module Mongoid
154
164
  # @example Apply all the proc defaults.
155
165
  # model.apply_post_processed_defaults
156
166
  #
157
- # @return [ Array<String ] The names of the proc defaults.
167
+ # @return [ Array<String> ] The names of the proc defaults.
158
168
  def apply_post_processed_defaults
169
+ pending_callbacks.delete(:apply_post_processed_defaults)
159
170
  post_processed_defaults.each do |name|
160
171
  apply_default(name)
161
172
  end
@@ -184,6 +195,7 @@ module Mongoid
184
195
  # @example Apply all the defaults.
185
196
  # model.apply_defaults
186
197
  def apply_defaults
198
+ pending_callbacks.delete(:apply_defaults)
187
199
  apply_pre_processed_defaults
188
200
  apply_post_processed_defaults
189
201
  end
@@ -207,7 +219,7 @@ module Mongoid
207
219
  # @example Get the database field name.
208
220
  # model.database_field_name(:authorization)
209
221
  #
210
- # @param [ String, Symbol ] name The name to get.
222
+ # @param [ String | Symbol ] name The name to get.
211
223
  #
212
224
  # @return [ String ] The name of the field as it's stored in the db.
213
225
  def database_field_name(name)
@@ -222,7 +234,7 @@ module Mongoid
222
234
  # @param [ Field ] field The field.
223
235
  # @param [ Object ] value The current value.
224
236
  #
225
- # @return [ true, false ] If we set the field lazily.
237
+ # @return [ true | false ] If we set the field lazily.
226
238
  def lazy_settable?(field, value)
227
239
  !frozen? && value.nil? && field.lazy?
228
240
  end
@@ -234,11 +246,37 @@ module Mongoid
234
246
  # @example Is the document using object ids?
235
247
  # model.using_object_ids?
236
248
  #
237
- # @return [ true, false ] Using object ids.
249
+ # @return [ true | false ] Using object ids.
238
250
  def using_object_ids?
239
251
  self.class.using_object_ids?
240
252
  end
241
253
 
254
+ # Does this field start with a dollar sign ($) or contain a dot/period (.)?
255
+ #
256
+ # @api private
257
+ #
258
+ # @param [ String ] name The field name.
259
+ #
260
+ # @return [ true | false ] If this field is dotted or dollared.
261
+ def dot_dollar_field?(name)
262
+ n = aliased_fields[name] || name
263
+ fields.key?(n) && (n.include?('.') || n.start_with?('$'))
264
+ end
265
+
266
+ # Validate whether or not the field starts with a dollar sign ($) or
267
+ # contains a dot/period (.).
268
+ #
269
+ # @api private
270
+ #
271
+ # @raise [ InvalidDotDollarAssignment ] If contains dots or starts with a dollar.
272
+ #
273
+ # @param [ String ] name The field name.
274
+ def validate_writable_field_name!(name)
275
+ if dot_dollar_field?(name)
276
+ raise Errors::InvalidDotDollarAssignment.new(self.class, name)
277
+ end
278
+ end
279
+
242
280
  class << self
243
281
 
244
282
  # Stores the provided block to be run when the option name specified is
@@ -363,7 +401,7 @@ module Mongoid
363
401
  # If the belongs_to association is the last part of the name, we will
364
402
  # pass back the _id field.
365
403
  #
366
- # @param [ String, Symbol ] name The name to get.
404
+ # @param [ String | Symbol ] name The name to get.
367
405
  # @param [ Hash ] relations The associations.
368
406
  # @param [ Hash ] alaiased_fields The aliased fields.
369
407
  # @param [ Hash ] alaiased_associations The aliased associations.
@@ -372,12 +410,12 @@ module Mongoid
372
410
  #
373
411
  # @api private
374
412
  def database_field_name(name, relations, aliased_fields, aliased_associations)
413
+ return '' unless name.present?
414
+
375
415
  if Mongoid.broken_alias_handling
376
- return nil unless name
377
416
  normalized = name.to_s
378
417
  aliased_fields[normalized] || normalized
379
418
  else
380
- return nil unless name.present?
381
419
  key = name.to_s
382
420
  segment, remaining = key.split('.', 2)
383
421
 
@@ -422,7 +460,7 @@ module Mongoid
422
460
  # Get the name of the provided field as it is stored in the database.
423
461
  # Used in determining if the field is aliased or not.
424
462
  #
425
- # @param [ String, Symbol ] name The name to get.
463
+ # @param [ String | Symbol ] name The name to get.
426
464
  #
427
465
  # @return [ String ] The name of the field as it's stored in the db.
428
466
  def database_field_name(name)
@@ -474,7 +512,7 @@ module Mongoid
474
512
  # @example Does this class use object ids?
475
513
  # person.using_object_ids?
476
514
  #
477
- # @return [ true, false ] If the class uses BSON::ObjectIds for the id.
515
+ # @return [ true | false ] If the class uses BSON::ObjectIds for the id.
478
516
  def using_object_ids?
479
517
  fields["_id"].object_id_field?
480
518
  end
@@ -505,6 +543,8 @@ module Mongoid
505
543
  # Model.add_defaults(field)
506
544
  #
507
545
  # @param [ Field ] field The field to add for.
546
+ #
547
+ # @api private
508
548
  def add_defaults(field)
509
549
  default, name = field.default_val, field.name.to_s
510
550
  remove_defaults(name)
@@ -524,6 +564,8 @@ module Mongoid
524
564
  #
525
565
  # @param [ Symbol ] name The name of the field.
526
566
  # @param [ Hash ] options The hash of options.
567
+ #
568
+ # @api private
527
569
  def add_field(name, options = {})
528
570
  aliased = options[:as]
529
571
  aliased_fields[aliased.to_s] = name if aliased
@@ -551,6 +593,8 @@ module Mongoid
551
593
  # # => "called"
552
594
  #
553
595
  # @param [ Field ] field the field to process
596
+ #
597
+ # @api private
554
598
  def process_options(field)
555
599
  field_options = field.options
556
600
 
@@ -573,6 +617,8 @@ module Mongoid
573
617
  # @param [ Symbol ] name The name of the field.
574
618
  # @param [ Symbol ] meth The name of the accessor.
575
619
  # @param [ Hash ] options The options.
620
+ #
621
+ # @api private
576
622
  def create_accessors(name, meth, options = {})
577
623
  field = fields[name]
578
624
 
@@ -596,6 +642,8 @@ module Mongoid
596
642
  # @param [ String ] name The name of the attribute.
597
643
  # @param [ String ] meth The name of the method.
598
644
  # @param [ Field ] field The field.
645
+ #
646
+ # @api private
599
647
  def create_field_getter(name, meth, field)
600
648
  generated_methods.module_eval do
601
649
  re_define_method(meth) do
@@ -603,9 +651,7 @@ module Mongoid
603
651
  if lazy_settable?(field, raw)
604
652
  write_attribute(name, field.eval_default(self))
605
653
  else
606
- value = field.demongoize(raw)
607
- attribute_will_change!(name) if value.resizable?
608
- value
654
+ process_raw_attribute(name.to_s, raw, field)
609
655
  end
610
656
  end
611
657
  end
@@ -620,6 +666,8 @@ module Mongoid
620
666
  #
621
667
  # @param [ String ] name The name of the attribute.
622
668
  # @param [ String ] meth The name of the method.
669
+ #
670
+ # @api private
623
671
  def create_field_getter_before_type_cast(name, meth)
624
672
  generated_methods.module_eval do
625
673
  re_define_method("#{meth}_before_type_cast") do
@@ -640,6 +688,8 @@ module Mongoid
640
688
  # @param [ String ] name The name of the attribute.
641
689
  # @param [ String ] meth The name of the method.
642
690
  # @param [ Field ] field The field.
691
+ #
692
+ # @api private
643
693
  def create_field_setter(name, meth, field)
644
694
  generated_methods.module_eval do
645
695
  re_define_method("#{meth}=") do |value|
@@ -659,6 +709,8 @@ module Mongoid
659
709
  #
660
710
  # @param [ String ] name The name of the attribute.
661
711
  # @param [ String ] meth The name of the method.
712
+ #
713
+ # @api private
662
714
  def create_field_check(name, meth)
663
715
  generated_methods.module_eval do
664
716
  re_define_method("#{meth}?") do
@@ -675,13 +727,15 @@ module Mongoid
675
727
  #
676
728
  # @param [ String ] name The name of the attribute.
677
729
  # @param [ String ] meth The name of the method.
730
+ #
731
+ # @api private
678
732
  def create_translations_getter(name, meth)
679
733
  generated_methods.module_eval do
680
- re_define_method("#{meth}_translations") do
734
+ re_define_method("#{meth}#{TRANSLATIONS_SFX}") do
681
735
  attributes[name] ||= {}
682
736
  attributes[name].with_indifferent_access
683
737
  end
684
- alias_method :"#{meth}_t", :"#{meth}_translations"
738
+ alias_method :"#{meth}_t", :"#{meth}#{TRANSLATIONS_SFX}"
685
739
  end
686
740
  end
687
741
 
@@ -693,18 +747,18 @@ module Mongoid
693
747
  # @param [ String ] name The name of the attribute.
694
748
  # @param [ String ] meth The name of the method.
695
749
  # @param [ Field ] field The field.
750
+ #
751
+ # @api private
696
752
  def create_translations_setter(name, meth, field)
697
753
  generated_methods.module_eval do
698
- re_define_method("#{meth}_translations=") do |value|
754
+ re_define_method("#{meth}#{TRANSLATIONS_SFX}=") do |value|
699
755
  attribute_will_change!(name)
700
- if value
701
- value.update_values do |_value|
702
- field.type.mongoize(_value)
703
- end
756
+ value&.transform_values! do |_value|
757
+ field.type.mongoize(_value)
704
758
  end
705
759
  attributes[name] = value
706
760
  end
707
- alias_method :"#{meth}_t=", :"#{meth}_translations="
761
+ alias_method :"#{meth}_t=", :"#{meth}#{TRANSLATIONS_SFX}="
708
762
  end
709
763
  end
710
764
 
@@ -714,6 +768,8 @@ module Mongoid
714
768
  # Person.generated_methods
715
769
  #
716
770
  # @return [ Module ] The module of generated methods.
771
+ #
772
+ # @api private
717
773
  def generated_methods
718
774
  @generated_methods ||= begin
719
775
  mod = Module.new
@@ -728,27 +784,85 @@ module Mongoid
728
784
  # Model.remove_defaults(name)
729
785
  #
730
786
  # @param [ String ] name The field name.
787
+ #
788
+ # @api private
731
789
  def remove_defaults(name)
732
790
  pre_processed_defaults.delete_one(name)
733
791
  post_processed_defaults.delete_one(name)
734
792
  end
735
793
 
794
+ # Create a field for the given name and options.
795
+ #
796
+ # @param [ Symbol ] name The name of the field.
797
+ # @param [ Hash ] options The hash of options.
798
+ #
799
+ # @return [ Field ] The created field.
800
+ #
801
+ # @api private
736
802
  def field_for(name, options)
737
803
  opts = options.merge(klass: self)
738
- type_mapping = TYPE_MAPPINGS[options[:type]]
739
- opts[:type] = type_mapping || unmapped_type(options)
804
+ opts[:type] = retrieve_and_validate_type(name, options[:type])
740
805
  return Fields::Localized.new(name, opts) if options[:localize]
741
806
  return Fields::ForeignKey.new(name, opts) if options[:identity]
742
807
  Fields::Standard.new(name, opts)
743
808
  end
744
809
 
745
- def unmapped_type(options)
746
- if "Boolean" == options[:type].to_s
810
+ # Get the class for the given type.
811
+ #
812
+ # @param [ Symbol ] name The name of the field.
813
+ # @param [ Symbol | Class ] type The type of the field.
814
+ #
815
+ # @return [ Class ] The type of the field.
816
+ #
817
+ # @raises [ Mongoid::Errors::InvalidFieldType ] if given an invalid field
818
+ # type.
819
+ #
820
+ # @api private
821
+ def retrieve_and_validate_type(name, type)
822
+ result = TYPE_MAPPINGS[type] || unmapped_type(type)
823
+ raise Errors::InvalidFieldType.new(self, name, type) if !result.is_a?(Class)
824
+
825
+ if unsupported_type?(result)
826
+ warn_message = "Using #{result} as the field type is not supported. "
827
+ if result == BSON::Decimal128
828
+ warn_message += 'In BSON <= 4, the BSON::Decimal128 type will work as expected for both storing and querying, but will return a BigDecimal on query in BSON 5+. To use literal BSON::Decimal128 fields with BSON 5, set Mongoid.allow_bson5_decimal128 to true.'
829
+ else
830
+ warn_message += 'Saving values of this type to the database will work as expected, however, querying them will return a value of the native Ruby Integer type.'
831
+ end
832
+ Mongoid.logger.warn(warn_message)
833
+ end
834
+
835
+ result
836
+ end
837
+
838
+ # Returns the type of the field if the type was not in the TYPE_MAPPINGS
839
+ # hash.
840
+ #
841
+ # @param [ Symbol | Class ] type The type of the field.
842
+ #
843
+ # @return [ Class ] The type of the field.
844
+ #
845
+ # @api private
846
+ def unmapped_type(type)
847
+ if "Boolean" == type.to_s
747
848
  Mongoid::Boolean
748
849
  else
749
- options[:type] || Object
850
+ type || Object
750
851
  end
751
852
  end
853
+
854
+ # Queries whether or not the given type is permitted as a declared field
855
+ # type.
856
+ #
857
+ # @param [ Class ] type The type to query
858
+ #
859
+ # @return [ true | false ] whether or not the type is supported
860
+ #
861
+ # @api private
862
+ def unsupported_type?(type)
863
+ return !Mongoid::Config.allow_bson5_decimal128? if type == BSON::Decimal128
864
+ INVALID_BSON_CLASSES.include?(type)
865
+ end
752
866
  end
753
867
  end
754
868
  end
@@ -22,29 +22,44 @@ module Mongoid
22
22
  :each,
23
23
  :each_with_index,
24
24
  :extras,
25
+ :fifth,
26
+ :fifth!,
25
27
  :find_one_and_delete,
26
28
  :find_one_and_replace,
27
29
  :find_one_and_update,
28
30
  :find_or_create_by,
29
31
  :find_or_create_by!,
30
32
  :find_or_initialize_by,
33
+ :first!,
31
34
  :first_or_create,
32
35
  :first_or_create!,
33
36
  :first_or_initialize,
34
37
  :for_js,
38
+ :fourth,
39
+ :fourth!,
35
40
  :geo_near,
36
41
  :includes,
42
+ :last!,
37
43
  :map_reduce,
38
44
  :max,
39
45
  :min,
40
46
  :none,
47
+ :pick,
41
48
  :pluck,
42
49
  :read,
50
+ :second,
51
+ :second!,
52
+ :second_to_last,
53
+ :second_to_last!,
43
54
  :sum,
44
55
  :take,
45
56
  :take!,
46
57
  :tally,
47
58
  :text_search,
59
+ :third,
60
+ :third!,
61
+ :third_to_last,
62
+ :third_to_last!,
48
63
  :update,
49
64
  :update_all,
50
65
 
@@ -75,7 +90,7 @@ module Mongoid
75
90
  # @example Are there no saved documents for this model?
76
91
  # Person.empty?
77
92
  #
78
- # @return [ true, false ] If the collection is empty.
93
+ # @return [ true | false ] If the collection is empty.
79
94
  def empty?
80
95
  count == 0
81
96
  end
@@ -86,9 +101,19 @@ module Mongoid
86
101
  # @example Do any documents exist for the conditions?
87
102
  # Person.exists?
88
103
  #
89
- # @return [ true, false ] If any documents exist for the conditions.
90
- def exists?
91
- with_default_scope.exists?
104
+ # @example Do any documents exist for given _id.
105
+ # Person.exists?(BSON::ObjectId(...))
106
+ #
107
+ # @example Do any documents exist for given conditions.
108
+ # Person.exists?(name: "...")
109
+ #
110
+ # @param [ Hash | Object | false ] id_or_conditions an _id to
111
+ # search for, a hash of conditions, nil or false.
112
+ #
113
+ # @return [ true | false ] If any documents exist for the conditions.
114
+ # Always false if passed nil or false.
115
+ def exists?(id_or_conditions = :none)
116
+ with_default_scope.exists?(id_or_conditions)
92
117
  end
93
118
 
94
119
  # Finds a +Document+ or multiple documents by their _id values.
@@ -121,18 +146,32 @@ module Mongoid
121
146
  # strings will be transparently converted to +BSON::ObjectId+ instances
122
147
  # during query construction.
123
148
  #
149
+ # If this method is given a block, it delegates to +Enumerable#find+ and
150
+ # returns the first document of those found by the current Crieria object
151
+ # for which the block returns a truthy value. If both a block and ids are
152
+ # given, the block is ignored and the documents for the given ids are
153
+ # returned. If a block and a Proc are given, the method delegates to
154
+ # +Enumerable#find+ and uses the proc as the default.
155
+ #
124
156
  # The +find+ method takes into account the default scope defined on the
125
157
  # model class, if any.
126
158
  #
127
- # @param [ Object | Array<Object> ] args The _id values to find or an
128
- # array thereof.
159
+ # @note Each argument can be an individual id, an array of ids or
160
+ # a nested array. Each array will be flattened.
161
+ #
162
+ # @param [ [ Object | Array<Object> ]... ] *args The id(s) to find.
129
163
  #
130
164
  # @return [ Document | Array<Document> | nil ] A document or matching documents.
131
165
  #
132
166
  # @raise Errors::DocumentNotFound If not all documents are found and
133
167
  # the +raise_not_found_error+ Mongoid configuration option is truthy.
134
- def find(*args)
135
- with_default_scope.find(*args)
168
+ def find(*args, &block)
169
+ empty_or_proc = args.empty? || (args.length == 1 && args.first.is_a?(Proc))
170
+ if block_given? && empty_or_proc
171
+ with_default_scope.find(*args, &block)
172
+ else
173
+ with_default_scope.find(*args)
174
+ end
136
175
  end
137
176
 
138
177
  # Find the first +Document+ given the conditions.
@@ -148,7 +187,7 @@ module Mongoid
148
187
  # @raise [ Errors::DocumentNotFound ] If no document found
149
188
  # and Mongoid.raise_not_found_error is true.
150
189
  #
151
- # @return [ Document, nil ] A matching document.
190
+ # @return [ Document | nil ] A matching document.
152
191
  def find_by(attrs = {})
153
192
  result = where(attrs).find_first
154
193
  if result.nil? && Mongoid.raise_not_found_error
@@ -169,7 +208,6 @@ module Mongoid
169
208
  # @raise [ Errors::DocumentNotFound ] If no document found.
170
209
  #
171
210
  # @return [ Document ] A matching document.
172
- #
173
211
  def find_by!(attrs = {})
174
212
  result = where(attrs).find_first
175
213
  raise(Errors::DocumentNotFound.new(self, attrs)) unless result
@@ -182,15 +220,11 @@ module Mongoid
182
220
  # @example Find the first document.
183
221
  # Person.first
184
222
  #
185
- # @param [ Integer | Hash ] limit_or_opts The number of documents to
186
- # return, or a hash of options.
187
- #
188
- # @option limit_or_opts [ :none ] :id_sort This option is deprecated.
189
- # Don't apply a sort on _id if no other sort is defined on the criteria.
223
+ # @param [ Integer ] limit The number of documents to return.
190
224
  #
191
225
  # @return [ Document ] The first matching document.
192
- def first(limit_or_opts = nil)
193
- with_default_scope.first(limit_or_opts)
226
+ def first(limit = nil)
227
+ with_default_scope.first(limit)
194
228
  end
195
229
  alias :one :first
196
230
 
@@ -199,15 +233,11 @@ module Mongoid
199
233
  # @example Find the last document.
200
234
  # Person.last
201
235
  #
202
- # @param [ Integer | Hash ] limit_or_opts The number of documents to
203
- # return, or a hash of options.
204
- #
205
- # @option limit_or_opts [ :none ] :id_sort This option is deprecated.
206
- # Don't apply a sort on _id if no other sort is defined on the criteria.
236
+ # @param [ Integer ] limit The number of documents to return.
207
237
  #
208
238
  # @return [ Document ] The last matching document.
209
- def last(limit_or_opts = nil)
210
- with_default_scope.last(limit_or_opts)
239
+ def last(limit = nil)
240
+ with_default_scope.last(limit)
211
241
  end
212
242
  end
213
243
  end
@@ -27,7 +27,7 @@ module Mongoid
27
27
  #
28
28
  # @param [ Specification ] other The spec to compare against.
29
29
  #
30
- # @return [ true, false ] If the specs are equal.
30
+ # @return [ true | false ] If the specs are equal.
31
31
  def ==(other)
32
32
  fields == other.fields && key == other.key
33
33
  end
@@ -86,7 +86,7 @@ module Mongoid
86
86
  # @api private
87
87
  #
88
88
  # @example Normalize the index options.
89
- # specification.normalize_options(drop_dups: true)
89
+ # specification.normalize_options(unique: true)
90
90
  #
91
91
  # @param [ Hash ] opts The index options.
92
92
  #
@@ -13,7 +13,6 @@ module Mongoid
13
13
  :database,
14
14
  :default_language,
15
15
  :language_override,
16
- :drop_dups,
17
16
  :name,
18
17
  :sparse,
19
18
  :unique,
@@ -29,7 +28,8 @@ module Mongoid
29
28
  :text_version,
30
29
  :version,
31
30
  :partial_filter_expression,
32
- :collation
31
+ :collation,
32
+ :wildcard_projection,
33
33
  ]
34
34
 
35
35
  VALID_TYPES = [
@@ -98,6 +98,10 @@ module Mongoid
98
98
  unless VALID_TYPES.include?(value)
99
99
  raise Errors::InvalidIndex.new(klass, spec, options)
100
100
  end
101
+
102
+ if value == "geoHaystack"
103
+ Mongoid::Warnings.warn_geo_haystack_deprecated
104
+ end
101
105
  end
102
106
  end
103
107
  end