mongoid 7.5.3 → 8.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (417) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +3 -3
  4. data/README.md +6 -6
  5. data/Rakefile +25 -0
  6. data/lib/config/locales/en.yml +92 -43
  7. data/lib/mongoid/association/accessors.rb +40 -11
  8. data/lib/mongoid/association/bindable.rb +50 -2
  9. data/lib/mongoid/association/builders.rb +5 -3
  10. data/lib/mongoid/association/constrainable.rb +0 -1
  11. data/lib/mongoid/association/eager_loadable.rb +29 -7
  12. data/lib/mongoid/association/embedded/batchable.rb +34 -11
  13. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  14. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  15. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
  16. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
  17. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  18. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  19. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
  20. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +69 -45
  21. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  22. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
  23. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
  24. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  25. data/lib/mongoid/association/macros.rb +8 -1
  26. data/lib/mongoid/association/many.rb +11 -7
  27. data/lib/mongoid/association/nested/many.rb +5 -4
  28. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  29. data/lib/mongoid/association/nested/one.rb +45 -7
  30. data/lib/mongoid/association/one.rb +2 -2
  31. data/lib/mongoid/association/options.rb +9 -9
  32. data/lib/mongoid/association/proxy.rb +15 -4
  33. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  34. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  35. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  36. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  37. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  38. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  39. data/lib/mongoid/association/referenced/eager.rb +2 -2
  40. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  41. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  42. data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
  43. data/lib/mongoid/association/referenced/has_many/proxy.rb +29 -19
  44. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  45. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  46. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  47. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  48. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  49. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  50. data/lib/mongoid/association/reflections.rb +4 -4
  51. data/lib/mongoid/association/relatable.rb +44 -10
  52. data/lib/mongoid/association.rb +5 -5
  53. data/lib/mongoid/atomic/modifiers.rb +2 -2
  54. data/lib/mongoid/atomic.rb +7 -0
  55. data/lib/mongoid/attributes/dynamic.rb +4 -4
  56. data/lib/mongoid/attributes/nested.rb +6 -6
  57. data/lib/mongoid/attributes/processing.rb +37 -6
  58. data/lib/mongoid/attributes/projector.rb +2 -2
  59. data/lib/mongoid/attributes/readonly.rb +3 -3
  60. data/lib/mongoid/attributes.rb +51 -42
  61. data/lib/mongoid/changeable.rb +147 -14
  62. data/lib/mongoid/clients/options.rb +5 -1
  63. data/lib/mongoid/clients/sessions.rb +2 -14
  64. data/lib/mongoid/clients/storage_options.rb +2 -5
  65. data/lib/mongoid/clients/validators/storage.rb +3 -15
  66. data/lib/mongoid/collection_configurable.rb +58 -0
  67. data/lib/mongoid/composable.rb +2 -0
  68. data/lib/mongoid/config/defaults.rb +60 -0
  69. data/lib/mongoid/config/options.rb +3 -0
  70. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  71. data/lib/mongoid/config/validators/client.rb +6 -6
  72. data/lib/mongoid/config/validators.rb +1 -0
  73. data/lib/mongoid/config.rb +140 -18
  74. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  75. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  76. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  77. data/lib/mongoid/contextual/atomic.rb +1 -1
  78. data/lib/mongoid/contextual/geo_near.rb +7 -7
  79. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  80. data/lib/mongoid/contextual/memory.rb +285 -58
  81. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  82. data/lib/mongoid/contextual/mongo.rb +517 -346
  83. data/lib/mongoid/contextual/none.rb +193 -20
  84. data/lib/mongoid/contextual/queryable.rb +1 -1
  85. data/lib/mongoid/contextual.rb +14 -2
  86. data/lib/mongoid/copyable.rb +32 -8
  87. data/lib/mongoid/criteria/findable.rb +8 -5
  88. data/lib/mongoid/criteria/includable.rb +27 -22
  89. data/lib/mongoid/criteria/marshalable.rb +10 -2
  90. data/lib/mongoid/criteria/permission.rb +1 -1
  91. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  92. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
  93. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  94. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  95. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  96. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  97. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
  98. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
  99. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  100. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  101. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  102. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  103. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  104. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  105. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  106. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  107. data/lib/mongoid/criteria/queryable/key.rb +4 -4
  108. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  109. data/lib/mongoid/criteria/queryable/optional.rb +11 -17
  110. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  111. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  112. data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
  113. data/lib/mongoid/criteria/queryable/selector.rb +93 -8
  114. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  115. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  116. data/lib/mongoid/criteria/queryable.rb +12 -7
  117. data/lib/mongoid/criteria/scopable.rb +2 -2
  118. data/lib/mongoid/criteria/translator.rb +45 -0
  119. data/lib/mongoid/criteria.rb +20 -40
  120. data/lib/mongoid/deprecable.rb +36 -0
  121. data/lib/mongoid/deprecation.rb +25 -0
  122. data/lib/mongoid/document.rb +127 -35
  123. data/lib/mongoid/equality.rb +8 -8
  124. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  125. data/lib/mongoid/errors/document_not_found.rb +10 -6
  126. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  127. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  128. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  129. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  130. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  131. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  132. data/lib/mongoid/errors/invalid_field.rb +6 -2
  133. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  134. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  135. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  136. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  137. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  138. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  139. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  140. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  141. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  142. data/lib/mongoid/errors/no_client_database.rb +1 -1
  143. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  144. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  145. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  146. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  147. data/lib/mongoid/errors.rb +6 -3
  148. data/lib/mongoid/extensions/array.rb +9 -7
  149. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  150. data/lib/mongoid/extensions/binary.rb +42 -0
  151. data/lib/mongoid/extensions/boolean.rb +8 -2
  152. data/lib/mongoid/extensions/date.rb +26 -20
  153. data/lib/mongoid/extensions/date_time.rb +1 -1
  154. data/lib/mongoid/extensions/false_class.rb +1 -1
  155. data/lib/mongoid/extensions/float.rb +7 -4
  156. data/lib/mongoid/extensions/hash.rb +19 -8
  157. data/lib/mongoid/extensions/integer.rb +7 -4
  158. data/lib/mongoid/extensions/module.rb +1 -1
  159. data/lib/mongoid/extensions/object.rb +10 -8
  160. data/lib/mongoid/extensions/range.rb +41 -10
  161. data/lib/mongoid/extensions/regexp.rb +11 -4
  162. data/lib/mongoid/extensions/set.rb +11 -4
  163. data/lib/mongoid/extensions/string.rb +11 -22
  164. data/lib/mongoid/extensions/symbol.rb +4 -15
  165. data/lib/mongoid/extensions/time.rb +29 -16
  166. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  167. data/lib/mongoid/extensions/true_class.rb +1 -1
  168. data/lib/mongoid/extensions.rb +1 -0
  169. data/lib/mongoid/factory.rb +55 -7
  170. data/lib/mongoid/fields/foreign_key.rb +11 -4
  171. data/lib/mongoid/fields/localized.rb +19 -4
  172. data/lib/mongoid/fields/standard.rb +17 -7
  173. data/lib/mongoid/fields/validators/macro.rb +3 -9
  174. data/lib/mongoid/fields.rb +129 -20
  175. data/lib/mongoid/findable.rb +54 -24
  176. data/lib/mongoid/indexable/specification.rb +2 -2
  177. data/lib/mongoid/indexable/validators/options.rb +6 -2
  178. data/lib/mongoid/interceptable.rb +76 -15
  179. data/lib/mongoid/matchable.rb +1 -1
  180. data/lib/mongoid/matcher/eq_impl.rb +1 -1
  181. data/lib/mongoid/matcher/type.rb +1 -1
  182. data/lib/mongoid/matcher.rb +33 -13
  183. data/lib/mongoid/persistable/creatable.rb +19 -9
  184. data/lib/mongoid/persistable/deletable.rb +2 -2
  185. data/lib/mongoid/persistable/destroyable.rb +1 -1
  186. data/lib/mongoid/persistable/savable.rb +14 -2
  187. data/lib/mongoid/persistable/unsettable.rb +2 -2
  188. data/lib/mongoid/persistable/updatable.rb +69 -12
  189. data/lib/mongoid/persistable/upsertable.rb +21 -2
  190. data/lib/mongoid/persistable.rb +6 -3
  191. data/lib/mongoid/persistence_context.rb +6 -4
  192. data/lib/mongoid/query_cache.rb +13 -261
  193. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  194. data/lib/mongoid/railties/database.rake +7 -2
  195. data/lib/mongoid/reloadable.rb +10 -8
  196. data/lib/mongoid/scopable.rb +15 -13
  197. data/lib/mongoid/selectable.rb +1 -2
  198. data/lib/mongoid/serializable.rb +10 -6
  199. data/lib/mongoid/stateful.rb +57 -10
  200. data/lib/mongoid/tasks/database.rake +12 -0
  201. data/lib/mongoid/tasks/database.rb +20 -2
  202. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  203. data/lib/mongoid/threaded.rb +42 -12
  204. data/lib/mongoid/timestamps/created.rb +1 -1
  205. data/lib/mongoid/timestamps/updated.rb +2 -2
  206. data/lib/mongoid/touchable.rb +2 -3
  207. data/lib/mongoid/traversable.rb +5 -4
  208. data/lib/mongoid/utils.rb +22 -0
  209. data/lib/mongoid/validatable/localizable.rb +1 -1
  210. data/lib/mongoid/validatable/macros.rb +5 -7
  211. data/lib/mongoid/validatable/presence.rb +2 -2
  212. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  213. data/lib/mongoid/validatable.rb +9 -6
  214. data/lib/mongoid/version.rb +1 -1
  215. data/lib/mongoid/warnings.rb +19 -4
  216. data/lib/mongoid.rb +17 -3
  217. data/spec/config/mongoid.yml +16 -0
  218. data/spec/integration/app_spec.rb +10 -14
  219. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  220. data/spec/integration/associations/embedded_spec.rb +15 -0
  221. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  222. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  223. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  224. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  225. data/spec/integration/associations/has_one_spec.rb +97 -1
  226. data/spec/integration/associations/scope_option_spec.rb +1 -1
  227. data/spec/integration/callbacks_models.rb +132 -1
  228. data/spec/integration/callbacks_spec.rb +360 -4
  229. data/spec/integration/criteria/range_spec.rb +95 -1
  230. data/spec/integration/discriminator_key_spec.rb +118 -80
  231. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  232. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  233. data/spec/integration/matcher_examples_spec.rb +20 -13
  234. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  235. data/spec/integration/matcher_operator_spec.rb +3 -5
  236. data/spec/integration/persistence/range_field_spec.rb +350 -0
  237. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  238. data/spec/mongoid/association/depending_spec.rb +9 -9
  239. data/spec/mongoid/association/eager_spec.rb +2 -1
  240. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  241. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  242. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  243. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  244. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +255 -65
  245. data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
  246. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  247. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  248. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  249. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  250. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  251. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  252. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  253. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  254. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  255. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  256. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  257. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
  258. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  259. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  260. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  261. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  262. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +173 -177
  263. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  264. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  265. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  266. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  267. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  268. data/spec/mongoid/association/syncable_spec.rb +15 -1
  269. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  270. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  271. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  272. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  273. data/spec/mongoid/attributes_spec.rb +510 -33
  274. data/spec/mongoid/changeable_spec.rb +429 -37
  275. data/spec/mongoid/clients/factory_spec.rb +23 -30
  276. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  277. data/spec/mongoid/clients_spec.rb +149 -15
  278. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  279. data/spec/mongoid/config/defaults_spec.rb +160 -0
  280. data/spec/mongoid/config_spec.rb +214 -31
  281. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  282. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  283. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  284. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  285. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  286. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  287. data/spec/mongoid/contextual/mongo_spec.rb +1572 -435
  288. data/spec/mongoid/contextual/none_spec.rb +60 -21
  289. data/spec/mongoid/copyable_spec.rb +453 -11
  290. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  291. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  292. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  293. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  294. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  295. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  296. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  297. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  298. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  299. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  300. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  301. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  302. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  303. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  304. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  305. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  306. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  307. data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
  308. data/spec/mongoid/criteria/queryable/selector_spec.rb +90 -5
  309. data/spec/mongoid/criteria/queryable/storable_spec.rb +72 -0
  310. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  311. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  312. data/spec/mongoid/criteria_spec.rb +469 -1205
  313. data/spec/mongoid/document_fields_spec.rb +173 -24
  314. data/spec/mongoid/document_spec.rb +32 -41
  315. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  316. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  317. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  318. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  319. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  320. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  321. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  322. data/spec/mongoid/extensions/array_spec.rb +16 -2
  323. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  324. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  325. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  326. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  327. data/spec/mongoid/extensions/date_spec.rb +71 -1
  328. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  329. data/spec/mongoid/extensions/float_spec.rb +53 -74
  330. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  331. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  332. data/spec/mongoid/extensions/range_spec.rb +255 -54
  333. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  334. data/spec/mongoid/extensions/set_spec.rb +106 -0
  335. data/spec/mongoid/extensions/string_spec.rb +53 -25
  336. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  337. data/spec/mongoid/extensions/time_spec.rb +639 -106
  338. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  339. data/spec/mongoid/factory_spec.rb +61 -1
  340. data/spec/mongoid/fields/localized_spec.rb +80 -37
  341. data/spec/mongoid/fields_spec.rb +500 -84
  342. data/spec/mongoid/findable_spec.rb +450 -58
  343. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  344. data/spec/mongoid/indexable_spec.rb +55 -30
  345. data/spec/mongoid/interceptable_spec.rb +599 -8
  346. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  347. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  348. data/spec/mongoid/mongoizable_spec.rb +285 -0
  349. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  350. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  351. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  352. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  353. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  354. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  355. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  356. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  357. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  358. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  359. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  360. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  361. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  362. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  363. data/spec/mongoid/persistence_context_spec.rb +31 -57
  364. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  365. data/spec/mongoid/query_cache_spec.rb +56 -215
  366. data/spec/mongoid/reloadable_spec.rb +83 -6
  367. data/spec/mongoid/scopable_spec.rb +91 -1
  368. data/spec/mongoid/serializable_spec.rb +9 -30
  369. data/spec/mongoid/shardable_spec.rb +4 -4
  370. data/spec/mongoid/stateful_spec.rb +150 -8
  371. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  372. data/spec/mongoid/tasks/database_spec.rb +127 -0
  373. data/spec/mongoid/timestamps_spec.rb +392 -4
  374. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  375. data/spec/mongoid/touchable_spec.rb +390 -2
  376. data/spec/mongoid/touchable_spec_models.rb +14 -8
  377. data/spec/mongoid/traversable_spec.rb +13 -35
  378. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  379. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  380. data/spec/mongoid/warnings_spec.rb +35 -0
  381. data/spec/mongoid_spec.rb +34 -16
  382. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  383. data/spec/rails/mongoid_spec.rb +4 -16
  384. data/spec/spec_helper.rb +5 -0
  385. data/spec/support/constraints.rb +24 -0
  386. data/spec/support/immutable_ids.rb +118 -0
  387. data/spec/support/macros.rb +78 -0
  388. data/spec/support/models/artist.rb +0 -1
  389. data/spec/support/models/augmentation.rb +12 -0
  390. data/spec/support/models/band.rb +4 -0
  391. data/spec/support/models/book.rb +1 -0
  392. data/spec/support/models/building.rb +2 -0
  393. data/spec/support/models/catalog.rb +24 -0
  394. data/spec/support/models/circus.rb +3 -0
  395. data/spec/support/models/cover.rb +10 -0
  396. data/spec/support/models/fanatic.rb +8 -0
  397. data/spec/support/models/implant.rb +9 -0
  398. data/spec/support/models/label.rb +2 -0
  399. data/spec/support/models/passport.rb +9 -0
  400. data/spec/support/models/person.rb +2 -0
  401. data/spec/support/models/player.rb +2 -0
  402. data/spec/support/models/powerup.rb +12 -0
  403. data/spec/support/models/product.rb +1 -0
  404. data/spec/support/models/purse.rb +9 -0
  405. data/spec/support/models/registry.rb +1 -0
  406. data/spec/support/models/school.rb +14 -0
  407. data/spec/support/models/shield.rb +18 -0
  408. data/spec/support/models/student.rb +14 -0
  409. data/spec/support/models/weapon.rb +12 -0
  410. data.tar.gz.sig +0 -0
  411. metadata +718 -641
  412. metadata.gz.sig +0 -0
  413. data/lib/mongoid/errors/eager_load.rb +0 -23
  414. data/lib/mongoid/errors/invalid_value.rb +0 -17
  415. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  416. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  417. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -5,6 +5,11 @@ namespace :db do
