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
@@ -0,0 +1,173 @@
1
+ require 'mongoid/association/embedded/embeds_one/binding'
2
+ require 'mongoid/association/embedded/embeds_one/buildable'
3
+ require 'mongoid/association/embedded/embeds_one/proxy'
4
+
5
+ module Mongoid
6
+ module Association
7
+ module Embedded
8
+
9
+ # The EmbedsOne type association.
10
+ #
11
+ # @since 7.0
12
+ class EmbedsOne
13
+ include Relatable
14
+ include Buildable
15
+
16
+ # The options available for this type of association, in addition to the
17
+ # common ones.
18
+ #
19
+ # @return [ Array<Symbol> ] The extra valid options.
20
+ #
21
+ # @since 7.0
22
+ ASSOCIATION_OPTIONS = [
23
+ :autobuild,
24
+ :as,
25
+ :cascade_callbacks,
26
+ :cyclic,
27
+ :store_as
28
+ ]
29
+
30
+ # The complete list of valid options for this association, including
31
+ # the shared ones.
32
+ #
33
+ # @return [ Array<Symbol> ] The valid options.
34
+ #
35
+ # @since 7.0
36
+ VALID_OPTIONS = (ASSOCIATION_OPTIONS + SHARED_OPTIONS).freeze
37
+
38
+ # Setup the instance methods, fields, etc. on the association owning class.
39
+ #
40
+ # @return [ self ]
41
+ #
42
+ # @since 7.0
43
+ def setup!
44
+ setup_instance_methods!
45
+ @owner_class.embedded_relations = @owner_class.embedded_relations.merge(name => self)
46
+ @owner_class.aliased_fields[name.to_s] = store_as if store_as
47
+ self
48
+ end
49
+
50
+ # The field key used to store the association object.
51
+ #
52
+ # @return [ String ] The field name.
53
+ #
54
+ # @since 7.0
55
+ def store_as
56
+ @store_as ||= (@options[:store_as].try(:to_s) || name.to_s)
57
+ end
58
+
59
+ # The key that is used to get the attributes for the associated object.
60
+ #
61
+ # @return [ String ] The name of the field used to store the relation.
62
+ #
63
+ # @since 7.0
64
+ def key
65
+ store_as.to_s
66
+ end
67
+
68
+ # Is this association type embedded?
69
+ #
70
+ # @return [ true ] Always true.
71
+ #
72
+ # @since 7.0
73
+ def embedded?; true; end
74
+
75
+ # Get the default validation setting for the relation. Determines if
76
+ # by default a validates associated will occur.
77
+ #
78
+ # @example Get the validation default.
79
+ # Proxy.validation_default
80
+ #
81
+ # @return [ true, false ] The validation default.
82
+ #
83
+ # @since 2.1.9
84
+ def validation_default; true; end
85
+
86
+ # Does this association type store the foreign key?
87
+ #
88
+ # @return [ false ] Always false.
89
+ #
90
+ # @since 7.0
91
+ def stores_foreign_key?; false; end
92
+
93
+ # The primary key
94
+ #
95
+ # @return [ nil ] Not relevant for this relation
96
+ def primary_key; end
97
+
98
+ # Get the relation proxy class for this association type.
99
+ #
100
+ # @return [ Association::Embedded::EmbedsMany::Proxy ] The proxy class.
101
+ #
102
+ # @since 7.0
103
+ def relation
104
+ Proxy
105
+ end
106
+
107
+ # Is this association polymorphic?
108
+ #
109
+ # @return [ true, false ] Whether this association is polymorphic.
110
+ #
111
+ # @since 7.0
112
+ def polymorphic?
113
+ @polymorphic ||= !!@options[:as]
114
+ end
115
+
116
+ # The field used to store the type of the related object.
117
+ #
118
+ # @note Only relevant if the association is polymorphic.
119
+ #
120
+ # @return [ String, nil ] The field for storing the associated object's type.
121
+ #
122
+ # @since 7.0
123
+ def type
124
+ @type ||= "#{as}_type" if polymorphic?
125
+ end
126
+
127
+ # The nested builder object.
128
+ #
129
+ # @param [ Hash ] attributes The attributes to use to build the association object.
130
+ # @param [ Hash ] options The options for the association.
131
+ #
132
+ # @return [ Association::Nested::One ] The Nested Builder object.
133
+ #
134
+ # @since 7.0
135
+ def nested_builder(attributes, options)
136
+ Nested::One.new(self, attributes, options)
137
+ end
138
+
139
+ private
140
+
141
+ def setup_instance_methods!
142
+ define_getter!
143
+ define_setter!
144
+ define_existence_check!
145
+ define_builder!
146
+ define_creator!
147
+ @owner_class.cyclic = true if cyclic?
148
+ @owner_class.validates_associated(name) if validate?
149
+ end
150
+
151
+ def relation_complements
152
+ @relation_complements ||= [ Embedded::EmbeddedIn ].freeze
153
+ end
154
+
155
+ def polymorphic_inverses(other = nil)
156
+ [ as ]
157
+ end
158
+
159
+ def determine_inverses(other)
160
+ matches = relation_class.relations.values.select do |rel|
161
+ relation_complements.include?(rel.class) &&
162
+ rel.relation_class_name == inverse_class_name
163
+
164
+ end
165
+ if matches.size > 1
166
+ raise Errors::AmbiguousRelationship.new(relation_class, @owner_class, name, matches)
167
+ end
168
+ matches.collect { |m| m.name } unless matches.blank?
169
+ end
170
+ end
171
+ end
172
+ end
173
+ end
@@ -1,16 +1,18 @@
1
- # encoding: utf-8
2
1
  module Mongoid
