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,204 @@
1
+ require 'mongoid/association/referenced/has_one/binding'
2
+ require 'mongoid/association/referenced/has_one/buildable'
3
+ require 'mongoid/association/referenced/has_one/proxy'
4
+ require 'mongoid/association/referenced/has_one/eager'
5
+
6
+ module Mongoid
7
+ module Association
8
+ module Referenced
9
+
10
+ # The has_one association.
11
+ #
12
+ # @since 7.0
13
+ class HasOne
14
+ include Relatable
15
+ include Buildable
16
+
17
+ # The options available for this type of association, in addition to the
18
+ # common ones.
19
+ #
20
+ # @return [ Array<Symbol> ] The extra valid options.
21
+ #
22
+ # @since 7.0
23
+ ASSOCIATION_OPTIONS = [
24
+ :as,
25
+ :autobuild,
26
+ :autosave,
27
+ :dependent,
28
+ :foreign_key,
29
+ :primary_key
30
+ ].freeze
31
+
32
+ # The complete list of valid options for this association, including
33
+ # the shared ones.
34
+ #
35
+ # @return [ Array<Symbol> ] The valid options.
36
+ #
37
+ # @since 7.0
38
+ VALID_OPTIONS = (ASSOCIATION_OPTIONS + SHARED_OPTIONS).freeze
39
+
40
+ # The default foreign key suffix.
41
+ #
42
+ # @return [ String ] '_id'
43
+ #
44
+ # @since 7.0
45
+ FOREIGN_KEY_SUFFIX = '_id'.freeze
46
+
47
+ # The list of association complements.
48
+ #
49
+ # @return [ Array<Association> ] The association complements.
50
+ #
51
+ # @since 7.0
52
+ def relation_complements
53
+ @relation_complements ||= [ Referenced::BelongsTo ].freeze
54
+ end
55
+
56
+ # Setup the instance methods, fields, etc. on the association owning class.
57
+ #
58
+ # @return [ self ]
59
+ #
60
+ # @since 7.0
61
+ def setup!
62
+ setup_instance_methods!
63
+ self
64
+ end
65
+
66
+ # Get the foreign key field for saving the association reference.
67
+ #
68
+ # @return [ String ] The foreign key field for saving the
69
+ # association reference.
70
+ #
71
+ # @since 7.0
72
+ def foreign_key
73
+ @foreign_key ||= @options[:foreign_key] ? @options[:foreign_key].to_s :
74
+ default_foreign_key_field
75
+ end
76
+
77
+ # Is this association type embedded?
78
+ #
79
+ # @return [ false ] Always false.
80
+ #
81
+ # @since 7.0
82
+ def embedded?; false; end
83
+
84
+ # The default for validation the association object.
85
+ #
86
+ # @return [ true ] Always true.
87
+ #
88
+ # @since 7.0
89
+ def validation_default; true; end
90
+
91
+ # Get the relation proxy class for this association type.
92
+ #
93
+ # @return [ Association::HasOne::Proxy ] The proxy class.
94
+ #
95
+ # @since 7.0
96
+ def relation
97
+ Proxy
98
+ end
99
+
100
+ # The nested builder object.
101
+ #
102
+ # @param [ Hash ] attributes The attributes to use to build the association object.
103
+ # @param [ Hash ] options The options for the association.
104
+ #
105
+ # @return [ Association::Nested::Many ] The Nested Builder object.
106
+ #
107
+ # @since 7.0
108
+ def nested_builder(attributes, options)
109
+ Nested::One.new(self, attributes, options)
110
+ end
111
+
112
+ # Is this association polymorphic?
113
+ #
114
+ # @return [ true, false ] Whether this association is polymorphic.
115
+ #
116
+ # @since 7.0
117
+ def polymorphic?
118
+ @polymorphic ||= !!as
119
+ end
120
+
121
+ # The type of this association if it's polymorphic.
122
+ #
123
+ # @note Only relevant for polymorphic relations.
124
+ #
125
+ # @return [ String, nil ] The type field.
126
+ #
127
+ # @since 7.0
128
+ def type
129
+ @type ||= "#{as}_type" if polymorphic?
130
+ end
131
+
132
+ # Whether trying to bind an object using this association should raise
133
+ # an error.
134
+ #
135
+ # @param [ Document ] doc The document to be bound.
136
+ #
137
+ # @return [ true, false ] Whether the document can be bound.
138
+ def bindable?(doc)
139
+ forced_nil_inverse? || (!!inverse && doc.fields.keys.include?(foreign_key))
140
+ end
141
+
142
+ def stores_foreign_key?; false; end
143
+
144
+ # Get the path calculator for the supplied document.
145
+ #
146
+ # @example Get the path calculator.
147
+ # Proxy.path(document)
148
+ #
149
+ # @param [ Document ] document The document to calculate on.
150
+ #
151
+ # @return [ Root ] The root atomic path calculator.
152
+ #
153
+ # @since 2.1.0
154
+ def path(document)
155
+ Mongoid::Atomic::Paths::Root.new(document)
156
+ end
157
+
158
+ private
159
+
160
+ # Setup the instance methods on the class having this association type.
161
+ #
162
+ # @return [ self ]
163
+ #
164
+ # @since 7.0
165
+ def setup_instance_methods!
166
+ define_getter!
167
+ define_setter!
168
+ define_existence_check!
169
+ define_builder!
170
+ define_creator!
171
+ define_autosaver!
172
+ polymorph!
173
+ define_dependency!
174
+ @owner_class.validates_associated(name) if validate?
175
+ self
176
+ end
177
+
178
+ def default_foreign_key_field
179
+ @default_foreign_key_field ||= "#{inverse}#{FOREIGN_KEY_SUFFIX}"
180
+ end
181
+
182
+ def polymorphic_inverses(other)
183
+ [ as ]
184
+ end
185
+
186
+ def determine_inverses(other)
187
+ matches = (other || relation_class).relations.values.select do |rel|
188
+ relation_complements.include?(rel.class) &&
189
+ rel.relation_class_name == inverse_class_name
190
+
191
+ end
192
+ if matches.size > 1
193
+ raise Errors::AmbiguousRelationship.new(relation_class, @owner_class, name, matches)
194
+ end
195
+ matches.collect { |m| m.name } unless matches.blank?
196
+ end
197
+
198
+ def default_primary_key
199
+ PRIMARY_KEY_DEFAULT
200
+ end
201
+ end
202
+ end
203
+ end
204
+ end
@@ -1,16 +1,19 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Relations
4
- module Bindings
5
- module Referenced
3
+ module Association
4
+ module Referenced
5
+ class HasOne
6
6
 
