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
@@ -1,14 +1,14 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Relations
3
+ module Association
4
4
 
5
5
  # This is the superclass for all many to one and many to many relation
6
6
  # proxies.
7
- class Many < Proxy
7
+ class Many < Association::Proxy
8
8
  include ::Enumerable
9
9
 
10
10
  delegate :avg, :max, :min, :sum, to: :criteria
11
- delegate :length, :size, to: :target
11
+ delegate :length, :size, to: :_target
12
12
 
13
13
  # Is the relation empty?
14
14
  #
@@ -28,14 +28,9 @@ module Mongoid
28
28
  # @example Create and save the new document.
29
29
  # person.posts.create(:text => "Testing")
30
30
  #
31
- # @overload create(attributes = nil, options = {}, type = nil)
32
- # @param [ Hash ] attributes The attributes to create with.
33
- # @param [ Hash ] options The scoped assignment options.
34
- # @param [ Class ] type The optional type of document to create.
35
31
  #
36
- # @overload create(attributes = nil, type = nil)
37
- # @param [ Hash ] attributes The attributes to create with.
38
- # @param [ Class ] type The optional type of document to create.
32
+ # @param [ Hash ] attributes The attributes to create with.
33
+ # @param [ Class ] type The optional type of document to create.
39
34
  #
40
35
  # @return [ Document ] The newly created document.
41
36
  #
@@ -45,7 +40,7 @@ module Mongoid
45
40
  attributes.map { |attrs| create(attrs, type, &block) }
46
41
  else
47
42
  doc = build(attributes, type, &block)
48
- base.persisted? ? doc.save : raise_unsaved(doc)
43
+ _base.persisted? ? doc.save : raise_unsaved(doc)
49
44
  doc
50
45
  end
51
46
  end
@@ -57,13 +52,8 @@ module Mongoid
57
52
  # @example Create and save the new document.
58
53
  # person.posts.create!(:text => "Testing")
59
54
  #
60
- # @overload create!(attributes = nil, options = {}, type = nil)
61
- # @param [ Hash ] attributes The attributes to create with.
62
- # @param [ Class ] type The optional type of document to create.
63
- #
64
- # @overload create!(attributes = nil, type = nil)
65
- # @param [ Hash ] attributes The attributes to create with.
66
- # @param [ Class ] type The optional type of document to create.
55
+ # @param [ Hash ] attributes The attributes to create with.
56
+ # @param [ Class ] type The optional type of document to create.
67
57
  #
68
58
  # @raise [ Errors::Validations ] If validation failed.
69
59
  #
@@ -75,7 +65,7 @@ module Mongoid
75
65
  attributes.map { |attrs| create!(attrs, type, &block) }
76
66
  else
77
67
  doc = build(attributes, type, &block)
78
- base.persisted? ? doc.save! : raise_unsaved(doc)
68
+ _base.persisted? ? doc.save! : raise_unsaved(doc)
79
69
  doc
80
70
  end
81
71
  end
@@ -86,13 +76,8 @@ module Mongoid
86
76
  # @example Find or create.
87
77
  # person.posts.find_or_create_by(:title => "Testing")
88
78
  #
89
- # @overload find_or_create_by(attributes = nil, type = nil)
90
- # @param [ Hash ] attributes The attributes to search or create with.
91
- # @param [ Class ] type The optional type of document to create.
92
- #
93
- # @overload find_or_create_by(attributes = nil, type = nil)
94
- # @param [ Hash ] attributes The attributes to search or create with.
95
- # @param [ Class ] type The optional type of document to create.
79
+ # @param [ Hash ] attrs The attributes to search or create with.
80
+ # @param [ Class ] type The optional type of document to create.
96
81
  #
97
82
  # @return [ Document ] An existing document or newly created one.
98
83
  def find_or_create_by(attrs = {}, type = nil, &block)
@@ -105,13 +90,8 @@ module Mongoid
105
90
  # @example Find or create.
106
91
  # person.posts.find_or_create_by!(:title => "Testing")
107
92
  #
108
- # @overload find_or_create_by!(attributes = nil, type = nil)
109
- # @param [ Hash ] attributes The attributes to search or create with.
110
- # @param [ Class ] type The optional type of document to create.
111
- #
112
- # @overload find_or_create_by!(attributes = nil, type = nil)
113
- # @param [ Hash ] attributes The attributes to search or create with.
114
- # @param [ Class ] type The optional type of document to create.
93
+ # @param [ Hash ] attrs The attributes to search or create with.
94
+ # @param [ Class ] type The optional type of document to create.
115
95
  #
