mongoid 6.4.8 → 7.0.0.beta

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 (315) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/Rakefile +0 -26
  5. data/lib/config/locales/en.yml +17 -21
  6. data/lib/mongoid.rb +2 -2
  7. data/lib/mongoid/association.rb +150 -0
  8. data/lib/mongoid/association/accessors.rb +339 -0
  9. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  10. data/lib/mongoid/association/builders.rb +92 -0
  11. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  12. data/lib/mongoid/association/depending.rb +116 -0
  13. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
  14. data/lib/mongoid/association/embedded.rb +4 -0
  15. data/lib/mongoid/{relations → association}/embedded/batchable.rb +27 -53
  16. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  17. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  18. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  19. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  20. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  21. data/lib/mongoid/association/embedded/embeds_many.rb +210 -0
  22. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
  23. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  24. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +529 -0
  25. data/lib/mongoid/association/embedded/embeds_one.rb +173 -0
  26. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
  27. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
  28. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  29. data/lib/mongoid/association/macros.rb +204 -0
  30. data/lib/mongoid/{relations → association}/many.rb +18 -52
  31. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  32. data/lib/mongoid/association/nested.rb +15 -0
  33. data/lib/mongoid/association/nested/many.rb +200 -0
  34. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  35. data/lib/mongoid/association/nested/one.rb +127 -0
  36. data/lib/mongoid/{relations → association}/one.rb +6 -6
  37. data/lib/mongoid/association/options.rb +152 -0
  38. data/lib/mongoid/{relations → association}/proxy.rb +31 -58
  39. data/lib/mongoid/association/referenced.rb +7 -0
  40. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  41. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  42. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  43. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  44. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  45. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  46. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  47. data/lib/mongoid/association/referenced/eager.rb +159 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  52. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +310 -0
  53. data/lib/mongoid/association/referenced/has_many.rb +273 -0
  54. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
  55. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  56. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  57. data/lib/mongoid/association/referenced/has_many/enumerable.rb +479 -0
  58. data/lib/mongoid/association/referenced/has_many/proxy.rb +577 -0
  59. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  60. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  61. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  62. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  63. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  64. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  65. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  66. data/lib/mongoid/{relations → association}/reflections.rb +21 -17
  67. data/lib/mongoid/association/relatable.rb +415 -0
  68. data/lib/mongoid/association/touchable.rb +97 -0
  69. data/lib/mongoid/atomic.rb +6 -6
  70. data/lib/mongoid/atomic/modifiers.rb +8 -12
  71. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  72. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  73. data/lib/mongoid/attributes.rb +2 -1
  74. data/lib/mongoid/attributes/nested.rb +10 -10
  75. data/lib/mongoid/attributes/processing.rb +2 -2
  76. data/lib/mongoid/attributes/readonly.rb +2 -4
  77. data/lib/mongoid/clients.rb +0 -2
  78. data/lib/mongoid/clients/options.rb +1 -1
  79. data/lib/mongoid/clients/storage_options.rb +0 -1
  80. data/lib/mongoid/composable.rb +3 -4
  81. data/lib/mongoid/config.rb +1 -0
  82. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  83. data/lib/mongoid/contextual/atomic.rb +3 -6
  84. data/lib/mongoid/contextual/map_reduce.rb +3 -7
  85. data/lib/mongoid/contextual/memory.rb +5 -10
  86. data/lib/mongoid/contextual/mongo.rb +10 -27
  87. data/lib/mongoid/copyable.rb +6 -6
  88. data/lib/mongoid/criteria.rb +1 -2
  89. data/lib/mongoid/criteria/includable.rb +14 -14
  90. data/lib/mongoid/criteria/modifiable.rb +8 -14
  91. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -3
  92. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  93. data/lib/mongoid/criteria/queryable/selectable.rb +10 -34
  94. data/lib/mongoid/document.rb +6 -6
  95. data/lib/mongoid/errors.rb +3 -1
  96. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  97. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  98. data/lib/mongoid/errors/unknown_model.rb +25 -0
  99. data/lib/mongoid/extensions/array.rb +5 -5
  100. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  101. data/lib/mongoid/extensions/object.rb +4 -4
  102. data/lib/mongoid/extensions/range.rb +1 -0
  103. data/lib/mongoid/extensions/regexp.rb +0 -1
  104. data/lib/mongoid/extensions/string.rb +1 -3
  105. data/lib/mongoid/factory.rb +4 -3
  106. data/lib/mongoid/fields.rb +1 -1
  107. data/lib/mongoid/fields/foreign_key.rb +5 -5
  108. data/lib/mongoid/fields/standard.rb +2 -14
  109. data/lib/mongoid/fields/validators/macro.rb +1 -1
  110. data/lib/mongoid/indexable.rb +8 -5
  111. data/lib/mongoid/interceptable.rb +5 -5
  112. data/lib/mongoid/matchable.rb +0 -3
  113. data/lib/mongoid/persistable.rb +4 -5
  114. data/lib/mongoid/persistable/creatable.rb +2 -4
  115. data/lib/mongoid/persistable/deletable.rb +9 -10
  116. data/lib/mongoid/persistable/destroyable.rb +5 -1
  117. data/lib/mongoid/persistable/incrementable.rb +1 -1
  118. data/lib/mongoid/persistable/logical.rb +1 -1
  119. data/lib/mongoid/persistable/settable.rb +5 -5
  120. data/lib/mongoid/persistable/updatable.rb +2 -2
  121. data/lib/mongoid/persistable/upsertable.rb +1 -2
  122. data/lib/mongoid/persistence_context.rb +4 -9
  123. data/lib/mongoid/query_cache.rb +18 -65
  124. data/lib/mongoid/railtie.rb +0 -17
  125. data/lib/mongoid/reloadable.rb +1 -1
  126. data/lib/mongoid/scopable.rb +3 -3
  127. data/lib/mongoid/serializable.rb +3 -3
  128. data/lib/mongoid/tasks/database.rb +2 -3
  129. data/lib/mongoid/threaded.rb +0 -74
  130. data/lib/mongoid/traversable.rb +2 -2
  131. data/lib/mongoid/validatable.rb +8 -8
  132. data/lib/mongoid/validatable/presence.rb +2 -2
  133. data/lib/mongoid/validatable/uniqueness.rb +4 -4
  134. data/lib/mongoid/version.rb +1 -1
  135. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -4
  136. data/spec/app/models/animal.rb +2 -1
  137. data/spec/app/models/band.rb +0 -1
  138. data/spec/app/models/bomb.rb +1 -1
  139. data/spec/app/models/message.rb +1 -1
  140. data/spec/app/models/person.rb +5 -2
  141. data/spec/app/models/vertex.rb +6 -0
  142. data/spec/app/models/wiki_page.rb +1 -1
  143. data/spec/config/mongoid.yml +1 -0
  144. data/spec/mongoid/{relations → association}/accessors_spec.rb +1 -1
  145. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  146. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  147. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  148. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  149. data/spec/mongoid/association/depending_spec.rb +613 -0
  150. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  151. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  152. data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
  153. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  154. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  155. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +5 -77
  156. data/spec/mongoid/association/embedded/embedded_in_spec.rb +843 -0
  157. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  158. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  159. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +140 -428
  160. data/spec/mongoid/association/embedded/embeds_many_spec.rb +852 -0
  161. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  162. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  163. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  164. data/spec/mongoid/association/embedded/embeds_one_spec.rb +908 -0
  165. data/spec/mongoid/{relations → association}/macros_spec.rb +148 -93
  166. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  167. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  168. data/spec/mongoid/association/options_spec.rb +1321 -0
  169. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +7 -34
  170. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  171. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  172. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +9 -9
  173. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  174. data/spec/mongoid/association/referenced/belongs_to_spec.rb +1963 -0
  175. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
  176. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  177. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +5 -5
  178. data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +107 -98
  179. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
  180. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  181. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  182. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +11 -11
  183. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +1 -109
  184. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +28 -93
  185. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  186. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  187. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  188. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  189. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  190. data/spec/mongoid/association/referenced/has_one_spec.rb +1244 -0
  191. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  192. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
  193. data/spec/mongoid/{relations → association}/touchable_spec.rb +19 -1
  194. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  195. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  196. data/spec/mongoid/atomic_spec.rb +17 -17
  197. data/spec/mongoid/attributes/nested_spec.rb +14 -12
  198. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  199. data/spec/mongoid/clients/factory_spec.rb +28 -52
  200. data/spec/mongoid/clients/options_spec.rb +65 -69
  201. data/spec/mongoid/config_spec.rb +24 -0
  202. data/spec/mongoid/contextual/geo_near_spec.rb +0 -1
  203. data/spec/mongoid/contextual/mongo_spec.rb +4 -112
  204. data/spec/mongoid/criteria/modifiable_spec.rb +183 -60
  205. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
  206. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  207. data/spec/mongoid/criteria/queryable/selectable_spec.rb +6 -74
  208. data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
  209. data/spec/mongoid/criteria/scopable_spec.rb +0 -81
  210. data/spec/mongoid/criteria_spec.rb +16 -19
  211. data/spec/mongoid/document_spec.rb +2 -56
  212. data/spec/mongoid/extensions/array_spec.rb +11 -15
  213. data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
  214. data/spec/mongoid/extensions/object_spec.rb +7 -11
  215. data/spec/mongoid/extensions/range_spec.rb +7 -0
  216. data/spec/mongoid/extensions/regexp_spec.rb +0 -23
  217. data/spec/mongoid/extensions/string_spec.rb +7 -35
  218. data/spec/mongoid/factory_spec.rb +18 -11
  219. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  220. data/spec/mongoid/fields_spec.rb +2 -2
  221. data/spec/mongoid/findable_spec.rb +1 -1
  222. data/spec/mongoid/indexable_spec.rb +18 -8
  223. data/spec/mongoid/interceptable_spec.rb +21 -2
  224. data/spec/mongoid/matchable_spec.rb +1 -26
  225. data/spec/mongoid/persistable/deletable_spec.rb +0 -19
  226. data/spec/mongoid/persistable/destroyable_spec.rb +0 -19
  227. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  228. data/spec/mongoid/persistable/savable_spec.rb +3 -3
  229. data/spec/mongoid/persistable/settable_spec.rb +1 -35
  230. data/spec/mongoid/persistable/updatable_spec.rb +2 -2
  231. data/spec/mongoid/persistable_spec.rb +16 -16
  232. data/spec/mongoid/persistence_context_spec.rb +0 -14
  233. data/spec/mongoid/positional_spec.rb +10 -10
  234. data/spec/mongoid/query_cache_spec.rb +18 -87
  235. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  236. data/spec/mongoid/scopable_spec.rb +0 -13
  237. data/spec/mongoid/threaded_spec.rb +0 -68
  238. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  239. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  240. data/spec/mongoid/validatable_spec.rb +1 -1
  241. data/spec/spec_helper.rb +7 -83
  242. metadata +586 -611
  243. metadata.gz.sig +2 -5
  244. data/lib/mongoid/clients/sessions.rb +0 -113
  245. data/lib/mongoid/errors/invalid_session_use.rb +0 -24
  246. data/lib/mongoid/matchable/nor.rb +0 -37
  247. data/lib/mongoid/railties/controller_runtime.rb +0 -86
  248. data/lib/mongoid/relations.rb +0 -148
  249. data/lib/mongoid/relations/accessors.rb +0 -267
  250. data/lib/mongoid/relations/auto_save.rb +0 -94
  251. data/lib/mongoid/relations/bindings.rb +0 -9
  252. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  253. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  254. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  255. data/lib/mongoid/relations/builder.rb +0 -57
  256. data/lib/mongoid/relations/builders.rb +0 -106
  257. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  258. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  259. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  260. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  261. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  262. data/lib/mongoid/relations/cascading.rb +0 -56
  263. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  264. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  265. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  266. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  267. data/lib/mongoid/relations/conversions.rb +0 -34
  268. data/lib/mongoid/relations/counter_cache.rb +0 -160
  269. data/lib/mongoid/relations/cyclic.rb +0 -107
  270. data/lib/mongoid/relations/eager/base.rb +0 -153
  271. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  272. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  273. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  274. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  275. data/lib/mongoid/relations/embedded/in.rb +0 -241
  276. data/lib/mongoid/relations/embedded/many.rb +0 -683
  277. data/lib/mongoid/relations/embedded/one.rb +0 -235
  278. data/lib/mongoid/relations/macros.rb +0 -367
  279. data/lib/mongoid/relations/metadata.rb +0 -1179
  280. data/lib/mongoid/relations/nested_builder.rb +0 -74
  281. data/lib/mongoid/relations/options.rb +0 -49
  282. data/lib/mongoid/relations/polymorphic.rb +0 -39
  283. data/lib/mongoid/relations/referenced/in.rb +0 -304
  284. data/lib/mongoid/relations/referenced/many.rb +0 -812
  285. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  286. data/lib/mongoid/relations/referenced/one.rb +0 -290
  287. data/lib/mongoid/relations/synchronization.rb +0 -169
  288. data/lib/mongoid/relations/targets.rb +0 -2
  289. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  290. data/lib/mongoid/relations/touchable.rb +0 -97
  291. data/spec/app/models/array_field.rb +0 -7
  292. data/spec/app/models/delegating_patient.rb +0 -16
  293. data/spec/integration/document_spec.rb +0 -22
  294. data/spec/mongoid/clients/sessions_spec.rb +0 -334
  295. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  296. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  297. data/spec/mongoid/matchable/nor_spec.rb +0 -209
  298. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  299. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  300. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  301. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  302. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  303. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  304. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  305. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  306. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  307. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  308. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  309. data/spec/mongoid/relations/options_spec.rb +0 -35
  310. data/spec/rails/controller_extension/controller_runtime_spec.rb +0 -110
  311. data/spec/support/cluster_config.rb +0 -158
  312. data/spec/support/constraints.rb +0 -101
  313. data/spec/support/macros.rb +0 -20
  314. data/spec/support/session_registry.rb +0 -50
  315. data/spec/support/spec_config.rb +0 -42
