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
@@ -2,6 +2,8 @@
2
2
  require "mongoid/matchable/default"
3
3
  require "mongoid/matchable/all"
4
4
  require "mongoid/matchable/and"
5
+ require "mongoid/matchable/elem_match"
6
+ require "mongoid/matchable/eq"
5
7
  require "mongoid/matchable/exists"
6
8
  require "mongoid/matchable/gt"
7
9
  require "mongoid/matchable/gte"
@@ -10,15 +12,14 @@ require "mongoid/matchable/lt"
10
12
  require "mongoid/matchable/lte"
11
13
  require "mongoid/matchable/ne"
12
14
  require "mongoid/matchable/nin"
13
- require "mongoid/matchable/or"
14
15
  require "mongoid/matchable/nor"
15
- require "mongoid/matchable/size"
16
- require "mongoid/matchable/elem_match"
16
+ require "mongoid/matchable/or"
17
17
  require "mongoid/matchable/regexp"
18
+ require "mongoid/matchable/size"
18
19
 
19
20
  module Mongoid
20
21
 
21
- # This module contains all the behavior for ruby implementations of MongoDB
22
+ # This module contains all the behavior for Ruby implementations of MongoDB
22
23
  # selectors.
23
24
  #
24
25
  # @since 4.0.0
@@ -30,8 +31,9 @@ module Mongoid
30
31
  # @since 1.0.0
31
32
  MATCHERS = {
32
33
  "$all" => All,
33
- "$elemMatch" => ElemMatch,
34
34
  "$and" => And,
35
+ "$elemMatch" => ElemMatch,
36
+ "$eq" => Eq,
35
37
  "$exists" => Exists,
36
38
  "$gt" => Gt,
37
39
  "$gte" => Gte,
@@ -40,9 +42,9 @@ module Mongoid
40
42
  "$lte" => Lte,
41
43
  "$ne" => Ne,
42
44
  "$nin" => Nin,
43
- "$or" => Or,
44
45
  "$nor" => Nor,
45
- "$size" => Size
46
+ "$or" => Or,
47
+ "$size" => Size,
46
48
  }.with_indifferent_access.freeze
47
49
 
48
50
  # Determines if this document has the attributes to match the supplied
@@ -62,13 +64,13 @@ module Mongoid
62
64
  value.each do |item|
63
65
  if item[0].to_s == "$not".freeze
64
66
  item = item[1]
65
- return false if matcher(self, key, item)._matches?(item)
67
+ return false if matcher(key, item)._matches?(item)
66
68
  else
67
- return false unless matcher(self, key, Hash[*item])._matches?(Hash[*item])
69
+ return false unless matcher(key, Hash[*item])._matches?(Hash[*item])
68
70
  end
69
71
  end
70
72
  else
71
- return false unless matcher(self, key, value)._matches?(value)
73
+ return false unless matcher(key, value)._matches?(value)
72
74
  end
73
75
  end
74
76
  true
@@ -79,20 +81,18 @@ module Mongoid
79
81
  # Get the matcher for the supplied key and value. Will determine the class
80
82
  # name from the key.
81
83
  #
82
- # @api private
83
- #
84
84
  # @example Get the matcher.
85
85
  # document.matcher(:title, { "$in" => [ "test" ] })
86
86
  #
87
- # @param [ Document ] document The document to check.
88
87
  # @param [ Symbol, String ] key The field name.
89
88
  # @param [ Object, Hash ] value The value or selector.
90
89
  #
91
90
  # @return [ Matcher ] The matcher.
92
91
  #
93
92
  # @since 2.0.0.rc.7
94
- def matcher(document, key, value)
95
- Matchable.matcher(document, key, value)
93
+ # @api private
94
+ def matcher(key, value)
95
+ Matchable.matcher(self, key, value)
96
96
  end
97
97
 
98
98
  class << self
@@ -103,7 +103,7 @@ module Mongoid
103
103
  # @api private
104
104
  #
105
105
  # @example Get the matcher.
106
- # document.matcher(:title, { "$in" => [ "test" ] })
106
+ # Matchable.matcher(document, :title, { "$in" => [ "test" ] })
107
107
  #
108
108
  # @param [ Document ] document The document to check.
109
109
  # @param [ Symbol, String ] key The field name.
@@ -147,6 +147,7 @@ module Mongoid
147
147
  # @return [ Object ] The value of the attribute.
