mongoid 6.4.2 → 7.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (318) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/config/locales/en.yml +17 -0
  4. data/lib/mongoid/association/accessors.rb +339 -0
  5. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  6. data/lib/mongoid/association/builders.rb +92 -0
  7. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  8. data/lib/mongoid/association/depending.rb +137 -0
  9. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
  10. data/lib/mongoid/{relations → association}/embedded/batchable.rb +19 -19
  11. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  12. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  13. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  14. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  15. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  16. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
  17. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  18. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +552 -0
  19. data/lib/mongoid/association/embedded/embeds_many.rb +210 -0
  20. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
  21. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
  22. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  23. data/lib/mongoid/association/embedded/embeds_one.rb +173 -0
  24. data/lib/mongoid/association/embedded.rb +4 -0
  25. data/lib/mongoid/association/macros.rb +204 -0
  26. data/lib/mongoid/{relations → association}/many.rb +19 -49
  27. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  28. data/lib/mongoid/association/nested/many.rb +200 -0
  29. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  30. data/lib/mongoid/association/nested/one.rb +127 -0
  31. data/lib/mongoid/association/nested.rb +15 -0
  32. data/lib/mongoid/{relations → association}/one.rb +6 -6
  33. data/lib/mongoid/association/options.rb +152 -0
  34. data/lib/mongoid/{relations → association}/proxy.rb +31 -58
  35. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  36. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  37. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  38. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  39. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  40. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  41. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  42. data/lib/mongoid/association/referenced/eager.rb +162 -0
  43. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  44. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  45. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +312 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  48. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
  49. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  50. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  51. data/lib/mongoid/association/referenced/has_many/enumerable.rb +510 -0
  52. data/lib/mongoid/association/referenced/has_many/proxy.rb +578 -0
  53. data/lib/mongoid/association/referenced/has_many.rb +275 -0
  54. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  55. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  56. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  57. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  58. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  59. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  60. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  61. data/lib/mongoid/association/referenced.rb +7 -0
  62. data/lib/mongoid/{relations → association}/reflections.rb +21 -17
  63. data/lib/mongoid/association/relatable.rb +509 -0
  64. data/lib/mongoid/{relations.rb → association.rb} +57 -56
  65. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  66. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  67. data/lib/mongoid/atomic.rb +4 -4
  68. data/lib/mongoid/attributes/dynamic.rb +2 -2
  69. data/lib/mongoid/attributes/nested.rb +22 -11
  70. data/lib/mongoid/attributes/processing.rb +2 -2
  71. data/lib/mongoid/attributes/readonly.rb +2 -4
  72. data/lib/mongoid/attributes.rb +22 -13
  73. data/lib/mongoid/changeable.rb +1 -1
  74. data/lib/mongoid/clients/options.rb +7 -5
  75. data/lib/mongoid/composable.rb +4 -4
  76. data/lib/mongoid/config.rb +1 -0
  77. data/lib/mongoid/contextual/atomic.rb +1 -1
  78. data/lib/mongoid/contextual/geo_near.rb +1 -1
  79. data/lib/mongoid/contextual/memory.rb +21 -3
  80. data/lib/mongoid/contextual/mongo.rb +10 -8
  81. data/lib/mongoid/copyable.rb +7 -6
  82. data/lib/mongoid/criteria/includable.rb +14 -14
  83. data/lib/mongoid/criteria/modifiable.rb +8 -14
  84. data/lib/mongoid/criteria/options.rb +2 -2
  85. data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
  86. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  87. data/lib/mongoid/criteria/queryable/selectable.rb +37 -7
  88. data/lib/mongoid/criteria.rb +2 -2
  89. data/lib/mongoid/document.rb +15 -6
  90. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  91. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  92. data/lib/mongoid/errors/unknown_model.rb +25 -0
  93. data/lib/mongoid/errors.rb +3 -0
  94. data/lib/mongoid/extensions/array.rb +5 -5
  95. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  96. data/lib/mongoid/extensions/hash.rb +5 -2
  97. data/lib/mongoid/extensions/object.rb +4 -4
  98. data/lib/mongoid/extensions/range.rb +1 -0
  99. data/lib/mongoid/extensions/regexp.rb +1 -0
  100. data/lib/mongoid/extensions.rb +0 -4
  101. data/lib/mongoid/factory.rb +13 -3
  102. data/lib/mongoid/fields/foreign_key.rb +5 -5
  103. data/lib/mongoid/fields/standard.rb +2 -14
  104. data/lib/mongoid/fields/validators/macro.rb +1 -1
  105. data/lib/mongoid/fields.rb +3 -3
  106. data/lib/mongoid/indexable.rb +4 -1
  107. data/lib/mongoid/interceptable.rb +5 -5
  108. data/lib/mongoid/matchable/and.rb +1 -1
  109. data/lib/mongoid/matchable/elem_match.rb +9 -3
  110. data/lib/mongoid/matchable/eq.rb +22 -0
  111. data/lib/mongoid/matchable/ne.rb +1 -1
  112. data/lib/mongoid/matchable.rb +3 -1
  113. data/lib/mongoid/persistable/deletable.rb +7 -6
  114. data/lib/mongoid/persistable/incrementable.rb +1 -1
  115. data/lib/mongoid/persistable/logical.rb +1 -1
  116. data/lib/mongoid/persistable/settable.rb +57 -12
  117. data/lib/mongoid/persistable.rb +4 -5
  118. data/lib/mongoid/persistence_context.rb +20 -5
  119. data/lib/mongoid/query_cache.rb +8 -4
  120. data/lib/mongoid/railtie.rb +17 -0
  121. data/lib/mongoid/railties/controller_runtime.rb +86 -0
  122. data/lib/mongoid/scopable.rb +3 -3
  123. data/lib/mongoid/serializable.rb +4 -4
  124. data/lib/mongoid/shardable.rb +1 -1
  125. data/lib/mongoid/threaded.rb +36 -0
  126. data/lib/mongoid/touchable.rb +102 -0
  127. data/lib/mongoid/traversable.rb +3 -3
  128. data/lib/mongoid/validatable/presence.rb +2 -2
  129. data/lib/mongoid/validatable/uniqueness.rb +4 -4
  130. data/lib/mongoid/validatable.rb +8 -8
  131. data/lib/mongoid/version.rb +1 -1
  132. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -0
  133. data/spec/app/models/animal.rb +2 -1
  134. data/spec/app/models/bomb.rb +1 -1
  135. data/spec/app/models/message.rb +1 -1
  136. data/spec/app/models/minim.rb +7 -0
  137. data/spec/app/models/person.rb +5 -2
  138. data/spec/app/models/shipment_address.rb +1 -0
  139. data/spec/app/models/store_as_dup_test3.rb +7 -0
  140. data/spec/app/models/store_as_dup_test4.rb +7 -0
  141. data/spec/app/models/updatable.rb +7 -0
  142. data/spec/app/models/vertex.rb +6 -0
  143. data/spec/app/models/wiki_page.rb +1 -1
  144. data/spec/config/mongoid.yml +13 -3
  145. data/spec/integration/associations/belongs_to_spec.rb +13 -0
  146. data/spec/lite_spec_helper.rb +56 -0
  147. data/spec/mongoid/{relations → association}/accessors_spec.rb +40 -1
  148. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  149. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  150. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  151. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  152. data/spec/mongoid/association/depending_spec.rb +866 -0
  153. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  154. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  155. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  156. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  157. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +5 -77
  158. data/spec/mongoid/association/embedded/embedded_in_spec.rb +843 -0
  159. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  160. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  161. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +124 -182
  162. data/spec/mongoid/association/embedded/embeds_many_spec.rb +852 -0
  163. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  164. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  165. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  166. data/spec/mongoid/association/embedded/embeds_one_spec.rb +908 -0
  167. data/spec/mongoid/{relations → association}/macros_spec.rb +148 -73
  168. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  169. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  170. data/spec/mongoid/association/options_spec.rb +1321 -0
  171. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +66 -34
  172. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  173. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  174. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +33 -14
  175. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  176. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2006 -0
  177. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
  178. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  179. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +26 -7
  180. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +56 -0
  181. data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +107 -98
  182. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +26 -0
  183. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
  184. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  185. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  186. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +26 -11
  187. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +122 -1
  188. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  189. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +28 -93
  190. data/spec/mongoid/association/referenced/has_many_models.rb +37 -0
  191. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  192. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  193. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  194. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  195. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  196. data/spec/mongoid/association/referenced/has_one_models.rb +48 -0
  197. data/spec/mongoid/association/referenced/has_one_spec.rb +1350 -0
  198. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  199. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
  200. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  201. data/spec/mongoid/atomic/modifiers_spec.rb +2 -2
  202. data/spec/mongoid/atomic_spec.rb +4 -4
  203. data/spec/mongoid/attributes/nested_spec.rb +29 -11
  204. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  205. data/spec/mongoid/attributes_spec.rb +38 -2
  206. data/spec/mongoid/clients/factory_spec.rb +24 -18
  207. data/spec/mongoid/clients/options_spec.rb +58 -44
  208. data/spec/mongoid/clients/sessions_spec.rb +1 -1
  209. data/spec/mongoid/clients/transactions_spec.rb +369 -0
  210. data/spec/mongoid/clients_spec.rb +68 -8
  211. data/spec/mongoid/config_spec.rb +27 -1
  212. data/spec/mongoid/contextual/memory_spec.rb +19 -0
  213. data/spec/mongoid/contextual/mongo_spec.rb +33 -5
  214. data/spec/mongoid/copyable_spec.rb +90 -6
  215. data/spec/mongoid/copyable_spec_models.rb +17 -0
  216. data/spec/mongoid/criteria/modifiable_spec.rb +183 -60
  217. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
  218. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +43 -0
  219. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  220. data/spec/mongoid/criteria/queryable/selectable_spec.rb +42 -3
  221. data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
  222. data/spec/mongoid/criteria/scopable_spec.rb +81 -0
  223. data/spec/mongoid/criteria_spec.rb +33 -18
  224. data/spec/mongoid/document_spec.rb +83 -4
  225. data/spec/mongoid/extensions/array_spec.rb +11 -15
  226. data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
  227. data/spec/mongoid/extensions/hash_spec.rb +18 -1
  228. data/spec/mongoid/extensions/object_spec.rb +7 -11
  229. data/spec/mongoid/extensions/range_spec.rb +7 -0
  230. data/spec/mongoid/extensions/regexp_spec.rb +23 -0
  231. data/spec/mongoid/factory_spec.rb +19 -1
  232. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  233. data/spec/mongoid/fields_spec.rb +2 -2
  234. data/spec/mongoid/findable_spec.rb +1 -1
  235. data/spec/mongoid/indexable_spec.rb +18 -8
  236. data/spec/mongoid/interceptable_spec.rb +22 -1
  237. data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
  238. data/spec/mongoid/matchable/eq_spec.rb +48 -0
  239. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  240. data/spec/mongoid/persistable/savable_spec.rb +2 -2
  241. data/spec/mongoid/persistable/settable_spec.rb +95 -10
  242. data/spec/mongoid/persistable_spec.rb +21 -6
  243. data/spec/mongoid/persistence_context_spec.rb +1 -1
  244. data/spec/mongoid/query_cache_spec.rb +61 -22
  245. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  246. data/spec/mongoid/scopable_spec.rb +13 -0
  247. data/spec/mongoid/shardable_spec.rb +32 -12
  248. data/spec/mongoid/threaded_spec.rb +68 -0
  249. data/spec/mongoid/{relations/touchable_spec.rb → touchable_spec.rb} +40 -1
  250. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  251. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  252. data/spec/mongoid/validatable_spec.rb +1 -1
  253. data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
  254. data/spec/spec_helper.rb +51 -25
  255. data/spec/support/constraints.rb +101 -0
  256. data/spec/support/macros.rb +20 -0
  257. data/spec/support/spec_config.rb +39 -0
  258. metadata +602 -582
  259. checksums.yaml.gz.sig +0 -2
  260. data/lib/mongoid/relations/accessors.rb +0 -267
  261. data/lib/mongoid/relations/auto_save.rb +0 -94
  262. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  263. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  264. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  265. data/lib/mongoid/relations/bindings.rb +0 -9
  266. data/lib/mongoid/relations/builder.rb +0 -57
  267. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  268. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  269. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  270. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  271. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  272. data/lib/mongoid/relations/builders.rb +0 -106
  273. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  274. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  275. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  276. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  277. data/lib/mongoid/relations/cascading.rb +0 -56
  278. data/lib/mongoid/relations/conversions.rb +0 -34
  279. data/lib/mongoid/relations/counter_cache.rb +0 -160
  280. data/lib/mongoid/relations/cyclic.rb +0 -107
  281. data/lib/mongoid/relations/eager/base.rb +0 -153
  282. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  283. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  284. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  285. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  286. data/lib/mongoid/relations/embedded/in.rb +0 -241
  287. data/lib/mongoid/relations/embedded/many.rb +0 -683
  288. data/lib/mongoid/relations/embedded/one.rb +0 -235
  289. data/lib/mongoid/relations/macros.rb +0 -367
  290. data/lib/mongoid/relations/metadata.rb +0 -1179
  291. data/lib/mongoid/relations/nested_builder.rb +0 -74
  292. data/lib/mongoid/relations/options.rb +0 -49
  293. data/lib/mongoid/relations/polymorphic.rb +0 -39
  294. data/lib/mongoid/relations/referenced/in.rb +0 -304
  295. data/lib/mongoid/relations/referenced/many.rb +0 -812
  296. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  297. data/lib/mongoid/relations/referenced/one.rb +0 -290
  298. data/lib/mongoid/relations/synchronization.rb +0 -169
  299. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  300. data/lib/mongoid/relations/targets.rb +0 -2
  301. data/lib/mongoid/relations/touchable.rb +0 -97
  302. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  303. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  304. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  305. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  306. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  307. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  308. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  309. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  310. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  311. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  312. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  313. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  314. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  315. data/spec/mongoid/relations/options_spec.rb +0 -35
  316. data.tar.gz.sig +0 -0
  317. metadata.gz.sig +0 -0
  318. /data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Mongoid::Relations::Bindings::Referenced::Many do