@@ -1,25 +1,25 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Relations
3
+ module Association
4
4
 
5
5
  # Superclass for all objects that bind relations together.
6
- class Binding
6
+ module Bindable
7
7
  include Threaded::Lifecycle
8
8
 
9
- attr_reader :base, :target, :metadata
9
+ attr_reader :_base, :_target, :_association
10
10
 
11
11
  # Create the new binding.
12
12
  #
13
13
  # @example Initialize a binding.
14
- # Binding.new(base, target, metadata)
14
+ # Binding.new(base, target, association)
15
15
  #
16
16
  # @param [ Document ] base The base of the binding.
17
17
  # @param [ Document, Array<Document> ] target The target of the binding.
18
- # @param [ Metadata ] metadata The relation's metadata.
18
+ # @param [ Association ] association The association metadata.
19
19
  #
20
20
  # @since 2.0.0.rc.1
21
- def initialize(base, target, metadata)
22
- @base, @target, @metadata = base, target, metadata
21
+ def initialize(base, target, association)
22
+ @_base, @_target, @_association = base, target, association
23
23
  end
24
24
 
25
25
  # Execute the provided block inside a binding.
@@ -55,32 +55,12 @@ module Mongoid
55
55
  #
56
56
  # @since 3.0.0
57
57
  def check_inverse!(doc)
