mongoid 7.4.0 → 8.0.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 (391) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/lib/config/locales/en.yml +52 -28
  5. data/lib/mongoid/association/accessors.rb +38 -9
  6. data/lib/mongoid/association/bindable.rb +50 -2
  7. data/lib/mongoid/association/builders.rb +4 -2
  8. data/lib/mongoid/association/constrainable.rb +0 -1
  9. data/lib/mongoid/association/eager_loadable.rb +29 -7
  10. data/lib/mongoid/association/embedded/batchable.rb +53 -13
  11. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  12. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  13. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -2
  14. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  15. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  16. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  17. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +50 -28
  18. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  19. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  20. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +23 -4
  21. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  22. data/lib/mongoid/association/macros.rb +22 -1
  23. data/lib/mongoid/association/many.rb +11 -7
  24. data/lib/mongoid/association/nested/many.rb +5 -4
  25. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  26. data/lib/mongoid/association/nested/one.rb +5 -5
  27. data/lib/mongoid/association/one.rb +2 -2
  28. data/lib/mongoid/association/options.rb +9 -9
  29. data/lib/mongoid/association/proxy.rb +14 -3
  30. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  31. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  32. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  33. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  34. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  35. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  36. data/lib/mongoid/association/referenced/eager.rb +2 -2
  37. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +66 -13
  38. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  39. data/lib/mongoid/association/referenced/has_many/enumerable.rb +20 -24
  40. data/lib/mongoid/association/referenced/has_many/proxy.rb +24 -18
  41. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  42. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  43. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  44. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  45. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  46. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  47. data/lib/mongoid/association/reflections.rb +2 -2
  48. data/lib/mongoid/association/relatable.rb +44 -10
  49. data/lib/mongoid/association.rb +5 -5
  50. data/lib/mongoid/atomic/modifiers.rb +2 -2
  51. data/lib/mongoid/atomic/paths/embedded/many.rb +19 -0
  52. data/lib/mongoid/attributes/dynamic.rb +3 -3
  53. data/lib/mongoid/attributes/nested.rb +5 -5
  54. data/lib/mongoid/attributes/processing.rb +10 -3
  55. data/lib/mongoid/attributes/projector.rb +1 -1
  56. data/lib/mongoid/attributes/readonly.rb +2 -2
  57. data/lib/mongoid/attributes.rb +43 -40
  58. data/lib/mongoid/cacheable.rb +2 -2
  59. data/lib/mongoid/changeable.rb +42 -7
  60. data/lib/mongoid/clients/options.rb +5 -1
  61. data/lib/mongoid/clients/sessions.rb +2 -14
  62. data/lib/mongoid/clients/validators/storage.rb +3 -3
  63. data/lib/mongoid/config/environment.rb +20 -4
  64. data/lib/mongoid/config/validators/client.rb +6 -6
  65. data/lib/mongoid/config.rb +32 -17
  66. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  67. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  68. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  69. data/lib/mongoid/contextual/atomic.rb +1 -1
  70. data/lib/mongoid/contextual/geo_near.rb +7 -7
  71. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  72. data/lib/mongoid/contextual/memory.rb +180 -21
  73. data/lib/mongoid/contextual/mongo.rb +237 -217
  74. data/lib/mongoid/contextual/none.rb +67 -5
  75. data/lib/mongoid/contextual/queryable.rb +1 -1
  76. data/lib/mongoid/contextual.rb +2 -2
  77. data/lib/mongoid/copyable.rb +32 -8
  78. data/lib/mongoid/criteria/findable.rb +7 -4
  79. data/lib/mongoid/criteria/includable.rb +24 -20
  80. data/lib/mongoid/criteria/marshalable.rb +10 -2
  81. data/lib/mongoid/criteria/permission.rb +1 -1
  82. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  83. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -13
  84. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  85. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  86. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  87. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  88. data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -14
  89. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  90. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  91. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  92. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  93. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  94. data/lib/mongoid/criteria/queryable/extensions/string.rb +3 -3
  95. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -2
  96. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  97. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  98. data/lib/mongoid/criteria/queryable/key.rb +3 -3
  99. data/lib/mongoid/criteria/queryable/mergeable.rb +21 -0
  100. data/lib/mongoid/criteria/queryable/optional.rb +5 -11
  101. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  102. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  103. data/lib/mongoid/criteria/queryable/selectable.rb +31 -37
  104. data/lib/mongoid/criteria/queryable/selector.rb +92 -7
  105. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  106. data/lib/mongoid/criteria/queryable.rb +12 -7
  107. data/lib/mongoid/criteria/scopable.rb +2 -2
  108. data/lib/mongoid/criteria.rb +15 -35
  109. data/lib/mongoid/deprecable.rb +36 -0
  110. data/lib/mongoid/deprecation.rb +25 -0
  111. data/lib/mongoid/document.rb +98 -34
  112. data/lib/mongoid/equality.rb +12 -12
  113. data/lib/mongoid/errors/document_not_found.rb +33 -12
  114. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  115. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  116. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  117. data/lib/mongoid/errors/invalid_field.rb +6 -2
  118. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  119. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  120. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  121. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  122. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  123. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  124. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  125. data/lib/mongoid/errors/no_client_database.rb +1 -1
  126. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  127. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  128. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  129. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  130. data/lib/mongoid/errors.rb +2 -2
  131. data/lib/mongoid/extensions/array.rb +9 -7
  132. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  133. data/lib/mongoid/extensions/binary.rb +42 -0
  134. data/lib/mongoid/extensions/boolean.rb +8 -2
  135. data/lib/mongoid/extensions/date.rb +26 -20
  136. data/lib/mongoid/extensions/date_time.rb +1 -1
  137. data/lib/mongoid/extensions/false_class.rb +1 -1
  138. data/lib/mongoid/extensions/float.rb +7 -4
  139. data/lib/mongoid/extensions/hash.rb +13 -6
  140. data/lib/mongoid/extensions/integer.rb +7 -4
  141. data/lib/mongoid/extensions/module.rb +1 -1
  142. data/lib/mongoid/extensions/object.rb +8 -6
  143. data/lib/mongoid/extensions/range.rb +41 -10
  144. data/lib/mongoid/extensions/regexp.rb +11 -4
  145. data/lib/mongoid/extensions/set.rb +11 -4
  146. data/lib/mongoid/extensions/string.rb +11 -22
  147. data/lib/mongoid/extensions/symbol.rb +4 -15
  148. data/lib/mongoid/extensions/time.rb +27 -16
  149. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  150. data/lib/mongoid/extensions/true_class.rb +1 -1
  151. data/lib/mongoid/extensions.rb +1 -0
  152. data/lib/mongoid/factory.rb +42 -7
  153. data/lib/mongoid/fields/foreign_key.rb +11 -4
  154. data/lib/mongoid/fields/localized.rb +9 -4
  155. data/lib/mongoid/fields/standard.rb +7 -7
  156. data/lib/mongoid/fields/validators/macro.rb +3 -9
  157. data/lib/mongoid/fields.rb +201 -35
  158. data/lib/mongoid/findable.rb +34 -13
  159. data/lib/mongoid/indexable/specification.rb +2 -2
  160. data/lib/mongoid/indexable/validators/options.rb +6 -2
  161. data/lib/mongoid/interceptable.rb +73 -13
  162. data/lib/mongoid/matchable.rb +1 -1
  163. data/lib/mongoid/matcher.rb +12 -7
  164. data/lib/mongoid/persistable/creatable.rb +18 -9
  165. data/lib/mongoid/persistable/deletable.rb +1 -1
  166. data/lib/mongoid/persistable/destroyable.rb +1 -1
  167. data/lib/mongoid/persistable/savable.rb +2 -2
  168. data/lib/mongoid/persistable/unsettable.rb +1 -1
  169. data/lib/mongoid/persistable/updatable.rb +19 -12
  170. data/lib/mongoid/persistable/upsertable.rb +2 -2
  171. data/lib/mongoid/persistable.rb +3 -3
  172. data/lib/mongoid/persistence_context.rb +63 -10
  173. data/lib/mongoid/query_cache.rb +8 -260
  174. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  175. data/lib/mongoid/reloadable.rb +7 -3
  176. data/lib/mongoid/scopable.rb +26 -22
  177. data/lib/mongoid/selectable.rb +1 -2
  178. data/lib/mongoid/serializable.rb +10 -6
  179. data/lib/mongoid/stateful.rb +35 -9
  180. data/lib/mongoid/tasks/database.rb +0 -2
  181. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  182. data/lib/mongoid/threaded.rb +12 -12
  183. data/lib/mongoid/timestamps/created.rb +1 -1
  184. data/lib/mongoid/timestamps/updated.rb +2 -2
  185. data/lib/mongoid/touchable.rb +2 -3
  186. data/lib/mongoid/traversable.rb +8 -4
  187. data/lib/mongoid/validatable/localizable.rb +1 -1
  188. data/lib/mongoid/validatable/macros.rb +0 -2
  189. data/lib/mongoid/validatable/presence.rb +2 -2
  190. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  191. data/lib/mongoid/validatable.rb +6 -6
  192. data/lib/mongoid/version.rb +1 -1
  193. data/lib/mongoid/warnings.rb +28 -0
  194. data/lib/mongoid.rb +2 -0
  195. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +11 -5
  196. data/spec/config/mongoid.yml +16 -0
  197. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  198. data/spec/integration/app_spec.rb +28 -26
  199. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  200. data/spec/integration/associations/embedded_dirty_spec.rb +28 -0
  201. data/spec/integration/associations/embedded_spec.rb +15 -0
  202. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  203. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  204. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  205. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  206. data/spec/integration/associations/has_one_spec.rb +97 -1
  207. data/spec/integration/associations/scope_option_spec.rb +1 -1
  208. data/spec/integration/callbacks_models.rb +95 -1
  209. data/spec/integration/callbacks_spec.rb +226 -4
  210. data/spec/integration/criteria/range_spec.rb +95 -1
  211. data/spec/integration/discriminator_key_spec.rb +115 -76
  212. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  213. data/spec/integration/i18n_fallbacks_spec.rb +1 -17
  214. data/spec/integration/matcher_examples_spec.rb +20 -13
  215. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  216. data/spec/integration/matcher_operator_spec.rb +3 -5
  217. data/spec/integration/persistence/range_field_spec.rb +350 -0
  218. data/spec/lite_spec_helper.rb +1 -1
  219. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  220. data/spec/mongoid/association/depending_spec.rb +9 -9
  221. data/spec/mongoid/association/eager_spec.rb +2 -1
  222. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  223. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  224. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  225. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  226. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +219 -8
  227. data/spec/mongoid/association/embedded/embeds_many_models.rb +157 -0
  228. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  229. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  230. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  231. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  232. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  233. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  234. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  235. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  236. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  237. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  238. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +67 -4
  239. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  240. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  241. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  242. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +8 -8
  243. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +82 -13
  244. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  245. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  246. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  247. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  248. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  249. data/spec/mongoid/association/syncable_spec.rb +14 -0
  250. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  251. data/spec/mongoid/atomic_spec.rb +22 -0
  252. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  253. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  254. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  255. data/spec/mongoid/attributes_spec.rb +524 -27
  256. data/spec/mongoid/cacheable_spec.rb +3 -3
  257. data/spec/mongoid/changeable_spec.rb +130 -13
  258. data/spec/mongoid/clients/factory_spec.rb +34 -42
  259. data/spec/mongoid/clients/options_spec.rb +1 -0
  260. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  261. data/spec/mongoid/clients_spec.rb +57 -2
  262. data/spec/mongoid/config/environment_spec.rb +39 -1
  263. data/spec/mongoid/config_spec.rb +104 -13
  264. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  265. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  266. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  267. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  268. data/spec/mongoid/contextual/memory_spec.rb +1336 -69
  269. data/spec/mongoid/contextual/mongo_spec.rb +1105 -174
  270. data/spec/mongoid/contextual/none_spec.rb +38 -0
  271. data/spec/mongoid/copyable_spec.rb +451 -1
  272. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  273. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  274. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  275. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  276. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  277. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  278. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  279. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  280. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  281. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  282. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  283. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  284. data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
  285. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  286. data/spec/mongoid/criteria/queryable/selectable_spec.rb +289 -124
  287. data/spec/mongoid/criteria/queryable/selector_spec.rb +14 -2
  288. data/spec/mongoid/criteria_projection_spec.rb +0 -1
  289. data/spec/mongoid/criteria_spec.rb +475 -1199
  290. data/spec/mongoid/document_fields_spec.rb +173 -24
  291. data/spec/mongoid/document_spec.rb +32 -41
  292. data/spec/mongoid/equality_spec.rb +12 -12
  293. data/spec/mongoid/errors/document_not_found_spec.rb +76 -0
  294. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  295. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  296. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  297. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  298. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  299. data/spec/mongoid/extensions/array_spec.rb +16 -2
  300. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  301. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  302. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  303. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  304. data/spec/mongoid/extensions/date_spec.rb +71 -1
  305. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  306. data/spec/mongoid/extensions/float_spec.rb +53 -74
  307. data/spec/mongoid/extensions/hash_spec.rb +30 -0
  308. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  309. data/spec/mongoid/extensions/range_spec.rb +255 -54
  310. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  311. data/spec/mongoid/extensions/set_spec.rb +106 -0
  312. data/spec/mongoid/extensions/string_spec.rb +53 -25
  313. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  314. data/spec/mongoid/extensions/time_spec.rb +634 -66
  315. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  316. data/spec/mongoid/factory_spec.rb +61 -1
  317. data/spec/mongoid/fields/localized_spec.rb +37 -12
  318. data/spec/mongoid/fields_spec.rb +321 -50
  319. data/spec/mongoid/findable_spec.rb +80 -15
  320. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  321. data/spec/mongoid/indexable_spec.rb +39 -20
  322. data/spec/mongoid/interceptable_spec.rb +584 -5
  323. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  324. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  325. data/spec/mongoid/mongoizable_spec.rb +285 -0
  326. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  327. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  328. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  329. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  330. data/spec/mongoid/persistence_context_spec.rb +50 -1
  331. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  332. data/spec/mongoid/query_cache_spec.rb +0 -154
  333. data/spec/mongoid/reloadable_spec.rb +35 -2
  334. data/spec/mongoid/scopable_spec.rb +54 -16
  335. data/spec/mongoid/shardable_spec.rb +14 -0
  336. data/spec/mongoid/stateful_spec.rb +28 -0
  337. data/spec/mongoid/timestamps_spec.rb +390 -0
  338. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  339. data/spec/mongoid/touchable_spec.rb +116 -0
  340. data/spec/mongoid/touchable_spec_models.rb +12 -8
  341. data/spec/mongoid/traversable_spec.rb +4 -11
  342. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  343. data/spec/mongoid/validatable/uniqueness_spec.rb +59 -31
  344. data/spec/mongoid/warnings_spec.rb +35 -0
  345. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  346. data/spec/rails/mongoid_spec.rb +4 -16
  347. data/spec/shared/lib/mrss/constraints.rb +8 -16
  348. data/spec/shared/lib/mrss/docker_runner.rb +23 -3
  349. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  350. data/spec/shared/lib/mrss/lite_constraints.rb +32 -1
  351. data/spec/shared/share/Dockerfile.erb +34 -48
  352. data/spec/shared/shlib/config.sh +27 -0
  353. data/spec/shared/shlib/server.sh +32 -19
  354. data/spec/shared/shlib/set_env.sh +37 -0
  355. data/spec/support/constraints.rb +24 -0
  356. data/spec/support/macros.rb +55 -0
  357. data/spec/support/models/augmentation.rb +12 -0
  358. data/spec/support/models/band.rb +3 -0
  359. data/spec/support/models/catalog.rb +24 -0
  360. data/spec/support/models/circus.rb +3 -0
  361. data/spec/support/models/code.rb +2 -0
  362. data/spec/support/models/fanatic.rb +8 -0
  363. data/spec/support/models/implant.rb +9 -0
  364. data/spec/support/models/label.rb +2 -0
  365. data/spec/support/models/membership.rb +1 -0
  366. data/spec/support/models/passport.rb +9 -0
  367. data/spec/support/models/person.rb +1 -0
  368. data/spec/support/models/player.rb +2 -0
  369. data/spec/support/models/powerup.rb +12 -0
  370. data/spec/support/models/registry.rb +1 -0
  371. data/spec/support/models/school.rb +14 -0
  372. data/spec/support/models/shield.rb +18 -0
  373. data/spec/support/models/student.rb +14 -0
  374. data/spec/support/models/weapon.rb +12 -0
  375. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  376. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  377. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  378. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  379. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  380. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  381. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  382. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  383. data/spec/support/schema_maps/schema_map_local.json +18 -0
  384. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  385. data/spec/support/spec_config.rb +4 -0
  386. data.tar.gz.sig +0 -0
  387. metadata +682 -619
  388. metadata.gz.sig +0 -0
  389. data/lib/mongoid/errors/eager_load.rb +0 -23
  390. data/lib/mongoid/errors/invalid_value.rb +0 -17
  391. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -52,7 +52,7 @@ module Mongoid
