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
checksums.yaml.gz.sig DELETED
@@ -1,2 +0,0 @@
1
- �]�h:Ǜ^����TA�����9���%l���=�c�o�E��p'=�eO�ï���첈.�*�_��H�ݻ��ɓf�Q\>�o��
2
- �����r7�7+��z����9woI�� kJ��Z%�sn����[Sh�NK�}4�l�<0G���O�x8��gOpp�ht��oc3��l�J�`�N�'�t���[h]+�g��`�P�2ޭ�M���3!z8R�r�6�M������L���N�[��z��,j ��;Ӑ
@@ -1,267 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
-
5
- # This module contains all the behaviour related to accessing relations
6
- # through the getters and setters, and how to delegate to builders to
7
- # create new ones.
8
- module Accessors
9
- extend ActiveSupport::Concern
10
-
11
- # Builds the related document and creates the relation unless the
12
- # document is nil, then sets the relation on this document.
13
- #
14
- # @example Build the relation.
15
- # person.__build__(:addresses, { :_id => 1 }, metadata)
16
- #
17
- # @param [ String, Symbol ] name The name of the relation.
18
- # @param [ Hash, BSON::ObjectId ] object The id or attributes to use.
19
- # @param [ Metadata ] metadata The relation's metadata.
20
- #
21
- # @return [ Proxy ] The relation.
22
- #
23
- # @since 2.0.0.rc.1
24
- def __build__(name, object, metadata)
25
- relation = create_relation(object, metadata)
26
- set_relation(name, relation)
27
- end
28
-
29
- # Create a relation from an object and metadata.
30
- #
31
- # @example Create the relation.
32
- # person.create_relation(document, metadata)
33
- #
34
- # @param [ Document, Array<Document> ] object The relation target.
35
- # @param [ Metadata ] metadata The relation metadata.
36
- #
37
- # @return [ Proxy ] The relation.
38
- #
39
- # @since 2.0.0.rc.1
40
- def create_relation(object, metadata)
41
- type = @attributes[metadata.inverse_type]
42
- target = metadata.builder(self, object).build(type)
43
- target ? metadata.relation.new(self, target, metadata) : nil
44
- end
45
-
46
- # Resets the criteria inside the relation proxy. Used by many to many
47
- # relations to keep the underlying ids array in sync.
48
- #
49
- # @example Reset the relation criteria.
50
- # person.reset_relation_criteria(:preferences)
51
- #
52
- # @param [ Symbol ] name The name of the relation.
53
- #
54
- # @since 3.0.14
55
- def reset_relation_criteria(name)
56
- if instance_variable_defined?("@_#{name}")
57
- send(name).reset_unloaded
58
- end
59
- end
60
-
61
- # Set the supplied relation to an instance variable on the class with the
62
- # provided name. Used as a helper just for code cleanliness.
63
- #
64
- # @example Set the proxy on the document.
65
- # person.set(:addresses, addresses)
66
- #
67
- # @param [ String, Symbol ] name The name of the relation.
68
- # @param [ Proxy ] relation The relation to set.
69
- #
70
- # @return [ Proxy ] The relation.
71
- #
72
- # @since 2.0.0.rc.1
73
- def set_relation(name, relation)
74
- instance_variable_set("@_#{name}", relation)
75
- end
76
-
77
- private
78
-
79
- # Get the relation. Extracted out from the getter method to avoid
80
- # infinite recursion when overriding the getter.
81
- #
82
- # @api private
83
- #
84
- # @example Get the relation.
85
- # document.get_relation(:name, metadata)
86
- #
87
- # @param [ Symbol ] name The name of the relation.
88
- # @param [ Metadata ] metadata The relation metadata.
89
- # @param [ true, false ] reload If the relation is to be reloaded.
90
- #
91
- # @return [ Proxy ] The relation.
92
- #
93
- # @since 3.0.16
94
- def get_relation(name, metadata, object, reload = false)
95
- if !reload && (value = ivar(name)) != false
96
- value
97
- else
98
- _building do
99
- _loading do
100
- if object && needs_no_database_query?(object, metadata)
101
- __build__(name, object, metadata)
102
- else
103
- __build__(name, attributes[metadata.key], metadata)
104
- end
105
- end
106
- end
107
- end
108
- end
109
-
110
- def needs_no_database_query?(object, metadata)
111
- object.is_a?(Document) && !object.embedded? &&
112
- object._id == attributes[metadata.key]
113
- end
114
-
115
- # Is the current code executing without autobuild functionality?
116
- #
117
- # @example Is autobuild disabled?
118
- # document.without_autobuild?
119
- #
120
- # @return [ true, false ] If autobuild is disabled.
121
- #
122
- # @since 3.0.0
123
- def without_autobuild?
124
- Threaded.executing?(:without_autobuild)
125
- end
126
-
127
- # Yield to the block with autobuild functionality turned off.
128
- #
129
- # @example Execute without autobuild.
130
- # document.without_autobuild do
131
- # document.name
132
- # end
133
- #
134
- # @return [ Object ] The result of the yield.
135
- #
136
- # @since 3.0.0
137
- def without_autobuild
138
- Threaded.begin_execution("without_autobuild")
139
- yield
140
- ensure
141
- Threaded.exit_execution("without_autobuild")
142
- end
143
-
144
- module ClassMethods
145
-
146
- # Adds the existence check for relations.
147
- #
148
- # @example Add the existence check.
149
- # Person.existence_check(:name, meta)
150
- #
151
- # @example Check if a relation exists.
152
- # person = Person.new
153
- # person.has_game?
154
- # person.game?
155
- #
156
- # @param [ String, Symbol ] name The name of the relation.
157
- #
158
- # @return [ Class ] The model being set up.
159
- #
160
- # @since 3.0.0
161
- def existence_check(name)
162
- module_eval <<-END, __FILE__, __LINE__ + 1
163
- def #{name}?
164
- without_autobuild { !__send__(:#{name}).blank? }
165
- end
166
- alias :has_#{name}? :#{name}?
167
- END
168
- self
169
- end
170
-
171
- # Defines the getter for the relation. Nothing too special here: just
172
- # return the instance variable for the relation if it exists or build
173
- # the thing.
174
- #
175
- # @example Set up the getter for the relation.
176
- # Person.getter("addresses", metadata)
177
- #
178
- # @param [ String, Symbol ] name The name of the relation.
179
- # @param [ Metadata ] metadata The metadata for the relation.
180
- #
181
- # @return [ Class ] The class being set up.
182
- #
183
- # @since 2.0.0.rc.1
184
- def getter(name, metadata)
185
- re_define_method(name) do |reload = false|
186
- value = get_relation(name, metadata, nil, reload)
187
- if value.nil? && metadata.autobuilding? && !without_autobuild?
188
- value = send("build_#{name}")
189
- end
190
- value
191
- end
192
- self
193
- end
194
-
195
- # Defines the getter for the ids of documents in the relation. Should
196
- # be specify only for referenced many relations.
197
- #
198
- # @example Set up the ids getter for the relation.
199
- # Person.ids_getter("addresses", metadata)
200
- #
201
- # @param [ String, Symbol ] name The name of the relation.
202
- #
203
- # @return [ Class ] The class being set up.
204
- def ids_getter(name, metadata)
205
- ids_method = "#{name.to_s.singularize}_ids"
206
- re_define_method(ids_method) do
207
- send(name).only(:id).map(&:id)
208
- end
209
- self
210
- end
211
-
212
- # Defines the setter for the relation. This does a few things based on
213
- # some conditions. If there is an existing association, a target
214
- # substitution will take place, otherwise a new relation will be
215
- # created with the supplied target.
216
- #
217
- # @example Set up the setter for the relation.
218
- # Person.setter("addresses", metadata)
219
- #
220
- # @param [ String, Symbol ] name The name of the relation.
221
- # @param [ Metadata ] metadata The metadata for the relation.
222
- #
223
- # @return [ Class ] The class being set up.
224
- #
225
- # @since 2.0.0.rc.1
226
- def setter(name, metadata)
227
- re_define_method("#{name}=") do |object|
228
- without_autobuild do
229
- if value = get_relation(name, metadata, object)
230
- if value.respond_to?(:substitute)
231
- set_relation(name, value.substitute(object.substitutable))
232
- else
233
- value = __build__(name, value, metadata)
234
- set_relation(name, value.substitute(object.substitutable))
235
- end
236
- else
237
- __build__(name, object.substitutable, metadata)
238
- end
239
- end
240
- end
241
- self
242
- end
243
-
244
- # Defines the setter method that allows you to set documents
245
- # in this relation by their ids. The defined setter, finds
246
- # documents with given ids and invokes regular relation setter
247
- # with found documents. Ids setters should be defined only for
248
- # referenced many relations.
249
- #
250
- # @example Set up the id_setter for the relation.
251
- # Person.ids_setter("addesses", metadata)
252
- #
253
- # @param [ String, Symbol ] name The name of the relation.
254
- # @param [ Metadata ] metadata The metadata for the relation.
255
- #
256
- # @return [ Class ] The class being set up.
257
- def ids_setter(name, metadata)
258
- ids_method = "#{name.to_s.singularize}_ids="
259
- re_define_method(ids_method) do |ids|
260
- send(metadata.setter, metadata.klass.find(ids.reject(&:blank?)))
261
- end
262
- self
263
- end
264
- end
265
- end
266
- end
267
- end
@@ -1,94 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
-
5
- # This module contains the behaviour for auto-saving relations in
6
- # different collections.
7
- module AutoSave
8
- extend ActiveSupport::Concern
9
-
10
- # Used to prevent infinite loops in associated autosaves.
11
- #
12
- # @example Is the document autosaved?
13
- # document.autosaved?
14
- #
15
- # @return [ true, false ] Has the document already been autosaved?
16
- #
17
- # @since 3.0.0
18
- def autosaved?
19
- Threaded.autosaved?(self)
20
- end
21
-
22
- # Begin the associated autosave.
23
- #
24
- # @example Begin autosave.
25
- # document.__autosaving__
26
- #
27
- # @since 3.1.3
28
- def __autosaving__
29
- Threaded.begin_autosave(self)
30
- yield
31
- ensure
32
- Threaded.exit_autosave(self)
33
- end
34
-
35
- # Check if there is changes for auto-saving
36
- #
37
- # @example Return true if there is changes on self or in
38
- # autosaved relations.
39
- # document.changed_for_autosave?
40
- #
41
- # @since 3.1.3
42
- def changed_for_autosave?(doc)
43
- doc.new_record? || doc.changed? || doc.marked_for_destruction?
44
- end
45
-
46
- module ClassMethods
47
-
48
- # Set up the autosave behaviour for references many and references one
49
- # relations. When the option is set to true, these relations will get
50
- # saved automatically when the parent saved, if they are dirty.
51
- #
52
- # @example Set up autosave options.
53
- # Person.autosave(metadata)
54
- #
55
- # @param [ Metadata ] metadata The relation metadata.
56
- #
57
- # @since 2.0.0.rc.1
58
- def autosave(metadata)
59
- if metadata.autosave? && !metadata.embedded?
60
- save_method = :"autosave_documents_for_#{metadata.name}"
61
- define_method(save_method) do
62
- if before_callback_halted?
63
- self.before_callback_halted = false
64
- else
65
- __autosaving__ do
66
- if relation = ivar(metadata.name)
67
- if :belongs_to == metadata.macro
68
- if changed_for_autosave?(relation)
69
- relation.with(persistence_context) do |_relation|
70
- _relation.save
71
- end
72
- end
73
- else
74
- Array(relation).each do |doc|
75
- if changed_for_autosave?(doc)
76
- doc.with(persistence_context) do |d|
77
- d.save
78
- end
79
- end
80
- end
81
- end
82
- end
83
- end
84
- end
85
- end
86
-
87
- after_save save_method, unless: :autosaved?
88
- end
89
- end
90
-
91
- end
92
- end
93
- end
94
- end
@@ -1,59 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
- module Bindings
5
- module Embedded
6
-
7
- # Binding class for embedded_in relations.
8
- class In < Binding
9
-
10
- # Binds the base object to the inverse of the relation. This is so we
11
- # are referenced to the actual objects themselves on both sides.
12
- #
13
- # This case sets the metadata on the inverse object as well as the
14
- # document itself.
15
- #
16
- # @example Bind the documents.
17
- # name.person.bind(:continue => true)
18
- # name.person = Person.new
19
- #
20
- # @option options [ true, false ] :continue Continue binding the inverse.
21
- # @option options [ true, false ] :binding Are we in build mode?
22
- #
23
- # @since 2.0.0.rc.1
24
- def bind_one
25
- base.__metadata = metadata.inverse_metadata(target) unless base.__metadata
26
- base.parentize(target)
27
- binding do
28
- if base.embedded_many?
29
- target.do_or_do_not(metadata.inverse(target)).push(base)
30
- else
31
- target.do_or_do_not(metadata.inverse_setter(target), base)
32
- end
33
- end
34
- end
35
-
36
- # Unbinds the base object and the inverse, caused by setting the
37
- # reference to nil.
38
- #
39
- # @example Unbind the document.
40
- # name.person.unbind(:continue => true)
41
- # name.person = nil
42
- #
43
- # @option options [ true, false ] :continue Do we continue unbinding?
44
- #
45
- # @since 2.0.0.rc.1
46
- def unbind_one
47
- binding do
48
- if base.embedded_many?
49
- target.do_or_do_not(metadata.inverse(target)).delete(base)
50
- else
51
- target.do_or_do_not(metadata.inverse_setter(target), nil)
52
- end
53
- end
54
- end
55
- end
56
- end
57
- end
58
- end
59
- end
@@ -1,65 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
- module Bindings
5
- module Referenced
6
-
7
- # Binding class for all referenced_in relations.
8
- class In < Binding
9
-
10
- # Binds the base object to the inverse of the relation. This is so we
11
- # are referenced to the actual objects themselves on both sides.
12
- #
13
- # This case sets the metadata on the inverse object as well as the
14
- # document itself.
15
- #
16
- # @example Bind the documents.
17
- # game.person.bind(:continue => true)
18
- # game.person = Person.new
19
- #
20
- # @since 2.0.0.rc.1
21
- def bind_one
22
- binding do
23
- check_inverses!(target)
24
- bind_foreign_key(base, record_id(target))
25
- bind_polymorphic_inverse_type(base, target.class.name)
26
- if inverse = metadata.inverse(target)
27
- if set_base_metadata
28
- if base.referenced_many?
29
- target.__send__(inverse).push(base)
30
- else
31
- target.set_relation(inverse, base)
32
- end
33
- end
34
- end
35
- end
36
- end
37
-
38
- # Unbinds the base object and the inverse, caused by setting the
39
- # reference to nil.
40
- #
41
- # @example Unbind the document.
42
- # game.person.unbind(:continue => true)
43
- # game.person = nil
44
- #
45
- # @since 2.0.0.rc.1
46
- def unbind_one
47
- binding do
48
- inverse = metadata.inverse(target)
49
- bind_foreign_key(base, nil)
50
- bind_polymorphic_inverse_type(base, nil)
51
- if inverse
52
- set_base_metadata
53
- if base.referenced_many?
54
- target.__send__(inverse).delete(base)
55
- else
56
- target.set_relation(inverse, nil)
57
- end
58
- end
59
- end
60
- end
61
- end
62
- end
63
- end
64
- end
65
- end
@@ -1,70 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
- module Bindings
5
- module Referenced
6
-
7
- # Binding class for all references_and_referenced_in_many relations.
8
- class ManyToMany < Binding
9
-
10
- # Binds a single document with the inverse relation. Used
11
- # specifically when appending to the proxy.
12
- #
13
- # @example Bind one document.
14
- # person.preferences.bind_one(preference)
15
- #
16
- # @param [ Document ] doc The single document to bind.
17
- #
18
- # @since 2.0.0.rc.1
19
- def bind_one(doc)
20
- binding do
21
- inverse_keys = doc.you_must(metadata.inverse_foreign_key)
22
- if inverse_keys
23
- record_id = inverse_record_id(doc)
24
- unless inverse_keys.include?(record_id)
25
- doc.you_must(metadata.inverse_foreign_key_setter, inverse_keys.push(record_id))
26
- end
27
- doc.reset_relation_criteria(metadata.inverse)
28
- end
29
- base._synced[metadata.foreign_key] = true
30
- doc._synced[metadata.inverse_foreign_key] = true
31
- end
32
- end
33
-
34
- # Unbind a single document.
35
- #
36
- # @example Unbind the document.
37
- # person.preferences.unbind_one(document)
38
- #
39
- # @since 2.0.0.rc.1
40
- def unbind_one(doc)
41
- binding do
42
- base.send(metadata.foreign_key).delete_one(record_id(doc))
43
- inverse_keys = doc.you_must(metadata.inverse_foreign_key)
44
- if inverse_keys
45
- inverse_keys.delete_one(inverse_record_id(doc))
46
- doc.reset_relation_criteria(metadata.inverse)
47
- end
48
- base._synced[metadata.foreign_key] = true
49
- doc._synced[metadata.inverse_foreign_key] = true
50
- end
51
- end
52
-
53
- # Find the inverse id referenced by inverse_keys
54
- def inverse_record_id(doc)
55
- inverse_metadata = determine_inverse_metadata(doc)
56
- if inverse_metadata
57
- base.__send__(inverse_metadata.primary_key)
58
- else
59
- base._id
60
- end
61
- end
62
-
63
- def determine_inverse_metadata(doc)
64
- doc.relations[base.class.name.demodulize.underscore.pluralize]
65
- end
66
- end
67
- end
68
- end
69
- end
70
- end
@@ -1,9 +0,0 @@
1
- # encoding: utf-8
2
- require "mongoid/relations/binding"
3
- require "mongoid/relations/bindings/embedded/in"
4
- require "mongoid/relations/bindings/embedded/many"
5
- require "mongoid/relations/bindings/embedded/one"
6
- require "mongoid/relations/bindings/referenced/in"
7
- require "mongoid/relations/bindings/referenced/many"
8
- require "mongoid/relations/bindings/referenced/many_to_many"
9
- require "mongoid/relations/bindings/referenced/one"
@@ -1,57 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
-
5
- # Superclass for all builder objects. Builders are responsible for either
6
- # looking up a relation's target from the database, or creating them from a
7
- # supplied attributes hash.
8
- class Builder
9
- include Threaded::Lifecycle
10
-
11
- attr_reader :base, :metadata, :object
12
-
13
- # Instantiate the new builder for a relation.
14
- #
15
- # @example Create the builder.
16
- # Builder.new(metadata, { :field => "value })
17
- #
18
- # @param [ Document ] base The base document.
19
- # @param [ Metdata ] metadata The metadata for the relation.
20
- # @param [ Hash, BSON::ObjectId ] object The attributes to build from or
21
- # id to query with.
22
- #
23
- # @since 2.0.0.rc.1
24
- def initialize(base, metadata, object)
25
- @base, @metadata, @object = base, metadata, object
26
- end
27
-
28
- protected
29
-
30
- # Get the class from the metadata.
31
- #
32
- # @example Get the class.
33
- # builder.klass
34
- #
35
- # @return [ Class ] The class from the metadata.
36
- #
37
- # @since 2.3.2
38
- def klass
39
- @klass ||= metadata.klass
40
- end
41
-
42
- # Do we need to perform a database query? It will be so if the object we
43
- # have is not a document.
44
- #
45
- # @example Should we query the database?
46
- # builder.query?
47
- #
48
- # @return [ true, false ] Whether a database query should happen.
49
- #
50
- # @since 2.0.0.rc.1
51
- def query?
52
- obj = object.__array__.first
53
- !obj.is_a?(Mongoid::Document) && !obj.nil?
54
- end
55
- end
56
- end
57
- end