mongoid 6.4.8 → 7.0.13

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 (376) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/LICENSE +1 -0
  4. data/README.md +4 -3
  5. data/Rakefile +33 -7
  6. data/lib/config/locales/en.yml +17 -0
  7. data/lib/mongoid/association/accessors.rb +339 -0
  8. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  9. data/lib/mongoid/association/builders.rb +92 -0
  10. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  11. data/lib/mongoid/association/depending.rb +137 -0
  12. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
  13. data/lib/mongoid/{relations → association}/embedded/batchable.rb +19 -19
  14. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  15. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  16. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  17. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  18. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  19. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
  20. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  21. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +552 -0
  22. data/lib/mongoid/association/embedded/embeds_many.rb +211 -0
  23. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
  24. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
  25. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  26. data/lib/mongoid/association/embedded/embeds_one.rb +174 -0
  27. data/lib/mongoid/association/embedded.rb +4 -0
  28. data/lib/mongoid/association/macros.rb +204 -0
  29. data/lib/mongoid/{relations → association}/many.rb +19 -49
  30. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  31. data/lib/mongoid/association/nested/many.rb +200 -0
  32. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  33. data/lib/mongoid/association/nested/one.rb +127 -0
  34. data/lib/mongoid/association/nested.rb +15 -0
  35. data/lib/mongoid/{relations → association}/one.rb +6 -6
  36. data/lib/mongoid/association/options.rb +152 -0
  37. data/lib/mongoid/{relations → association}/proxy.rb +45 -59
  38. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  39. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  40. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  41. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  42. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  43. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  44. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  45. data/lib/mongoid/association/referenced/eager.rb +162 -0
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +312 -0
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  51. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
  52. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  53. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  54. data/lib/mongoid/association/referenced/has_many/enumerable.rb +510 -0
  55. data/lib/mongoid/association/referenced/has_many/proxy.rb +578 -0
  56. data/lib/mongoid/association/referenced/has_many.rb +275 -0
  57. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  58. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  59. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  60. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  61. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  62. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  63. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  64. data/lib/mongoid/association/referenced.rb +7 -0
  65. data/lib/mongoid/{relations → association}/reflections.rb +21 -17
  66. data/lib/mongoid/association/relatable.rb +511 -0
  67. data/lib/mongoid/{relations.rb → association.rb} +57 -56
  68. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  69. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  70. data/lib/mongoid/atomic/paths/embedded.rb +1 -1
  71. data/lib/mongoid/atomic.rb +14 -4
  72. data/lib/mongoid/attributes/dynamic.rb +16 -15
  73. data/lib/mongoid/attributes/nested.rb +22 -11
  74. data/lib/mongoid/attributes/processing.rb +2 -2
  75. data/lib/mongoid/attributes/readonly.rb +2 -4
  76. data/lib/mongoid/attributes.rb +55 -31
  77. data/lib/mongoid/changeable.rb +1 -1
  78. data/lib/mongoid/clients/options.rb +7 -5
  79. data/lib/mongoid/clients/sessions.rb +20 -4
  80. data/lib/mongoid/composable.rb +4 -4
  81. data/lib/mongoid/config/environment.rb +21 -8
  82. data/lib/mongoid/config.rb +1 -0
  83. data/lib/mongoid/contextual/atomic.rb +1 -1
  84. data/lib/mongoid/contextual/geo_near.rb +1 -1
  85. data/lib/mongoid/contextual/memory.rb +21 -3
  86. data/lib/mongoid/contextual/mongo.rb +10 -8
  87. data/lib/mongoid/copyable.rb +11 -6
  88. data/lib/mongoid/criteria/includable.rb +14 -14
  89. data/lib/mongoid/criteria/modifiable.rb +8 -3
  90. data/lib/mongoid/criteria/options.rb +2 -2
  91. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  92. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  93. data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
  94. data/lib/mongoid/criteria/queryable/extensions/time.rb +1 -1
  95. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +12 -0
  96. data/lib/mongoid/criteria/queryable/key.rb +67 -8
  97. data/lib/mongoid/criteria/queryable/mergeable.rb +5 -4
  98. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  99. data/lib/mongoid/criteria/queryable/selectable.rb +5 -3
  100. data/lib/mongoid/criteria/queryable/selector.rb +9 -31
  101. data/lib/mongoid/criteria.rb +9 -3
  102. data/lib/mongoid/document.rb +14 -4
  103. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  104. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  105. data/lib/mongoid/errors/unknown_model.rb +25 -0
  106. data/lib/mongoid/errors.rb +3 -0
  107. data/lib/mongoid/extensions/array.rb +5 -5
  108. data/lib/mongoid/extensions/hash.rb +9 -4
  109. data/lib/mongoid/extensions/object.rb +4 -4
  110. data/lib/mongoid/extensions/range.rb +1 -0
  111. data/lib/mongoid/extensions/regexp.rb +1 -1
  112. data/lib/mongoid/extensions/string.rb +2 -2
  113. data/lib/mongoid/extensions.rb +0 -4
  114. data/lib/mongoid/factory.rb +13 -3
  115. data/lib/mongoid/fields/foreign_key.rb +5 -5
  116. data/lib/mongoid/fields/standard.rb +2 -14
  117. data/lib/mongoid/fields/validators/macro.rb +1 -1
  118. data/lib/mongoid/fields.rb +5 -4
  119. data/lib/mongoid/indexable.rb +4 -1
  120. data/lib/mongoid/interceptable.rb +8 -6
  121. data/lib/mongoid/matchable/all.rb +4 -3
  122. data/lib/mongoid/matchable/and.rb +1 -1
  123. data/lib/mongoid/matchable/default.rb +71 -24
  124. data/lib/mongoid/matchable/elem_match.rb +9 -3
  125. data/lib/mongoid/matchable/eq.rb +22 -0
  126. data/lib/mongoid/matchable/ne.rb +1 -1
  127. data/lib/mongoid/matchable/regexp.rb +2 -2
  128. data/lib/mongoid/matchable.rb +17 -16
  129. data/lib/mongoid/persistable/deletable.rb +7 -6
  130. data/lib/mongoid/persistable/incrementable.rb +1 -1
  131. data/lib/mongoid/persistable/logical.rb +1 -1
  132. data/lib/mongoid/persistable/pushable.rb +11 -2
  133. data/lib/mongoid/persistable/settable.rb +57 -12
  134. data/lib/mongoid/persistable.rb +4 -5
  135. data/lib/mongoid/persistence_context.rb +26 -11
  136. data/lib/mongoid/positional.rb +1 -1
  137. data/lib/mongoid/query_cache.rb +4 -2
  138. data/lib/mongoid/serializable.rb +4 -4
  139. data/lib/mongoid/shardable.rb +1 -1
  140. data/lib/mongoid/touchable.rb +102 -0
  141. data/lib/mongoid/traversable.rb +3 -3
  142. data/lib/mongoid/validatable/macros.rb +1 -1
  143. data/lib/mongoid/validatable/presence.rb +2 -2
  144. data/lib/mongoid/validatable/uniqueness.rb +5 -5
  145. data/lib/mongoid/validatable.rb +8 -8
  146. data/lib/mongoid/version.rb +2 -1
  147. data/lib/mongoid.rb +1 -0
  148. data/lib/rails/generators/mongoid/config/config_generator.rb +8 -1
  149. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -0
  150. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  151. data/spec/README.md +18 -0
  152. data/spec/app/models/animal.rb +2 -1
  153. data/spec/app/models/bomb.rb +1 -1
  154. data/spec/app/models/customer.rb +11 -0
  155. data/spec/app/models/customer_address.rb +12 -0
  156. data/spec/app/models/message.rb +1 -1
  157. data/spec/app/models/minim.rb +7 -0
  158. data/spec/app/models/other_owner_object.rb +2 -0
  159. data/spec/app/models/person.rb +5 -2
  160. data/spec/app/models/shipment_address.rb +1 -0
  161. data/spec/app/models/store_as_dup_test3.rb +7 -0
  162. data/spec/app/models/store_as_dup_test4.rb +7 -0
  163. data/spec/app/models/updatable.rb +7 -0
  164. data/spec/app/models/vertex.rb +6 -0
  165. data/spec/app/models/wiki_page.rb +1 -1
  166. data/spec/config/mongoid.yml +13 -3
  167. data/spec/integration/app_spec.rb +341 -0
  168. data/spec/integration/associations/belongs_to_spec.rb +13 -0
  169. data/spec/integration/associations/embedded_spec.rb +176 -0
  170. data/spec/integration/callbacks_models.rb +49 -0
  171. data/spec/integration/callbacks_spec.rb +216 -0
  172. data/spec/integration/criteria/date_field_spec.rb +41 -0
  173. data/spec/integration/criteria/time_with_zone_spec.rb +32 -0
  174. data/spec/integration/matchable_spec.rb +680 -0
  175. data/spec/lite_spec_helper.rb +71 -0
  176. data/spec/mongoid/{relations → association}/accessors_spec.rb +40 -1
  177. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  178. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  179. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  180. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  181. data/spec/mongoid/association/depending_spec.rb +866 -0
  182. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  183. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  184. data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
  185. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  186. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  187. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +55 -77
  188. data/spec/mongoid/association/embedded/embedded_in_spec.rb +901 -0
  189. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  190. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  191. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +124 -182
  192. data/spec/mongoid/association/embedded/embeds_many_models.rb +53 -0
  193. data/spec/mongoid/association/embedded/embeds_many_spec.rb +862 -0
  194. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  195. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  196. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  197. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +6 -0
  198. data/spec/mongoid/association/embedded/embeds_one_models.rb +51 -0
  199. data/spec/mongoid/association/embedded/embeds_one_spec.rb +954 -0
  200. data/spec/mongoid/{relations → association}/macros_spec.rb +148 -73
  201. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  202. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  203. data/spec/mongoid/association/options_spec.rb +1321 -0
  204. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +66 -34
  205. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  206. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  207. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +33 -14
  208. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  209. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2023 -0
  210. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
  211. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  212. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +26 -7
  213. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +56 -0
  214. data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +247 -99
  215. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +26 -0
  216. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
  217. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  218. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  219. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +26 -11
  220. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +227 -1
  221. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  222. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +30 -94
  223. data/spec/mongoid/association/referenced/has_many_models.rb +37 -0
  224. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  225. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  226. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  227. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  228. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  229. data/spec/mongoid/association/referenced/has_one_models.rb +48 -0
  230. data/spec/mongoid/association/referenced/has_one_spec.rb +1360 -0
  231. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  232. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
  233. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  234. data/spec/mongoid/atomic/modifiers_spec.rb +2 -2
  235. data/spec/mongoid/atomic/paths_spec.rb +41 -0
  236. data/spec/mongoid/atomic_spec.rb +4 -4
  237. data/spec/mongoid/attributes/dynamic_spec.rb +153 -0
  238. data/spec/mongoid/attributes/nested_spec.rb +29 -11
  239. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  240. data/spec/mongoid/attributes_spec.rb +298 -9
  241. data/spec/mongoid/clients/factory_spec.rb +20 -38
  242. data/spec/mongoid/clients/options_spec.rb +64 -50
  243. data/spec/mongoid/clients/sessions_spec.rb +9 -5
  244. data/spec/mongoid/clients/transactions_spec.rb +390 -0
  245. data/spec/mongoid/clients_spec.rb +70 -10
  246. data/spec/mongoid/config_spec.rb +27 -1
  247. data/spec/mongoid/contextual/atomic_spec.rb +37 -14
  248. data/spec/mongoid/contextual/geo_near_spec.rb +11 -2
  249. data/spec/mongoid/contextual/map_reduce_spec.rb +20 -5
  250. data/spec/mongoid/contextual/memory_spec.rb +19 -0
  251. data/spec/mongoid/contextual/mongo_spec.rb +107 -56
  252. data/spec/mongoid/copyable_spec.rb +90 -6
  253. data/spec/mongoid/copyable_spec_models.rb +17 -0
  254. data/spec/mongoid/criteria/modifiable_spec.rb +173 -1
  255. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +54 -0
  256. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -7
  257. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +44 -1
  258. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +19 -7
  259. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +28 -1
  260. data/spec/mongoid/criteria/queryable/key_spec.rb +48 -6
  261. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  262. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +762 -0
  263. data/spec/mongoid/criteria/queryable/selectable_spec.rb +5 -224
  264. data/spec/mongoid/criteria/queryable/selector_spec.rb +37 -0
  265. data/spec/mongoid/criteria_spec.rb +36 -19
  266. data/spec/mongoid/document_fields_spec.rb +88 -0
  267. data/spec/mongoid/document_persistence_context_spec.rb +33 -0
  268. data/spec/mongoid/document_spec.rb +29 -4
  269. data/spec/mongoid/extensions/array_spec.rb +11 -15
  270. data/spec/mongoid/extensions/hash_spec.rb +18 -1
  271. data/spec/mongoid/extensions/object_spec.rb +7 -11
  272. data/spec/mongoid/extensions/range_spec.rb +7 -0
  273. data/spec/mongoid/factory_spec.rb +21 -3
  274. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  275. data/spec/mongoid/fields_spec.rb +1 -1
  276. data/spec/mongoid/indexable_spec.rb +24 -12
  277. data/spec/mongoid/interceptable_spec.rb +22 -1
  278. data/spec/mongoid/matchable/default_spec.rb +10 -3
  279. data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
  280. data/spec/mongoid/matchable/eq_spec.rb +48 -0
  281. data/spec/mongoid/matchable/regexp_spec.rb +2 -2
  282. data/spec/mongoid/matchable_spec.rb +2 -2
  283. data/spec/mongoid/persistable/pushable_spec.rb +55 -1
  284. data/spec/mongoid/persistable/savable_spec.rb +5 -5
  285. data/spec/mongoid/persistable/settable_spec.rb +125 -10
  286. data/spec/mongoid/persistable_spec.rb +21 -6
  287. data/spec/mongoid/persistence_context_spec.rb +1 -1
  288. data/spec/mongoid/query_cache_spec.rb +65 -27
  289. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  290. data/spec/mongoid/scopable_spec.rb +2 -1
  291. data/spec/mongoid/shardable_spec.rb +32 -12
  292. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  293. data/spec/mongoid/tasks/database_spec.rb +1 -1
  294. data/spec/mongoid/{relations/touchable_spec.rb → touchable_spec.rb} +40 -1
  295. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  296. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  297. data/spec/mongoid/validatable/uniqueness_spec.rb +33 -6
  298. data/spec/mongoid/validatable_spec.rb +1 -1
  299. data/spec/shared/LICENSE +20 -0
  300. data/spec/shared/bin/get-mongodb-download-url +17 -0
  301. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  302. data/spec/shared/lib/mrss/cluster_config.rb +221 -0
  303. data/spec/shared/lib/mrss/constraints.rb +354 -0
  304. data/spec/shared/lib/mrss/docker_runner.rb +265 -0
  305. data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
  306. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  307. data/spec/shared/lib/mrss/spec_organizer.rb +162 -0
  308. data/spec/shared/lib/mrss/utils.rb +15 -0
  309. data/spec/shared/share/Dockerfile.erb +231 -0
  310. data/spec/shared/shlib/distro.sh +73 -0
  311. data/spec/shared/shlib/server.sh +290 -0
  312. data/spec/shared/shlib/set_env.sh +128 -0
  313. data/spec/spec_helper.rb +34 -49
  314. data/spec/support/cluster_config.rb +3 -3
  315. data/spec/support/constraints.rb +21 -76
  316. data/spec/support/expectations.rb +17 -3
  317. data/spec/support/spec_config.rb +20 -7
  318. data.tar.gz.sig +0 -0
  319. metadata +646 -541
  320. metadata.gz.sig +1 -5
  321. data/lib/mongoid/relations/accessors.rb +0 -267
  322. data/lib/mongoid/relations/auto_save.rb +0 -94
  323. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  324. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  325. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  326. data/lib/mongoid/relations/bindings.rb +0 -9
  327. data/lib/mongoid/relations/builder.rb +0 -57
  328. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  329. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  330. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  331. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  332. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  333. data/lib/mongoid/relations/builders.rb +0 -106
  334. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  335. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  336. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  337. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  338. data/lib/mongoid/relations/cascading.rb +0 -56
  339. data/lib/mongoid/relations/conversions.rb +0 -34
  340. data/lib/mongoid/relations/counter_cache.rb +0 -160
  341. data/lib/mongoid/relations/cyclic.rb +0 -107
  342. data/lib/mongoid/relations/eager/base.rb +0 -153
  343. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  344. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  345. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  346. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  347. data/lib/mongoid/relations/embedded/in.rb +0 -241
  348. data/lib/mongoid/relations/embedded/many.rb +0 -683
  349. data/lib/mongoid/relations/embedded/one.rb +0 -235
  350. data/lib/mongoid/relations/macros.rb +0 -367
  351. data/lib/mongoid/relations/metadata.rb +0 -1179
  352. data/lib/mongoid/relations/nested_builder.rb +0 -74
  353. data/lib/mongoid/relations/options.rb +0 -49
  354. data/lib/mongoid/relations/polymorphic.rb +0 -39
  355. data/lib/mongoid/relations/referenced/in.rb +0 -304
  356. data/lib/mongoid/relations/referenced/many.rb +0 -812
  357. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  358. data/lib/mongoid/relations/referenced/one.rb +0 -290
  359. data/lib/mongoid/relations/synchronization.rb +0 -169
  360. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  361. data/lib/mongoid/relations/targets.rb +0 -2
  362. data/lib/mongoid/relations/touchable.rb +0 -97
  363. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  364. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  365. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  366. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  367. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  368. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  369. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  370. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  371. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  372. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  373. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  374. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  375. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  376. data/spec/mongoid/relations/options_spec.rb +0 -35