52
52
  #
53
53
  # @param [ Object ] other The other +Enumerable+ or +Criteria+ to compare to.
54
54
  #
55
- # @return [ true, false ] If the objects are equal.
55
+ # @return [ true | false ] If the objects are equal.
56
56
  def ==(other)
57
57
  return super if other.respond_to?(:selector)
58
58
  entries == other
@@ -73,6 +73,9 @@ module Mongoid
73
73
  # treated by Mongoid - the decision between delegating to +Findable+ vs
74
74
  # +Enumerable+ is made solely based on whether +find+ is passed a block.
75
75
  #
76
+ # @note Each argument can be an individual id, an array of ids or
77
+ # a nested array. Each array will be flattened.
78
+ #
76
79
  # @example Finds a document by its _id, invokes Findable#find.
77
80
  # critera.find("1234")
78
81
  #
@@ -85,6 +88,9 @@ module Mongoid
85
88
  # @example Tries to find a document whose _id is the stringification of the provided Proc, typically failing.
86
89
  # enumerator = criteria.find(-> { "Default Band" })
87
90
  #
91
+ # @param [ Object | Array<Object> ] *args The ids.
92
+ # @param [ Proc ] block Optional block to pass.
93
+ #
88
94
  # @return [ Document | Array<Document> | nil ] A document or matching documents.
