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,26 +1,11 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Relations
3
+ module Association
4
4
 
5
5
  # Used for converting foreign key values to the correct type based on the
6
6
  # types of ids that the document stores.
7
7
  #
8
- # @note Durran: The name of this class is this way to match the metadata
9
- # getter, and foreign_key was already taken there.
10
- class Constraint
11
- attr_reader :metadata
12
-
13
- # Create the new constraint with the metadata.
14
- #
15
- # @example Instantiate the constraint.
16
- # Constraint.new(metdata)
17
- #
18
- # @param [ Metadata ] metadata The metadata of the relation.
19
- #
20
- # @since 2.0.0.rc.7
21
- def initialize(metadata)
22
- @metadata = metadata
23
- end
8
+ module Constrainable
24
9
 
25
10
  # Convert the supplied object to the appropriate type to set as the
26
11
  # foreign key for a relation.
@@ -33,10 +18,10 @@ module Mongoid
33
18
  # @return [ Object ] The object cast to the correct type.
34
19
  #
35
20
  # @since 2.0.0.rc.7
36
- def convert(object)
37
- return convert_polymorphic(object) if metadata.polymorphic?
38
- klass, field = metadata.klass, metadata.klass.fields["_id"]
39
- if klass.using_object_ids?
21
+ def convert_to_foreign_key(object)
22
+ return convert_polymorphic(object) if polymorphic?
23
+ field = relation_class.fields["_id"]
24
+ if relation_class.using_object_ids?
40
25
  BSON::ObjectId.mongoize(object)
41
26
  elsif object.is_a?(::Array)
42
27
  object.map!{ |obj| field.mongoize(obj) }
@@ -48,7 +33,11 @@ module Mongoid
48
33
  private
49
34
 
50
35
  def convert_polymorphic(object)
51
- object.respond_to?(:id) ? object.id : object
36
+ if object.is_a?(Mongoid::Document)
37
+ object.id
38
+ else
39
+ BSON::ObjectId.mongoize(object)
40
+ end
52
41
  end
53
42
  end
54
43
  end
@@ -0,0 +1,137 @@
1
+ module Mongoid
2
+ module Association
3
+
4
+ # This module defines the behaviour for setting up cascading deletes and
5
+ # nullifies for relations, and how to delegate to the appropriate strategy.
6
+ module Depending
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ class_attribute :dependents
11
+
12
+ # @api private
13
+ class_attribute :dependents_owner
14
+
15
+ self.dependents = []
16
+ self.dependents_owner = self
17
+ end
18
+
19
+ class_methods do
20
+ # @api private
21
+ def _all_dependents
22
+ superclass_dependents = superclass.respond_to?(:_all_dependents) ? superclass._all_dependents : []
23
+ dependents + superclass_dependents.reject do |new_dep|
24
+ dependents.any? do |old_dep| old_dep.name == new_dep.name
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ # The valid dependent strategies.
31
+ #
32
+ # @since 7.0
33
+ STRATEGIES = [
34
+ :delete_all,
35
+ :destroy,
36
+ :nullify,
37
+ :restrict_with_exception,
38
+ :restrict_with_error
39
+ ]
40
+
41
+ # The error message when a strategy cannot delete objects because there are associated objects.
42
+ #
43
+ # @since 7.0
44
+ RESTRICT_ERROR_MSG = 'Cannot delete record because associated objects exist.'.freeze
45
+
46
+ # Attempt to add the cascading information for the document to know how
47
+ # to handle associated documents on a removal.
48
+ #
49
+ # @example Set up cascading information
50
+ # Mongoid::Association::Depending.define_dependency!(association)
51
+ #
52
+ # @param [ Association ] association The association metadata.
53
+ #
54
+ # @return [ Class ] The class of the document.
55
+ #
56
+ # @since 2.0.0.rc.1
57
+ def self.define_dependency!(association)
58
+ validate!(association)
59
+ association.inverse_class.tap do |klass|
60
+ if klass.dependents_owner != klass
61
+ klass.dependents = []
62
+ klass.dependents_owner = klass
63
+ end
64
+
65
+ if association.dependent && !klass.dependents.include?(association)
66
+ klass.dependents.push(association)
67
+ end
68
+ end
69
+ end
70
+
71
+ def self.validate!(association)
72
+ unless STRATEGIES.include?(association.dependent)
73
+ raise Errors::InvalidDependentStrategy.new(association,
74
+ association.dependent,
75
+ STRATEGIES)
76
+ end
77
+ end
78
+
79
+ # Perform all cascading deletes, destroys, or nullifies. Will delegate to
80
+ # the appropriate strategy to perform the operation.
81
+ #
82
+ # @example Execute cascades.
83
+ # document.apply_delete_dependencies!
84
+ #
85
+ # @since 2.0.0.rc.1
86
+ def apply_delete_dependencies!
87
+ self.class._all_dependents.each do |association|
88
+ if association.try(:dependent)
89
+ send("_dependent_#{association.dependent}!", association)
90
+ end
91
+ end
92
+ end
93
+
94
+ private
95
+
96
+ def _dependent_delete_all!(association)
97
+ if relation = send(association.name)
98
+ if relation.respond_to?(:dependents) && relation.dependents.blank?
99
+ relation.clear
100
+ else
101
+ ::Array.wrap(send(association.name)).each { |rel| rel.delete }
102
+ end
103
+ end
104
+ end
105
+
106
+ def _dependent_destroy!(association)
107
+ if relation = send(association.name)
108
+ if relation.is_a?(Enumerable)
109
+ relation.entries
110
+ relation.each { |doc| doc.destroy }
111
+ else
112
+ relation.destroy
113
+ end
114
+ end
115
+ end
116
+
117
+ def _dependent_nullify!(association)
118
+ if relation = send(association.name)
119
+ relation.nullify
120
+ end
121
+ end
122
+
123
+ def _dependent_restrict_with_exception!(association)
124
+ if (relation = send(association.name)) && !relation.blank?
125
+ raise Errors::DeleteRestriction.new(relation, association.name)
126
+ end
127
+ end
128
+
129
+ def _dependent_restrict_with_error!(association)
130
+ if (relation = send(association.name)) && !relation.blank?
131
+ errors.add(association.name, RESTRICT_ERROR_MSG)
132
+ throw(:abort, false)
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
@@ -1,13 +1,13 @@
1
1
  # encoding: utf-8