3
- module Relations
4
- module Bindings
5
- module Embedded
2
+ module Association
3
+ module Embedded
4
+ class EmbedsOne
6
5
 
7
- # Binding class for embeds_one relations.
8
- class One < Binding
6
+ # Binding class for all embeds_one relations.
7
+ #
8
+ # @since 7.0
9
+ class Binding
10
+ include Bindable
9
11
 
10
12
  # Binds the base object to the inverse of the relation. This is so we
11
13
  # are referenced to the actual objects themselves on both sides.
12
14
  #
13
- # This case sets the metadata on the inverse object as well as the
15
+ # This case sets the association metadata on the inverse object as well as the
14
16
  # document itself.
15
17
  #
16
18
  # @example Bind the document.
@@ -19,9 +21,9 @@ module Mongoid
19
21
  #
20
22
  # @since 2.0.0.rc.1
21
23
  def bind_one
22
- target.parentize(base)
24
+ _target.parentize(_base)
23
25
  binding do
24
- target.do_or_do_not(metadata.inverse_setter(target), base)
26
+ _target.do_or_do_not(_association.inverse_setter(_target), _base)
25
27
  end
26
28
  end
27
29
 
@@ -35,7 +37,7 @@ module Mongoid
35
37
  # @since 2.0.0.rc.1
36
38
  def unbind_one
37
39
  binding do
38
- target.do_or_do_not(metadata.inverse_setter(target), nil)
40
+ _target.do_or_do_not(_association.inverse_setter(_target), nil)
39
41
  end
40
42
  end
41
43
  end
@@ -1,21 +1,27 @@
1
- # encoding: utf-8
2
1
  module Mongoid
3
- module Relations
4
- module Builders
5
- module Embedded
6
- class One < Builder
2
+ module Association
3
+ module Embedded
4
+ class EmbedsOne
5
+
6
+ # Builder class for embeds_one associations.
7
+ #
8
+ # @since 7.0
9
+ module Buildable
10
+ include Threaded::Lifecycle
7
11
 
8
12
  # Builds the document out of the attributes using the provided
9
- # metadata on the relation. Instantiates through the factory in order
13
+ # association metadata on the relation. Instantiates through the factory in order
10
14
  # to make sure subclasses and allocation are used if fitting.
11
15
  #
12
16
  # @example Build the document.
13
17
  # Builder.new(meta, attrs).build
14
18
  #
19
+ # @param [ Document ] base The document this relation hangs off of.
20
+ # @param [ Document ] object The related document.
15
21
  # @param [ String ] _type Not used in this context.
16
22
  #
17
23
  # @return [ Document ] A single document.
18
- def build(_type = nil)
24
+ def build(base, object, _type = nil)
19
25
  return object unless object.is_a?(Hash)
20
26
  if _loading? && base.persisted?
21
27
  Factory.from_db(klass, object)