58
- if !metadata.forced_nil_inverse? &&
59
- !doc.respond_to?(metadata.foreign_key_setter)
58
+ unless _association.bindable?(doc)
60
59
  raise Errors::InverseNotFound.new(
61
- base.class,
62
- metadata.name,
63
- doc.class,
64
- metadata.foreign_key
65
- )
66
- end
67
- end
68
-
69
- # Check for problems with multiple inverse definitions.
70
- #
71
- # @api private
72
- #
73
- # @example Check for inverses errors.
74
- # binding.check_inverses!(doc)
75
- #
76
- # @param [ Document ] doc The document to check.
77
- #
78
- # @since 3.0.0
79
- def check_inverses!(doc)
80
- inverses = metadata.inverses(doc)
81
- if inverses.count > 1 && base.send(metadata.foreign_key).nil?
82
- raise Errors::InvalidSetPolymorphicRelation.new(
83
- metadata.name, base.class.name, target.class.name
60
+ _base.class,
61
+ _association.name,
62
+ doc.class,
63
+ _association.foreign_key
84
64
  )
85
65
  end
86
66
  end
@@ -99,7 +79,7 @@ module Mongoid
99
79
  # @since 3.0.0
100
80
  def bind_foreign_key(keyed, id)
101
81
  unless keyed.frozen?
