mongoid 6.4.8 → 7.0.0

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 (320) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/Rakefile +0 -26
  4. data/lib/config/locales/en.yml +17 -0
  5. data/lib/mongoid/association/accessors.rb +339 -0
  6. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  7. data/lib/mongoid/association/builders.rb +92 -0
  8. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  9. data/lib/mongoid/association/depending.rb +116 -0
  10. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
  11. data/lib/mongoid/{relations → association}/embedded/batchable.rb +21 -21
  12. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  13. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  14. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  15. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  16. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  17. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
  18. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  19. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +529 -0
  20. data/lib/mongoid/association/embedded/embeds_many.rb +210 -0
  21. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
  22. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
  23. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  24. data/lib/mongoid/association/embedded/embeds_one.rb +173 -0
  25. data/lib/mongoid/association/embedded.rb +4 -0
  26. data/lib/mongoid/association/macros.rb +204 -0
  27. data/lib/mongoid/{relations → association}/many.rb +20 -50
  28. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  29. data/lib/mongoid/association/nested/many.rb +200 -0
  30. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  31. data/lib/mongoid/association/nested/one.rb +127 -0
  32. data/lib/mongoid/association/nested.rb +15 -0
  33. data/lib/mongoid/{relations → association}/one.rb +6 -6
  34. data/lib/mongoid/association/options.rb +152 -0
  35. data/lib/mongoid/{relations → association}/proxy.rb +31 -58
  36. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  37. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  38. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  39. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  40. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  41. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  42. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  43. data/lib/mongoid/association/referenced/eager.rb +159 -0
  44. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  45. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +310 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  49. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
  50. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  51. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  52. data/lib/mongoid/association/referenced/has_many/enumerable.rb +510 -0
  53. data/lib/mongoid/association/referenced/has_many/proxy.rb +578 -0
  54. data/lib/mongoid/association/referenced/has_many.rb +275 -0
  55. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  56. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  57. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  58. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  59. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  60. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  61. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  62. data/lib/mongoid/association/referenced.rb +7 -0
  63. data/lib/mongoid/{relations → association}/reflections.rb +21 -17
  64. data/lib/mongoid/association/relatable.rb +415 -0
  65. data/lib/mongoid/association/touchable.rb +97 -0
  66. data/lib/mongoid/association.rb +150 -0
  67. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  68. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  69. data/lib/mongoid/atomic.rb +4 -4
  70. data/lib/mongoid/attributes/dynamic.rb +2 -2
  71. data/lib/mongoid/attributes/nested.rb +10 -10
  72. data/lib/mongoid/attributes/processing.rb +2 -2
  73. data/lib/mongoid/attributes/readonly.rb +2 -4
  74. data/lib/mongoid/attributes.rb +22 -13
  75. data/lib/mongoid/changeable.rb +1 -1
  76. data/lib/mongoid/clients/options.rb +1 -1
  77. data/lib/mongoid/clients/sessions.rb +2 -2
  78. data/lib/mongoid/composable.rb +4 -4
  79. data/lib/mongoid/config.rb +1 -0
  80. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  81. data/lib/mongoid/contextual/atomic.rb +1 -1
  82. data/lib/mongoid/contextual/geo_near.rb +1 -1
  83. data/lib/mongoid/contextual/map_reduce.rb +4 -4
  84. data/lib/mongoid/contextual/memory.rb +25 -7
  85. data/lib/mongoid/contextual/mongo.rb +13 -11
  86. data/lib/mongoid/copyable.rb +6 -6
  87. data/lib/mongoid/criteria/includable.rb +14 -14
  88. data/lib/mongoid/criteria/modifiable.rb +8 -14
  89. data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
  90. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  91. data/lib/mongoid/criteria/queryable/selectable.rb +10 -34
  92. data/lib/mongoid/criteria.rb +2 -2
  93. data/lib/mongoid/document.rb +6 -6
  94. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  95. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  96. data/lib/mongoid/errors/unknown_model.rb +25 -0
  97. data/lib/mongoid/errors.rb +3 -0
  98. data/lib/mongoid/extensions/array.rb +5 -5
  99. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  100. data/lib/mongoid/extensions/hash.rb +5 -2
  101. data/lib/mongoid/extensions/object.rb +4 -4
  102. data/lib/mongoid/extensions/range.rb +1 -0
  103. data/lib/mongoid/extensions/regexp.rb +0 -1
  104. data/lib/mongoid/extensions/string.rb +1 -3
  105. data/lib/mongoid/extensions.rb +0 -4
  106. data/lib/mongoid/factory.rb +13 -3
  107. data/lib/mongoid/fields/foreign_key.rb +5 -5
  108. data/lib/mongoid/fields/standard.rb +2 -14
  109. data/lib/mongoid/fields/validators/macro.rb +1 -1
  110. data/lib/mongoid/fields.rb +3 -3
  111. data/lib/mongoid/indexable.rb +8 -5
  112. data/lib/mongoid/interceptable.rb +5 -5
  113. data/lib/mongoid/matchable/and.rb +1 -1
  114. data/lib/mongoid/matchable/elem_match.rb +9 -3
  115. data/lib/mongoid/matchable.rb +0 -3
  116. data/lib/mongoid/persistable/creatable.rb +2 -2
  117. data/lib/mongoid/persistable/deletable.rb +9 -8
  118. data/lib/mongoid/persistable/incrementable.rb +1 -1
  119. data/lib/mongoid/persistable/logical.rb +1 -1
  120. data/lib/mongoid/persistable/settable.rb +5 -5
  121. data/lib/mongoid/persistable/updatable.rb +2 -2
  122. data/lib/mongoid/persistable/upsertable.rb +1 -1
  123. data/lib/mongoid/persistable.rb +5 -6
  124. data/lib/mongoid/persistence_context.rb +1 -5
  125. data/lib/mongoid/query_cache.rb +19 -64
  126. data/lib/mongoid/railtie.rb +0 -17
  127. data/lib/mongoid/reloadable.rb +1 -1
  128. data/lib/mongoid/scopable.rb +3 -3
  129. data/lib/mongoid/serializable.rb +4 -4
  130. data/lib/mongoid/shardable.rb +1 -1
  131. data/lib/mongoid/tasks/database.rb +2 -2
  132. data/lib/mongoid/threaded.rb +0 -36
  133. data/lib/mongoid/traversable.rb +3 -3
  134. data/lib/mongoid/validatable/presence.rb +2 -2
  135. data/lib/mongoid/validatable/uniqueness.rb +4 -4
  136. data/lib/mongoid/validatable.rb +8 -8
  137. data/lib/mongoid/version.rb +1 -1
  138. data/lib/mongoid.rb +1 -1
  139. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -0
  140. data/spec/app/models/animal.rb +2 -1
  141. data/spec/app/models/bomb.rb +1 -1
  142. data/spec/app/models/message.rb +1 -1
  143. data/spec/app/models/person.rb +5 -2
  144. data/spec/app/models/shipment_address.rb +1 -0
  145. data/spec/app/models/vertex.rb +6 -0
  146. data/spec/app/models/wiki_page.rb +1 -1
  147. data/spec/config/mongoid.yml +1 -0
  148. data/spec/mongoid/{relations → association}/accessors_spec.rb +1 -1
  149. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  150. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  151. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  152. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  153. data/spec/mongoid/association/depending_spec.rb +613 -0
  154. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  155. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  156. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  157. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  158. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +5 -77
  159. data/spec/mongoid/association/embedded/embedded_in_spec.rb +843 -0
  160. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  161. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  162. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +140 -428
  163. data/spec/mongoid/association/embedded/embeds_many_spec.rb +852 -0
  164. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  165. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  166. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  167. data/spec/mongoid/association/embedded/embeds_one_spec.rb +908 -0
  168. data/spec/mongoid/{relations → association}/macros_spec.rb +148 -73
  169. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  170. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  171. data/spec/mongoid/association/options_spec.rb +1321 -0
  172. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +7 -34
  173. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  174. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  175. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +9 -9
  176. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  177. data/spec/mongoid/association/referenced/belongs_to_spec.rb +1963 -0
  178. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
  179. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  180. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +5 -5
  181. data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +107 -98
  182. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
  183. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  184. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  185. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +26 -11
  186. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +122 -1
  187. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +28 -93
  188. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  189. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  190. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  191. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  192. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  193. data/spec/mongoid/association/referenced/has_one_spec.rb +1244 -0
  194. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  195. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
  196. data/spec/mongoid/{relations → association}/touchable_spec.rb +19 -1
  197. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  198. data/spec/mongoid/atomic/modifiers_spec.rb +2 -2
  199. data/spec/mongoid/atomic_spec.rb +4 -4
  200. data/spec/mongoid/attributes/nested_spec.rb +14 -12
  201. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  202. data/spec/mongoid/attributes_spec.rb +38 -2
  203. data/spec/mongoid/clients/factory_spec.rb +28 -52
  204. data/spec/mongoid/clients/options_spec.rb +65 -69
  205. data/spec/mongoid/clients/sessions_spec.rb +4 -13
  206. data/spec/mongoid/config_spec.rb +24 -0
  207. data/spec/mongoid/contextual/geo_near_spec.rb +0 -1
  208. data/spec/mongoid/contextual/memory_spec.rb +19 -0
  209. data/spec/mongoid/contextual/mongo_spec.rb +30 -5
  210. data/spec/mongoid/copyable_spec.rb +34 -0
  211. data/spec/mongoid/criteria/modifiable_spec.rb +183 -60
  212. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
  213. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +43 -0
  214. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  215. data/spec/mongoid/criteria/queryable/selectable_spec.rb +3 -42
  216. data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
  217. data/spec/mongoid/criteria/scopable_spec.rb +0 -81
  218. data/spec/mongoid/criteria_spec.rb +16 -19
  219. data/spec/mongoid/document_spec.rb +2 -56
  220. data/spec/mongoid/extensions/array_spec.rb +11 -15
  221. data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
  222. data/spec/mongoid/extensions/hash_spec.rb +18 -1
  223. data/spec/mongoid/extensions/object_spec.rb +7 -11
  224. data/spec/mongoid/extensions/range_spec.rb +7 -0
  225. data/spec/mongoid/extensions/regexp_spec.rb +0 -23
  226. data/spec/mongoid/extensions/string_spec.rb +7 -35
  227. data/spec/mongoid/factory_spec.rb +19 -1
  228. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  229. data/spec/mongoid/fields_spec.rb +2 -2
  230. data/spec/mongoid/findable_spec.rb +1 -1
  231. data/spec/mongoid/indexable_spec.rb +18 -8
  232. data/spec/mongoid/interceptable_spec.rb +22 -1
  233. data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
  234. data/spec/mongoid/matchable_spec.rb +1 -26
  235. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  236. data/spec/mongoid/persistable/savable_spec.rb +2 -2
  237. data/spec/mongoid/persistable/settable_spec.rb +1 -35
  238. data/spec/mongoid/persistable_spec.rb +21 -6
  239. data/spec/mongoid/query_cache_spec.rb +16 -99
  240. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  241. data/spec/mongoid/scopable_spec.rb +0 -13
  242. data/spec/mongoid/shardable_spec.rb +32 -12
  243. data/spec/mongoid/threaded_spec.rb +0 -68
  244. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  245. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  246. data/spec/mongoid/validatable_spec.rb +1 -1
  247. data/spec/spec_helper.rb +12 -14
  248. data.tar.gz.sig +1 -1
  249. metadata +192 -207
  250. metadata.gz.sig +0 -0
  251. data/lib/mongoid/matchable/nor.rb +0 -37
  252. data/lib/mongoid/railties/controller_runtime.rb +0 -86
  253. data/lib/mongoid/relations/accessors.rb +0 -267
  254. data/lib/mongoid/relations/auto_save.rb +0 -94
  255. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  256. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  257. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  258. data/lib/mongoid/relations/bindings.rb +0 -9
  259. data/lib/mongoid/relations/builder.rb +0 -57
  260. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  261. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  262. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  263. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  264. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  265. data/lib/mongoid/relations/builders.rb +0 -106
  266. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  267. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  268. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  269. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  270. data/lib/mongoid/relations/cascading.rb +0 -56
  271. data/lib/mongoid/relations/conversions.rb +0 -34
  272. data/lib/mongoid/relations/counter_cache.rb +0 -160
  273. data/lib/mongoid/relations/cyclic.rb +0 -107
  274. data/lib/mongoid/relations/eager/base.rb +0 -153
  275. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  276. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  277. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  278. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  279. data/lib/mongoid/relations/embedded/in.rb +0 -241
  280. data/lib/mongoid/relations/embedded/many.rb +0 -683
  281. data/lib/mongoid/relations/embedded/one.rb +0 -235
  282. data/lib/mongoid/relations/macros.rb +0 -367
  283. data/lib/mongoid/relations/metadata.rb +0 -1179
  284. data/lib/mongoid/relations/nested_builder.rb +0 -74
  285. data/lib/mongoid/relations/options.rb +0 -49
  286. data/lib/mongoid/relations/polymorphic.rb +0 -39
  287. data/lib/mongoid/relations/referenced/in.rb +0 -304
  288. data/lib/mongoid/relations/referenced/many.rb +0 -812
  289. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  290. data/lib/mongoid/relations/referenced/one.rb +0 -290
  291. data/lib/mongoid/relations/synchronization.rb +0 -169
  292. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  293. data/lib/mongoid/relations/targets.rb +0 -2
  294. data/lib/mongoid/relations/touchable.rb +0 -97
  295. data/lib/mongoid/relations.rb +0 -148
  296. data/spec/app/models/array_field.rb +0 -7
  297. data/spec/app/models/delegating_patient.rb +0 -16
  298. data/spec/integration/document_spec.rb +0 -22
  299. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  300. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  301. data/spec/mongoid/matchable/nor_spec.rb +0 -209
  302. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  303. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  304. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  305. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  306. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  307. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  308. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  309. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  310. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  311. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  312. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  313. data/spec/mongoid/relations/options_spec.rb +0 -35
  314. data/spec/rails/controller_extension/controller_runtime_spec.rb +0 -110
  315. data/spec/support/cluster_config.rb +0 -158
  316. data/spec/support/constraints.rb +0 -101
  317. data/spec/support/macros.rb +0 -20
  318. data/spec/support/session_registry.rb +0 -50
  319. data/spec/support/spec_config.rb +0 -42
  320. /data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