@@ -0,0 +1,127 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Nested
5
+ class One
6
+ include Buildable
7
+
8
+ attr_accessor :destroy
9
+
10
+
11
+ # Builds the relation depending on the attributes and the options
12
+ # passed to the macro.
13
+ #
14
+ # @example Build a 1-1 nested document.
15
+ # one.build(person, as: :admin)
16
+ #
17
+ # @note This attempts to perform 3 operations, either one of an update of
18
+ # the existing relation, a replacement of the relation with a new
19
+ # document, or a removal of the relation.
20
+ #
21
+ # @param [ Document ] parent The parent document.
22
+ #
23
+ # @return [ Document ] The built document.
24
+ #
25
+ # @since 2.0.0
26
+ def build(parent)
27
+ return if reject?(parent, attributes)
28
+ @existing = parent.send(association.name)
29
+ if update?
30
+ attributes.delete_id
31
+ existing.assign_attributes(attributes)
32
+ elsif replace?
33
+ parent.send(association.setter, Factory.build(@class_name, attributes))
34
+ elsif delete?
35
+ parent.send(association.setter, nil)
36
+ end
37
+ end
38
+
39
+ # Create the new builder for nested attributes on one-to-one
40
+ # relations.
41
+ #
42
+ # @example Instantiate the builder.
43
+ # One.new(association, attributes)
44
+ #
45
+ # @param [ Association ] association The association metadata.
46
+ # @param [ Hash ] attributes The attributes hash to attempt to set.
47
+ # @param [ Hash ] options The options defined.
48
+ #
49
+ # @since 2.0.0
50
+ def initialize(association, attributes, options)
51
+ @attributes = attributes.with_indifferent_access
52
+ @association = association
53
+ @options = options
54
+ @class_name = options[:class_name] ? options[:class_name].constantize : association.klass
55
+ @destroy = @attributes.delete(:_destroy)
56
+ end
57
+
58
+ private
59
+
60
+ # Is the id in the attribtues acceptable for allowing an update to
61
+ # the existing relation?
62
+ #
63
+ # @api private
64
+ #
65
+ # @example Is the id acceptable?
66
+ # one.acceptable_id?
67
+ #
68
+ # @return [ true, false ] If the id part of the logic will allow an update.
69
+ #
70
+ # @since 2.0.0
71
+ def acceptable_id?
72
+ id = convert_id(existing.class, attributes[:id])
73
+ existing._id == id || id.nil? || (existing._id != id && update_only?)
74
+ end
75
+
76
+ # Can the existing relation be deleted?
77
+ #
78
+ # @example Can the existing object be deleted?
79
+ # one.delete?
80
+ #
81
+ # @return [ true, false ] If the relation should be deleted.
82
+ #
83
+ # @since 2.0.0
84
+ def delete?
85
+ destroyable? && !attributes[:id].nil?
86
+ end
87
+
88
+ # Can the existing relation potentially be destroyed?
89
+ #
90
+ # @example Is the object destroyable?
91
+ # one.destroyable?({ :_destroy => "1" })
92
+ #
93
+ # @return [ true, false ] If the relation can potentially be
94
+ # destroyed.
95
+ #
96
+ # @since 2.0.0
97
+ def destroyable?
98
+ Nested::DESTROY_FLAGS.include?(destroy) && allow_destroy?
99
+ end
100
+
101
+ # Is the document to be replaced?
102
+ #
103
+ # @example Is the document to be replaced?
104
+ # one.replace?
105
+ #
106
+ # @return [ true, false ] If the document should be replaced.
107
+ #
108
+ # @since 2.0.0
109
+ def replace?
110
+ !existing && !destroyable? && !attributes.blank?
111
+ end
112
+
113
+ # Should the document be updated?
114
+ #
115
+ # @example Should the document be updated?
116
+ # one.update?
117
+ #
118
+ # @return [ true, false ] If the object should have its attributes updated.
119
+ #
120
+ # @since 2.0.0
121
+ def update?
122
+ existing && !destroyable? && acceptable_id?
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,15 @@
1
+ require 'mongoid/association/nested/nested_buildable'
2
+ require 'mongoid/association/nested/many'
3
+ require 'mongoid/association/nested/one'
4
+
5
+ module Mongoid
6
+ module Association
7
+ module Nested
8
+
9
+ # The flags indicating that a relation can be destroyed.
10
+ #
11
+ # @since 7.0
12
+ DESTROY_FLAGS = [1, "1", true, "true"].freeze
13
+ end
14
+ end
15
+ end
@@ -1,10 +1,10 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Relations
3
+ module Association
4
4
 
