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,127 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Nested
5
+ class One
6
+ include Buildable
7
+
8
+ attr_accessor :destroy
9
+
10
+
11
+ # Builds the relation depending on the attributes and the options
12
+ # passed to the macro.
13
+ #
14
+ # @example Build a 1-1 nested document.
15
+ # one.build(person, as: :admin)
16
+ #
17
+ # @note This attempts to perform 3 operations, either one of an update of
18
+ # the existing relation, a replacement of the relation with a new
19
+ # document, or a removal of the relation.
20
+ #
21
+ # @param [ Document ] parent The parent document.
22
+ #
23
+ # @return [ Document ] The built document.
24
+ #
25
+ # @since 2.0.0
26
+ def build(parent)
27
+ return if reject?(parent, attributes)
28
+ @existing = parent.send(association.name)
29
+ if update?
30
+ attributes.delete_id
31
+ existing.assign_attributes(attributes)
32
+ elsif replace?
33
+ parent.send(association.setter, Factory.build(@class_name, attributes))
34
+ elsif delete?
35
+ parent.send(association.setter, nil)
36
+ end
37
+ end
38
+
39
+ # Create the new builder for nested attributes on one-to-one
40
+ # relations.
41
+ #
42
+ # @example Instantiate the builder.
43
+ # One.new(association, attributes)
44
+ #
45
+ # @param [ Association ] association The association metadata.
46
+ # @param [ Hash ] attributes The attributes hash to attempt to set.
47
+ # @param [ Hash ] options The options defined.
48
+ #
49
+ # @since 2.0.0
50
+ def initialize(association, attributes, options)
51
+ @attributes = attributes.with_indifferent_access
52
+ @association = association
53
+ @options = options
54
+ @class_name = options[:class_name] ? options[:class_name].constantize : association.klass
55
+ @destroy = @attributes.delete(:_destroy)
56
+ end
57
+
58
+ private
59
+
60
+ # Is the id in the attribtues acceptable for allowing an update to
61
+ # the existing relation?
62
+ #
63
+ # @api private
64
+ #
65
+ # @example Is the id acceptable?
66
+ # one.acceptable_id?
67
+ #
68
+ # @return [ true, false ] If the id part of the logic will allow an update.
69
+ #
70
+ # @since 2.0.0
71
+ def acceptable_id?
72
+ id = convert_id(existing.class, attributes[:id])
73
+ existing._id == id || id.nil? || (existing._id != id && update_only?)
74
+ end
75
+
76
+ # Can the existing relation be deleted?
77
+ #
78
+ # @example Can the existing object be deleted?
79
+ # one.delete?
80
+ #
81
+ # @return [ true, false ] If the relation should be deleted.
82
+ #
83
+ # @since 2.0.0
84
+ def delete?
85
+ destroyable? && !attributes[:id].nil?
86
+ end
87
+
88
+ # Can the existing relation potentially be destroyed?
89
+ #
90
+ # @example Is the object destroyable?
91
+ # one.destroyable?({ :_destroy => "1" })
92
+ #
93
+ # @return [ true, false ] If the relation can potentially be
94
+ # destroyed.
95
+ #
96
+ # @since 2.0.0
97
+ def destroyable?
98
+ Nested::DESTROY_FLAGS.include?(destroy) && allow_destroy?
99
+ end
100
+
101
+ # Is the document to be replaced?
102
+ #
103
+ # @example Is the document to be replaced?
104
+ # one.replace?
105
+ #
106
+ # @return [ true, false ] If the document should be replaced.
107
+ #
108
+ # @since 2.0.0
109
+ def replace?
110
+ !existing && !destroyable? && !attributes.blank?
111
+ end
112
+
113
+ # Should the document be updated?
114
+ #
115
+ # @example Should the document be updated?
116
+ # one.update?
117
+ #
118
+ # @return [ true, false ] If the object should have its attributes updated.
119
+ #
120
+ # @since 2.0.0
121
+ def update?
122
+ existing && !destroyable? && acceptable_id?
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,15 @@
1
+ require 'mongoid/association/nested/nested_buildable'
2
+ require 'mongoid/association/nested/many'
3
+ require 'mongoid/association/nested/one'
4
+
5
+ module Mongoid
6
+ module Association
7
+ module Nested
8
+
9
+ # The flags indicating that a relation can be destroyed.
10
+ #
11
+ # @since 7.0
12
+ DESTROY_FLAGS = [1, "1", true, "true"].freeze
13
+ end
14
+ end
15
+ end
@@ -1,10 +1,10 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Relations
3
+ module Association
4
4
 