2
- require "mongoid/relations/eager/base"
3
- require "mongoid/relations/eager/belongs_to"
4
- require "mongoid/relations/eager/has_one"
5
- require "mongoid/relations/eager/has_many"
6
- require "mongoid/relations/eager/has_and_belongs_to_many"
2
+ require "mongoid/association/referenced/eager"
7
3
 
8
4
  module Mongoid
9
- module Relations
10
- module Eager
5
+ module Association
6
+
7
+ # This module defines the eager loading behavior for criteria.
8
+ #
9
+ # @since 7.0
10
+ module EagerLoadable
11
11
 
12
12
  def eager_loadable?
13
13
  !criteria.inclusions.empty?
@@ -23,11 +23,11 @@ module Mongoid
23
23
 
24
24
  def preload(relations, docs)
25
25
  relations.group_by(&:inverse_class_name)
26
- .values
27
- .each do |associations|
26
+ .values
27
+ .each do |associations|
28
28
  associations.group_by(&:relation)
29
- .each do |relation, association|
30
- relation.eager_load_klass.new(association, docs).run
29
+ .each do |relation, association|
30
+ relation.eager_loader(association, docs).run
31
31
  end
32
32
  end
33
33
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Relations
3
+ module Association
4
4
  module Embedded
5
5
 
6
6
  # Contains behaviour for executing operations in batch on embedded
@@ -38,8 +38,8 @@ module Mongoid
38
38
  pre_process_batch_remove(docs, :delete)
39
39
  unless docs.empty?
40
40
  collection.find(selector).update_one(
41
- positionally(selector, "$unset" => { path => true }),
42
- session: _session
41
+ positionally(selector, "$unset" => { path => true }),
42
+ session: _session
43
43
  )
44
44
  post_process_batch_remove(docs, :delete)
45
45
  end
@@ -59,8 +59,8 @@ module Mongoid
59
59
  removals = pre_process_batch_remove(docs, method)
60
60
  if !docs.empty?
61
61
  collection.find(selector).update_one(
62
- positionally(selector, "$pullAll" => { path => removals }),
63
- session: _session
62
+ positionally(selector, "$pullAll" => { path => removals }),
63
+ session: _session
64
64
  )
65
65
  post_process_batch_remove(docs, method)
66
66
  end
@@ -80,17 +80,17 @@ module Mongoid
80
80
  def batch_replace(docs)