5
5
  # This is the superclass for one to one relations and defines the common
6
6
  # behaviour or those proxies.
7
- class One < Proxy
7
+ class One < Association::Proxy
8
8
 
9
9
  # Clear this relation - same as calling #delete on the document.
10
10
  #
@@ -15,7 +15,7 @@ module Mongoid
15
15
  #
16
16
  # @since 3.0.0
17
17
  def clear
18
- target.delete
18
+ _target.delete
19
19
  end
20
20
 
21
21
  # Get all the documents in the relation that are loaded into memory.
@@ -27,7 +27,7 @@ module Mongoid
27
27
  #
28
28
  # @since 2.1.0
29
29
  def in_memory
30
- [ target ]
30
+ [ _target ]
31
31
  end
32
32
 
33
33
  # Since method_missing is overridden we should override this as well.
@@ -41,7 +41,7 @@ module Mongoid
41
41
  #
42
42
  # @since 2.1.8
43
43
  def respond_to?(name, include_private = false)
44
- target.respond_to?(name, include_private) || super
44
+ _target.respond_to?(name, include_private) || super
45
45
  end
46
46
 
47
47
  # Evolve the proxy document into an object id.
@@ -53,7 +53,7 @@ module Mongoid
53
53
  #
54
54
  # @since 4.0.0
