mongoid 6.4.8 → 7.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (320) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/Rakefile +0 -26
  4. data/lib/config/locales/en.yml +17 -0
  5. data/lib/mongoid/association/accessors.rb +339 -0
  6. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  7. data/lib/mongoid/association/builders.rb +92 -0
  8. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  9. data/lib/mongoid/association/depending.rb +116 -0
  10. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
  11. data/lib/mongoid/{relations → association}/embedded/batchable.rb +21 -21
  12. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  13. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  14. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  15. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  16. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  17. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
  18. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  19. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +529 -0
  20. data/lib/mongoid/association/embedded/embeds_many.rb +210 -0
  21. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
  22. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
  23. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  24. data/lib/mongoid/association/embedded/embeds_one.rb +173 -0
  25. data/lib/mongoid/association/embedded.rb +4 -0
  26. data/lib/mongoid/association/macros.rb +204 -0
  27. data/lib/mongoid/{relations → association}/many.rb +20 -50
  28. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  29. data/lib/mongoid/association/nested/many.rb +200 -0
  30. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  31. data/lib/mongoid/association/nested/one.rb +127 -0
  32. data/lib/mongoid/association/nested.rb +15 -0
  33. data/lib/mongoid/{relations → association}/one.rb +6 -6
  34. data/lib/mongoid/association/options.rb +152 -0
  35. data/lib/mongoid/{relations → association}/proxy.rb +31 -58
  36. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  37. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  38. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  39. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  40. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  41. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  42. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  43. data/lib/mongoid/association/referenced/eager.rb +159 -0
  44. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  45. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +310 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  49. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
  50. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  51. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  52. data/lib/mongoid/association/referenced/has_many/enumerable.rb +510 -0
  53. data/lib/mongoid/association/referenced/has_many/proxy.rb +578 -0
  54. data/lib/mongoid/association/referenced/has_many.rb +275 -0
  55. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  56. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  57. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  58. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  59. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  60. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  61. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  62. data/lib/mongoid/association/referenced.rb +7 -0
  63. data/lib/mongoid/{relations → association}/reflections.rb +21 -17
  64. data/lib/mongoid/association/relatable.rb +415 -0
  65. data/lib/mongoid/association/touchable.rb +97 -0
  66. data/lib/mongoid/association.rb +150 -0
  67. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  68. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  69. data/lib/mongoid/atomic.rb +4 -4
  70. data/lib/mongoid/attributes/dynamic.rb +2 -2
  71. data/lib/mongoid/attributes/nested.rb +10 -10
  72. data/lib/mongoid/attributes/processing.rb +2 -2
  73. data/lib/mongoid/attributes/readonly.rb +2 -4
  74. data/lib/mongoid/attributes.rb +22 -13
  75. data/lib/mongoid/changeable.rb +1 -1
  76. data/lib/mongoid/clients/options.rb +1 -1
  77. data/lib/mongoid/clients/sessions.rb +2 -2
  78. data/lib/mongoid/composable.rb +4 -4
  79. data/lib/mongoid/config.rb +1 -0
  80. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  81. data/lib/mongoid/contextual/atomic.rb +1 -1
  82. data/lib/mongoid/contextual/geo_near.rb +1 -1
  83. data/lib/mongoid/contextual/map_reduce.rb +4 -4
  84. data/lib/mongoid/contextual/memory.rb +25 -7
  85. data/lib/mongoid/contextual/mongo.rb +13 -11
  86. data/lib/mongoid/copyable.rb +6 -6
  87. data/lib/mongoid/criteria/includable.rb +14 -14
  88. data/lib/mongoid/criteria/modifiable.rb +8 -14
  89. data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
  90. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  91. data/lib/mongoid/criteria/queryable/selectable.rb +10 -34
  92. data/lib/mongoid/criteria.rb +2 -2
  93. data/lib/mongoid/document.rb +6 -6
  94. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  95. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  96. data/lib/mongoid/errors/unknown_model.rb +25 -0
  97. data/lib/mongoid/errors.rb +3 -0
  98. data/lib/mongoid/extensions/array.rb +5 -5
  99. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  100. data/lib/mongoid/extensions/hash.rb +5 -2
  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/extensions.rb +0 -4
  106. data/lib/mongoid/factory.rb +13 -3
  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/fields.rb +3 -3
  111. data/lib/mongoid/indexable.rb +8 -5
  112. data/lib/mongoid/interceptable.rb +5 -5
  113. data/lib/mongoid/matchable/and.rb +1 -1
  114. data/lib/mongoid/matchable/elem_match.rb +9 -3
  115. data/lib/mongoid/matchable.rb +0 -3
  116. data/lib/mongoid/persistable/creatable.rb +2 -2
  117. data/lib/mongoid/persistable/deletable.rb +9 -8
  118. data/lib/mongoid/persistable/incrementable.rb +1 -1
  119. data/lib/mongoid/persistable/logical.rb +1 -1
  120. data/lib/mongoid/persistable/settable.rb +5 -5
  121. data/lib/mongoid/persistable/updatable.rb +2 -2
  122. data/lib/mongoid/persistable/upsertable.rb +1 -1
  123. data/lib/mongoid/persistable.rb +5 -6
  124. data/lib/mongoid/persistence_context.rb +1 -5
  125. data/lib/mongoid/query_cache.rb +19 -64
  126. data/lib/mongoid/railtie.rb +0 -17
  127. data/lib/mongoid/reloadable.rb +1 -1
  128. data/lib/mongoid/scopable.rb +3 -3
  129. data/lib/mongoid/serializable.rb +4 -4
  130. data/lib/mongoid/shardable.rb +1 -1
  131. data/lib/mongoid/tasks/database.rb +2 -2
  132. data/lib/mongoid/threaded.rb +0 -36
  133. data/lib/mongoid/traversable.rb +3 -3
  134. data/lib/mongoid/validatable/presence.rb +2 -2
  135. data/lib/mongoid/validatable/uniqueness.rb +4 -4
  136. data/lib/mongoid/validatable.rb +8 -8
  137. data/lib/mongoid/version.rb +1 -1
  138. data/lib/mongoid.rb +1 -1
  139. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -0
  140. data/spec/app/models/animal.rb +2 -1
  141. data/spec/app/models/bomb.rb +1 -1
  142. data/spec/app/models/message.rb +1 -1
  143. data/spec/app/models/person.rb +5 -2
  144. data/spec/app/models/shipment_address.rb +1 -0
  145. data/spec/app/models/vertex.rb +6 -0
  146. data/spec/app/models/wiki_page.rb +1 -1
  147. data/spec/config/mongoid.yml +1 -0
  148. data/spec/mongoid/{relations → association}/accessors_spec.rb +1 -1
  149. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  150. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  151. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  152. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  153. data/spec/mongoid/association/depending_spec.rb +613 -0
  154. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  155. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  156. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  157. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  158. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +5 -77
  159. data/spec/mongoid/association/embedded/embedded_in_spec.rb +843 -0
  160. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  161. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  162. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +140 -428
  163. data/spec/mongoid/association/embedded/embeds_many_spec.rb +852 -0
  164. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  165. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  166. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  167. data/spec/mongoid/association/embedded/embeds_one_spec.rb +908 -0
  168. data/spec/mongoid/{relations → association}/macros_spec.rb +148 -73
  169. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  170. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  171. data/spec/mongoid/association/options_spec.rb +1321 -0
  172. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +7 -34
  173. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  174. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  175. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +9 -9
  176. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  177. data/spec/mongoid/association/referenced/belongs_to_spec.rb +1963 -0
  178. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
  179. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  180. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +5 -5
  181. data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +107 -98
  182. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
  183. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  184. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  185. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +26 -11
  186. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +122 -1
  187. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +28 -93
  188. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  189. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  190. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  191. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  192. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  193. data/spec/mongoid/association/referenced/has_one_spec.rb +1244 -0
  194. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  195. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
  196. data/spec/mongoid/{relations → association}/touchable_spec.rb +19 -1
  197. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  198. data/spec/mongoid/atomic/modifiers_spec.rb +2 -2
  199. data/spec/mongoid/atomic_spec.rb +4 -4
  200. data/spec/mongoid/attributes/nested_spec.rb +14 -12
  201. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  202. data/spec/mongoid/attributes_spec.rb +38 -2
  203. data/spec/mongoid/clients/factory_spec.rb +28 -52
  204. data/spec/mongoid/clients/options_spec.rb +65 -69
  205. data/spec/mongoid/clients/sessions_spec.rb +4 -13
  206. data/spec/mongoid/config_spec.rb +24 -0
  207. data/spec/mongoid/contextual/geo_near_spec.rb +0 -1
  208. data/spec/mongoid/contextual/memory_spec.rb +19 -0
  209. data/spec/mongoid/contextual/mongo_spec.rb +30 -5
  210. data/spec/mongoid/copyable_spec.rb +34 -0
  211. data/spec/mongoid/criteria/modifiable_spec.rb +183 -60
  212. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
  213. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +43 -0
  214. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  215. data/spec/mongoid/criteria/queryable/selectable_spec.rb +3 -42
  216. data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
  217. data/spec/mongoid/criteria/scopable_spec.rb +0 -81
  218. data/spec/mongoid/criteria_spec.rb +16 -19
  219. data/spec/mongoid/document_spec.rb +2 -56
  220. data/spec/mongoid/extensions/array_spec.rb +11 -15
  221. data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
  222. data/spec/mongoid/extensions/hash_spec.rb +18 -1
  223. data/spec/mongoid/extensions/object_spec.rb +7 -11
  224. data/spec/mongoid/extensions/range_spec.rb +7 -0
  225. data/spec/mongoid/extensions/regexp_spec.rb +0 -23
  226. data/spec/mongoid/extensions/string_spec.rb +7 -35
  227. data/spec/mongoid/factory_spec.rb +19 -1
  228. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  229. data/spec/mongoid/fields_spec.rb +2 -2
  230. data/spec/mongoid/findable_spec.rb +1 -1
  231. data/spec/mongoid/indexable_spec.rb +18 -8
  232. data/spec/mongoid/interceptable_spec.rb +22 -1
  233. data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
  234. data/spec/mongoid/matchable_spec.rb +1 -26
  235. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  236. data/spec/mongoid/persistable/savable_spec.rb +2 -2
  237. data/spec/mongoid/persistable/settable_spec.rb +1 -35
  238. data/spec/mongoid/persistable_spec.rb +21 -6
  239. data/spec/mongoid/query_cache_spec.rb +16 -99
  240. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  241. data/spec/mongoid/scopable_spec.rb +0 -13
  242. data/spec/mongoid/shardable_spec.rb +32 -12
  243. data/spec/mongoid/threaded_spec.rb +0 -68
  244. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  245. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  246. data/spec/mongoid/validatable_spec.rb +1 -1
  247. data/spec/spec_helper.rb +12 -14
  248. data.tar.gz.sig +1 -1
  249. metadata +192 -207
  250. metadata.gz.sig +0 -0
  251. data/lib/mongoid/matchable/nor.rb +0 -37
  252. data/lib/mongoid/railties/controller_runtime.rb +0 -86
  253. data/lib/mongoid/relations/accessors.rb +0 -267
  254. data/lib/mongoid/relations/auto_save.rb +0 -94
  255. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  256. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  257. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  258. data/lib/mongoid/relations/bindings.rb +0 -9
  259. data/lib/mongoid/relations/builder.rb +0 -57
  260. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  261. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  262. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  263. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  264. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  265. data/lib/mongoid/relations/builders.rb +0 -106
  266. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  267. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  268. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  269. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  270. data/lib/mongoid/relations/cascading.rb +0 -56
  271. data/lib/mongoid/relations/conversions.rb +0 -34
  272. data/lib/mongoid/relations/counter_cache.rb +0 -160
  273. data/lib/mongoid/relations/cyclic.rb +0 -107
  274. data/lib/mongoid/relations/eager/base.rb +0 -153
  275. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  276. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  277. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  278. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  279. data/lib/mongoid/relations/embedded/in.rb +0 -241
  280. data/lib/mongoid/relations/embedded/many.rb +0 -683
  281. data/lib/mongoid/relations/embedded/one.rb +0 -235
  282. data/lib/mongoid/relations/macros.rb +0 -367
  283. data/lib/mongoid/relations/metadata.rb +0 -1179
  284. data/lib/mongoid/relations/nested_builder.rb +0 -74
  285. data/lib/mongoid/relations/options.rb +0 -49
  286. data/lib/mongoid/relations/polymorphic.rb +0 -39
  287. data/lib/mongoid/relations/referenced/in.rb +0 -304
  288. data/lib/mongoid/relations/referenced/many.rb +0 -812
  289. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  290. data/lib/mongoid/relations/referenced/one.rb +0 -290
  291. data/lib/mongoid/relations/synchronization.rb +0 -169
  292. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  293. data/lib/mongoid/relations/targets.rb +0 -2
  294. data/lib/mongoid/relations/touchable.rb +0 -97
  295. data/lib/mongoid/relations.rb +0 -148
  296. data/spec/app/models/array_field.rb +0 -7
  297. data/spec/app/models/delegating_patient.rb +0 -16
  298. data/spec/integration/document_spec.rb +0 -22
  299. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  300. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  301. data/spec/mongoid/matchable/nor_spec.rb +0 -209
  302. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  303. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  304. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  305. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  306. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  307. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  308. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  309. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  310. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  311. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  312. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  313. data/spec/mongoid/relations/options_spec.rb +0 -35
  314. data/spec/rails/controller_extension/controller_runtime_spec.rb +0 -110
  315. data/spec/support/cluster_config.rb +0 -158
  316. data/spec/support/constraints.rb +0 -101
  317. data/spec/support/macros.rb +0 -20
  318. data/spec/support/session_registry.rb +0 -50
  319. data/spec/support/spec_config.rb +0 -42
  320. /data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