81
81
  if docs.blank?
82
82
  if _assigning? && !empty?
83
- base.add_atomic_unset(first)
84
- target_duplicate = target.dup
83
+ _base.add_atomic_unset(first)
84
+ target_duplicate = _target.dup
85
85
  pre_process_batch_remove(target_duplicate, :delete)
86
86
  post_process_batch_remove(target_duplicate, :delete)
87
87
  else
88
- batch_remove(target.dup)
88
+ batch_remove(_target.dup)
89
89
  end
90
- elsif target != docs
91
- base.delayed_atomic_sets.clear unless _assigning?
90
+ elsif _target != docs
91
+ _base.delayed_atomic_sets.clear unless _assigning?
92
92
  docs = normalize_docs(docs).compact
93
- target.clear and _unscoped.clear
93
+ _target.clear and _unscoped.clear
94
94
  inserts = execute_batch_set(docs)
95
95
  add_atomic_sets(inserts)
96
96
  end
@@ -110,11 +110,11 @@ module Mongoid
110
110
  # @since 3.0.0
111
111
  def add_atomic_sets(sets)
112
112
  if _assigning?
113
- base.delayed_atomic_sets[path].try(:clear)
114
- base.collect_children.each do |child|
113
+ _base.delayed_atomic_sets[path].try(:clear)
114
+ _base.collect_children.each do |child|
115
115
  child.delayed_atomic_sets.clear
116
116
  end
117
- base.delayed_atomic_sets[path] = sets
117
+ _base.delayed_atomic_sets[path] = sets
118
118
  end
119
119
  end
120
120
 
@@ -122,7 +122,7 @@ module Mongoid
122
122
  #
123
123
  # @api private
124
124
  #
125
- #@example Perform a batch $set.
125
+ # @example Perform a batch $set.
126
126
  # batchable.execute_batch_set(docs)
127
127
  #
128
128
  # @param [ Array<Document> ] docs The docs to persist.
@@ -228,7 +228,7 @@ module Mongoid
228
228
  def normalize_docs(docs)
229
229
  if docs.first.is_a?(::Hash)
230
230
  docs.map do |doc|
231
- attributes = { __metadata: __metadata, _parent: base }
231
+ attributes = { _association: _association, _parent: _base }
232
232
  attributes.merge!(doc)
233
233
  Factory.build(klass, attributes)
234
234
  end
@@ -278,7 +278,7 @@ module Mongoid
278
278
  #
279
279
  # @since 3.0.0
280
280
  def selector
281
- @selector ||= base.atomic_selector
281
+ @selector ||= _base.atomic_selector
282
282
  end
283
283
 
284
284
  # Pre processes the batch insert for the provided documents.
@@ -327,10 +327,10 @@ module Mongoid
327
327
  self.path = doc.atomic_path unless path
328
328
  execute_callback :before_remove, doc
329
329
  unless _assigning?
330
- doc.cascade!
330
+ doc.apply_delete_dependencies!
331
331
  doc.run_before_callbacks(:destroy) if method == :destroy
332
332
  end
333
- target.delete_one(doc)
333
+ _target.delete_one(doc)
334
334
  _unscoped.delete_one(doc)
335
335
  unbind_one(doc)
336
336
  execute_callback :after_remove, doc