89
95
  #
90
96
  # @raise Errors::DocumentNotFound If the parameters were _id values and
@@ -112,31 +118,6 @@ module Mongoid
112
118
  entries.as_json(options)
113
119
  end
114
120
 
115
- # Tells the criteria that the cursor that gets returned needs to be
116
- # cached. This is so multiple iterations don't hit the database multiple
117
- # times, however this is not advisable when working with large data sets
118
- # as the entire results will get stored in memory.
119
- #
120
- # @example Flag the criteria as cached.
121
- # criteria.cache
122
- #
123
- # @return [ Criteria ] The cloned criteria.
124
- def cache
125
- crit = clone
126
- crit.options.merge!(cache: true)
127
- crit
128
- end
129
-
130
- # Will return true if the cache option has been set.
131
- #
132
- # @example Is the criteria cached?
133
- # criteria.cached?
134
- #
135
- # @return [ true, false ] If the criteria is flagged as cached.
136
- def cached?
137
- options[:cache] == true
138
- end
139
-
140
121
  # Get the documents from the embedded criteria.
141
122
  #
142
123
  # @example Get the documents.
@@ -163,7 +144,7 @@ module Mongoid
163
144
  # @example Is the criteria for embedded documents?
164
145
  # criteria.embedded?
165
146
  #