3
+ describe Mongoid::Association::Referenced::HasMany::Binding do
4
4
 
5
5
  let(:person) do
6
6
  Person.new
@@ -11,17 +11,17 @@ describe Mongoid::Relations::Bindings::Referenced::Many do
11
11
  end
12
12
 
13
13
  let(:target) do
14
- Mongoid::Relations::Targets::Enumerable.new([ post ])
14
+ Mongoid::Association::Referenced::HasMany::Targets::Enumerable.new([ post ])
15
15
  end
16
16
 
17
- let(:metadata) do
17
+ let(:association) do
18
18
  Person.relations["posts"]
19
19
  end
20
20
 
21
21
  describe "#bind_one" do
22
22
 
23
23
  let(:binding) do
24
- described_class.new(person, target, metadata)
24
+ described_class.new(person, target, association)
25
25
  end
26
26
 
27
27
  context "when the document is bindable" do
@@ -55,7 +55,7 @@ describe Mongoid::Relations::Bindings::Referenced::Many do
55
55
  describe "#unbind_one" do
56
56
 
57
57
  let(:binding) do
58
- described_class.new(person, target, metadata)
58
+ described_class.new(person, target, association)
59
59
  end
60
60
 
61
61
  context "when the documents are unbindable" do
@@ -0,0 +1,119 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Association::Referenced::HasMany::Buildable do
4
+
5
+ let(:base) do
6
+ double
7
+ end
8
+
9
+ describe "#build" do
10
+
11
+ let(:documents) do
12
+ association.build(base, object)
13
+ end
14
+
15
+ let(:options) do
16
+ {}
17
+ end
18
+
19
+ let(:association) do
20
+ Mongoid::Association::Referenced::HasMany.new(Person, :posts, options)
21
+ end
22
+
23
+ context "when provided an id" do
24
+
25
+ let(:object) do
26
+ BSON::ObjectId.new
27
+ end
28
+
29
+ let(:criteria) do
30
+ Post.where(association.foreign_key => object)
31
+ end
32
+
33
+ it "returns the criteria" do
34
+ expect(documents).to eq(criteria)
35
+ end
36
+ end
37
+
38
+ context "when order is specified" do
39
+
40
+ let(:options) do
41
+ {
42
+ order: :rating.asc,
43
+ }
44
+ end
45
+
46
+ let(:object) do
47
+ BSON::ObjectId.new
48
+ end
49
+
50
+ let(:criteria) do
51
+ Post.where(association.foreign_key => object).order_by(options[:order])
52
+ end
53
+
54
+ it "adds the ordering to the criteria" do
55
+ expect(documents).to eq(criteria)
56
+ end
57
+ end
58
+
59
+ context "when the relation is polymorphic" do
60
+
61
+ let(:options) do
62
+ {
63
+ as: :ratable
64
+ }
65
+ end
66
+
67
+ let(:object) do
68
+ BSON::ObjectId.new
69
+ end
70
+
71
+ let(:base) do
72
+ Rating.new
73
+ end
74
+
75
+ let(:criteria) do
76
+ Post.where(association.foreign_key => object, 'ratable_type' => 'Rating')
77
+ end
78
+
79
+ it "adds the type to the criteria" do
80
+ expect(documents).to eq(criteria)
81
+ end
82
+ end
83
+
84
+ context "when provided a object" do
85
+
86
+ let(:object) do
87
+ [ Person.new ]
88
+ end
89
+
90
+ it "returns the object" do
91
+ expect(documents).to eq(object)
92
+ end
93
+ end
94
+
95
+ context "when no documents found in the database" do
96
+
97
+ context "when the ids are empty" do
98
+
99
+ let(:object) do
100
+ [ nil ]
101
+ end
102
+
103
+ it "returns an empty array" do
104
+ expect(documents).to be_empty
105
+ end
106
+
107
+ context "during initialization" do
108
+
109
+ it "returns an empty array" do
110
+ Person.new do |p|
111
+ expect(p.posts).to be_empty
112
+ expect(p.posts._association).to_not be_nil
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Mongoid::Relations::Eager::HasMany do
3
+ describe Mongoid::Association::Referenced::HasMany::Eager do
4
4
 
