mongoid 6.4.2 → 7.0.3

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 (318) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/config/locales/en.yml +17 -0
  4. data/lib/mongoid/association/accessors.rb +339 -0
  5. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  6. data/lib/mongoid/association/builders.rb +92 -0
  7. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  8. data/lib/mongoid/association/depending.rb +137 -0
  9. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
  10. data/lib/mongoid/{relations → association}/embedded/batchable.rb +19 -19
  11. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  12. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  13. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  14. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  15. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  16. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
  17. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  18. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +552 -0
  19. data/lib/mongoid/association/embedded/embeds_many.rb +210 -0
  20. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
  21. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
  22. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  23. data/lib/mongoid/association/embedded/embeds_one.rb +173 -0
  24. data/lib/mongoid/association/embedded.rb +4 -0
  25. data/lib/mongoid/association/macros.rb +204 -0
  26. data/lib/mongoid/{relations → association}/many.rb +19 -49
  27. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  28. data/lib/mongoid/association/nested/many.rb +200 -0
  29. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  30. data/lib/mongoid/association/nested/one.rb +127 -0
  31. data/lib/mongoid/association/nested.rb +15 -0
  32. data/lib/mongoid/{relations → association}/one.rb +6 -6
  33. data/lib/mongoid/association/options.rb +152 -0
  34. data/lib/mongoid/{relations → association}/proxy.rb +31 -58
  35. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  36. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  37. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  38. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  39. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  40. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  41. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  42. data/lib/mongoid/association/referenced/eager.rb +162 -0
  43. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  44. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  45. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +312 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  48. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
  49. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  50. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  51. data/lib/mongoid/association/referenced/has_many/enumerable.rb +510 -0
  52. data/lib/mongoid/association/referenced/has_many/proxy.rb +578 -0
  53. data/lib/mongoid/association/referenced/has_many.rb +275 -0
  54. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  55. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  56. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  57. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  58. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  59. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  60. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  61. data/lib/mongoid/association/referenced.rb +7 -0
  62. data/lib/mongoid/{relations → association}/reflections.rb +21 -17
  63. data/lib/mongoid/association/relatable.rb +509 -0
  64. data/lib/mongoid/{relations.rb → association.rb} +57 -56
  65. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  66. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  67. data/lib/mongoid/atomic.rb +4 -4
  68. data/lib/mongoid/attributes/dynamic.rb +2 -2
  69. data/lib/mongoid/attributes/nested.rb +22 -11
  70. data/lib/mongoid/attributes/processing.rb +2 -2
  71. data/lib/mongoid/attributes/readonly.rb +2 -4
  72. data/lib/mongoid/attributes.rb +22 -13
  73. data/lib/mongoid/changeable.rb +1 -1
  74. data/lib/mongoid/clients/options.rb +7 -5
  75. data/lib/mongoid/composable.rb +4 -4
  76. data/lib/mongoid/config.rb +1 -0
  77. data/lib/mongoid/contextual/atomic.rb +1 -1
  78. data/lib/mongoid/contextual/geo_near.rb +1 -1
  79. data/lib/mongoid/contextual/memory.rb +21 -3
  80. data/lib/mongoid/contextual/mongo.rb +10 -8
  81. data/lib/mongoid/copyable.rb +7 -6
  82. data/lib/mongoid/criteria/includable.rb +14 -14
  83. data/lib/mongoid/criteria/modifiable.rb +8 -14
  84. data/lib/mongoid/criteria/options.rb +2 -2
  85. data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
  86. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  87. data/lib/mongoid/criteria/queryable/selectable.rb +37 -7
  88. data/lib/mongoid/criteria.rb +2 -2
  89. data/lib/mongoid/document.rb +15 -6
  90. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  91. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  92. data/lib/mongoid/errors/unknown_model.rb +25 -0
  93. data/lib/mongoid/errors.rb +3 -0
  94. data/lib/mongoid/extensions/array.rb +5 -5
  95. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  96. data/lib/mongoid/extensions/hash.rb +5 -2
  97. data/lib/mongoid/extensions/object.rb +4 -4
  98. data/lib/mongoid/extensions/range.rb +1 -0
  99. data/lib/mongoid/extensions/regexp.rb +1 -0
  100. data/lib/mongoid/extensions.rb +0 -4
  101. data/lib/mongoid/factory.rb +13 -3
  102. data/lib/mongoid/fields/foreign_key.rb +5 -5
  103. data/lib/mongoid/fields/standard.rb +2 -14
  104. data/lib/mongoid/fields/validators/macro.rb +1 -1
  105. data/lib/mongoid/fields.rb +3 -3
  106. data/lib/mongoid/indexable.rb +4 -1
  107. data/lib/mongoid/interceptable.rb +5 -5
  108. data/lib/mongoid/matchable/and.rb +1 -1
  109. data/lib/mongoid/matchable/elem_match.rb +9 -3
  110. data/lib/mongoid/matchable/eq.rb +22 -0
  111. data/lib/mongoid/matchable/ne.rb +1 -1
  112. data/lib/mongoid/matchable.rb +3 -1
  113. data/lib/mongoid/persistable/deletable.rb +7 -6
  114. data/lib/mongoid/persistable/incrementable.rb +1 -1
  115. data/lib/mongoid/persistable/logical.rb +1 -1
  116. data/lib/mongoid/persistable/settable.rb +57 -12
  117. data/lib/mongoid/persistable.rb +4 -5
  118. data/lib/mongoid/persistence_context.rb +20 -5
  119. data/lib/mongoid/query_cache.rb +8 -4
  120. data/lib/mongoid/railtie.rb +17 -0
  121. data/lib/mongoid/railties/controller_runtime.rb +86 -0
  122. data/lib/mongoid/scopable.rb +3 -3
  123. data/lib/mongoid/serializable.rb +4 -4
  124. data/lib/mongoid/shardable.rb +1 -1
  125. data/lib/mongoid/threaded.rb +36 -0
  126. data/lib/mongoid/touchable.rb +102 -0
  127. data/lib/mongoid/traversable.rb +3 -3
  128. data/lib/mongoid/validatable/presence.rb +2 -2
  129. data/lib/mongoid/validatable/uniqueness.rb +4 -4
  130. data/lib/mongoid/validatable.rb +8 -8
  131. data/lib/mongoid/version.rb +1 -1
  132. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -0
  133. data/spec/app/models/animal.rb +2 -1
  134. data/spec/app/models/bomb.rb +1 -1
  135. data/spec/app/models/message.rb +1 -1
  136. data/spec/app/models/minim.rb +7 -0
  137. data/spec/app/models/person.rb +5 -2
  138. data/spec/app/models/shipment_address.rb +1 -0
  139. data/spec/app/models/store_as_dup_test3.rb +7 -0
  140. data/spec/app/models/store_as_dup_test4.rb +7 -0
  141. data/spec/app/models/updatable.rb +7 -0
  142. data/spec/app/models/vertex.rb +6 -0
  143. data/spec/app/models/wiki_page.rb +1 -1
  144. data/spec/config/mongoid.yml +13 -3
  145. data/spec/integration/associations/belongs_to_spec.rb +13 -0
  146. data/spec/lite_spec_helper.rb +56 -0
  147. data/spec/mongoid/{relations → association}/accessors_spec.rb +40 -1
  148. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  149. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  150. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  151. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  152. data/spec/mongoid/association/depending_spec.rb +866 -0
  153. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  154. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  155. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  156. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  157. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +5 -77
  158. data/spec/mongoid/association/embedded/embedded_in_spec.rb +843 -0
  159. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  160. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  161. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +124 -182
  162. data/spec/mongoid/association/embedded/embeds_many_spec.rb +852 -0
  163. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  164. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  165. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  166. data/spec/mongoid/association/embedded/embeds_one_spec.rb +908 -0
  167. data/spec/mongoid/{relations → association}/macros_spec.rb +148 -73
  168. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  169. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  170. data/spec/mongoid/association/options_spec.rb +1321 -0
  171. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +66 -34
  172. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  173. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  174. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +33 -14
  175. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  176. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2006 -0
  177. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
  178. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  179. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +26 -7
  180. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +56 -0
  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_models.rb +26 -0
  183. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
  184. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  185. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  186. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +26 -11
  187. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +122 -1
  188. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  189. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +28 -93
  190. data/spec/mongoid/association/referenced/has_many_models.rb +37 -0
  191. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  192. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  193. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  194. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  195. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  196. data/spec/mongoid/association/referenced/has_one_models.rb +48 -0
  197. data/spec/mongoid/association/referenced/has_one_spec.rb +1350 -0
  198. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  199. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
  200. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  201. data/spec/mongoid/atomic/modifiers_spec.rb +2 -2
  202. data/spec/mongoid/atomic_spec.rb +4 -4
  203. data/spec/mongoid/attributes/nested_spec.rb +29 -11
  204. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  205. data/spec/mongoid/attributes_spec.rb +38 -2
  206. data/spec/mongoid/clients/factory_spec.rb +24 -18
  207. data/spec/mongoid/clients/options_spec.rb +58 -44
  208. data/spec/mongoid/clients/sessions_spec.rb +1 -1
  209. data/spec/mongoid/clients/transactions_spec.rb +369 -0
  210. data/spec/mongoid/clients_spec.rb +68 -8
  211. data/spec/mongoid/config_spec.rb +27 -1
  212. data/spec/mongoid/contextual/memory_spec.rb +19 -0
  213. data/spec/mongoid/contextual/mongo_spec.rb +33 -5
  214. data/spec/mongoid/copyable_spec.rb +90 -6
  215. data/spec/mongoid/copyable_spec_models.rb +17 -0
  216. data/spec/mongoid/criteria/modifiable_spec.rb +183 -60
  217. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
  218. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +43 -0
  219. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  220. data/spec/mongoid/criteria/queryable/selectable_spec.rb +42 -3
  221. data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
  222. data/spec/mongoid/criteria/scopable_spec.rb +81 -0
  223. data/spec/mongoid/criteria_spec.rb +33 -18
  224. data/spec/mongoid/document_spec.rb +83 -4
  225. data/spec/mongoid/extensions/array_spec.rb +11 -15
  226. data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
  227. data/spec/mongoid/extensions/hash_spec.rb +18 -1
  228. data/spec/mongoid/extensions/object_spec.rb +7 -11
  229. data/spec/mongoid/extensions/range_spec.rb +7 -0
  230. data/spec/mongoid/extensions/regexp_spec.rb +23 -0
  231. data/spec/mongoid/factory_spec.rb +19 -1
  232. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  233. data/spec/mongoid/fields_spec.rb +2 -2
  234. data/spec/mongoid/findable_spec.rb +1 -1
  235. data/spec/mongoid/indexable_spec.rb +18 -8
  236. data/spec/mongoid/interceptable_spec.rb +22 -1
  237. data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
  238. data/spec/mongoid/matchable/eq_spec.rb +48 -0
  239. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  240. data/spec/mongoid/persistable/savable_spec.rb +2 -2
  241. data/spec/mongoid/persistable/settable_spec.rb +95 -10
  242. data/spec/mongoid/persistable_spec.rb +21 -6
  243. data/spec/mongoid/persistence_context_spec.rb +1 -1
  244. data/spec/mongoid/query_cache_spec.rb +61 -22
  245. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  246. data/spec/mongoid/scopable_spec.rb +13 -0
  247. data/spec/mongoid/shardable_spec.rb +32 -12
  248. data/spec/mongoid/threaded_spec.rb +68 -0
  249. data/spec/mongoid/{relations/touchable_spec.rb → touchable_spec.rb} +40 -1
  250. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  251. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  252. data/spec/mongoid/validatable_spec.rb +1 -1
  253. data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
  254. data/spec/spec_helper.rb +51 -25
  255. data/spec/support/constraints.rb +101 -0
  256. data/spec/support/macros.rb +20 -0
  257. data/spec/support/spec_config.rb +39 -0
  258. metadata +602 -582
  259. checksums.yaml.gz.sig +0 -2
  260. data/lib/mongoid/relations/accessors.rb +0 -267
  261. data/lib/mongoid/relations/auto_save.rb +0 -94
  262. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  263. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  264. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  265. data/lib/mongoid/relations/bindings.rb +0 -9
  266. data/lib/mongoid/relations/builder.rb +0 -57
  267. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  268. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  269. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  270. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  271. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  272. data/lib/mongoid/relations/builders.rb +0 -106
  273. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  274. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  275. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  276. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  277. data/lib/mongoid/relations/cascading.rb +0 -56
  278. data/lib/mongoid/relations/conversions.rb +0 -34
  279. data/lib/mongoid/relations/counter_cache.rb +0 -160
  280. data/lib/mongoid/relations/cyclic.rb +0 -107
  281. data/lib/mongoid/relations/eager/base.rb +0 -153
  282. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  283. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  284. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  285. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  286. data/lib/mongoid/relations/embedded/in.rb +0 -241
  287. data/lib/mongoid/relations/embedded/many.rb +0 -683
  288. data/lib/mongoid/relations/embedded/one.rb +0 -235
  289. data/lib/mongoid/relations/macros.rb +0 -367
  290. data/lib/mongoid/relations/metadata.rb +0 -1179
  291. data/lib/mongoid/relations/nested_builder.rb +0 -74
  292. data/lib/mongoid/relations/options.rb +0 -49
  293. data/lib/mongoid/relations/polymorphic.rb +0 -39
  294. data/lib/mongoid/relations/referenced/in.rb +0 -304
  295. data/lib/mongoid/relations/referenced/many.rb +0 -812
  296. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  297. data/lib/mongoid/relations/referenced/one.rb +0 -290
  298. data/lib/mongoid/relations/synchronization.rb +0 -169
  299. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  300. data/lib/mongoid/relations/targets.rb +0 -2
  301. data/lib/mongoid/relations/touchable.rb +0 -97
  302. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  303. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  304. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  305. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  306. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  307. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  308. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  309. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  310. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  311. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  312. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  313. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  314. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  315. data/spec/mongoid/relations/options_spec.rb +0 -35
  316. data.tar.gz.sig +0 -0
  317. metadata.gz.sig +0 -0
  318. /data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Mongoid::Relations::Bindings::Referenced::ManyToMany do
