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,290 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
- module Referenced
5
-
6
- # This class defines the behaviour for all relations that are a
7
- # one-to-one between documents in different collections.
8
- class One < Relations::One
9
-
10
- # The allowed options when defining this relation.
11
- #
12
- # @return [ Array<Symbol> ] The allowed options when defining this relation.
13
- #
14
- # @since 6.0.0
15
- VALID_OPTIONS = [
16
- :as,
17
- :autobuild,
18
- :autosave,
19
- :dependent,
20
- :foreign_key,
21
- :primary_key
22
- ].freeze
23
-
24
- # Instantiate a new references_one relation. Will set the foreign key
25
- # and the base on the inverse object.
26
- #
27
- # @example Create the new relation.
28
- # Referenced::One.new(base, target, metadata)
29
- #
30
- # @param [ Document ] base The document this relation hangs off of.
31
- # @param [ Document ] target The target (child) of the relation.
32
- # @param [ Metadata ] metadata The relation's metadata.
33
- def initialize(base, target, metadata)
34
- init(base, target, metadata) do
35
- raise_mixed if klass.embedded? && !klass.cyclic?
36
- characterize_one(target)
37
- bind_one
38
- target.save if persistable?
39
- end
40
- end
41
-
42
- # Removes the association between the base document and the target
43
- # document by deleting the foreign key and the reference, orphaning
44
- # the target document in the process.
45
- #
46
- # @example Nullify the relation.
47
- # person.game.nullify
48
- #
49
- # @since 2.0.0.rc.1
50
- def nullify
51
- unbind_one
52
- target.save
53
- end
54
-
55
- # Substitutes the supplied target document for the existing document
56
- # in the relation. If the new target is nil, perform the necessary
57
- # deletion.
58
- #
59
- # @example Replace the relation.
60
- # person.game.substitute(new_game)
61
- #
62
- # @param [ Array<Document> ] replacement The replacement target.
63
- #
64
- # @return [ One ] The relation.
65
- #
66
- # @since 2.0.0.rc.1
67
- def substitute(replacement)
68
- unbind_one
69
- if persistable?
70
- if __metadata.destructive?
71
- send(__metadata.dependent)
72
- else
73
- save if persisted?
74
- end
75
- end
76
- One.new(base, replacement, __metadata) if replacement
77
- end
78
-
79
- private
80
-
81
- # Instantiate the binding associated with this relation.
82
- #
83
- # @example Get the binding.
84
- # relation.binding([ address ])
85
- #
86
- # @return [ Binding ] The binding object.
87
- def binding
88
- Bindings::Referenced::One.new(base, target, __metadata)
89
- end
90
-
91
- # Are we able to persist this relation?
92
- #
93
- # @example Can we persist the relation?
94
- # relation.persistable?
95
- #
96
- # @return [ true, false ] If the relation is persistable.
97
- #
98
- # @since 2.1.0
99
- def persistable?
100
- base.persisted? && !_binding? && !_building?
101
- end
102
-
103
- class << self
104
-
105
- # Return the builder that is responsible for generating the documents
106
- # that will be used by this relation.
107
- #
108
- # @example Get the builder.
109
- # Referenced::One.builder(meta, object)
110
- #
111
- # @param [ Document ] base The base document.
112
- # @param [ Metadata ] meta The metadata of the relation.
113
- # @param [ Document, Hash ] object A document or attributes to build
114
- # with.
115
- #
116
- # @return [ Builder ] A new builder object.
117
- #
118
- # @since 2.0.0.rc.1
119
- def builder(base, meta, object)
120
- Builders::Referenced::One.new(base, meta, object)
121
- end
122
-
123
- # Get the standard criteria used for querying this relation.
124
- #
125
- # @example Get the criteria.
126
- # Proxy.criteria(meta, id, Model)
127
- #
128
- # @param [ Metadata ] metadata The metadata.
129
- # @param [ Object ] object The value of the foreign key.
130
- # @param [ Class ] type The optional type.
131
- #
132
- # @return [ Criteria ] The criteria.
133
- #
134
- # @since 2.1.0
135
- def criteria(metadata, object, type = nil)
136
- crit = metadata.klass.where(metadata.foreign_key => object)
137
- if metadata.polymorphic?
138
- crit = crit.where(metadata.type => type.name)
139
- end
140
- crit
141
- end
142
-
143
- def eager_load_klass
144
- Relations::Eager::HasOne
145
- end
146
-
147
- # Returns true if the relation is an embedded one. In this case
148
- # always false.
149
- #
150
- # @example Is this relation embedded?
151
- # Referenced::One.embedded?
152
- #
153
- # @return [ false ] Always false.
154
- #
155
- # @since 2.0.0.rc.1
156
- def embedded?
157
- false
158
- end
159
-
160
- # Get the foreign key for the provided name.
161
- #
162
- # @example Get the foreign key.
163
- # Referenced::One.foreign_key(:person)
164
- #
165
- # @param [ Symbol ] name The name.
166
- #
167
- # @return [ String ] The foreign key.
168
- #
169
- # @since 3.0.0
170
- def foreign_key(name)
171
- "#{name}#{foreign_key_suffix}"
172
- end
173
-
174
- # Get the default value for the foreign key.
175
- #
176
- # @example Get the default.
177
- # Referenced::One.foreign_key_default
178
- #
179
- # @return [ nil ] Always nil.
180
- #
181
- # @since 2.0.0.rc.1
182
- def foreign_key_default
183
- nil
184
- end
185
-
186
- # Returns the suffix of the foreign key field, either "_id" or "_ids".
187
- #
188
- # @example Get the suffix for the foreign key.
189
- # Referenced::One.foreign_key_suffix
190
- #
191
- # @return [ String ] "_id"
192
- #
193
- # @since 2.0.0.rc.1
194
- def foreign_key_suffix
195
- "_id"
196
- end
197
-
198
- # Returns the macro for this relation. Used mostly as a helper in
199
- # reflection.
200
- #
201
- # @example Get the macro.
202
- # Referenced::One.macro
203
- #
204
- # @return [ Symbol ] :has_one.
205
- def macro
206
- :has_one
207
- end
208
-
209
- # Return the nested builder that is responsible for generating the documents
210
- # that will be used by this relation.
211
- #
212
- # @example Get the nested builder.
213
- # Referenced::One.builder(attributes, options)
214
- #
215
- # @param [ Metadata ] metadata The relation metadata.
216
- # @param [ Hash ] attributes The attributes to build with.
217
- # @param [ Hash ] options The options for the builder.
218
- #
219
- # @option options [ true, false ] :allow_destroy Can documents be
220
- # deleted?
221
- # @option options [ Integer ] :limit Max number of documents to
222
- # create at once.
223
- # @option options [ Proc, Symbol ] :reject_if If documents match this
224
- # option then they are ignored.
225
- # @option options [ true, false ] :update_only Only existing documents
226
- # can be modified.
227
- #
228
- # @return [ NestedBuilder ] A newly instantiated nested builder object.
229
- #
230
- # @since 2.0.0.rc.1
231
- def nested_builder(metadata, attributes, options)
232
- Builders::NestedAttributes::One.new(metadata, attributes, options)
233
- end
234
-
235
- # Get the path calculator for the supplied document.
236
- #
237
- # @example Get the path calculator.
238
- # Proxy.path(document)
239
- #
240
- # @param [ Document ] document The document to calculate on.
241
- #
242
- # @return [ Root ] The root atomic path calculator.
243
- #
244
- # @since 2.1.0
245
- def path(document)
246
- Mongoid::Atomic::Paths::Root.new(document)
247
- end
248
-
249
- # Tells the caller if this relation is one that stores the foreign
250
- # key on its own objects.
251
- #
252
- # @example Does this relation store a foreign key?
253
- # Referenced::One.stores_foreign_key?
254
- #
255
- # @return [ false ] Always false.
256
- #
257
- # @since 2.0.0.rc.1
258
- def stores_foreign_key?
259
- false
260
- end
261
-
262
- # Get the valid options allowed with this relation.
263
- #
264
- # @example Get the valid options.
265
- # Relation.valid_options
266
- #
267
- # @return [ Array<Symbol> ] The valid options.
268
- #
269
- # @since 2.1.0
270
- def valid_options
271
- VALID_OPTIONS
272
- end
273
-
274
- # Get the default validation setting for the relation. Determines if
275
- # by default a validates associated will occur.
276
- #
277
- # @example Get the validation default.
278
- # Proxy.validation_default
279
- #
280
- # @return [ true, false ] The validation default.
281
- #
282
- # @since 2.1.9
283
- def validation_default
284
- true
285
- end
286
- end
287
- end
288
- end
289
- end
290
- end
@@ -1,169 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
-
5
- # This module handles the behaviour for synchronizing foreign keys between
6
- # both sides of a many to many relations.
7
- module Synchronization
8
- extend ActiveSupport::Concern
9
-
10
- # Is the document able to be synced on the inverse side? This is only if
11
- # the key has changed and the relation bindings have not been run.
12
- #
13
- # @example Are the foreign keys syncable?
14
- # document._syncable??(metadata)
15
- #
16
- # @param [ Metadata ] metadata The relation metadata.
17
- #
18
- # @return [ true, false ] If we can sync.
19
- #
20
- # @since 2.1.0
21
- def _syncable?(metadata)
22
- !_synced?(metadata.foreign_key) && send(metadata.foreign_key_check)
23
- end
24
-
25
- # Get the synced foreign keys.
26
- #
27
- # @example Get the synced foreign keys.
28
- # document._synced
29
- #
30
- # @return [ Hash ] The synced foreign keys.
31
- #
32
- # @since 2.1.0
33
- def _synced
34
- @_synced ||= {}
35
- end
36
-
37
- # Has the document been synced for the foreign key?
38
- #
39
- # @example Has the document been synced?
40
- # document._synced??
41
- #
42
- # @param [ String ] foreign_key The foreign key.
43
- #
44
- # @return [ true, false ] If we can sync.
45
- #
46
- # @since 2.1.0
47
- def _synced?(foreign_key)
48
- !!_synced[foreign_key]
49
- end
50
-
51
- # Update the inverse keys on destroy.
52
- #
53
- # @example Update the inverse keys.
54
- # document.remove_inverse_keys(metadata)
55
- #
56
- # @param [ Metadata ] meta The document metadata.
57
- #
58
- # @return [ Object ] The updated values.
59
- #
60
- # @since 2.2.1
61
- def remove_inverse_keys(meta)
62
- foreign_keys = send(meta.foreign_key)
63
- unless foreign_keys.nil? || foreign_keys.empty?
64
- meta.criteria(foreign_keys, self.class).pull(meta.inverse_foreign_key => _id)
65
- end
66
- end
67
-
68
- # Update the inverse keys for the relation.
69
- #
70
- # @example Update the inverse keys
71
- # document.update_inverse_keys(metadata)
72
- #
73
- # @param [ Metadata ] meta The document metadata.
74
- #
75
- # @return [ Object ] The updated values.
76
- #
77
- # @since 2.1.0
78
- def update_inverse_keys(meta)
79
- if changes.has_key?(meta.foreign_key)
80
- old, new = changes[meta.foreign_key]
81
- adds, subs = new - (old || []), (old || []) - new
82
-
83
- # If we are autosaving we don't want a duplicate to get added - the
84
- # $addToSet would run previously and then the $push and $each from the
85
- # inverse on the autosave would cause this. We delete each id from
86
- # what's in memory in case a mix of id addition and object addition
87
- # had occurred.
88
- if meta.autosave?
89
- send(meta.name).in_memory.each do |doc|
90
- adds.delete_one(doc._id)
91
- end
92
- end
93
-
94
- unless adds.empty?
95
- meta.criteria(adds, self.class).without_options.add_to_set(meta.inverse_foreign_key => _id)
96
- end
97
- unless subs.empty?
98
- meta.criteria(subs, self.class).without_options.pull(meta.inverse_foreign_key => _id)
99
- end
100
- end
101
- end
102
-
103
- module ClassMethods
104
-
105
- # Set up the syncing of many to many foreign keys.
106
- #
107
- # @example Set up the syncing.
108
- # Person.synced(metadata)
109
- #
110
- # @param [ Metadata ] metadata The relation metadata.
111
- #
112
- # @since 2.1.0
113
- def _synced(metadata)
114
- unless metadata.forced_nil_inverse?
115
- synced_save(metadata)
116
- synced_destroy(metadata)
117
- end
118
- end
119
-
120
- private
121
-
122
- # Set up the sync of inverse keys that needs to happen on a save.
123
- #
124
- # If the foreign key field has changed and the document is not
125
- # synced, $addToSet the new ids, $pull the ones no longer in the
126
- # array from the inverse side.
127
- #
128
- # @example Set up the save syncing.
129
- # Person.synced_save(metadata)
130
- #
131
- # @param [ Metadata ] metadata The relation metadata.
132
- #
133
- # @return [ Class ] The class getting set up.
134
- #
135
- # @since 2.1.0
136
- def synced_save(metadata)
137
- set_callback(
138
- :save,
139
- :after,
140
- if: ->(doc){ doc._syncable?(metadata) }
141
- ) do |doc|
142
- doc.update_inverse_keys(metadata)
143
- end
144
- self
145
- end
146
-
147
- # Set up the sync of inverse keys that needs to happen on a destroy.
148
- #
149
- # @example Set up the destroy syncing.
150
- # Person.synced_destroy(metadata)
151
- #
152
- # @param [ Metadata ] metadata The relation metadata.
153
- #
154
- # @return [ Class ] The class getting set up.
155
- #
156
- # @since 2.2.1
157
- def synced_destroy(metadata)
158
- set_callback(
159
- :destroy,
160
- :after
161
- ) do |doc|
162
- doc.remove_inverse_keys(metadata)
163
- end
164
- self
165
- end
166
- end
167
- end
168
- end
169
- end