5
5
  # This is the superclass for one to one relations and defines the common
6
6
  # behaviour or those proxies.
7
- class One < Proxy
7
+ class One < Association::Proxy
8
8
 
9
9
  # Clear this relation - same as calling #delete on the document.
10
10
  #
@@ -15,7 +15,7 @@ module Mongoid
15
15
  #
16
16
  # @since 3.0.0
17
17
  def clear
18
- target.delete
18
+ _target.delete
19
19
  end
20
20
 
21
21
  # Get all the documents in the relation that are loaded into memory.
@@ -27,7 +27,7 @@ module Mongoid
27
27
  #
28
28
  # @since 2.1.0
29
29
  def in_memory
30
- [ target ]
30
+ [ _target ]
31
31
  end
32
32
 
33
33
  # Since method_missing is overridden we should override this as well.
@@ -41,7 +41,7 @@ module Mongoid
41
41
  #
42
42
  # @since 2.1.8
43
43
  def respond_to?(name, include_private = false)
44
- target.respond_to?(name, include_private) || super
44
+ _target.respond_to?(name, include_private) || super
45
45
  end
46
46
 
47
47
  # Evolve the proxy document into an object id.
@@ -53,7 +53,7 @@ module Mongoid
53
53
  #
54
54
  # @since 4.0.0
55
55
  def __evolve_object_id__
56
- target._id
56
+ _target._id
57
57
  end
58
58
  end
59
59
  end