7
- # Binding class for references_one relations.
8
- class One < Binding
7
+ # Binding class for has_one relations.
8
+ #
9
+ # @since 7.0
10
+ class Binding
11
+ include Bindable
9
12
 
10
13
  # Binds the base object to the inverse of the relation. This is so we
11
14
  # are referenced to the actual objects themselves on both sides.
12
15
  #
13
- # This case sets the metadata on the inverse object as well as the
16
+ # This case sets the association metadata on the inverse object as well as the
14
17
  # document itself.
15
18
  #
16
19
  # @example Bind the document.
@@ -20,7 +23,7 @@ module Mongoid
20
23
  # @since 2.0.0.rc.1
21
24
  def bind_one
22
25
  binding do
23
- bind_from_relational_parent(target)
26
+ bind_from_relational_parent(_target)
24
27
  end
25
28
  end
26
29
 
@@ -34,7 +37,7 @@ module Mongoid
34
37
  # @since 2.0.0.rc.1
35
38
  def unbind_one
36
39
  binding do
37
- unbind_from_relational_parent(target)
40
+ unbind_from_relational_parent(_target)
38
41
  end
39
42
  end
40
43
  end
@@ -0,0 +1,60 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Referenced
5
+ class HasOne
6
+
7
+ # The Builder behavior for has_one associations.
8
+ #
9
+ # @since 7.0
10
+ module Buildable
11
+
12
+ # This method either takes an _id or an object and queries for the
13
+ # inverse side using the id or sets the object after clearing the
14
+ # associated object.
15
+ #
16
+ # @return [ Document ] A single document.
17
+ def build(base, object, type = nil)
18
+ if query?(object)
19
+ if !base.new_record?
20
+ execute_query(object, base)
21
+ end
22
+ else
23
+ clear_associated(object)
24
+ object
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def clear_associated(object)
31
+ if object && (associated = object.send(inverse))
32
+ associated.substitute(nil)
33
+ end
34
+ end
35
+
36
+ def query_criteria(object, base)
37
+ crit = klass.where(foreign_key => object)
38
+ with_polymorphic_criterion(crit, base)
39
+ end
40
+
41
+ def execute_query(object, base)
42
+ query_criteria(object, base).limit(-1).first(id_sort: :none)
43
+ end
44
+
45
+ def with_polymorphic_criterion(criteria, base)
46
+ if polymorphic?
47
+ criteria.where(type => base.class.name)
48
+ else
49
+ criteria
50
+ end
51
+ end
52
+
53
+ def query?(object)
54
+ object && !object.is_a?(Mongoid::Document)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,35 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Referenced
5
+
6
+ class HasOne
7
+
8
+ class Eager < Association::Referenced::Eager::Base
9
+
10
+ private
11
+
12
+ def preload
13
+ @docs.each do |d|
14
+ set_relation(d, nil)
15
+ end
16
+
17
+ each_loaded_document do |doc|
18
+ id = doc.send(key)
19
+ set_on_parent(id, doc)
20
+ end
21
+ end
22
+
23
+ def group_by_key
24
+ @association.primary_key
25
+ end
26
+
27
+ def key
28
+ @association.foreign_key
29
+ end
30
+
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Relations
4
- module Builders
3
+ module Association
4
+ module Referenced
5
5
  module NestedAttributes