5
5
  task :load_models do
6
6
  end
7
7
 
8
+ desc "Create collections for Mongoid models"
9
+ task :create_collections => [:environment, :load_models] do
10
+ ::Mongoid::Tasks::Database.create_collections
11
+ end
12
+
8
13
  desc "Create indexes specified in Mongoid models"
9
14
  task :create_indexes => [:environment, :load_models] do
10
15
  ::Mongoid::Tasks::Database.create_indexes
@@ -34,5 +39,12 @@ namespace :db do
34
39
  task :purge => :environment do
35
40
  ::Mongoid.purge!
36
41
  end
42
+
43
+ namespace :create_collections do
44
+ desc "Drop and create collections for Mongoid models"
45
+ task :force => [:environment, :load_models] do
46
+ ::Mongoid::Tasks::Database.create_collections(force: true)
47
+ end
48
+ end
37
49
  end
38
50
  end
@@ -5,6 +5,26 @@ module Mongoid
5
5
  module Database
6
6
  extend self
7
7
 
8
+ # Create collections for each model given the provided globs and the class is
9
+ # not embedded.
10
+ #
11
+ # @param [ Array<Mongoid::Document> ] models. Array of document classes for
12
+ # which collections should be created. Defaulted to all document classes
13
+ # in the application.
14
+ # @param [ true | false ] force If true, the method will drop existing
15
+ # collections before creating new ones. If false, the method will create
16
+ # only new collection (that do not exist in the database).
17
+ def create_collections(models = ::Mongoid.models, force: false)
18
+ models.each do |model|
19
+ if !model.embedded? || model.cyclic?
20
+ model.create_collection(force: force)
21
+ logger.info("MONGOID: Created collection for #{model}:")
22
+ else
23
+ logger.info("MONGOID: collection options ignored on: #{model}, please define in the root model.")
24
+ end
25
+ end
26
+ end
27
+
8
28
  # Create indexes for each model given the provided globs and the class is