116
96
  # @raise [ Errors::Validations ] If validation failed.
117
97
  #
@@ -126,13 +106,8 @@ module Mongoid
126
106
  # @example Find or initialize.
127
107
  # person.posts.find_or_initialize_by(:title => "Test")
128
108
  #
129
- # @overload find_or_initialize_by(attributes = {}, type = nil)
130
- # @param [ Hash ] attributes The attributes to search or initialize with.
131
- # @param [ Class ] type The optional subclass to build.
132
- #
133
- # @overload find_or_initialize_by(attributes = {}, type = nil)
134
- # @param [ Hash ] attributes The attributes to search or initialize with.
135
- # @param [ Class ] type The optional subclass to build.
109
+ # @param [ Hash ] attrs The attributes to search or initialize with.
110
+ # @param [ Class ] type The optional subclass to build.
136
111
  #
137
112
  # @return [ Document ] An existing document or newly instantiated one.
138
113
  def find_or_initialize_by(attrs = {}, type = nil, &block)
@@ -157,6 +132,7 @@ module Mongoid
157
132
  # relation.respond_to?(:name)
158
133
  #
159
134
  # @param [ Symbol ] name The method name.
135
+ # @param [ true, false ] include_private Whether to include private methods.
160
136
  #
161
137
  # @return [ true, false ] If the proxy responds to the method.
162
138
  #
@@ -195,7 +171,7 @@ module Mongoid
195
171
  #
196
172
  # @since 2.0.0.rc.6
197
173
  def serializable_hash(options = {})
198
- target.map { |document| document.serializable_hash(options) }
174
+ _target.map { |document| document.serializable_hash(options) }
199
175
  end
200
176
 
201
177
  # Get a criteria for the embedded documents without the default scoping
@@ -213,23 +189,13 @@ module Mongoid
213
189
 
214
190
  private
215
191
 
216
- def _session
217
- base.send(:_session)
218
- end
219
-
220
192
  # Find the first object given the supplied attributes or create/initialize it.
221
193
  #
222
194
  # @example Find or create|initialize.
223
195
  # person.addresses.find_or(:create, :street => "Bond")
224
196
  #
225
- # @overload find_or(method, attributes = {}, type = nil)
226
- # @param [ Symbol ] method The method name, create or new.
227
- # @param [ Hash ] attributes The attributes to search or build with.
228
- # @param [ Class ] type The optional subclass to build.
229
- #
230
- # @overload find_or(attributes = {}, type = nil)
231
197
  # @param [ Symbol ] method The method name, create or new.
232
- # @param [ Hash ] attributes The attributes to search or build with.
198
+ # @param [ Hash ] attrs The attributes to search or build with.
233
199
  # @param [ Class ] type The optional subclass to build.
234
200
  #
235
201
  # @return [ Document ] A matching document or a new/created one.
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Relations
3
+ module Association
4
4
  module Marshalable
5
5
 
6
6
  # Provides the data needed to Marshal.dump a relation proxy.
@@ -12,7 +12,7 @@ module Mongoid
12
12
  #
13
13
  # @since 3.0.15
14
14
  def marshal_dump
15
- [ base, target, __metadata ]
15
+ [ _base, _target, _association ]
16
16
  end
17
17
 
18
18
  # Takes the provided data and sets it back on the proxy.
@@ -20,12 +20,14 @@ module Mongoid
20
20
  # @example Load the proxy.
21
21
  # Marshal.load(proxy)
22
22
  #
23
+ # @param [ Array<Object> ] data The data to set on the proxy.
24
+ #
23
25
  # @return [ Array<Object> ] The loaded data.
24
26
  #
25
27
  # @since 3.0.15
26
28
  def marshal_load(data)
27
- @base, @target, @__metadata = data
28
- extend_proxy(__metadata.extension) if __metadata.extension?
29
+ @_base, @_target, @_association = data
30
+ extend_proxy(_association.extension) if _association.extension
29
31
  end
30
32
  end
31
33
  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
