mongoid 7.5.4 → 8.1.3

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 (421) 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/lib/config/locales/en.yml +92 -43
  6. data/lib/mongoid/association/accessors.rb +40 -11
  7. data/lib/mongoid/association/bindable.rb +50 -2
  8. data/lib/mongoid/association/builders.rb +5 -3
  9. data/lib/mongoid/association/constrainable.rb +0 -1
  10. data/lib/mongoid/association/eager_loadable.rb +29 -7
  11. data/lib/mongoid/association/embedded/batchable.rb +34 -11
  12. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  13. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  14. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
  15. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
  16. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  17. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  18. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
  19. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +69 -45
  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 +29 -19
  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 +7 -0
  54. data/lib/mongoid/attributes/dynamic.rb +4 -4
  55. data/lib/mongoid/attributes/nested.rb +6 -6
  56. data/lib/mongoid/attributes/processing.rb +37 -6
  57. data/lib/mongoid/attributes/projector.rb +2 -2
  58. data/lib/mongoid/attributes/readonly.rb +3 -3
  59. data/lib/mongoid/attributes.rb +51 -42
  60. data/lib/mongoid/changeable.rb +147 -14
  61. data/lib/mongoid/clients/options.rb +5 -1
  62. data/lib/mongoid/clients/sessions.rb +2 -14
  63. data/lib/mongoid/clients/storage_options.rb +2 -5
  64. data/lib/mongoid/clients/validators/storage.rb +3 -15
  65. data/lib/mongoid/collection_configurable.rb +58 -0
  66. data/lib/mongoid/composable.rb +2 -0
  67. data/lib/mongoid/config/defaults.rb +60 -0
  68. data/lib/mongoid/config/options.rb +3 -0
  69. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  70. data/lib/mongoid/config/validators/client.rb +6 -6
  71. data/lib/mongoid/config/validators.rb +1 -0
  72. data/lib/mongoid/config.rb +153 -18
  73. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  74. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  75. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  76. data/lib/mongoid/contextual/atomic.rb +1 -1
  77. data/lib/mongoid/contextual/geo_near.rb +7 -7
  78. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  79. data/lib/mongoid/contextual/memory.rb +285 -58
  80. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  81. data/lib/mongoid/contextual/mongo.rb +540 -346
  82. data/lib/mongoid/contextual/none.rb +193 -20
  83. data/lib/mongoid/contextual/queryable.rb +1 -1
  84. data/lib/mongoid/contextual.rb +14 -2
  85. data/lib/mongoid/copyable.rb +32 -8
  86. data/lib/mongoid/criteria/findable.rb +8 -5
  87. data/lib/mongoid/criteria/includable.rb +27 -22
  88. data/lib/mongoid/criteria/marshalable.rb +10 -2
  89. data/lib/mongoid/criteria/permission.rb +1 -1
  90. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  91. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
  92. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  93. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  94. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  95. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  96. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
  97. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
  98. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  99. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  100. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  101. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  102. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  103. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  104. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  105. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  106. data/lib/mongoid/criteria/queryable/key.rb +4 -4
  107. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  108. data/lib/mongoid/criteria/queryable/optional.rb +11 -17
  109. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  110. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  111. data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
  112. data/lib/mongoid/criteria/queryable/selector.rb +92 -7
  113. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  114. data/lib/mongoid/criteria/queryable.rb +12 -7
  115. data/lib/mongoid/criteria/scopable.rb +2 -2
  116. data/lib/mongoid/criteria/translator.rb +45 -0
  117. data/lib/mongoid/criteria.rb +20 -40
  118. data/lib/mongoid/deprecable.rb +37 -0
  119. data/lib/mongoid/deprecation.rb +25 -0
  120. data/lib/mongoid/document.rb +127 -35
  121. data/lib/mongoid/equality.rb +8 -8
  122. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  123. data/lib/mongoid/errors/document_not_found.rb +10 -6
  124. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  125. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  126. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  127. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  128. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  129. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  130. data/lib/mongoid/errors/invalid_field.rb +6 -2
  131. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  132. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  133. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  134. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  135. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  136. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  137. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  138. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  139. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  140. data/lib/mongoid/errors/no_client_database.rb +1 -1
  141. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  142. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  143. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  144. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  145. data/lib/mongoid/errors.rb +6 -3
  146. data/lib/mongoid/extensions/array.rb +9 -7
  147. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  148. data/lib/mongoid/extensions/binary.rb +42 -0
  149. data/lib/mongoid/extensions/boolean.rb +8 -2
  150. data/lib/mongoid/extensions/date.rb +26 -20
  151. data/lib/mongoid/extensions/date_time.rb +1 -1
  152. data/lib/mongoid/extensions/false_class.rb +1 -1
  153. data/lib/mongoid/extensions/float.rb +7 -4
  154. data/lib/mongoid/extensions/hash.rb +37 -8
  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 +129 -20
  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 +188 -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 +33 -13
  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 +10 -6
  197. data/lib/mongoid/stateful.rb +57 -10
  198. data/lib/mongoid/tasks/database.rake +12 -0
  199. data/lib/mongoid/tasks/database.rb +20 -2
  200. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  201. data/lib/mongoid/threaded.rb +42 -12
  202. data/lib/mongoid/timestamps/created.rb +1 -1
  203. data/lib/mongoid/timestamps/updated.rb +2 -2
  204. data/lib/mongoid/touchable.rb +2 -3
  205. data/lib/mongoid/traversable.rb +5 -4
  206. data/lib/mongoid/utils.rb +22 -0
  207. data/lib/mongoid/validatable/localizable.rb +1 -1
  208. data/lib/mongoid/validatable/macros.rb +5 -7
  209. data/lib/mongoid/validatable/presence.rb +2 -2
  210. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  211. data/lib/mongoid/validatable.rb +9 -6
  212. data/lib/mongoid/version.rb +1 -1
  213. data/lib/mongoid/warnings.rb +19 -4
  214. data/lib/mongoid.rb +17 -3
  215. data/spec/config/mongoid.yml +16 -0
  216. data/spec/integration/app_spec.rb +10 -14
  217. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  218. data/spec/integration/associations/embedded_spec.rb +15 -0
  219. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  220. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  221. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  222. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  223. data/spec/integration/associations/has_one_spec.rb +97 -1
  224. data/spec/integration/associations/scope_option_spec.rb +1 -1
  225. data/spec/integration/callbacks_models.rb +132 -1
  226. data/spec/integration/callbacks_spec.rb +381 -4
  227. data/spec/integration/criteria/range_spec.rb +95 -1
  228. data/spec/integration/discriminator_key_spec.rb +118 -80
  229. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  230. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  231. data/spec/integration/matcher_examples_spec.rb +20 -13
  232. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  233. data/spec/integration/matcher_operator_spec.rb +3 -5
  234. data/spec/integration/persistence/range_field_spec.rb +350 -0
  235. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  236. data/spec/mongoid/association/depending_spec.rb +9 -9
  237. data/spec/mongoid/association/eager_spec.rb +2 -1
  238. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  239. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  240. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  241. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  242. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +255 -65
  243. data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
  244. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  245. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  246. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  247. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  248. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  249. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  250. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  251. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  252. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  253. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  254. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  255. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
  256. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  257. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  258. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  259. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  260. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +173 -177
  261. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  262. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  263. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  264. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  265. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  266. data/spec/mongoid/association/syncable_spec.rb +15 -1
  267. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  268. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  269. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  270. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  271. data/spec/mongoid/attributes_spec.rb +510 -33
  272. data/spec/mongoid/changeable_spec.rb +429 -37
  273. data/spec/mongoid/clients/factory_spec.rb +23 -30
  274. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  275. data/spec/mongoid/clients_spec.rb +149 -15
  276. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  277. data/spec/mongoid/config/defaults_spec.rb +160 -0
  278. data/spec/mongoid/config_spec.rb +214 -31
  279. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  280. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  281. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  282. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  283. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  284. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  285. data/spec/mongoid/contextual/mongo_spec.rb +2309 -1127
  286. data/spec/mongoid/contextual/none_spec.rb +60 -21
  287. data/spec/mongoid/copyable_spec.rb +453 -11
  288. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  289. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  290. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  291. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  292. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  293. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  294. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  295. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  296. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  297. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  298. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  299. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  300. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  301. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  302. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  303. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  304. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  305. data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
  306. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
  307. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  308. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  309. data/spec/mongoid/criteria_spec.rb +469 -1205
  310. data/spec/mongoid/document_fields_spec.rb +173 -24
  311. data/spec/mongoid/document_spec.rb +32 -41
  312. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  313. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  314. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  315. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  316. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  317. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  318. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  319. data/spec/mongoid/extensions/array_spec.rb +16 -2
  320. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  321. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  322. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  323. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  324. data/spec/mongoid/extensions/date_spec.rb +71 -1
  325. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  326. data/spec/mongoid/extensions/float_spec.rb +53 -74
  327. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  328. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  329. data/spec/mongoid/extensions/range_spec.rb +255 -54
  330. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  331. data/spec/mongoid/extensions/set_spec.rb +106 -0
  332. data/spec/mongoid/extensions/string_spec.rb +53 -25
  333. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  334. data/spec/mongoid/extensions/time_spec.rb +639 -106
  335. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  336. data/spec/mongoid/factory_spec.rb +61 -1
  337. data/spec/mongoid/fields/localized_spec.rb +80 -37
  338. data/spec/mongoid/fields_spec.rb +500 -84
  339. data/spec/mongoid/findable_spec.rb +450 -58
  340. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  341. data/spec/mongoid/indexable_spec.rb +55 -30
  342. data/spec/mongoid/interceptable_spec.rb +824 -22
  343. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  344. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  345. data/spec/mongoid/mongoizable_spec.rb +285 -0
  346. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  347. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  348. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  349. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  350. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  351. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  352. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  353. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  354. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  355. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  356. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  357. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  358. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  359. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  360. data/spec/mongoid/persistence_context_spec.rb +31 -57
  361. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  362. data/spec/mongoid/query_cache_spec.rb +56 -215
  363. data/spec/mongoid/reloadable_spec.rb +83 -6
  364. data/spec/mongoid/scopable_spec.rb +91 -1
  365. data/spec/mongoid/serializable_spec.rb +9 -30
  366. data/spec/mongoid/shardable_spec.rb +4 -4
  367. data/spec/mongoid/stateful_spec.rb +150 -8
  368. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  369. data/spec/mongoid/tasks/database_spec.rb +127 -0
  370. data/spec/mongoid/timestamps_spec.rb +392 -4
  371. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  372. data/spec/mongoid/touchable_spec.rb +390 -2
  373. data/spec/mongoid/touchable_spec_models.rb +14 -8
  374. data/spec/mongoid/traversable_spec.rb +13 -35
  375. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  376. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  377. data/spec/mongoid/warnings_spec.rb +35 -0
  378. data/spec/mongoid_spec.rb +34 -16
  379. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  380. data/spec/rails/mongoid_spec.rb +4 -16
  381. data/spec/shared/lib/mrss/docker_runner.rb +8 -0
  382. data/spec/shared/lib/mrss/lite_constraints.rb +2 -2
  383. data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
  384. data/spec/shared/lib/mrss/utils.rb +28 -6
  385. data/spec/shared/share/Dockerfile.erb +36 -40
  386. data/spec/shared/shlib/server.sh +28 -4
  387. data/spec/shared/shlib/set_env.sh +4 -4
  388. data/spec/spec_helper.rb +5 -0
  389. data/spec/support/constraints.rb +24 -0
  390. data/spec/support/immutable_ids.rb +118 -0
  391. data/spec/support/macros.rb +78 -0
  392. data/spec/support/models/artist.rb +0 -1
  393. data/spec/support/models/augmentation.rb +12 -0
  394. data/spec/support/models/band.rb +4 -0
  395. data/spec/support/models/book.rb +1 -0
  396. data/spec/support/models/building.rb +2 -0
  397. data/spec/support/models/catalog.rb +24 -0
  398. data/spec/support/models/circus.rb +3 -0
  399. data/spec/support/models/cover.rb +10 -0
  400. data/spec/support/models/fanatic.rb +8 -0
  401. data/spec/support/models/implant.rb +9 -0
  402. data/spec/support/models/label.rb +2 -0
  403. data/spec/support/models/passport.rb +9 -0
  404. data/spec/support/models/person.rb +2 -0
  405. data/spec/support/models/player.rb +2 -0
  406. data/spec/support/models/powerup.rb +12 -0
  407. data/spec/support/models/product.rb +1 -0
  408. data/spec/support/models/purse.rb +9 -0
  409. data/spec/support/models/registry.rb +1 -0
  410. data/spec/support/models/school.rb +14 -0
  411. data/spec/support/models/shield.rb +18 -0
  412. data/spec/support/models/student.rb +14 -0
  413. data/spec/support/models/weapon.rb +12 -0
  414. data.tar.gz.sig +0 -0
  415. metadata +100 -22
  416. metadata.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