9
29
  # not embedded.
10
30
  #
@@ -36,7 +56,6 @@ module Mongoid
36
56
  # Mongoid::Tasks::Database.undefined_indexes
37
57
  #
38
58
  # @return [ Array<Hash> ] The list of undefined indexes by model.
39
- #
40
59
  def undefined_indexes(models = ::Mongoid.models)
41
60
  undefined_by_model = {}
42
61
 
@@ -90,7 +109,6 @@ module Mongoid
90
109
  # Mongoid::Tasks::Database.remove_indexes
91
110
  #
92
111
  # @return [ Array<Class> ] The un-indexed models.
93
- #
94
112
  def remove_indexes(models = ::Mongoid.models)
95
113
  models.each do |model|
96
114
  next if model.embedded?
@@ -37,7 +37,7 @@ module Mongoid
37
37
  # @example Is the current thread in assigning mode?
38
38
  # proxy._assigning?
39
39
  #
40
- # @return [ true, false ] If the thread is assigning.
40
+ # @return [ true | false ] If the thread is assigning.
41
41
  def _assigning?
42
42
  Threaded.executing?(ASSIGN)
43
43
  end
@@ -62,7 +62,7 @@ module Mongoid
62
62
  # @example Is the current thread in binding mode?
63
63
  # proxy.binding?