@@ -0,0 +1,127 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Nested
5
+ class One
6
+ include Buildable
7
+
8
+ attr_accessor :destroy
9
+
10
+
11
+ # Builds the relation depending on the attributes and the options
12
+ # passed to the macro.
13
+ #
14
+ # @example Build a 1-1 nested document.
15
+ # one.build(person, as: :admin)
16
+ #
17
+ # @note This attempts to perform 3 operations, either one of an update of
18
+ # the existing relation, a replacement of the relation with a new
19
+ # document, or a removal of the relation.
20
+ #
21
+ # @param [ Document ] parent The parent document.
22
+ #
23
+ # @return [ Document ] The built document.
24
+ #
25
+ # @since 2.0.0
26
+ def build(parent)
27
+ return if reject?(parent, attributes)
28
+ @existing = parent.send(association.name)
29
+ if update?
30
+ attributes.delete_id
31
+ existing.assign_attributes(attributes)
32
+ elsif replace?
33
+ parent.send(association.setter, Factory.build(@class_name, attributes))
34
+ elsif delete?
35
+ parent.send(association.setter, nil)
36
+ end
37
+ end
38
+
39
+ # Create the new builder for nested attributes on one-to-one
40
+ # relations.
41
+ #
42
+ # @example Instantiate the builder.
43
+ # One.new(association, attributes)
44
+ #
45
+ # @param [ Association ] association The association metadata.
46
+ # @param [ Hash ] attributes The attributes hash to attempt to set.
47
+ # @param [ Hash ] options The options defined.
48
+ #
49
+ # @since 2.0.0
50
+ def initialize(association, attributes, options)
51
+ @attributes = attributes.with_indifferent_access
52
+ @association = association
53
+ @options = options
54
+ @class_name = options[:class_name] ? options[:class_name].constantize : association.klass
55
+ @destroy = @attributes.delete(:_destroy)
56
+ end
57
+
58
+ private
59
+
60
+ # Is the id in the attribtues acceptable for allowing an update to
61
+ # the existing relation?
62
+ #
63
+ # @api private
64
+ #
65
+ # @example Is the id acceptable?
66
+ # one.acceptable_id?
67
+ #
68
+ # @return [ true, false ] If the id part of the logic will allow an update.
69
+ #
70
+ # @since 2.0.0
71
+ def acceptable_id?
72
+ id = convert_id(existing.class, attributes[:id])
73
+ existing._id == id || id.nil? || (existing._id != id && update_only?)
74
+ end
75
+
76
+ # Can the existing relation be deleted?
77
+ #
78
+ # @example Can the existing object be deleted?
79
+ # one.delete?
80
+ #
81
+ # @return [ true, false ] If the relation should be deleted.
82
+ #
83
+ # @since 2.0.0
84
+ def delete?
85
+ destroyable? && !attributes[:id].nil?
86
+ end
87
+
88
+ # Can the existing relation potentially be destroyed?
89
+ #
90
+ # @example Is the object destroyable?
91
+ # one.destroyable?({ :_destroy => "1" })
92
+ #
93
+ # @return [ true, false ] If the relation can potentially be
94
+ # destroyed.
95
+ #
96
+ # @since 2.0.0
97
+ def destroyable?
98
+ Nested::DESTROY_FLAGS.include?(destroy) && allow_destroy?
99
+ end
100
+
101
+ # Is the document to be replaced?
102
+ #
103
+ # @example Is the document to be replaced?
104
+ # one.replace?
105
+ #
106
+ # @return [ true, false ] If the document should be replaced.
107
+ #
108
+ # @since 2.0.0
109
+ def replace?
110
+ !existing && !destroyable? && !attributes.blank?
111
+ end
112
+
113
+ # Should the document be updated?
114
+ #
115
+ # @example Should the document be updated?
116
+ # one.update?
117
+ #
118
+ # @return [ true, false ] If the object should have its attributes updated.
119
+ #
120
+ # @since 2.0.0
121
+ def update?
122
+ existing && !destroyable? && acceptable_id?
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,15 @@
1
+ require 'mongoid/association/nested/nested_buildable'
2
+ require 'mongoid/association/nested/many'
3
+ require 'mongoid/association/nested/one'
4
+
5
+ module Mongoid
6
+ module Association
7
+ module Nested
8
+
9
+ # The flags indicating that a relation can be destroyed.
10
+ #
11
+ # @since 7.0
12
+ DESTROY_FLAGS = [1, "1", true, "true"].freeze
13
+ end
14
+ end
15
+ end
@@ -1,10 +1,10 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Relations
3
+ module Association
4
4
 