@@ -42,6 +42,11 @@ 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
+
45
50
  module ClassMethods
46
51
  # Returns the list of id fields for this model class, as both strings
47
52
  # and symbols.
@@ -142,7 +147,7 @@ module Mongoid
142
147
  # @example Apply all the non-proc defaults.
143
148
  # model.apply_pre_processed_defaults
144
149
  #
145
- # @return [ Array<String ] The names of the non-proc defaults.
150
+ # @return [ Array<String> ] The names of the non-proc defaults.
146
151
  def apply_pre_processed_defaults
147
152
  pre_processed_defaults.each do |name|
148
153
  apply_default(name)
@@ -154,8 +159,9 @@ module Mongoid
154
159
  # @example Apply all the proc defaults.
155
160
  # model.apply_post_processed_defaults
156
161
  #
157
- # @return [ Array<String ] The names of the proc defaults.
162
+ # @return [ Array<String> ] The names of the proc defaults.
158
163
  def apply_post_processed_defaults
164
+ pending_callbacks.delete(:apply_post_processed_defaults)
159
165
  post_processed_defaults.each do |name|
160
166
  apply_default(name)
161
167
  end
@@ -184,6 +190,7 @@ module Mongoid
184
190
  # @example Apply all the defaults.
185
191
  # model.apply_defaults