6
6
  class One < NestedBuilder
7
7
 
@@ -24,14 +24,14 @@ module Mongoid
24
24
  # @since 2.0.0
25
25
  def build(parent)
26
26
  return if reject?(parent, attributes)
27
- @existing = parent.send(metadata.name)
27
+ @existing = parent.send(association.name)
28
28
  if update?
29
29
  attributes.delete_id
30
30
  existing.assign_attributes(attributes)
31
31
  elsif replace?
32
- parent.send(metadata.setter, Factory.build(metadata.klass, attributes))
32
+ parent.send(association.setter, Factory.build(association.klass, attributes))
33
33
  elsif delete?
34
- parent.send(metadata.setter, nil)
34
+ parent.send(association.setter, nil)
35
35
  end
36
36
  end
37
37
 
@@ -39,16 +39,16 @@ module Mongoid
39
39
  # relations.
40
40
  #
41
41
  # @example Instantiate the builder.
42
- # One.new(metadata, attributes)
42
+ # One.new(association, attributes)
43
43
  #
44
- # @param [ Metadata ] metadata The relation metadata.
44
+ # @param [ Association ] association The association metadata.
45
45
  # @param [ Hash ] attributes The attributes hash to attempt to set.
46
46
  # @param [ Hash ] options The options defined.
47
47
  #
48
48
  # @since 2.0.0
49
- def initialize(metadata, attributes, options)
49
+ def initialize(association, attributes, options)
50
50
  @attributes = attributes.with_indifferent_access
51
- @metadata = metadata
51
+ @association = association
52
52
  @options = options
53
53
  @destroy = @attributes.delete(:_destroy)
54
54
  end
@@ -0,0 +1,113 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Referenced
5
+ class HasOne
6
+
7
+ # This class defines the behaviour for all relations that are a
8
+ # one-to-one between documents in different collections.
9
+ class Proxy < Association::One
10
+
11
+ # Instantiate a new references_one relation. Will set the foreign key
12
+ # and the base on the inverse object.
13
+ #
14
+ # @example Create the new relation.
15
+ # Referenced::One.new(base, target, association)
16
+ #
17
+ # @param [ Document ] base The document this relation hangs off of.
18
+ # @param [ Document ] target The target (child) of the relation.
19
+ # @param [ Association ] association The association metadata.
20
+ def initialize(base, target, association)
21
+ init(base, target, association) do
22
+ raise_mixed if klass.embedded? && !klass.cyclic?
23
+ characterize_one(_target)
24
+ bind_one
25
+ _target.save if persistable?
26
+ end
27
+ end
28
+
29
+ # Removes the association between the base document and the target
30
+ # document by deleting the foreign key and the reference, orphaning
31
+ # the target document in the process.
32
+ #
33
+ # @example Nullify the relation.
34
+ # person.game.nullify
35
+ #
36
+ # @since 2.0.0.rc.1
37
+ def nullify
38
+ unbind_one
39
+ _target.save
40
+ end
41
+
42
+ # Substitutes the supplied target document for the existing document
43
+ # in the relation. If the new target is nil, perform the necessary
44
+ # deletion.
45
+ #
46
+ # @example Replace the relation.
47
+ # person.game.substitute(new_game)
48
+ #
49
+ # @param [ Array<Document> ] replacement The replacement target.
50
+ #
51
+ # @return [ One ] The relation.
52
+ #
53
+ # @since 2.0.0.rc.1
54
+ def substitute(replacement)
55
+ unbind_one
56
+ if persistable?
57
+ if _association.destructive?
58
+ send(_association.dependent)
59
+ else
60
+ save if persisted?
61
+ end
62
+ end
63
+ HasOne::Proxy.new(_base, replacement, _association) if replacement
64
+ end
65
+
66
+ private
67
+
68
+ # Instantiate the binding associated with this relation.
69
+ #
70
+ # @example Get the binding.
71
+ # relation.binding([ address ])
72
+ #
73
+ # @return [ Binding ] The binding object.
74
+ def binding
75
+ HasOne::Binding.new(_base, _target, _association)
76
+ end
77
+
78
+ # Are we able to persist this relation?
79
+ #
80
+ # @example Can we persist the relation?
81
+ # relation.persistable?
82
+ #
83
+ # @return [ true, false ] If the relation is persistable.
84
+ #
85
+ # @since 2.1.0
86
+ def persistable?
87
+ _base.persisted? && !_binding? && !_building?
88
+ end
89
+
90
+ class << self
91
+
92
+ def eager_loader(association, docs)
93
+ Eager.new(association, docs)
94
+ end
95
+
96
+ # Returns true if the relation is an embedded one. In this case
97
+ # always false.
98
+ #
99
+ # @example Is this relation embedded?
100
+ # Referenced::One.embedded?
101
+ #
102
+ # @return [ false ] Always false.
103
+ #
104
+ # @since 2.0.0.rc.1
105
+ def embedded?
106
+ false
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end