mongoid 7.4.0 → 8.0.3

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -479,10 +479,24 @@ describe Mongoid::Criteria::Queryable::Selectable do
479
479
  query.elem_match(users: { name: "value" })
480
480
  end
481
481
 
482
- it "adds the $elemMatch expression" do
483
- expect(selection.selector).to eq({
484
- "users" => { "$elemMatch" => { name: "value" }}
485
- })
482
+ context "when overwrite_chained_operators is false" do
483
+ config_override :overwrite_chained_operators, false
484
+
485
+ it "adds the $elemMatch expression" do
486
+ expect(selection.selector).to eq({
487
+ "users" => { "$elemMatch" => { "name" => "value" }}
488
+ })
489
+ end
490
+ end
491
+
492
+ context "when overwrite_chained_operators is true" do
493
+ config_override :overwrite_chained_operators, true
494
+
495
+ it "adds the $elemMatch expression" do
496
+ expect(selection.selector).to eq({
497
+ "users" => { "$elemMatch" => { name: "value" }}
498
+ })
499
+ end
486
500
  end
487
501
 
488
502
  it "returns a cloned query" do
@@ -523,11 +537,26 @@ describe Mongoid::Criteria::Queryable::Selectable do
523
537
  )
524
538
  end
525
539
 
526
- it "adds the $elemMatch expression" do
527
- expect(selection.selector).to eq({
528
- "users" => { "$elemMatch" => { name: "value" }},
529
- "comments" => { "$elemMatch" => { text: "value" }}
530
- })
540
+ context "when overwrite_chained_operators is false" do
541
+ config_override :overwrite_chained_operators, false
542
+
543
+ it "adds the $elemMatch expression" do
544
+ expect(selection.selector).to eq({
545
+ "users" => { "$elemMatch" => { "name" => "value" }},
546
+ "comments" => { "$elemMatch" => { "text" => "value" }}
547
+ })
548
+ end
549
+ end
550
+
551
+ context "when overwrite_chained_operators is true" do
552
+ config_override :overwrite_chained_operators, true
553
+
554
+ it "adds the $elemMatch expression" do
555
+ expect(selection.selector).to eq({
556
+ "users" => { "$elemMatch" => { name: "value" }},
557
+ "comments" => { "$elemMatch" => { text: "value" }}
558
+ })
559
+ end
531
560
  end
532
561
 
533
562
  it "returns a cloned query" do
@@ -546,11 +575,26 @@ describe Mongoid::Criteria::Queryable::Selectable do
546
575
  elem_match(comments: { text: "value" })
547
576
  end
548
577
 
549
- it "adds the $elemMatch expression" do
550
- expect(selection.selector).to eq({
551
- "users" => { "$elemMatch" => { name: "value" }},
552
- "comments" => { "$elemMatch" => { text: "value" }}
553
- })
578
+ context "when overwrite_chained_operators is false" do
579
+ config_override :overwrite_chained_operators, false
580
+
581
+ it "adds the $elemMatch expression" do
582
+ expect(selection.selector).to eq({
583
+ "users" => { "$elemMatch" => { "name" => "value" }},
584
+ "comments" => { "$elemMatch" => { "text" => "value" }}
585
+ })
586
+ end
587
+ end
588
+
589
+ context "when overwrite_chained_operators is true" do
590
+ config_override :overwrite_chained_operators, true
591
+
592
+ it "adds the $elemMatch expression" do
593
+ expect(selection.selector).to eq({
594
+ "users" => { "$elemMatch" => { name: "value" }},
595
+ "comments" => { "$elemMatch" => { text: "value" }}
596
+ })
597
+ end
554
598
  end
555
599
 
556
600
  it "returns a cloned query" do
@@ -566,10 +610,25 @@ describe Mongoid::Criteria::Queryable::Selectable do
566
610
  elem_match(users: { state: "new" })
567
611
  end
568
612
 