55
55
  def __evolve_object_id__
56
- target._id
56
+ _target._id
57
57
  end
58
58
  end
59
59
  end
@@ -0,0 +1,152 @@
1
+ module Mongoid
2
+ module Association
3
+
4
+ module Options
5
+
6
+ # Returns the name of the parent to a polymorphic child.
7
+ #
8
+ # @return [ String, Symbol ] The name.
9
+ #
10
+ # @since 7.0
11
+ def as
12
+ @options[:as]
13
+ end
14
+
15
+ # Specify what happens to the associated object when the owner is destroyed.
16
+ #
17
+ # @return [ String ] The dependent option.
18
+ #
19
+ # @since 7.0
20
+ def dependent
21
+ @options[:dependent]
22
+ end
23
+
24
+ # The custom sorting options on the relation.
25
+ #
26
+ # @return [ Criteria::Queryable::Key ] The custom sorting options.
27
+ #
28
+ # @since 7.0
29
+ def order
30
+ @options[:order]
31
+ end
32
+
33
+ # Whether to index the primary or foreign key field.
34
+ #
35
+ # @return [ true, false ]
36
+ #
37
+ # @since 7.0
38
+ def indexed?
39
+ @indexed ||= !!@options[:index]
40
+ end
41
+
42
+ # Whether the association is autobuilding.
43
+ #
44
+ # @return [ true, false ]
45
+ #
46
+ # @since 7.0
47
+ def autobuilding?
48
+ !!@options[:autobuild]
49
+ end
50
+
51
+ # Is the relation cyclic.
52
+ #
53
+ # @return [ true, false ] Whether the relation is cyclic.
54
+ #
55
+ # @since 7.0
56
+ def cyclic?
57
+ !!@options[:cyclic]
58
+ end
59
+
60
+ # The name the owning object uses to refer to this relation.
61
+ #
62
+ # @return [ String ] The inverse_of option.
63
+ #
64
+ # @since 7.0
65
+ def inverse_of
66
+ @options[:inverse_of]
67
+ end
68
+
69
+ # Mongoid assumes that the field used to hold the primary key of the association is id.
70
+ # You can override this and explicitly specify the primary key with the :primary_key option.
71
+ #
72
+ # @return [ Symbol, String ] The primary key.
73
+ #
74
+ # @since 7.0
75
+ def primary_key
76
+ @primary_key ||= @options[:primary_key] ? @options[:primary_key].to_s : Relatable::PRIMARY_KEY_DEFAULT
77
+ end
78
+
79
+ # Options to save any loaded members and destroy members that are marked for destruction
80
+ # when the parent object is saved.
81
+ #
82
+ # @return [ true, false ] The autosave option.
83
+ #
84
+ # @since 7.0
85
+ def autosave
86
+ !!@options[:autosave]
87
+ end
88
+ alias :autosave? :autosave
89
+
90
+ # Whether the association is counter-cached.
91
+ #
92
+ # @return [ true, false ]
93
+ #
94
+ # @since 7.0
95
+ def counter_cached?
96
+ !!@options[:counter_cache]
97
+ end
98
+
99
+ # Whether this association is polymorphic.
100
+ #
101
+ # @return [ true, false ] Whether the association is polymorphic.
102
+ #
103
+ # @since 7.0
104
+ def polymorphic?; false; end
105
+
106
+ # Whether the relation has callbacks cascaded down from the parent.
107
+ #
108
+ # @return [ true, false ] Whether callbacks are cascaded.
109
+ #
110
+ # @since 7.0
111
+ def cascading_callbacks?
112
+ !!@options[:cascade_callbacks]
113
+ end
114
+
115
+ # The store_as option.
116
+ #
117
+ # @return [ nil ] Default is nil.
118
+ #
119
+ # @since 7.0
120
+ def store_as; end
121
+
122
+ # Whether the association has forced nil inverse (So no foreign keys are saved).
123
+ #
124
+ # @return [ false ] Default is false.
125
+ #
126
+ # @since 7.0
127
+ def forced_nil_inverse?; false; end
128
+
129
+ # The field for saving the associated object's type.
130
+ #
131
+ # @return [ nil ] Default is nil.
132
+ #
133
+ # @since 7.0
134
+ def type; end
135
+
136
+ # The field for saving the associated object's type.
137
+ #
138
+ # @return [ nil ] Default is nil.
139
+ #
140
+ # @since 7.0
141
+ def touch_field
142
+ @touch_field ||= options[:touch] if (options[:touch].is_a?(String) || options[:touch].is_a?(Symbol))
143
+ end
144
+
145
+ private
146
+
147
+ def touchable?
148
+ !!@options[:touch]
149
+ end
150
+ end
151
+ end
152
+ end
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- require "mongoid/relations/marshalable"
2
+ require "mongoid/association/marshalable"
3
3
 