64
64
  #
65
- # @return [ true, false ] If the thread is binding.
65
+ # @return [ true | false ] If the thread is binding.
66
66
  def _binding?
67
67
  Threaded.executing?(BIND)
68
68
  end
@@ -87,7 +87,7 @@ module Mongoid
87
87
  # @example Is the current thread in building mode?
88
88
  # proxy._building?
89
89
  #
90
- # @return [ true, false ] If the thread is building.
90
+ # @return [ true | false ] If the thread is building.
91
91
  def _building?
92
92
  Threaded.executing?(BUILD)
93
93
  end
@@ -97,7 +97,7 @@ module Mongoid
97
97
  # @example Is the current thread in creating mode?
98
98
  # proxy.creating?
99
99
  #
100
- # @return [ true, false ] If the thread is creating.
100
+ # @return [ true | false ] If the thread is creating.
101
101
  def _creating?
102
102
  Threaded.executing?(CREATE)
103
103
  end
@@ -122,7 +122,7 @@ module Mongoid
122
122
  # @example Is the current thread in loading mode?
123
123
  # proxy._loading?
124
124
  #
125
- # @return [ true, false ] If the thread is loading.
125
+ # @return [ true | false ] If the thread is loading.
126
126
  def _loading?
127
127
  Threaded.executing?(LOAD)
128
128
  end
@@ -26,6 +26,10 @@ module Mongoid
26
26
  hash[key] = "[mongoid]:#{key}-stack"
27
27
  end
28
28
 
29
+ # The key storing the default value for whether or not callbacks are
30
+ # executed on documents.
31
+ EXECUTE_CALLBACKS = '[mongoid]:execute-callbacks'
32
+
29
33
  extend self
30
34
 
31
35
  # Begin entry into a named thread local stack.
@@ -45,7 +49,7 @@ module Mongoid
45
49
  # @example Get the global database override.
46
50
  # Threaded.database_override
47
51
  #
48
- # @return [ String, Symbol ] The override.
52
+ # @return [ String | Symbol ] The override.
49
53
  def database_override
50
54
  Thread.current[DATABASE_OVERRIDE_KEY]
51
55
  end
@@ -55,9 +59,9 @@ module Mongoid
55
59
  # @example Set the global database override.
56
60
  # Threaded.database_override = :testing
57
61
  #
58
- # @param [ String, Symbol ] name The global override name.
62
+ # @param [ String | Symbol ] name The global override name.
59
63
  #
60
- # @return [ String, Symbol ] The override.
64
+ # @return [ String | Symbol ] The override.
61
65
  def database_override=(name)
62
66
  Thread.current[DATABASE_OVERRIDE_KEY] = name
63
67
  end
@@ -167,7 +171,7 @@ module Mongoid
167
171
  # @example Get the global client override.
168
172
  # Threaded.client_override
169
173
  #
170
- # @return [ String, Symbol ] The override.
174
+ # @return [ String | Symbol ] The override.
171
175
  def client_override
172
176
  Thread.current[CLIENT_OVERRIDE_KEY]
173
177
  end
@@ -177,9 +181,9 @@ module Mongoid
177
181
  # @example Set the global client override.