5
5
  # This is the superclass for one to one relations and defines the common
6
6
  # behaviour or those proxies.
7
- class One < Proxy
7
+ class One < Association::Proxy
8
8
 
9
9
  # Clear this relation - same as calling #delete on the document.
10
10
  #
@@ -15,7 +15,7 @@ module Mongoid
15
15
  #
16
16
  # @since 3.0.0
17
17
  def clear
18
- target.delete
18
+ _target.delete
19
19
  end
20
20
 
21
21
  # Get all the documents in the relation that are loaded into memory.
@@ -27,7 +27,7 @@ module Mongoid
27
27
  #
28
28
  # @since 2.1.0
29
29
  def in_memory
30
- [ target ]
30
+ [ _target ]
31
31
  end
32
32
 
33
33
  # Since method_missing is overridden we should override this as well.
@@ -41,7 +41,7 @@ module Mongoid
41
41
  #
42
42
  # @since 2.1.8
43
43
  def respond_to?(name, include_private = false)
44
- target.respond_to?(name, include_private) || super
44
+ _target.respond_to?(name, include_private) || super
45
45
  end
46
46
 
47
47
  # Evolve the proxy document into an object id.
@@ -53,7 +53,7 @@ module Mongoid
53
53
  #
54
54
  # @since 4.0.0
