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
@@ -0,0 +1,210 @@
1
+ require 'mongoid/association/embedded/embeds_many/binding'
2
+ require 'mongoid/association/embedded/embeds_many/buildable'
3
+ require 'mongoid/association/embedded/embeds_many/proxy'
4
+
5
+ module Mongoid
6
+ module Association
7
+ module Embedded
8
+
9
+ # The EmbedsMany type association.
10
+ #
11
+ # @since 7.0
12
+ class EmbedsMany
13
+ include Relatable
14
+ include Buildable
15
+
16
+ # The options available for this type of association, in addition to the
17
+ # common ones.
18
+ #
19
+ # @return [ Array<Symbol> ] The extra valid options.
20
+ #
21
+ # @since 7.0
22
+ ASSOCIATION_OPTIONS = [
23
+ :as,
24
+ :cascade_callbacks,
25
+ :cyclic,
26
+ :order,
27
+ :store_as,
28
+ :before_add,
29
+ :after_add,
30
+ :before_remove,
31
+ :after_remove
32
+ ]
33
+
34
+ # The complete list of valid options for this association, including
35
+ # the shared ones.
36
+ #
37
+ # @return [ Array<Symbol> ] The valid options.
38
+ #
39
+ # @since 7.0
40
+ VALID_OPTIONS = (ASSOCIATION_OPTIONS + SHARED_OPTIONS).freeze
41
+
42
+ # Setup the instance methods, fields, etc. on the association owning class.
43
+ #
44
+ # @return [ self ]
45
+ #
46
+ # @since 7.0
47
+ def setup!
48
+ setup_instance_methods!
49
+ @owner_class.embedded_relations = @owner_class.embedded_relations.merge(name => self)
50
+ @owner_class.aliased_fields[name.to_s] = store_as if store_as
51
+ self
52
+ end
53
+
54
+ # The field key used to store the list of association objects.
55
+ #
56
+ # @return [ String ] The field name.
57
+ #
58
+ # @since 7.0
59
+ def store_as
60
+ @store_as ||= (@options[:store_as].try(:to_s) || name.to_s)
61
+ end
62
+
63
+ # The key that is used to get the attributes for the associated object.
64
+ #
65
+ # @return [ String ] The name of the field used to store the relation.
66
+ #
67
+ # @since 7.0
68
+ def key
69
+ store_as.to_s
70
+ end
71
+
72
+ # Is this association type embedded?
73
+ #
74
+ # @return [ true ] Always true.
75
+ #
76
+ # @since 7.0
77
+ def embedded?; true; end
78
+
79
+ # Get the default validation setting for the relation. Determines if
80
+ # by default a validates associated will occur.
81
+ #
82
+ # @example Get the validation default.
83
+ # Proxy.validation_default
84
+ #
85
+ # @return [ true ] Always true.
86
+ #
87
+ # @since 2.1.9
88
+ def validation_default; true; end
89
+
90
+ # Does this association type store the foreign key?
91
+ #
92
+ # @return [ false ] Always false.
93
+ #
94
+ # @since 7.0
95
+ def stores_foreign_key?; false; end
96
+
97
+ # The primary key
98
+ #
99
+ # @return [ nil ] Not relevant for this relation
100
+ def primary_key; end
101
+
102
+ # Get the relation proxy class for this association type.
103
+ #
104
+ # @return [ Association::Embedded::EmbedsMany::Proxy ] The proxy class.
105
+ #
106
+ # @since 7.0
107
+ def relation
108
+ Proxy
109
+ end
110
+
111
+ # Is this association polymorphic?
112
+ #
113
+ # @return [ true, false ] Whether this association is polymorphic.
114
+ #
115
+ # @since 7.0
116
+ def polymorphic?
117
+ @polymorphic ||= !!@options[:as]
118
+ end
119
+
120
+ # The field used to store the type of the related object.
121
+ #
122
+ # @note Only relevant if the association is polymorphic.
123
+ #
124
+ # @return [ String, nil ] The field for storing the associated object's type.
125
+ #
126
+ # @since 7.0
127
+ def type
128
+ @type ||= "#{as}_type" if polymorphic?
129
+ end
130
+
131
+ # The nested builder object.
132
+ #
133
+ # @param [ Hash ] attributes The attributes to use to build the association object.
134
+ # @param [ Hash ] options The options for the association.
135
+ #
136
+ # @return [ Association::Nested::Many ] The Nested Builder object.
137
+ #
138
+ # @since 7.0
139
+ def nested_builder(attributes, options)
140
+ Nested::Many.new(self, attributes, options)
141
+ end
142
+
143
+ # Get the path calculator for the supplied document.
144
+ #
145
+ # @example Get the path calculator.
146
+ # Proxy.path(document)
147
+ #
148
+ # @param [ Document ] document The document to calculate on.
149
+ #
150
+ # @return [ Mongoid::Atomic::Paths::Embedded::Many ]
151
+ # The embedded many atomic path calculator.
152
+ #
153
+ # @since 2.1.0
154
+ def path(document)
155
+ Mongoid::Atomic::Paths::Embedded::Many.new(document)
156
+ end
157
+
158
+ # Get a criteria object for searching given a parent and children documents.
159
+ #
160
+ # @param [ Document ] base The base document.
161
+ # @param [ Document ] target The children documents.
162
+ #
163
+ # @since 7.0
164
+ def criteria(base, target)
165
+ criterion = klass.scoped
166
+ criterion.embedded = true
167
+ criterion.documents = target
168
+ criterion.parent_document = base
169
+ criterion.association = self
170
+ apply_ordering(criterion)
171
+ end
172
+
173
+ private
174
+
175
+ def apply_ordering(criteria)
176
+ order ? criteria.order_by(order) : criteria
177
+ end
178
+
179
+ def setup_instance_methods!
180
+ define_getter!
181
+ define_setter!
182
+ define_existence_check!
183
+ define_builder!
184
+ define_creator!
185
+ @owner_class.cyclic = true if cyclic?
186
+ @owner_class.validates_associated(name) if validate?
187
+ end
188
+
189
+ def relation_complements
190
+ @relation_complements ||= [ Embedded::EmbeddedIn ].freeze
191
+ end
192
+
193
+ def polymorphic_inverses(other = nil)
194
+ [ as ]
195
+ end
196
+
197
+ def determine_inverses(other)
198
+ matches = relation_class.relations.values.select do |rel|
199
+ relation_complements.include?(rel.class) &&
200
+ rel.relation_class_name == inverse_class_name
201
+ end
202
+ if matches.size > 1
203
+ raise Errors::AmbiguousRelationship.new(relation_class, @owner_class, name, matches)
204
+ end
205
+ matches.collect { |m| m.name } unless matches.blank?
206
+ end
207
+ end
208
+ end
209
+ end
210
+ end
@@ -1,16 +1,18 @@
1
- # encoding: utf-8
2
1
  module Mongoid