178
182
  # Threaded.client_override = :testing
179
183
  #
180
- # @param [ String, Symbol ] name The global override name.
184
+ # @param [ String | Symbol ] name The global override name.
181
185
  #
182
- # @return [ String, Symbol ] The override.
186
+ # @return [ String | Symbol ] The override.
183
187
  def client_override=(name)
184
188
  Thread.current[CLIENT_OVERRIDE_KEY] = name
185
189
  end
@@ -255,7 +259,7 @@ module Mongoid
255
259
  #
256
260
  # @param [ Document ] document The document to check.
257
261
  #
258
- # @return [ true, false ] If the document is autosaved.
262
+ # @return [ true | false ] If the document is autosaved.
259
263
  def autosaved?(document)
260
264
  autosaves_for(document.class).include?(document._id)
261
265
  end
@@ -267,7 +271,7 @@ module Mongoid
267
271
  #
268
272
  # @param [ Document ] document The document to check.
269
273
  #
270
- # @return [ true, false ] If the document is validated.
274
+ # @return [ true | false ] If the document is validated.
271
275
  def validated?(document)
272
276
  validations_for(document.class).include?(document._id)
273
277
  end
@@ -322,7 +326,7 @@ module Mongoid
322
326
  #
323
327
  # @param [ Mongo::Session ] session The session to save.
324
328
  def set_session(session)
325
- Thread.current[:session] = session
329
+ Thread.current["[mongoid]:session"] = session
326
330
  end
327
331
 
328
332
  # Get the cached session for this thread.
@@ -330,9 +334,9 @@ module Mongoid
330
334
  # @example Get the session for this thread.
331
335
  # Threaded.get_session
332
336
  #
333
- # @return [ Mongo::Session, nil ] The session cached on this thread or nil.
337
+ # @return [ Mongo::Session | nil ] The session cached on this thread or nil.
334
338
  def get_session
335
- Thread.current[:session]
339
+ Thread.current["[mongoid]:session"]
336
340
  end
337
341
 
338
342
  # Clear the cached session for this thread.
@@ -344,7 +348,33 @@ module Mongoid
344
348
  def clear_session
345
349
  session = get_session
346
350
  session.end_session if session
347
- Thread.current[:session] = nil
351
+ Thread.current["[mongoid]:session"] = nil
352
+ end
353
+
354
+ # Queries whether document callbacks should be executed by default for the
355
+ # current thread.
356
+ #
357
+ # Unless otherwise indicated (by #execute_callbacks=), this will return
358
+ # true.
359
+ #
360
+ # @return [ true | false ] Whether or not document callbacks should be
361
+ # executed by default.
362
+ def execute_callbacks?
363
+ if Thread.current.key?(EXECUTE_CALLBACKS)
364
+ Thread.current[EXECUTE_CALLBACKS]
365
+ else
366
+ true
367
+ end
368
+ end
369
+
370
+ # Indicates whether document callbacks should be invoked by default for
371
+ # the current thread. Individual documents may further override the
372
+ # callback behavior, but this will be used for the default behavior.
373
+ #
374
+ # @param flag [ true | false ] Whether or not document callbacks should be
375
+ # executed by default.
376
+ def execute_callbacks=(flag)
377
+ Thread.current[EXECUTE_CALLBACKS] = flag
348
378
  end
349
379
  end
350
380
  end
@@ -23,7 +23,7 @@ module Mongoid
23
23
  # person.set_created_at
24
24
  def set_created_at
25
25
  if !timeless? && !created_at
26
- time = Time.now.utc
26
+ time = Time.configured.now
27
27
  self.updated_at = time if is_a?(Updated) && !updated_at_changed?
28
28
  self.created_at = time
29
29
  end
@@ -24,7 +24,7 @@ module Mongoid
24
24
  # person.set_updated_at
25
25
  def set_updated_at
26
26
  if able_to_set_updated_at?
27
- self.updated_at = Time.now.utc unless updated_at_changed?
27
+ self.updated_at = Time.configured.now unless updated_at_changed?
28
28
  end
29
29
 
30
30
  clear_timeless_option
@@ -35,7 +35,7 @@ module Mongoid
35
35
  # @example Can the timestamp be set?
36
36
  # document.able_to_set_updated_at?
37
37
  #
38
- # @return [ true, false ] If the timestamp can be set.
38
+ # @return [ true | false ] If the timestamp can be set.
39
39
  def able_to_set_updated_at?
40
40
  !frozen? && !timeless? && (new_record? || changed?)
41
41
  end
@@ -19,10 +19,10 @@ module Mongoid
19
19
  #
20
20
  # @param [ Symbol ] field The name of an additional field to update.
21
21
  #
22
- # @return [ true/false ] false if record is new_record otherwise true.
22
+ # @return [ true/false ] false if document is new_record otherwise true.
23
23
  def touch(field = nil)
24
24
  return false if _root.new_record?
25
- current = Time.now
25
+ current = Time.configured.now
26
26
  field = database_field_name(field)
27
27
  write_attribute(:updated_at, current) if respond_to?("updated_at=")
28
28
  write_attribute(field, current) if field
@@ -60,7 +60,6 @@ module Mongoid
60
60
 
61
61
  # Callbacks are invoked on the composition root first and on the
62
62
  # leaf-most embedded document last.
63
- # TODO add tests, see MONGOID-5015.
64
63
  run_callbacks(:touch)
65
64
  true
66
65
  end
@@ -203,7 +203,7 @@ module Mongoid
203
203
  # @example Check if the document is a subclass
204
204
  # Square.new.hereditary?
205
205
  #
206
- # @return [ true, false ] True if hereditary, false if not.
206
+ # @return [ true | false ] True if hereditary, false if not.
207
207
  def hereditary?
208
208
  self.class.hereditary?
209
209
  end