@@ -0,0 +1,109 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Embedded
5
+
6
+ # This module provides convenience macros for using cyclic embedded
7
+ # relations.
8
+ module Cyclic
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ class_attribute :cyclic
13
+ end
14
+
15
+ module ClassMethods
16
+
17
+ # Create a cyclic embedded relation that creates a tree hierarchy for
18
+ # the document and many embedded child documents.
19
+ #
20
+ # @example Set up a recursive embeds many.
21
+ #
22
+ # class Role
23
+ # include Mongoid::Document
24
+ # recursively_embeds_many
25
+ # end
26
+ #
27
+ # @example The previous example is a shorcut for this.
28
+ #
29
+ # class Role
30
+ # include Mongoid::Document
31
+ # embeds_many :child_roles, :class_name => "Role", :cyclic => true
32
+ # embedded_in :parent_role, :class_name => "Role", :cyclic => true
33
+ # end
34
+ #
35
+ # This provides the default nomenclature for accessing a parent document
36
+ # or its children.
37
+ #
38
+ # @since 2.0.0.rc.1
39
+ def recursively_embeds_many(options = {})
40
+ embeds_many(
41
+ cyclic_child_name,
42
+ options.merge(class_name: self.name, cyclic: true)
43
+ )
44
+ embedded_in cyclic_parent_name, class_name: self.name, cyclic: true
45
+ end
46
+
47
+ # Create a cyclic embedded relation that creates a single self
48
+ # referencing relationship for a parent and a single child.
49
+ #
50
+ # @example Set up a recursive embeds one.
51
+ #
52
+ # class Role
53
+ # include Mongoid::Document
54
+ # recursively_embeds_one
55
+ # end
56
+ #
57
+ # @example The previous example is a shorcut for this.
58
+ #
59
+ # class Role
60
+ # include Mongoid::Document
61
+ # embeds_one :child_role, :class_name => "Role", :cyclic => true
62
+ # embedded_in :parent_role, :class_name => "Role", :cyclic => true
63
+ # end
64
+ #
65
+ # This provides the default nomenclature for accessing a parent document
66
+ # or its children.
67
+ #
68
+ # @since 2.0.0.rc.1
69
+ def recursively_embeds_one(options = {})
70
+ embeds_one(
71
+ cyclic_child_name(false),
72
+ options.merge(class_name: self.name, cyclic: true)
73
+ )
74
+ embedded_in cyclic_parent_name, class_name: self.name, cyclic: true
75
+ end
76
+
77
+ private
78
+
79
+ # Determines the parent name given the class.
80
+ #
81
+ # @example Determine the parent name.
82
+ # Role.cyclic_parent_name
83
+ #
84
+ # @return [ String ] "parent_" plus the class name underscored.
85
+ #
86
+ # @since 2.0.0.rc.1
87
+ def cyclic_parent_name
88
+ ("parent_" << self.name.demodulize.underscore.singularize).to_sym
89
+ end
90
+
91
+ # Determines the child name given the class.
92
+ #
93
+ # @example Determine the child name.
94
+ # Role.cyclic_child_name
95
+ #
96
+ # @param [ true, false ] many Is the a many relation?
97
+ #
98
+ # @return [ String ] "child_" plus the class name underscored in
99
+ # singular or plural form.
100
+ #
101
+ # @since 2.0.0.rc.1
102
+ def cyclic_child_name(many = true)
103
+ ("child_" << self.name.demodulize.underscore.send(many ? :pluralize : :singularize)).to_sym
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,56 @@
1
+ module Mongoid
2
+ module Association
3
+ module Embedded
4
+ class EmbeddedIn
5
+
6
+ # The Binding object for embedded_in associations.
7
+ #
8
+ # @since 7.0
9
+ class Binding
10
+ include Bindable
11
+
12
+ # Binds the base object to the inverse of the relation. This is so we
13
+ # are referenced to the actual objects themselves on both sides.
14
+ #
15
+ # This case sets the association metadata on the inverse object as well as the
16
+ # document itself.
17
+ #
18
+ # @example Bind the documents.
19
+ # name.person.bind(:continue => true)
20
+ # name.person = Person.new
21
+ #
22
+ # @since 2.0.0.rc.1
23
+ def bind_one
24
+ _base._association = _association.inverse_association(_target) unless _base._association
25
+ _base.parentize(_target)
26
+ binding do
27
+ if _base.embedded_many?
28
+ _target.do_or_do_not(_association.inverse(_target)).push(_base)
29
+ else
30
+ _target.do_or_do_not(_association.inverse_setter(_target), _base)
31
+ end
32
+ end
33
+ end
34
+
35
+ # Unbinds the base object and the inverse, caused by setting the
36
+ # reference to nil.
37
+ #
38
+ # @example Unbind the document.
39
+ # name.person.unbind(:continue => true)
40
+ # name.person = nil
41
+ #
42
+ # @since 2.0.0.rc.1
43
+ def unbind_one
44
+ binding do
45
+ if _base.embedded_many?
46
+ _target.do_or_do_not(_association.inverse(_target)).delete(_base)
47
+ else
48
+ _target.do_or_do_not(_association.inverse_setter(_target), nil)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -1,9 +1,13 @@
1
- # encoding: utf-8
2
1
  module Mongoid
3
- module Relations
4
- module Builders
5
- module Embedded
6
- class In < Builder
2
+ module Association
3
+ module Embedded
4
+ class EmbeddedIn
5
+
6
+ # The Builder behavior for embedded_in associations.
7
+ #
8
+ # @since 7.0
9
+ module Buildable
10
+ include Threaded::Lifecycle
7
11
 