186
192
  def apply_defaults
193
+ pending_callbacks.delete(:apply_defaults)
187
194
  apply_pre_processed_defaults
188
195
  apply_post_processed_defaults
189
196
  end
@@ -207,7 +214,7 @@ module Mongoid
207
214
  # @example Get the database field name.
208
215
  # model.database_field_name(:authorization)
209
216
  #
210
- # @param [ String, Symbol ] name The name to get.
217
+ # @param [ String | Symbol ] name The name to get.
211
218
  #
212
219
  # @return [ String ] The name of the field as it's stored in the db.
213
220
  def database_field_name(name)
@@ -222,7 +229,7 @@ module Mongoid
222
229
  # @param [ Field ] field The field.
223
230
  # @param [ Object ] value The current value.
224
231
  #
225
- # @return [ true, false ] If we set the field lazily.
232
+ # @return [ true | false ] If we set the field lazily.
226
233
  def lazy_settable?(field, value)
227
234
  !frozen? && value.nil? && field.lazy?
228
235
  end
@@ -234,11 +241,37 @@ module Mongoid
234
241
  # @example Is the document using object ids?
235
242
  # model.using_object_ids?
236
243
  #
237
- # @return [ true, false ] Using object ids.
244
+ # @return [ true | false ] Using object ids.
238
245
  def using_object_ids?