166
- # @return [ true, false ] If the criteria is embedded.
147
+ # @return [ true | false ] If the criteria is embedded.
167
148
  def embedded?
168
149
  !!@embedded
169
150
  end
@@ -230,7 +211,7 @@ module Mongoid
230
211
  @klass = klass
231
212
  @embedded = nil
232
213
  @none = nil
233
- klass ? super(klass.aliased_fields, klass.fields) : super({}, {})
214
+ klass ? super(klass.aliased_fields, klass.fields, klass.relations, klass.aliased_associations) : super({}, {}, {}, {})
234
215
  end
235
216
 
236
217
  # Merges another object with this +Criteria+ and returns a new criteria.
@@ -293,7 +274,7 @@ module Mongoid
293
274
  # @example Is the criteria a none criteria?
294
275
  # criteria.empty_and_chainable?
295
276
  #
296
- # @return [ true, false ] If the criteria is a none.
277
+ # @return [ true | false ] If the criteria is a none.
297
278
  def empty_and_chainable?
298
279
  !!@none
299
280
  end
@@ -351,9 +332,9 @@ module Mongoid
351
332
  # crtiteria.respond_to?(:each)
352
333
  #
353
334
  # @param [ Symbol ] name The name of the class method on the +Document+.
354
- # @param [ true, false ] include_private Whether to include privates.
335
+ # @param [ true | false ] include_private Whether to include privates.
355
336
  #
356
- # @return [ true, false ] If the criteria responds to the method.
337
+ # @return [ true | false ] If the criteria responds to the method.
357
338
  def respond_to?(name, include_private = false)
358
339
  super || klass.respond_to?(name) || CHECK.respond_to?(name, include_private)
359
340
  end
@@ -404,7 +385,7 @@ module Mongoid
404
385
  # @example Add a javascript selection.
405
386
  # criteria.where("this.name == 'syd'")
406
387
  #
407
- # @param [ String, Hash ] expression The javascript or standard selection.
388
+ # @param [ String | Hash ] expression The javascript or standard selection.
408
389
  #
409
390
  # @raise [ UnsupportedJavascript ] If provided a string and the criteria
410
391
  # is embedded.
@@ -430,7 +411,6 @@ module Mongoid
430
411
  super
431
412
  end
432
413
 
433
-
434
414
  # Get a version of this criteria without the options.
435
415
  #
436
416
  # @example Get the criteria without options.
@@ -536,7 +516,7 @@ module Mongoid
536
516
  # @example Add the type selection.