5
5
  describe ".grouped_docs" do
6
6
 
@@ -12,13 +12,13 @@ describe Mongoid::Relations::Eager::HasMany do
12
12
  Person.create!
13
13
  end
14
14
 
15
- let(:metadata) do
15
+ let(:association) do
16
16
  Person.reflect_on_association(:posts)
17
17
  end
18
18
 
19
19
  let(:eager) do
20
- described_class.new([metadata], docs).tap do |b|
21
- b.shift_metadata
20
+ described_class.new([association], docs).tap do |b|
21
+ b.send(:shift_association)
22
22
  end
23
23
  end
24
24
 
@@ -27,7 +27,7 @@ describe Mongoid::Relations::Eager::HasMany do
27
27
  end
28
28
 
29
29
  it "aggregates by the parent primary key" do
30
- expect(eager.grouped_docs.keys).to eq([person.id])
30
+ expect(eager.send(:grouped_docs).keys).to eq([person.id])
31
31
  end
32
32
  end
33
33
 
@@ -41,13 +41,13 @@ describe Mongoid::Relations::Eager::HasMany do
41
41
  Person.create!
42
42
  end
43
43
 
44
- let(:metadata) do
44
+ let(:association) do
45
45
  Person.reflect_on_association(:posts)
46
46
  end