3
+ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Binding do
4
4
 
5
5
  let(:person) do
6
6
  Person.new
@@ -11,17 +11,17 @@ describe Mongoid::Relations::Bindings::Referenced::ManyToMany do
11
11
  end
12
12
 
13
13
  let(:target) do
14
- Mongoid::Relations::Targets::Enumerable.new([ preference ])
14
+ Mongoid::Association::Referenced::HasMany::Targets::Enumerable.new([ preference ])
15
15
  end
16
16
 
17
- let(:metadata) do
17
+ let(:association) do
18
18
  Person.relations["preferences"]
19
19
  end
20
20
 
21
21
  describe "#bind_one" do
22
22
 
23
23
  let(:binding) do
24
- described_class.new(person, target, metadata)
24
+ described_class.new(person, target, association)
25
25
  end
26
26
 
27
27
  context "when the document is bindable" do
@@ -77,7 +77,7 @@ describe Mongoid::Relations::Bindings::Referenced::ManyToMany do
77
77
  describe "#unbind_one" do
78
78
 
79
79
  let(:binding) do
80
- described_class.new(person, target, metadata)
80
+ described_class.new(person, target, association)
81
81
  end
82
82
 
83
83
  context "when the documents are unbindable" do
@@ -0,0 +1,121 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Buildable do
4
+
5
+ let(:base) do
6
+ double
7
+ end
8
+
9
+ let(:options) do
10
+ { }
11
+ end
12
+
13
+ describe "#build" do
14
+
15
+ let(:documents) do
16
+ association.build(base, object)
17
+ end
18
+
19
+ let(:association) do
20
+ Mongoid::Association::Referenced::HasAndBelongsToMany.new(Person, :preferences, options)
21
+ end
22
+
23
+ context "when provided ids" do
24
+
25
+ let(:object_id) do
26
+ BSON::ObjectId.new
27
+ end
28
+
29
+ let(:object) do
30
+ [ object_id ]
31
+ end
32
+
33
+ let(:criteria) do
34
+ Preference.all_of("_id" => { "$in" => object })
35
+ end
36
+
37
+ it "returns the criteria" do
38
+ expect(documents).to eq(criteria)
39
+ end
40
+ end
41
+
42
+ context "when order specified" do
43
+
44
+ let(:object_id) do
45
+ BSON::ObjectId.new
46
+ end
47
+
48
+ let(:options) do
49
+ {
50
+ order: :rating.desc
51
+ }
52
+ end
53
+
54
+ let(:object) do
55
+ [ object_id ]
56
+ end
57
+
58
+ let(:criteria) do
59
+ Preference.all_of("_id" => { "$in" => object }).order_by(options[:order])
60
+ end
61
+
62
+ it "returns the criteria" do
63
+ expect(documents).to eq(criteria)
64
+ end
65
+ end
66
+
67
+ context "when provided a object" do
68
+
69
+ context "when the object is not nil" do
70
+
71
+ let(:object) do
72
+ [ Post.new ]
73
+ end
74
+
75
+ it "returns the objects" do
76
+ expect(documents).to eq(object)
77
+ end
78
+ end
79
+
80
+ context "when the object is nil" do
81
+
82
+ let(:object) do
83
+ nil
84
+ end
85
+
86
+ let(:criteria) do
87
+ Preference.all_of("_id" => { "$in" => [] })
88
+ end
89
+
90
+ it "a criteria object" do
91
+ expect(documents).to eq(criteria)
92
+ end
93
+ end
94
+ end
95
+
96
+ context "when no documents found in the database" do
97
+
98
+ context "when the ids are empty" do
99
+
100
+ it "returns an empty array" do
101
+ expect(Person.new.preferences).to be_empty
102
+ end
103
+ end
104
+
105
+ context "when the ids are incorrect" do
106
+
107
+ let(:person) do
108
+ Person.create
109
+ end
110
+
111
+ before do
112
+ person.preference_ids = [ BSON::ObjectId.new ]
113
+ end
114
+
115
+ it "returns an empty array" do
116
+ expect(person.preferences).to be_empty
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -1,6 +1,7 @@
1
1
  require "spec_helper"