537
517
  # criteria.merge_type_selection
538
518
  #
539
- # @return [ true, false ] If type selection was added.
519
+ # @return [ true | false ] If type selection was added.
540
520
  def merge_type_selection
541
521
  selector.merge!(type_selection) if type_selectable?
542
522
  end
@@ -548,7 +528,7 @@ module Mongoid
548
528
  # @example If the criteria type selectable?
549
529
  # criteria.type_selectable?
550
530
  #
551
- # @return [ true, false ] If type selection should be added.
531
+ # @return [ true | false ] If type selection should be added.
552
532
  def type_selectable?
553
533
  klass.hereditary? &&
554
534
  !selector.keys.include?(self.discriminator_key) &&
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "mongoid/deprecation"
4
+
5
+ module Mongoid
6
+
7
+ # Adds ability to declare Mongoid-specific deprecations.
8
+ #
9
+ # @api private
10
+ module Deprecable
11
+
12
+ # Declares method(s) as deprecated.
13
+ #
14
+ # @example Deprecate a method.
15
+ # Mongoid.deprecate(Cat, :meow); Cat.new.meow
16
+ # #=> Mongoid.logger.warn("meow is deprecated and will be removed from Mongoid 8.0")
17
+ #
18
+ # @example Deprecate a method and declare the replacement method.
19
+ # Mongoid.deprecate(Cat, meow: :speak); Cat.new.meow
20
+ # #=> Mongoid.logger.warn("meow is deprecated and will be removed from Mongoid 8.0 (use speak instead)")
21
+ #
22
+ # @example Deprecate a method and give replacement instructions.
23
+ # Mongoid.deprecate(Cat, meow: 'eat :catnip instead'); Cat.new.meow
24
+ # #=> Mongoid.logger.warn("meow is deprecated and will be removed from Mongoid 8.0 (eat :catnip instead)")
25
+ #
26
+ # @param [ Module ] target_module The parent which contains the method.
27
+ # @param [ Symbol | Hash<Symbol, [ Symbol | String ]> ] method_descriptors
28
+ # The methods to deprecate, with optional replacement instructions.
29
+ def deprecate(target_module, *method_descriptors)
30
+ Mongoid::Deprecation.deprecate_methods(target_module, *method_descriptors)
31
+ end
32
+ end
33
+ end
34
+
35
+ # Ensure Mongoid.deprecate can be used during initialization
36
+ Mongoid.extend(Mongoid::Deprecable)
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mongoid
4
+
5
+ # Utility class for logging deprecation warnings.
6
+ class Deprecation < ::ActiveSupport::Deprecation
7
+
8
+ @gem_name = 'Mongoid'
9
+
10
+ # Per change policy, deprecations will be removed in the next major version.
11
+ @deprecation_horizon = "#{Mongoid::VERSION.split('.').first.to_i + 1}.0".freeze
12
+
13
+ # Overrides default ActiveSupport::Deprecation behavior
14
+ # to use Mongoid's logger.
15
+ #
16
+ # @return Array<Proc> The deprecation behavior.
17
+ def behavior
18
+ @behavior ||= Array(->(message, callstack, _deprecation_horizon, _gem_name) {
19
+ logger = Mongoid.logger
20
+ logger.warn(message)
21
+ logger.debug(callstack.join("\n ")) if debug
22
+ })
23
+ end
24
+ end
25
+ end
@@ -56,7 +56,7 @@ module Mongoid
56
56
  # @example Check if frozen
57
57
  # document.frozen?
58
58
  #
59
- # @return [ true, false ] True if frozen, else false.
59
+ # @return [ true | false ] True if frozen, else false.
60
60
  def frozen?
61
61
  attributes.frozen?
62
62
  end
@@ -100,21 +100,8 @@ module Mongoid
100
100
  # @param [ Hash ] attrs The attributes to set up the document with.
101
101
  #
102
102
  # @return [ Document ] A new document.
103
- def initialize(attrs = nil)
104
- @__parent = nil
105
- _building do
106
- @new_record = true
107
- @attributes ||= {}
108
- apply_pre_processed_defaults
109
- apply_default_scoping
110
- process_attributes(attrs) do
111
- yield(self) if block_given?
112
- end
113
- apply_post_processed_defaults
114
- # @todo: #2586: Need to have access to parent document in these
115
- # callbacks.
116
- run_callbacks(:initialize) unless _initialize_callbacks.empty?
117
- end
103
+ def initialize(attrs = nil, &block)
104
+ construct_document(attrs, execute_callbacks: true, &block)
118
105
  end
119
106
 
120
107
  # Return the model name of the document.
@@ -137,16 +124,6 @@ module Mongoid
137
124
  (persisted? || destroyed?) ? [ _id.to_s ] : nil
138
125
  end
139
126
 
140
- # Return an array with this +Document+ only in it.
141
- #
142
- # @example Return the document in an array.
143
- # document.to_a
144
- #
145
- # @return [ Array<Document> ] An array with the document as its only item.
146
- def to_a
147
- [ self ]
148
- end
149
-
150
127
  # Return a hash of the entire document hierarchy from this document and
151
128
  # below. Used when the attributes are needed for everything and not just
152
129
  # the current document.
@@ -173,14 +150,14 @@ module Mongoid
173
150
  #
174
151
  # @param [ Hash ] options The options.
175
152
  #
176
- # @option options [ true, false ] :compact (Deprecated) Whether to include fields
153
+ # @option options [ true | false ] :compact (Deprecated) Whether to include fields
177
154
  # with nil values in the json document.
178
155
  #
179
156
  # @return [ Hash ] The document as json.