8
12
  # This builder doesn't actually build anything, just returns the
9
13
  # parent since it should already be instantiated.
@@ -11,10 +15,12 @@ module Mongoid
11
15
  # @example Build the document.
12
16
  # Builder.new(meta, attrs).build
13
17
  #
18
+ # @param [ Object ] base The object.
19
+ # @param [ Object ] object The parent hash or document.
14
20
  # @param [ String ] type Not used in this context.
15
21
  #
16
22
  # @return [ Document ] A single document.
17
- def build(type = nil)
23
+ def build(base, object, type = nil)
18
24
  return object unless object.is_a?(Hash)
19
25
  if _loading?
20
26
  Factory.from_db(klass, object)
@@ -0,0 +1,121 @@
1
+ module Mongoid
2
+ module Association
3
+ module Embedded
4
+ class EmbeddedIn
5
+
6
+ class Proxy < Association::One
7
+
8
+ # Instantiate a new embedded_in relation.
9
+ #
10
+ # @example Create the new relation.
11
+ # Association::Embedded::EmbeddedIn.new(person, address, association)
12
+ #
13
+ # @param [ Document ] base The document the relation hangs off of.
14
+ # @param [ Document ] target The target (parent) of the relation.
15
+ # @param [ Association ] association The association metadata.
16
+ #
17
+ # @return [ In ] The proxy.
18
+ def initialize(base, target, association)
19
+ init(base, target, association) do
20
+ characterize_one(_target)
21
+ bind_one
22
+ end
23
+ end
24
+
25
+ # Substitutes the supplied target documents for the existing document
26
+ # in the relation.
27
+ #
28
+ # @example Substitute the new document.
29
+ # person.name.substitute(new_name)
30
+ #
31
+ # @param [ Document ] replacement A document to replace the target.
32
+ #
33
+ # @return [ Document, nil ] The relation or nil.
34
+ #
35
+ # @since 2.0.0.rc.1
36
+ def substitute(replacement)
37
+ unbind_one
38
+ unless replacement
39
+ _base.delete if persistable?
40
+ return nil
41
+ end
42
+ _base.new_record = true
43
+ self._target = replacement
44
+ bind_one
45
+ self
46
+ end
47
+
48
+ private
49
+
50
+ # Instantiate the binding associated with this relation.
51
+ #
52
+ # @example Get the binding.
53
+ # binding([ address ])
54
+ #
55
+ # @return [ Binding ] A binding object.
56
+ #
57
+ # @since 2.0.0.rc.1
58
+ def binding
59
+ Binding.new(_base, _target, _association)
60
+ end
61
+
62
+ # Characterize the document.
63
+ #
64
+ # @example Set the base association.
65
+ # object.characterize_one(document)
66
+ #
67
+ # @param [ Document ] document The document to set the association metadata on.
68
+ #
69
+ # @since 2.1.0
70
+ def characterize_one(document)
71
+ unless _base._association
72
+ _base._association = _association.inverse_association(document)
73
+ end
74
+ end
75
+
76
+ # Are we able to persist this relation?
77
+ #
78
+ # @example Can we persist the relation?
79
+ # relation.persistable?
80
+ #
81
+ # @return [ true, false ] If the relation is persistable.
82
+ #
83
+ # @since 2.1.0
84
+ def persistable?
85
+ _target.persisted? && !_binding? && !_building?
86
+ end
87
+
88
+ class << self
89
+
90
+ # Returns true if the relation is an embedded one. In this case
91
+ # always true.
92
+ #
93
+ # @example Is this relation embedded?
94
+ # Association::Embedded::EmbeddedIn.embedded?
95
+ #
96
+ # @return [ true ] true.
97
+ #
98
+ # @since 2.0.0.rc.1
99
+ def embedded?
100
+ true
101
+ end
102
+
103
+ # Get the path calculator for the supplied document.
104
+ #
105
+ # @example Get the path calculator.
106
+ # Proxy.path(document)
107
+ #
108
+ # @param [ Document ] document The document to calculate on.
109
+ #
110
+ # @return [ Root ] The root atomic path calculator.
111
+ #
112
+ # @since 2.1.0
113
+ def path(document)
114
+ Mongoid::Atomic::Paths::Root.new(document)
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end