55
55
  def __evolve_object_id__
56
- target._id
56
+ _target._id
57
57
  end
58
58
  end
59
59
  end
@@ -0,0 +1,152 @@
1
+ module Mongoid
2
+ module Association
3
+
4
+ module Options
5
+
6
+ # Returns the name of the parent to a polymorphic child.
7
+ #
8
+ # @return [ String, Symbol ] The name.
9
+ #
10
+ # @since 7.0
11
+ def as
12
+ @options[:as]
13
+ end
14
+
15
+ # Specify what happens to the associated object when the owner is destroyed.
16
+ #
17
+ # @return [ String ] The dependent option.
18
+ #
19
+ # @since 7.0
20
+ def dependent
21
+ @options[:dependent]
22
+ end
23
+
24
+ # The custom sorting options on the relation.
25
+ #
26
+ # @return [ Criteria::Queryable::Key ] The custom sorting options.
27
+ #
28
+ # @since 7.0
29
+ def order
30
+ @options[:order]
31
+ end
32
+
33
+ # Whether to index the primary or foreign key field.
34
+ #
35
+ # @return [ true, false ]
36
+ #
37
+ # @since 7.0
38
+ def indexed?
39
+ @indexed ||= !!@options[:index]
40
+ end
41
+
42
+ # Whether the association is autobuilding.
43
+ #
44
+ # @return [ true, false ]
45
+ #
46
+ # @since 7.0
47
+ def autobuilding?
48
+ !!@options[:autobuild]
49
+ end
50
+
51
+ # Is the relation cyclic.
52
+ #
53
+ # @return [ true, false ] Whether the relation is cyclic.
54
+ #
55
+ # @since 7.0
56
+ def cyclic?
57
+ !!@options[:cyclic]
58
+ end
59
+
60
+ # The name the owning object uses to refer to this relation.
61
+ #
62
+ # @return [ String ] The inverse_of option.
63
+ #
64
+ # @since 7.0
65
+ def inverse_of
66
+ @options[:inverse_of]
67
+ end
68
+
69
+ # Mongoid assumes that the field used to hold the primary key of the association is id.
70
+ # You can override this and explicitly specify the primary key with the :primary_key option.
71
+ #
72
+ # @return [ Symbol, String ] The primary key.
73
+ #
74
+ # @since 7.0
75
+ def primary_key
76
+ @primary_key ||= @options[:primary_key] ? @options[:primary_key].to_s : Relatable::PRIMARY_KEY_DEFAULT
77
+ end
78
+
79
+ # Options to save any loaded members and destroy members that are marked for destruction
80
+ # when the parent object is saved.
81
+ #
82
+ # @return [ true, false ] The autosave option.
83
+ #
84
+ # @since 7.0
85
+ def autosave
86
+ !!@options[:autosave]
87
+ end
88
+ alias :autosave? :autosave
89
+
90
+ # Whether the association is counter-cached.
91
+ #
92
+ # @return [ true, false ]
93
+ #
94
+ # @since 7.0
95
+ def counter_cached?
96
+ !!@options[:counter_cache]
97
+ end
98
+
99
+ # Whether this association is polymorphic.
100
+ #
101
+ # @return [ true, false ] Whether the association is polymorphic.
102
+ #
103
+ # @since 7.0
104
+ def polymorphic?; false; end
105
+
106
+ # Whether the relation has callbacks cascaded down from the parent.
107
+ #
108
+ # @return [ true, false ] Whether callbacks are cascaded.
109
+ #
110
+ # @since 7.0
111
+ def cascading_callbacks?
112
+ !!@options[:cascade_callbacks]
113
+ end
114
+
115
+ # The store_as option.
116
+ #
117
+ # @return [ nil ] Default is nil.
118
+ #
119
+ # @since 7.0
120
+ def store_as; end
121
+
122
+ # Whether the association has forced nil inverse (So no foreign keys are saved).
123
+ #
124
+ # @return [ false ] Default is false.
125
+ #
126
+ # @since 7.0
127
+ def forced_nil_inverse?; false; end
128
+
129
+ # The field for saving the associated object's type.
130
+ #
131
+ # @return [ nil ] Default is nil.
132
+ #
133
+ # @since 7.0
134
+ def type; end
135
+
136
+ # The field for saving the associated object's type.
137
+ #
138
+ # @return [ nil ] Default is nil.
139
+ #
140
+ # @since 7.0
141
+ def touch_field
142
+ @touch_field ||= options[:touch] if (options[:touch].is_a?(String) || options[:touch].is_a?(Symbol))
143
+ end
144
+
145
+ private
146
+
147
+ def touchable?
148
+ !!@options[:touch]
149
+ end
150
+ end
151
+ end
152
+ end
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- require "mongoid/relations/marshalable"
2
+ require "mongoid/association/marshalable"
3
3
 