4
4
  module Mongoid
5
- module Relations
5
+ module Association
6
6
 
7
7
  # This class is the superclass for all relation proxy objects, and contains
8
8
  # common behaviour for all of them.
@@ -12,35 +12,47 @@ module Mongoid
12
12
  # We undefine most methods to get them sent through to the target.
13
13
  instance_methods.each do |method|
14
14
  undef_method(method) unless
15
- method =~ /^(__.*|send|object_id|equal\?|respond_to\?|tap|public_send|extend_proxy|extend_proxies)$/
15
+ method =~ /\A(__.*|send|object_id|equal\?|respond_to\?|tap|public_send|extend_proxy|extend_proxies)\z/
16
16
  end
17
17
 
18
18
  include Threaded::Lifecycle
19
19
  include Marshalable
20
20
 
21
- attr_accessor :base, :__metadata, :target
22
- alias :relation_metadata :__metadata
21
+ # Model instance for the base of the association.
22
+ #
23
+ # For example, if a Post embeds_many Comments, _base is a particular
24
+ # instance of the Post model.
25
+ attr_accessor :_base
26
+
27
+ attr_accessor :_association
28
+
29
+ # Model instance for one to one associations, or array of model instances
30
+ # for one to many associations, for the target of the association.
31
+ #
32
+ # For example, if a Post embeds_many Comments, _target is an array of
33
+ # Comment models embedded in a particular Post.
34
+ attr_accessor :_target
23
35
 
