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,235 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
- module Embedded
5
-
6
- # This class defines the behaviour needed for embedded one to one
7
- # relations.
8
- class One < Relations::One
9
-
10
- # The allowed options when defining this relation.
11
- #
12
- # @return [ Array<Symbol> ] The allowed options when defining this relation.
13
- #
14
- # @since 6.0.0
15
- VALID_OPTIONS = [
16
- :autobuild,
17
- :as,
18
- :cascade_callbacks,
19
- :cyclic,
20
- :store_as
21
- ].freeze
22
-
23
- # Instantiate a new embeds_one relation.
24
- #
25
- # @example Create the new proxy.
26
- # One.new(person, name, metadata)
27
- #
28
- # @param [ Document ] base The document this relation hangs off of.
29
- # @param [ Document ] target The child document in the relation.
30
- # @param [ Metadata ] metadata The relation's metadata
31
- def initialize(base, target, metadata)
32
- init(base, target, metadata) do
33
- characterize_one(target)
34
- bind_one
35
- characterize_one(target)
36
- base._reset_memoized_children!
37
- target.save if persistable?
38
- end
39
- end
40
-
41
- # Substitutes the supplied target documents for the existing document
42
- # in the relation.
43
- #
44
- # @example Substitute the new document.
45
- # person.name.substitute(new_name)
46
- #
47
- # @param [ Document ] replacement A document to replace the target.
48
- #
49
- # @return [ Document, nil ] The relation or nil.
50
- #
51
- # @since 2.0.0.rc.1
52
- def substitute(replacement)
53
- if replacement != self
54
- if _assigning?
55
- base.add_atomic_unset(target) unless replacement
56
- else
57
- target.destroy if persistable?
58
- end
59
- unbind_one
60
- return nil unless replacement
61
- replacement = Factory.build(klass, replacement) if replacement.is_a?(::Hash)
62
- self.target = replacement
63
- bind_one
64
- characterize_one(target)
65
- target.save if persistable? && !_assigning?
66
- end
67
- self
68
- end
69
-
70
- private
71
-
72
- # Instantiate the binding associated with this relation.
73
- #
74
- # @example Get the binding.
75
- # relation.binding([ address ])
76
- #
77
- # @return [ Binding ] The relation's binding.
78
- #
79
- # @since 2.0.0.rc.1
80
- def binding
81
- Bindings::Embedded::One.new(base, target, __metadata)
82
- end
83
-
84
- # Are we able to persist this relation?
85
- #
86
- # @example Can we persist the relation?
87
- # relation.persistable?
88
- #
89
- # @return [ true, false ] If the relation is persistable.
90
- #
91
- # @since 2.1.0
92
- def persistable?
93
- base.persisted? && !_binding? && !_building? && !_assigning?
94
- end
95
-
96
- class << self
97
-
98
- # Return the builder that is responsible for generating the documents
99
- # that will be used by this relation.
100
- #
101
- # @example Get the builder.
102
- # Embedded::One.builder(meta, object, person)
103
- #
104
- # @param [ Document ] base The base document.
105
- # @param [ Metadata ] meta The metadata of the relation.
106
- # @param [ Document, Hash ] object A document or attributes to build with.
107
- #
108
- # @return [ Builder ] A newly instantiated builder object.
109
- #
110
- # @since 2.0.0.rc.1
111
- def builder(base, meta, object)
112
- Builders::Embedded::One.new(base, meta, object)
113
- end
114
-
115
- # Returns true if the relation is an embedded one. In this case
116
- # always true.
117
- #
118
- # @example Is this relation embedded?
119
- # Embedded::One.embedded?
120
- #
121
- # @return [ true ] true.
122
- #
123
- # @since 2.0.0.rc.1
124
- def embedded?
125
- true
126
- end
127
-
128
- # Returns the suffix of the foreign key field, either "_id" or "_ids".
129
- #
130
- # @example Get the suffix for the foreign key.
131
- # Referenced::Many.foreign_key_suffix
132
- #
133
- # @return [ nil ] nil.
134
- #
135
- # @since 3.0.0
136
- def foreign_key_suffix
137
- nil
138
- end
139
-
140
- # Returns the macro for this relation. Used mostly as a helper in
141
- # reflection.
142
- #
143
- # @example Get the macro.
144
- # Mongoid::Relations::Embedded::One.macro
145
- #
146
- # @return [ Symbol ] :embeds_one.
147
- #
148
- # @since 2.0.0.rc.1
149
- def macro
150
- :embeds_one
151
- end
152
-
153
- # Return the nested builder that is responsible for generating
154
- # the documents that will be used by this relation.
155
- #
156
- # @example Get the builder.
157
- # NestedAttributes::One.builder(attributes, options)
158
- #
159
- # @param [ Metadata ] metadata The relation metadata.
160
- # @param [ Hash ] attributes The attributes to build with.
161
- # @param [ Hash ] options The options for the builder.
162
- #
163
- # @option options [ true, false ] :allow_destroy Can documents be
164
- # deleted?
165
- # @option options [ Integer ] :limit Max number of documents to
166
- # create at once.
167
- # @option options [ Proc, Symbol ] :reject_if If documents match this
168
- # option then they are ignored.
169
- # @option options [ true, false ] :update_only Only existing documents
170
- # can be modified.
171
- #
172
- # @return [ Builder ] A newly instantiated nested builder object.
173
- #
174
- # @since 2.0.0.rc.1
175
- def nested_builder(metadata, attributes, options)
176
- Builders::NestedAttributes::One.new(metadata, attributes, options)
177
- end
178
-
179
- # Get the path calculator for the supplied document.
180
- #
181
- # @example Get the path calculator.
182
- # Proxy.path(document)
183
- #
184
- # @param [ Document ] document The document to calculate on.
185
- #
186
- # @return [ Mongoid::Atomic::Paths::Embedded::One ]
187
- # The embedded one atomic path calculator.
188
- #
189
- # @since 2.1.0
190
- def path(document)
191
- Mongoid::Atomic::Paths::Embedded::One.new(document)
192
- end
193
-
194
- # Tells the caller if this relation is one that stores the foreign
195
- # key on its own objects.
196
- #
197
- # @example Does this relation store a foreign key?
198
- # Embedded::One.stores_foreign_key?
199
- #
200
- # @return [ false ] false.
201
- #
202
- # @since 2.0.0.rc.1
203
- def stores_foreign_key?
204
- false
205
- end
206
-
207
- # Get the valid options allowed with this relation.
208
- #
209
- # @example Get the valid options.
210
- # Relation.valid_options
211
- #
212
- # @return [ Array<Symbol> ] The valid options.
213
- #
214
- # @since 2.1.0
215
- def valid_options
216
- VALID_OPTIONS
217
- end
218
-
219
- # Get the default validation setting for the relation. Determines if
220
- # by default a validates associated will occur.
221
- #
222
- # @example Get the validation default.
223
- # Proxy.validation_default
224
- #
225
- # @return [ true, false ] The validation default.
226
- #
227
- # @since 2.1.9
228
- def validation_default
229
- true
230
- end
231
- end
232
- end
233
- end
234
- end
235
- end
@@ -1,367 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
-
5
- # This module contains the core macros for defining relations between
6
- # documents. They can be either embedded or referenced (relational).
7
- module Macros
8
- extend ActiveSupport::Concern
9
-
10
- included do
11
- class_attribute :embedded, instance_reader: false
12
- class_attribute :embedded_relations
13
- class_attribute :relations
14
- self.embedded = false
15
- self.embedded_relations = {}
16
- self.relations = {}
17
- end
18
-
19
- # This is convenience for librarys still on the old API.
20
- #
21
- # @example Get the associations.
22
- # person.associations
23
- #
24
- # @return [ Hash ] The relations.
25
- #
26
- # @since 2.3.1
27
- def associations
28
- self.relations
29
- end
30
-
31
- module ClassMethods
32
-
33
- # Adds the relation back to the parent document. This macro is
34
- # necessary to set the references from the child back to the parent
35
- # document. If a child does not define this relation calling
36
- # persistence methods on the child object will cause a save to fail.
37
- #
38
- # @example Define the relation.
39
- #
40
- # class Person
41
- # include Mongoid::Document
42
- # embeds_many :addresses
43
- # end
44
- #
45
- # class Address
46
- # include Mongoid::Document
47
- # embedded_in :person
48
- # end
49
- #
50
- # @param [ Symbol ] name The name of the relation.
51
- # @param [ Hash ] options The relation options.
52
- # @param [ Proc ] block Optional block for defining extensions.
53
- def embedded_in(name, options = {}, &block)
54
- meta = characterize(name, Embedded::In, options, &block)
55
- self.embedded = true
56
- relate(name, meta)
57
- builder(name, meta).creator(name, meta)
58
- touchable(meta)
59
- add_counter_cache_callbacks(meta) if meta.counter_cached?
60
- meta
61
- end
62
-
63
- # Adds the relation from a parent document to its children. The name
64
- # of the relation needs to be a pluralized form of the child class
65
- # name.
66
- #
67
- # @example Define the relation.
68
- #
69
- # class Person
70
- # include Mongoid::Document
71
- # embeds_many :addresses
72
- # end
73
- #
74
- # class Address
75
- # include Mongoid::Document
76
- # embedded_in :person
77
- # end
78
- #
79
- # @param [ Symbol ] name The name of the relation.
80
- # @param [ Hash ] options The relation options.
81
- # @param [ Proc ] block Optional block for defining extensions.
82
- def embeds_many(name, options = {}, &block)
83
- meta = characterize(name, Embedded::Many, options, &block)
84
- self.cyclic = true if options[:cyclic]
85
- relate(name, meta)
86
- embed(name, meta)
87
- validates_relation(meta)
88
- meta
89
- end
90
-
91
- # Adds the relation from a parent document to its child. The name
92
- # of the relation needs to be a singular form of the child class
93
- # name.
94
- #
95
- # @example Define the relation.
96
- #
97
- # class Person
98
- # include Mongoid::Document
99
- # embeds_one :name
100
- # end
101
- #
102
- # class Name
103
- # include Mongoid::Document
104
- # embedded_in :person
105
- # end
106
- #
107
- # @param [ Symbol ] name The name of the relation.
108
- # @param [ Hash ] options The relation options.
109
- # @param [ Proc ] block Optional block for defining extensions.
110
- def embeds_one(name, options = {}, &block)
111
- meta = characterize(name, Embedded::One, options, &block)
112
- self.cyclic = true if options[:cyclic]
113
- relate(name, meta)
114
- embed(name, meta)
115
- builder(name, meta).creator(name, meta)
116
- validates_relation(meta)
117
- meta
118
- end
119
-
120
- # Adds a relational association from the child Document to a Document in
121
- # another database or collection.
122
- #
123
- # @example Define the relation.
124
- #
125
- # class Game
126
- # include Mongoid::Document
127
- # belongs_to :person
128
- # end
129
- #
130
- # class Person
131
- # include Mongoid::Document
132
- # has_one :game
133
- # end
134
- #
135
- # @param [ Symbol ] name The name of the relation.
136
- # @param [ Hash ] options The relation options.
137
- # @param [ Proc ] block Optional block for defining extensions.
138
- def belongs_to(name, options = {}, &block)
139
- meta = reference_one_to_one(name, options, Referenced::In, &block)
140
- aliased_fields[name.to_s] = meta.foreign_key
141
- touchable(meta)
142
- add_counter_cache_callbacks(meta) if meta.counter_cached?
143
- validates(name, presence: true) if require_association?(options)
144
- meta
145
- end
146
-
147
- # Adds a relational association from a parent Document to many
148
- # Documents in another database or collection.
149
- #
150
- # @example Define the relation.
151
- #
152
- # class Person
153
- # include Mongoid::Document
154
- # has_many :posts
155
- # end
156
- #
157
- # class Game
158
- # include Mongoid::Document
159
- # belongs_to :person
160
- # end
161
- #
162
- # @param [ Symbol ] name The name of the relation.
163
- # @param [ Hash ] options The relation options.
164
- # @param [ Proc ] block Optional block for defining extensions.
165
- def has_many(name, options = {}, &block)
166
- meta = characterize(name, Referenced::Many, options, &block)
167
- relate(name, meta)
168
- ids_getter(name, meta).ids_setter(name, meta)
169
- reference(meta)
170
- autosave(meta)
171
- validates_relation(meta)
172
- meta
173
- end
174
-
175
- # Adds a relational many-to-many association between many of this
176
- # Document and many of another Document.
177
- #
178
- # @example Define the relation.
179
- #
180
- # class Person
181
- # include Mongoid::Document
182
- # has_and_belongs_to_many :preferences
183
- # end
184
- #
185
- # class Preference
186
- # include Mongoid::Document
187
- # has_and_belongs_to_many :people
188
- # end
189
- #
190
- # @param [ Symbol ] name The name of the relation.
191
- # @param [ Hash ] options The relation options.
192
- # @param [ Proc ] block Optional block for defining extensions.
193
- #
194
- # @since 2.0.0.rc.1
195
- def has_and_belongs_to_many(name, options = {}, &block)
196
- meta = characterize(name, Referenced::ManyToMany, options, &block)
197
- relate(name, meta)
198
- reference(meta, Array)
199
- autosave(meta)
200
- validates_relation(meta)
201
- _synced(meta)
202
- meta
203
- end
204
-
205
- # Adds a relational association from the child Document to a Document in
206
- # another database or collection.
207
- #
208
- # @example Define the relation.
209
- #
210
- # class Game
211
- # include Mongoid::Document
212
- # belongs_to :person
213
- # end
214
- #
215
- # class Person
216
- # include Mongoid::Document
217
- # has_one :game
218
- # end
219
- #
220
- # @param [ Symbol ] name The name of the relation.
221
- # @param [ Hash ] options The relation options.
222
- # @param [ Proc ] block Optional block for defining extensions.
223
- def has_one(name, options = {}, &block)
224
- reference_one_to_one(name, options, Referenced::One, &block)
225
- end
226
-
227
- private
228
-
229
- # Create the metadata for the relation.
230
- #
231
- # @api private
232
- #
233
- # @example Create the metadata.
234
- # Person.characterize(:posts, Referenced::Many, {})
235
- #
236
- # @param [ Symbol ] name The name of the relation.
237
- # @param [ Object ] relation The type of relation.
238
- # @param [ Hash ] options The relation options.
239
- # @param [ Proc ] block Optional block for defining extensions.
240
- #
241
- # @return [ Metadata ] The metadata for the relation.
242
- def characterize(name, relation, options, &block)
243
- Metadata.new({
244
- relation: relation,
245
- extend: create_extension_module(name, &block),
246
- inverse_class_name: self.name,
247
- name: name
248
- }.merge(options))
249
- end
250
-
251
- # Generate a named extension module suitable for marshaling
252
- #
253
- # @api private
254
- #
255
- # @example Get the module.
256
- # Person.create_extension_module(:posts, &block)
257
- #
258
- # @param [ Symbol ] name The name of the relation.
259
- # @param [ Proc ] block Optional block for defining extensions.
260
- #
261
- # @return [ Module, nil ] The extension or nil.
262
- #
263
- # @since 2.1.0
264
- def create_extension_module(name, &block)
265
- if block
266
- extension_module_name =
267
- "#{self.to_s.demodulize}#{name.to_s.camelize}RelationExtension"
268
- silence_warnings do
269
- self.const_set(extension_module_name, Module.new(&block))
270
- end
271
- "#{self}::#{extension_module_name}".constantize
272
- end
273
- end
274
-
275
- # Add an embedded relation metadata to the embedded relations.
276
- #
277
- # @api private
278
- #
279
- # @example Add the metadata to embedded relations.
280
- # Person.embed("addresses", metadata)
281
- #
282
- # @param [ String ] name The name of the relation.
283
- # @param [ Metadata ] metadata The relation metadata.
284
- #
285
- # @since 3.0.0
286
- def embed(name, metadata)
287
- self.embedded_relations = embedded_relations.merge(name.to_s => metadata)
288
- aliased_fields[name.to_s] = metadata.store_as if metadata.store_as
289
- end
290
-
291
- # Defines a field to be used as a foreign key in the relation and
292
- # indexes it if defined.
293
- #
294
- # @api private
295
- #
296
- # @example Set up the relational fields and indexes.
297
- # Person.reference(metadata)
298
- #
299
- # @param [ Metadata ] metadata The metadata for the relation.
300
- def reference(metadata, type = Object)
301
- polymorph(metadata).cascade(metadata)
302
- if metadata.relation.stores_foreign_key?
303
- key = metadata.foreign_key
304
- field(
305
- key,
306
- type: type,
307
- identity: true,
308
- overwrite: true,
309
- metadata: metadata,
310
- default: metadata.foreign_key_default
311
- )
312
- if metadata.indexed?
313
- if metadata.polymorphic?
314
- index({ key => 1, metadata.inverse_type => 1 }, { background: true })
315
- else
316
- index({ key => 1 }, { background: true })
317
- end
318
- end
319
- end
320
- end
321
-
322
- # Handle common behaviour for referenced 1-1 relation setup.
323
- #
324
- # @api private
325
- #
326
- # @example Add the one to one behaviour.
327
- # Model.reference_one_to_one(:name, meta)
328
- #
329
- # @param [ Symbol ] name The name of the relation.
330
- # @param [ Symbol ] options The association options.
331
- # @param [ Metadata ] relation The relation.
332
- #
333
- # @return [ Class ] The model class.
334
- #
335
- # @since 3.0.0
336
- def reference_one_to_one(name, options, relation, &block)
337
- meta = characterize(name, relation, options, &block)
338
- relate(name, meta)
339
- reference(meta)
340
- builder(name, meta).creator(name, meta).autosave(meta)
341
- validates_relation(meta)
342
- meta
343
- end
344
-
345
- # Creates a relation for the given name, metadata and relation. It adds
346
- # the metadata to the relations hash and has the accessors set up.
347
- #
348
- # @example Set up the relation and accessors.
349
- # Person.relate(:addresses, Metadata)
350
- #
351
- # @param [ Symbol ] name The name of the relation.
352
- # @param [ Metadata ] metadata The metadata for the relation.
353
- def relate(name, metadata)
354
- Fields::Validators::Macro.validate_relation(self, name)
355
- self.relations = relations.merge(name.to_s => metadata)
356
- getter(name, metadata).setter(name, metadata).existence_check(name)
357
- end
358
-
359
- def require_association?(options = {})
360
- required = options[:required] if options.key?(:required)
361
- required = !options[:optional] if options.key?(:optional) && required.nil?
362
- required.nil? ? Mongoid.belongs_to_required_by_default : required
363
- end
364
- end
365
- end
366
- end
367
- end