@@ -0,0 +1,200 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Nested
5
+ class Many
6
+ include Buildable
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
+ # @param [ Hash ] options The options.
20
+ #
21
+ # @return [ Array ] The attributes.
22
+ def build(parent, options = {})
23
+ @existing = parent.send(association.name)
24
+ if over_limit?(attributes)
25
+ raise Errors::TooManyNestedAttributeRecords.new(existing, options[:limit])
26
+ end
27
+ attributes.each do |attrs|
28
+ if attrs.is_a?(::Hash)
29
+ process_attributes(parent, attrs.with_indifferent_access)
30
+ else
31
+ process_attributes(parent, attrs[1].with_indifferent_access)
32
+ end
33
+ end
34
+ end
35
+
36
+ # Create the new builder for nested attributes on one-to-many
37
+ # relations.
38
+ #
39
+ # @example Initialize the builder.
40
+ # Many.new(association, attributes, options)
41
+ #
42
+ # @param [ Association ] association The association metadata.
43
+ # @param [ Hash ] attributes The attributes hash to attempt to set.
44
+ # @param [ Hash ] options The options defined.
45
+ def initialize(association, attributes, options = {})
46
+ if attributes.respond_to?(:with_indifferent_access)
47
+ @attributes = attributes.with_indifferent_access.sort do |a, b|
48
+ a[0].to_i <=> b[0].to_i
49
+ end
50
+ else
51
+ @attributes = attributes
52
+ end
53
+ @association = association
54
+ @options = options
55
+ @class_name = options[:class_name] ? options[:class_name].constantize : association.klass
56
+ end
57
+
58
+ private
59
+
60
+ # Can the existing relation potentially be deleted?
61
+ #
62
+ # @example Is the document destroyable?
63
+ # destroyable?({ :_destroy => "1" })
64
+ #
65
+ # @param [ Hash ] attributes The attributes to pull the flag from.
66
+ #
67
+ # @return [ true, false ] If the relation can potentially be deleted.
68
+ def destroyable?(attributes)
69
+ destroy = attributes.delete(:_destroy)
70
+ Nested::DESTROY_FLAGS.include?(destroy) && allow_destroy?
71
+ end
72
+
73
+ # Are the supplied attributes of greater number than the supplied
74
+ # limit?
75
+ #
76
+ # @example Are we over the set limit?
77
+ # builder.over_limit?({ "street" => "Bond" })
78
+ #
79
+ # @param [ Hash ] attributes The attributes being set.
80
+ #
81
+ # @return [ true, false ] If the attributes exceed the limit.
82
+ def over_limit?(attributes)
83
+ limit = options[:limit]
84
+ limit ? attributes.size > limit : false
85
+ end
86
+
87
+ # Process each set of attributes one at a time for each potential
88
+ # new, existing, or ignored document.
89
+ #
90
+ # @api private
91
+ #
92
+ # @example Process the attributes
93
+ # builder.process_attributes({ "id" => 1, "street" => "Bond" })
94
+ #
95
+ # @param [ Document ] parent The parent document.
96
+ # @param [ Hash ] attrs The single document attributes to process.
97
+ #
98
+ # @since 2.0.0
99
+ def process_attributes(parent, attrs)
100
+ return if reject?(parent, attrs)
101
+ if id = attrs.extract_id
102
+ update_nested_relation(parent, id, attrs)
103
+ else
104
+ existing.push(Factory.build(@class_name, attrs)) unless destroyable?(attrs)
105
+ end
106
+ end
107
+
108
+ # Destroy the child document, needs to do some checking for embedded
109
+ # relations and delay the destroy in case parent validation fails.
110
+ #
111
+ # @api private
112
+ #
113
+ # @example Destroy the child.
114
+ # builder.destroy(parent, relation, doc)
115
+ #
116
+ # @param [ Document ] parent The parent document.
117
+ # @param [ Proxy ] relation The relation proxy.
118
+ # @param [ Document ] doc The doc to destroy.
119
+ #
120
+ # @since 3.0.10
121
+ def destroy(parent, relation, doc)
122
+ doc.flagged_for_destroy = true
123
+ if !doc.embedded? || parent.new_record?
124
+ destroy_document(relation, doc)
125
+ else
126
+ parent.flagged_destroys.push(-> { destroy_document(relation, doc) })
127
+ end
128
+ end
129
+
130
+ # Destroy the document.
131
+ #
132
+ # @api private
133
+ #
134
+ # @example Destroy the document.
135
+ # builder.destroy_document(relation, doc)
136
+ #
137
+ # @param [ Proxy ] relation The relation proxy.
138
+ # @param [ Document ] doc The document to delete.
139
+ #
140
+ # @since 3.0.10
141
+ def destroy_document(relation, doc)
142
+ relation.delete(doc)
143
+ doc.destroy unless doc.embedded? || doc.destroyed?
144
+ end
145
+
146
+ # Update the document.
147
+ #
148
+ # @api private
149
+ #
150
+ # @example Update the document.
151
+ # builder.update_document(doc, {}, options)
152
+ #
153
+ # @param [ Document ] doc The document to update.
154
+ # @param [ Hash ] attrs The attributes.
155
+ #
156
+ # @since 3.0.10
157
+ def update_document(doc, attrs)
158
+ attrs.delete_id
159
+ if association.embedded?
160
+ doc.assign_attributes(attrs)
161
+ else
162
+ doc.update_attributes(attrs)
163
+ end
164
+ end
165
+
166
+ # Update nested relation.
167
+ #
168
+ # @api private
169
+ #
170
+ # @example Update nested relation.
171
+ # builder.update_nested_relation(parent, id, attrs)
172
+ #
173
+ # @param [ Document ] parent The parent document.
174
+ # @param [ String, BSON::ObjectId ] id of the related document.
175
+ # @param [ Hash ] attrs The single document attributes to process.
176
+ #
177
+ # @since 6.0.0
178
+ def update_nested_relation(parent, id, attrs)
179
+ first = existing.first
180
+ converted = first ? convert_id(first.class, id) : id
181
+
182
+ if existing.where(id: converted).exists?
183
+ # document exists in relation
184
+ doc = existing.find(converted)
185
+ if destroyable?(attrs)
186
+ destroy(parent, existing, doc)
187
+ else
188
+ update_document(doc, attrs)
189
+ end
190
+ else
191
+ # push existing document to relation
192
+ doc = existing.unscoped.find(converted)
193
+ update_document(doc, attrs)
194
+ existing.push(doc) unless destroyable?(attrs)
195
+ end
196
+ end
197
+ end
198
+ end
199
+ end
200
+ end
@@ -0,0 +1,72 @@
1
+ module Mongoid
2
+ module Association
3
+ module Nested
4
+ module Buildable
5
+
6
+ attr_accessor :attributes, :existing, :association, :options
7
+
8
+ # Determines if destroys are allowed for this document.
9
+ #
10
+ # @example Do we allow a destroy?
11
+ # builder.allow_destroy?
12
+ #
13
+ # @return [ true, false ] True if the allow destroy option was set.
14
+ #
15
+ # @since 2.0.0.rc.1
16
+ def allow_destroy?
17
+ options[:allow_destroy] || false
18
+ end
19
+
20
+ # Returns the reject if option defined with the macro.
21
+ #
22
+ # @example Is there a reject proc?
23
+ # builder.reject?
24
+ #
25
+ # @param [ Document ] document The parent document of the relation
26
+ # @param [ Hash ] attrs The attributes to check for rejection.
27
+ #
28
+ # @return [ true, false ] True and call proc or method if rejectable, false if not.
29
+ #
30
+ # @since 2.0.0.rc.1
31
+ def reject?(document, attrs)
32
+ case callback = options[:reject_if]
33
+ when Symbol
34
+ document.method(callback).arity == 0 ? document.send(callback) : document.send(callback, attrs)
35
+ when Proc
36
+ callback.call(attrs)
37
+ else
38
+ false
39
+ end
40
+ end
41
+
42
+ # Determines if only updates can occur. Only valid for one-to-one
43
+ # relations.
44
+ #
45
+ # @example Is this update only?
46
+ # builder.update_only?
47
+ #
48
+ # @return [ true, false ] True if the update_only option was set.
49
+ #
50
+ # @since 2.0.0.rc.1
51
+ def update_only?
52
+ options[:update_only] || false
53
+ end
54
+
55
+ # Convert an id to its appropriate type.
56
+ #
57
+ # @example Convert the id.
58
+ # builder.convert_id(Person, "4d371b444835d98b8b000010")
59
+ #
60
+ # @param [ Class ] klass The class we're trying to convert for.
61
+ # @param [ String ] id The id, usually coming from the form.
62
+ #
63
+ # @return [ BSON::ObjectId, String, Object ] The converted id.
64
+ #
65
+ # @since 2.0.0.rc.6
66
+ def convert_id(klass, id)
67
+ klass.using_object_ids? ? BSON::ObjectId.mongoize(id) : id
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end