24
36
  # Backwards compatibility with Mongoid beta releases.
25
- delegate :foreign_key, :inverse_foreign_key, to: :__metadata
37
+ delegate :foreign_key, :inverse_foreign_key, to: :_association
26
38
  delegate :bind_one, :unbind_one, to: :binding
27
- delegate :collection_name, to: :base
39
+ delegate :collection_name, to: :_base
28
40
 
29
- # Convenience for setting the target and the metadata properties since
41
+ # Convenience for setting the target and the association metadata properties since
30
42
  # all proxies will need to do this.
31
43
  #
32
44
  # @example Initialize the proxy.
33
- # proxy.init(person, name, metadata)
45
+ # proxy.init(person, name, association)
34
46
  #
35
47
  # @param [ Document ] base The base document on the proxy.
36
48
  # @param [ Document, Array<Document> ] target The target of the proxy.
37
- # @param [ Metadata ] metadata The relation's metadata.
49
+ # @param [ Association ] association The association metadata.
38
50
  #
39
51
  # @since 2.0.0.rc.1
40
- def init(base, target, metadata)
41
- @base, @target, @__metadata = base, target, metadata
52
+ def init(base, target, association)
53
+ @_base, @_target, @_association = base, target, association
42
54
  yield(self) if block_given?
43
- extend_proxies(metadata.extension) if metadata.extension?
55
+ extend_proxies(association.extension) if association.extension
44
56
  end
