mongoid 7.4.3 → 8.0.7

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 (383) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/Rakefile +25 -0
  5. data/lib/config/locales/en.yml +52 -28
  6. data/lib/mongoid/association/accessors.rb +38 -9
  7. data/lib/mongoid/association/bindable.rb +50 -2
  8. data/lib/mongoid/association/builders.rb +4 -2
  9. data/lib/mongoid/association/constrainable.rb +0 -1
  10. data/lib/mongoid/association/eager_loadable.rb +29 -7
  11. data/lib/mongoid/association/embedded/batchable.rb +33 -10
  12. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  13. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  14. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -2
  15. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  16. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  17. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  18. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +65 -41
  19. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  20. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  21. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +23 -4
  22. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  23. data/lib/mongoid/association/macros.rb +28 -1
  24. data/lib/mongoid/association/many.rb +11 -7
  25. data/lib/mongoid/association/nested/many.rb +5 -4
  26. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  27. data/lib/mongoid/association/nested/one.rb +5 -5
  28. data/lib/mongoid/association/one.rb +2 -2
  29. data/lib/mongoid/association/options.rb +9 -9
  30. data/lib/mongoid/association/proxy.rb +14 -3
  31. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  32. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  33. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  34. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  35. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  36. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  37. data/lib/mongoid/association/referenced/eager.rb +2 -2
  38. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  39. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  40. data/lib/mongoid/association/referenced/has_many/enumerable.rb +20 -24
  41. data/lib/mongoid/association/referenced/has_many/proxy.rb +26 -16
  42. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  43. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  44. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  45. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  46. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  47. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  48. data/lib/mongoid/association/reflections.rb +2 -2
  49. data/lib/mongoid/association/relatable.rb +44 -10
  50. data/lib/mongoid/association.rb +5 -5
  51. data/lib/mongoid/atomic/modifiers.rb +2 -2
  52. data/lib/mongoid/atomic.rb +7 -0
  53. data/lib/mongoid/attributes/dynamic.rb +3 -3
  54. data/lib/mongoid/attributes/nested.rb +5 -5
  55. data/lib/mongoid/attributes/processing.rb +37 -6
  56. data/lib/mongoid/attributes/projector.rb +1 -1
  57. data/lib/mongoid/attributes/readonly.rb +2 -2
  58. data/lib/mongoid/attributes.rb +43 -40
  59. data/lib/mongoid/cacheable.rb +2 -2
  60. data/lib/mongoid/changeable.rb +43 -10
  61. data/lib/mongoid/clients/options.rb +5 -1
  62. data/lib/mongoid/clients/sessions.rb +2 -14
  63. data/lib/mongoid/clients/validators/storage.rb +3 -3
  64. data/lib/mongoid/config/options.rb +3 -0
  65. data/lib/mongoid/config/validators/client.rb +6 -6
  66. data/lib/mongoid/config.rb +62 -17
  67. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  68. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  69. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  70. data/lib/mongoid/contextual/atomic.rb +1 -1
  71. data/lib/mongoid/contextual/geo_near.rb +7 -7
  72. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  73. data/lib/mongoid/contextual/memory.rb +180 -21
  74. data/lib/mongoid/contextual/mongo.rb +260 -217
  75. data/lib/mongoid/contextual/none.rb +67 -5
  76. data/lib/mongoid/contextual/queryable.rb +1 -1
  77. data/lib/mongoid/contextual.rb +2 -2
  78. data/lib/mongoid/copyable.rb +32 -8
  79. data/lib/mongoid/criteria/findable.rb +7 -4
  80. data/lib/mongoid/criteria/includable.rb +24 -20
  81. data/lib/mongoid/criteria/marshalable.rb +10 -2
  82. data/lib/mongoid/criteria/permission.rb +1 -1
  83. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  84. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -14
  85. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  86. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  87. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  88. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  89. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -15
  90. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
  91. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  92. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  93. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  94. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  95. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  96. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  97. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  98. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  99. data/lib/mongoid/criteria/queryable/key.rb +3 -3
  100. data/lib/mongoid/criteria/queryable/mergeable.rb +21 -0
  101. data/lib/mongoid/criteria/queryable/optional.rb +5 -11
  102. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  103. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  104. data/lib/mongoid/criteria/queryable/selectable.rb +31 -37
  105. data/lib/mongoid/criteria/queryable/selector.rb +93 -8
  106. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  107. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  108. data/lib/mongoid/criteria/queryable.rb +12 -7
  109. data/lib/mongoid/criteria/scopable.rb +2 -2
  110. data/lib/mongoid/criteria/translator.rb +45 -0
  111. data/lib/mongoid/criteria.rb +16 -35
  112. data/lib/mongoid/deprecable.rb +37 -0
  113. data/lib/mongoid/deprecation.rb +25 -0
  114. data/lib/mongoid/document.rb +135 -34
  115. data/lib/mongoid/equality.rb +8 -8
  116. data/lib/mongoid/errors/document_not_found.rb +33 -12
  117. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  118. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  119. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  120. data/lib/mongoid/errors/invalid_field.rb +6 -2
  121. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  122. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  123. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  124. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  125. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  126. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  127. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  128. data/lib/mongoid/errors/no_client_database.rb +1 -1
  129. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  130. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  131. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  132. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  133. data/lib/mongoid/errors.rb +2 -2
  134. data/lib/mongoid/extensions/array.rb +9 -7
  135. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  136. data/lib/mongoid/extensions/binary.rb +42 -0
  137. data/lib/mongoid/extensions/boolean.rb +8 -2
  138. data/lib/mongoid/extensions/date.rb +26 -20
  139. data/lib/mongoid/extensions/date_time.rb +1 -1
  140. data/lib/mongoid/extensions/false_class.rb +1 -1
  141. data/lib/mongoid/extensions/float.rb +7 -4
  142. data/lib/mongoid/extensions/hash.rb +37 -8
  143. data/lib/mongoid/extensions/integer.rb +7 -4
  144. data/lib/mongoid/extensions/module.rb +1 -1
  145. data/lib/mongoid/extensions/object.rb +8 -6
  146. data/lib/mongoid/extensions/range.rb +41 -10
  147. data/lib/mongoid/extensions/regexp.rb +11 -4
  148. data/lib/mongoid/extensions/set.rb +11 -4
  149. data/lib/mongoid/extensions/string.rb +11 -22
  150. data/lib/mongoid/extensions/symbol.rb +4 -15
  151. data/lib/mongoid/extensions/time.rb +27 -16
  152. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  153. data/lib/mongoid/extensions/true_class.rb +1 -1
  154. data/lib/mongoid/extensions.rb +1 -0
  155. data/lib/mongoid/factory.rb +55 -7
  156. data/lib/mongoid/fields/foreign_key.rb +11 -4
  157. data/lib/mongoid/fields/localized.rb +9 -4
  158. data/lib/mongoid/fields/standard.rb +7 -7
  159. data/lib/mongoid/fields/validators/macro.rb +3 -9
  160. data/lib/mongoid/fields.rb +233 -40
  161. data/lib/mongoid/findable.rb +34 -13
  162. data/lib/mongoid/indexable/specification.rb +2 -2
  163. data/lib/mongoid/indexable/validators/options.rb +6 -2
  164. data/lib/mongoid/interceptable.rb +185 -16
  165. data/lib/mongoid/matchable.rb +1 -1
  166. data/lib/mongoid/matcher.rb +33 -13
  167. data/lib/mongoid/persistable/creatable.rb +18 -9
  168. data/lib/mongoid/persistable/deletable.rb +1 -1
  169. data/lib/mongoid/persistable/destroyable.rb +1 -1
  170. data/lib/mongoid/persistable/savable.rb +2 -2
  171. data/lib/mongoid/persistable/unsettable.rb +1 -1
  172. data/lib/mongoid/persistable/updatable.rb +19 -12
  173. data/lib/mongoid/persistable/upsertable.rb +1 -1
  174. data/lib/mongoid/persistable.rb +3 -3
  175. data/lib/mongoid/persistence_context.rb +63 -10
  176. data/lib/mongoid/query_cache.rb +8 -260
  177. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  178. data/lib/mongoid/reloadable.rb +10 -8
  179. data/lib/mongoid/scopable.rb +26 -22
  180. data/lib/mongoid/selectable.rb +1 -2
  181. data/lib/mongoid/serializable.rb +10 -6
  182. data/lib/mongoid/shardable.rb +35 -11
  183. data/lib/mongoid/stateful.rb +35 -9
  184. data/lib/mongoid/tasks/database.rb +0 -2
  185. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  186. data/lib/mongoid/threaded.rb +42 -12
  187. data/lib/mongoid/timestamps/created.rb +1 -1
  188. data/lib/mongoid/timestamps/updated.rb +2 -2
  189. data/lib/mongoid/touchable.rb +2 -3
  190. data/lib/mongoid/traversable.rb +5 -4
  191. data/lib/mongoid/validatable/localizable.rb +1 -1
  192. data/lib/mongoid/validatable/macros.rb +0 -2
  193. data/lib/mongoid/validatable/presence.rb +2 -2
  194. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  195. data/lib/mongoid/validatable.rb +6 -6
  196. data/lib/mongoid/version.rb +1 -1
  197. data/lib/mongoid/warnings.rb +28 -0
  198. data/lib/mongoid.rb +2 -0
  199. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -3
  200. data/spec/config/mongoid.yml +16 -0
  201. data/spec/integration/app_spec.rb +8 -12
  202. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  203. data/spec/integration/associations/embedded_spec.rb +15 -0
  204. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  205. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  206. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  207. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  208. data/spec/integration/associations/has_one_spec.rb +97 -1
  209. data/spec/integration/associations/scope_option_spec.rb +1 -1
  210. data/spec/integration/callbacks_models.rb +95 -1
  211. data/spec/integration/callbacks_spec.rb +246 -4
  212. data/spec/integration/criteria/range_spec.rb +95 -1
  213. data/spec/integration/discriminator_key_spec.rb +115 -76
  214. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  215. data/spec/integration/i18n_fallbacks_spec.rb +1 -17
  216. data/spec/integration/matcher_examples_spec.rb +20 -13
  217. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  218. data/spec/integration/matcher_operator_spec.rb +3 -5
  219. data/spec/integration/persistence/range_field_spec.rb +350 -0
  220. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  221. data/spec/mongoid/association/depending_spec.rb +9 -9
  222. data/spec/mongoid/association/eager_spec.rb +2 -1
  223. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  224. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  225. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  226. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  227. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +235 -40
  228. data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
  229. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  230. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  231. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  232. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  233. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  234. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  235. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  236. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  237. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  238. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  239. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +202 -201
  240. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  241. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  242. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  243. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +8 -8
  244. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +160 -119
  245. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  246. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  247. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  248. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  249. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  250. data/spec/mongoid/association/syncable_spec.rb +14 -0
  251. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  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 +551 -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 +23 -30
  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_spec.rb +78 -18
  263. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  264. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  265. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  266. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  267. data/spec/mongoid/contextual/memory_spec.rb +1336 -69
  268. data/spec/mongoid/contextual/mongo_spec.rb +1253 -247
  269. data/spec/mongoid/contextual/none_spec.rb +38 -0
  270. data/spec/mongoid/copyable_spec.rb +451 -1
  271. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  272. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  273. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  274. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  275. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  276. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  277. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  278. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  279. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  280. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  281. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +0 -59
  282. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  283. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  284. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  285. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  286. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  287. data/spec/mongoid/criteria/queryable/selectable_spec.rb +289 -124
  288. data/spec/mongoid/criteria/queryable/selector_spec.rb +89 -4
  289. data/spec/mongoid/criteria/queryable/storable_spec.rb +72 -0
  290. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  291. data/spec/mongoid/criteria_projection_spec.rb +0 -1
  292. data/spec/mongoid/criteria_spec.rb +475 -1199
  293. data/spec/mongoid/document_fields_spec.rb +173 -24
  294. data/spec/mongoid/document_spec.rb +32 -41
  295. data/spec/mongoid/errors/document_not_found_spec.rb +76 -0
  296. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  297. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  298. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  299. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  300. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  301. data/spec/mongoid/extensions/array_spec.rb +16 -2
  302. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  303. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  304. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  305. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  306. data/spec/mongoid/extensions/date_spec.rb +71 -1
  307. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  308. data/spec/mongoid/extensions/float_spec.rb +53 -74
  309. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  310. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  311. data/spec/mongoid/extensions/range_spec.rb +255 -54
  312. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  313. data/spec/mongoid/extensions/set_spec.rb +106 -0
  314. data/spec/mongoid/extensions/string_spec.rb +53 -25
  315. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  316. data/spec/mongoid/extensions/time_spec.rb +634 -66
  317. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  318. data/spec/mongoid/factory_spec.rb +61 -1
  319. data/spec/mongoid/fields/localized_spec.rb +37 -12
  320. data/spec/mongoid/fields_spec.rb +364 -50
  321. data/spec/mongoid/findable_spec.rb +80 -15
  322. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  323. data/spec/mongoid/indexable_spec.rb +39 -20
  324. data/spec/mongoid/interceptable_spec.rb +807 -27
  325. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  326. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  327. data/spec/mongoid/mongoizable_spec.rb +285 -0
  328. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  329. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  330. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  331. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  332. data/spec/mongoid/persistence_context_spec.rb +50 -1
  333. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  334. data/spec/mongoid/query_cache_spec.rb +0 -154
  335. data/spec/mongoid/reloadable_spec.rb +59 -2
  336. data/spec/mongoid/scopable_spec.rb +54 -16
  337. data/spec/mongoid/shardable_models.rb +14 -0
  338. data/spec/mongoid/shardable_spec.rb +157 -51
  339. data/spec/mongoid/stateful_spec.rb +28 -0
  340. data/spec/mongoid/timestamps_spec.rb +390 -0
  341. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  342. data/spec/mongoid/touchable_spec.rb +116 -0
  343. data/spec/mongoid/touchable_spec_models.rb +12 -8
  344. data/spec/mongoid/traversable_spec.rb +4 -11
  345. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  346. data/spec/mongoid/validatable/uniqueness_spec.rb +59 -31
  347. data/spec/mongoid/warnings_spec.rb +35 -0
  348. data/spec/mongoid_spec.rb +1 -1
  349. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  350. data/spec/rails/mongoid_spec.rb +4 -16
  351. data/spec/shared/lib/mrss/docker_runner.rb +7 -0
  352. data/spec/shared/lib/mrss/lite_constraints.rb +10 -2
  353. data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
  354. data/spec/shared/lib/mrss/utils.rb +28 -6
  355. data/spec/shared/share/Dockerfile.erb +36 -40
  356. data/spec/shared/shlib/server.sh +32 -8
  357. data/spec/shared/shlib/set_env.sh +4 -4
  358. data/spec/support/constraints.rb +24 -0
  359. data/spec/support/macros.rb +46 -0
  360. data/spec/support/models/augmentation.rb +12 -0
  361. data/spec/support/models/band.rb +3 -0
  362. data/spec/support/models/catalog.rb +24 -0
  363. data/spec/support/models/circus.rb +3 -0
  364. data/spec/support/models/code.rb +2 -0
  365. data/spec/support/models/fanatic.rb +8 -0
  366. data/spec/support/models/implant.rb +9 -0
  367. data/spec/support/models/label.rb +2 -0
  368. data/spec/support/models/passport.rb +9 -0
  369. data/spec/support/models/person.rb +2 -0
  370. data/spec/support/models/player.rb +2 -0
  371. data/spec/support/models/powerup.rb +12 -0
  372. data/spec/support/models/purse.rb +9 -0
  373. data/spec/support/models/registry.rb +1 -0
  374. data/spec/support/models/school.rb +14 -0
  375. data/spec/support/models/shield.rb +18 -0
  376. data/spec/support/models/student.rb +14 -0
  377. data/spec/support/models/weapon.rb +12 -0
  378. data.tar.gz.sig +4 -1
  379. metadata +682 -635
  380. metadata.gz.sig +0 -0
  381. data/lib/mongoid/errors/eager_load.rb +0 -23
  382. data/lib/mongoid/errors/invalid_value.rb +0 -17
  383. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -59,16 +59,54 @@ describe Mongoid::Contextual::None do
