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,7 @@
1
+ require 'mongoid/association/referenced/auto_save'
2
+ require 'mongoid/association/referenced/counter_cache'
3
+ require 'mongoid/association/referenced/syncable'
4
+ require 'mongoid/association/referenced/belongs_to'
5
+ require 'mongoid/association/referenced/has_many'
6
+ require 'mongoid/association/referenced/has_and_belongs_to_many'
7
+ require 'mongoid/association/referenced/has_one'
@@ -0,0 +1,79 @@
1
+ module Mongoid
2
+ module Association
3
+ module Referenced
4
+
5
+ module AutoSave
6
+ extend ActiveSupport::Concern
7
+
8
+ # Used to prevent infinite loops in associated autosaves.
9
+ #
10
+ # @example Is the document autosaved?
11
+ # document.autosaved?
12
+ #
13
+ # @return [ true, false ] Has the document already been autosaved?
14
+ #
15
+ # @since 3.0.0
16
+ def autosaved?
17
+ Threaded.autosaved?(self)
18
+ end
19
+
20
+ # Begin the associated autosave.
21
+ #
22
+ # @example Begin autosave.
23
+ # document.__autosaving__
24
+ #
25
+ # @since 3.1.3
26
+ def __autosaving__
27
+ Threaded.begin_autosave(self)
28
+ yield
29
+ ensure
30
+ Threaded.exit_autosave(self)
31
+ end
32
+
33
+ # Check if there is changes for auto-saving
34
+ #
35
+ # @example Return true if there is changes on self or in
36
+ # autosaved relations.
37
+ # document.changed_for_autosave?
38
+ #
39
+ # @since 3.1.3
40
+ def changed_for_autosave?(doc)
41
+ doc.new_record? || doc.changed? || doc.marked_for_destruction?
42
+ end
43
+
44
+ # Define the autosave method on an association's owning class for
45
+ # an associated object.
46
+ #
47
+ # @example Define the autosave method:
48
+ # Association::Referenced::Autosave.define_autosave!(association)
49
+ #
50
+ # @param [ Association ] association The association for which autosaving is enabled.
51
+ #
52
+ # @return [ Class ] The association's owner class.
53
+ #
54
+ # @since 7.0
55
+ def self.define_autosave!(association)
56
+ association.inverse_class.tap do |klass|
57
+ save_method = :"autosave_documents_for_#{association.name}"
58
+ klass.send(:define_method, save_method) do
59
+ if before_callback_halted?
60
+ self.before_callback_halted = false
61
+ else
62
+ __autosaving__ do
63
+ if relation = ivar(association.name)
64
+ Array(relation).each do |doc|
65
+ doc.with(persistence_context) do |d|
66
+ d.save
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ klass.after_save save_method, unless: :autosaved?
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,248 @@
1
+ require 'mongoid/association/referenced/belongs_to/binding'
2
+ require 'mongoid/association/referenced/belongs_to/buildable'
3
+ require 'mongoid/association/referenced/belongs_to/proxy'
4
+ require 'mongoid/association/referenced/belongs_to/eager'
5
+
6
+ module Mongoid
7
+ module Association
8
+ module Referenced
9
+
10
+ # The BelongsTo type association.
11
+ #
12
+ # @since 7.0
13
+ class BelongsTo
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
+ :autobuild,
25
+ :autosave,
26
+ :counter_cache,
27
+ :dependent,
28
+ :foreign_key,
29
+ :index,
30
+ :polymorphic,
31
+ :primary_key,
32
+ :touch,
33
+ :optional,
34
+ :required
35
+ ].freeze
36
+
37
+ # The complete list of valid options for this association, including
38
+ # the shared ones.
39
+ #
40
+ # @return [ Array<Symbol> ] The valid options.
41
+ #
42
+ # @since 7.0
43
+ VALID_OPTIONS = (ASSOCIATION_OPTIONS + SHARED_OPTIONS).freeze
44
+
45
+ # The type of the field holding the foreign key.
46
+ #
47
+ # @return [ Object ]
48
+ #
49
+ # @since 7.0
50
+ FOREIGN_KEY_FIELD_TYPE = Object
51
+
52
+ # The default foreign key suffix.
53
+ #
54
+ # @return [ String ] '_id'
55
+ #
56
+ # @since 7.0
57
+ FOREIGN_KEY_SUFFIX = '_id'.freeze
58
+
59
+ # The list of association complements.
60
+ #
61
+ # @return [ Array<Association> ] The association complements.
62
+ #
63
+ # @since 7.0
64
+ def relation_complements
65
+ @relation_complements ||= [ HasMany, HasOne ].freeze
66
+ end
67
+
68
+ # Setup the instance methods, fields, etc. on the association owning class.
69
+ #
70
+ # @return [ self ]
71
+ #
72
+ # @since 7.0
73
+ def setup!
74
+ setup_instance_methods!
75
+ @owner_class.aliased_fields[name.to_s] = foreign_key
76
+ self
77
+ end
78
+
79
+ # Does this association type store the foreign key?
80
+ #
81
+ # @return [ true ] Always true.
82
+ #
83
+ # @since 7.0
84
+ def stores_foreign_key?; true; end
85
+
86
+ # Is this association type embedded?
87
+ #
88
+ # @return [ false ] Always false.
89
+ #
90
+ # @since 7.0
91
+ def embedded?; false; end
92
+
93
+ # The default for validation the association object.
94
+ #
95
+ # @return [ false ] Always false.
96
+ #
97
+ # @since 7.0
98
+ def validation_default; false; end
99
+
100
+ # Get the foreign key field for saving the association reference.
101
+ #
102
+ # @return [ String ] The foreign key field for saving the association reference.
103
+ #
104
+ # @since 7.0
105
+ def foreign_key
106
+ @foreign_key ||= @options[:foreign_key] ? @options[:foreign_key].to_s :
107
+ default_foreign_key_field
108
+ end
109
+
110
+ # Get the relation proxy class for this association type.
111
+ #
112
+ # @return [ Association::BelongsTo::Proxy ] The proxy class.
113
+ #
114
+ # @since 7.0
115
+ def relation
116
+ Proxy
117
+ end
118
+
119
+ # Is this association polymorphic?
120
+ #
121
+ # @return [ true, false ] Whether this association is polymorphic.
122
+ #
123
+ # @since 7.0
124
+ def polymorphic?
125
+ @polymorphic ||= !!@options[:polymorphic]
126
+ end
127
+
128
+ # The name of the field used to store the type of polymorphic relation.
129
+ #
130
+ # @return [ String ] The field used to store the type of polymorphic relation.
131
+ #
132
+ # @since 7.0
133
+ def inverse_type
134
+ (@inverse_type ||= "#{name}_type") if polymorphic?
135
+ end
136
+
137
+ # The nested builder object.
138
+ #
139
+ # @param [ Hash ] attributes The attributes to use to build the association object.
140
+ # @param [ Hash ] options The options for the association.
141
+ #
142
+ # @return [ Association::Nested::One ] The Nested Builder object.
143
+ #
144
+ # @since 7.0
145
+ def nested_builder(attributes, options)
146
+ Nested::One.new(self, attributes, options)
147
+ end
148
+
149
+ # Get the path calculator for the supplied document.
150
+ #
151
+ # @example Get the path calculator.
152
+ # association.path(document)
153
+ #
154
+ # @param [ Document ] document The document to calculate on.
155
+ #
156
+ # @return [ Root ] The root atomic path calculator.
157
+ #
158
+ # @since 2.1.0
159
+ def path(document)
160
+ Mongoid::Atomic::Paths::Root.new(document)
161
+ end
162
+
163
+ private
164
+
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
+ define_counter_cache_callbacks!
173
+ polymorph!
174
+ define_dependency!
175
+ create_foreign_key_field!
176
+ setup_index!
177
+ define_touchable!
178
+ @owner_class.validates_associated(name) if validate?
179
+ @owner_class.validates(name, presence: true) if require_association?
180
+ end
181
+
182
+ def index_spec
183
+ if polymorphic?
184
+ { key => 1, inverse_type => 1 }
185
+ else
186
+ { key => 1 }
187
+ end
188
+ end
189
+
190
+ def default_primary_key
191
+ PRIMARY_KEY_DEFAULT
192
+ end
193
+
194
+ def default_foreign_key_field
195
+ @default_foreign_key_field ||= "#{name}#{FOREIGN_KEY_SUFFIX}"
196
+ end
197
+
198
+ def polymorph!
199
+ if polymorphic?
200
+ @owner_class.polymorphic = true
201
+ @owner_class.field(inverse_type, type: String)
202
+ end
203
+ end
204
+
205
+ def polymorphic_inverses(other = nil)
206
+ if other
207
+ matches = other.relations.values.select do |rel|
208
+ relation_complements.include?(rel.class) &&
209
+ rel.as == name &&
210
+ rel.relation_class_name == inverse_class_name
211
+ end
212
+ matches.collect { |m| m.name }
213
+ end
214
+ end
215
+
216
+ def determine_inverses(other)
217
+ matches = (other || relation_class).relations.values.select do |rel|
218
+ relation_complements.include?(rel.class) &&
219
+ rel.relation_class_name == inverse_class_name
220
+
221
+ end
222
+ if matches.size > 1
223
+ raise Errors::AmbiguousRelationship.new(relation_class, @owner_class, name, matches)
224
+ end
225
+ matches.collect { |m| m.name }
226
+ end
227
+
228
+ # If set to true, then the associated object will be validated when this object is saved
229
+ def require_association?
230
+ required = @options[:required] if @options.key?(:required)
231
+ required = !@options[:optional] if @options.key?(:optional) && required.nil?
232
+ required.nil? ? Mongoid.belongs_to_required_by_default : required
233
+ end
234
+
235
+ def create_foreign_key_field!
236
+ @owner_class.field(
237
+ foreign_key,
238
+ type: FOREIGN_KEY_FIELD_TYPE,
239
+ identity: true,
240
+ overwrite: true,
241
+ association: self,
242
+ default: nil
243
+ )
244
+ end
245
+ end
246
+ end
247
+ end
248
+ end
@@ -0,0 +1,87 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Referenced
5
+ class BelongsTo
6
+
7
+ # Binding class for belongs_to associations.
8
+ class Binding
9
+ include Bindable
10
+
11
+ # Binds the base object to the inverse of the relation. This is so we
12
+ # are referenced to the actual objects themselves on both sides.
13
+ #
14
+ # This case sets the association on the inverse object as well as the
15
+ # document itself.
16
+ #
17
+ # @example Bind the documents.
18
+ # game.person.bind(:continue => true)
19
+ # game.person = Person.new
20
+ #
21
+ # @since 2.0.0.rc.1
22
+ def bind_one
23
+ binding do
24
+ check_polymorphic_inverses!(_target)
25
+ bind_foreign_key(_base, record_id(_target))
26
+ bind_polymorphic_inverse_type(_base, _target.class.name)
27
+ if inverse = _association.inverse(_target)
28
+ if set_base_association
29
+ if _base.referenced_many?
30
+ _target.__send__(inverse).push(_base)
31
+ else
32
+ _target.set_relation(inverse, _base)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ # Unbinds the base object and the inverse, caused by setting the
40
+ # reference to nil.
41
+ #
42
+ # @example Unbind the document.
43
+ # game.person.unbind(:continue => true)
44
+ # game.person = nil
45
+ #
46
+ # @since 2.0.0.rc.1
47
+ def unbind_one
48
+ binding do
49
+ inverse = _association.inverse(_target)
50
+ bind_foreign_key(_base, nil)
51
+ bind_polymorphic_inverse_type(_base, nil)
52
+ if inverse
53
+ set_base_association
54
+ if _base.referenced_many?
55
+ _target.__send__(inverse).delete(_base)
56
+ else
57
+ _target.set_relation(inverse, nil)
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ private
64
+
65
+ # Check for problems with multiple inverse definitions.
66
+ #
67
+ # @api private
68
+ #
69
+ # @example Check for inverses errors.
70
+ # binding.check_inverses!(doc)
71
+ #
72
+ # @param [ Document ] doc The document to check.
73
+ #
74
+ # @since 3.0.0
75
+ def check_polymorphic_inverses!(doc)
76
+ inverses = _association.inverses(doc)
77
+ if inverses.count > 1 && _base.send(_association.foreign_key).nil?
78
+ raise Errors::InvalidSetPolymorphicRelation.new(
79
+ _association.name, _base.class.name, _target.class.name
80
+ )
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Referenced
5
+ class BelongsTo
6
+
7
+ # The Builder behavior for belongs_to 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.
14
+ #
15
+ # @example Build the document.
16
+ # relation.build(meta, attrs)
17
+ #
18
+ # @param [ Object ] base The base object.
19
+ # @param [ Object ] object The object to use to build the relation.
20
+ # @param [ String ] type The type of the relation.
21
+ #
22
+ # @return [ Document ] A single document.
23
+ def build(base, object, type = nil)
24
+ return object unless query?(object)
25
+ execute_query(object, type)
26
+ end
27
+
28
+ private
29
+
30
+ def execute_query(object, type)
31
+ query_criteria(object, type).limit(-1).first(id_sort: :none)
32
+ end
33
+
34
+ def query_criteria(object, type)
35
+ model = type ? type.constantize : relation_class
36
+ model.where(primary_key => object)
37
+ end
38
+
39
+ def query?(object)
40
+ object && !object.is_a?(Mongoid::Document)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end