102
- keyed.you_must(metadata.foreign_key_setter, id)
82
+ keyed.you_must(_association.foreign_key_setter, id)
103
83
  end
104
84
  end
105
85
 
@@ -116,8 +96,8 @@ module Mongoid
116
96
  #
117
97
  # @since 3.0.0
118
98
  def bind_polymorphic_type(typed, name)
119
- if metadata.type
120
- typed.you_must(metadata.type_setter, name)
99
+ if _association.type
100
+ typed.you_must(_association.type_setter, name)
121
101
  end
122
102
  end
123
103
 
@@ -134,8 +114,8 @@ module Mongoid
134
114
  #
135
115
  # @since 3.0.0
136
116
  def bind_polymorphic_inverse_type(typed, name)
137
- if metadata.inverse_type
138
- typed.you_must(metadata.inverse_type_setter, name)
117
+ if _association.inverse_type
118
+ typed.you_must(_association.inverse_type_setter, name)
139
119
  end
140
120
  end
141
121
 
@@ -152,8 +132,8 @@ module Mongoid
152
132
  #
153
133
  # @since 3.0.0
154
134
  def bind_inverse(doc, inverse)
155
- if doc.respond_to?(metadata.inverse_setter)
156
- doc.you_must(metadata.inverse_setter, inverse)
135
+ if doc.respond_to?(_association.inverse_setter)
136
+ doc.you_must(_association.inverse_setter, inverse)
157
137
  end
