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,493 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
- module Targets
5
-
6
- # This class is the wrapper for all relational associations that have a
7
- # target that can be a criteria or array of _loaded documents. This
8
- # handles both cases or a combination of the two.
9
- class Enumerable
10
- include ::Enumerable
11
-
12
- # The three main instance variables are collections of documents.
13
- #
14
- # @attribute [rw] _added Documents that have been appended.
15
- # @attribute [rw] _loaded Persisted documents that have been _loaded.
16
- # @attribute [rw] _unloaded A criteria representing persisted docs.
17
- attr_accessor :_added, :_loaded, :_unloaded
18
-
19
- delegate :is_a?, :kind_of?, to: []
20
-
21
- # Check if the enumerable is equal to the other object.
22
- #
23
- # @example Check equality.
24
- # enumerable == []
25
- #
26
- # @param [ Enumerable ] other The other enumerable.
27
- #
28
- # @return [ true, false ] If the objects are equal.
29
- #
30
- # @since 2.1.0
31
- def ==(other)
32
- return false unless other.respond_to?(:entries)
33
- entries == other.entries
34
- end
35
-
36
- # Check equality of the enumerable against the provided object for case
37
- # statements.
38
- #
39
- # @example Check case equality.
40
- # enumerable === Array
41
- #
42
- # @param [ Object ] other The object to check.
43
- #
44
- # @return [ true, false ] If the objects are equal in a case.
45
- #
46
- # @since 3.1.4
47
- def ===(other)
48
- other.class == Class ? (Array == other || Enumerable == other) : self == other
49
- end
50
-
51
- # Append a document to the enumerable.
52
- #
53
- # @example Append the document.
54
- # enumerable << document
55
- #
56
- # @param [ Document ] document The document to append.
57
- #
58
- # @return [ Document ] The document.
59
- #
60
- # @since 2.1.0
61
- def <<(document)
62
- _added[document._id] = document
63
- self
64
- end
65
- alias :push :<<
66
-
67
- # Clears out all the documents in this enumerable. If passed a block it
68
- # will yield to each document that is in memory.
69
- #
70
- # @example Clear out the enumerable.
71
- # enumerable.clear
72
- #
73
- # @example Clear out the enumerable with a block.
74
- # enumerable.clear do |doc|
75
- # doc.unbind
76
- # end
77
- #
78
- # @return [ Array<Document> ] The cleared out _added docs.
79
- #
80
- # @since 2.1.0
81
- def clear
82
- if block_given?
83
- in_memory { |doc| yield(doc) }
84
- end
85
- _loaded.clear and _added.clear
86
- end
87
-
88
- # Clones each document in the enumerable.
89
- #
90
- # @note This loads all documents into memory.
91
- #
92
- # @example Clone the enumerable.
93
- # enumerable.clone
94
- #
95
- # @return [ Array<Document> ] An array clone of the enumerable.
96
- #
97
- # @since 2.1.6
98
- def clone
99
- collect { |doc| doc.clone }
100
- end
101
-
102
- # Delete the supplied document from the enumerable.
103
- #
104
- # @example Delete the document.
105
- # enumerable.delete(document)
106
- #
107
- # @param [ Document ] document The document to delete.
108
- #
109
- # @return [ Document ] The deleted document.
110
- #
111
- # @since 2.1.0
112
- def delete(document)
113
- doc = (_loaded.delete(document._id) || _added.delete(document._id))
114
- unless doc
115
- if _unloaded && _unloaded.where(_id: document._id).exists?
116
- yield(document) if block_given?
117
- return document
118
- end
119
- end
120
- yield(doc) if block_given?
121
- doc
122
- end
123
-
124
- # Deletes every document in the enumerable for where the block returns
125
- # true.
126
- #
127
- # @note This operation loads all documents from the database.
128
- #
129
- # @example Delete all matching documents.
130
- # enumerable.delete_if do |doc|
131
- # dod._id == _id
132
- # end
133
- #
134
- # @return [ Array<Document> ] The remaining docs.
135
- #
136
- # @since 2.1.0
137
- def delete_if(&block)
138
- load_all!
139
- deleted = in_memory.select(&block)
140
- deleted.each do |doc|
141
- _loaded.delete(doc._id)
142
- _added.delete(doc._id)
143
- end
144
- self
145
- end
146
-
147
- # Iterating over this enumerable has to handle a few different
148
- # scenarios.
149
- #
150
- # If the enumerable has its criteria _loaded into memory then it yields
151
- # to all the _loaded docs and all the _added docs.
152
- #
153
- # If the enumerable has not _loaded the criteria then it iterates over
154
- # the cursor while loading the documents and then iterates over the
155
- # _added docs.
156
- #
157
- # If no block is passed then it returns an enumerator containing all
158
- # docs.
159
- #
160
- # @example Iterate over the enumerable.
161
- # enumerable.each do |doc|
162
- # puts doc
163
- # end
164
- #
165
- # @example return an enumerator containing all the docs
166
- #
167
- # a = enumerable.each
168
- #
169
- # @return [ true ] That the enumerable is now _loaded.
170
- #
171
- # @since 2.1.0
172
- def each
173
- unless block_given?
174
- return to_enum
175
- end
176
- if _loaded?
177
- _loaded.each_pair do |id, doc|
178
- document = _added.delete(doc._id) || doc
179
- yield(document)
180
- end
181
- else
182
- unloaded_documents.each do |doc|
183
- document = _added.delete(doc._id) || _loaded.delete(doc._id) || doc
184
- _loaded[document._id] = document
185
- yield(document)
186
- end
187
- end
188
- _added.each_pair do |id, doc|
189
- yield(doc)
190
- end
191
- @executed = true
192
- end
193
-
194
- # Is the enumerable empty? Will determine if the count is zero based on
195
- # whether or not it is _loaded.
196
- #
197
- # @example Is the enumerable empty?
198
- # enumerable.empty?
199
- #
200
- # @return [ true, false ] If the enumerable is empty.
201
- #
202
- # @since 2.1.0
203
- def empty?
204
- if _loaded?
205
- in_memory.count == 0
206
- else
207
- _unloaded.count + _added.count == 0
208
- end
209
- end
210
-
211
- # Get the first document in the enumerable. Will check the persisted
212
- # documents first. Does not load the entire enumerable.
213
- #
214
- # @example Get the first document.
215
- # enumerable.first
216
- #
217
- # @note Automatically adding a sort on _id when no other sort is
218
- # defined on the criteria has the potential to cause bad performance issues.
219
- # If you experience unexpected poor performance when using #first or #last,
220
- # use the option { id_sort: :none }.
221
- # Be aware that #first/#last won't guarantee order in this case.
222
- #
223
- # @param [ Hash ] opts The options for the query returning the first document.
224
- #
225
- # @option opts [ :none ] :id_sort Don't apply a sort on _id.
226
- #
227
- # @return [ Document ] The first document found.
228
- #
229
- # @since 2.1.0
230
- def first(opts = {})
231
- _loaded.try(:values).try(:first) ||
232
- _added[(ul = _unloaded.try(:first, opts)).try(:id)] ||
233
- ul ||
234
- _added.values.try(:first)
235
- end
236
-
237
- # Initialize the new enumerable either with a criteria or an array.
238
- #
239
- # @example Initialize the enumerable with a criteria.
240
- # Enumberable.new(Post.where(:person_id => id))
241
- #
242
- # @example Initialize the enumerable with an array.
243
- # Enumerable.new([ post ])
244
- #
245
- # @param [ Criteria, Array<Document> ] target The wrapped object.
246
- #
247
- # @since 2.1.0
248
- def initialize(target)
249
- if target.is_a?(Criteria)
250
- @_added, @executed, @_loaded, @_unloaded = {}, false, {}, target
251
- else
252
- @_added, @executed = {}, true
253
- @_loaded = target.inject({}) do |_target, doc|
254
- _target[doc._id] = doc if doc
255
- _target
256
- end
257
- end
258
- end
259
-
260
- # Does the target include the provided document?
261
- #
262
- # @example Does the target include the document?
263
- # enumerable.include?(document)
264
- #
265
- # @param [ Document ] doc The document to check.
266
- #
267
- # @return [ true, false ] If the document is in the target.
268
- #
269
- # @since 3.0.0
270
- def include?(doc)
271
- return super unless _unloaded
272
- _unloaded.where(_id: doc._id).exists? || _added.has_key?(doc._id)
273
- end
274
-
275
- # Inspection will just inspect the entries for nice array-style
276
- # printing.
277
- #
278
- # @example Inspect the enumerable.
279
- # enumerable.inspect
280
- #
281
- # @return [ String ] The inspected enum.
282
- #
283
- # @since 2.1.0
284
- def inspect
285
- entries.inspect
286
- end
287
-
288
- # Return all the documents in the enumerable that have been _loaded or
289
- # _added.
290
- #
291
- # @note When passed a block it yields to each document.
292
- #
293
- # @example Get the in memory docs.
294
- # enumerable.in_memory
295
- #
296
- # @return [ Array<Document> ] The in memory docs.
297
- #
298
- # @since 2.1.0
299
- def in_memory
300
- docs = (_loaded.values + _added.values)
301
- docs.each { |doc| yield(doc) } if block_given?
302
- docs
303
- end
304
-
305
- # Get the last document in the enumerable. Will check the new
306
- # documents first. Does not load the entire enumerable.
307
- #
308
- # @example Get the last document.
309
- # enumerable.last
310
- #
311
- # @note Automatically adding a sort on _id when no other sort is
312
- # defined on the criteria has the potential to cause bad performance issues.
313
- # If you experience unexpected poor performance when using #first or #last,
314
- # use the option { id_sort: :none }.
315
- # Be aware that #first/#last won't guarantee order in this case.
316
- #
317
- # @param [ Hash ] opts The options for the query returning the first document.
318
- #
319
- # @option opts [ :none ] :id_sort Don't apply a sort on _id.
320
- #
321
- # @return [ Document ] The last document found.
322
- #
323
- # @since 2.1.0
324
- def last(opts = {})
325
- _added.values.try(:last) ||
326
- _loaded.try(:values).try(:last) ||
327
- _added[(ul = _unloaded.try(:last, opts)).try(:id)] ||
328
- ul
329
- end
330
-
331
- # Loads all the documents in the enumerable from the database.
332
- #
333
- # @example Load all the documents.
334
- # enumerable.load_all!
335
- #
336
- # @return [ true ] That the enumerable is _loaded.
337
- #
338
- # @since 2.1.0
339
- alias :load_all! :entries
340
-
341
- # Has the enumerable been _loaded? This will be true if the criteria has
342
- # been executed or we manually load the entire thing.
343
- #
344
- # @example Is the enumerable _loaded?
345
- # enumerable._loaded?
346
- #
347
- # @return [ true, false ] If the enumerable has been _loaded.
348
- #
349
- # @since 2.1.0
350
- def _loaded?
351
- !!@executed
352
- end
353
-
354
- # Provides the data needed to Marshal.dump an enumerable proxy.
355
- #
356
- # @example Dump the proxy.
357
- # Marshal.dump(proxy)
358
- #
359
- # @return [ Array<Object> ] The dumped data.
360
- #
361
- # @since 3.0.15
362
- def marshal_dump
363
- [ _added, _loaded, _unloaded, @executed]
364
- end
365
-
366
- # Loads the data needed to Marshal.load an enumerable proxy.
367
- #
368
- # @example Load the proxy.
369
- # Marshal.load(proxy)
370
- #
371
- # @return [ Array<Object> ] The dumped data.
372
- #
373
- # @since 3.0.15
374
- def marshal_load(data)
375
- @_added, @_loaded, @_unloaded, @executed = data
376
- end
377
-
378
- # Reset the enumerable back to its persisted state.
379
- #
380
- # @example Reset the enumerable.
381
- # enumerable.reset
382
- #
383
- # @return [ false ] Always false.
384
- #
385
- # @since 2.1.0
386
- def reset
387
- _loaded.clear and _added.clear
388
- @executed = false
389
- end
390
-
391
- # Resets the underlying unloaded criteria object with a new one. Used
392
- # my HABTM relations to keep the underlying array in sync.
393
- #
394
- # @example Reset the unloaded documents.
395
- # enumerable.reset_unloaded(criteria)
396
- #
397
- # @param [ Criteria ] criteria The criteria to replace with.
398
- #
399
- # @since 3.0.14
400
- def reset_unloaded(criteria)
401
- @_unloaded = criteria if _unloaded.is_a?(Criteria)
402
- end
403
-
404
- # Does this enumerable respond to the provided method?
405
- #
406
- # @example Does the enumerable respond to the method?
407
- # enumerable.respond_to?(:sum)
408
- #
409
- # @param [ String, Symbol ] name The name of the method.
410
- # @param [ true, false ] include_private Whether to include private
411
- # methods.
412
- #
413
- # @return [ true, false ] Whether the enumerable responds.
414
- #
415
- # @since 2.1.0
416
- def respond_to?(name, include_private = false)
417
- [].respond_to?(name, include_private) || super
418
- end
419
-
420
- # Gets the total size of this enumerable. This is a combination of all
421
- # the persisted and unpersisted documents.
422
- #
423
- # @example Get the size.
424
- # enumerable.size
425
- #
426
- # @return [ Integer ] The size of the enumerable.
427
- #
428
- # @since 2.1.0
429
- def size
430
- count = (_unloaded ? _unloaded.count : _loaded.count)
431
- if count.zero?
432
- count + _added.count
433
- else
434
- count + _added.values.count{ |d| d.new_record? }
435
- end
436
- end
437
- alias :length :size
438
-
439
- # Send #to_json to the entries.
440
- #
441
- # @example Get the enumerable as json.
442
- # enumerable.to_json
443
- #
444
- # @param [ Hash ] options Optional parameters.
445
- #
446
- # @return [ String ] The entries all _loaded as a string.
447
- #
448
- # @since 2.2.0
449
- def to_json(options = {})
450
- entries.to_json(options)
451
- end
452
-
453
- # Send #as_json to the entries, without encoding.
454
- #
455
- # @example Get the enumerable as json.
456
- # enumerable.as_json
457
- #
458
- # @param [ Hash ] options Optional parameters.
459
- #
460
- # @return [ Hash ] The entries all _loaded as a hash.
461
- #
462
- # @since 2.2.0
463
- def as_json(options = {})
464
- entries.as_json(options)
465
- end
466
-
467
- # Return all the unique documents in the enumerable.
468
- #
469
- # @note This operation loads all documents from the database.
470
- #
471
- # @example Get all the unique documents.
472
- # enumerable.uniq
473
- #
474
- # @return [ Array<Document> ] The unique documents.
475
- #
476
- # @since 2.1.0
477
- def uniq
478
- entries.uniq
479
- end
480
-
481
- private
482
-
483
- def method_missing(name, *args, &block)
484
- entries.send(name, *args, &block)
485
- end
486
-
487
- def unloaded_documents
488
- _unloaded.selector.values.any?(&:blank_criteria?) ? [] : _unloaded
489
- end
490
- end
491
- end
492
- end
493
- end
@@ -1,2 +0,0 @@
1
- # encoding: utf-8
2
- require "mongoid/relations/targets/enumerable"
@@ -1,97 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
- module Touchable
5
- extend ActiveSupport::Concern
6
-
7
- # Touch the document, in effect updating its updated_at timestamp and
8
- # optionally the provided field to the current time. If any belongs_to
9
- # relations exist with a touch option, they will be updated as well.
10
- #
11
- # @example Update the updated_at timestamp.
12
- # document.touch
13
- #
14
- # @example Update the updated_at and provided timestamps.
15
- # document.touch(:audited)
16
- #
17
- # @note This will not autobuild relations if those options are set.
18
- #
19
- # @param [ Symbol ] field The name of an additional field to update.
20
- #
21
- # @return [ true/false ] false if record is new_record otherwise true.
22
- #
23
- # @since 3.0.0
24
- def touch(field = nil)
25
- return false if _root.new_record?
26
- current = Time.now
27
- field = database_field_name(field)
28
- write_attribute(:updated_at, current) if respond_to?("updated_at=")
29
- write_attribute(field, current) if field
30
-
31
- touches = touch_atomic_updates(field)
32
- unless touches["$set"].blank?
33
- selector = atomic_selector
34
- _root.collection.find(selector).update_one(positionally(selector, touches), session: _session)
35
- end
36
- run_callbacks(:touch)
37
- true
38
- end
39
-
40
- module ClassMethods
41
-
42
- # Add the metadata to the touchable relations if the touch option was
43
- # provided.
44
- #
45
- # @example Add the touchable.
46
- # Model.touchable(meta)
47
- #
48
- # @param [ Metadata ] metadata The relation metadata.
49
- #
50
- # @return [ Class ] The model class.
51
- #
52
- # @since 3.0.0
53
- def touchable(metadata)
54
- if metadata.touchable?
55
- name = metadata.name
56
- field = metadata[:touch].is_a?(Symbol) ? metadata[:touch] : nil
57
- method_name = define_relation_touch_method(name, field)
58
- after_save method_name
59
- after_destroy method_name
60
- after_touch method_name
61
- end
62
- self
63
- end
64
-
65
- private
66
-
67
- # Define the method that will get called for touching belongs_to
68
- # relations.
69
- #
70
- # @api private
71
- #
72
- # @example Define the touch relation.
73
- # Model.define_relation_touch_method(:band)
74
- # Model.define_relation_touch_method(:band, :band_updated_at)
75
- #
76
- # @param [ Symbol ] name The name of the relation.
77
- # @param [ Symbol ] extra_field Additional timestamp field to update.
78
- #
79
- # @since 3.1.0
80
- #
81
- # @return [ Symbol ] The method name.
82
- def define_relation_touch_method(name, extra_field = nil)
83
- method_name = "touch_#{name}_after_create_or_destroy"
84
- class_eval <<-TOUCH, __FILE__, __LINE__ + 1
85
- def #{method_name}
86
- without_autobuild do
87
- relation = __send__(:#{name})
88
- relation.touch #{":#{extra_field}" if extra_field} if relation
89
- end
90
- end
91
- TOUCH
92
- method_name.to_sym
93
- end
94
- end
95
- end
96
- end
97
- end