@@ -0,0 +1,152 @@
1
+ module Mongoid
2
+ module Association
3
+
4
+ module Options
5
+
6
+ # Returns the name of the parent to a polymorphic child.
7
+ #
8
+ # @return [ String, Symbol ] The name.
9
+ #
10
+ # @since 7.0
11
+ def as
12
+ @options[:as]
13
+ end
14
+
15
+ # Specify what happens to the associated object when the owner is destroyed.
16
+ #
17
+ # @return [ String ] The dependent option.
18
+ #
19
+ # @since 7.0
20
+ def dependent
21
+ @options[:dependent]
22
+ end
23
+
24
+ # The custom sorting options on the relation.
25
+ #
26
+ # @return [ Criteria::Queryable::Key ] The custom sorting options.
27
+ #
28
+ # @since 7.0
29
+ def order
30
+ @options[:order]
31
+ end
32
+
33
+ # Whether to index the primary or foreign key field.
34
+ #
35
+ # @return [ true, false ]
36
+ #
37
+ # @since 7.0
38
+ def indexed?
39
+ @indexed ||= !!@options[:index]
40
+ end
41
+
42
+ # Whether the association is autobuilding.
43
+ #
44
+ # @return [ true, false ]
45
+ #
46
+ # @since 7.0
47
+ def autobuilding?
48
+ !!@options[:autobuild]
49
+ end
50
+
51
+ # Is the relation cyclic.
52
+ #
53
+ # @return [ true, false ] Whether the relation is cyclic.
54
+ #
55
+ # @since 7.0
56
+ def cyclic?
57
+ !!@options[:cyclic]
58
+ end
59
+
60
+ # The name the owning object uses to refer to this relation.
61
+ #
62
+ # @return [ String ] The inverse_of option.
63
+ #
64
+ # @since 7.0
65
+ def inverse_of
66
+ @options[:inverse_of]
67
+ end
68
+
69
+ # Mongoid assumes that the field used to hold the primary key of the association is id.
70
+ # You can override this and explicitly specify the primary key with the :primary_key option.
71
+ #
72
+ # @return [ Symbol, String ] The primary key.
73
+ #
74
+ # @since 7.0
75
+ def primary_key
76
+ @primary_key ||= @options[:primary_key] ? @options[:primary_key].to_s : Relatable::PRIMARY_KEY_DEFAULT
77
+ end
78
+
79
+ # Options to save any loaded members and destroy members that are marked for destruction
80
+ # when the parent object is saved.
81
+ #
82
+ # @return [ true, false ] The autosave option.
83
+ #
84
+ # @since 7.0
85
+ def autosave
86
+ !!@options[:autosave]
87
+ end
88
+ alias :autosave? :autosave
89
+
90
+ # Whether the association is counter-cached.
91
+ #
92
+ # @return [ true, false ]
93
+ #
94
+ # @since 7.0
95
+ def counter_cached?
96
+ !!@options[:counter_cache]
97
+ end
98
+
99
+ # Whether this association is polymorphic.
100
+ #
101
+ # @return [ true, false ] Whether the association is polymorphic.
102
+ #
103
+ # @since 7.0
104
+ def polymorphic?; false; end
105
+
106
+ # Whether the relation has callbacks cascaded down from the parent.
107
+ #
108
+ # @return [ true, false ] Whether callbacks are cascaded.
109
+ #
110
+ # @since 7.0
111
+ def cascading_callbacks?
112
+ !!@options[:cascade_callbacks]
113
+ end
114
+
115
+ # The store_as option.
116
+ #
117
+ # @return [ nil ] Default is nil.
118
+ #
119
+ # @since 7.0
120
+ def store_as; end
121
+
122
+ # Whether the association has forced nil inverse (So no foreign keys are saved).
123
+ #
124
+ # @return [ false ] Default is false.
125
+ #
126
+ # @since 7.0
127
+ def forced_nil_inverse?; false; end
128
+
129
+ # The field for saving the associated object's type.
130
+ #
131
+ # @return [ nil ] Default is nil.
132
+ #
133
+ # @since 7.0
134
+ def type; end
135
+
136
+ # The field for saving the associated object's type.
137
+ #
138
+ # @return [ nil ] Default is nil.
139
+ #
140
+ # @since 7.0
141
+ def touch_field
142
+ @touch_field ||= options[:touch] if (options[:touch].is_a?(String) || options[:touch].is_a?(Symbol))
143
+ end
144
+
145
+ private
146
+
147
+ def touchable?
148
+ !!@options[:touch]
149
+ end
150
+ end
151
+ end
152
+ end
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- require "mongoid/relations/marshalable"
2
+ require "mongoid/association/marshalable"
3
3
 
4
4
  module Mongoid
5
- module Relations
5
+ module Association
6
6
 
7
7
  # This class is the superclass for all relation proxy objects, and contains
8
8
  # common behaviour for all of them.
@@ -18,29 +18,28 @@ module Mongoid
18
18
  include Threaded::Lifecycle
19
19
  include Marshalable
20
20
 
21
- attr_accessor :base, :__metadata, :target
22
- alias :relation_metadata :__metadata
21
+ attr_accessor :_base, :_association, :_target
23
22
 
24
23
  # Backwards compatibility with Mongoid beta releases.
25
- delegate :foreign_key, :inverse_foreign_key, to: :__metadata
24
+ delegate :foreign_key, :inverse_foreign_key, to: :_association
26
25
  delegate :bind_one, :unbind_one, to: :binding
27
- delegate :collection_name, to: :base
26
+ delegate :collection_name, to: :_base
28
27
 
29
- # Convenience for setting the target and the metadata properties since
28
+ # Convenience for setting the target and the association metadata properties since
30
29
  # all proxies will need to do this.
31
30
  #
32
31
  # @example Initialize the proxy.
33
- # proxy.init(person, name, metadata)
32
+ # proxy.init(person, name, association)
34
33
  #
35
34
  # @param [ Document ] base The base document on the proxy.
36
35
  # @param [ Document, Array<Document> ] target The target of the proxy.
37
- # @param [ Metadata ] metadata The relation's metadata.
36
+ # @param [ Association ] association The association metadata.
38
37
  #
39
38
  # @since 2.0.0.rc.1