45
57
 
46
58
  # Allow extension to be an array and extend each module
@@ -48,7 +60,7 @@ module Mongoid
48
60
  extension.flatten.each {|ext| extend_proxy(ext) }
49
61
  end
50
62
 
51
- # Get the class from the metadata, or return nil if no metadata present.
63
+ # Get the class from the association, or return nil if no association present.
52
64
  #
53
65
  # @example Get the class.
54
66
  # proxy.klass
@@ -57,7 +69,7 @@ module Mongoid
57
69
  #
58
70
  # @since 3.0.15
59
71
  def klass
60
- __metadata ? __metadata.klass : nil
72
+ _association ? _association.klass : nil
61
73
  end
62
74
 
63
75
  # Resets the criteria inside the relation proxy. Used by many to many
@@ -68,7 +80,7 @@ module Mongoid
68
80
  #
69
81
  # @since 3.0.14
70
82
  def reset_unloaded
71
- target.reset_unloaded(criteria)
83
+ _target.reset_unloaded(criteria)
72
84
  end
73
85
 
74
86
  # The default substitutable object for a relation proxy is the clone of
@@ -81,7 +93,7 @@ module Mongoid
81
93
  #
82
94
  # @since 2.1.6
83
95
  def substitutable
84
- target
96
+ _target
85
97
  end
86
98
 
87
99
  protected
@@ -95,20 +107,20 @@ module Mongoid
95
107
  #
96
108
  # @since 2.0.0
97
109
  def collection
98
- root = base._root
110
+ root = _base._root
99
111
  root.collection unless root.embedded?
100
112
  end
101
113
 
102
- # Takes the supplied document and sets the metadata on it.
114
+ # Takes the supplied document and sets the association on it.
103
115
  #
104
- # @example Set the metadata.
116
+ # @example Set the association metadata.
105
117
  # proxt.characterize_one(name)
106
118
  #
107
119
  # @param [ Document ] document The document to set on.
108
120
  #
109
121
  # @since 2.0.0.rc.4
110
122
  def characterize_one(document)
111
- document.__metadata = __metadata unless document.__metadata
123
+ document._association = _association unless document._association
112
124
  end
113
125
 
114
126
  # Default behavior of method missing should be to delegate all calls
@@ -118,7 +130,7 @@ module Mongoid
118
130
  # @param [ Array ] args The arguments passed to the method.
119
131
  #
120
132
  def method_missing(name, *args, &block)
121
- target.send(name, *args, &block)
133
+ _target.send(name, *args, &block)
122
134
  end
123
135
 
124
136
  # When the base document illegally references an embedded document this
@@ -131,7 +143,7 @@ module Mongoid
131
143
  #
132
144
  # @since 2.0.0
133
145
  def raise_mixed
134
- raise Errors::MixedRelations.new(base.class, __metadata.klass)
146
+ raise Errors::MixedRelations.new(_base.class, _association.klass)
135
147
  end