47
47
 
48
48
  let(:eager) do
49
- described_class.new([metadata], docs).tap do |b|
50
- b.shift_metadata
49
+ described_class.new([association], docs).tap do |b|
50
+ b.send(:shift_association)
51
51
  end
52
52
  end
53
53
 
@@ -58,14 +58,14 @@ describe Mongoid::Relations::Eager::HasMany do
58
58
 
59
59
  it "sets the relation into the parent" do
60
60
  docs.each do |doc|
61
- expect(doc).to receive(:__build__).once.with(:posts, :foo, metadata)
61
+ expect(doc).to receive(:__build__).once.with(:posts, :foo, association)
62
62
  end
63
- eager.set_on_parent(person.id, :foo)
63
+ eager.send(:set_on_parent, person.id, :foo)
64
64
  end
65
65
 
66
66
  it "doesnt call an extra query" do
67
67
  expect_query(0) do
68
- eager.set_on_parent(person.id, :foo)
68
+ eager.send(:set_on_parent, person.id, :foo)
69
69
  end
70
70
  end
71
71
  end
@@ -91,6 +91,15 @@ describe Mongoid::Relations::Eager::HasMany do
91
91
  end
92
92
  end
93
93
  end
94
+
95
+ it "does not query when accessing the base on each document" do
96
+ persons = Person.all.includes(:drugs).to_a
97
+ expect_query(0) do
98
+ persons.each do |person|
99
+ person.drugs.collect(&:person)
100
+ end
101
+ end
102
+ end
94
103
  end
