mongoid 6.1.0 → 7.0.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (461) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/LICENSE +1 -0
  5. data/README.md +4 -3
  6. data/Rakefile +57 -5
  7. data/lib/config/locales/en.yml +38 -0
  8. data/lib/mongoid.rb +3 -2
  9. data/lib/mongoid/{relations.rb → association.rb} +57 -56
  10. data/lib/mongoid/association/accessors.rb +339 -0
  11. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  12. data/lib/mongoid/association/builders.rb +92 -0
  13. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  14. data/lib/mongoid/association/depending.rb +137 -0
  15. data/lib/mongoid/association/eager_loadable.rb +36 -0
  16. data/lib/mongoid/association/embedded.rb +4 -0
  17. data/lib/mongoid/{relations → association}/embedded/batchable.rb +55 -29
  18. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  19. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  20. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  21. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  22. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  23. data/lib/mongoid/association/embedded/embeds_many.rb +211 -0
  24. data/lib/mongoid/association/embedded/embeds_many/binding.rb +45 -0
  25. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  26. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +552 -0
  27. data/lib/mongoid/association/embedded/embeds_one.rb +174 -0
  28. data/lib/mongoid/association/embedded/embeds_one/binding.rb +47 -0
  29. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +14 -8
  30. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  31. data/lib/mongoid/association/macros.rb +204 -0
  32. data/lib/mongoid/{relations → association}/many.rb +22 -48
  33. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  34. data/lib/mongoid/association/nested.rb +15 -0
  35. data/lib/mongoid/association/nested/many.rb +200 -0
  36. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  37. data/lib/mongoid/association/nested/one.rb +127 -0
  38. data/lib/mongoid/{relations → association}/one.rb +6 -6
  39. data/lib/mongoid/association/options.rb +152 -0
  40. data/lib/mongoid/{relations → association}/proxy.rb +47 -60
  41. data/lib/mongoid/association/referenced.rb +7 -0
  42. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  43. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  44. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  45. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  46. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  47. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  48. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  49. data/lib/mongoid/association/referenced/eager.rb +162 -0
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  52. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  53. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  54. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +312 -0
  55. data/lib/mongoid/association/referenced/has_many.rb +275 -0
  56. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -9
  57. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  58. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  59. data/lib/mongoid/association/referenced/has_many/enumerable.rb +510 -0
  60. data/lib/mongoid/association/referenced/has_many/proxy.rb +578 -0
  61. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  62. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  63. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  64. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  65. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  66. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  67. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  68. data/lib/mongoid/association/reflections.rb +68 -0
  69. data/lib/mongoid/association/relatable.rb +511 -0
  70. data/lib/mongoid/atomic.rb +19 -9
  71. data/lib/mongoid/atomic/modifiers.rb +12 -8
  72. data/lib/mongoid/atomic/paths/embedded.rb +1 -1
  73. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  74. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  75. data/lib/mongoid/attributes.rb +55 -32
  76. data/lib/mongoid/attributes/dynamic.rb +19 -17
  77. data/lib/mongoid/attributes/nested.rb +23 -12
  78. data/lib/mongoid/attributes/processing.rb +2 -6
  79. data/lib/mongoid/attributes/readonly.rb +2 -4
  80. data/lib/mongoid/changeable.rb +2 -2
  81. data/lib/mongoid/clients.rb +2 -0
  82. data/lib/mongoid/clients/options.rb +6 -4
  83. data/lib/mongoid/clients/sessions.rb +129 -0
  84. data/lib/mongoid/clients/storage_options.rb +1 -0
  85. data/lib/mongoid/composable.rb +5 -2
  86. data/lib/mongoid/config.rb +1 -0
  87. data/lib/mongoid/config/environment.rb +21 -8
  88. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  89. data/lib/mongoid/contextual/atomic.rb +7 -4
  90. data/lib/mongoid/contextual/geo_near.rb +4 -3
  91. data/lib/mongoid/contextual/map_reduce.rb +11 -3
  92. data/lib/mongoid/contextual/memory.rb +31 -8
  93. data/lib/mongoid/contextual/mongo.rb +40 -21
  94. data/lib/mongoid/contextual/none.rb +14 -2
  95. data/lib/mongoid/copyable.rb +12 -11
  96. data/lib/mongoid/criteria.rb +11 -4
  97. data/lib/mongoid/criteria/findable.rb +3 -2
  98. data/lib/mongoid/criteria/includable.rb +14 -14
  99. data/lib/mongoid/criteria/modifiable.rb +19 -4
  100. data/lib/mongoid/criteria/options.rb +2 -2
  101. data/lib/mongoid/criteria/queryable/aggregable.rb +1 -1
  102. data/lib/mongoid/criteria/queryable/extensions/array.rb +1 -1
  103. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
  104. data/lib/mongoid/criteria/queryable/extensions/hash.rb +4 -4
  105. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  106. data/lib/mongoid/criteria/queryable/extensions/object.rb +4 -4
  107. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +36 -2
  108. data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
  109. data/lib/mongoid/criteria/queryable/extensions/time.rb +1 -1
  110. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +12 -0
  111. data/lib/mongoid/criteria/queryable/key.rb +67 -8
  112. data/lib/mongoid/criteria/queryable/mergeable.rb +8 -5
  113. data/lib/mongoid/criteria/queryable/options.rb +16 -0
  114. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  115. data/lib/mongoid/criteria/queryable/selectable.rb +39 -10
  116. data/lib/mongoid/criteria/queryable/selector.rb +10 -32
  117. data/lib/mongoid/document.rb +19 -9
  118. data/lib/mongoid/errors.rb +4 -0
  119. data/lib/mongoid/errors/delete_restriction.rb +2 -2
  120. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  121. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  122. data/lib/mongoid/errors/invalid_session_use.rb +24 -0
  123. data/lib/mongoid/errors/inverse_not_found.rb +1 -1
  124. data/lib/mongoid/errors/unknown_model.rb +25 -0
  125. data/lib/mongoid/extensions.rb +0 -4
  126. data/lib/mongoid/extensions/array.rb +5 -5
  127. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  128. data/lib/mongoid/extensions/hash.rb +12 -6
  129. data/lib/mongoid/extensions/object.rb +6 -6
  130. data/lib/mongoid/extensions/range.rb +1 -0
  131. data/lib/mongoid/extensions/regexp.rb +2 -1
  132. data/lib/mongoid/extensions/string.rb +5 -3
  133. data/lib/mongoid/extensions/time.rb +1 -1
  134. data/lib/mongoid/factory.rb +15 -5
  135. data/lib/mongoid/fields.rb +5 -4
  136. data/lib/mongoid/fields/foreign_key.rb +7 -7
  137. data/lib/mongoid/fields/standard.rb +2 -14
  138. data/lib/mongoid/fields/validators/macro.rb +1 -1
  139. data/lib/mongoid/findable.rb +1 -1
  140. data/lib/mongoid/indexable.rb +11 -7
  141. data/lib/mongoid/indexable/specification.rb +1 -1
  142. data/lib/mongoid/interceptable.rb +17 -17
  143. data/lib/mongoid/loggable.rb +1 -1
  144. data/lib/mongoid/matchable.rb +30 -19
  145. data/lib/mongoid/matchable/all.rb +5 -4
  146. data/lib/mongoid/matchable/and.rb +4 -4
  147. data/lib/mongoid/matchable/default.rb +72 -25
  148. data/lib/mongoid/matchable/elem_match.rb +11 -5
  149. data/lib/mongoid/matchable/eq.rb +22 -0
  150. data/lib/mongoid/matchable/exists.rb +2 -2
  151. data/lib/mongoid/matchable/gt.rb +2 -2
  152. data/lib/mongoid/matchable/gte.rb +2 -2
  153. data/lib/mongoid/matchable/in.rb +2 -2
  154. data/lib/mongoid/matchable/lt.rb +2 -2
  155. data/lib/mongoid/matchable/lte.rb +2 -2
  156. data/lib/mongoid/matchable/ne.rb +3 -3
  157. data/lib/mongoid/matchable/nin.rb +2 -2
  158. data/lib/mongoid/matchable/nor.rb +37 -0
  159. data/lib/mongoid/matchable/or.rb +3 -3
  160. data/lib/mongoid/matchable/regexp.rb +27 -0
  161. data/lib/mongoid/matchable/size.rb +2 -2
  162. data/lib/mongoid/persistable.rb +5 -9
  163. data/lib/mongoid/persistable/creatable.rb +5 -5
  164. data/lib/mongoid/persistable/deletable.rb +12 -9
  165. data/lib/mongoid/persistable/destroyable.rb +1 -5
  166. data/lib/mongoid/persistable/incrementable.rb +1 -1
  167. data/lib/mongoid/persistable/logical.rb +1 -1
  168. data/lib/mongoid/persistable/pushable.rb +11 -2
  169. data/lib/mongoid/persistable/settable.rb +58 -13
  170. data/lib/mongoid/persistable/updatable.rb +2 -2
  171. data/lib/mongoid/persistable/upsertable.rb +2 -1
  172. data/lib/mongoid/persistence_context.rb +37 -18
  173. data/lib/mongoid/positional.rb +1 -1
  174. data/lib/mongoid/query_cache.rb +69 -20
  175. data/lib/mongoid/railtie.rb +17 -1
  176. data/lib/mongoid/railties/controller_runtime.rb +86 -0
  177. data/lib/mongoid/reloadable.rb +1 -1
  178. data/lib/mongoid/scopable.rb +5 -5
  179. data/lib/mongoid/serializable.rb +8 -7
  180. data/lib/mongoid/shardable.rb +1 -1
  181. data/lib/mongoid/stateful.rb +1 -0
  182. data/lib/mongoid/tasks/database.rb +5 -3
  183. data/lib/mongoid/threaded.rb +78 -4
  184. data/lib/mongoid/touchable.rb +102 -0
  185. data/lib/mongoid/traversable.rb +3 -3
  186. data/lib/mongoid/validatable.rb +9 -9
  187. data/lib/mongoid/validatable/macros.rb +5 -3
  188. data/lib/mongoid/validatable/presence.rb +2 -2
  189. data/lib/mongoid/validatable/uniqueness.rb +5 -5
  190. data/lib/mongoid/version.rb +2 -1
  191. data/lib/rails/generators/mongoid/config/config_generator.rb +8 -1
  192. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +19 -2
  193. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  194. data/spec/README.md +18 -0
  195. data/spec/app/models/agent.rb +2 -0
  196. data/spec/app/models/animal.rb +2 -1
  197. data/spec/app/models/array_field.rb +7 -0
  198. data/spec/app/models/band.rb +3 -0
  199. data/spec/app/models/bomb.rb +1 -1
  200. data/spec/app/models/book.rb +2 -1
  201. data/spec/app/models/customer.rb +11 -0
  202. data/spec/app/models/customer_address.rb +12 -0
  203. data/spec/app/models/delegating_patient.rb +16 -0
  204. data/spec/app/models/message.rb +1 -1
  205. data/spec/app/models/minim.rb +7 -0
  206. data/spec/app/models/other_owner_object.rb +2 -0
  207. data/spec/app/models/page.rb +1 -1
  208. data/spec/app/models/person.rb +5 -2
  209. data/spec/app/models/shipment_address.rb +1 -0
  210. data/spec/app/models/store_as_dup_test3.rb +7 -0
  211. data/spec/app/models/store_as_dup_test4.rb +7 -0
  212. data/spec/app/models/updatable.rb +7 -0
  213. data/spec/app/models/vertex.rb +6 -0
  214. data/spec/app/models/wiki_page.rb +1 -1
  215. data/spec/config/mongoid.yml +13 -3
  216. data/spec/integration/app_spec.rb +341 -0
  217. data/spec/integration/associations/belongs_to_spec.rb +13 -0
  218. data/spec/integration/associations/embedded_spec.rb +176 -0
  219. data/spec/integration/callbacks_models.rb +49 -0
  220. data/spec/integration/callbacks_spec.rb +216 -0
  221. data/spec/integration/criteria/date_field_spec.rb +41 -0
  222. data/spec/integration/criteria/time_with_zone_spec.rb +32 -0
  223. data/spec/integration/document_spec.rb +22 -0
  224. data/spec/integration/matchable_spec.rb +680 -0
  225. data/spec/lite_spec_helper.rb +71 -0
  226. data/spec/mongoid/{relations → association}/accessors_spec.rb +40 -1
  227. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  228. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  229. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  230. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  231. data/spec/mongoid/association/depending_spec.rb +866 -0
  232. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  233. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  234. data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
  235. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  236. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  237. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +55 -77
  238. data/spec/mongoid/association/embedded/embedded_in_spec.rb +901 -0
  239. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  240. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  241. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +394 -204
  242. data/spec/mongoid/association/embedded/embeds_many_models.rb +53 -0
  243. data/spec/mongoid/association/embedded/embeds_many_spec.rb +862 -0
  244. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  245. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  246. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  247. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +6 -0
  248. data/spec/mongoid/association/embedded/embeds_one_models.rb +51 -0
  249. data/spec/mongoid/association/embedded/embeds_one_spec.rb +954 -0
  250. data/spec/mongoid/{relations → association}/macros_spec.rb +168 -73
  251. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  252. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  253. data/spec/mongoid/association/options_spec.rb +1321 -0
  254. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +66 -34
  255. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  256. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  257. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +33 -14
  258. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  259. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2023 -0
  260. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +9 -9
  261. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  262. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +26 -7
  263. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +56 -0
  264. data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +247 -99
  265. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +26 -0
  266. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
  267. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  268. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  269. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +26 -11
  270. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +335 -1
  271. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  272. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +52 -94
  273. data/spec/mongoid/association/referenced/has_many_models.rb +37 -0
  274. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  275. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  276. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  277. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  278. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  279. data/spec/mongoid/association/referenced/has_one_models.rb +48 -0
  280. data/spec/mongoid/association/referenced/has_one_spec.rb +1360 -0
  281. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  282. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +51 -3
  283. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  284. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  285. data/spec/mongoid/atomic/paths_spec.rb +41 -0
  286. data/spec/mongoid/atomic_spec.rb +17 -17
  287. data/spec/mongoid/attributes/dynamic_spec.rb +153 -0
  288. data/spec/mongoid/attributes/nested_spec.rb +32 -10
  289. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  290. data/spec/mongoid/attributes_spec.rb +298 -9
  291. data/spec/mongoid/clients/factory_spec.rb +27 -21
  292. data/spec/mongoid/clients/options_spec.rb +89 -60
  293. data/spec/mongoid/clients/sessions_spec.rb +338 -0
  294. data/spec/mongoid/clients/transactions_spec.rb +390 -0
  295. data/spec/mongoid/clients_spec.rb +70 -10
  296. data/spec/mongoid/config_spec.rb +27 -1
  297. data/spec/mongoid/contextual/atomic_spec.rb +37 -14
  298. data/spec/mongoid/contextual/geo_near_spec.rb +12 -2
  299. data/spec/mongoid/contextual/map_reduce_spec.rb +20 -5
  300. data/spec/mongoid/contextual/memory_spec.rb +19 -0
  301. data/spec/mongoid/contextual/mongo_spec.rb +214 -55
  302. data/spec/mongoid/contextual/none_spec.rb +15 -0
  303. data/spec/mongoid/copyable_spec.rb +90 -6
  304. data/spec/mongoid/copyable_spec_models.rb +17 -0
  305. data/spec/mongoid/criteria/modifiable_spec.rb +232 -11
  306. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
  307. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +54 -0
  308. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +89 -0
  309. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -7
  310. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +44 -1
  311. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +19 -7
  312. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +28 -1
  313. data/spec/mongoid/criteria/queryable/key_spec.rb +48 -6
  314. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  315. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +762 -0
  316. data/spec/mongoid/criteria/queryable/selectable_spec.rb +93 -229
  317. data/spec/mongoid/criteria/queryable/selector_spec.rb +39 -2
  318. data/spec/mongoid/criteria/scopable_spec.rb +81 -0
  319. data/spec/mongoid/criteria_spec.rb +46 -22
  320. data/spec/mongoid/document_fields_spec.rb +88 -0
  321. data/spec/mongoid/document_persistence_context_spec.rb +33 -0
  322. data/spec/mongoid/document_spec.rb +90 -4
  323. data/spec/mongoid/extensions/array_spec.rb +11 -15
  324. data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
  325. data/spec/mongoid/extensions/hash_spec.rb +18 -1
  326. data/spec/mongoid/extensions/object_spec.rb +7 -11
  327. data/spec/mongoid/extensions/range_spec.rb +7 -0
  328. data/spec/mongoid/extensions/regexp_spec.rb +23 -0
  329. data/spec/mongoid/extensions/string_spec.rb +35 -7
  330. data/spec/mongoid/factory_spec.rb +31 -2
  331. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  332. data/spec/mongoid/fields_spec.rb +2 -2
  333. data/spec/mongoid/findable_spec.rb +1 -1
  334. data/spec/mongoid/indexable_spec.rb +24 -12
  335. data/spec/mongoid/interceptable_spec.rb +58 -10
  336. data/spec/mongoid/matchable/all_spec.rb +4 -4
  337. data/spec/mongoid/matchable/and_spec.rb +10 -10
  338. data/spec/mongoid/matchable/default_spec.rb +21 -14
  339. data/spec/mongoid/matchable/elem_match_spec.rb +31 -11
  340. data/spec/mongoid/matchable/eq_spec.rb +48 -0
  341. data/spec/mongoid/matchable/exists_spec.rb +5 -5
  342. data/spec/mongoid/matchable/gt_spec.rb +8 -8
  343. data/spec/mongoid/matchable/gte_spec.rb +8 -8
  344. data/spec/mongoid/matchable/in_spec.rb +5 -5
  345. data/spec/mongoid/matchable/lt_spec.rb +8 -8
  346. data/spec/mongoid/matchable/lte_spec.rb +8 -8
  347. data/spec/mongoid/matchable/ne_spec.rb +5 -5
  348. data/spec/mongoid/matchable/nin_spec.rb +5 -5
  349. data/spec/mongoid/matchable/nor_spec.rb +209 -0
  350. data/spec/mongoid/matchable/or_spec.rb +7 -7
  351. data/spec/mongoid/matchable/regexp_spec.rb +59 -0
  352. data/spec/mongoid/matchable/size_spec.rb +3 -3
  353. data/spec/mongoid/matchable_spec.rb +133 -58
  354. data/spec/mongoid/persistable/deletable_spec.rb +34 -0
  355. data/spec/mongoid/persistable/destroyable_spec.rb +19 -0
  356. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  357. data/spec/mongoid/persistable/pushable_spec.rb +55 -1
  358. data/spec/mongoid/persistable/savable_spec.rb +6 -6
  359. data/spec/mongoid/persistable/settable_spec.rb +174 -9
  360. data/spec/mongoid/persistable/updatable_spec.rb +2 -2
  361. data/spec/mongoid/persistable_spec.rb +31 -16
  362. data/spec/mongoid/persistence_context_spec.rb +37 -2
  363. data/spec/mongoid/positional_spec.rb +10 -10
  364. data/spec/mongoid/query_cache_spec.rb +137 -30
  365. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  366. data/spec/mongoid/scopable_spec.rb +15 -1
  367. data/spec/mongoid/shardable_spec.rb +32 -12
  368. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  369. data/spec/mongoid/tasks/database_spec.rb +1 -1
  370. data/spec/mongoid/threaded_spec.rb +68 -0
  371. data/spec/mongoid/{relations/touchable_spec.rb → touchable_spec.rb} +80 -1
  372. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  373. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  374. data/spec/mongoid/validatable/uniqueness_spec.rb +35 -6
  375. data/spec/mongoid/validatable_spec.rb +1 -1
  376. data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
  377. data/spec/shared/LICENSE +20 -0
  378. data/spec/shared/bin/get-mongodb-download-url +17 -0
  379. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  380. data/spec/shared/lib/mrss/cluster_config.rb +221 -0
  381. data/spec/shared/lib/mrss/constraints.rb +354 -0
  382. data/spec/shared/lib/mrss/docker_runner.rb +265 -0
  383. data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
  384. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  385. data/spec/shared/lib/mrss/spec_organizer.rb +162 -0
  386. data/spec/shared/lib/mrss/utils.rb +15 -0
  387. data/spec/shared/share/Dockerfile.erb +231 -0
  388. data/spec/shared/shlib/distro.sh +73 -0
  389. data/spec/shared/shlib/server.sh +290 -0
  390. data/spec/shared/shlib/set_env.sh +128 -0
  391. data/spec/spec_helper.rb +110 -41
  392. data/spec/support/cluster_config.rb +158 -0
  393. data/spec/support/constraints.rb +46 -0
  394. data/spec/support/expectations.rb +17 -3
  395. data/spec/support/macros.rb +20 -0
  396. data/spec/support/session_registry.rb +50 -0
  397. data/spec/support/spec_config.rb +55 -0
  398. metadata +728 -591
  399. metadata.gz.sig +1 -1
  400. data/lib/mongoid/railties/document.rb +0 -12
  401. data/lib/mongoid/relations/accessors.rb +0 -268
  402. data/lib/mongoid/relations/auto_save.rb +0 -94
  403. data/lib/mongoid/relations/bindings.rb +0 -9
  404. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -63
  405. data/lib/mongoid/relations/bindings/embedded/many.rb +0 -50
  406. data/lib/mongoid/relations/bindings/embedded/one.rb +0 -55
  407. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  408. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  409. data/lib/mongoid/relations/builder.rb +0 -57
  410. data/lib/mongoid/relations/builders.rb +0 -106
  411. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  412. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  413. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  414. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  415. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  416. data/lib/mongoid/relations/cascading.rb +0 -56
  417. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  418. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  419. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  420. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  421. data/lib/mongoid/relations/conversions.rb +0 -34
  422. data/lib/mongoid/relations/counter_cache.rb +0 -160
  423. data/lib/mongoid/relations/cyclic.rb +0 -107
  424. data/lib/mongoid/relations/eager.rb +0 -41
  425. data/lib/mongoid/relations/eager/base.rb +0 -153
  426. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  427. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  428. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  429. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  430. data/lib/mongoid/relations/embedded/in.rb +0 -243
  431. data/lib/mongoid/relations/embedded/many.rb +0 -657
  432. data/lib/mongoid/relations/embedded/one.rb +0 -237
  433. data/lib/mongoid/relations/macros.rb +0 -366
  434. data/lib/mongoid/relations/metadata.rb +0 -1179
  435. data/lib/mongoid/relations/nested_builder.rb +0 -74
  436. data/lib/mongoid/relations/options.rb +0 -49
  437. data/lib/mongoid/relations/polymorphic.rb +0 -39
  438. data/lib/mongoid/relations/referenced/in.rb +0 -307
  439. data/lib/mongoid/relations/referenced/many.rb +0 -816
  440. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  441. data/lib/mongoid/relations/referenced/one.rb +0 -292
  442. data/lib/mongoid/relations/reflections.rb +0 -64
  443. data/lib/mongoid/relations/synchronization.rb +0 -169
  444. data/lib/mongoid/relations/targets.rb +0 -2
  445. data/lib/mongoid/relations/targets/enumerable.rb +0 -473
  446. data/lib/mongoid/relations/touchable.rb +0 -97
  447. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  448. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  449. data/spec/mongoid/railties/document_spec.rb +0 -24
  450. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  451. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  452. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  453. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  454. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  455. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  456. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  457. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  458. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  459. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  460. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  461. data/spec/mongoid/relations/options_spec.rb +0 -35
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: c57e0133222699f9072fe67b609e7212327028ff
4
- data.tar.gz: f2f799925ab8ca3b9126b16fe5a8d52c03fb1146
2
+ SHA256:
3
+ metadata.gz: c687add0cd3bcd3001781fcb3011966fb5617848c1b1096c9ecf08a6a8d3e123
4
+ data.tar.gz: 242b9126fc96c4719aa23e96a25f9ff590c063020b8d8806315cbd887316fd24
5
5
  SHA512:
6
- metadata.gz: 8139bde85b47d8920a022f4f1a3c68796c446192128be7a7ceb59607c82be58404a956e89676e61ce61a6f39fd691b4b8f39bf2a31663ef64f482a5271986484
7
- data.tar.gz: d500146fa38cbdf1e5d915fa164ef465f4b0ba3ffc7568d77fc85bc9576b61dab8efdbffa42ff8fb2b72063997b8207c264ec52a2f11c04140f09c2a5532b778
6
+ metadata.gz: 13f8de150ffbc721206b56d8b532525bd66d380454d3ae53e202159da26d39db48a0c70f15ae0f10278adaa97ec3380c6565c2c97993f7953920b1ab89ea02a4
7
+ data.tar.gz: 2e5a35a8935add506b7a514ca392ce1f9f9e3d6440b0152a154d56bce2b9f5e12dabf7ce1ca9c99f6f424d7efcdeb1ddd3e05dad17849b91b7b76fd3b5cb543d
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/LICENSE CHANGED
@@ -1,4 +1,5 @@
1
1
  Copyright (c) 2009-2016 Durran Jordan
2
+ Copyright (c) 2015-2020 MongoDB, Inc.
2
3
 
3
4
  Permission is hereby granted, free of charge, to any person obtaining
4
5
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -14,14 +14,14 @@ Project Tracking
14
14
  ----------------