@@ -233,10 +233,11 @@ module Mongoid
233
233
  def remove_child(child)
234
234
  name = child.association_name
235
235
  if child.embedded_one?
236
+ self.attributes.delete(child._association.store_as)
236
237
  remove_ivar(name)
237
238
  else
238
239
  relation = send(name)
239
- relation.send(:delete_one, child)
240
+ relation._remove(child)
240
241
  end
241
242
  end
242
243
 
@@ -282,7 +283,7 @@ module Mongoid
282
283
  # @example Is the document the root?
283
284
  # document._root?
284
285
  #
285
- # @return [ true, false ] If the document is the root.
286
+ # @return [ true | false ] If the document is the root.
286
287
  def _root?
287
288
  _parent ? false : true
288
289
  end
@@ -294,7 +295,7 @@ module Mongoid
294
295
  # @example Check if the document is a subclass.
295
296
  # Square.hereditary?
296
297
  #
297
- # @return [ true, false ] True if hereditary, false if not.
298
+ # @return [ true | false ] True if hereditary, false if not.
298
299
  def hereditary?
299
300
  !!(Mongoid::Document > superclass)
300
301
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mongoid
4
+
5
+ # @api private
6
+ module Utils
7
+
8
+ # This function should be used if you need to measure time.
9
+ # @example Calculate elapsed time.
10
+ # starting = Utils.monotonic_time
11
+ # # do something time consuming
12
+ # ending = Utils.monotonic_time
13
+ # puts "It took #{(ending - starting).to_i} seconds"
14
+ #
15
+ # @see https://blog.dnsimple.com/2018/03/elapsed-time-with-ruby-the-right-way/
16
+ #
17
+ # @return [Float] seconds according to monotonic clock
18
+ module_function def monotonic_time
19
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
20
+ end
21
+ end
22
+ end
@@ -12,7 +12,7 @@ module Mongoid
12
12
  # validator.validate_each(model, :name, "value")
13
13
  #
14
14
  # @param [ Document ] document The document.
15
- # @param [ Symbol, String ] attribute The attribute to validate.
15
+ # @param [ Symbol | String ] attribute The attribute to validate.
16
16
  # @param [ Object ] value The attribute value.
17
17
  def validate_each(document, attribute, value)
18
18
  field = document.fields[document.database_field_name(attribute)]
@@ -18,8 +18,7 @@ module Mongoid
18
18
  # validates_associated :name, :addresses
19
19
  # end
20
20
  #
21
- # @param [ Array ] args The arguments to pass to the validator.
22
- #
21
+ # @param [ Object... ] *args The arguments to pass to the validator.
23
22
  def validates_associated(*args)
24
23
  validates_with(AssociatedValidator, _merge_attributes(args))
25
24
  end
@@ -36,8 +35,7 @@ module Mongoid
36
35
  # validates_uniqueness_of :title
37
36
  # end
38
37
  #
39
- # @param [ Array ] args The arguments to pass to the validator.
40
- #
38
+ # @param [ Object... ] *args The arguments to pass to the validator.
41
39
  def validates_uniqueness_of(*args)
42
40
  validates_with(UniquenessValidator, _merge_attributes(args))
43
41
  end
@@ -52,7 +50,7 @@ module Mongoid
52
50
  # validates_format_of :title, with: /\A[a-z0-9 \-_]*\z/i
53
51
  # end
54
52
  #
55
- # @param [ Array ] args The names of the fields to validate.
53
+ # @param [ Object... ] *args The names of the field(s) to validate.
56
54
  def validates_format_of(*args)
57
55
  validates_with(FormatValidator, _merge_attributes(args))
58
56
  end
@@ -67,7 +65,7 @@ module Mongoid
67
65
  # validates_length_of :title, minimum: 100
68
66
  # end
69
67
  #
70
- # @param [ Array ] args The names of the fields to validate.
68
+ # @param [ Object... ] *args The names of the field(s) to validate.
71
69
  def validates_length_of(*args)
72
70
  validates_with(LengthValidator, _merge_attributes(args))
73
71
  end
@@ -82,7 +80,7 @@ module Mongoid
82
80
  # validates_presence_of :title
83
81
  # end
84
82
  #
85
- # @param [ Array ] args The names of the fields to validate.
83
+ # @param [ Object... ] *args The names of the field(s) to validate.
86
84
  def validates_presence_of(*args)
87
85
  validates_with(PresenceValidator, _merge_attributes(args))
88
86
  end
@@ -56,7 +56,7 @@ module Mongoid
56
56
  # @param [ Symbol ] attr The attribute.
57
57
  # @param [ Object ] value The value.
58
58
  #
59
- # @return [ true, false ] If the doc is missing.
59
+ # @return [ true | false ] If the doc is missing.
60
60
  def relation_or_fk_missing?(doc, attr, value)
61
61
  return true if value.blank? && doc.send(attr).blank?
62
62
  association = doc.relations[attr.to_s]
@@ -72,7 +72,7 @@ module Mongoid
72
72
  #
73
73
  # @param [ Object ] value The value.
74
74
  #
75
- # @return [ true, false ] If the value is not present.
75
+ # @return [ true | false ] If the value is not present.
76
76
  def not_present?(value)
77
77
  value.blank? && value != false
78
78
  end
@@ -16,7 +16,7 @@ module Mongoid
16
16
  # end
17
17
  #
18
18
  # It is also possible to limit the uniqueness constraint to a set of
19
- # records matching certain conditions:
19
+ # documents matching certain conditions:
20
20
  # class Person
21
21
  # include Mongoid::Document
22
22
  # field :title
@@ -74,7 +74,7 @@ module Mongoid
74
74
  # @example Is the validation case sensitive?
75
75
  # validator.case_sensitive?
76
76
  #
77
- # @return [ true, false ] If the validation is case sensitive.
77
+ # @return [ true | false ] If the validation is case sensitive.
78
78
  def case_sensitive?