59
59
  end
60
60
  end
61
61
 
62
+ describe "#pick" do
63
+ it "returns an empty array" do
64
+ expect(context.pick(:id)).to eq(nil)
65
+ end
66
+ end
67
+
68
+ describe "#tally" do
69
+ it "returns an empty hash" do
70
+ expect(context.tally(:id)).to eq({})
71
+ end
72
+ end
73
+
62
74
  describe "#first" do
63
75
  it "returns nil" do
64
76
  expect(context.first).to be_nil
65
77
  end
78
+
79
+ it "returns [] when passing a limit" do
80
+ expect(context.first(1)).to eq([])
81
+ end
66
82
  end
67
83
 
68
84
  describe "#last" do
69
85
  it "returns nil" do
70
86
  expect(context.last).to be_nil
71
87
  end
88
+
89
+ it "returns [] when passing a limit" do
90
+ expect(context.last(1)).to eq([])
91
+ end
92
+ end
93
+
94
+ describe "#take" do
95
+ it "returns nil" do
96
+ expect(context.take).to be_nil
97
+ end
98
+
99
+ it "returns nil with params" do
100
+ expect(context.take(1)).to eq([])
101
+ end
102
+ end
103
+
104
+ describe "#take!" do
105
+ it "raises an error" do
106
+ expect do
107
+ context.take!
108
+ end.to raise_error(Mongoid::Errors::DocumentNotFound, /Could not find a document of class Band./)
109
+ end
72
110
  end