239
246
  self.class.using_object_ids?
240
247
  end
241
248
 
249
+ # Does this field start with a dollar sign ($) or contain a dot/period (.)?
250
+ #
251
+ # @api private
252
+ #
253
+ # @param [ String ] name The field name.
254
+ #
255
+ # @return [ true | false ] If this field is dotted or dollared.
256
+ def dot_dollar_field?(name)
257
+ n = aliased_fields[name] || name
258
+ fields.key?(n) && (n.include?('.') || n.start_with?('$'))
259
+ end
260
+
261
+ # Validate whether or not the field starts with a dollar sign ($) or
262
+ # contains a dot/period (.).
263
+ #
264
+ # @api private
265
+ #
266
+ # @raise [ InvalidDotDollarAssignment ] If contains dots or starts with a dollar.
267
+ #
268
+ # @param [ String ] name The field name.
269
+ def validate_writable_field_name!(name)
270
+ if dot_dollar_field?(name)
271
+ raise Errors::InvalidDotDollarAssignment.new(self.class, name)
272
+ end
273
+ end
274
+
242
275
  class << self
243
276
 
244
277
  # Stores the provided block to be run when the option name specified is
@@ -363,7 +396,7 @@ module Mongoid
363
396
  # If the belongs_to association is the last part of the name, we will
364
397
  # pass back the _id field.
365
398
  #
366
- # @param [ String, Symbol ] name The name to get.
399
+ # @param [ String | Symbol ] name The name to get.
367
400
  # @param [ Hash ] relations The associations.
368
401
  # @param [ Hash ] alaiased_fields The aliased fields.
369
402
  # @param [ Hash ] alaiased_associations The aliased associations.
@@ -422,7 +455,7 @@ module Mongoid
422
455
  # Get the name of the provided field as it is stored in the database.