40
- def init(base, target, metadata)
41
- @base, @target, @__metadata = base, target, metadata
39
+ def init(base, target, association)
40
+ @_base, @_target, @_association = base, target, association
42
41
  yield(self) if block_given?
43
- extend_proxies(metadata.extension) if metadata.extension?
42
+ extend_proxies(association.extension) if association.extension
44
43
  end
45
44
 
46
45
  # Allow extension to be an array and extend each module
@@ -48,7 +47,7 @@ module Mongoid
48
47
  extension.flatten.each {|ext| extend_proxy(ext) }
49
48
  end
50
49
 
51
- # Get the class from the metadata, or return nil if no metadata present.
50
+ # Get the class from the association, or return nil if no association present.
52
51
  #
53
52
  # @example Get the class.
54
53
  # proxy.klass
@@ -57,7 +56,7 @@ module Mongoid
57
56
  #
58
57
  # @since 3.0.15
59
58
  def klass
60
- __metadata ? __metadata.klass : nil
59
+ _association ? _association.klass : nil
61
60
  end
62
61
 
63
62
  # Resets the criteria inside the relation proxy. Used by many to many
@@ -68,7 +67,7 @@ module Mongoid
68
67
  #
69
68
  # @since 3.0.14
70
69
  def reset_unloaded
71
- target.reset_unloaded(criteria)
70
+ _target.reset_unloaded(criteria)
72
71
  end
73
72
 
74
73
  # The default substitutable object for a relation proxy is the clone of
@@ -81,7 +80,7 @@ module Mongoid
81
80
  #
82
81
  # @since 2.1.6
83
82
  def substitutable
84
- target
83
+ _target
85
84
  end
86
85
 
87
86
  protected
@@ -95,20 +94,20 @@ module Mongoid
95
94
  #
96
95
  # @since 2.0.0
97
96
  def collection
98
- root = base._root
97
+ root = _base._root
99
98
  root.collection unless root.embedded?
100
99
  end
101
100
 
102
- # Takes the supplied document and sets the metadata on it.
101
+ # Takes the supplied document and sets the association on it.
103
102
  #
104
- # @example Set the metadata.
103
+ # @example Set the association metadata.
105
104
  # proxt.characterize_one(name)
106
105
  #
107
106
  # @param [ Document ] document The document to set on.
108
107
  #
109
108
  # @since 2.0.0.rc.4
110
109
  def characterize_one(document)
111
- document.__metadata = __metadata unless document.__metadata
110
+ document._association = _association unless document._association
112
111
  end
113
112
 
114
113
  # Default behavior of method missing should be to delegate all calls
@@ -118,7 +117,7 @@ module Mongoid
118
117
  # @param [ Array ] args The arguments passed to the method.
119
118
  #
120
119
  def method_missing(name, *args, &block)
121
- target.send(name, *args, &block)
120
+ _target.send(name, *args, &block)
122
121
  end
123
122
 
124
123
  # When the base document illegally references an embedded document this
@@ -131,7 +130,7 @@ module Mongoid
131
130
  #
132
131
  # @since 2.0.0
133
132
  def raise_mixed
134
- raise Errors::MixedRelations.new(base.class, __metadata.klass)
133
+ raise Errors::MixedRelations.new(_base.class, _association.klass)
135
134
  end
136
135
 
137
136
  # When the base is not yet saved and the user calls create or create!
@@ -146,30 +145,7 @@ module Mongoid
146
145
  #
147
146
  # @since 2.0.0.rc.6
148
147
  def raise_unsaved(doc)
149
- raise Errors::UnsavedDocument.new(base, doc)
150
- end
151
-
152
- # Return the name of defined callback method
153
- #
154
- # @example returns the before_add callback method name
155
- # callback_method(:before_add)
156
- #
157
- # @param [ Symbol ] callback_name Which callback
158
- #
159
- # @return [ Array ] with callback methods to be executed, the array may have symbols and Procs
160
- #
161
- # @since 3.1.0
162
- def callback_method(callback_name)
163
- methods = []
164
- metadata = __metadata[callback_name]
165
- if metadata
166
- if metadata.is_a?(Array)
167
- methods.concat(metadata)
168
- else
169
- methods << metadata
170
- end
171
- end
172
- methods
148
+ raise Errors::UnsavedDocument.new(_base, doc)
173
149
  end