95
104
 
96
105
  context "when the relation is not polymorphic" do
@@ -120,6 +129,12 @@ describe Mongoid::Relations::Eager::HasMany do
120
129
  eager.posts.first.title = "New title"
121
130
  end
122
131
  end
132
+
133
+ it "does not query when accessing the base on each document" do
134
+ expect_query(0) do
135
+ eager.posts.collect(&:person)
136
+ end
137
+ end
123
138
  end
124
139
 
125
140
  context "when the eager load has not returned documents" do
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Mongoid::Relations::Targets::Enumerable do
3
+ describe Mongoid::Association::Referenced::HasMany::Targets::Enumerable do
4
4
 
5
5
  describe "#==" do
6
6
 
@@ -189,6 +189,12 @@ describe Mongoid::Relations::Targets::Enumerable do
189
189
  it "returns the added documents" do
190
190
  expect(added).to eq([ post ])
191
191
  end
192
+
193
+ it "sets the base on the new document" do
194
+ expect_query(0) do
195
+ added.collect(&:person)
196
+ end
197
+ end
192
198
  end
193
199
  end
194
200
 
@@ -622,6 +628,22 @@ describe Mongoid::Relations::Targets::Enumerable do
622
628
  it "becomes loaded" do
623
629
  expect(enumerable).to be__loaded
624
630
  end
631
+
632
+ context 'when the base relation is accessed from each document' do
633
+
634
+ let(:persons) do
635
+ described_class.new(criteria).collect(&:person)
636
+ end
637
+
638
+ before do
639
+ Post.create(person_id: person.id)
640
+ Post.create(person_id: person.id)
641
+ end
642
+
643
+ it 'sets the base relation from the criteria' do
644
+ expect(persons.uniq.size).to eq(1)
645
+ end
646
+ end
625
647
  end