79
79
  !(options[:case_sensitive] == false)
80
80
  end
@@ -86,7 +86,7 @@ module Mongoid
86
86
  # @example Create the criteria.
87
87
  # validator.create_criteria(User, user, :name, "syd")
88
88
  #
89
- # @param [ Class, Proxy ] base The base to execute the criteria from.
89
+ # @param [ Class | Proxy ] base The base to execute the criteria from.
90
90
  # @param [ Document ] document The document to validate.
91
91
  # @param [ Symbol ] attribute The name of the attribute.
92
92
  # @param [ Object ] value The value of the object.
@@ -149,7 +149,7 @@ module Mongoid
149
149
  #
150
150
  # @param [ Object ] value The value to filter.
151
151
  #
152
- # @return [ Object, Regexp ] The value, filtered or not.
152
+ # @return [ Object | Regexp ] The value, filtered or not.
153
153
  def filter(value)
154
154
  !case_sensitive? && value ? /\A#{Regexp.escape(value.to_s)}\z/i : value
155
155
  end
@@ -182,7 +182,7 @@ module Mongoid
182
182
  #
183
183
  # @param [ Document ] document The embedded document.
184
184
  #
185
- # @return [ true, false ] If the validation should be skipped.
185
+ # @return [ true | false ] If the validation should be skipped.
186
186
  def skip_validation?(document)
187
187
  !document._parent || document.embedded_one?
188
188
  end
@@ -196,7 +196,7 @@ module Mongoid
196
196
  #
197
197
  # @param [ Document ] document The embedded document.
198
198
  #
199
- # @return [ true, false ] If the scope reference has changed.
199
+ # @return [ true | false ] If the scope reference has changed.
200
200
  def scope_value_changed?(document)
201
201
  Array.wrap(options[:scope]).any? do |item|
202
202
  document.send("attribute_changed?", item.to_s)
@@ -242,6 +242,7 @@ module Mongoid
242
242
  relation = document._parent.send(document.association_name)
243
243
  criteria = create_criteria(relation, document, attribute, value)
244
244
  criteria = criteria.merge(options[:conditions].call) if options[:conditions]
245
+ criteria = criteria.limit(2)
245
246
  add_error(document, attribute, value) if criteria.count > 1
246
247
  end
247
248
 
@@ -277,7 +278,7 @@ module Mongoid
277
278
  # @param [ Document ] document The document getting validated.
278
279
  # @param [ Symbol ] attribute The attribute to validate.
279
280
  #
280
- # @return [ true, false ] If we need to validate.
281
+ # @return [ true | false ] If we need to validate.
281
282
  def validation_required?(document, attribute)
282
283
  document.new_record? ||
283
284
  document.send("attribute_changed?", attribute.to_s) ||
@@ -294,7 +295,7 @@ module Mongoid
294
295
  # @param [ Document ] document The document getting validated.
295
296
  # @param [ Symbol ] attribute The attribute to validate.
296
297
  #
297
- # @return [ true, false ] If the attribute is localized.
298
+ # @return [ true | false ] If the attribute is localized.
298
299
  def localized?(document, attribute)
299
300
  document.fields[document.database_field_name(attribute)].try(:localized?)
300
301
  end
@@ -44,7 +44,9 @@ module Mongoid
44
44
  #
45
45
  # @param [ Hash ] options The options to check.
46
46
  #
47
- # @return [ true, false ] If we are validating.
47
+ # @option options [ true | false ] :validate Whether or not to validate.
48
+ #
49
+ # @return [ true | false ] If we are validating.
48
50
  def performing_validations?(options = {})
49
51
  options[:validate].nil? ? true : options[:validate]
50
52
  end
@@ -83,7 +85,7 @@ module Mongoid
83
85
  #
84
86
  # @param [ Symbol ] context The optional validation context.
85
87
  #
86
- # @return [ true, false ] True if valid, false if not.
88
+ # @return [ true | false ] True if valid, false if not.
87
89
  def valid?(context = nil)
88
90
  super context ? context : (new_record? ? :create : :update)
89
91
  end
@@ -93,7 +95,7 @@ module Mongoid
93
95
  # @example Is the document validated?
94
96
  # document.validated?
95
97
  #
96
- # @return [ true, false ] Has the document already been validated?
98
+ # @return [ true | false ] Has the document already been validated?
97
99
  def validated?
98
100
  Threaded.validated?(self)
99
101
  end
@@ -103,7 +105,7 @@ module Mongoid
103
105
  # @example Are we validating with a query?
104
106
  # document.validating_with_query?
105
107
  #
106
- # @return [ true, false ] If we are validating with a query.
108
+ # @return [ true | false ] If we are validating with a query.
107
109
  def validating_with_query?
108
110
  self.class.validating_with_query?
109
111
  end
@@ -129,7 +131,8 @@ module Mongoid
129
131
  # @example Validate with a specific validator.
130
132
  # validates_with MyValidator, on: :create
131
133
  #
132
- # @param [ Class<Array>, Hash ] args The validator classes and options.
134
+ # @param [ ActiveModel::Validator..., Hash ] *args The validator classes
135
+ # and options hash.
133
136
  #
134
137
  # @note See ActiveModel::Validations::With for full options. This is
135
138
  # overridden to add autosave functionality when presence validation is
@@ -151,7 +154,7 @@ module Mongoid
151
154
  # @example Are we validating with a query?
152
155
  # Model.validating_with_query?
153
156
  #
154
- # @return [ true, false ] If we are validating with a query.
157
+ # @return [ true | false ] If we are validating with a query.
155
158
  def validating_with_query?
156
159
  Threaded.executing?("#{name}-validate-with-query")
157
160
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mongoid
4
- VERSION = "7.5.3"
4
+ VERSION = "8.1.2"
5
5
  end