148
148
  #
149
149
  # @since 2.2.1
150
+ # @api private
150
151
  def extract_attribute(document, key)
151
152
  if (key_string = key.to_s) =~ /.+\..+/
152
153
  key_string.split('.').inject(document.send(:as_attributes)) do |_attribs, _key|
@@ -21,10 +21,12 @@ module Mongoid
21
21
  def delete(options = {})
22
22
  raise Errors::ReadonlyDocument.new(self.class) if readonly?
23
23
  prepare_delete do
24
- if embedded?
25
- delete_as_embedded(options)
26
- else
27
- delete_as_root
24
+ unless options[:persist] == false
25
+ if embedded?
26
+ delete_as_embedded(options)
27
+ else
28
+ delete_as_root
29
+ end
28
30
  end
29
31
  end
30
32
  end
@@ -113,11 +115,10 @@ module Mongoid
113
115
  #
114
116
  # @since 4.0.0
115
117
  def prepare_delete
116
- cascade!
118
+ return false unless catch(:abort) { apply_delete_dependencies! }
117
119
  yield(self)
118
120
  freeze
119
121
  self.destroyed = true
120
- true
121
122
  end
122
123
 
123
124
  module ClassMethods
@@ -28,7 +28,7 @@ module Mongoid
28
28
  attributes[field] = (current || 0) + increment
29
29
  ops[atomic_attribute_name(field)] = increment
30
30
  end
31
- { "$inc" => ops }
31
+ { "$inc" => ops } unless ops.empty?
32
32
  end
33
33
  end
34
34
  end
@@ -30,7 +30,7 @@ module Mongoid
30
30
  attributes[field] = value
31
31
  ops[atomic_attribute_name(field)] = values
32
32
  end
33
- { "$bit" => ops }
33
+ { "$bit" => ops } unless ops.empty?
34
34
  end
35
35
  end
36
36
  end
@@ -22,7 +22,13 @@ module Mongoid
22
22
  def add_to_set(adds)
23
23
  prepare_atomic_operation do |ops|
24
24
  process_atomic_operations(adds) do |field, value|
25
- existing = send(field) || (attributes[field] ||= [])
25
+ existing = send(field) || attributes[field]
26
+ if existing.nil?
27
+ attributes[field] = []
28
+ # Read the value out of attributes:
29
+ # https://jira.mongodb.org/browse/MONGOID-4874
30
+ existing = attributes[field]
31
+ end
26
32
  values = [ value ].flatten(1)
27
33
  values.each do |val|
28
34
  existing.push(val) unless existing.include?(val)
@@ -49,7 +55,10 @@ module Mongoid
49
55
  def push(pushes)
50
56
  prepare_atomic_operation do |ops|
51
57
  process_atomic_operations(pushes) do |field, value|
52
- existing = send(field) || (attributes[field] ||= [])
58
+ existing = send(field) || begin
59
+ attributes[field] ||= []
60
+ attributes[field]
61
+ end
53
62
  values = [ value ].flatten(1)
54
63
  values.each{ |val| existing.push(val) }
55
64
  ops[atomic_attribute_name(field)] = { "$each" => values }
@@ -14,6 +14,34 @@ module Mongoid
14
14
  # @example Set the values.
15
15
  # document.set(title: "sir", dob: Date.new(1970, 1, 1))
16
16
  #
17
+ # The key can be a dotted sequence of keys, in which case the
18
+ # top level field is treated as a nested hash and any missing keys
19
+ # are created automatically:
20
+ #
21
+ # @example Set the values using nested hash semantics.
22
+ # document.set('author.title' => 'Sir')
23
+ # # => document.author == {'title' => 'Sir'}
24
+ #
25
+ # Performing a nested set like this merges values of intermediate keys:
26
+ #
27
+ # @example Nested hash value merging.
28
+ # document.set('author.title' => 'Sir')
29
+ # document.set('author.name' => 'Linus Torvalds')
30
+ # # => document.author == {'title' => 'Sir', 'name' => 'Linus Torvalds'}
31
+ #
32
+ # If the top level field was not a hash, its original value is discarded
33
+ # and the field is replaced with a hash.
34
+ #
35
+ # @example Nested hash overwriting a non-hash value.
36
+ # document.set('author' => 'John Doe')
37
+ # document.set('author.title' => 'Sir')
38
+ # # => document.author == {'title' => 'Sir'}
39
+ #
40
+ # Note that unlike MongoDB's $set, Mongoid's set writes out the entire
41
+ # field even when setting a subset of the field via the nested hash
42
+ # semantics. This means performing a $set with nested hash semantics
43
+ # can overwrite other hash keys within the top level field in the database.
44
+ #
17
45
  # @param [ Hash ] setters The field/value pairs to set.