4
4
  module Mongoid
5
- module Relations
5
+ module Association
6
6
 
7
7
  # This class is the superclass for all relation proxy objects, and contains
8
8
  # common behaviour for all of them.
@@ -18,29 +18,28 @@ module Mongoid
18
18
  include Threaded::Lifecycle
19
19
  include Marshalable
20
20
 
21
- attr_accessor :base, :__metadata, :target
22
- alias :relation_metadata :__metadata
21
+ attr_accessor :_base, :_association, :_target
23
22
 
24
23
  # Backwards compatibility with Mongoid beta releases.
25
- delegate :foreign_key, :inverse_foreign_key, to: :__metadata
24
+ delegate :foreign_key, :inverse_foreign_key, to: :_association
26
25
  delegate :bind_one, :unbind_one, to: :binding
27
- delegate :collection_name, to: :base
26
+ delegate :collection_name, to: :_base
28
27
 
29
- # Convenience for setting the target and the metadata properties since
28
+ # Convenience for setting the target and the association metadata properties since
30
29
  # all proxies will need to do this.
31
30
  #
32
31
  # @example Initialize the proxy.
33
- # proxy.init(person, name, metadata)
32
+ # proxy.init(person, name, association)
34
33
  #
35
34
  # @param [ Document ] base The base document on the proxy.