15
15
 
16
16
  * [Mongoid Website and Documentation](http://mongoid.org)
17
- * [Mongoid Google Group](http://groups.google.com/group/mongoid)
17
+ * [MongoDB Community Forum](https://developer.mongodb.com/community/forums/tags/c/drivers-odms-connectors/7/mongoid-odm)
18
18
  * [Stackoverflow](http://stackoverflow.com/questions/tagged/mongoid)
19
19
  * [#mongoid](http://webchat.freenode.net/?channels=mongoid) on freenode IRC
20
20
 
21
21
  Compatibility
22
22
  -------------
23
23
 
24
- Mongoid is tested against MRI 2.2, 2.3 and JRuby (9.1).
24
+ Mongoid is tested against MRI 2.2-2.5 and JRuby 9.1-9.2.
25
25
 
26
26
  Documentation
27
27
  -------------
@@ -31,7 +31,8 @@ Please see the [MongoDB website](http://docs.mongodb.org/ecosystem/tutorial/ruby
31
31
  License
32
32
  -------
33
33
 
34
- Copyright (c) 2009-2017 Durran Jordan
34
+ Copyright (c) 2009-2016 Durran Jordan
35
+ Copyright (c) 2015-2020 MongoDB, Inc.
35
36
 
36
37
  Permission is hereby granted, free of charge, to any person obtaining
37
38
  a copy of this software and associated documentation files (the
data/Rakefile CHANGED
@@ -1,12 +1,21 @@
1
1
  require "bundler"
2
+ require "bundler/gem_tasks"
2
3
  Bundler.setup
3
4
 
5
+ ROOT = File.expand_path(File.join(File.dirname(__FILE__)))
6
+
7
+ $: << File.join(ROOT, 'spec/shared/lib')
8
+
4
9
  require "rake"
5
10
  require "rspec/core/rake_task"
11
+ require 'mrss/spec_organizer'
6
12
 
7
13
  $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
8
14
  require "mongoid/version"
9
15
 
16
+ tasks = Rake.application.instance_variable_get('@tasks')
17
+ tasks['release:do'] = tasks.delete('release')
18
+
10
19
  task :gem => :build
11
20
  task :build do
12
21
  system "gem build mongoid.gemspec"
@@ -16,11 +25,8 @@ task :install => :build do
16
25
  system "sudo gem install mongoid-#{Mongoid::VERSION}.gem"
17
26
  end
18
27
 
19
- task :release => :build do
20
- system "git tag -a v#{Mongoid::VERSION} -m 'Tagging #{Mongoid::VERSION}'"
21
- system "git push --tags"
22
- system "gem push mongoid-#{Mongoid::VERSION}.gem"
23
- system "rm mongoid-#{Mongoid::VERSION}.gem"
28
+ task :release do
29
+ raise "Please use ./release.sh to release"
24
30
  end
25
31
 
26
32
  RSpec::Core::RakeTask.new("spec") do |spec|
@@ -32,4 +38,50 @@ RSpec::Core::RakeTask.new('spec:progress') do |spec|
32
38
  spec.pattern = "spec/**/*_spec.rb"
33
39
  end
34
40
 
41
+ CLASSIFIERS = [
42
+ [%r,^mongoid/attribute,, :attributes],
43
+ [%r,^mongoid/association/[or],, :associations_referenced],
44
+ [%r,^mongoid/association,, :associations],
45
+ [%r,^mongoid,, :unit],
46
+ [%r,^integration,, :integration],
47
+ [%r,^rails,, :rails],
48
+ ]
49
+
50
+ RUN_PRIORITY = %i(
51
+ unit attributes associations_referenced associations
52
+ integration rails
53
+ )
54
+
55
+ def spec_organizer
56
+ Mrss::SpecOrganizer.new(
57
+ root: ROOT,
58
+ classifiers: CLASSIFIERS,
59
+ priority_order: RUN_PRIORITY,
60
+ )
61
+ end
62
+
63
+ task :ci do
64
+ spec_organizer.run
65
+ end
66
+
35
67
  task :default => :spec
68
+
69
+ desc "Generate all documentation"
70
+ task :docs => 'docs:yard'
71
+
72
+ namespace :docs do
73
+ desc "Generate yard documention"
74
+ task :yard do
75
+ out = File.join('yard-docs', Mongoid::VERSION)
76
+ FileUtils.rm_rf(out)
77
+ system "yardoc -o #{out} --title mongoid-#{Mongoid::VERSION}"
78
+ end
79
+ end
80
+
81
+ namespace :release do
82
+ task :check_private_key do
83
+ unless File.exist?('gem-private_key.pem')
84
+ raise "No private key present, cannot release"
85
+ end
86
+ end
87
+ end
@@ -91,6 +91,11 @@ en:
91
91
  expecting the option to be there, please consult the following page
92
92
  with repect to Mongoid's configuration:\n\n
93
93
  \_\_http://mongoid.org/en/mongoid/docs/installation.html"
94
+ invalid_dependent_strategy:
95
+ message: "Invalid dependent strategy: %{invalid_strategy}."
96
+ summary: "An invalid dependent strategy was defined for the association:
97
+ %{association}. The valid strategies are: %{valid_strategies}."
98
+ resolution: "Change the dependent strategy to one of the valid types."
94
99
  invalid_field:
95
100
  message: "Defining a field named '%{name}' is not allowed."
96
101
  summary: "Defining this field would override the method '%{name}',
@@ -196,6 +201,11 @@ en:
196
201
  allowed, and don't use these names. These include names that also
197
202
  conflict with core Ruby methods on Object, Module, Enumerable, or
198
203
  included gems that inject methods into these or Mongoid internals."
204
+ invalid_relation_option:
205
+ message: "Invalid relation option :%{option} for relation '%{name}' on class
206
+ %{klass}."
207
+ summary: "An invalid option was provided for a relation."
208
+ resolution: "Valid options are: %{valid_options}, make sure you use only those."
199
209
  invalid_scope:
200
210
  message: "Defining a scope of value %{value} on %{klass} is not
201
211
  allowed."
@@ -206,6 +216,20 @@ en:
206
216
  \_\_\_\_include Mongoid::Document\n
207
217
  \_\_\_\_scope :inactive, ->{ where(active: false) }\n
208
218
  \_\_end\n\n"
219
+ invalid_session_use:
220
+ message: "A session was attempted to be used with a model whose client cannot use
221
+ that session."
222
+ summary: "Sessions are started via driver clients (Model#mongo_client) and, in most cases, driver
223
+ clients are shared across models. When different models have their own clients, a session cannot
224
+ be obtained via one model and used for operations on another model."
225
+ resolution: "Only execute operations on the model class or instances of the model through which
226
+ the session was created. Otherwise, ensure that all models on which operations are executed
227
+ in the session block share the same driver client. For example, a model may have a different
228
+ client specified in its 'store_in' options.\n\n"
229
+ invalid_session_nesting:
230
+ message: "A session was started while another session was being used."
231
+ summary: "Sessions cannot be nested. Only one session can be used in a thread at once."
232
+ resolution: "Only use one session at a time; sessions cannot be nested."
209
233
  invalid_storage_options:
210
234
  message: "Invalid options passed to %{klass}.store_in: %{options}."
211
235
  summary: "The :store_in macro takes only a hash of parameters with
@@ -452,6 +476,13 @@ en:
452
476
  with the already defined method %{model_name}, or set the
453
477
  configuration option Mongoid.scope_overwrite_exception to false,
454
478
  which is its default. In this case a warning will be logged."
479
+ sessions_not_supported:
480
+ message: "Sessions are not supported by the connected server(s)."
481
+ summary: "A session was attempted to be used with a MongoDB server version
482
+ that doesn't support sessions. Sessions are supported in MongoDB
483
+ server versions 3.6 and higher."
484
+ resolution: "Verify that all servers in your deployment are at least
485
+ version 3.6 or don't attempt to use sessions with older server versions."
455
486
  taken:
456
487
  "is already taken"
457
488
  too_many_nested_attribute_records:
@@ -473,6 +504,13 @@ en:
473
504
  attributes hash, and is raised instead of getting a NoMethodError."
474
505
  resolution: "You can include Mongoid::Attributes::Dynamic if you
475
506
  expect to be writing values for undefined fields often."
507
+ unknown_model:
508
+ message: "Attempted to instantiate an object of the unknown Model '%{klass}'."
509
+ summary: "A document with the value '%{value}' at the key '_type' was used to
510
+ instantiate a model object but Mongoid cannot find this Class."
511
+ resolution: "The _type field is a reserved one used by Mongoid to determine the
512
+ class for instantiating an object. Please don't save data in this field or ensure
513
+ that any values in this field correspond to valid Models."
476
514
  unsaved_document:
477
515
  message: "Attempted to save %{document} before the parent %{base}."
478
516
  summary: "You cannot call create or create! through the
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"
@@ -42,7 +43,7 @@ module Mongoid
42
43
  PLATFORM_DETAILS = "mongoid-#{VERSION}".freeze
43
44
 
44
45
  # The minimum MongoDB version supported.
45
- MONGODB_VERSION = "2.4.0"
46
+ MONGODB_VERSION = "2.6.0"
46
47
 
47
48
  # Sets the Mongoid configuration options. Best used by passing a block.
48
49
  #
@@ -101,5 +102,5 @@ module Mongoid
101
102
  # Mongoid.database = Mongo::Connection.new.db("test")
102
103
  #
103
104
  # @since 1.0.0
104
- delegate(*(Config.public_instance_methods(false) - [ :logger=, :logger ] << { to: Config }))
105
+ delegate(*(Config.public_instance_methods(false) - [ :logger=, :logger ]), to: Config)
105
106
  end
@@ -1,53 +1,54 @@
1
- # encoding: utf-8
2
- require "mongoid/relations/accessors"
3
- require "mongoid/relations/auto_save"
4
- require "mongoid/relations/cascading"
5
- require "mongoid/relations/constraint"
6
- require "mongoid/relations/conversions"
7
- require "mongoid/relations/counter_cache"
8
- require "mongoid/relations/cyclic"
9
- require "mongoid/relations/proxy"
10
- require "mongoid/relations/bindings"
11
- require "mongoid/relations/builders"
12
- require "mongoid/relations/many"
13
- require "mongoid/relations/one"
14
- require "mongoid/relations/options"
15
- require "mongoid/relations/polymorphic"
16
- require "mongoid/relations/targets/enumerable"
17
- require "mongoid/relations/embedded/in"
18
- require "mongoid/relations/embedded/many"
19
- require "mongoid/relations/embedded/one"
20
- require "mongoid/relations/referenced/in"
21
- require "mongoid/relations/referenced/many"
22
- require "mongoid/relations/referenced/many_to_many"
23
- require "mongoid/relations/referenced/one"
24
- require "mongoid/relations/reflections"
25
- require "mongoid/relations/synchronization"
26
- require "mongoid/relations/touchable"
27
- require "mongoid/relations/metadata"
28
- require "mongoid/relations/macros"
1
+ require 'mongoid/association/accessors'
2
+ require 'mongoid/association/builders'
3
+ require 'mongoid/association/bindable'
4
+ require 'mongoid/association/depending'
5
+ require 'mongoid/association/proxy'
29
6
 
30
- module Mongoid
7
+ require 'mongoid/association/many'
8
+ require 'mongoid/association/one'
9
+ require 'mongoid/association/relatable'
10
+ require 'mongoid/association/nested'
11
+ require 'mongoid/association/referenced'
12
+ require 'mongoid/association/embedded'
13
+ require 'mongoid/association/macros'
14
+
15
+ require 'mongoid/association/reflections'
16
+ require 'mongoid/association/eager_loadable'
31
17
 
32
- # All classes and modules under the relations namespace handle the
33
- # functionality that has to do with embedded and referenced (relational)
34
- # associations.
35
- module Relations
18
+ module Mongoid
19
+ module Association
36
20
  extend ActiveSupport::Concern
21
+ include Embedded::Cyclic
22
+ include Referenced::AutoSave
23
+ include Referenced::CounterCache
24
+ include Referenced::Syncable
37
25
  include Accessors
38
- include AutoSave
39
- include Cascading
40
- include Cyclic
26
+ include Depending
41
27
  include Builders
42
28
  include Macros
43
- include Polymorphic
44
29
  include Reflections
45
- include Synchronization
46
- include Touchable
47
- include CounterCache
48
30
 
49
- attr_accessor :__metadata
50
- alias :relation_metadata :__metadata
31
+ # Map the macros to their corresponding Association classes.
32
+ #
33
+ # @return [ Hash ] The mapping from macros to their Association class.
34
+ #
35
+ # @since 7.0
36
+ MACRO_MAPPING = {
37
+ embeds_one: Association::Embedded::EmbedsOne,
38
+ embeds_many: Association::Embedded::EmbedsMany,
39
+ embedded_in: Association::Embedded::EmbeddedIn,
40
+ has_one: Association::Referenced::HasOne,
41
+ has_many: Association::Referenced::HasMany,
42
+ has_and_belongs_to_many: Association::Referenced::HasAndBelongsToMany,
43
+ belongs_to: Association::Referenced::BelongsTo,
44
+ }.freeze
45
+
46
+ attr_accessor :_association
47
+
48
+ included do
49
+ class_attribute :polymorphic
50
+ self.polymorphic = false
51
+ end
51
52
 
52
53
  # Determine if the document itself is embedded in another document via the
53
54
  # proper channels. (If it has a parent document.)
@@ -71,7 +72,7 @@ module Mongoid
71
72
  #
72
73
  # @since 2.0.0.rc.1
73
74
  def embedded_many?
74
- __metadata && __metadata.macro == :embeds_many
75
+ _association && _association.is_a?(Association::Embedded::EmbedsMany)
75
76
  end
76
77
 
77
78
  # Determine if the document is part of an embeds_one relation.
@@ -83,23 +84,23 @@ module Mongoid
83
84
  #
84
85
  # @since 2.0.0.rc.1
85
86
  def embedded_one?
86
- __metadata && __metadata.macro == :embeds_one
87
+ _association && _association.is_a?(Association::Embedded::EmbedsOne)
87
88
  end
88
89
 
89
- # Get the metadata name for this document. If no metadata was defined
90
- # will raise an error.
90
+ # Get the association name for this document. If no association was defined
91
+ # an error will be raised.
91
92
  #
92
- # @example Get the metadata name.
93
- # document.metadata_name
93
+ # @example Get the association name.
94
+ # document.association_name
94
95
  #
95
- # @raise [ Errors::NoMetadata ] If no metadata is present.
96
+ # @raise [ Errors::NoMetadata ] If no association metadata is present.
96
97
  #
97
- # @return [ Symbol ] The metadata name.
98
+ # @return [ Symbol ] The association name.
98
99
  #
99
100
  # @since 3.0.0
100
- def metadata_name
101
- raise Errors::NoMetadata.new(self.class.name) unless __metadata
102
- __metadata.name
101
+ def association_name
102
+ raise Errors::NoMetadata.new(self.class.name) unless _association
103
+ _association.name
103
104
  end
104
105
 
105
106
  # Determine if the document is part of an references_many relation.
@@ -111,7 +112,7 @@ module Mongoid
111
112
  #
112
113
  # @since 2.0.0.rc.1
113
114
  def referenced_many?
114
- __metadata && __metadata.macro == :has_many
115
+ _association && _association.is_a?(Association::Referenced::HasMany)
115
116
  end
116
117
 
117
118
  # Determine if the document is part of an references_one relation.
@@ -123,7 +124,7 @@ module Mongoid
123
124
  #
124
125
  # @since 2.0.0.rc.1
125
126
  def referenced_one?
126
- __metadata && __metadata.macro == :has_one
127
+ _association && _association.is_a?(Association::Referenced::HasOne)
127
128
  end
128
129
 
129
130
  # Convenience method for iterating through the loaded relations and
@@ -132,7 +133,7 @@ module Mongoid
132
133
  # @example Reload the relations.
133
134
  # document.reload_relations
134
135
  #
135
- # @return [ Hash ] The relations metadata.
136
+ # @return [ Hash ] The association metadata.
136
137
  #
137
138
  # @since 2.1.6
138
139
  def reload_relations
@@ -0,0 +1,339 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
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 }, association)
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 [ Association ] association The association metadata.
20
+ #
21
+ # @return [ Proxy ] The relation.
22
+ #
23
+ # @since 2.0.0.rc.1
24
+ def __build__(name, object, association)
25
+ relation = create_relation(object, association)
26
+ set_relation(name, relation)
27
+ end
28
+
29
+ # Create a relation from an object and association.
30
+ #
31
+ # @example Create the relation.
32
+ # person.create_relation(document, association)
33
+ #
34
+ # @param [ Document, Array<Document> ] object The relation target.
35
+ # @param [ Association ] association The association metadata.
36
+ #
37
+ # @return [ Proxy ] The relation.
38
+ #
39
+ # @since 2.0.0.rc.1
40
+ def create_relation(object, association)
41
+ type = @attributes[association.inverse_type]
42
+ target = association.build(self, object, type)
43
+ target ? association.create_relation(self, target) : 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, association)
86
+ #
87
+ # @param [ Symbol ] name The name of the relation.
88
+ # @param [ Association ] association The association metadata.
89
+ # @param [ Object ] object The object used to build the relation.
90
+ # @param [ true, false ] reload If the relation is to be reloaded.
91
+ #
92
+ # @return [ Proxy ] The relation.
93
+ #
94
+ # @since 3.0.16
95
+ def get_relation(name, association, object, reload = false)
96
+ if !reload && (value = ivar(name)) != false
97
+ value
98
+ else
99
+ _building do
100
+ _loading do
101
+ if object && needs_no_database_query?(object, association)
102
+ __build__(name, object, association)
103
+ else
104
+ __build__(name, attributes[association.key], association)
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
110
+
111
+ def needs_no_database_query?(object, association)
112
+ object.is_a?(Document) && !object.embedded? &&
113
+ object._id == attributes[association.key]
114
+ end
115
+
116
+ # Is the current code executing without autobuild functionality?
117
+ #
118
+ # @example Is autobuild disabled?
119
+ # document.without_autobuild?
120
+ #
121
+ # @return [ true, false ] If autobuild is disabled.
122
+ #
123
+ # @since 3.0.0
124
+ def without_autobuild?
125
+ Threaded.executing?(:without_autobuild)
126
+ end
127
+
128
+ # Yield to the block with autobuild functionality turned off.
129
+ #
130
+ # @example Execute without autobuild.
131
+ # document.without_autobuild do
132
+ # document.name
133
+ # end
134
+ #
135
+ # @return [ Object ] The result of the yield.
136
+ #
137
+ # @since 3.0.0
138
+ def without_autobuild
139
+ Threaded.begin_execution("without_autobuild")
140
+ yield
141
+ ensure
142
+ Threaded.exit_execution("without_autobuild")
143
+ end
144
+
145
+ # Parse out the attributes and the options from the args passed to a
146
+ # build_ or create_ methods.
147
+ #
148
+ # @example Parse the args.
149
+ # doc.parse_args(:name => "Joe")
150
+ #
151
+ # @param [ Array ] args The arguments.
152
+ #
153
+ # @return [ Array<Hash> ] The attributes and options.
154
+ #
155
+ # @since 2.3.4
156
+ def parse_args(*args)
157
+ [args.first || {}, args.size > 1 ? args[1] : {}]
158
+ end
159
+
160
+ # Adds the existence check for relations.
161
+ #
162
+ # @example Add the existence check.
163
+ # Person.define_existence_check!(association)
164
+ #
165
+ # @example Check if a relation exists.
166
+ # person = Person.new
167
+ # person.has_game?
168
+ # person.game?
169
+ #
170
+ # @param [ Association ] association The association.
171
+ #
172
+ # @return [ Class ] The model being set up.
173
+ #
174
+ # @since 3.0.0
175
+ def self.define_existence_check!(association)
176
+ name = association.name
177
+ association.inverse_class.tap do |klass|
178
+ klass.module_eval <<-END, __FILE__, __LINE__ + 1
179
+ def #{name}?
180
+ without_autobuild { !__send__(:#{name}).blank? }
181
+ end
182
+ alias :has_#{name}? :#{name}?
183
+ END
184
+ end
185
+ end
186
+
187
+ # Defines the getter for the relation. Nothing too special here: just
188
+ # return the instance variable for the relation if it exists or build
189
+ # the thing.
190
+ #
191
+ # @example Set up the getter for the relation.
192
+ # Person.define_getter!(association)
193
+ #
194
+ # @param [ Association ] association The association metadata for the relation.
195
+ #
196
+ # @return [ Class ] The class being set up.
197
+ #
198
+ # @since 2.0.0.rc.1
199
+ def self.define_getter!(association)
200
+ name = association.name
201
+ association.inverse_class.tap do |klass|
202
+ klass.re_define_method(name) do |reload = false|
203
+ value = get_relation(name, association, nil, reload)
204
+ if value.nil? && association.autobuilding? && !without_autobuild?
205
+ value = send("build_#{name}")
206
+ end
207
+ value
208
+ end
209
+ end
210
+ end
211
+
212
+ # Defines the getter for the ids of documents in the relation. Should
213
+ # be specify only for referenced many relations.
214
+ #
215
+ # @example Set up the ids getter for the relation.
216
+ # Person.define_ids_getter!(association)
217
+ #
218
+ # @param [ Association ] association The association metadata for the relation.
219
+ #
220
+ # @return [ Class ] The class being set up.
221
+ def self.define_ids_getter!(association)
222
+ ids_method = "#{association.name.to_s.singularize}_ids"
223
+ association.inverse_class.tap do |klass|
224
+ klass.re_define_method(ids_method) do
225
+ send(association.name).only(:id).map(&:id)
226
+ end
227
+ end
228
+ end
229
+
230
+ # Defines the setter for the relation. This does a few things based on
231
+ # some conditions. If there is an existing association, a target
232
+ # substitution will take place, otherwise a new relation will be
233
+ # created with the supplied target.
234
+ #
235
+ # @example Set up the setter for the relation.
236
+ # Person.define_setter!(association)
237
+ #
238
+ # @param [ Association ] association The association metadata for the relation.
239
+ #
240
+ # @return [ Class ] The class being set up.
241
+ #
242
+ # @since 2.0.0.rc.1
243
+ def self.define_setter!(association)
244
+ name = association.name
245
+ association.inverse_class.tap do |klass|
246
+ klass.re_define_method("#{name}=") do |object|
247
+ without_autobuild do
248
+ if value = get_relation(name, association, object)
249
+ if value.respond_to?(:substitute)
250
+ set_relation(name, value.substitute(object.substitutable))
251
+ else
252
+ value = __build__(name, value, association)
253
+ set_relation(name, value.substitute(object.substitutable))
254
+ end
255
+ else
256
+ __build__(name, object.substitutable, association)
257
+ end
258
+ end
259
+ end
260
+ end
261
+ end
262
+
263
+ # Defines the setter method that allows you to set documents
264
+ # in this relation by their ids. The defined setter, finds
265
+ # documents with given ids and invokes regular relation setter
266
+ # with found documents. Ids setters should be defined only for
267
+ # referenced many relations.
268
+ #
269
+ # @example Set up the id_setter for the relation.
270
+ # Person.define_ids_setter!(association)
271
+ #
272
+ # @param [ Association ] association The association for the relation.
273
+ #
274
+ # @return [ Class ] The class being set up.
275
+ def self.define_ids_setter!(association)
276
+ ids_method = "#{association.name.to_s.singularize}_ids="
277
+ association.inverse_class.tap do |klass|
278
+ klass.re_define_method(ids_method) do |ids|
279
+ send(association.setter, association.relation_class.find(ids.reject(&:blank?)))
280
+ end
281
+ end
282
+ end
283
+
284
+ # Defines a builder method for an embeds_one relation. This is
285
+ # defined as #build_name.
286
+ #
287
+ # @example
288
+ # Person.define_builder!(association)
289
+ #
290
+ # @param [ Association ] association The association for the relation.
291
+ #
292
+ # @return [ Class ] The class being set up.
293
+ #
294
+ # @since 2.0.0.rc.1
295
+ def self.define_builder!(association)
296
+ name = association.name
297
+ association.inverse_class.tap do |klass|
298
+ klass.re_define_method("build_#{name}") do |*args|
299
+ attributes, _options = parse_args(*args)
300
+ document = Factory.build(association.relation_class, attributes)
301
+ _building do
302
+ child = send("#{name}=", document)
303
+ child.run_callbacks(:build)
304
+ child
305
+ end
306
+ end
307
+ end
308
+ end
309
+
310
+ # Defines a creator method for an embeds_one relation. This is
311
+ # defined as #create_name. After the object is built it will
312
+ # immediately save.
313
+ #
314
+ # @example
315
+ # Person.define_creator!(association)
316
+ #
317
+ # @param [ Association ] association The association for the relation.
318
+ #
319
+ # @return [ Class ] The class being set up.
320
+ #
321
+ # @since 2.0.0.rc.1
322
+ def self.define_creator!(association)
323
+ name = association.name
324
+ association.inverse_class.tap do |klass|
325
+ klass.re_define_method("create_#{name}") do |*args|
326
+ attributes, _options = parse_args(*args)
327
+ document = Factory.build(association.klass, attributes)
328
+ doc = _assigning do
329
+ send("#{name}=", document)
330
+ end
331
+ doc.save
332
+ save if new_record? && association.stores_foreign_key?
333
+ doc
334
+ end
335
+ end
336
+ end
337
+ end
338
+ end
339
+ end