18
46
  #
19
47
  # @return [ Document ] The document.
@@ -23,16 +51,38 @@ module Mongoid
23
51
  prepare_atomic_operation do |ops|
24
52
  process_atomic_operations(setters) do |field, value|
25
53
 
26
- field_and_value_hash = hasherizer(field.split('.'), value)
27
- field = field_and_value_hash.keys.first.to_s
28
- value = field_and_value_hash[field]
54
+ field_seq = field.to_s.split('.')
55
+ field = field_seq.shift
56
+ if field_seq.length > 0
57
+ # nested hash path
58
+ old_value = attributes[field]
59
+
60
+ # if the old value is not a hash, clobber it
61
+ unless Hash === old_value
62
+ old_value = {}
63
+ end
64
+
65
+ # descend into the hash, creating intermediate keys as needed
66
+ cur_value = old_value
67
+ while field_seq.length > 1
68
+ cur_key = field_seq.shift
69
+ # clobber on each level if type is not a hash
70
+ unless Hash === cur_value[cur_key]
71
+ cur_value[cur_key] = {}
72
+ end
73
+ cur_value = cur_value[cur_key]
74
+ end
29
75
 
30
- if fields[field] && fields[field].type == Hash && attributes.key?(field) && Hash === value && !value.empty?
31
- merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
32
- value = (attributes[field] || {}).merge(value, &merger)
76
+ # now we are on the leaf level, perform the set
77
+ # and overwrite whatever was on this level before
78
+ cur_value[field_seq.shift] = value
79
+
80
+ # and set value to the value of the top level field
81
+ # because this is what we pass to $set
82
+ value = old_value
33
83
  end
34
84
 
35
- process_attribute(field.to_s, value)
85
+ process_attribute(field, value)
36
86
 
37
87
  unless relations.include?(field.to_s)
38
88
  ops[atomic_attribute_name(field)] = attributes[field]
@@ -42,10 +92,5 @@ module Mongoid
42
92
  end
43
93
  end
44
94
  end
45
-
46
- def hasherizer(keys, value)
47
- return value if keys.empty?
48
- {}.tap { |hash| hash[keys.shift] = hasherizer(keys, value) }
49
- end
50
95
  end
51
96
  end
@@ -162,10 +162,9 @@ module Mongoid
162
162
  # @since 4.0.0
163
163
  def process_atomic_operations(operations)
164
164
  operations.each do |field, value|
165
- as_writable_attribute!(field, value) do |access|
166
- yield(access, value)
167
- remove_change(access)
168
- end
165
+ access = database_field_name(field)
166
+ yield(access, value)
167
+ remove_change(access)
169
168
  end
170
169
  end
171
170
 
@@ -202,7 +201,7 @@ module Mongoid
202
201
  #
203
202
  # @since 4.0.0
204
203
  def persist_atomic_operations(operations)
205
- if persisted? && operations
204
+ if persisted? && operations && !operations.empty?
206
205
  selector = atomic_selector
207
206
  _root.collection.find(selector).update_one(positionally(selector, operations), session: _session)
208
207
  end
@@ -116,6 +116,12 @@ module Mongoid
116
116
  client.with(client_options))
117
117
  end
118
118
 
119
+ def client_name
120
+ @client_name ||= options[:client] ||
121
+ Threaded.client_override ||
122
+ storage_options && __evaluate__(storage_options[:client])
123
+ end
124
+
119
125
  # Determine if this persistence context is equal to another.
120
126
  #
121
127
  # @example Compare two persistence contexts.
@@ -133,12 +139,6 @@ module Mongoid
133
139
 
134
140
  private
135
141
 
136
- def client_name
137
- @client_name ||= options[:client] ||
138
- Threaded.client_override ||
139
- storage_options && __evaluate__(storage_options[:client])
140
- end
141
-
142
142
  def set_options!(opts)
143
143
  @options ||= opts.each.reduce({}) do |_options, (key, value)|