36
35
  # @param [ Document, Array<Document> ] target The target of the proxy.
37
- # @param [ Metadata ] metadata The relation's metadata.
36
+ # @param [ Association ] association The association metadata.
38
37
  #
39
38
  # @since 2.0.0.rc.1
40
- def init(base, target, metadata)
41
- @base, @target, @__metadata = base, target, metadata
39
+ def init(base, target, association)
40
+ @_base, @_target, @_association = base, target, association
42
41
  yield(self) if block_given?
43
- extend_proxies(metadata.extension) if metadata.extension?
42
+ extend_proxies(association.extension) if association.extension
44
43
  end
45
44
 
46
45
  # Allow extension to be an array and extend each module
@@ -48,7 +47,7 @@ module Mongoid
48
47
  extension.flatten.each {|ext| extend_proxy(ext) }
49
48
  end
50
49
 
51
- # Get the class from the metadata, or return nil if no metadata present.
50
+ # Get the class from the association, or return nil if no association present.
52
51
  #
53
52
  # @example Get the class.
54
53
  # proxy.klass
@@ -57,7 +56,7 @@ module Mongoid
57
56
  #
58
57
  # @since 3.0.15
59
58
  def klass
60
- __metadata ? __metadata.klass : nil
59
+ _association ? _association.klass : nil
61
60
  end