423
456
  # Used in determining if the field is aliased or not.
424
457
  #
425
- # @param [ String, Symbol ] name The name to get.
458
+ # @param [ String | Symbol ] name The name to get.
426
459
  #
427
460
  # @return [ String ] The name of the field as it's stored in the db.
428
461
  def database_field_name(name)
@@ -474,7 +507,7 @@ module Mongoid
474
507
  # @example Does this class use object ids?
475
508
  # person.using_object_ids?
476
509
  #
477
- # @return [ true, false ] If the class uses BSON::ObjectIds for the id.
510
+ # @return [ true | false ] If the class uses BSON::ObjectIds for the id.
478
511
  def using_object_ids?
479
512
  fields["_id"].object_id_field?
480
513
  end
@@ -505,6 +538,8 @@ module Mongoid
505
538
  # Model.add_defaults(field)
506
539
  #
507
540
  # @param [ Field ] field The field to add for.
541
+ #
542
+ # @api private
508
543
  def add_defaults(field)
509
544
  default, name = field.default_val, field.name.to_s
510
545
  remove_defaults(name)
@@ -524,6 +559,8 @@ module Mongoid
524
559
  #
525
560
  # @param [ Symbol ] name The name of the field.
526
561
  # @param [ Hash ] options The hash of options.
562
+ #
563
+ # @api private
527
564
  def add_field(name, options = {})
528
565
  aliased = options[:as]
529
566
  aliased_fields[aliased.to_s] = name if aliased
@@ -551,6 +588,8 @@ module Mongoid
551
588
  # # => "called"
552
589
  #
553
590
  # @param [ Field ] field the field to process
591
+ #
592
+ # @api private
554
593
  def process_options(field)
555
594
  field_options = field.options
556
595
 
@@ -573,6 +612,8 @@ module Mongoid
573
612
  # @param [ Symbol ] name The name of the field.
574
613
  # @param [ Symbol ] meth The name of the accessor.
575
614
  # @param [ Hash ] options The options.
615
+ #
616
+ # @api private
576
617
  def create_accessors(name, meth, options = {})
577
618
  field = fields[name]
578
619
 
@@ -596,6 +637,8 @@ module Mongoid
596
637
  # @param [ String ] name The name of the attribute.
597
638
  # @param [ String ] meth The name of the method.
598
639
  # @param [ Field ] field The field.
640
+ #
641
+ # @api private
599
642
  def create_field_getter(name, meth, field)
600
643
  generated_methods.module_eval do
601
644
  re_define_method(meth) do
@@ -603,9 +646,7 @@ module Mongoid
603
646
  if lazy_settable?(field, raw)
604
647
  write_attribute(name, field.eval_default(self))
605
648
  else
606
- value = field.demongoize(raw)
607
- attribute_will_change!(name) if value.resizable?
608
- value
649
+ process_raw_attribute(name.to_s, raw, field)
609
650
  end
610
651
  end
611
652
  end
@@ -620,6 +661,8 @@ module Mongoid
620
661
  #
621
662
  # @param [ String ] name The name of the attribute.
622
663
  # @param [ String ] meth The name of the method.
664
+ #
665
+ # @api private
623
666
  def create_field_getter_before_type_cast(name, meth)
624
667
  generated_methods.module_eval do
625
668
  re_define_method("#{meth}_before_type_cast") do
@@ -640,6 +683,8 @@ module Mongoid
640
683
  # @param [ String ] name The name of the attribute.
641
684
  # @param [ String ] meth The name of the method.
642
685
  # @param [ Field ] field The field.
686
+ #
687
+ # @api private
643
688
  def create_field_setter(name, meth, field)
644
689
  generated_methods.module_eval do
645
690
  re_define_method("#{meth}=") do |value|
@@ -659,6 +704,8 @@ module Mongoid
659
704
  #
660
705
  # @param [ String ] name The name of the attribute.
661
706
  # @param [ String ] meth The name of the method.
707
+ #
708
+ # @api private
662
709
  def create_field_check(name, meth)
663
710
  generated_methods.module_eval do
664
711
  re_define_method("#{meth}?") do
@@ -675,6 +722,8 @@ module Mongoid
675
722
  #
676
723
  # @param [ String ] name The name of the attribute.
677
724
  # @param [ String ] meth The name of the method.
725
+ #
726
+ # @api private
678
727
  def create_translations_getter(name, meth)
679
728
  generated_methods.module_eval do