2
+ require_relative '../has_and_belongs_to_many_models'
2
3
 
3
- describe Mongoid::Relations::Eager::HasAndBelongsToMany do
4
+ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Eager do
4
5
 
5
6
  describe ".keys_from_docs" do
6
7
 
@@ -16,18 +17,18 @@ describe Mongoid::Relations::Eager::HasAndBelongsToMany do
16
17
  House.create!
17
18
  end
18
19
 
19
- let(:metadata) do
20
+ let(:association) do
20
21
  Person.reflect_on_association(:houses)
21
22
  end
22
23
 
23
24
  let(:eager) do
24
- described_class.new([metadata], docs).tap do |b|
25
- b.shift_metadata
25
+ described_class.new([association], docs).tap do |b|
26
+ b.send(:shift_association)
26
27
  end
27
28
  end
28
29
 
29
30
  it "aggregates by the foreign key" do
30
- expect(eager.keys_from_docs).to eq([house.id])
31
+ expect(eager.send(:keys_from_docs)).to eq([house.id])
31
32
  end
32
33
  end
33
34
 
@@ -41,7 +42,7 @@ describe Mongoid::Relations::Eager::HasAndBelongsToMany do
41
42
  Person.create!(houses: 3.times.map { House.create! })
42
43
  end
43
44
 