62
61
 
63
62
  # Resets the criteria inside the relation proxy. Used by many to many
@@ -68,7 +67,7 @@ module Mongoid
68
67
  #
69
68
  # @since 3.0.14
70
69
  def reset_unloaded
71
- target.reset_unloaded(criteria)
70
+ _target.reset_unloaded(criteria)
72
71
  end
73
72
 
74
73
  # The default substitutable object for a relation proxy is the clone of
@@ -81,7 +80,7 @@ module Mongoid
81
80
  #
82
81
  # @since 2.1.6
83
82
  def substitutable
84
- target
83
+ _target
85
84
  end
86
85
 
87
86
  protected
@@ -95,20 +94,20 @@ module Mongoid
95
94
  #
96
95
  # @since 2.0.0
97
96
  def collection
98
- root = base._root
97
+ root = _base._root
99
98
  root.collection unless root.embedded?
100
99
  end
101
100
 
102
- # Takes the supplied document and sets the metadata on it.
101
+ # Takes the supplied document and sets the association on it.
103
102
  #
104
- # @example Set the metadata.
103
+ # @example Set the association metadata.
105
104
  # proxt.characterize_one(name)
106
105
  #
107
106
  # @param [ Document ] document The document to set on.
108
107
  #
109
108
  # @since 2.0.0.rc.4