136
148
 
137
149
  # When the base is not yet saved and the user calls create or create!
@@ -146,30 +158,7 @@ module Mongoid
146
158
  #
147
159
  # @since 2.0.0.rc.6
148
160
  def raise_unsaved(doc)
149
- raise Errors::UnsavedDocument.new(base, doc)
150
- end
151
-
152
- # Return the name of defined callback method
153
- #
154
- # @example returns the before_add callback method name
155
- # callback_method(:before_add)
156
- #
157
- # @param [ Symbol ] callback_name Which callback
158
- #
159
- # @return [ Array ] with callback methods to be executed, the array may have symbols and Procs
160
- #
161
- # @since 3.1.0
162
- def callback_method(callback_name)
163
- methods = []
164
- metadata = __metadata[callback_name]
165
- if metadata
166
- if metadata.is_a?(Array)
167
- methods.concat(metadata)
168
- else
169
- methods << metadata
170
- end
171
- end
172
- methods
161
+ raise Errors::UnsavedDocument.new(_base, doc)
173
162
  end
174
163
 
175
164
  # Executes a callback method
@@ -181,14 +170,11 @@ module Mongoid
181
170
  #
182
171
  # @since 3.1.0
183
172
  def execute_callback(callback, doc)
184
- callback_method = callback_method(callback)
185
- if callback_method
186
- callback_method.each do |c|
187
- if c.is_a? Proc
188
- c.call(base, doc)
189
- else
190
- base.send c, doc
191
- end
173
+ _association.get_callbacks(callback).each do |c|
174
+ if c.is_a? Proc
175
+ c.call(_base, doc)
176
+ else
177
+ _base.send c, doc
192
178
  end
193
179
  end
194
180
  end
@@ -198,16 +184,16 @@ module Mongoid
198
184
  # Apply ordering to the criteria if it was defined on the relation.
199
185
  #
200
186
  # @example Apply the ordering.
201
- # Proxy.apply_ordering(criteria, metadata)
187
+ # Proxy.apply_ordering(criteria, association)
202
188
  #
203
189
  # @param [ Criteria ] criteria The criteria to modify.
204
- # @param [ Metadata ] metadata The relation metadata.
190
+ # @param [ Association ] association The association metadata.
205
191
  #
206
192
  # @return [ Criteria ] The ordered criteria.
207
193
  #
208
194
  # @since 3.0.6
209
- def apply_ordering(criteria, metadata)
210
- metadata.order ? criteria.order_by(metadata.order) : criteria
195
+ def apply_ordering(criteria, association)
196
+ association.order ? criteria.order_by(association.order) : criteria
211
197
  end
212
198
  end
213
199
  end
@@ -0,0 +1,79 @@
1
+ module Mongoid
2
+ module Association
3
+ module Referenced
4
+
5
+ module AutoSave
6
+ extend ActiveSupport::Concern
7
+
8
+ # Used to prevent infinite loops in associated autosaves.
9
+ #
10
+ # @example Is the document autosaved?
11
+ # document.autosaved?
12
+ #
13
+ # @return [ true, false ] Has the document already been autosaved?
14
+ #
15
+ # @since 3.0.0
16
+ def autosaved?
17
+ Threaded.autosaved?(self)
18
+ end
19
+
20
+ # Begin the associated autosave.
21
+ #
22
+ # @example Begin autosave.
23
+ # document.__autosaving__
24
+ #
25
+ # @since 3.1.3
26
+ def __autosaving__
27
+ Threaded.begin_autosave(self)
28
+ yield
29
+ ensure
30
+ Threaded.exit_autosave(self)
31
+ end
32
+
33
+ # Check if there is changes for auto-saving
34
+ #
35
+ # @example Return true if there is changes on self or in
36
+ # autosaved relations.
37
+ # document.changed_for_autosave?
38
+ #
39
+ # @since 3.1.3
40
+ def changed_for_autosave?(doc)
41
+ doc.new_record? || doc.changed? || doc.marked_for_destruction?
42
+ end
43
+
44
+ # Define the autosave method on an association's owning class for
45
+ # an associated object.
46
+ #
47
+ # @example Define the autosave method:
48
+ # Association::Referenced::Autosave.define_autosave!(association)
49
+ #
50
+ # @param [ Association ] association The association for which autosaving is enabled.
51
+ #
52
+ # @return [ Class ] The association's owner class.
53
+ #
54
+ # @since 7.0
55
+ def self.define_autosave!(association)
56
+ association.inverse_class.tap do |klass|
57
+ save_method = :"autosave_documents_for_#{association.name}"
58
+ klass.send(:define_method, save_method) do
59
+ if before_callback_halted?
60
+ self.before_callback_halted = false
61
+ else
62
+ __autosaving__ do
63
+ if relation = ivar(association.name)
64
+ Array(relation).each do |doc|
65
+ doc.with(persistence_context) do |d|
66
+ d.save
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ klass.after_save save_method, unless: :autosaved?
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end