626
648
 
627
649
  context "when only an array target exists" do
@@ -1822,4 +1844,103 @@ describe Mongoid::Relations::Targets::Enumerable do
1822
1844
  expect(enumerable).to be__loaded
1823
1845
  end
1824
1846
  end
1847
+
1848
+ describe 'setting the same parent object on enumerated children objects' do
1849
+
1850
+ let(:person) do
1851
+ Person.create
1852
+ end
1853
+
1854
+ context 'when a single child is fetched' do
1855
+
1856
+ let!(:post) do
1857
+ person.posts << Post.new
1858
+ person.posts.first
1859
+ end
1860
+
1861
+ it 'does not query the database to access the parent' do
1862
+ expect_query(0) do
1863
+ expect(post.person).to eq(person)
1864
+ end
1865
+ end
1866
+ end
1867
+
1868
+ context 'when a single child is fetched with a scope' do
1869
+
1870
+ let!(:post) do
1871
+ person.posts << Post.new(title: 'open')
1872
+ person.posts.open.first
1873
+ end
1874
+
1875
+ it 'does not query the database to access the parent' do
1876
+ expect_query(0) do
1877
+ expect(post.person).to eq(person)
1878
+ end
1879
+ end
1880
+ end
1881
+
1882
+ context 'when multiple children are fetched' do
1883
+
1884
+ let!(:posts) do
1885
+ person.posts << Post.new
1886
+ person.posts << Post.new
1887
+ person.posts << Post.new
1888
+ person.posts.to_a
1889
+ end
1890
+
1891
+ it 'does not query the database to access the parent' do
1892
+ expect_query(0) do
1893
+ expect(posts.all? { |post| post.person == person }).to be(true)
1894
+ end
1895
+ end
1896
+ end
1897
+
1898
+ context 'when multiple children are fetched with query criteria' do
1899
+
1900
+ let!(:posts) do
1901
+ person.posts << Post.new(title: 'open')
1902
+ person.posts << Post.new(title: 'open')
1903
+ person.posts << Post.new(title: 'not-a-test')
1904
+ person.posts.where(title: 'open').to_a
1905
+ end
1906
+
1907
+ it 'does not query the database to access the parent' do
1908
+ expect_query(0) do
1909
+ expect(posts.all? { |post| post.person == person }).to be(true)
1910
+ end
1911
+ end
1912
+ end
1913
+
1914
+ context 'when multiple children are fetched with a scope' do
1915
+
1916
+ let!(:posts) do
1917
+ person.posts << Post.new(title: 'open')
1918
+ person.posts << Post.new(title: 'open')
1919
+ person.posts << Post.new(title: 'not-a-test')
1920
+ person.posts.open.to_a
1921
+ end
1922
+
1923
+ it 'does not query the database to access the parent' do
1924
+ expect_query(0) do
1925
+ expect(posts.all? { |post| post.person == person }).to be(true)
1926
+ end
1927
+ end
1928
+ end
1929
+
1930
+ context 'when the parent is updated in memory' do
1931
+
1932
+ let!(:posts) do
1933
+ person.posts << Post.new
1934
+ person.posts << Post.new
1935
+ person.username = 'emily'
1936
+ person.posts.to_a
1937
+ end
1938
+
1939
+ it 'does not query the database to access the parent' do
1940
+ expect_query(0) do
1941
+ expect(posts.all? { |post| post.person.username == 'emily' }).to be(true)
1942
+ end
1943
+ end
1944
+ end
1945
+ end
1825
1946
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require_relative '../has_many_models'
5
+
6
+ describe Mongoid::Association::Referenced::HasMany::Proxy do
7
+ context 'with primary_key and foreign_key given' do
8
+ let(:company) { HmmCompany.create!(p: 123) }
9
+ let(:criteria) { company.emails }
10
+
11
+ it 'generates correct query' do
12
+ expect(criteria.selector).to eq('f' => 123)
13
+ end
14
+
15
+ context 'unscoped' do
16
+ let(:criteria) { company.emails.unscoped }
17
+
18
+ it 'generates correct query' do
19
+ expect(criteria.selector).to eq('f' => 123)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Mongoid::Relations::Referenced::Many do
3
+ describe Mongoid::Association::Referenced::HasMany::Proxy do
4
4
 
5
5
  before :all do
6
6
  Mongoid.raise_not_found_error = true
@@ -401,7 +401,7 @@ describe Mongoid::Relations::Referenced::Many do
401
401
  end
402
402
 
403
403
  it "sets the target of the relation" do