158
138
  end
159
139
 
@@ -169,31 +149,31 @@ module Mongoid
169
149
  # @since 3.0.0
170
150
  def bind_from_relational_parent(doc)
171
151
  check_inverse!(doc)
172
- bind_foreign_key(doc, record_id(base))
173
- bind_polymorphic_type(doc, base.class.name)
174
- bind_inverse(doc, base)
152
+ bind_foreign_key(doc, record_id(_base))
153
+ bind_polymorphic_type(doc, _base.class.name)
154
+ bind_inverse(doc, _base)
175
155
  end
176
156
 
177
- def record_id(base)
178
- base.__send__(metadata.primary_key)
157
+ def record_id(_base)
158
+ _base.__send__(_association.primary_key)
179
159
  end
180
160
 
181
- # Ensure that the metadata on the base is correct, for the cases
161
+ # Ensure that the association on the base is correct, for the cases
182
162
  # where we have multiple belongs to definitions and were are setting
183
163
  # different parents in memory in order.
184
164
  #
185
165
  # @api private
186
166
  #
187
- # @example Set the base metadata.
188
- # binding.set_base_metadata
167
+ # @example Set the base association.
168
+ # binding.set_base_association
189
169
  #
190
- # @return [ true, false ] If the metadata changed.
170
+ # @return [ true, false ] If the association changed.
191
171
  #
192
172
  # @since 2.4.4
193
- def set_base_metadata
194
- inverse_metadata = metadata.inverse_metadata(target)
195
- if inverse_metadata != metadata && !inverse_metadata.nil?
196
- base.__metadata = inverse_metadata
173
+ def set_base_association
174
+ inverse_association = _association.inverse_association(_target)
175
+ if inverse_association != _association && !inverse_association.nil?
176
+ _base._association = inverse_association
197
177
  end
198
178
  end
199
179
 