3
- module Relations
4
- module Bindings
5
- module Embedded
2
+ module Association
3
+ module Embedded
4
+ class EmbedsOne
6
5
 
7
- # Binding class for embeds_one relations.
8
- class One < Binding
6
+ # Binding class for all embeds_one relations.
7
+ #
8
+ # @since 7.0
9
+ class Binding
10
+ include Bindable
9
11
 
10
12
  # Binds the base object to the inverse of the relation. This is so we
11
13
  # are referenced to the actual objects themselves on both sides.
12
14
  #
13
- # This case sets the metadata on the inverse object as well as the
15
+ # This case sets the association metadata on the inverse object as well as the
14
16
  # document itself.
15
17
  #
16
18
  # @example Bind the document.
@@ -19,9 +21,9 @@ module Mongoid
19
21
  #
20
22
  # @since 2.0.0.rc.1
21
23
  def bind_one
22
- target.parentize(base)
24
+ _target.parentize(_base)
23
25
  binding do
24
- target.do_or_do_not(metadata.inverse_setter(target), base)
26
+ _target.do_or_do_not(_association.inverse_setter(_target), _base)
25
27
  end
26
28
  end
27
29
 
@@ -35,7 +37,7 @@ module Mongoid
35
37
  # @since 2.0.0.rc.1
36
38
  def unbind_one
37
39
  binding do
38
- target.do_or_do_not(metadata.inverse_setter(target), nil)
40
+ _target.do_or_do_not(_association.inverse_setter(_target), nil)
39
41
  end
40
42
  end
41
43
  end
@@ -1,21 +1,27 @@
1
- # encoding: utf-8
2
1
  module Mongoid
3
- module Relations
4
- module Builders
5
- module Embedded
6
- class One < Builder
2
+ module Association
3
+ module Embedded
4
+ class EmbedsOne
5
+
6
+ # Builder class for embeds_one associations.
7
+ #
8
+ # @since 7.0
9
+ module Buildable
10
+ include Threaded::Lifecycle
7
11
 
8
12
  # Builds the document out of the attributes using the provided
9
- # metadata on the relation. Instantiates through the factory in order
13
+ # association metadata on the relation. Instantiates through the factory in order
10
14
  # to make sure subclasses and allocation are used if fitting.
11
15
  #
12
16
  # @example Build the document.
13
17
  # Builder.new(meta, attrs).build