144
144
  unless VALID_OPTIONS.include?(key.to_sym)
@@ -169,6 +169,9 @@ module Mongoid
169
169
 
170
170
  # Set the persistence context for a particular class or model instance.
171
171
  #
172
+ # If there already is a persistence context set, options in the existing
173
+ # context are combined with options given to the set call.
174
+ #
172
175
  # @example Set the persistence context for a class or model instance.
173
176
  # PersistenceContext.set(model)
174
177
  #
@@ -180,9 +183,19 @@ module Mongoid
180
183
  #
181
184
  # @since 6.0.0
182
185
  def set(object, options_or_context)
183
- context = PersistenceContext.new(object, options_or_context.is_a?(PersistenceContext) ?
184
- options_or_context.options : options_or_context)
185
- Thread.current["[mongoid][#{object.object_id}]:context"] = context
186
+ key = "[mongoid][#{object.object_id}]:context"
187
+ existing_context = Thread.current[key]
188
+ existing_options = if existing_context
189
+ existing_context.options
190
+ else
191
+ {}
192
+ end
193
+ if options_or_context.is_a?(PersistenceContext)
194
+ options_or_context = options_or_context.options
195
+ end
196
+ new_options = existing_options.merge(options_or_context)
197
+ context = PersistenceContext.new(object, new_options)
198
+ Thread.current[key] = context
186
199
  end
187
200
 
188
201
  # Get the persistence context for a particular class or model instance.
@@ -206,14 +219,16 @@ module Mongoid
206
219
  #
207
220
  # @param [ Class, Object ] object The class or model instance.
208
221
  # @param [ Mongo::Cluster ] cluster The original cluster before this context was used.
222
+ # @param [ Mongoid::PersistenceContext ] original_context The original persistence
223
+ # context that was set before this context was used.
209
224
  #
210
225
  # @since 6.0.0
211
- def clear(object, cluster = nil)
226
+ def clear(object, cluster = nil, original_context = nil)
212
227
  if context = get(object)
213
228
  context.client.close unless (context.cluster.equal?(cluster) || cluster.nil?)
214
229
  end
215
230
  ensure
216
- Thread.current["[mongoid][#{object.object_id}]:context"] = nil
231
+ Thread.current["[mongoid][#{object.object_id}]:context"] = original_context
217
232
  end
218
233
  end
219
234
  end
@@ -64,7 +64,7 @@ module Mongoid
64
64
  matches = position.scan(/\.\d+\./)
65
65
  if matches.size == 1
66
66
  keys.each do |kk|
67
- if position =~ /^#{kk}\.\d+\.(.*)/
67
+ if position =~ /\A#{kk}\.\d+\.(.*)\z/
68
68
  return "#{kk}.$.#{$1}"
69
69
  end
70
70
  end
@@ -138,7 +138,9 @@ module Mongoid
138
138
  # @since 5.0.0
139
139
  def each
140
140
  if @cached_documents
141
- @cached_documents.each{ |doc| yield doc }
141
+ @cached_documents.each do |doc|
142
+ yield doc
143
+ end
142
144
  else
143
145
  super
144
146
  end
@@ -293,7 +295,7 @@ module Mongoid
293
295
  end
294
296
 
295
297
  def system_collection?
296
- collection.namespace =~ /^system./
298
+ collection.namespace =~ /\Asystem./
297
299
  end
298
300
 
299
301
  def driver_supports_cursor_sessions?
@@ -101,7 +101,7 @@ module Mongoid
101
101
  value = send(name)
102
102
  attrs[name] = value ? value.serializable_hash(options) : nil
103
103
  elsif names.include?(name) && !fields.key?(name)
104
- attrs[name] = read_attribute(name)
104
+ attrs[name] = read_raw_attribute(name)
105
105
  elsif !attribute_missing?(name)
106
106
  attrs[name] = send(name)
107
107
  end
@@ -124,9 +124,9 @@ module Mongoid
124
124
  def serialize_relations(attributes = {}, options = {})
125
125
  inclusions = options[:include]
126
126
  relation_names(inclusions).each do |name|
127
- metadata = relations[name.to_s]
128
- if metadata && relation = send(metadata.name)
129
- attributes[metadata.name.to_s] =
127
+ association = relations[name.to_s]
128
+ if association && relation = send(association.name)
129
+ attributes[association.name.to_s] =
130
130
  relation.serializable_hash(relation_options(inclusions, options, name))