@@ -0,0 +1,92 @@
1
+ # encoding: utf-8
2
+
3
+ module Mongoid
4
+ module Association
5
+
6
+ # This module is responsible for defining the build and create methods used
7
+ # in one to one relations.
8
+ #
9
+ # @example Methods that get created.
10
+ #
11
+ # class Person
12
+ # include Mongoid::Document
13
+ # embeds_one :name
14
+ # end
15
+ #
16
+ # # The following methods get created:
17
+ # person.build_name({ :first_name => "Durran" })
18
+ # person.create_name({ :first_name => "Durran" })
19
+ #
20
+ # @since 2.0.0.rc.1
21
+ module Builders
22
+ extend ActiveSupport::Concern
23
+
24
+ private
25
+
26
+ # Parse out the attributes and the options from the args passed to a
27
+ # build_ or create_ methods.
28
+ #
29
+ # @example Parse the args.
30
+ # doc.parse_args(:name => "Joe")
31
+ #
32
+ # @param [ Array ] args The arguments.
33
+ #
34
+ # @return [ Array<Hash> ] The attributes and options.
35
+ #
36
+ # @since 2.3.4
37
+ def parse_args(*args)
38
+ [ args.first || {}, args.size > 1 ? args[1] : {} ]
39
+ end
40
+
41
+ # Defines a builder method. This is defined as #build_name.
42
+ #
43
+ # @example
44
+ # Person.define_builder!(association)
45
+ #
46
+ # @param [ Association ] association The association metadata for the relation.
47
+ #
48
+ # @return [ Class ] The class being set up.
49
+ #
50
+ # @since 2.0.0.rc.1
51
+ def self.define_builder!(association)
52
+ association.inverse_class.tap do |klass|
53
+ klass.re_define_method("build_#{association.name}") do |*args|
54
+ attributes, _options = parse_args(*args)
55
+ document = Factory.build(association.relation_class, attributes)
56
+ _building do
57
+ child = send("#{association.name}=", document)
58
+ child.run_callbacks(:build)
59
+ child
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ # Defines a creator method. This is defined as #create_name.
66
+ # After the object is built it will immediately save.
67
+ #
68
+ # @example
69
+ # Person.define_creator!(association)
70
+ #
71
+ # @param [ Association ] association The association metadata for the relation.
72
+ #
73
+ # @return [ Class ] The class being set up.
74
+ #
75
+ # @since 2.0.0.rc.1
76
+ def self.define_creator!(association)
77
+ association.inverse_class.tap do |klass|
78
+ klass.re_define_method("create_#{association.name}") do |*args|
79
+ attributes, _options = parse_args(*args)
80
+ document = Factory.build(association.relation_class, attributes)
81
+ doc = _assigning do
82
+ send("#{association.name}=", document)
83
+ end
84
+ doc.save
85
+ save if new_record? && association.stores_foreign_key?
86
+ doc
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -1,26 +1,11 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Relations
3
+ module Association
4
4
 
5
5
  # Used for converting foreign key values to the correct type based on the
6
6
  # types of ids that the document stores.
7
7
  #
8
- # @note Durran: The name of this class is this way to match the metadata
9
- # getter, and foreign_key was already taken there.
10
- class Constraint
11
- attr_reader :metadata
12
-
13
- # Create the new constraint with the metadata.
14
- #
15
- # @example Instantiate the constraint.
16
- # Constraint.new(metdata)
17
- #
18
- # @param [ Metadata ] metadata The metadata of the relation.
19
- #
20
- # @since 2.0.0.rc.7
21
- def initialize(metadata)
22
- @metadata = metadata
23
- end
8
+ module Constrainable
24
9
 
25
10
  # Convert the supplied object to the appropriate type to set as the
26
11
  # foreign key for a relation.
@@ -33,10 +18,10 @@ module Mongoid
33
18
  # @return [ Object ] The object cast to the correct type.
34
19
  #
35
20
  # @since 2.0.0.rc.7
36
- def convert(object)
37
- return convert_polymorphic(object) if metadata.polymorphic?
38
- klass, field = metadata.klass, metadata.klass.fields["_id"]
39
- if klass.using_object_ids?
21
+ def convert_to_foreign_key(object)
22
+ return convert_polymorphic(object) if polymorphic?
23
+ field = relation_class.fields["_id"]
24
+ if relation_class.using_object_ids?
40
25
  BSON::ObjectId.mongoize(object)
41
26
  elsif object.is_a?(::Array)
42
27
  object.map!{ |obj| field.mongoize(obj) }
@@ -48,7 +33,11 @@ module Mongoid
48
33
  private
49
34
 
50
35
  def convert_polymorphic(object)
51
- object.respond_to?(:id) ? object.id : object
36
+ if object.is_a?(Mongoid::Document)
37
+ object.id
38
+ else
39
+ BSON::ObjectId.mongoize(object)
40
+ end
52
41
  end
53
42
  end
54
43
  end