180
157
  def as_json(options = nil)
181
158
  rv = super
182
159
  if options && options[:compact]
183
- Mongoid.logger.warn('#as_json :compact option is deprecated. Please call #compact on the returned Hash object instead.')
160
+ Mongoid::Warnings.warn_as_json_compact_deprecated
184
161
  rv = rv.compact
185
162
  end
186
163
  rv
@@ -228,6 +205,38 @@ module Mongoid
228
205
 
229
206
  private
230
207
 
208
+ # Does the construction of a document.
209
+ #
210
+ # @param [ Hash ] attrs The attributes to set up the document with.
211
+ # @param [ true | false ] execute_callbacks Flag specifies whether callbacks
212
+ # should be run.
213
+ #
214
+ # @return [ Document ] A new document.
215
+ #
216
+ # @api private
217
+ def construct_document(attrs = nil, execute_callbacks: true)
218
+ @__parent = nil
219
+ _building do
220
+ @new_record = true
221
+ @attributes ||= {}
222
+ apply_pre_processed_defaults
223
+ apply_default_scoping
224
+ process_attributes(attrs) do
225
+ yield(self) if block_given?
226
+ end
227
+ @attributes_before_type_cast = @attributes.merge(attributes_before_type_cast)
228
+
229
+ if execute_callbacks
230
+ apply_post_processed_defaults
231
+ run_callbacks(:initialize) unless _initialize_callbacks.empty?
232
+ else
233
+ pending_callbacks << :apply_post_processed_defaults
234
+ pending_callbacks << :initialize
235
+ end
236
+ end
237
+ self
238
+ end
239
+
231
240
  # Returns the logger
232
241
  #
233
242
  # @return [ Logger ] The configured logger or a default Logger instance.
@@ -245,6 +254,14 @@ module Mongoid
245
254
  @model_cache_key ||= self.class.model_name.cache_key
246
255
  end
247
256
 
257
+ # Returns a hash of the attributes.
258
+ #
259
+ # Note this method modifies the attributes hash that already exists on the
260
+ # class and returns it. This means that the hash returned by this method
261
+ # refers to the same hash as calling #attributes on the instance. See
262
+ # MONGOID-4476 for an explanation on how this is used.
263
+ #
264
+ # @return [ Hash ] The attributes hash.
248
265
  def as_attributes
249
266
  return attributes if frozen?
250
267
  embedded_relations.each_pair do |name, meta|
@@ -273,20 +290,67 @@ module Mongoid
273
290
  # @param [ Hash ] attrs The hash of attributes to instantiate with.
274
291
  # @param [ Integer ] selected_fields The selected fields from the
275
292
  # criteria.
293
+ # @param [ true | false ] execute_callbacks Flag specifies whether callbacks
294
+ # should be run.
295
+ #
296
+ # @return [ Document ] A new document.
297
+ def instantiate(attrs = nil, selected_fields = nil, &block)
298
+ instantiate_document(attrs, selected_fields, execute_callbacks: true, &block)
299
+ end
300
+
301
+ # Instantiate the document.
302
+ #
303
+ # @param [ Hash ] attrs The hash of attributes to instantiate with.
304
+ # @param [ Integer ] selected_fields The selected fields from the
305
+ # criteria.
306
+ # @param [ true | false ] execute_callbacks Flag specifies whether callbacks
307
+ # should be run.
276
308
  #
277
309
  # @return [ Document ] A new document.
278
- def instantiate(attrs = nil, selected_fields = nil)
279
- attributes = attrs || {}
310
+ #
311
+ # @api private
312
+ def instantiate_document(attrs = nil, selected_fields = nil, execute_callbacks: true)
313
+ attributes = if Mongoid.legacy_attributes
314
+ attrs
315
+ else
316
+ attrs&.to_h
317
+ end || {}
318
+
280
319
  doc = allocate
281
320
  doc.__selected_fields = selected_fields
282
321
  doc.instance_variable_set(:@attributes, attributes)
283
- doc.apply_defaults
284
- yield(doc) if block_given?
285
- doc.run_callbacks(:find) unless doc._find_callbacks.empty?
286
- doc.run_callbacks(:initialize) unless doc._initialize_callbacks.empty?
322
+ # TODO: remove the to_h when the legacy_attributes flag is removed.
323
+ # The to_h ensures that we don't accidentally make attributes_before_type_cast
324
+ # a BSON::Document.
325
+ doc.instance_variable_set(:@attributes_before_type_cast, attributes&.to_h.dup)
326
+
327
+ if execute_callbacks
328
+ doc.apply_defaults
329
+ yield(doc) if block_given?
330
+ doc.run_callbacks(:find) unless doc._find_callbacks.empty?
331
+ doc.run_callbacks(:initialize) unless doc._initialize_callbacks.empty?
332
+ else
333
+ yield(doc) if block_given?
334
+ doc.pending_callbacks += [:apply_defaults, :find, :initialize]
335
+ end
336
+
287
337
  doc
288
338
  end
289
339
 
340
+ # Allocates and constructs a document.
341
+ #
342
+ # @param [ Hash ] attrs The attributes to set up the document with.
343
+ # @param [ true | false ] execute_callbacks Flag specifies whether callbacks
344
+ # should be run.
345
+ #
346
+ # @return [ Document ] A new document.
347
+ #
348
+ # @api private
349
+ def construct_document(attrs = nil, execute_callbacks: true)
350
+ doc = allocate
351
+ doc.send(:construct_document, attrs, execute_callbacks: execute_callbacks)
352
+ end
353
+
290
354
  # Returns all types to query for when using this class as the base.
291
355
  #
292
356
  # @example Get the types.