131
131
  end
132
132
  end
@@ -37,7 +37,7 @@ module Mongoid
37
37
  def shard_key_selector
38
38
  selector = {}
39
39
  shard_key_fields.each do |field|
40
- selector[field.to_s] = send(field)
40
+ selector[field.to_s] = new_record? ? send(field) : attribute_was(field)
41
41
  end
42
42
  selector
43
43
  end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+ module Mongoid
4
+ module Touchable
5
+
6
+ module InstanceMethods
7
+
8
+ # Touch the document, in effect updating its updated_at timestamp and
9
+ # optionally the provided field to the current time. If any belongs_to
10
+ # relations exist with a touch option, they will be updated as well.
11
+ #
12
+ # @example Update the updated_at timestamp.
13
+ # document.touch
14
+ #
15
+ # @example Update the updated_at and provided timestamps.
16
+ # document.touch(:audited)
17
+ #
18
+ # @note This will not autobuild relations if those options are set.
19
+ #
20
+ # @param [ Symbol ] field The name of an additional field to update.
21
+ #
22
+ # @return [ true/false ] false if record is new_record otherwise true.
23
+ #
24
+ # @since 3.0.0
25
+ def touch(field = nil)
26
+ return false if _root.new_record?
27
+ current = Time.now
28
+ field = database_field_name(field)
29
+ write_attribute(:updated_at, current) if respond_to?("updated_at=")
30
+ write_attribute(field, current) if field
31
+
32
+ touches = touch_atomic_updates(field)
33
+ unless touches["$set"].blank?
34
+ selector = atomic_selector
35
+ _root.collection.find(selector).update_one(positionally(selector, touches), session: _session)
36
+ end
37
+ run_callbacks(:touch)
38
+ true
39
+ end
40
+ end
41
+
42
+ extend self
43
+
44
+ # Add the association to the touchable relations if the touch option was
45
+ # provided.
46
+ #
47
+ # @example Add the touchable.
48
+ # Model.define_touchable!(assoc)
49
+ #
50
+ # @param [ Association ] association The association metadata.
51
+ #
52
+ # @return [ Class ] The model class.
53
+ #
54
+ # @since 3.0.0
55
+ def define_touchable!(association)
56
+ name = association.name
57
+ method_name = define_relation_touch_method(name, association)
58
+ association.inverse_class.tap do |klass|
59
+ klass.after_save method_name
60
+ klass.after_destroy method_name
61
+ klass.after_touch method_name
62
+ end
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 [ Association ] association The association metadata.
78
+ #
79
+ # @since 3.1.0
80
+ #
81
+ # @return [ Symbol ] The method name.
82
+ def define_relation_touch_method(name, association)
83
+ relation_classes = if association.polymorphic?
84
+ association.send(:inverse_association_classes)
85
+ else
86
+ [ association.relation_class ]
87
+ end
88
+
89
+ relation_classes.each { |c| c.send(:include, InstanceMethods) }
90
+ method_name = "touch_#{name}_after_create_or_destroy"
91
+ association.inverse_class.class_eval <<-TOUCH, __FILE__, __LINE__ + 1
92
+ def #{method_name}
93
+ without_autobuild do
94
+ relation = __send__(:#{name})
95
+ relation.touch #{":#{association.touch_field}" if association.touch_field} if relation
96
+ end
97
+ end
98
+ TOUCH
99
+ method_name.to_sym
100
+ end
101
+ end
102
+ end
@@ -8,7 +8,7 @@ module Mongoid
8
8
  extend ActiveSupport::Concern
9
9
 
10
10
  def _parent
11
- @__parent
11
+ @__parent ||= nil
12
12
  end
13
13
 
14
14
  def _parent=(p)
@@ -40,7 +40,7 @@ module Mongoid
40
40
  # @since 2.4.0
41
41
  def collect_children
42
42
  children = []
43
- embedded_relations.each_pair do |name, metadata|
43
+ embedded_relations.each_pair do |name, association|
44
44
  without_autobuild do
45
45
  child = send(name)
46
46
  Array.wrap(child).each do |doc|
@@ -101,7 +101,7 @@ module Mongoid
101
101
  #
102
102
  # @since 2.0.0.beta.1
103
103
  def remove_child(child)
104
- name = child.metadata_name
104
+ name = child.association_name
105
105
  if child.embedded_one?
106
106
  remove_ivar(name)
107
107
  else
@@ -48,7 +48,7 @@ module Mongoid
48
48
  # include Mongoid::Document
49
49
  # field :title
50
50
  #
51
- # validates_format_of :title, with: /^[a-z0-9 \-_]*$/i
51
+ # validates_format_of :title, with: /\A[a-z0-9 \-_]*\z/i
52
52
  # end
53
53
  #
54
54
  # @param [ Array ] args The names of the fields to validate.
@@ -62,8 +62,8 @@ module Mongoid
62
62
  # @since 3.0.0
63
63
  def relation_or_fk_missing?(doc, attr, value)
64
64
  return true if value.blank? && doc.send(attr).blank?
65
- metadata = doc.relations[attr.to_s]
66
- metadata.stores_foreign_key? && doc.send(metadata.foreign_key).blank?
65
+ association = doc.relations[attr.to_s]
66
+ association.stores_foreign_key? && doc.send(association.foreign_key).blank?
67
67
  end
68
68
 
69
69
  # For guarding against false values.
@@ -148,7 +148,7 @@ module Mongoid
148
148
  #
149
149
  # @since 2.3.0
150
150
  def filter(value)
151
- !case_sensitive? && value ? /\A#{Regexp.escape(value.to_s)}$/i : value
151
+ !case_sensitive? && value ? /\A#{Regexp.escape(value.to_s)}\z/i : value
152
152
  end
153
153
 
154
154
  # Scope the criteria to the scope options provided.
@@ -224,9 +224,9 @@ module Mongoid
224
224
  #
225
225
  # @since 2.4.4
226
226
  def to_validate(document, attribute, value)
227
- metadata = document.relations[attribute.to_s]
228
- if metadata && metadata.stores_foreign_key?
229
- [ metadata.foreign_key, value && value._id ]
227
+ association = document.relations[attribute.to_s]
228
+ if association && association.stores_foreign_key?
229
+ [ association.foreign_key, value && value._id ]
230
230
  else
231
231
  [ attribute, value ]
232
232
  end
@@ -246,7 +246,7 @@ module Mongoid
246
246
  # @since 2.4.10
247
247
  def validate_embedded(document, attribute, value)
248
248
  return if skip_validation?(document)
249
- relation = document._parent.send(document.metadata_name)
249
+ relation = document._parent.send(document.association_name)
250
250
  criteria = create_criteria(relation, document, attribute, value)
251
251
  criteria = criteria.merge(options[:conditions].call) if options[:conditions]
252
252
  add_error(document, attribute, value) if criteria.count > 1
@@ -127,14 +127,14 @@ module Mongoid
127
127
  # was not provided or set to true.
128
128
  #
129
129
  # @example Set up validation.
130
- # Person.validates_relation(metadata)
130
+ # Person.validates_relation(association)
131
131
  #
132
- # @param [ Metadata ] metadata The relation metadata.
132
+ # @param [ Association ] association The association metadata.
133
133
  #
134
134
  # @since 2.0.0.rc.1
135
- def validates_relation(metadata)
136
- if metadata.validate?
137
- validates_associated(metadata.name)
135
+ def validates_relation(association)
136
+ if association.validate?
137
+ validates_associated(association.name)
138
138
  end
139
139
  end
140
140
 
@@ -154,9 +154,9 @@ module Mongoid
154
154
  def validates_with(*args, &block)
155
155
  if args.first == PresenceValidator
156
156
  args.last[:attributes].each do |name|
157
- metadata = relations[name.to_s]
158
- if metadata && metadata[:autosave] != false
159
- autosave(metadata.merge!(autosave: true))
157
+ association = relations[name.to_s]
158
+ if association && association.autosave?
159
+ Association::Referenced::AutoSave.define_autosave!(association)
160
160
  end
161
161
  end
162
162
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+
2
3
  module Mongoid
3
- VERSION = "6.4.8"
4
+ VERSION = "7.0.13"
4
5
  end
data/lib/mongoid.rb CHANGED
@@ -13,6 +13,7 @@ require "active_support/time_with_zone"
13
13
  require "active_model"
14
14
 
15
15
  require "mongo"
16
+ require 'mongo/active_support'
16
17
 
17
18
  require "mongoid/version"
18
19
  require "mongoid/config"