404
- expect(person.posts.target).to eq([ post ])
404
+ expect(person.posts._target).to eq([ post ])
405
405
  end
406
406
 
407
407
  it "sets the foreign key on the relation" do
@@ -432,7 +432,7 @@ describe Mongoid::Relations::Referenced::Many do
432
432
  end
433
433
 
434
434
  it "sets the target of the relation" do
435
- expect(person.posts.target).to eq([ post ])
435
+ expect(person.posts._target).to eq([ post ])
436
436
  end
437
437
 
438
438
  it "sets the foreign key of the relation" do
@@ -593,7 +593,7 @@ describe Mongoid::Relations::Referenced::Many do
593
593
  end
594
594
 
595
595
  it "sets the target of the relation" do
596
- expect(movie.ratings.target).to eq([ rating ])
596
+ expect(movie.ratings._target).to eq([ rating ])
597
597
  end
598
598
 
599
599
  it "sets the foreign key on the relation" do
@@ -624,7 +624,7 @@ describe Mongoid::Relations::Referenced::Many do
624
624
  end
625
625
 
626
626
  it "sets the target of the relation" do
627
- expect(movie.ratings.target).to eq([ rating ])
627
+ expect(movie.ratings._target).to eq([ rating ])
628
628
  end
629
629
 
630
630
  it "sets the foreign key of the relation" do
@@ -1039,27 +1039,6 @@ describe Mongoid::Relations::Referenced::Many do
1039
1039
  end
1040
1040
  end
1041
1041
 
1042
- describe ".builder" do
1043
-
1044
- let(:builder_klass) do
1045
- Mongoid::Relations::Builders::Referenced::Many
1046
- end
1047
-
1048
- let(:document) do
1049
- double
1050
- end
1051
-
1052
- let(:metadata) do
1053
- double(extension?: false)
1054
- end
1055
-
1056
- it "returns the embedded in builder" do
1057
- expect(
1058
- described_class.builder(nil, metadata, document)
1059
- ).to be_a_kind_of(builder_klass)
1060
- end
1061
- end
1062
-
1063
1042
  describe "#clear" do
1064
1043
 
1065
1044
  context "when the relation is not polymorphic" do
@@ -1835,44 +1814,48 @@ describe Mongoid::Relations::Referenced::Many do
1835
1814
  end
1836
1815
  end
1837
1816
 
1838
- describe ".criteria" do
1817
+ describe "#criteria" do
1839
1818
 
1840
- let(:id) do
1841
- BSON::ObjectId.new
1819
+ let(:base) do
1820
+ Movie.new
1842
1821
  end
1843
1822
 
1844
1823
  context "when the relation is polymorphic" do
1845
1824
 
1846
- let(:metadata) do
1825
+ let(:association) do
1847
1826
  Movie.relations["ratings"]
1848
1827
  end
1849
1828
 
1850
1829
  let(:criteria) do
1851
- described_class.criteria(metadata, id, Movie)
1830
+ association.criteria(base)
1852
1831
  end
1853
1832
 
1854
1833
  it "includes the type in the criteria" do
1855
1834
  expect(criteria.selector).to eq(
1856
- {
1857
- "ratable_id" => id,
1858
- "ratable_type" => "Movie"
1859
- }
1860
- )
1835
+ {
1836
+ "ratable_id" => base.id,
1837
+ "ratable_type" => "Movie"
1838
+ }
1839
+ )
1861
1840
  end
1862
1841
  end
1863
1842
 
1864
1843
  context "when the relation is not polymorphic" do
1865
1844
 
1866
- let(:metadata) do
1845
+ let(:association) do
1867
1846
  Person.relations["posts"]
1868
1847
  end
1869
1848
 
1849
+ let(:base) do
1850
+ Person.new
1851
+ end
1852
+
1870
1853
  let(:criteria) do
1871
- described_class.criteria(metadata, id, Person)
1854
+ association.criteria(base)
1872
1855
  end
1873
1856
 
1874
1857
  it "does not include the type in the criteria" do
1875
- expect(criteria.selector).to eq({ "person_id" => id })
1858
+ expect(criteria.selector).to eq({ "person_id" => base.id })
1876
1859
  end
1877
1860
  end
1878
1861
  end
@@ -2785,13 +2768,6 @@ describe Mongoid::Relations::Referenced::Many do
2785
2768
  end
2786
2769
  end
2787
2770
 
2788
- describe ".foreign_key_suffix" do
2789
-
2790
- it "returns _id" do
2791
- expect(described_class.foreign_key_suffix).to eq("_id")
2792
- end
2793
- end
2794
-
2795
2771
  describe "#initialize" do