@@ -26,9 +26,9 @@ module Mongoid
26
26
  # @example Compare for equality.
27
27
  # document == other
28
28
  #
29
- # @param [ Document, Object ] other The other object to compare with.
29
+ # @param [ Document | Object ] other The other object to compare with.
30
30
  #
31
- # @return [ true, false ] True if the ids are equal, false if not.
31
+ # @return [ true | false ] True if the ids are equal, false if not.
32
32
  def ==(other)
33
33
  self.class == other.class &&
34
34
  attributes["_id"] == other.attributes["_id"]
@@ -39,14 +39,14 @@ module Mongoid
39
39
  # @example Compare the classes.
40
40
  # document === other
41
41
  #
42
- # @param [ Document, Object ] other The other object to compare with.
42
+ # @param [ Document | Object ] other The other object to compare with.
43
43
  #
44
- # @return [ true, false ] True if the classes are equal, false if not.
44
+ # @return [ true | false ] True if the classes are equal, false if not.
45
45
  def ===(other)
46
46
  if Mongoid.legacy_triple_equals
47
- super
48
- else
49
47
  other.class == Class ? self.class === other : self == other
48
+ else
49
+ super
50
50
  end
51
51
  end
52
52
 
@@ -55,9 +55,9 @@ module Mongoid
55
55
  # @example Perform equality checking.
56
56
  # document.eql?(other)
57
57
  #
58
- # @param [ Document, Object ] other The object to check against.
58
+ # @param [ Document | Object ] other The object to check against.
59
59
  #
60
- # @return [ true, false ] True if equal, false if not.
60
+ # @return [ true | false ] True if equal, false if not.
61
61
  def eql?(other)
62
62
  self == (other)
63
63
  end
@@ -68,14 +68,14 @@ module Mongoid
68
68
  # @example Compare the classes.
69
69
  # document === other
70
70
  #
71
- # @param [ Document, Object ] other The other object to compare with.
71
+ # @param [ Document | Object ] other The other object to compare with.
72
72
  #
73
- # @return [ true, false ] True if the classes are equal, false if not.
73
+ # @return [ true | false ] True if the classes are equal, false if not.
74
74
  def ===(other)
75
75
  if Mongoid.legacy_triple_equals
76
- other.is_a?(self)
77
- else
78
76
  other.class == Class ? self <= other : other.is_a?(self)
77
+ else
78
+ other.is_a?(self)
79
79
  end
80
80
  end
81
81
  end
@@ -19,23 +19,25 @@ module Mongoid
19
19
  # DocumentNotFound.new(Person, :ssn => "1234", :name => "Helen")
20
20
  #
21
21
  # @param [ Class ] klass The model class.
22
- # @param [ Hash, Array, Object ] params The attributes or ids.
23
- # @param [ Array ] unmatched The unmatched ids, if appropriate
22
+ # @param [ Hash | Array | Object ] params The attributes or ids.
23
+ # @param [ Array | Hash ] unmatched The unmatched ids, if appropriate. If
24
+ # there is a shard key this will be a hash.
24
25
  def initialize(klass, params, unmatched = nil)
25
26
  if !unmatched && !params.is_a?(Hash)
26
- unmatched = Array(params)
27
+ unmatched = Array(params) if params
27
28
  end
28
29
 
29
30
  @klass, @params = klass, params
30
31
  super(
31
32
  compose_message(
32
- message_key(params),
33
+ message_key(params, unmatched),
33
34
  {
34
35
  klass: klass.name,
35
36
  searched: searched(params),
36
37
  attributes: params,
37
38
  total: total(params),
38
- missing: missing(unmatched)
39
+ missing: missing(unmatched),
40
+ shard_key: shard_key(unmatched)
39
41
  }
40
42
  )
41
43
  )
@@ -48,12 +50,14 @@ module Mongoid
48
50
  # @example Get the missing string.
49
51
  # error.missing(1)
50
52
  #
51
- # @param [ Object, Array ] unmatched The ids that did not match.
53
+ # @param [ Object | Array ] unmatched The ids that did not match.
52
54
  #
53
55
  # @return [ String ] The missing string.
54
56
  def missing(unmatched)
55
57
  if unmatched.is_a?(::Array)
56
58
  unmatched.join(", ")
59
+ elsif unmatched.is_a?(::Hash)
60
+ unmatched[:_id] || unmatched["_id"]
57
61
  else
58
62
  unmatched
59
63
  end
@@ -64,7 +68,7 @@ module Mongoid
64
68
  # @example Get the searched string.
65
69
  # error.searched(1)
66
70
  #
67
- # @param [ Object, Array ] params The ids that were searched for.
71
+ # @param [ Object | Array ] params The ids that were searched for.
68
72
  #
69
73
  # @return [ String ] The searched string.
70
74
  def searched(params)
@@ -80,7 +84,7 @@ module Mongoid
80
84
  # @example Get the total.
81
85
  # error.total([ 1, 2, 3 ])
82
86
  #
83
- # @param [ Object, Array ] params What was searched for.
87
+ # @param [ Object | Array ] params What was searched for.
84
88
  #
85
89
  # @return [ Integer ] The total number.
86
90
  def total(params)
@@ -93,10 +97,27 @@ module Mongoid
93
97
  # error.problem
94
98
  #
95
99
  # @return [ String ] The problem.