569
- it "overrides the $elemMatch expression" do
570
- expect(selection.selector).to eq({
571
- "users" => { "$elemMatch" => { state: "new" }}
572
- })
613
+ context "when overwrite_chained_operators is false" do
614
+ config_override :overwrite_chained_operators, false
615
+
616
+ it "adds an $elemMatch expression" do
617
+ expect(selection.selector).to eq({
618
+ "users" => { "$elemMatch" => { "name" => "value" } },
619
+ "$and" => [ { "users" => { "$elemMatch" => { "state" => "new" } } } ],
620
+ })
621
+ end
622
+ end
623
+
624
+ context "when overwrite_chained_operators is true" do
625
+ config_override :overwrite_chained_operators, true
626
+
627
+ it "overrides the $elemMatch expression" do
628
+ expect(selection.selector).to eq({
629
+ "users" => { "$elemMatch" => { state: "new" }}
630
+ })
631
+ end
573
632
  end
574
633
 
575
634
  it "returns a cloned query" do
@@ -695,127 +754,119 @@ describe Mongoid::Criteria::Queryable::Selectable do
695
754
  end
696
755
  end
697
756
 
698
- %i(geo_spatial geo_spacial).each do |meth|
699
- describe "#geo_spacial" do
757
+ describe "#geo_spatial" do
700
758
 
701
- let(:query_method) { meth }
759
+ let(:query_method) { :geo_spatial }
702
760
 
703
- it_behaves_like 'requires an argument'
704
- it_behaves_like 'requires a non-nil argument'
761
+ it_behaves_like 'requires an argument'
762
+ it_behaves_like 'requires a non-nil argument'
705
763
 
706
- context "when provided a criterion" do
764
+ context "when provided a criterion" do
707
765
 
708
- context "when the geometry is a point intersection" do
766
+ context "when the geometry is a point intersection" do
709
767
 
710
- let(:selection) do
711
- query.public_send(query_method, :location.intersects_point => [ 1, 10 ])
712
- end
768
+ let(:selection) do
769
+ query.geo_spatial(:location.intersects_point => [ 1, 10 ])
770
+ end
713
771
 