44
- context "when including the has_and_belongs_to_many relation" do
45
+ context "when including the has_and_belongs_to_many association" do
45
46
 
46
47
  it "queries twice" do
47
48
  expect_query(2) do
@@ -60,7 +61,7 @@ describe Mongoid::Relations::Eager::HasAndBelongsToMany do
60
61
  end
61
62
  end
62
63
 
63
- context "when the relation is not polymorphic" do
64
+ context "when the association is not polymorphic" do
64
65
 
65
66
  let(:eager) do
66
67
  Person.asc(:_id).includes(:preferences).last
@@ -129,5 +130,23 @@ describe Mongoid::Relations::Eager::HasAndBelongsToMany do
129
130
  end
130
131
  end
131
132
  end
133
+
134
+ context "when all the values for the has_and_belongs_to_many association are empty" do
135
+
136
+ before do
137
+ 2.times { |i| HabtmmPerson.create! }
138
+ end
139
+
140
+ it "only queries once for the parent documents" do
141
+ found_person = false
142
+ expect_query(1) do
143
+ HabtmmPerson.all.includes(:tickets).each do |person|
144
+ expect(person.tickets).to eq []
145
+ found_person = true
146
+ end
147
+ end
148
+ expect(found_person).to be true
149
+ end
150
+ end
132
151
  end