96
- def message_key(params)
97
- case params
98
- when Hash then "document_with_attributes_not_found"
99
- else "document_not_found"
100
+ def message_key(params, unmatched)
101
+ if !params && !unmatched
102
+ "no_documents_found"
103
+ elsif Hash === params
104
+ "document_with_attributes_not_found"
105
+ elsif Hash === unmatched && unmatched.size >= 2
106
+ "document_with_shard_key_not_found"
107
+ else
108
+ "document_not_found"
109
+ end
110
+ end
111
+
112
+ # Get the shard key from the unmatched hash.
113
+ #
114
+ # @return [ String ] the shard key and value.
115
+ def shard_key(unmatched)
116
+ if Hash === unmatched
117
+ h = unmatched.dup
118
+ h.delete("_id")
119
+ h.delete(:_id)
120
+ h.map{|k,v| "#{k}: #{v}" }.join(", ")
100
121
  end
101
122
  end
102
123
  end
@@ -12,7 +12,7 @@ module Mongoid
12
12
  # @example Create the new error.
13
13
  # InvalidConfigOption.new(:name, [ :option ])
14
14
  #
15
- # @param [ Symbol, String ] name The attempted config option name.
15
+ # @param [ Symbol | String ] name The attempted config option name.
16
16
  def initialize(name)
17
17
  super(
18
18
  compose_message(
@@ -13,7 +13,7 @@ module Mongoid
13
13
  #
14
14
  # @param [ Mongoid::Association ] association The association for which this
15
15
  # dependency is defined.
16
- # @param [ Symbol, String ] invalid_strategy The attempted invalid strategy.
16
+ # @param [ Symbol | String ] invalid_strategy The attempted invalid strategy.
17
17
  # @param [ Array<Symbol> ] valid_strategies The valid strategies.
18
18
  def initialize(association, invalid_strategy, valid_strategies)
19
19
  super(
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mongoid
4
+ module Errors
5
+
6
+ # This error is raised when trying to use the setter for a field that starts
7
+ # with a dollar sign ($) or contains a dot/period (.).
8
+ class InvalidDotDollarAssignment < MongoidError
9
+
10
+ # Create the new error.
11
+ #
12
+ # @param [ Class ] klass The class of the document.
13
+ # @param [ Class ] attr The attribute attempted to be written.
14
+ #
15
+ # @api private
16
+ def initialize(klass, attr)
17
+ super(
18
+ compose_message("invalid_dot_dollar_assignment", { klass: klass, attr: attr })
19
+ )
20
+ end
21
+ end
22
+ end
23
+ end
@@ -12,14 +12,18 @@ module Mongoid
12
12
  # @example Create the error.
13
13
  # InvalidField.new(person, :crazy_method_name)
14
14
  #
15
+ # @api private
16
+ #
15
17
  # @param [ Class ] klass The document class.
18
+ # @param [ Symbol ] field The field name.
16
19
  # @param [ Symbol ] name The method name.
17
- def initialize(klass, name)
20
+ def initialize(klass, field, name)
18
21
  super(
19
22
  compose_message(
20
23
  "invalid_field",
21
24
  {
22
25
  name: name,
26
+ field: field,
23
27
  origin: origin(klass, name),
24
28
  file: location(klass, name)[0],
25
29
  line: location(klass, name)[1]
@@ -38,7 +42,7 @@ module Mongoid
38
42
  # @param [ Class ] klass The document class.
39
43
  # @param [ Symbol ] name The method name.
40
44
  #
41
- # @return [ Class, Module ] The originating class or module.
45
+ # @return [ Class | Module ] The originating class or module.
42
46
  def origin(klass, name)
43
47
  klass.instance_method(name).owner
44
48
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mongoid
4
+ module Errors
5
+
6
+ # This error is raised when trying to define a field using a :type option value
7
+ # that is not present in the field type mapping.
8
+ class InvalidFieldType < MongoidError
9
+
10
+ # Create the new error.
11
+ #
12
+ # @example Instantiate the error.
13
+ # InvalidFieldType.new('Person', 'first_name', 'stringgy')
14
+ #
15
+ # @param [ String ] klass The model class.
16
+ # @param [ String ] field The field on which the invalid type is used.
17
+ # @param [ Symbol | String ] type The value of the field :type option.
18
+ def initialize(klass, field, type)
19
+ super(
20
+ compose_message('invalid_field_type',
21
+ klass: klass, field: field, type_inspection: type.inspect)
22
+ )
23
+ end
24
+ end
25
+ end
26
+ end
@@ -38,7 +38,7 @@ module Mongoid
38
38
  # @param [ Class ] klass The document class.
39
39
  # @param [ Symbol ] name The method name.
40
40
  #
41
- # @return [ Class, Module ] The originating class or module.
41
+ # @return [ Class | Module ] The originating class or module.
42
42
  def origin(klass, name)
43
43
  klass.instance_method(name).owner
44
44
  end
@@ -12,7 +12,7 @@ module Mongoid
12
12
  # InvalidRelationOption.new(Person, invalid_option: 'make_me_a_sandwich')
13
13
  #
14
14
  # @param [ Class ] klass The model class.
15
- # @param [ String, Symbol ] name The association name.
15
+ # @param [ String | Symbol ] name The association name.
16
16
  # @param [ Symbol ] option The invalid option.
17
17
  # @param [ Array<Symbol> ] valid_options The valid option.
18
18
  def initialize(klass, name, option, valid_options)
@@ -12,7 +12,7 @@ module Mongoid
12
12
  # @example Create the error.
13
13
  # InvalidSessionUse.new(:invalid_session_use)
14
14
  #
15
- # @param [ :invalid_session_use, :invalid_session_nesting ] error_type The type of session misuse.
15
+ # @param [ :invalid_session_use | :invalid_session_nesting ] error_type The type of session misuse.
16
16
  def initialize(error_type)
17
17
  super(compose_message(error_type.to_s))
18
18
  end