714
- it "adds the $geoIntersects expression" do
715
- expect(selection.selector).to eq({
716
- "location" => {
717
- "$geoIntersects" => {
718
- "$geometry" => {
719
- "type" => "Point",
720
- "coordinates" => [ 1, 10 ]
721
- }
772
+ it "adds the $geoIntersects expression" do
773
+ expect(selection.selector).to eq({
774
+ "location" => {
775
+ "$geoIntersects" => {
776
+ "$geometry" => {
777
+ "type" => "Point",
778
+ "coordinates" => [ 1, 10 ]
722
779
  }
723
780
  }
724
- })
725
- end
726
-
727
- it_behaves_like "returns a cloned query"
781
+ }
782
+ })
728
783
  end
729
784
 
730
- context "when the geometry is a line intersection" do
785
+ it_behaves_like "returns a cloned query"
786
+ end
731
787
 
732
- let(:selection) do
733
- query.public_send(query_method, :location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
734
- end
788
+ context "when the geometry is a line intersection" do
735
789
 
736
- it "adds the $geoIntersects expression" do
737
- expect(selection.selector).to eq({
738
- "location" => {
739
- "$geoIntersects" => {
740
- "$geometry" => {
741
- "type" => "LineString",
742
- "coordinates" => [[ 1, 10 ], [ 2, 10 ]]
743
- }
790
+ let(:selection) do
791
+ query.geo_spatial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
792
+ end
793
+
794
+ it "adds the $geoIntersects expression" do
795
+ expect(selection.selector).to eq({
796
+ "location" => {
797
+ "$geoIntersects" => {
798
+ "$geometry" => {
799
+ "type" => "LineString",
800
+ "coordinates" => [[ 1, 10 ], [ 2, 10 ]]
744
801
  }
745
802
  }
746
- })
747
- end
748
-
749
- it_behaves_like "returns a cloned query"
803
+ }
804
+ })
750
805
  end
751
806
 
752
- context "when the geometry is a polygon intersection" do
807
+ it_behaves_like "returns a cloned query"
808
+ end
753
809
 
754
- let(:selection) do
755
- query.public_send(query_method,
756
- :location.intersects_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
757
- )
758
- end
810
+ context "when the geometry is a polygon intersection" do
759
811
 
760
- it "adds the $geoIntersects expression" do
761
- expect(selection.selector).to eq({
762
- "location" => {
763
- "$geoIntersects" => {
764
- "$geometry" => {
765
- "type" => "Polygon",
766
- "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
767
- }
812
+ let(:selection) do
813
+ query.geo_spatial(:location.intersects_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]])
814
+ end
815
+
816
+ it "adds the $geoIntersects expression" do
817
+ expect(selection.selector).to eq({
818
+ "location" => {
819
+ "$geoIntersects" => {
820
+ "$geometry" => {
821
+ "type" => "Polygon",
822
+ "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
768
823
  }
769
824
  }
770
- })
771
- end
825
+ }
826
+ })
827
+ end
828
+
829
+ it_behaves_like "returns a cloned query"
830
+ end
831
+
832
+ context "when the geometry is within a polygon" do
772
833
 
773
- it_behaves_like "returns a cloned query"
834
+ let(:selection) do
835
+ query.geo_spatial(:location.within_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]])
774
836
  end
775
837
 
776
- context "when the geometry is within a polygon" do
838
+ it "adds the $geoIntersects expression" do
839
+ expect(selection.selector).to eq({
840
+ "location" => {
841
+ "$geoWithin" => {
842
+ "$geometry" => {
843
+ "type" => "Polygon",
844
+ "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
845
+ }
846
+ }
847
+ }
848
+ })
849
+ end
777
850
 
851
+ context "when used with the $box operator ($geoWithin query) " do
778
852
  let(:selection) do
779
- query.public_send(query_method,
780
- :location.within_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
781
- )
853
+ query.geo_spatial(:location.within_box => [[ 1, 10 ], [ 2, 10 ]])
782
854
  end
783
855
 
784
856
  it "adds the $geoIntersects expression" do
785
857
  expect(selection.selector).to eq({
786
858
  "location" => {
787
859
  "$geoWithin" => {
788
- "$geometry" => {
789
- "type" => "Polygon",
790
- "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
791
- }
860
+ "$box" => [
861
+ [ 1, 10 ], [ 2, 10 ]
862
+ ]
792
863
  }
793
864
  }
794
865
  })
795
866
  end
796
-
797
- context "when used with the $box operator ($geoWithin query) " do
798
- let(:selection) do
799
- query.public_send(query_method,
800
- :location.within_box => [[ 1, 10 ], [ 2, 10 ]]
801
- )
802
- end
803
-
804
- it "adds the $geoIntersects expression" do
805
- expect(selection.selector).to eq({
806
- "location" => {
807
- "$geoWithin" => {
808
- "$box" => [
809
- [ 1, 10 ], [ 2, 10 ]
810
- ]
811
- }
812
- }
813
- })
814
- end
815
- end
816
-
817
- it_behaves_like "returns a cloned query"
818
867
  end
868
+
869
+ it_behaves_like "returns a cloned query"
819
870
  end
820
871
  end
821
872
  end
@@ -887,18 +938,40 @@ describe Mongoid::Criteria::Queryable::Selectable do
887
938
 
888
939
  context "when the criterion are on the same field" do
889
940
 
890
- let(:selection) do
891
- query.gt(first: 10).gt(first: 15)
892
- end
941
+ context "when overwrite_chained_operators is true" do
942
+ config_override :overwrite_chained_operators, true
893
943
 
894
- it "overwrites the first $gt selector" do
895
- expect(selection.selector).to eq({
896
- "first" => { "$gt" => 15 }
897
- })
944
+ let(:selection) do
945
+ query.gt(first: 10).gt(first: 15)
946
+ end
947
+
948
+ it "overwrites the first $gt selector" do
949
+ expect(selection.selector).to eq({
950
+ "first" => { "$gt" => 15 },
951
+ })
952
+ end
953
+
954
+ it "returns a cloned query" do
955
+ expect(selection).to_not equal(query)
956
+ end
898
957
  end
899
958
 
900
- it "returns a cloned query" do
901
- expect(selection).to_not equal(query)
959
+ context "when overwrite_chained_operators is false" do
960
+ config_override :overwrite_chained_operators, false
961
+ let(:selection) do
962
+ query.gt(first: 10).gt(first: 15)
963
+ end
964
+
965
+ it "overwrites the first $gt selector" do
966
+ expect(selection.selector).to eq({
967
+ "first" => { "$gt" => 10 },
968
+ "$and" => [{ "first" => { "$gt" => 15 } }]
969
+ })
970
+ end
971
+
972
+ it "returns a cloned query" do
973
+ expect(selection).to_not equal(query)
974
+ end
902
975
  end
903
976
  end
904
977
  end
@@ -975,10 +1048,25 @@ describe Mongoid::Criteria::Queryable::Selectable do
975
1048
  query.gte(first: 10).gte(first: 15)
976
1049
  end
977
1050
 
978
- it "overwrites the first $gte selector" do
979
- expect(selection.selector).to eq({
980
- "first" => { "$gte" => 15 }
981
- })
1051
+ context "when overwrite_chained_operators is false" do
1052
+ config_override :overwrite_chained_operators, false
1053
+
1054
+ it "adds a second $gte selector" do
1055
+ expect(selection.selector).to eq({
1056
+ "first" => { "$gte" => 10 },
1057
+ "$and" => [ { "first" => { "$gte" => 15 } } ]
1058
+ })
1059
+ end
1060
+ end
1061
+
1062
+ context "when overwrite_chained_operators is true" do
1063
+ config_override :overwrite_chained_operators, true
1064
+
1065
+ it "overwrites the first $gte selector" do
1066
+ expect(selection.selector).to eq({
1067
+ "first" => { "$gte" => 15 }
1068
+ })
1069
+ end
982
1070
  end
983
1071
 
984
1072
  it "returns a cloned query" do
@@ -1152,10 +1240,25 @@ describe Mongoid::Criteria::Queryable::Selectable do
1152
1240
  query.lt(first: 10).lt(first: 15)
1153
1241
  end
1154
1242
 
1155
- it "overwrites the first $lt selector" do
1156
- expect(selection.selector).to eq({
1157
- "first" => { "$lt" => 15 }
1158
- })
1243
+ context "when overwrite_chained_operators is false" do
1244
+ config_override :overwrite_chained_operators, false
1245
+
1246
+ it "adds a second $lt selector" do
1247
+ expect(selection.selector).to eq({
1248
+ "first" => { "$lt" => 10 },
1249
+ "$and" => [ { "first" => { "$lt" => 15 } } ]
1250
+ })
1251
+ end
1252
+ end
1253
+
1254
+ context "when overwrite_chained_operators is true" do
1255
+ config_override :overwrite_chained_operators, true
1256
+
1257
+ it "overwrites the first $lt selector" do
1258
+ expect(selection.selector).to eq({
1259
+ "first" => { "$lt" => 15 }
1260
+ })
1261
+ end
1159
1262
  end
1160
1263
 
1161
1264
  it "returns a cloned query" do
@@ -1236,10 +1339,25 @@ describe Mongoid::Criteria::Queryable::Selectable do
1236
1339
  query.lte(first: 10).lte(first: 15)
1237
1340
  end
1238
1341
 
1239
- it "overwrites the first $lte selector" do
1240
- expect(selection.selector).to eq({
1241
- "first" => { "$lte" => 15 }
1242
- })
1342
+ context "when overwrite_chained_operators is false" do
1343
+ config_override :overwrite_chained_operators, false
1344
+
1345
+ it "adds a second $lte selector" do
1346
+ expect(selection.selector).to eq({
1347
+ "first" => { "$lte" => 10 },
1348
+ "$and" => [ { "first" => { "$lte" => 15 } } ]
1349
+ })
1350
+ end
1351
+ end
1352
+
1353
+ context "when overwrite_chained_operators is true" do
1354
+ config_override :overwrite_chained_operators, true
1355
+
1356
+ it "overwrites the first $lte selector" do
1357
+ expect(selection.selector).to eq({
1358
+ "first" => { "$lte" => 15 }
1359
+ })
1360
+ end
1243
1361
  end
1244
1362
 
1245
1363
  it "returns a cloned query" do
@@ -2294,4 +2412,51 @@ describe Mongoid::Criteria::Queryable::Selectable do
2294
2412
  end
2295
2413
  end
2296
2414
  end
2415
+
2416
+ describe "Mongoid.overwrite_chained_operators" do
2417
+ [ :eq, :elem_match, :gt, :gte, :lt, :lte, :mod, :ne, :near, :near_sphere ].each do |meth|
2418
+
2419
+ context "when chaining the #{meth} method when using the same field" do
2420
+ let(:op) do
2421
+ {
2422
+ eq: "$eq",
2423
+ elem_match: "$elemMatch",
2424
+ gt: "$gt",
2425
+ gte: "$gte",
2426
+ lt: "$lt",
2427
+ lte: "$lte",
2428
+ mod: "$mod",
2429
+ ne: "$ne",
2430
+ near: "$near",
2431
+ near_sphere: "$nearSphere"
2432
+ }[meth]
2433
+ end
2434
+
2435
+ let(:criteria) do
2436
+ Band.send(meth, {views: 1}).send(meth, {views:2})
2437
+ end
2438
+
2439
+ context "when overwrite_chained_operators is true" do
2440
+ config_override :overwrite_chained_operators, true
2441
+
2442
+ it "overrides the previous operators" do
2443
+ expect(criteria.selector).to eq({
2444
+ "views" => { op => 2 },
2445
+ })
2446
+ end
2447
+ end
2448
+
2449
+ context "when overwrite_chained_operators is false" do
2450
+ config_override :overwrite_chained_operators, false
2451
+
2452
+ it "overrides the previous operators" do
2453
+ expect(criteria.selector).to eq({
2454
+ "views" => { op => 1 },
2455
+ "$and" => [{ "views" => { op => 2 } }]
2456
+ })
2457
+ end
2458
+ end
2459
+ end
2460
+ end
2461
+ end
2297
2462
  end
@@ -387,8 +387,20 @@ describe Mongoid::Criteria::Queryable::Selector do
387
387
  selector.send(method, "key", array)
388
388
  end
389
389
 
390
- it "serializes each element in the array" do
391
- expect(selector["key"]).to eq([ big_one.to_s, big_two.to_s ])
390
+ context 'when serializing bigdecimal to string' do
391
+ config_override :map_big_decimal_to_decimal128, false
392
+
393
+ it "serializes each element in the array" do
394
+ expect(selector["key"]).to eq([ big_one.to_s, big_two.to_s ])
395
+ end
396
+ end
397
+
398
+ context 'when serializing bigdecimal to decimal128' do
399
+ config_override :map_big_decimal_to_decimal128, true
400
+
401
+ it "serializes each element in the array" do
402
+ expect(selector["key"]).to eq([ BSON::Decimal128.new(big_one), BSON::Decimal128.new(big_two)])
403
+ end
392
404
  end
393
405
  end
394
406
  end
@@ -171,7 +171,6 @@ describe Mongoid::Criteria do
171
171
 
172
172
  let(:dictionary) do
173
173
  Dictionary.only(:description).first
174
-
175
174
  end
176
175
 
177
176
  it 'loads all translations' do