- # encoding: utf-8
3
- module Mongoid
4
- module Matchable
5
-
6
- # Defines behavior for handling $nor expressions in embedded documents.
7
- class Nor < Default
8
-
9
- # Does the supplied query match the attribute?
10
- #
11
- # Note: an empty array as an argument to $nor is prohibited by
12
- # MongoDB server. Mongoid does allow this and returns false in this case.
13
- #
14
- # @example Does this match?
15
- # matcher._matches?("$nor" => [ { field => value } ])
16
- #
17
- # @param [ Array ] conditions The or expression.
18
- #
19
- # @return [ true, false ] True if matches, false if not.
20
- #
21
- # @since 6.4.2/7.0.2/7.1.0
22
- def _matches?(conditions)
23
- if conditions.length == 0
24
- # MongoDB does not allow $nor array to be empty, but
25
- # Mongoid accepts an empty array for $or which MongoDB also
26
- # prohibits
27
- return false
28
- end
29
- conditions.none? do |condition|
30
- condition.all? do |key, value|
31
- document._matches?(key => value)
32
- end
33
- end
34
- end
35
- end
36
- end
37
- end
@@ -1,86 +0,0 @@
1
- module Mongoid
2
- module Railties
3
- module ControllerRuntime
4
-
5
- # This extension mimics the Rails' internal method to
6
- # measure ActiveRecord runtime during request processing.
7
- # It appends MongoDB runtime value (`mongoid_runtime`) into payload
8
- # of instrumentation event `process_action.action_controller`.
9
- module ControllerExtension
10
- extend ActiveSupport::Concern
11
-
12
- protected
13
-
14
- attr_internal :mongoid_runtime
15
-
16
- # Reset the runtime before each action.
17
- def process_action(action, *args)
18
- Collector.reset_runtime
19
- super
20
- end
21
-
22
- # Override to collect the measurements.
23
- def cleanup_view_runtime
24
- mongo_rt_before_render = Collector.reset_runtime
25
- runtime = super
26
- mongo_rt_after_render = Collector.reset_runtime
27
- self.mongoid_runtime = mongo_rt_before_render + mongo_rt_after_render
28
- runtime - mongo_rt_after_render
29
- end
30
-
31
- # Add the measurement to the instrumentation event payload.
32
- def append_info_to_payload(payload)
33
- super
34
- payload[:mongoid_runtime] = (mongoid_runtime || 0) + Collector.reset_runtime
35
- end
36
-
37
- module ClassMethods
38
-
39
- # Append MongoDB runtime information to ActionController runtime
40
- # log message.
41
- def log_process_action(payload)
42
- messages = super
43
- mongoid_runtime = payload[:mongoid_runtime]
44
- messages << ("MongoDB: %.1fms" % mongoid_runtime.to_f) if mongoid_runtime
45
- messages
46
- end
47
-
48
- end
49
-
50
- end
51
-
52
- # The Collector of MongoDB runtime metric, that subscribes to Mongo
53
- # driver command monitoring. Stores the value within a thread-local
54
- # variable to provide correct accounting when an application issues
55
- # MongoDB operations from background threads.
56
- class Collector
57
-
58
- VARIABLE_NAME = "Mongoid.controller_runtime".freeze
59
-
60
- def started _; end
61
-
62
- def _completed e
63
- Collector.runtime += e.duration
64
- end
65
- alias :succeeded :_completed
66
- alias :failed :_completed
67
-
68
- def self.runtime
69
- Thread.current[VARIABLE_NAME] ||= 0
70
- end
71
-
72
- def self.runtime= value
73
- Thread.current[VARIABLE_NAME] = value
74
- end
75
-
76
- def self.reset_runtime
77
- to_now = runtime
78
- self.runtime = 0
79
- to_now
80
- end
81
-
82
- end
83
-
84
- end
85
- end
86
- end
@@ -1,267 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
-
5
- # This module contains all the behaviour related to accessing relations
6
- # through the getters and setters, and how to delegate to builders to
7
- # create new ones.
8
- module Accessors
9
- extend ActiveSupport::Concern
10
-
11
- # Builds the related document and creates the relation unless the
12
- # document is nil, then sets the relation on this document.
13
- #
14
- # @example Build the relation.
15
- # person.__build__(:addresses, { :_id => 1 }, metadata)
16
- #
17
- # @param [ String, Symbol ] name The name of the relation.
18
- # @param [ Hash, BSON::ObjectId ] object The id or attributes to use.
19
- # @param [ Metadata ] metadata The relation's metadata.
20
- #
21
- # @return [ Proxy ] The relation.
22
- #
23
- # @since 2.0.0.rc.1
24
- def __build__(name, object, metadata)
25
- relation = create_relation(object, metadata)
26
- set_relation(name, relation)
27
- end
28
-
29
- # Create a relation from an object and metadata.
30
- #
31
- # @example Create the relation.
32
- # person.create_relation(document, metadata)
33
- #
34
- # @param [ Document, Array<Document> ] object The relation target.
35
- # @param [ Metadata ] metadata The relation metadata.
36
- #
37
- # @return [ Proxy ] The relation.
38
- #
39
- # @since 2.0.0.rc.1
40
- def create_relation(object, metadata)
41
- type = @attributes[metadata.inverse_type]
42
- target = metadata.builder(self, object).build(type)
43
- target ? metadata.relation.new(self, target, metadata) : nil
44
- end
45
-
46
- # Resets the criteria inside the relation proxy. Used by many to many
47
- # relations to keep the underlying ids array in sync.
48
- #
49
- # @example Reset the relation criteria.
50
- # person.reset_relation_criteria(:preferences)
51
- #
52
- # @param [ Symbol ] name The name of the relation.
53
- #
54
- # @since 3.0.14
55
- def reset_relation_criteria(name)
56
- if instance_variable_defined?("@_#{name}")
57
- send(name).reset_unloaded
58
- end
59
- end
60
-
61
- # Set the supplied relation to an instance variable on the class with the
62
- # provided name. Used as a helper just for code cleanliness.
63
- #
64
- # @example Set the proxy on the document.
65
- # person.set(:addresses, addresses)
66
- #
67
- # @param [ String, Symbol ] name The name of the relation.
68
- # @param [ Proxy ] relation The relation to set.
69
- #
70
- # @return [ Proxy ] The relation.
71
- #
72
- # @since 2.0.0.rc.1
73
- def set_relation(name, relation)
74
- instance_variable_set("@_#{name}", relation)
75
- end
76
-
77
- private
78
-
79
- # Get the relation. Extracted out from the getter method to avoid
80
- # infinite recursion when overriding the getter.
81
- #
82
- # @api private
83
- #
84
- # @example Get the relation.
85
- # document.get_relation(:name, metadata)
86
- #
87
- # @param [ Symbol ] name The name of the relation.
88
- # @param [ Metadata ] metadata The relation metadata.
89
- # @param [ true, false ] reload If the relation is to be reloaded.
90
- #
91
- # @return [ Proxy ] The relation.
92
- #
93
- # @since 3.0.16
94
- def get_relation(name, metadata, object, reload = false)
95
- if !reload && (value = ivar(name)) != false
96
- value
97
- else
98
- _building do
99
- _loading do
100
- if object && needs_no_database_query?(object, metadata)
101
- __build__(name, object, metadata)
102
- else
103
- __build__(name, attributes[metadata.key], metadata)
104
- end
105
- end
106
- end
107
- end
108
- end
109
-
110
- def needs_no_database_query?(object, metadata)
111
- object.is_a?(Document) && !object.embedded? &&
112
- object._id == attributes[metadata.key]
113
- end
114
-
115
- # Is the current code executing without autobuild functionality?
116
- #
117
- # @example Is autobuild disabled?
118
- # document.without_autobuild?
119
- #
120
- # @return [ true, false ] If autobuild is disabled.
121
- #
122
- # @since 3.0.0
123
- def without_autobuild?
124
- Threaded.executing?(:without_autobuild)
125
- end
126
-
127
- # Yield to the block with autobuild functionality turned off.
128
- #
129
- # @example Execute without autobuild.
130
- # document.without_autobuild do
131
- # document.name
132
- # end
133
- #
134
- # @return [ Object ] The result of the yield.
135
- #
136
- # @since 3.0.0
137
- def without_autobuild
138
- Threaded.begin_execution("without_autobuild")
139
- yield
140
- ensure
141
- Threaded.exit_execution("without_autobuild")
142
- end
143
-
144
- module ClassMethods
145
-
146
- # Adds the existence check for relations.
147
- #
148
- # @example Add the existence check.
149
- # Person.existence_check(:name, meta)
150
- #
151
- # @example Check if a relation exists.
152
- # person = Person.new
153
- # person.has_game?
154
- # person.game?
155
- #
156
- # @param [ String, Symbol ] name The name of the relation.
157
- #
158
- # @return [ Class ] The model being set up.
159
- #
160
- # @since 3.0.0
161
- def existence_check(name)
162
- module_eval <<-END, __FILE__, __LINE__ + 1
163
- def #{name}?
164
- without_autobuild { !__send__(:#{name}).blank? }
165
- end
166
- alias :has_#{name}? :#{name}?
167
- END
168
- self
169
- end
170
-
171
- # Defines the getter for the relation. Nothing too special here: just
172
- # return the instance variable for the relation if it exists or build
173
- # the thing.
174
- #
175
- # @example Set up the getter for the relation.
176
- # Person.getter("addresses", metadata)
177
- #
178
- # @param [ String, Symbol ] name The name of the relation.
179
- # @param [ Metadata ] metadata The metadata for the relation.
180
- #
181
- # @return [ Class ] The class being set up.
182
- #
183
- # @since 2.0.0.rc.1
184
- def getter(name, metadata)
185
- re_define_method(name) do |reload = false|
186
- value = get_relation(name, metadata, nil, reload)
187
- if value.nil? && metadata.autobuilding? && !without_autobuild?
188
- value = send("build_#{name}")
189
- end
190
- value
191
- end
192
- self
193
- end
194
-
195
- # Defines the getter for the ids of documents in the relation. Should
196
- # be specify only for referenced many relations.
197
- #
198
- # @example Set up the ids getter for the relation.
199
- # Person.ids_getter("addresses", metadata)
200
- #
201
- # @param [ String, Symbol ] name The name of the relation.
202
- #
203
- # @return [ Class ] The class being set up.
204
- def ids_getter(name, metadata)
205
- ids_method = "#{name.to_s.singularize}_ids"
206
- re_define_method(ids_method) do
207
- send(name).only(:id).map(&:id)
208
- end
209
- self
210
- end
211
-
212
- # Defines the setter for the relation. This does a few things based on
213
- # some conditions. If there is an existing association, a target
214
- # substitution will take place, otherwise a new relation will be
215
- # created with the supplied target.
216
- #
217
- # @example Set up the setter for the relation.
218
- # Person.setter("addresses", metadata)
219
- #
220
- # @param [ String, Symbol ] name The name of the relation.
221
- # @param [ Metadata ] metadata The metadata for the relation.
222
- #
223
- # @return [ Class ] The class being set up.
224
- #
225
- # @since 2.0.0.rc.1
226
- def setter(name, metadata)
227
- re_define_method("#{name}=") do |object|
228
- without_autobuild do
229
- if value = get_relation(name, metadata, object)
230
- if value.respond_to?(:substitute)
231
- set_relation(name, value.substitute(object.substitutable))
232
- else
233
- value = __build__(name, value, metadata)
234
- set_relation(name, value.substitute(object.substitutable))
235
- end
236
- else
237
- __build__(name, object.substitutable, metadata)
238
- end
239
- end
240
- end
241
- self
242
- end
243
-
244
- # Defines the setter method that allows you to set documents
245
- # in this relation by their ids. The defined setter, finds
246
- # documents with given ids and invokes regular relation setter
247
- # with found documents. Ids setters should be defined only for
248
- # referenced many relations.
249
- #
250
- # @example Set up the id_setter for the relation.
251
- # Person.ids_setter("addesses", metadata)
252
- #
253
- # @param [ String, Symbol ] name The name of the relation.
254
- # @param [ Metadata ] metadata The metadata for the relation.
255
- #
256
- # @return [ Class ] The class being set up.
257
- def ids_setter(name, metadata)
258
- ids_method = "#{name.to_s.singularize}_ids="
259
- re_define_method(ids_method) do |ids|
260
- send(metadata.setter, metadata.klass.find(ids.reject(&:blank?)))
261
- end
262
- self
263
- end
264
- end
265
- end
266
- end
267
- end
@@ -1,94 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
-
5
- # This module contains the behaviour for auto-saving relations in
6
- # different collections.
7
- module AutoSave
8
- extend ActiveSupport::Concern
9
-
10
- # Used to prevent infinite loops in associated autosaves.
11
- #
12
- # @example Is the document autosaved?
13
- # document.autosaved?
14
- #
15
- # @return [ true, false ] Has the document already been autosaved?
16
- #
17
- # @since 3.0.0
18
- def autosaved?
19
- Threaded.autosaved?(self)
20
- end
21
-
22
- # Begin the associated autosave.
23
- #
24
- # @example Begin autosave.
25
- # document.__autosaving__
26
- #
27
- # @since 3.1.3
28
- def __autosaving__
29
- Threaded.begin_autosave(self)
30
- yield
31
- ensure
32
- Threaded.exit_autosave(self)
33
- end
34
-
35
- # Check if there is changes for auto-saving
36
- #
37
- # @example Return true if there is changes on self or in
38
- # autosaved relations.
39
- # document.changed_for_autosave?
40
- #
41
- # @since 3.1.3
42
- def changed_for_autosave?(doc)
43
- doc.new_record? || doc.changed? || doc.marked_for_destruction?
44
- end
45
-
46
- module ClassMethods
47
-
48
- # Set up the autosave behaviour for references many and references one
49
- # relations. When the option is set to true, these relations will get
50
- # saved automatically when the parent saved, if they are dirty.
51
- #
52
- # @example Set up autosave options.
53
- # Person.autosave(metadata)
54
- #
55
- # @param [ Metadata ] metadata The relation metadata.
56
- #
57
- # @since 2.0.0.rc.1
58
- def autosave(metadata)
59
- if metadata.autosave? && !metadata.embedded?
60
- save_method = :"autosave_documents_for_#{metadata.name}"
61
- define_method(save_method) do
62
- if before_callback_halted?
63
- self.before_callback_halted = false
64
- else
65
- __autosaving__ do
66
- if relation = ivar(metadata.name)
67
- if :belongs_to == metadata.macro
68
- if changed_for_autosave?(relation)
69
- relation.with(persistence_context) do |_relation|
70
- _relation.save
71
- end
72
- end
73
- else
74
- Array(relation).each do |doc|
75
- if changed_for_autosave?(doc)
76
- doc.with(persistence_context) do |d|
77
- d.save
78
- end
79
- end
80
- end
81
- end
82
- end
83
- end
84
- end
85
- end
86
-
87
- after_save save_method, unless: :autosaved?
88
- end
89
- end
90
-
91
- end
92
- end
93
- end
94
- end
@@ -1,59 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
- module Bindings
5
- module Embedded
6
-
7
- # Binding class for embedded_in relations.
8
- class In < Binding
9
-
10
- # Binds the base object to the inverse of the relation. This is so we
11
- # are referenced to the actual objects themselves on both sides.
12
- #
13
- # This case sets the metadata on the inverse object as well as the
14
- # document itself.
15
- #
16
- # @example Bind the documents.
17
- # name.person.bind(:continue => true)
18
- # name.person = Person.new
19
- #
20
- # @option options [ true, false ] :continue Continue binding the inverse.
21
- # @option options [ true, false ] :binding Are we in build mode?
22
- #
23
- # @since 2.0.0.rc.1
24
- def bind_one
25
- base.__metadata = metadata.inverse_metadata(target) unless base.__metadata
26
- base.parentize(target)
27
- binding do
28
- if base.embedded_many?
29
- target.do_or_do_not(metadata.inverse(target)).push(base)
30
- else
31
- target.do_or_do_not(metadata.inverse_setter(target), base)
32
- end
33
- end
34
- end
35
-
36
- # Unbinds the base object and the inverse, caused by setting the
37
- # reference to nil.
38
- #
39
- # @example Unbind the document.
40
- # name.person.unbind(:continue => true)
41
- # name.person = nil
42
- #
43
- # @option options [ true, false ] :continue Do we continue unbinding?
44
- #
45
- # @since 2.0.0.rc.1
46
- def unbind_one
47
- binding do
48
- if base.embedded_many?
49
- target.do_or_do_not(metadata.inverse(target)).delete(base)
50
- else
51
- target.do_or_do_not(metadata.inverse_setter(target), nil)
52
- end
53
- end
54
- end
55
- end
56
- end
57
- end
58
- end
59
- end
@@ -1,65 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
- module Bindings
5
- module Referenced
6
-
7
- # Binding class for all referenced_in relations.
8
- class In < Binding
9
-
10
- # Binds the base object to the inverse of the relation. This is so we
11
- # are referenced to the actual objects themselves on both sides.
12
- #
13
- # This case sets the metadata on the inverse object as well as the
14
- # document itself.
15
- #
16
- # @example Bind the documents.
17
- # game.person.bind(:continue => true)
18
- # game.person = Person.new
19
- #
20
- # @since 2.0.0.rc.1
21
- def bind_one
22
- binding do
23
- check_inverses!(target)
24
- bind_foreign_key(base, record_id(target))
25
- bind_polymorphic_inverse_type(base, target.class.name)
26
- if inverse = metadata.inverse(target)
27
- if set_base_metadata
28
- if base.referenced_many?
29
- target.__send__(inverse).push(base)
30
- else
31
- target.set_relation(inverse, base)
32
- end
33
- end
34
- end
35
- end
36
- end
37
-
38
- # Unbinds the base object and the inverse, caused by setting the
39
- # reference to nil.
40
- #
41
- # @example Unbind the document.
42
- # game.person.unbind(:continue => true)
43
- # game.person = nil
44
- #
45
- # @since 2.0.0.rc.1
46
- def unbind_one
47
- binding do
48
- inverse = metadata.inverse(target)
49
- bind_foreign_key(base, nil)
50
- bind_polymorphic_inverse_type(base, nil)
51
- if inverse
52
- set_base_metadata
53
- if base.referenced_many?
54
- target.__send__(inverse).delete(base)
55
- else
56
- target.set_relation(inverse, nil)
57
- end
58
- end
59
- end
60
- end
61
- end
62
- end
63
- end
64
- end
65
- end
@@ -1,70 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
- module Bindings
5
- module Referenced
6
-
7
- # Binding class for all references_and_referenced_in_many relations.
8
- class ManyToMany < Binding
9
-
10
- # Binds a single document with the inverse relation. Used
11
- # specifically when appending to the proxy.
12
- #
13
- # @example Bind one document.
14
- # person.preferences.bind_one(preference)
15
- #
16
- # @param [ Document ] doc The single document to bind.
17
- #
18
- # @since 2.0.0.rc.1
19
- def bind_one(doc)
20
- binding do
21
- inverse_keys = doc.you_must(metadata.inverse_foreign_key)
22
- if inverse_keys
23
- record_id = inverse_record_id(doc)
24
- unless inverse_keys.include?(record_id)
25
- doc.you_must(metadata.inverse_foreign_key_setter, inverse_keys.push(record_id))
26
- end
27
- doc.reset_relation_criteria(metadata.inverse)
28
- end
29
- base._synced[metadata.foreign_key] = true
30
- doc._synced[metadata.inverse_foreign_key] = true
31
- end
32
- end
33
-
34
- # Unbind a single document.
35
- #
36
- # @example Unbind the document.
37
- # person.preferences.unbind_one(document)
38
- #
39
- # @since 2.0.0.rc.1
40
- def unbind_one(doc)
41
- binding do
42
- base.send(metadata.foreign_key).delete_one(record_id(doc))
43
- inverse_keys = doc.you_must(metadata.inverse_foreign_key)
44
- if inverse_keys
45
- inverse_keys.delete_one(inverse_record_id(doc))
46
- doc.reset_relation_criteria(metadata.inverse)
47
- end
48
- base._synced[metadata.foreign_key] = true
49
- doc._synced[metadata.inverse_foreign_key] = true
50
- end
51
- end
52
-
53
- # Find the inverse id referenced by inverse_keys
54
- def inverse_record_id(doc)
55
- inverse_metadata = determine_inverse_metadata(doc)
56
- if inverse_metadata
57
- base.__send__(inverse_metadata.primary_key)
58
- else
59
- base._id
60
- end
61
- end
62
-
63
- def determine_inverse_metadata(doc)
64
- doc.relations[base.class.name.demodulize.underscore.pluralize]
65
- end
66
- end
67
- end
68
- end
69
- end
70
- end
@@ -1,9 +0,0 @@
1
- # encoding: utf-8
2
- require "mongoid/relations/binding"
3
- require "mongoid/relations/bindings/embedded/in"
4
- require "mongoid/relations/bindings/embedded/many"
5
- require "mongoid/relations/bindings/embedded/one"
6
- require "mongoid/relations/bindings/referenced/in"
7
- require "mongoid/relations/bindings/referenced/many"
8
- require "mongoid/relations/bindings/referenced/many_to_many"
9
- require "mongoid/relations/bindings/referenced/one"