mongoid 6.4.8 → 7.0.13

Sign up to get free protection for your applications and to get access to all the features.
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