110
109
  def characterize_one(document)
111
- document.__metadata = __metadata unless document.__metadata
110
+ document._association = _association unless document._association
112
111
  end
113
112
 
114
113
  # Default behavior of method missing should be to delegate all calls
@@ -118,7 +117,7 @@ module Mongoid
118
117
  # @param [ Array ] args The arguments passed to the method.
119
118
  #
120
119
  def method_missing(name, *args, &block)
121
- target.send(name, *args, &block)
120
+ _target.send(name, *args, &block)
122
121
  end
123
122
 
124
123
  # When the base document illegally references an embedded document this
@@ -131,7 +130,7 @@ module Mongoid
131
130
  #
132
131
  # @since 2.0.0
133
132
  def raise_mixed
134
- raise Errors::MixedRelations.new(base.class, __metadata.klass)
133
+ raise Errors::MixedRelations.new(_base.class, _association.klass)
135
134
  end
136
135
 
137
136
  # When the base is not yet saved and the user calls create or create!
@@ -146,30 +145,7 @@ module Mongoid
146
145
  #
147
146
  # @since 2.0.0.rc.6
148
147
  def raise_unsaved(doc)
149
- raise Errors::UnsavedDocument.new(base, doc)
150
- end
151
-
152
- # Return the name of defined callback method
153
- #
154
- # @example returns the before_add callback method name
155
- # callback_method(:before_add)
156
- #
157
- # @param [ Symbol ] callback_name Which callback
158
- #
159
- # @return [ Array ] with callback methods to be executed, the array may have symbols and Procs
160
- #
161
- # @since 3.1.0
162
- def callback_method(callback_name)
163
- methods = []
164
- metadata = __metadata[callback_name]
165
- if metadata
166
- if metadata.is_a?(Array)
167
- methods.concat(metadata)
168
- else
169
- methods << metadata
170
- end
171
- end
172
- methods
148
+ raise Errors::UnsavedDocument.new(_base, doc)
173
149
  end
174
150
 
175
151
  # Executes a callback method
@@ -181,14 +157,11 @@ module Mongoid
181
157
  #
182
158
  # @since 3.1.0
183
159
  def execute_callback(callback, doc)
184
- callback_method = callback_method(callback)
185
- if callback_method
186
- callback_method.each do |c|
187
- if c.is_a? Proc
188
- c.call(base, doc)
189
- else
190
- base.send c, doc
191
- end
160
+ _association.get_callbacks(callback).each do |c|
161
+ if c.is_a? Proc
162
+ c.call(_base, doc)
163
+ else
164
+ _base.send c, doc
192
165
  end
193
166
  end
194
167
  end
@@ -198,16 +171,16 @@ module Mongoid
198
171
  # Apply ordering to the criteria if it was defined on the relation.
199
172
  #
200
173
  # @example Apply the ordering.
201
- # Proxy.apply_ordering(criteria, metadata)
174
+ # Proxy.apply_ordering(criteria, association)
202
175
  #
203
176
  # @param [ Criteria ] criteria The criteria to modify.
204
- # @param [ Metadata ] metadata The relation metadata.
177
+ # @param [ Association ] association The association metadata.
205
178
  #
206
179
  # @return [ Criteria ] The ordered criteria.
207
180
  #
208
181
  # @since 3.0.6
209
- def apply_ordering(criteria, metadata)
210
- metadata.order ? criteria.order_by(metadata.order) : criteria
182
+ def apply_ordering(criteria, association)
183
+ association.order ? criteria.order_by(association.order) : criteria
211
184
  end
212
185
  end
213
186
  end
@@ -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