133
152
  end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require_relative '../has_and_belongs_to_many_models'
5
+
6
+ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
7
+ context 'with primary_key and foreign_key given' do
8
+ let(:company) { HabtmmCompany.create!(c_id: 123) }
9
+ let(:employee) { HabtmmEmployee.create!(e_id: 456) }
10
+
11
+ before do
12
+ company.employees << employee
13
+ end
14
+
15
+ it 'references correct field' do
16
+ expect(company.e_ids).to eq([456])
17
+ end
18
+
19
+ describe 'nullify' do
20
+ before do
21
+ company.employees << repl_employee
22
+ company.save!
23
+ expect(company.employees.length).to eq(2)
24
+ repl_employee.habtmm_company_ids = [company.id]
25
+ repl_employee.save!
26
+ repl_employee.reload
27
+ expect(repl_employee.habtmm_company_ids).to eq([company.id])
28
+ end
29
+
30
+ context 'without replacement' do
31
+ let(:repl_employee) { HabtmmEmployee.create!(e_id: 444) }
32
+
33
+ it 'disassociates child from parent' do
34
+ company.employees.nullify
35
+ repl_employee.reload
36
+ expect(repl_employee.habtmm_company_ids).to eq([])
37
+ end
38
+ end
39
+
40
+ context 'with replacement' do
41
+ let(:repl_employee) { HabtmmEmployee.create!(e_id: 444) }
42
+
43
+ before do
44
+ company.employees << repl_employee
45
+ expect(company.employees.length).to eq(2)
46
+ end
47
+
48
+ it 'keeps replacement associated with the parent' do
49
+ company.employees.nullify([repl_employee])
50
+ repl_employee.reload
51
+ expect(repl_employee.habtmm_company_ids).to eq([company.id])
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -1,11 +1,15 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Mongoid::Relations::Referenced::ManyToMany do
3
+ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
4
4
 