174
150
 
175
151
  # Executes a callback method
@@ -181,14 +157,11 @@ module Mongoid
181
157
  #
182
158
  # @since 3.1.0
183
159
  def execute_callback(callback, doc)
184
- callback_method = callback_method(callback)
185
- if callback_method
186
- callback_method.each do |c|
187
- if c.is_a? Proc
188
- c.call(base, doc)
189
- else
190
- base.send c, doc
191
- end
160
+ _association.get_callbacks(callback).each do |c|
161
+ if c.is_a? Proc
162
+ c.call(_base, doc)
163
+ else
164
+ _base.send c, doc
192
165
  end
193
166
  end
194
167
  end
@@ -198,16 +171,16 @@ module Mongoid
198
171
  # Apply ordering to the criteria if it was defined on the relation.
199
172
  #
200
173
  # @example Apply the ordering.
201
- # Proxy.apply_ordering(criteria, metadata)
174
+ # Proxy.apply_ordering(criteria, association)
202
175
  #
203
176
  # @param [ Criteria ] criteria The criteria to modify.
204
- # @param [ Metadata ] metadata The relation metadata.
177
+ # @param [ Association ] association The association metadata.
205
178
  #
206
179
  # @return [ Criteria ] The ordered criteria.
207
180
  #
208
181
  # @since 3.0.6
209
- def apply_ordering(criteria, metadata)
210
- metadata.order ? criteria.order_by(metadata.order) : criteria
182
+ def apply_ordering(criteria, association)
183
+ association.order ? criteria.order_by(association.order) : criteria
211
184
  end
212
185
  end
213
186
  end
@@ -0,0 +1,79 @@
1
+ module Mongoid
2
+ module Association
3
+ module Referenced
4
+
5
+ module AutoSave
6
+ extend ActiveSupport::Concern
7
+
8
+ # Used to prevent infinite loops in associated autosaves.
9
+ #
10
+ # @example Is the document autosaved?
11
+ # document.autosaved?
12
+ #
13
+ # @return [ true, false ] Has the document already been autosaved?
14
+ #
15
+ # @since 3.0.0
16
+ def autosaved?
17
+ Threaded.autosaved?(self)
18
+ end
19
+
20
+ # Begin the associated autosave.
21
+ #
22
+ # @example Begin autosave.
23
+ # document.__autosaving__
24
+ #
25
+ # @since 3.1.3
26
+ def __autosaving__
27
+ Threaded.begin_autosave(self)
28
+ yield
29
+ ensure
30
+ Threaded.exit_autosave(self)
31
+ end
32
+
33
+ # Check if there is changes for auto-saving
34
+ #
35
+ # @example Return true if there is changes on self or in
36
+ # autosaved relations.
37
+ # document.changed_for_autosave?
38
+ #
39
+ # @since 3.1.3
40
+ def changed_for_autosave?(doc)
41
+ doc.new_record? || doc.changed? || doc.marked_for_destruction?
42
+ end
43
+
44
+ # Define the autosave method on an association's owning class for
45
+ # an associated object.
46
+ #
47
+ # @example Define the autosave method:
48
+ # Association::Referenced::Autosave.define_autosave!(association)
49
+ #
50
+ # @param [ Association ] association The association for which autosaving is enabled.
51
+ #
52
+ # @return [ Class ] The association's owner class.
53
+ #
54
+ # @since 7.0
55
+ def self.define_autosave!(association)
56
+ association.inverse_class.tap do |klass|
57
+ save_method = :"autosave_documents_for_#{association.name}"
58
+ klass.send(:define_method, save_method) do
59
+ if before_callback_halted?
60
+ self.before_callback_halted = false
61
+ else
62
+ __autosaving__ do
63
+ if relation = ivar(association.name)
64
+ Array(relation).each do |doc|
65
+ doc.with(persistence_context) do |d|
66
+ d.save
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ klass.after_save save_method, unless: :autosaved?
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end