@@ -0,0 +1,116 @@
1
+ module Mongoid
2
+ module Association
3
+
4
+ # This module defines the behaviour for setting up cascading deletes and
5
+ # nullifies for relations, and how to delegate to the appropriate strategy.
6
+ module Depending
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ class_attribute :dependents
11
+ self.dependents = []
12
+ end
13
+
14
+ # The valid dependent strategies.
15
+ #
16
+ # @since 7.0
17
+ STRATEGIES = [
18
+ :delete_all,
19
+ :destroy,
20
+ :nullify,
21
+ :restrict_with_exception,
22
+ :restrict_with_error
23
+ ]
24
+
25
+ # The error message when a strategy cannot delete objects because there are associated objects.
26
+ #
27
+ # @since 7.0
28
+ RESTRICT_ERROR_MSG = 'Cannot delete record because associated objects exist.'.freeze
29
+
30
+ # Attempt to add the cascading information for the document to know how
31
+ # to handle associated documents on a removal.
32
+ #
33
+ # @example Set up cascading information
34
+ # Mongoid::Association::Depending.define_dependency!(association)
35
+ #
36
+ # @param [ Association ] association The association metadata.
37
+ #
38
+ # @return [ Class ] The class of the document.
39
+ #
40
+ # @since 2.0.0.rc.1
41
+ def self.define_dependency!(association)
42
+ validate!(association)
43
+ association.inverse_class.tap do |klass|
44
+ if association.dependent && !klass.dependents.include?(association)
45
+ klass.dependents.push(association)
46
+ end
47
+ end
48
+ end
49
+
50
+ def self.validate!(association)
51
+ unless STRATEGIES.include?(association.dependent)
52
+ raise Errors::InvalidDependentStrategy.new(association,
53
+ association.dependent,
54
+ STRATEGIES)
55
+ end
56
+ end
57
+
58
+ # Perform all cascading deletes, destroys, or nullifies. Will delegate to
59
+ # the appropriate strategy to perform the operation.
60
+ #
61
+ # @example Execute cascades.
62
+ # document.apply_delete_dependencies!
63
+ #
64
+ # @since 2.0.0.rc.1
65
+ def apply_delete_dependencies!
66
+ dependents.each do |association|
67
+ if association.try(:dependent)
68
+ send("_dependent_#{association.dependent}!", association)
69
+ end
70
+ end
71
+ end
72
+
73
+ private
74
+
75
+ def _dependent_delete_all!(association)
76
+ if relation = send(association.name)
77
+ if relation.respond_to?(:dependents) && relation.dependents.blank?
78
+ relation.clear
79
+ else
80
+ ::Array.wrap(send(association.name)).each { |rel| rel.delete }
81
+ end
82
+ end
83
+ end
84
+
85
+ def _dependent_destroy!(association)
86
+ if relation = send(association.name)
87
+ if relation.is_a?(Enumerable)
88
+ relation.entries
89
+ relation.each { |doc| doc.destroy }
90
+ else
91
+ relation.destroy
92
+ end
93
+ end
94
+ end
95
+
96
+ def _dependent_nullify!(association)
97
+ if relation = send(association.name)
98
+ relation.nullify
99
+ end
100
+ end
101
+
102
+ def _dependent_restrict_with_exception!(association)
103
+ if (relation = send(association.name)) && !relation.blank?
104
+ raise Errors::DeleteRestriction.new(relation, association.name)
105
+ end
106
+ end
107
+
108
+ def _dependent_restrict_with_error!(association)
109
+ if (relation = send(association.name)) && !relation.blank?
110
+ errors.add(association.name, RESTRICT_ERROR_MSG)
111
+ throw(:abort, false)
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -1,13 +1,13 @@
1
1
  # encoding: utf-8
2
- require "mongoid/relations/eager/base"
3
- require "mongoid/relations/eager/belongs_to"
4
- require "mongoid/relations/eager/has_one"
5
- require "mongoid/relations/eager/has_many"
6
- require "mongoid/relations/eager/has_and_belongs_to_many"
2
+ require "mongoid/association/referenced/eager"
7
3
 
8
4
  module Mongoid
9
- module Relations
10
- module Eager
5
+ module Association
6
+
7
+ # This module defines the eager loading behavior for criteria.
8
+ #
9
+ # @since 7.0
10
+ module EagerLoadable
11
11
 
12
12
  def eager_loadable?
13
13
  !criteria.inclusions.empty?
@@ -23,11 +23,11 @@ module Mongoid
23
23
 
24
24
  def preload(relations, docs)
25
25
  relations.group_by(&:inverse_class_name)
26
- .values
27
- .each do |associations|
26
+ .values
27
+ .each do |associations|
28
28
  associations.group_by(&:relation)
29
- .each do |relation, association|
30
- relation.eager_load_klass.new(association, docs).run
29
+ .each do |relation, association|
30
+ relation.eager_loader(association, docs).run
31
31
  end
32
32
  end
33
33
  end