5
- before(:all) do
5
+ around(:each) do |example|
6
+ original_raise_not_found_error = Mongoid.raise_not_found_error
7
+ original_preferences_association = Person.relations["preferences"]
6
8
  Mongoid.raise_not_found_error = true
7
- Person.autosave(Person.relations["preferences"].merge!(autosave: true))
8
- Person._synced(Person.relations["preferences"])
9
+ Person.has_and_belongs_to_many :preferences, autosave: true
10
+ example.run
11
+ Mongoid.raise_not_found_error = original_raise_not_found_error
12
+ Person.relations["preferences"] = original_preferences_association
9
13
  end
10
14
 
11
15
  after(:all) do
@@ -814,6 +818,82 @@ describe Mongoid::Relations::Referenced::ManyToMany do
814
818
  end
815
819
  end
816
820
 
821
+ describe "when self-referencing" do
822
+ let!(:parent) do
823
+ Vertex.create
824
+ end
825
+
826
+ let!(:child) do
827
+ Vertex.create(parents: [parent])
828
+ end
829
+
830
+ before do
831
+ parent.reload
832
+ child.reload
833
+ end
834
+
835
+ it "sets the parent" do
836
+ expect(child.parents).to include(parent)
837
+ end
838
+
839
+ it "sets the parent id" do
840
+ expect(child.parent_ids).to include(parent.id)
841
+ end
842
+
843
+ it "sets the child" do
844
+ expect(parent.children).to include(child)
845
+ end
846
+
847
+ it "sets the child id" do
848
+ expect(parent.child_ids).to include(child.id)
849
+ end
850
+
851
+ describe "#update" do
852
+ before do
853
+ child.update(parents: [parent])
854
+ end
855
+
856
+ it "sets the parent" do
857
+ expect(child.parents).to include(parent)
858
+ end
859
+
860
+ it "sets the parent id" do
861
+ expect(child.parent_ids).to include(parent.id)
862
+ end
863
+
864
+ it "sets the child" do
865
+ expect(parent.children).to include(child)
866
+ end
867
+
868
+ it "sets the child id" do
869
+ expect(parent.child_ids).to include(child.id)
870
+ end
871
+
872
+ describe "when reloading" do
873
+ before do
874
+ parent.reload
875
+ child.reload
876
+ end
877
+
878
+ it "sets the parent" do
879
+ expect(child.parents).to include(parent)
880
+ end
881
+
882
+ it "sets the parent id" do
883
+ expect(child.parent_ids).to include(parent.id)
884
+ end
885
+
886
+ it "sets the child" do
887
+ expect(parent.children).to include(child)
888
+ end
889
+
890
+ it "sets the child id" do
891
+ expect(parent.child_ids).to include(child.id)
892
+ end
893
+ end
894
+ end
895
+ end
896
+
817
897
  [ nil, [] ].each do |value|
818
898
 
819
899
  describe "#= #{value}" do
@@ -1041,27 +1121,6 @@ describe Mongoid::Relations::Referenced::ManyToMany do
1041
1121
  end
1042
1122
  end
1043
1123
 
1044
- describe ".builder" do
1045
-
1046
- let(:builder_klass) do
1047
- Mongoid::Relations::Builders::Referenced::ManyToMany
1048
- end
1049
-
1050
- let(:document) do
1051
- double
1052
- end
1053
-
1054
- let(:metadata) do
1055
- double(extension?: false)
1056
- end
1057
-
1058
- it "returns the embedded in builder" do
1059
- expect(
1060
- described_class.builder(nil, metadata, document)
1061
- ).to be_a_kind_of(builder_klass)
1062
- end
1063
- end
1064
-
1065
1124
  describe "#clear" do
1066
1125
 
1067
1126
  context "when the relation is not polymorphic" do
@@ -2175,8 +2234,8 @@ describe Mongoid::Relations::Referenced::ManyToMany do
2175
2234
 
2176
2235
  let!(:deleted) do
2177
2236
  person.preferences.send(
2178
- method,
2179
- { name: "Testing" }
2237
+ method,
2238
+ { name: "Testing" }
2180
2239
  )
2181
2240
  end
2182
2241
 