@@ -0,0 +1,130 @@
1
+ module Mongoid
2
+ module Association
3
+ module Embedded
4
+ class EmbedsOne
5
+
6
+ class Proxy < Association::One
7
+
8
+ # The valid options when defining this relation.
9
+ #
10
+ # @return [ Array<Symbol> ] The allowed options when defining this relation.
11
+ #
12
+ # @since 7.0
13
+ VALID_OPTIONS = [
14
+ :autobuild,
15
+ :as,
16
+ :cascade_callbacks,
17
+ :cyclic,
18
+ :store_as
19
+ ].freeze
20
+
21
+ # Instantiate a new embeds_one relation.
22
+ #
23
+ # @example Create the new proxy.
24
+ # One.new(person, name, association)
25
+ #
26
+ # @param [ Document ] base The document this relation hangs off of.
27
+ # @param [ Document ] target The child document in the relation.
28
+ # @param [ Association ] association The association metadata.
29
+ def initialize(base, target, association)
30
+ init(base, target, association) do
31
+ characterize_one(_target)
32
+ bind_one
33
+ characterize_one(_target)
34
+ _base._reset_memoized_children!
35
+ _target.save if persistable?
36
+ end
37
+ end
38
+
39
+ # Substitutes the supplied target documents for the existing document
40
+ # in the relation.
41
+ #
42
+ # @example Substitute the new document.
43
+ # person.name.substitute(new_name)
44
+ #
45
+ # @param [ Document ] replacement A document to replace the target.
46
+ #
47
+ # @return [ Document, nil ] The relation or nil.
48
+ #
49
+ # @since 2.0.0.rc.1
50
+ def substitute(replacement)
51
+ if replacement != self
52
+ if _assigning?
53
+ _base.add_atomic_unset(_target) unless replacement
54
+ else
55
+ # The associated object will be replaced by the below update, so only
56
+ # run the callbacks and state-changing code by passing persist: false.
57
+ _target.destroy(persist: false) if persistable?
58
+ end
59
+ unbind_one
60
+ return nil unless replacement
61
+ replacement = Factory.build(klass, replacement) if replacement.is_a?(::Hash)
62
+ self._target = replacement
63
+ bind_one
64
+ characterize_one(_target)
65
+ _target.save if persistable?
66
+ end
67
+ self
68
+ end
69
+
70
+ private
71
+
72
+ # Instantiate the binding associated with this relation.
73
+ #
74
+ # @example Get the binding.
75
+ # relation.binding([ address ])
76
+ #
77
+ # @return [ Binding ] The relation's binding.
78
+ #
79
+ # @since 2.0.0.rc.1
80
+ def binding
81
+ Binding.new(_base, _target, _association)
82
+ end
83
+
84
+ # Are we able to persist this relation?
85
+ #
86
+ # @example Can we persist the relation?
87
+ # relation.persistable?
88
+ #
89
+ # @return [ true, false ] If the relation is persistable.
90
+ #
91
+ # @since 2.1.0
92
+ def persistable?
93
+ _base.persisted? && !_binding? && !_building? && !_assigning?
94
+ end
95
+
96
+ class << self
97
+
98
+ # Returns true if the relation is an embedded one. In this case
99
+ # always true.
100
+ #
101
+ # @example Is this relation embedded?
102
+ # Association::Embedded::EmbedsOne.embedded?
103
+ #
104
+ # @return [ true ] true.
105
+ #
106
+ # @since 2.0.0.rc.1
107
+ def embedded?
108
+ true
109
+ end
110
+
111
+ # Get the path calculator for the supplied document.
112
+ #
113
+ # @example Get the path calculator.
114
+ # Proxy.path(document)
115
+ #
116
+ # @param [ Document ] document The document to calculate on.
117
+ #
118
+ # @return [ Mongoid::Atomic::Paths::Embedded::One ]
119
+ # The embedded one atomic path calculator.
120
+ #
121
+ # @since 2.1.0
122
+ def path(document)
123
+ Mongoid::Atomic::Paths::Embedded::One.new(document)
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,204 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+
5
+ # This module contains the core macros for defining relations between
6
+ # documents. They can be either embedded or referenced (relational).
7
+ module Macros
8
+ extend ActiveSupport::Concern
9
+
10
+ included do
11
+ class_attribute :embedded, instance_reader: false
12
+ class_attribute :embedded_relations
13
+ class_attribute :relations
14
+ self.embedded = false
15
+ self.embedded_relations = BSON::Document.new
16
+ self.relations = BSON::Document.new
17
+ end
18
+
19
+ # This is convenience for libraries still on the old API.
20
+ #
21
+ # @example Get the associations.
22
+ # person.associations
23
+ #
24
+ # @return [ Hash ] The relations.
25
+ #
26
+ # @since 2.3.1
27
+ def associations
28
+ self.relations
29
+ end
30
+
31
+ module ClassMethods
32
+
33
+ # Adds the relation back to the parent document. This macro is
34
+ # necessary to set the references from the child back to the parent
35
+ # document. If a child does not define this relation calling
36
+ # persistence methods on the child object will cause a save to fail.
37
+ #
38
+ # @example Define the relation.
39
+ #
40
+ # class Person
41
+ # include Mongoid::Document
42
+ # embeds_many :addresses
43
+ # end
44
+ #
45
+ # class Address
46
+ # include Mongoid::Document
47
+ # embedded_in :person
48
+ # end
49
+ #
50
+ # @param [ Symbol ] name The name of the relation.
51
+ # @param [ Hash ] options The relation options.
52
+ # @param [ Proc ] block Optional block for defining extensions.
53
+ def embedded_in(name, options = {}, &block)
54
+ define_association!(__method__, name, options, &block)
55
+ end
56
+
57
+ # Adds the relation from a parent document to its children. The name
58
+ # of the relation needs to be a pluralized form of the child class
59
+ # name.
60
+ #
61
+ # @example Define the relation.
62
+ #
63
+ # class Person
64
+ # include Mongoid::Document
65
+ # embeds_many :addresses
66
+ # end
67
+ #
68
+ # class Address
69
+ # include Mongoid::Document
70
+ # embedded_in :person
71
+ # end
72
+ #
73
+ # @param [ Symbol ] name The name of the relation.
74
+ # @param [ Hash ] options The relation options.
75
+ # @param [ Proc ] block Optional block for defining extensions.
76
+ def embeds_many(name, options = {}, &block)
77
+ define_association!(__method__, name, options, &block)
78
+ end
79
+
80
+ # Adds the relation from a parent document to its child. The name
81
+ # of the relation needs to be a singular form of the child class
82
+ # name.
83
+ #
84
+ # @example Define the relation.
85
+ #
86
+ # class Person
87
+ # include Mongoid::Document
88
+ # embeds_one :name
89
+ # end
90
+ #
91
+ # class Name
92
+ # include Mongoid::Document
93
+ # embedded_in :person
94
+ # end
95
+ #
96
+ # @param [ Symbol ] name The name of the relation.
97
+ # @param [ Hash ] options The relation options.
98
+ # @param [ Proc ] block Optional block for defining extensions.
99
+ def embeds_one(name, options = {}, &block)
100
+ define_association!(__method__, name, options, &block)
101
+ end
102
+
103
+ # Adds a relational association from the child Document to a Document in
104
+ # another database or collection.
105
+ #
106
+ # @example Define the relation.
107
+ #
108
+ # class Game
109
+ # include Mongoid::Document
110
+ # belongs_to :person
111
+ # end
112
+ #
113
+ # class Person
114
+ # include Mongoid::Document
115
+ # has_one :game
116
+ # end
117
+ #
118
+ # @param [ Symbol ] name The name of the relation.
119
+ # @param [ Hash ] options The relation options.
120
+ # @param [ Proc ] block Optional block for defining extensions.
121
+ def belongs_to(name, options = {}, &block)
122
+ define_association!(__method__, name, options, &block)
123
+ end
124
+
125
+ # Adds a relational association from a parent Document to many
126
+ # Documents in another database or collection.
127
+ #
128
+ # @example Define the relation.
129
+ #
130
+ # class Person
131
+ # include Mongoid::Document
132
+ # has_many :posts
133
+ # end
134
+ #
135
+ # class Game
136
+ # include Mongoid::Document
137
+ # belongs_to :person
138
+ # end
139
+ #
140
+ # @param [ Symbol ] name The name of the relation.
141
+ # @param [ Hash ] options The relation options.
142
+ # @param [ Proc ] block Optional block for defining extensions.
143
+ def has_many(name, options = {}, &block)
144
+ define_association!(__method__, name, options, &block)
145
+ end
146
+
147
+ # Adds a relational many-to-many association between many of this
148
+ # Document and many of another Document.
149
+ #
150
+ # @example Define the relation.
151
+ #
152
+ # class Person
153
+ # include Mongoid::Document
154
+ # has_and_belongs_to_many :preferences
155
+ # end
156
+ #
157
+ # class Preference
158
+ # include Mongoid::Document
159
+ # has_and_belongs_to_many :people
160
+ # end
161
+ #
162
+ # @param [ Symbol ] name The name of the relation.
163
+ # @param [ Hash ] options The relation options.
164
+ # @param [ Proc ] block Optional block for defining extensions.
165
+ #
166
+ # @since 2.0.0.rc.1
167
+ def has_and_belongs_to_many(name, options = {}, &block)
168
+ define_association!(__method__, name, options, &block)
169
+ end
170
+
171
+ # Adds a relational association from the child Document to a Document in
172
+ # another database or collection.
173
+ #
174
+ # @example Define the relation.
175
+ #
176
+ # class Game
177
+ # include Mongoid::Document
178
+ # belongs_to :person
179
+ # end
180
+ #
181
+ # class Person
182
+ # include Mongoid::Document
183
+ # has_one :game
184
+ # end
185
+ #
186
+ # @param [ Symbol ] name The name of the relation.
187
+ # @param [ Hash ] options The relation options.
188
+ # @param [ Proc ] block Optional block for defining extensions.
189
+ def has_one(name, options = {}, &block)
190
+ define_association!(__method__, name, options, &block)
191
+ end
192
+
193
+ private
194
+
195
+ def define_association!(macro_name, name, options = {}, &block)
196
+ Association::MACRO_MAPPING[macro_name].new(self, name, options, &block).tap do |assoc|
197
+ assoc.setup!
198
+ self.relations = self.relations.merge(name => assoc)
199
+ end
200
+ end
201
+ end
202
+ end
203
+ end
204
+ end