@@ -21,9 +21,24 @@ module Mongoid
21
21
  end
22
22
  end
23
23
 
24
- warning :id_sort_deprecated, 'The :id_sort option has been deprecated. Use Mongo#take to get a document without a sort on _id.'
25
- warning :criteria_cache_deprecated, 'The criteria cache has been deprecated and will be removed in Mongoid 8. Please enable the Mongoid QueryCache to have caching functionality.'
26
- warning :map_field_deprecated, 'The field argument to the Mongo#map method has been deprecated, please pass in a block instead. Support will be dropped in Mongoid 8.'
24
+ warning :geo_haystack_deprecated, 'The geoHaystack type is deprecated.'
25
+ warning :as_json_compact_deprecated, '#as_json :compact option is deprecated. Please call #compact on the returned Hash object instead.'
26
+ warning :symbol_type_deprecated, 'The BSON Symbol type is deprecated by MongoDB. Please use String or StringifiedSymbol field types instead of the Symbol field type.'
27
+ warning :legacy_readonly, 'The readonly! method will only mark the document readonly when the legacy_readonly feature flag is switched off.'
28
+ warning :use_activesupport_time_zone_deprecated, 'Config option :use_activesupport_time_zone is deprecated and should be removed from your config. It will always be true beginning in Mongoid 9.0.'
29
+ warning :broken_aggregables_deprecated, 'Config option :broken_aggregables is deprecated. It will always be false beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
30
+ warning :broken_alias_handling_deprecated, 'Config option :broken_alias_handling is deprecated. It will always be false beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
31
+ warning :broken_and_deprecated, 'Config option :broken_and is deprecated. It will always be false beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
32
+ warning :broken_scoping_deprecated, 'Config option :broken_scoping is deprecated. It will always be false beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
33
+ warning :broken_updates_deprecated, 'Config option :broken_updates is deprecated. It will always be false beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
34
+ warning :compare_time_by_ms_deprecated, 'Config option :compare_time_by_ms is deprecated. It will always be true beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
35
+ warning :legacy_attributes_deprecated, 'Config option :legacy_attributes is deprecated. It will always be false beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
36
+ warning :legacy_pluck_distinct_deprecated, 'Config option :legacy_pluck_distinct is deprecated. It will always be false beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
37
+ warning :legacy_triple_equals_deprecated, 'Config option :legacy_triple_equals is deprecated. It will always be false beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
38
+ warning :object_id_as_json_oid_deprecated, 'Config option :object_id_as_json_oid is deprecated. It will always be false beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
39
+ warning :overwrite_chained_operators_deprecated, 'Config option :overwrite_chained_operators is deprecated. It will always be false beginning in Mongoid 9.0. Please use load_defaults for Mongoid 8.0 or later, then remove it from your config.'
40
+ warning :mutable_ids, 'In Mongoid 9.0 the _id field will be immutable. In earlier versions of 8.x, mutating the _id field was supported inconsistently. Prepare your code for 9.0 by setting Mongoid::Config.immutable_ids to true.'
41
+ warning :mongoid_query_cache, 'In Mongoid 9.0, Mongoid::QueryCache will be removed. Please replace it with Mongo::QueryCache.'
42
+ warning :mongoid_query_cache_clear, 'In Mongoid 9.0, Mongoid::QueryCache#clear_cache should be replaced it with Mongo::QueryCache#clear.'
27
43
  end
28
44
  end
29
-
data/lib/mongoid.rb CHANGED
@@ -12,10 +12,13 @@ require "active_support/inflector"
12
12
  require "active_support/time_with_zone"
13
13
  require "active_model"
14
14
 
15
+ require 'concurrent-ruby'
16
+
15
17
  require "mongo"
16
- require 'mongo/active_support'
18
+ require "mongo/active_support"
17
19
 
18
20
  require "mongoid/version"
21
+ require "mongoid/deprecable"
19
22
  require "mongoid/config"
20
23
  require "mongoid/persistence_context"
21
24
  require "mongoid/loggable"
@@ -24,6 +27,7 @@ require "mongoid/document"
24
27
  require "mongoid/tasks/database"
25
28
  require "mongoid/query_cache"
26
29
  require "mongoid/warnings"
30
+ require "mongoid/utils"
27
31
 
28
32
  # If we are using Rails then we will include the Mongoid railtie. This has all
29
33
  # the nifty initializers that Mongoid needs.
@@ -57,9 +61,19 @@ module Mongoid
57
61
  # }
58
62
  # end
59
63
  #
64
+ # @example Using a block without an argument. Use `config` inside
65
+ # the block to perform variable assignment.
66
+ #
67
+ # Mongoid.configure do
68
+ # connect_to("mongoid_test")
69
+ #
70
+ # config.preload_models = true
71
+ #
60
72
  # @return [ Config ] The configuration object.
61
- def configure
62
- block_given? ? yield(Config) : Config
73
+ def configure(&block)
74
+ return Config unless block_given?
75
+
76
+ block.arity == 0 ? Config.instance_exec(&block) : yield(Config)
63
77
  end
64
78
 
65
79
  # Convenience method for getting the default client.
@@ -40,6 +40,22 @@ test:
40
40
  app_name: 'testing'
41
41
  background_indexing: false
42
42
  join_contexts: false
43
+ driver_options:
44
+ broken_view_options: false
45
+ # Don't set validate_update_replace here, as it is used to check if the
46
+ # default driver options are kept in Mongoid.
47
+ test_nil:
48
+ clients:
49
+ default:
50
+ database: mongoid_test
51
+ hosts:
52
+ <% SpecConfig.instance.addresses.each do |address| %>
53
+ - <%= address %>
54
+ <% end %>
55
+ driver_options:
56
+ broken_view_options:
57
+ validate_update_replace: false
58
+
43
59
  test_with_max_staleness:
44
60
  clients:
45
61
  default: