mongoid 6.4.8 → 7.0.0

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 (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
@@ -1,57 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
-
5
- # Superclass for all builder objects. Builders are responsible for either
6
- # looking up a relation's target from the database, or creating them from a
7
- # supplied attributes hash.
8
- class Builder
9
- include Threaded::Lifecycle
10
-
11
- attr_reader :base, :metadata, :object
12
-
13
- # Instantiate the new builder for a relation.
14
- #
15
- # @example Create the builder.
16
- # Builder.new(metadata, { :field => "value })
17
- #
18
- # @param [ Document ] base The base document.
19
- # @param [ Metdata ] metadata The metadata for the relation.
20
- # @param [ Hash, BSON::ObjectId ] object The attributes to build from or
21
- # id to query with.
22
- #
23
- # @since 2.0.0.rc.1
24
- def initialize(base, metadata, object)
25
- @base, @metadata, @object = base, metadata, object
26
- end
27
-
28
- protected
29
-
30
- # Get the class from the metadata.
31
- #
32
- # @example Get the class.
33
- # builder.klass
34
- #
35
- # @return [ Class ] The class from the metadata.
36
- #
37
- # @since 2.3.2
38
- def klass
39
- @klass ||= metadata.klass
40
- end
41
-
42
- # Do we need to perform a database query? It will be so if the object we
43
- # have is not a document.
44
- #
45
- # @example Should we query the database?
46
- # builder.query?
47
- #
48
- # @return [ true, false ] Whether a database query should happen.
49
- #
50
- # @since 2.0.0.rc.1
51
- def query?
52
- obj = object.__array__.first
53
- !obj.is_a?(Mongoid::Document) && !obj.nil?
54
- end
55
- end
56
- end
57
- end
@@ -1,199 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
- module Builders
5
- module NestedAttributes
6
- class Many < NestedBuilder
7
-
8
- # Builds the relation depending on the attributes and the options
9
- # passed to the macro.
10
- #
11
- # This attempts to perform 3 operations, either one of an update of
12
- # the existing relation, a replacement of the relation with a new
13
- # document, or a removal of the relation.
14
- #
15
- # @example Build the nested attrs.
16
- # many.build(person)
17
- #
18
- # @param [ Document ] parent The parent document of the relation.
19
- #
20
- # @return [ Array ] The attributes.
21
- def build(parent, options = {})
22
- @existing = parent.send(metadata.name)
23
- if over_limit?(attributes)
24
- raise Errors::TooManyNestedAttributeRecords.new(existing, options[:limit])
25
- end
26
- attributes.each do |attrs|
27
- if attrs.is_a?(::Hash)
28
- process_attributes(parent, attrs.with_indifferent_access)
29
- else
30
- process_attributes(parent, attrs[1].with_indifferent_access)
31
- end
32
- end
33
- end
34
-
35
- # Create the new builder for nested attributes on one-to-many
36
- # relations.
37
- #
38
- # @example Initialize the builder.
39
- # One.new(metadata, attributes, options)
40
- #
41
- # @param [ Metadata ] metadata The relation metadata.
42
- # @param [ Hash ] attributes The attributes hash to attempt to set.
43
- # @param [ Hash ] options The options defined.
44
- def initialize(metadata, attributes, options = {})
45
- if attributes.respond_to?(:with_indifferent_access)
46
- @attributes = attributes.with_indifferent_access.sort do |a, b|
47
- a[0].to_i <=> b[0].to_i
48
- end
49
- else
50
- @attributes = attributes
51
- end
52
- @metadata = metadata
53
- @options = options
54
- end
55
-
56
- private
57
-
58
- # Can the existing relation potentially be deleted?
59
- #
60
- # @example Is the document destroyable?
61
- # destroyable?({ :_destroy => "1" })
62
- #
63
- # @param [ Hash ] attributes The attributes to pull the flag from.
64
- #
65
- # @return [ true, false ] If the relation can potentially be deleted.
66
- def destroyable?(attributes)
67
- destroy = attributes.delete(:_destroy)
68
- [ 1, "1", true, "true" ].include?(destroy) && allow_destroy?
69
- end
70
-
71
- # Are the supplied attributes of greater number than the supplied
72
- # limit?
73
- #
74
- # @example Are we over the set limit?
75
- # builder.over_limit?({ "street" => "Bond" })
76
- #
77
- # @param [ Hash ] attributes The attributes being set.
78
- #
79
- # @return [ true, false ] If the attributes exceed the limit.
80
- def over_limit?(attributes)
81
- limit = options[:limit]
82
- limit ? attributes.size > limit : false
83
- end
84
-
85
- # Process each set of attributes one at a time for each potential
86
- # new, existing, or ignored document.
87
- #
88
- # @api private
89
- #
90
- # @example Process the attributes
91
- # builder.process_attributes({ "id" => 1, "street" => "Bond" })
92
- #
93
- # @param [ Document ] parent The parent document.
94
- # @param [ Hash ] attrs The single document attributes to process.
95
- #
96
- # @since 2.0.0
97
- def process_attributes(parent, attrs)
98
- return if reject?(parent, attrs)
99
- if id = attrs.extract_id
100
- update_nested_relation(parent, id, attrs)
101
- else
102
- existing.push(Factory.build(metadata.klass, attrs)) unless destroyable?(attrs)
103
- end
104
- end
105
-
106
- # Destroy the child document, needs to do some checking for embedded
107
- # relations and delay the destroy in case parent validation fails.
108
- #
109
- # @api private
110
- #
111
- # @example Destroy the child.
112
- # builder.destroy(parent, relation, doc)
113
- #
114
- # @param [ Document ] parent The parent document.
115
- # @param [ Proxy ] relation The relation proxy.
116
- # @param [ Document ] doc The doc to destroy.
117
- #
118
- # @since 3.0.10
119
- def destroy(parent, relation, doc)
120
- doc.flagged_for_destroy = true
121
- if !doc.embedded? || parent.new_record?
122
- destroy_document(relation, doc)
123
- else
124
- parent.flagged_destroys.push(->{ destroy_document(relation, doc) })
125
- end
126
- end
127
-
128
- # Destroy the document.
129
- #
130
- # @api private
131
- #
132
- # @example Destroy the document.
133
- # builder.destroy_document(relation, doc)
134
- #
135
- # @param [ Proxy ] relation The relation proxy.
136
- # @param [ Document ] doc The document to delete.
137
- #
138
- # @since 3.0.10
139
- def destroy_document(relation, doc)
140
- relation.delete(doc)
141
- doc.destroy unless doc.embedded? || doc.destroyed?
142
- end
143
-
144
- # Update the document.
145
- #
146
- # @api private
147
- #
148
- # @example Update the document.
149
- # builder.update_document(doc, {}, options)
150
- #
151
- # @param [ Document ] doc The document to update.
152
- # @param [ Hash ] attrs The attributes.
153
- #
154
- # @since 3.0.10
155
- def update_document(doc, attrs)
156
- attrs.delete_id
157
- if metadata.embedded?
158
- doc.assign_attributes(attrs)
159
- else
160
- doc.update_attributes(attrs)
161
- end
162
- end
163
-
164
- # Update nested relation.
165
- #
166
- # @api private
167
- #
168
- # @example Update nested relation.
169
- # builder.update_nested_relation(parent, id, attrs)
170
- #
171
- # @param [ Document ] parent The parent document.
172
- # @param [ String, BSON::ObjectId ] id of the related document.
173
- # @param [ Hash ] attrs The single document attributes to process.
174
- #
175
- # @since 6.0.0
176
- def update_nested_relation(parent, id, attrs)
177
- first = existing.first
178
- converted = first ? convert_id(first.class, id) : id
179
-
180
- if existing.where(id: converted).exists?
181
- # document exists in relation
182
- doc = existing.find(converted)
183
- if destroyable?(attrs)
184
- destroy(parent, existing, doc)
185
- else
186
- update_document(doc, attrs)
187
- end
188
- else
189
- # push existing document to relation
190
- doc = existing.unscoped.find(converted)
191
- update_document(doc, attrs)
192
- existing.push(doc) unless destroyable?(attrs)
193
- end
194
- end
195
- end
196
- end
197
- end
198
- end
199
- end
@@ -1,26 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
- module Builders
5
- module Referenced
6
- class In < Builder
7
-
8
- # This builder either takes a foreign key and queries for the
9
- # object or a document, where it will just return it.
10
- #
11
- # @example Build the document.
12
- # Builder.new(meta, attrs).build
13
- #
14
- # @param [ String ] type The type of document to query for.
15
- #
16
- # @return [ Document ] A single document.
17
- def build(type = nil)
18
- return object unless query?
19
- model = type ? type.constantize : metadata.klass
20
- metadata.criteria(object, model).first
21
- end
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,26 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
- module Builders
5
- module Referenced
6
- class Many < Builder
7
-
8
- # This builder either takes a hash and queries for the
9
- # object or an array of documents, where it will just return tem.
10
- #
11
- # @example Build the documents.
12
- # Builder.new(meta, attrs).build
13
- #
14
- # @param [ String ] type The type of document to query for.
15
- #
16
- # @return [ Array<Document> ] The documents.
17
- def build(type = nil)
18
- return object unless query?
19
- return [] if object.is_a?(Array)
20
- metadata.criteria(Conversions.flag(object, metadata), base.class)
21
- end
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,39 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
- module Builders
5
- module Referenced
6
- class ManyToMany < Builder
7
-
8
- # This builder either takes a hash and queries for the
9
- # object or an array of documents, where it will just return them.
10
- #
11
- # @example Build the documents.
12
- # Builder.new(meta, attrs).build
13
- #
14
- # @param [ String ] type The type of document to query for.
15
- #
16
- # @return [ Array<Document> ] The documents.
17
- def build(type = nil)
18
- return object.try(:dup) unless query?
19
- ids = object || []
20
- metadata.criteria(ids, base.class)
21
- end
22
-
23
- # Do we need to perform a database query? It will be so if the object we
24
- # have is not a document.
25
- #
26
- # @example Should we query the database?
27
- # builder.query?
28
- #
29
- # @return [ true, false ] Whether a database query should happen.
30
- #
31
- # @since 2.0.0.rc.1
32
- def query?
33
- object.nil? || !object.first.is_a?(Mongoid::Document)
34
- end
35
- end
36
- end
37
- end
38
- end
39
- end
@@ -1,26 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
- module Builders
5
- module Referenced
6
- class One < Builder
7
-
8
- # This builder either takes an _id or an object and queries for the
9
- # inverse side using the id or sets the object.
10
- #
11
- # @example Build the document.
12
- # Builder.new(meta, attrs).build
13
- #
14
- # @param [ String ] type The type of document to query for.
15
- #
16
- # @return [ Document ] A single document.
17
- def build(type = nil)
18
- return object unless query?
19
- return nil if base.new_record?
20
- metadata.criteria(Conversions.flag(object, metadata), base.class).first
21
- end
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,106 +0,0 @@
1
- # encoding: utf-8
2
- require "mongoid/relations/builder"
3
- require "mongoid/relations/nested_builder"
4
- require "mongoid/relations/builders/embedded/in"
5
- require "mongoid/relations/builders/embedded/many"
6
- require "mongoid/relations/builders/embedded/one"
7
- require "mongoid/relations/builders/nested_attributes/one"
8
- require "mongoid/relations/builders/nested_attributes/many"
9
- require "mongoid/relations/builders/referenced/in"
10
- require "mongoid/relations/builders/referenced/many"
11
- require "mongoid/relations/builders/referenced/many_to_many"
12
- require "mongoid/relations/builders/referenced/one"
13
-
14
- module Mongoid
15
- module Relations
16
-
17
- # This module is responsible for defining the build and create methods used
18
- # in one to one relations.
19
- #
20
- # @example Methods that get created.
21
- #
22
- # class Person
23
- # include Mongoid::Document
24
- # embeds_one :name
25
- # end
26
- #
27
- # # The following methods get created:
28
- # person.build_name({ :first_name => "Durran" })
29
- # person.create_name({ :first_name => "Durran" })
30
- #
31
- # @since 2.0.0.rc.1
32
- module Builders
33
- extend ActiveSupport::Concern
34
-
35
- private
36
-
37
- # Parse out the attributes and the options from the args passed to a
38
- # build_ or create_ methods.
39
- #
40
- # @example Parse the args.
41
- # doc.parse_args(:name => "Joe")
42
- #
43
- # @param [ Array ] args The arguments.
44
- #
45
- # @return [ Array<Hash> ] The attributes and options.
46
- #
47
- # @since 2.3.4
48
- def parse_args(*args)
49
- [ args.first || {}, args.size > 1 ? args[1] : {} ]
50
- end
51
-
52
- module ClassMethods
53
-
54
- # Defines a builder method for an embeds_one relation. This is
55
- # defined as #build_name.
56
- #
57
- # @example
58
- # Person.builder("name")
59
- #
60
- # @param [ String, Symbol ] name The name of the relation.
61
- #
62
- # @return [ Class ] The class being set up.
63
- #
64
- # @since 2.0.0.rc.1
65
- def builder(name, metadata)
66
- re_define_method("build_#{name}") do |*args|
67
- attributes, _options = parse_args(*args)
68
- document = Factory.build(metadata.klass, attributes)
69
- _building do
70
- child = send("#{name}=", document)
71
- child.run_callbacks(:build)
72
- child
73
- end
74
- end
75
- self
76
- end
77
-
78
- # Defines a creator method for an embeds_one relation. This is
79
- # defined as #create_name. After the object is built it will
80
- # immediately save.
81
- #
82
- # @example
83
- # Person.creator("name")
84
- #
85
- # @param [ String, Symbol ] name The name of the relation.
86
- #
87
- # @return [ Class ] The class being set up.
88
- #
89
- # @since 2.0.0.rc.1
90
- def creator(name, metadata)
91
- re_define_method("create_#{name}") do |*args|
92
- attributes, _options = parse_args(*args)
93
- document = Factory.build(metadata.klass, attributes)
94
- doc = _assigning do
95
- send("#{name}=", document)
96
- end
97
- doc.save
98
- save if new_record? && metadata.stores_foreign_key?
99
- doc
100
- end
101
- self
102
- end
103
- end
104
- end
105
- end
106
- end
@@ -1,44 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
- module Cascading
5
- class Delete
6
-
7
- attr_accessor :document, :relation, :metadata
8
-
9
- # Initialize the new cascade strategy, which will set up the relation
10
- # and the metadata.
11
- #
12
- # @example Instantiate the strategy
13
- # Strategy.new(document, metadata)
14
- #
15
- # @param [ Document ] document The document to cascade from.
16
- # @param [ Metadata ] metadata The relation's metadata.
17
- #
18
- # @return [ Strategy ] The new strategy.
19
- def initialize(document, metadata)
20
- @document, @metadata = document, metadata
21
- @relation = document.send(metadata.name)
22
- end
23
-
24
- # Execute the cascading deletion for the relation if it already exists.
25
- # This should be optimized in the future potentially not to load all
26
- # objects from the db.
27
- #
28
- # @example Perform the cascading delete.
29
- # strategy.cascade
30
- #
31
- # @since 2.0.0
32
- def cascade
33
- if relation
34
- if relation.cascades.empty?
35
- relation.clear
36
- else
37
- ::Array.wrap(relation).each { |doc| doc.delete }
38
- end
39
- end
40
- end
41
- end
42
- end
43
- end
44
- end
@@ -1,43 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
- module Cascading
5
- class Destroy
6
-
7
- attr_accessor :document, :relation, :metadata
8
-
9
- # Initialize the new cascade strategy, which will set up the relation
10
- # and the metadata.
11
- #
12
- # @example Instantiate the strategy
13
- # Strategy.new(document, metadata)
14
- #
15
- # @param [ Document ] document The document to cascade from.
16
- # @param [ Metadata ] metadata The relation's metadata.
17
- #
18
- # @return [ Strategy ] The new strategy.
19
- def initialize(document, metadata)
20
- @document, @metadata = document, metadata
21
- @relation = document.send(metadata.name)
22
- end
23
-
24
- # Execute the cascading deletion for the relation if it already exists.
25
- # This should be optimized in the future potentially not to load all
26
- # objects from the db.
27
- #
28
- # @example Perform the cascading destroy.
29
- # strategy.cascade
30
- def cascade
31
- if relation
32
- if relation.is_a?(Enumerable)
33
- relation.entries
34
- relation.each { |doc| doc.destroy }
35
- else
36
- relation.destroy
37
- end
38
- end
39
- end
40
- end
41
- end
42
- end
43
- end
@@ -1,35 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
- module Cascading
5
- class Nullify
6
-
7
- attr_accessor :document, :relation, :metadata
8
-
9
- # Initialize the new cascade strategy, which will set up the relation
10
- # and the metadata.
11
- #
12
- # @example Instantiate the strategy
13
- # Strategy.new(document, metadata)
14
- #
15
- # @param [ Document ] document The document to cascade from.
16
- # @param [ Metadata ] metadata The relation's metadata.
17
- #
18
- # @return [ Strategy ] The new strategy.
19
- def initialize(document, metadata)
20
- @document, @metadata = document, metadata
21
- @relation = document.send(metadata.name)
22
- end
23
-
24
- # This cascade does not delete the referenced relations, but instead
25
- # sets the foreign key values to nil.
26
- #
27
- # @example Nullify the reference.
28
- # strategy.cascade
29
- def cascade
30
- relation.nullify if relation
31
- end
32
- end
33
- end
34
- end
35
- end
@@ -1,39 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
- module Cascading
5
- class Restrict
6
-
7
- attr_accessor :document, :relation, :metadata
8
-
9
- # Initialize the new cascade strategy, which will set up the relation
10
- # and the metadata.
11
- #
12
- # @example Instantiate the strategy
13
- # Strategy.new(document, metadata)
14
- #
15
- # @param [ Document ] document The document to cascade from.
16
- # @param [ Metadata ] metadata The relation's metadata.
17
- #
18
- # @return [ Strategy ] The new strategy.
19
- def initialize(document, metadata)
20
- @document, @metadata = document, metadata
21
- @relation = document.send(metadata.name)
22
- end
23
-
24
- # Execute the cascading deletion for the relation if it already exists.
25
- # This should be optimized in the future potentially not to load all
26
- # objects from the db.
27
- #
28
- # @example Perform the cascading delete.
29
- # strategy.cascade
30
- def cascade
31
- unless relation.blank?
32
- raise Errors::DeleteRestriction.new(document, metadata.name)
33
- end
34
- end
35
- end
36
- end
37
- end
38
- end
39
-