@@ -2365,7 +2424,7 @@ describe Mongoid::Relations::Referenced::ManyToMany do
2365
2424
 
2366
2425
  let(:preferences) do
2367
2426
  person.preferences.find(
2368
- [ unrelated_pref.id, unrelated_pref_two.id ]
2427
+ [ unrelated_pref.id, unrelated_pref_two.id ]
2369
2428
  )
2370
2429
  end
2371
2430
 
@@ -2543,20 +2602,6 @@ describe Mongoid::Relations::Referenced::ManyToMany do
2543
2602
  end
2544
2603
  end
2545
2604
 
2546
- describe ".foreign_key_suffix" do
2547
-
2548
- it "returns _ids" do
2549
- expect(described_class.foreign_key_suffix).to eq("_ids")
2550
- end
2551
- end
2552
-
2553
- describe ".macro" do
2554
-
2555
- it "returns has_and_belongs_to_many" do
2556
- expect(described_class.macro).to eq(:has_and_belongs_to_many)
2557
- end
2558
- end
2559
-
2560
2605
  describe "#max" do
2561
2606
 
2562
2607
  let(:person) do
@@ -2843,7 +2888,7 @@ describe Mongoid::Relations::Referenced::ManyToMany do
2843
2888
  end
2844
2889
  end
2845
2890
 
2846
- Mongoid::Relations::Referenced::Many.public_instance_methods.each do |method|
2891
+ Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy.public_instance_methods.each do |method|
2847
2892
 
2848
2893
  context "when checking #{method}" do
2849
2894
 
@@ -2864,13 +2909,6 @@ describe Mongoid::Relations::Referenced::ManyToMany do
2864
2909
  end
2865
2910
  end
2866
2911
 
2867
- describe ".stores_foreign_key?" do
2868
-
2869
- it "returns true" do
2870
- expect(described_class.stores_foreign_key?).to be true
2871
- end
2872
- end
2873
-
2874
2912
  describe "#scoped" do
2875
2913
 
2876
2914
  let(:person) do
@@ -2976,33 +3014,6 @@ describe Mongoid::Relations::Referenced::ManyToMany do
2976
3014
  end
2977
3015
  end
2978
3016
 
2979
- describe ".valid_options" do
2980
-
2981
- it "returns the valid options" do
2982
- expect(described_class.valid_options).to eq(
2983
- [
2984
- :after_add,
2985
- :after_remove,
2986
- :autosave,
2987
- :before_add,
2988
- :before_remove,
2989
- :dependent,
2990
- :foreign_key,
2991
- :index,
2992
- :order,
2993
- :primary_key
2994
- ]
2995
- )
2996
- end
2997
- end
2998
-
2999
- describe ".validation_default" do
3000
-
3001
- it "returns true" do
3002
- expect(described_class.validation_default).to be true
3003
- end
3004
- end
3005
-
3006
3017
  context "when setting the ids directly after the documents" do
3007
3018
 
3008
3019
  let!(:person) do
@@ -3023,7 +3034,7 @@ describe Mongoid::Relations::Referenced::ManyToMany do
3023
3034
 
3024
3035
  before do
3025
3036
  person.update_attributes(
3026
- houses: [ wife_house, exwife_house, girlfriend_house ]
3037
+ houses: [ wife_house, exwife_house, girlfriend_house ]
3027
3038
  )
3028
3039
  person.update_attributes(house_ids: [ girlfriend_house.id ])
3029
3040
  end
@@ -3208,14 +3219,14 @@ describe Mongoid::Relations::Referenced::ManyToMany do
3208
3219
 
3209
3220
  it "orders the documents" do
3210
3221
  expect(person.ordered_preferences(true)).to eq(
3211
- [preference_two, preference_three, preference_one]
3212
- )
3222
+ [preference_two, preference_three, preference_one]
3223
+ )
3213
3224
  end
3214
3225
 
3215
3226
  it "chains default criteria with additional" do
3216
3227
  expect(person.ordered_preferences.order_by(:name.desc).to_a).to eq(
3217
- [preference_three, preference_two, preference_one]
3218
- )
3228
+ [preference_three, preference_two, preference_one]
3229
+ )
3219
3230
  end
3220
3231
  end
3221
3232
 
@@ -3273,7 +3284,7 @@ describe Mongoid::Relations::Referenced::ManyToMany do
3273
3284
 
3274
3285
  before do
3275
3286
  Preference.collection.find({ _id: preference_one.id }).
3276
- update_one({ "$set" => { name: "reloaded" }})
3287
+ update_one({ "$set" => { name: "reloaded" }})
3277
3288
  end