2796
2772
 
2797
2773
  context "when an illegal mixed relation exists" do
@@ -2848,13 +2824,6 @@ describe Mongoid::Relations::Referenced::Many do
2848
2824
  end
2849
2825
  end
2850
2826
 
2851
- describe ".macro" do
2852
-
2853
- it "returns has_many" do
2854
- expect(described_class.macro).to eq(:has_many)
2855
- end
2856
- end
2857
-
2858
2827
  describe "#max" do
2859
2828
 
2860
2829
  let(:person) do
@@ -3178,7 +3147,7 @@ describe Mongoid::Relations::Referenced::Many do
3178
3147
  end
3179
3148
  end
3180
3149
 
3181
- Mongoid::Relations::Referenced::Many.public_instance_methods.each do |method|
3150
+ Mongoid::Association::Referenced::HasMany::Proxy.public_instance_methods.each do |method|
3182
3151
 
3183
3152
  context "when checking #{method}" do
3184
3153
 
@@ -3199,13 +3168,6 @@ describe Mongoid::Relations::Referenced::Many do
3199
3168
  end
3200
3169
  end
3201
3170
 
3202
- describe ".stores_foreign_key?" do
3203
-
3204
- it "returns false" do
3205
- expect(described_class.stores_foreign_key?).to be false
3206
- end
3207
- end
3208
-
3209
3171
  describe "#scoped" do
3210
3172
 
3211
3173
  let(:person) do
@@ -3311,33 +3273,6 @@ describe Mongoid::Relations::Referenced::Many do
3311
3273
  end
3312
3274
  end
3313
3275
 
3314
- describe ".valid_options" do
3315
-
3316
- it "returns the valid options" do
3317
- expect(described_class.valid_options).to eq(
3318
- [
3319
- :after_add,
3320
- :after_remove,
3321
- :as,
3322
- :autosave,
3323
- :before_add,
3324
- :before_remove,
3325
- :dependent,
3326
- :foreign_key,
3327
- :order,
3328
- :primary_key
3329
- ]
3330
- )
3331
- end
3332
- end
3333
-
3334
- describe ".validation_default" do
3335
-
3336
- it "returns true" do
3337
- expect(described_class.validation_default).to be true
3338
- end
3339
- end
3340
-
3341
3276
  context "when the association has an order defined" do
3342
3277
 
3343
3278
  let(:person) do
@@ -3363,14 +3298,14 @@ describe Mongoid::Relations::Referenced::Many do
3363
3298
 
3364
3299
  it "order documents" do
3365
3300
  expect(person.ordered_posts(true)).to eq(
3366
- [post_two, post_three, post_one]
3367
- )
3301
+ [post_two, post_three, post_one]
3302
+ )
3368
3303
  end
3369
3304
 
3370
3305
  it "chaining order criterias" do
3371
3306
  expect(person.ordered_posts.order_by(:title.desc).to_a).to eq(
3372
- [post_three, post_two, post_one]
3373
- )
3307
+ [post_three, post_two, post_one]
3308
+ )
3374
3309
  end
3375
3310
  end
3376
3311
 
@@ -3396,7 +3331,7 @@ describe Mongoid::Relations::Referenced::Many do
3396
3331
 
3397
3332
  before do
3398
3333
  Post.collection.find({ _id: post_one.id }).
3399
- update_one({ "$set" => { title: "reloaded" }})
3334
+ update_one({ "$set" => { title: "reloaded" }})
3400
3335
  end
3401
3336
 
3402
3337
  let(:reloaded) do
@@ -0,0 +1,37 @@
1
+ class HmmCompany
2
+ include Mongoid::Document
3
+
4
+ field :p, type: Integer
5
+ has_many :emails, primary_key: :p, foreign_key: :f, class_name: 'HmmEmail'
6
+ end
7
+
8
+ class HmmEmail
9
+ include Mongoid::Document
10
+
11
+ field :f, type: Integer
12
+ belongs_to :company, primary_key: :p, foreign_key: :f, class_name: 'HmmCompany'
13
+ end
14
+
15
+ class HmmSchool
16
+ include Mongoid::Document
17
+
18
+ has_many :students, class_name: 'HmmStudent'
19
+
20
+ field :district, type: String
21
+ field :team, type: String
22
+ end
23
+
24
+ class HmmStudent
25
+ include Mongoid::Document
26
+
27
+ belongs_to :school, class_name: 'HmmSchool'
28
+
29
+ field :name, type: String
30
+ field :grade, type: Integer, default: 3
31
+ end
32
+
33
+ class HmmTicket
34
+ include Mongoid::Document
35
+
36
+ belongs_to :person
37
+ end