14
18
  #
19
+ # @param [ Document ] base The document this relation hangs off of.
20
+ # @param [ Document ] object The related document.
15
21
  # @param [ String ] _type Not used in this context.
16
22
  #
17
23
  # @return [ Document ] A single document.
18
- def build(_type = nil)
24
+ def build(base, object, _type = nil)
19
25
  return object unless object.is_a?(Hash)
20
26
  if _loading? && base.persisted?
21
27
  Factory.from_db(klass, object)
@@ -0,0 +1,130 @@
1
+ module Mongoid
2
+ module Association
3
+ module Embedded
4
+ class EmbedsOne
5
+
6
+ class Proxy < Association::One
7
+
8
+ # The valid options when defining this relation.
9
+ #
10
+ # @return [ Array<Symbol> ] The allowed options when defining this relation.
11
+ #
12
+ # @since 7.0
13
+ VALID_OPTIONS = [
14
+ :autobuild,
15
+ :as,
16
+ :cascade_callbacks,
17
+ :cyclic,
18
+ :store_as
19
+ ].freeze
20
+
21
+ # Instantiate a new embeds_one relation.
22
+ #
23
+ # @example Create the new proxy.
24
+ # One.new(person, name, association)
25
+ #
26
+ # @param [ Document ] base The document this relation hangs off of.
27
+ # @param [ Document ] target The child document in the relation.
28
+ # @param [ Association ] association The association metadata.
29
+ def initialize(base, target, association)
30
+ init(base, target, association) do
31
+ characterize_one(_target)
32
+ bind_one
33
+ characterize_one(_target)
34
+ _base._reset_memoized_children!
35
+ _target.save if persistable?
36
+ end
37
+ end
38
+
39
+ # Substitutes the supplied target documents for the existing document
40
+ # in the relation.
41
+ #
42
+ # @example Substitute the new document.
43
+ # person.name.substitute(new_name)
44
+ #
45
+ # @param [ Document ] replacement A document to replace the target.
46
+ #
47
+ # @return [ Document, nil ] The relation or nil.
48
+ #
49
+ # @since 2.0.0.rc.1
50
+ def substitute(replacement)
51
+ if replacement != self
52
+ if _assigning?
53
+ _base.add_atomic_unset(_target) unless replacement
54
+ else
55
+ # The associated object will be replaced by the below update if non-nil, so only
56
+ # run the callbacks and state-changing code by passing persist: false in that case.
57
+ _target.destroy(persist: !replacement) 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?
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
+ Binding.new(_base, _target, _association)
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
+ # Returns true if the relation is an embedded one. In this case
99
+ # always true.
100
+ #
101
+ # @example Is this relation embedded?
102
+ # Association::Embedded::EmbedsOne.embedded?
103
+ #
104
+ # @return [ true ] true.
105
+ #
106
+ # @since 2.0.0.rc.1
107
+ def embedded?
108
+ true
109
+ end
110
+
111
+ # Get the path calculator for the supplied document.
112
+ #
113
+ # @example Get the path calculator.
114
+ # Proxy.path(document)
115
+ #
116
+ # @param [ Document ] document The document to calculate on.
117
+ #
118
+ # @return [ Mongoid::Atomic::Paths::Embedded::One ]
119
+ # The embedded one atomic path calculator.
120
+ #
121
+ # @since 2.1.0
122
+ def path(document)
123
+ Mongoid::Atomic::Paths::Embedded::One.new(document)
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,173 @@
1
+ require 'mongoid/association/embedded/embeds_one/binding'
2
+ require 'mongoid/association/embedded/embeds_one/buildable'
3
+ require 'mongoid/association/embedded/embeds_one/proxy'
4
+
5
+ module Mongoid
6
+ module Association
7
+ module Embedded
8
+
9
+ # The EmbedsOne type association.
10
+ #
11
+ # @since 7.0
12
+ class EmbedsOne
13
+ include Relatable
14
+ include Buildable
15
+
16
+ # The options available for this type of association, in addition to the
17
+ # common ones.
18
+ #
19
+ # @return [ Array<Symbol> ] The extra valid options.
20
+ #
21
+ # @since 7.0
22
+ ASSOCIATION_OPTIONS = [
23
+ :autobuild,
24
+ :as,
25
+ :cascade_callbacks,
26
+ :cyclic,
27
+ :store_as
28
+ ]
29
+
30
+ # The complete list of valid options for this association, including
31
+ # the shared ones.
32
+ #
33
+ # @return [ Array<Symbol> ] The valid options.
34
+ #
35
+ # @since 7.0
36
+ VALID_OPTIONS = (ASSOCIATION_OPTIONS + SHARED_OPTIONS).freeze
37
+
38
+ # Setup the instance methods, fields, etc. on the association owning class.
39
+ #
40
+ # @return [ self ]
41
+ #
42
+ # @since 7.0
43
+ def setup!
44
+ setup_instance_methods!
45
+ @owner_class.embedded_relations = @owner_class.embedded_relations.merge(name => self)
46
+ @owner_class.aliased_fields[name.to_s] = store_as if store_as
47
+ self
48
+ end
49
+
50
+ # The field key used to store the association object.
51
+ #
52
+ # @return [ String ] The field name.
53
+ #
54
+ # @since 7.0
55
+ def store_as
56
+ @store_as ||= (@options[:store_as].try(:to_s) || name.to_s)
57
+ end
58
+
59
+ # The key that is used to get the attributes for the associated object.
60
+ #
61
+ # @return [ String ] The name of the field used to store the relation.
62
+ #
63
+ # @since 7.0
64
+ def key
65
+ store_as.to_s
66
+ end
67
+
68
+ # Is this association type embedded?
69
+ #
70
+ # @return [ true ] Always true.
71
+ #
72
+ # @since 7.0
73
+ def embedded?; true; end
74
+
75
+ # Get the default validation setting for the relation. Determines if
76
+ # by default a validates associated will occur.
77
+ #
78
+ # @example Get the validation default.
79
+ # Proxy.validation_default
80
+ #
81
+ # @return [ true, false ] The validation default.
82
+ #
83
+ # @since 2.1.9
84
+ def validation_default; true; end
85
+
86
+ # Does this association type store the foreign key?
87
+ #
88
+ # @return [ false ] Always false.
89
+ #
90
+ # @since 7.0
91
+ def stores_foreign_key?; false; end
92
+
93
+ # The primary key
94
+ #
95
+ # @return [ nil ] Not relevant for this relation
96
+ def primary_key; end
97
+
98
+ # Get the relation proxy class for this association type.
99
+ #
100
+ # @return [ Association::Embedded::EmbedsMany::Proxy ] The proxy class.
101
+ #
102
+ # @since 7.0
103
+ def relation
104
+ Proxy
105
+ end
106
+
107
+ # Is this association polymorphic?
108
+ #
109
+ # @return [ true, false ] Whether this association is polymorphic.
110
+ #
111
+ # @since 7.0
112
+ def polymorphic?
113
+ @polymorphic ||= !!@options[:as]
114
+ end
115
+
116
+ # The field used to store the type of the related object.
117
+ #
118
+ # @note Only relevant if the association is polymorphic.
119
+ #
120
+ # @return [ String, nil ] The field for storing the associated object's type.
121
+ #
122
+ # @since 7.0
123
+ def type
124
+ @type ||= "#{as}_type" if polymorphic?
125
+ end
126
+
127
+ # The nested builder object.
128
+ #
129
+ # @param [ Hash ] attributes The attributes to use to build the association object.
130
+ # @param [ Hash ] options The options for the association.
131
+ #
132
+ # @return [ Association::Nested::One ] The Nested Builder object.
133
+ #
134
+ # @since 7.0
135
+ def nested_builder(attributes, options)
136
+ Nested::One.new(self, attributes, options)
137
+ end
138
+
139
+ private
140
+
141
+ def setup_instance_methods!
142
+ define_getter!
143
+ define_setter!
144
+ define_existence_check!
145
+ define_builder!
146
+ define_creator!
147
+ @owner_class.cyclic = true if cyclic?
148
+ @owner_class.validates_associated(name) if validate?
149
+ end
150
+
151
+ def relation_complements
152
+ @relation_complements ||= [ Embedded::EmbeddedIn ].freeze
153
+ end
154
+
155
+ def polymorphic_inverses(other = nil)
156
+ [ as ]
157
+ end
158
+
159
+ def determine_inverses(other)
160
+ matches = relation_class.relations.values.select do |rel|
161
+ relation_complements.include?(rel.class) &&
162
+ rel.relation_class_name == inverse_class_name
163
+
164
+ end
165
+ if matches.size > 1
166
+ raise Errors::AmbiguousRelationship.new(relation_class, @owner_class, name, matches)
167
+ end
168
+ matches.collect { |m| m.name } unless matches.blank?
169
+ end
170
+ end
171
+ end
172
+ end
173
+ end
@@ -0,0 +1,4 @@
1
+ require 'mongoid/association/embedded/cyclic'
2
+ require 'mongoid/association/embedded/embedded_in'
3
+ require 'mongoid/association/embedded/embeds_many'
4
+ require 'mongoid/association/embedded/embeds_one'