3278
3289
 
3279
3290
  let(:reloaded) do
@@ -3367,8 +3378,8 @@ describe Mongoid::Relations::Referenced::ManyToMany do
3367
3378
 
3368
3379
  it "persists the change in id order" do
3369
3380
  expect(reloaded.preference_ids).to eq(
3370
- [ preference_two.id, preference_one.id ]
3371
- )
3381
+ [ preference_two.id, preference_one.id ]
3382
+ )
3372
3383
  end
3373
3384
  end
3374
3385
 
@@ -3380,7 +3391,7 @@ describe Mongoid::Relations::Referenced::ManyToMany do
3380
3391
 
3381
3392
  before do
3382
3393
  person.preference_ids =
3383
- [ preference_two.id, preference_one.id, preference_three.id ]
3394
+ [ preference_two.id, preference_one.id, preference_three.id ]
3384
3395
  person.save
3385
3396
  end
3386
3397
 
@@ -3390,8 +3401,8 @@ describe Mongoid::Relations::Referenced::ManyToMany do
3390
3401
 
3391
3402
  it "also persists the change in id order" do
3392
3403
  expect(reloaded.preference_ids).to eq(
3393
- [ preference_two.id, preference_one.id, preference_three.id ]
3394
- )
3404
+ [ preference_two.id, preference_one.id, preference_three.id ]
3405
+ )
3395
3406
  end
3396
3407
  end
3397
3408
 
@@ -3403,10 +3414,10 @@ describe Mongoid::Relations::Referenced::ManyToMany do
3403
3414
 
3404
3415
  before do
3405
3416
  person.preference_ids =
3406
- [ preference_one.id, preference_two.id, preference_three.id ]
3417
+ [ preference_one.id, preference_two.id, preference_three.id ]
3407
3418
  person.save
3408
3419
  person.preference_ids =
3409
- [ preference_three.id, preference_two.id ]
3420
+ [ preference_three.id, preference_two.id ]
3410
3421
  person.save
3411
3422
  end
3412
3423
 
@@ -3416,8 +3427,8 @@ describe Mongoid::Relations::Referenced::ManyToMany do
3416
3427
 
3417
3428
  it "also persists the change in id order" do
3418
3429
  expect(reloaded.preference_ids).to eq(
3419
- [ preference_three.id, preference_two.id ]
3420
- )
3430
+ [ preference_three.id, preference_two.id ]
3431
+ )
3421
3432
  end
3422
3433
  end
3423
3434
  end
@@ -3543,9 +3554,8 @@ describe Mongoid::Relations::Referenced::ManyToMany do
3543
3554
  field :n, type: String, as: :name
3544
3555
 
3545
3556
  has_and_belongs_to_many :distributors,
3546
- foreign_key: :d_ids,
3547
- inverse_of: 'p',
3548
- inverse_class_name: 'Distributor'
3557
+ foreign_key: :d_ids,
3558
+ inverse_of: 'p'
3549
3559
  end
3550
3560
 
3551
3561
  class Distributor
@@ -3554,9 +3564,8 @@ describe Mongoid::Relations::Referenced::ManyToMany do
3554
3564
  field :n, type: String, as: :name
3555
3565
 
3556
3566
  has_and_belongs_to_many :projects,
3557
- foreign_key: :p_ids,
3558
- inverse_of: 'd',
3559
- inverse_class_name: 'Project'
3567
+ foreign_key: :p_ids,
3568
+ inverse_of: 'd'
3560
3569
  end
3561
3570
  end
3562
3571
 
@@ -0,0 +1,26 @@
1
+ class HabtmmCompany
2
+ include Mongoid::Document
3
+
4
+ field :c_id, type: Integer
5
+ field :e_ids, type: Array
6
+ has_and_belongs_to_many :employees, primary_key: :e_id, foreign_key: :e_ids, class_name: 'HabtmmEmployee'
7
+ end
8
+
9
+ class HabtmmEmployee
10
+ include Mongoid::Document
11
+
12
+ field :e_id, type: Integer
13
+ field :c_ids, type: Array
14
+ field :habtmm_company_ids, type: Array
15
+ has_and_belongs_to_many :companies, primary_key: :c_id, foreign_key: :c_ids, class_name: 'HabtmmCompany'
16
+ end
17
+
18
+ class HabtmmTicket
19
+ include Mongoid::Document
20
+ end
21
+
22
+ class HabtmmPerson
23
+ include Mongoid::Document
24
+
25
+ has_and_belongs_to_many :tickets, class_name: 'HabtmmTicket'
26
+ end