73
111
 
74
112
  describe "#length" do
@@ -90,7 +90,7 @@ describe Mongoid::Copyable do
90
90
  end
91
91
 
92
92
  it 'calls constructor with explicitly declared attributes only' do
93
- expect(cls).to receive(:new).with('name' => 'test').and_call_original
93
+ expect(Mongoid::Factory).to receive(:build).with(cls, { 'name' => 'test' }).and_call_original
94
94
  cloned
95
95
  end
96
96
  end
@@ -696,5 +696,455 @@ describe Mongoid::Copyable do
696
696
  end
697
697
  end
698
698
  end
699
+
700
+ context "when fields are removed before cloning" do
701
+
702
+ context "when using embeds_one associations" do
703
+
704
+ before do
705
+ class CloneParent
706
+ include Mongoid::Document
707
+
708
+ embeds_one :clone_child
709
+
710
+ field :a, type: :string
711
+ field :b, type: :string
712
+ end
713
+
714
+ class CloneChild
715
+ include Mongoid::Document
716
+
717
+ embedded_in :clone_parent
718
+ embeds_one :clone_grandchild
719
+
720
+ field :c, type: :string
721
+ field :d, type: :string
722
+ end
723
+
724
+ class CloneGrandchild
725
+ include Mongoid::Document
726
+
727
+ embedded_in :clone_child
728
+
729
+ field :e, type: :string
730
+ field :f, type: :string
731
+ end
732
+
733
+ end
734
+
735
+ after do
736
+ Object.send(:remove_const, :CloneParent)
737
+ Object.send(:remove_const, :CloneChild)
738
+ Object.send(:remove_const, :CloneGrandchild)
739
+ end
740
+
741
+ context "when removing from the parent" do
742
+
743
+ before do
744
+ CloneParent.create(a: "1", b: "2")
745
+
746
+ Object.send(:remove_const, :CloneParent)
747
+
748
+ class CloneParent
749
+ include Mongoid::Document
750
+ field :a, type: :string
751
+ end
752
+ end
753
+
754
+ let(:parent) { CloneParent.last }
755
+ let(:clone) { parent.send(method) }
756
+
757
+ it "doesn't have the removed field" do
758
+ expect do
759
+ parent.b
760
+ end.to raise_error(NoMethodError)
761
+ end
762
+
763
+ it "contains the missing field in the attributes" do
764
+ expect(parent.attributes).to include({ "b" => "2" })
765
+ end
766
+
767
+ it "clones correctly" do
768
+ expect(clone).to be_a(CloneParent)
769
+ expect(clone.a).to eq("1")
770
+ expect(clone.attributes).to include({ "b" => "2" })
771
+ end
772
+ end
773
+
774
+ context "when removing from the child" do
775
+
776
+ before do
777
+ parent = CloneParent.new(a: "1", b: "2")
778
+ parent.clone_child = CloneChild.new(c: "3", d: "4")
779
+ parent.save
780
+
781
+ Object.send(:remove_const, :CloneParent)
782
+ Object.send(:remove_const, :CloneChild)
783
+
784
+ class CloneParent
785
+ include Mongoid::Document
786
+ embeds_one :clone_child
787
+ field :a, type: :string
788
+ field :b, type: :string
789
+ end
790
+
791
+ class CloneChild
792
+ include Mongoid::Document
793
+ embedded_in :clone_parent
794
+ field :c, type: :string
795
+ end
796
+ end
797
+
798
+ let(:parent) { CloneParent.last }
799
+ let(:clone) { parent.send(method) }
800
+
801
+ it "doesn't have the removed field" do
802
+ expect do
803
+ parent.clone_child.d
804
+ end.to raise_error(NoMethodError)
805
+ end
806
+
807
+ it "contains the missing field in the attributes" do
808
+ expect(parent.clone_child.attributes).to include({ "d" => "4" })
809
+ end
810
+
811
+ it "clones the parent correctly" do
812
+ expect(clone).to be_a(CloneParent)
813
+ expect(clone.a).to eq("1")
814
+ expect(clone.b).to eq("2")
815
+ end
816
+
817
+ it "clones the child correctly" do
818
+ expect(clone.clone_child).to be_a(CloneChild)
819
+ expect(clone.clone_child.c).to eq("3")
820
+ expect(clone.clone_child.attributes).to include({ "d" => "4" })
821
+ end
822
+ end
823
+
824
+ context "when removing from the grandchild" do
825
+
826
+ before do
827
+ parent = CloneParent.new(a: "1", b: "2")
828
+ parent.clone_child = CloneChild.new(c: "3", d: "4")
829
+ parent.clone_child.clone_grandchild = CloneGrandchild.new(e: "5", f: "6")
830
+ parent.save
831
+
832
+ Object.send(:remove_const, :CloneParent)
833
+ Object.send(:remove_const, :CloneChild)
834
+ Object.send(:remove_const, :CloneGrandchild)
835
+
836
+ class CloneParent
837
+ include Mongoid::Document
838
+ embeds_one :clone_child
839
+ field :a, type: :string
840
+ field :b, type: :string
841
+ end
842
+
843
+ class CloneChild
844
+ include Mongoid::Document
845
+ embedded_in :clone_parent
846
+ embeds_one :clone_grandchild
847
+ field :c, type: :string
848
+ field :d, type: :string
849
+ end
850
+
851
+ class CloneGrandchild
852
+ include Mongoid::Document
853
+ embedded_in :clone_child
854
+ field :e, type: :string
855
+ end
856
+ end
857
+
858
+ let(:parent) { CloneParent.last }
859
+ let(:clone) { parent.send(method) }
860
+
861
+ it "doesn't have the removed field" do
862
+ expect do
863
+ parent.clone_child.clone_grandchild.f
864
+ end.to raise_error(NoMethodError)
865
+ end
866
+
867
+ it "contains the missing field in the attributes" do
868
+ expect(parent.clone_child.clone_grandchild.attributes).to include({ "f" => "6" })
869
+ end
870
+
871
+ it "clones the parent correctly" do
872
+ expect(clone).to be_a(CloneParent)
873
+ expect(clone.a).to eq("1")
874
+ expect(clone.b).to eq("2")
875
+ end
876
+
877
+ it "clones the child correctly" do
878
+ expect(clone.clone_child).to be_a(CloneChild)
879
+ expect(clone.clone_child.c).to eq("3")
880
+ expect(clone.clone_child.d).to eq("4")
881
+ end
882
+
883
+ it "clones the child correctly" do
884
+ expect(clone.clone_child.clone_grandchild).to be_a(CloneGrandchild)
885
+ expect(clone.clone_child.clone_grandchild.e).to eq("5")
886
+ expect(clone.clone_child.clone_grandchild.attributes).to include({ "f" => "6" })
887
+ end
888
+ end
889
+ end
890
+
891
+ context "when using embeds_many associations" do
892
+
893
+ before do
894
+ class CloneParent
895
+ include Mongoid::Document
896
+
897
+ embeds_many :clone_children
898
+
899
+ field :a, type: :string
900
+ field :b, type: :string
901
+ end
902
+
903
+ class CloneChild
904
+ include Mongoid::Document
905
+
906
+ embedded_in :clone_parent
907
+ embeds_many :clone_grandchildren
908
+
909
+ field :c, type: :string
910
+ field :d, type: :string
911
+ end
912
+
913
+ class CloneGrandchild
914
+ include Mongoid::Document
915
+
916
+ embedded_in :clone_child
917
+
918
+ field :e, type: :string
919
+ field :f, type: :string
920
+ end
921
+
922
+ end
923
+
924
+ after do
925
+ Object.send(:remove_const, :CloneParent)
926
+ Object.send(:remove_const, :CloneChild)
927
+ Object.send(:remove_const, :CloneGrandchild)
928
+ end
929
+
930
+ context "when removing from the parent" do
931
+
932
+ before do
933
+ CloneParent.create(a: "1", b: "2")
934
+
935
+ Object.send(:remove_const, :CloneParent)
936
+
937
+ class CloneParent
938
+ include Mongoid::Document
939
+ field :a, type: :string
940
+ end
941
+ end
942
+
943
+ let(:parent) { CloneParent.last }
944
+ let(:clone) { parent.send(method) }
945
+
946
+ it "doesn't have the removed field" do
947
+ expect do
948
+ parent.b
949
+ end.to raise_error(NoMethodError)
950
+ end
951
+
952
+ it "contains the missing field in the attributes" do
953
+ expect(parent.attributes).to include({ "b" => "2" })
954
+ end
955
+
956
+ it "clones correctly" do
957
+ expect(clone).to be_a(CloneParent)
958
+ expect(clone.a).to eq("1")
959
+ expect(clone.attributes).to include({ "b" => "2" })
960
+ end
961
+ end
962
+
963
+ context "when removing from the child" do
964
+
965
+ before do
966
+ parent = CloneParent.new(a: "1", b: "2")
967
+ parent.clone_children = [ CloneChild.new(c: "3", d: "4"), CloneChild.new(c: "3", d: "4") ]
968
+ parent.save
969
+
970
+ Object.send(:remove_const, :CloneParent)
971
+ Object.send(:remove_const, :CloneChild)
972
+
973
+ class CloneParent
974
+ include Mongoid::Document
975
+ embeds_many :clone_children
976
+ field :a, type: :string
977
+ field :b, type: :string
978
+ end
979
+
980
+ class CloneChild
981
+ include Mongoid::Document
982
+ embedded_in :clone_parent
983
+ field :c, type: :string
984
+ end
985
+ end
986
+
987
+ let(:parent) { CloneParent.last }
988
+ let(:clone) { parent.send(method) }
989
+
990
+ it "doesn't have the removed field" do
991
+ parent.clone_children.each do |clone_child|
992
+ expect do
993
+ clone_child.d
994
+ end.to raise_error(NoMethodError)
995
+ end
996
+ end
997
+
998
+ it "contains the missing field in the attributes" do
999
+ expect(parent.clone_children[0].attributes).to include({ "d" => "4" })
1000
+ expect(parent.clone_children[1].attributes).to include({ "d" => "4" })
1001
+ end
1002
+
1003
+ it "clones the parent correctly" do
1004
+ expect(clone).to be_a(CloneParent)
1005
+ expect(clone.a).to eq("1")
1006
+ expect(clone.b).to eq("2")
1007
+ end
1008
+
1009
+ it "clones the child correctly" do
1010
+ expect(clone.clone_children.length).to eq(2)
1011
+ clone.clone_children.each do |clone_child|
1012
+ expect(clone_child).to be_a(CloneChild)
1013
+ expect(clone_child.c).to eq("3")
1014
+ expect(clone_child.attributes).to include({ "d" => "4" })
1015
+ end
1016
+ end
1017
+ end
1018
+
1019
+ context "when removing from the grandchild" do
1020
+
1021
+ before do
1022
+ parent = CloneParent.new(a: "1", b: "2")
1023
+ parent.clone_children = [ CloneChild.new(c: "3", d: "4"), CloneChild.new(c: "3", d: "4") ]
1024
+ parent.clone_children.each do |cc|
1025
+ cc.clone_grandchildren = [ CloneGrandchild.new(e: "5", f: "6"), CloneGrandchild.new(e: "5", f: "6") ]
1026
+ end
1027
+ parent.save
1028
+
1029
+ Object.send(:remove_const, :CloneParent)
1030
+ Object.send(:remove_const, :CloneChild)
1031
+ Object.send(:remove_const, :CloneGrandchild)
1032
+
1033
+ class CloneParent
1034
+ include Mongoid::Document
1035
+ embeds_many :clone_children
1036
+ field :a, type: :string
1037
+ field :b, type: :string
1038
+ end
1039
+
1040
+ class CloneChild
1041
+ include Mongoid::Document
1042
+ embedded_in :clone_parent
1043
+ embeds_many :clone_grandchildren
1044
+ field :c, type: :string
1045
+ field :d, type: :string
1046
+ end
1047
+
1048
+ class CloneGrandchild
1049
+ include Mongoid::Document
1050
+ embedded_in :clone_child
1051
+ field :e, type: :string
1052
+ end
1053
+ end
1054
+
1055
+ let(:parent) { CloneParent.last }
1056
+ let(:clone) { parent.send(method) }
1057
+
1058
+ it "doesn't have the removed field" do
1059
+ parent.clone_children.each do |cc|
1060
+ cc.clone_grandchildren.each do |cg|
1061
+ expect do
1062
+ cg.f
1063
+ end.to raise_error(NoMethodError)
1064
+ end
1065
+ end
1066
+ end
1067
+
1068
+ it "contains the missing field in the attributes" do
1069
+ parent.clone_children.each do |cc|
1070
+ cc.clone_grandchildren.each do |cg|
1071
+ expect(cg.attributes).to include({ "f" => "6" })
1072
+ end
1073
+ end
1074
+ end
1075
+
1076
+ it "clones the parent correctly" do
1077
+ expect(clone).to be_a(CloneParent)
1078
+ expect(clone.a).to eq("1")
1079
+ expect(clone.b).to eq("2")
1080
+ end
1081
+
1082
+ it "clones the child correctly" do
1083
+ expect(clone.clone_children.length).to eq(2)
1084
+ clone.clone_children.each do |clone_child|
1085
+ expect(clone_child).to be_a(CloneChild)
1086
+ expect(clone_child.c).to eq("3")
1087
+ expect(clone_child.attributes).to include({ "d" => "4" })
1088
+ end
1089
+ end
1090
+
1091
+ it "clones the grandchild correctly" do
1092
+ parent.clone_children.each do |cc|
1093
+ expect(cc.clone_grandchildren.length).to eq(2)
1094
+ cc.clone_grandchildren.each do |cg|
1095
+ expect(cg).to be_a(CloneGrandchild)
1096
+ expect(cg.e).to eq("5")
1097
+ expect(cg.attributes).to include({ "f" => "6" })
1098
+ end
1099
+ end
1100
+ end
1101
+ end
1102
+ end
1103
+
1104
+ context "when using embedded_in associations" do
1105
+
1106
+ before do
1107
+ class CloneParent
1108
+ include Mongoid::Document
1109
+
1110
+ embeds_one :clone_child
1111
+
1112
+ field :a, type: :string
1113
+ field :b, type: :string
1114
+ end
1115
+
1116
+ class CloneChild
1117
+ include Mongoid::Document
1118
+
1119
+ embedded_in :clone_parent
1120
+
1121
+ field :c, type: :string
1122
+ field :d, type: :string
1123
+ end
1124
+ end
1125
+
1126
+ after do
1127
+ Object.send(:remove_const, :CloneParent)
1128
+ Object.send(:remove_const, :CloneChild)
1129
+ end
1130
+
1131
+
1132
+ context "when accessing the parent" do
1133
+
1134
+ before do
1135
+ parent = CloneParent.new(a: "1", b: "2")
1136
+ parent.clone_child = CloneChild.new(c: "3", d: "4")
1137
+ parent.save
1138
+ end
1139
+
1140
+ let(:parent) { CloneParent.last }
1141
+ let(:clone) { parent.clone_child.send(method) }
1142
+
1143
+ it "doesn't clone the parent" do
1144
+ expect(clone.clone_parent).to be_nil
1145
+ end
1146
+ end
1147
+ end
1148
+ end
699
1149
  end
700
1150
  end