680
729
  re_define_method("#{meth}_translations") do
@@ -693,14 +742,14 @@ module Mongoid
693
742
  # @param [ String ] name The name of the attribute.
694
743
  # @param [ String ] meth The name of the method.
695
744
  # @param [ Field ] field The field.
745
+ #
746
+ # @api private
696
747
  def create_translations_setter(name, meth, field)
697
748
  generated_methods.module_eval do
698
749
  re_define_method("#{meth}_translations=") do |value|
699
750
  attribute_will_change!(name)
700
- if value
701
- value.update_values do |_value|
702
- field.type.mongoize(_value)
703
- end
751
+ value&.transform_values! do |_value|
752
+ field.type.mongoize(_value)
704
753
  end
705
754
  attributes[name] = value
706
755
  end
@@ -714,6 +763,8 @@ module Mongoid
714
763
  # Person.generated_methods
715
764
  #
716
765
  # @return [ Module ] The module of generated methods.
766
+ #
767
+ # @api private
717
768
  def generated_methods
718
769
  @generated_methods ||= begin
719
770
  mod = Module.new
@@ -728,27 +779,85 @@ module Mongoid
728
779
  # Model.remove_defaults(name)
729
780
  #
730
781
  # @param [ String ] name The field name.
782
+ #
783
+ # @api private
731
784
  def remove_defaults(name)
732
785
  pre_processed_defaults.delete_one(name)
733
786
  post_processed_defaults.delete_one(name)
734
787
  end
735
788
 
789
+ # Create a field for the given name and options.
790
+ #
791
+ # @param [ Symbol ] name The name of the field.
792
+ # @param [ Hash ] options The hash of options.
793
+ #
794
+ # @return [ Field ] The created field.
795
+ #
796
+ # @api private
736
797
  def field_for(name, options)
737
798
  opts = options.merge(klass: self)
738
- type_mapping = TYPE_MAPPINGS[options[:type]]
739
- opts[:type] = type_mapping || unmapped_type(options)
799
+ opts[:type] = retrieve_and_validate_type(name, options[:type])
740
800
  return Fields::Localized.new(name, opts) if options[:localize]
741
801
  return Fields::ForeignKey.new(name, opts) if options[:identity]
742
802
  Fields::Standard.new(name, opts)
743
803
  end
744
804
 
745
- def unmapped_type(options)
746
- if "Boolean" == options[:type].to_s
805
+ # Get the class for the given type.
806
+ #
807
+ # @param [ Symbol ] name The name of the field.
808
+ # @param [ Symbol | Class ] type The type of the field.
809
+ #
810
+ # @return [ Class ] The type of the field.
811
+ #
812
+ # @raises [ Mongoid::Errors::InvalidFieldType ] if given an invalid field
813
+ # type.
814
+ #
815
+ # @api private
816
+ def retrieve_and_validate_type(name, type)
817
+ result = TYPE_MAPPINGS[type] || unmapped_type(type)
818
+ raise Errors::InvalidFieldType.new(self, name, type) if !result.is_a?(Class)
819
+
820
+ if unsupported_type?(result)
821
+ warn_message = "Using #{result} as the field type is not supported. "
822
+ if result == BSON::Decimal128
823
+ 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.'
824
+ else
825
+ 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.'
826
+ end
827
+ Mongoid.logger.warn(warn_message)
828
+ end
829
+
830
+ result
831
+ end
832
+
833
+ # Returns the type of the field if the type was not in the TYPE_MAPPINGS
834
+ # hash.
835
+ #
836
+ # @param [ Symbol | Class ] type The type of the field.
837
+ #
838
+ # @return [ Class ] The type of the field.
839
+ #
840
+ # @api private
841
+ def unmapped_type(type)
842
+ if "Boolean" == type.to_s
747
843
  Mongoid::Boolean
748
844
  else
749
- options[:type] || Object
845
+ type || Object
750
846
  end
751
847
  end
848
+
849
+ # Queries whether or not the given type is permitted as a declared field
850
+ # type.
851
+ #
852
+ # @param [ Class ] type The type to query
853
+ #
854
+ # @return [ true | false ] whether or not the type is supported
855
+ #
856
+ # @api private
857
+ def unsupported_type?(type)
858
+ return !Mongoid::Config.allow_bson5_decimal128? if type == BSON::Decimal128
859
+ INVALID_BSON_CLASSES.include?(type)
860
+ end
752
861
  end
753
862
  end
754
863
  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