mongoid 6.4.8 → 7.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (376) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/LICENSE +1 -0
  4. data/README.md +4 -3
  5. data/Rakefile +33 -7
  6. data/lib/config/locales/en.yml +17 -0
  7. data/lib/mongoid/association/accessors.rb +339 -0
  8. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  9. data/lib/mongoid/association/builders.rb +92 -0
  10. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  11. data/lib/mongoid/association/depending.rb +137 -0
  12. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
  13. data/lib/mongoid/{relations → association}/embedded/batchable.rb +19 -19
  14. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  15. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  16. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  17. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  18. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  19. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
  20. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  21. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +552 -0
  22. data/lib/mongoid/association/embedded/embeds_many.rb +211 -0
  23. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
  24. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
  25. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  26. data/lib/mongoid/association/embedded/embeds_one.rb +174 -0
  27. data/lib/mongoid/association/embedded.rb +4 -0
  28. data/lib/mongoid/association/macros.rb +204 -0
  29. data/lib/mongoid/{relations → association}/many.rb +19 -49
  30. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  31. data/lib/mongoid/association/nested/many.rb +200 -0
  32. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  33. data/lib/mongoid/association/nested/one.rb +127 -0
  34. data/lib/mongoid/association/nested.rb +15 -0
  35. data/lib/mongoid/{relations → association}/one.rb +6 -6
  36. data/lib/mongoid/association/options.rb +152 -0
  37. data/lib/mongoid/{relations → association}/proxy.rb +45 -59
  38. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  39. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  40. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  41. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  42. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  43. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  44. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  45. data/lib/mongoid/association/referenced/eager.rb +162 -0
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +312 -0
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  51. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
  52. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  53. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  54. data/lib/mongoid/association/referenced/has_many/enumerable.rb +510 -0
  55. data/lib/mongoid/association/referenced/has_many/proxy.rb +578 -0
  56. data/lib/mongoid/association/referenced/has_many.rb +275 -0
  57. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  58. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  59. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  60. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  61. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  62. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  63. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  64. data/lib/mongoid/association/referenced.rb +7 -0
  65. data/lib/mongoid/{relations → association}/reflections.rb +21 -17
  66. data/lib/mongoid/association/relatable.rb +511 -0
  67. data/lib/mongoid/{relations.rb → association.rb} +57 -56
  68. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  69. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  70. data/lib/mongoid/atomic/paths/embedded.rb +1 -1
  71. data/lib/mongoid/atomic.rb +14 -4
  72. data/lib/mongoid/attributes/dynamic.rb +16 -15
  73. data/lib/mongoid/attributes/nested.rb +22 -11
  74. data/lib/mongoid/attributes/processing.rb +2 -2
  75. data/lib/mongoid/attributes/readonly.rb +2 -4
  76. data/lib/mongoid/attributes.rb +55 -31
  77. data/lib/mongoid/changeable.rb +1 -1
  78. data/lib/mongoid/clients/options.rb +7 -5
  79. data/lib/mongoid/clients/sessions.rb +20 -4
  80. data/lib/mongoid/composable.rb +4 -4
  81. data/lib/mongoid/config/environment.rb +21 -8
  82. data/lib/mongoid/config.rb +1 -0
  83. data/lib/mongoid/contextual/atomic.rb +1 -1
  84. data/lib/mongoid/contextual/geo_near.rb +1 -1
  85. data/lib/mongoid/contextual/memory.rb +21 -3
  86. data/lib/mongoid/contextual/mongo.rb +10 -8
  87. data/lib/mongoid/copyable.rb +11 -6
  88. data/lib/mongoid/criteria/includable.rb +14 -14
  89. data/lib/mongoid/criteria/modifiable.rb +8 -3
  90. data/lib/mongoid/criteria/options.rb +2 -2
  91. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  92. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  93. data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
  94. data/lib/mongoid/criteria/queryable/extensions/time.rb +1 -1
  95. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +12 -0
  96. data/lib/mongoid/criteria/queryable/key.rb +67 -8
  97. data/lib/mongoid/criteria/queryable/mergeable.rb +5 -4
  98. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  99. data/lib/mongoid/criteria/queryable/selectable.rb +5 -3
  100. data/lib/mongoid/criteria/queryable/selector.rb +9 -31
  101. data/lib/mongoid/criteria.rb +9 -3
  102. data/lib/mongoid/document.rb +14 -4
  103. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  104. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  105. data/lib/mongoid/errors/unknown_model.rb +25 -0
  106. data/lib/mongoid/errors.rb +3 -0
  107. data/lib/mongoid/extensions/array.rb +5 -5
  108. data/lib/mongoid/extensions/hash.rb +9 -4
  109. data/lib/mongoid/extensions/object.rb +4 -4
  110. data/lib/mongoid/extensions/range.rb +1 -0
  111. data/lib/mongoid/extensions/regexp.rb +1 -1
  112. data/lib/mongoid/extensions/string.rb +2 -2
  113. data/lib/mongoid/extensions.rb +0 -4
  114. data/lib/mongoid/factory.rb +13 -3
  115. data/lib/mongoid/fields/foreign_key.rb +5 -5
  116. data/lib/mongoid/fields/standard.rb +2 -14
  117. data/lib/mongoid/fields/validators/macro.rb +1 -1
  118. data/lib/mongoid/fields.rb +5 -4
  119. data/lib/mongoid/indexable.rb +4 -1
  120. data/lib/mongoid/interceptable.rb +8 -6
  121. data/lib/mongoid/matchable/all.rb +4 -3
  122. data/lib/mongoid/matchable/and.rb +1 -1
  123. data/lib/mongoid/matchable/default.rb +71 -24
  124. data/lib/mongoid/matchable/elem_match.rb +9 -3
  125. data/lib/mongoid/matchable/eq.rb +22 -0
  126. data/lib/mongoid/matchable/ne.rb +1 -1
  127. data/lib/mongoid/matchable/regexp.rb +2 -2
  128. data/lib/mongoid/matchable.rb +17 -16
  129. data/lib/mongoid/persistable/deletable.rb +7 -6
  130. data/lib/mongoid/persistable/incrementable.rb +1 -1
  131. data/lib/mongoid/persistable/logical.rb +1 -1
  132. data/lib/mongoid/persistable/pushable.rb +11 -2
  133. data/lib/mongoid/persistable/settable.rb +57 -12
  134. data/lib/mongoid/persistable.rb +4 -5
  135. data/lib/mongoid/persistence_context.rb +26 -11
  136. data/lib/mongoid/positional.rb +1 -1
  137. data/lib/mongoid/query_cache.rb +4 -2
  138. data/lib/mongoid/serializable.rb +4 -4
  139. data/lib/mongoid/shardable.rb +1 -1
  140. data/lib/mongoid/touchable.rb +102 -0
  141. data/lib/mongoid/traversable.rb +3 -3
  142. data/lib/mongoid/validatable/macros.rb +1 -1
  143. data/lib/mongoid/validatable/presence.rb +2 -2
  144. data/lib/mongoid/validatable/uniqueness.rb +5 -5
  145. data/lib/mongoid/validatable.rb +8 -8
  146. data/lib/mongoid/version.rb +2 -1
  147. data/lib/mongoid.rb +1 -0
  148. data/lib/rails/generators/mongoid/config/config_generator.rb +8 -1
  149. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -0
  150. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  151. data/spec/README.md +18 -0
  152. data/spec/app/models/animal.rb +2 -1
  153. data/spec/app/models/bomb.rb +1 -1
  154. data/spec/app/models/customer.rb +11 -0
  155. data/spec/app/models/customer_address.rb +12 -0
  156. data/spec/app/models/message.rb +1 -1
  157. data/spec/app/models/minim.rb +7 -0
  158. data/spec/app/models/other_owner_object.rb +2 -0
  159. data/spec/app/models/person.rb +5 -2
  160. data/spec/app/models/shipment_address.rb +1 -0
  161. data/spec/app/models/store_as_dup_test3.rb +7 -0
  162. data/spec/app/models/store_as_dup_test4.rb +7 -0
  163. data/spec/app/models/updatable.rb +7 -0
  164. data/spec/app/models/vertex.rb +6 -0
  165. data/spec/app/models/wiki_page.rb +1 -1
  166. data/spec/config/mongoid.yml +13 -3
  167. data/spec/integration/app_spec.rb +341 -0
  168. data/spec/integration/associations/belongs_to_spec.rb +13 -0
  169. data/spec/integration/associations/embedded_spec.rb +176 -0
  170. data/spec/integration/callbacks_models.rb +49 -0
  171. data/spec/integration/callbacks_spec.rb +216 -0
  172. data/spec/integration/criteria/date_field_spec.rb +41 -0
  173. data/spec/integration/criteria/time_with_zone_spec.rb +32 -0
  174. data/spec/integration/matchable_spec.rb +680 -0
  175. data/spec/lite_spec_helper.rb +71 -0
  176. data/spec/mongoid/{relations → association}/accessors_spec.rb +40 -1
  177. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  178. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  179. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  180. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  181. data/spec/mongoid/association/depending_spec.rb +866 -0
  182. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  183. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  184. data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
  185. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  186. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  187. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +55 -77
  188. data/spec/mongoid/association/embedded/embedded_in_spec.rb +901 -0
  189. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  190. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  191. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +124 -182
  192. data/spec/mongoid/association/embedded/embeds_many_models.rb +53 -0
  193. data/spec/mongoid/association/embedded/embeds_many_spec.rb +862 -0
  194. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  195. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  196. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  197. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +6 -0
  198. data/spec/mongoid/association/embedded/embeds_one_models.rb +51 -0
  199. data/spec/mongoid/association/embedded/embeds_one_spec.rb +954 -0
  200. data/spec/mongoid/{relations → association}/macros_spec.rb +148 -73
  201. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  202. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  203. data/spec/mongoid/association/options_spec.rb +1321 -0
  204. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +66 -34
  205. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  206. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  207. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +33 -14
  208. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  209. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2023 -0
  210. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
  211. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  212. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +26 -7
  213. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +56 -0
  214. data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +247 -99
  215. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +26 -0
  216. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
  217. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  218. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  219. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +26 -11
  220. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +227 -1
  221. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  222. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +30 -94
  223. data/spec/mongoid/association/referenced/has_many_models.rb +37 -0
  224. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  225. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  226. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  227. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  228. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  229. data/spec/mongoid/association/referenced/has_one_models.rb +48 -0
  230. data/spec/mongoid/association/referenced/has_one_spec.rb +1360 -0
  231. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  232. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
  233. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  234. data/spec/mongoid/atomic/modifiers_spec.rb +2 -2
  235. data/spec/mongoid/atomic/paths_spec.rb +41 -0
  236. data/spec/mongoid/atomic_spec.rb +4 -4
  237. data/spec/mongoid/attributes/dynamic_spec.rb +153 -0
  238. data/spec/mongoid/attributes/nested_spec.rb +29 -11
  239. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  240. data/spec/mongoid/attributes_spec.rb +298 -9
  241. data/spec/mongoid/clients/factory_spec.rb +20 -38
  242. data/spec/mongoid/clients/options_spec.rb +64 -50
  243. data/spec/mongoid/clients/sessions_spec.rb +9 -5
  244. data/spec/mongoid/clients/transactions_spec.rb +390 -0
  245. data/spec/mongoid/clients_spec.rb +70 -10
  246. data/spec/mongoid/config_spec.rb +27 -1
  247. data/spec/mongoid/contextual/atomic_spec.rb +37 -14
  248. data/spec/mongoid/contextual/geo_near_spec.rb +11 -2
  249. data/spec/mongoid/contextual/map_reduce_spec.rb +20 -5
  250. data/spec/mongoid/contextual/memory_spec.rb +19 -0
  251. data/spec/mongoid/contextual/mongo_spec.rb +107 -56
  252. data/spec/mongoid/copyable_spec.rb +90 -6
  253. data/spec/mongoid/copyable_spec_models.rb +17 -0
  254. data/spec/mongoid/criteria/modifiable_spec.rb +173 -1
  255. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +54 -0
  256. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -7
  257. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +44 -1
  258. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +19 -7
  259. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +28 -1
  260. data/spec/mongoid/criteria/queryable/key_spec.rb +48 -6
  261. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  262. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +762 -0
  263. data/spec/mongoid/criteria/queryable/selectable_spec.rb +5 -224
  264. data/spec/mongoid/criteria/queryable/selector_spec.rb +37 -0
  265. data/spec/mongoid/criteria_spec.rb +36 -19
  266. data/spec/mongoid/document_fields_spec.rb +88 -0
  267. data/spec/mongoid/document_persistence_context_spec.rb +33 -0
  268. data/spec/mongoid/document_spec.rb +29 -4
  269. data/spec/mongoid/extensions/array_spec.rb +11 -15
  270. data/spec/mongoid/extensions/hash_spec.rb +18 -1
  271. data/spec/mongoid/extensions/object_spec.rb +7 -11
  272. data/spec/mongoid/extensions/range_spec.rb +7 -0
  273. data/spec/mongoid/factory_spec.rb +21 -3
  274. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  275. data/spec/mongoid/fields_spec.rb +1 -1
  276. data/spec/mongoid/indexable_spec.rb +24 -12
  277. data/spec/mongoid/interceptable_spec.rb +22 -1
  278. data/spec/mongoid/matchable/default_spec.rb +10 -3
  279. data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
  280. data/spec/mongoid/matchable/eq_spec.rb +48 -0
  281. data/spec/mongoid/matchable/regexp_spec.rb +2 -2
  282. data/spec/mongoid/matchable_spec.rb +2 -2
  283. data/spec/mongoid/persistable/pushable_spec.rb +55 -1
  284. data/spec/mongoid/persistable/savable_spec.rb +5 -5
  285. data/spec/mongoid/persistable/settable_spec.rb +125 -10
  286. data/spec/mongoid/persistable_spec.rb +21 -6
  287. data/spec/mongoid/persistence_context_spec.rb +1 -1
  288. data/spec/mongoid/query_cache_spec.rb +65 -27
  289. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  290. data/spec/mongoid/scopable_spec.rb +2 -1
  291. data/spec/mongoid/shardable_spec.rb +32 -12
  292. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  293. data/spec/mongoid/tasks/database_spec.rb +1 -1
  294. data/spec/mongoid/{relations/touchable_spec.rb → touchable_spec.rb} +40 -1
  295. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  296. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  297. data/spec/mongoid/validatable/uniqueness_spec.rb +33 -6
  298. data/spec/mongoid/validatable_spec.rb +1 -1
  299. data/spec/shared/LICENSE +20 -0
  300. data/spec/shared/bin/get-mongodb-download-url +17 -0
  301. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  302. data/spec/shared/lib/mrss/cluster_config.rb +221 -0
  303. data/spec/shared/lib/mrss/constraints.rb +354 -0
  304. data/spec/shared/lib/mrss/docker_runner.rb +265 -0
  305. data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
  306. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  307. data/spec/shared/lib/mrss/spec_organizer.rb +162 -0
  308. data/spec/shared/lib/mrss/utils.rb +15 -0
  309. data/spec/shared/share/Dockerfile.erb +231 -0
  310. data/spec/shared/shlib/distro.sh +73 -0
  311. data/spec/shared/shlib/server.sh +290 -0
  312. data/spec/shared/shlib/set_env.sh +128 -0
  313. data/spec/spec_helper.rb +34 -49
  314. data/spec/support/cluster_config.rb +3 -3
  315. data/spec/support/constraints.rb +21 -76
  316. data/spec/support/expectations.rb +17 -3
  317. data/spec/support/spec_config.rb +20 -7
  318. data.tar.gz.sig +0 -0
  319. metadata +646 -541
  320. metadata.gz.sig +1 -5
  321. data/lib/mongoid/relations/accessors.rb +0 -267
  322. data/lib/mongoid/relations/auto_save.rb +0 -94
  323. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  324. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  325. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  326. data/lib/mongoid/relations/bindings.rb +0 -9
  327. data/lib/mongoid/relations/builder.rb +0 -57
  328. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  329. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  330. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  331. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  332. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  333. data/lib/mongoid/relations/builders.rb +0 -106
  334. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  335. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  336. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  337. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  338. data/lib/mongoid/relations/cascading.rb +0 -56
  339. data/lib/mongoid/relations/conversions.rb +0 -34
  340. data/lib/mongoid/relations/counter_cache.rb +0 -160
  341. data/lib/mongoid/relations/cyclic.rb +0 -107
  342. data/lib/mongoid/relations/eager/base.rb +0 -153
  343. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  344. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  345. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  346. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  347. data/lib/mongoid/relations/embedded/in.rb +0 -241
  348. data/lib/mongoid/relations/embedded/many.rb +0 -683
  349. data/lib/mongoid/relations/embedded/one.rb +0 -235
  350. data/lib/mongoid/relations/macros.rb +0 -367
  351. data/lib/mongoid/relations/metadata.rb +0 -1179
  352. data/lib/mongoid/relations/nested_builder.rb +0 -74
  353. data/lib/mongoid/relations/options.rb +0 -49
  354. data/lib/mongoid/relations/polymorphic.rb +0 -39
  355. data/lib/mongoid/relations/referenced/in.rb +0 -304
  356. data/lib/mongoid/relations/referenced/many.rb +0 -812
  357. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  358. data/lib/mongoid/relations/referenced/one.rb +0 -290
  359. data/lib/mongoid/relations/synchronization.rb +0 -169
  360. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  361. data/lib/mongoid/relations/targets.rb +0 -2
  362. data/lib/mongoid/relations/touchable.rb +0 -97
  363. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  364. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  365. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  366. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  367. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  368. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  369. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  370. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  371. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  372. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  373. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  374. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  375. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  376. data/spec/mongoid/relations/options_spec.rb +0 -35
@@ -0,0 +1,511 @@
1
+ require 'mongoid/association/constrainable'
2
+ require 'mongoid/association/options'
3
+
4
+ module Mongoid
5
+ module Association
6
+
7
+ # This module provides behaviors shared between Association types.
8
+ #
9
+ # @since 7.0
10
+ module Relatable
11
+ include Constrainable
12
+ include Options
13
+
14
+ # The options shared between all association types.
15
+ #
16
+ # @return [ Array<Symbol> ] The shared options.
17
+ #
18
+ # @since 7.0
19
+ SHARED_OPTIONS = [
20
+ :class_name,
21
+ :inverse_of,
22
+ :validate,
23
+ :extend
24
+ ].freeze
25
+
26
+ # The primary key default.
27
+ #
28
+ # @return [ String ] The primary key field default.
29
+ #
30
+ # @since 7.0
31
+ PRIMARY_KEY_DEFAULT = '_id'.freeze
32
+
33
+ # The name of the association.
34
+ #
35
+ # @return [ Symbol ] The name of the relation.
36
+ #
37
+ # @since 7.0
38
+ attr_reader :name
39
+
40
+ # The options on this association.
41
+ #
42
+ # @return [ Hash ] The options.
43
+ #
44
+ # @since 7.0
45
+ attr_reader :options
46
+
47
+ # Initialize the Association.
48
+ #
49
+ # @param [ Class ] _class The class of the model who owns this relation.
50
+ # @param [ Symbol ] name The name of the association.
51
+ # @param [ Hash ] opts The relation options.
52
+ # @param [ Block ] block The optional block.
53
+ #
54
+ # @since 7.0
55
+ def initialize(_class, name, opts = {}, &block)
56
+ @owner_class = _class
57
+ @name = name
58
+ @options = opts
59
+ @extension = nil
60
+
61
+ @module_path = _class.name ? _class.name.split('::')[0..-2].join('::') : ''
62
+ @module_path << '::' unless @module_path.empty?
63
+
64
+ create_extension!(&block)
65
+ validate!
66
+ end
67
+
68
+ # Compare this association to another.
69
+ #
70
+ # @return [ Object ] The object to compare to this association.
71
+ #
72
+ # @since 7.0
73
+ def ==(other)
74
+ relation_class_name == other.relation_class_name &&
75
+ inverse_class_name == other.inverse_class_name &&
76
+ name == other.name &&
77
+ options == other.options
78
+ end
79
+
80
+ # Get the callbacks for a given type.
81
+ #
82
+ # @param [ Symbol ] callback_type The type of callback type.
83
+ #
84
+ # @return [ Array<Proc, Symbol> ] A list of the callbacks, either method
85
+ # names or Procs.
86
+ #
87
+ # @since 7.0
88
+ def get_callbacks(callback_type)
89
+ Array(options[callback_type])
90
+ end
91
+
92
+ # Get the type setter.
93
+ # @note Only relevant for polymorphic relations that take the :as option.
94
+ #
95
+ # @return [ String ] The type setter method.
96
+ #
97
+ # @since 7.0
98
+ def type_setter
99
+ @type_setter ||= type.__setter__
100
+ end
101
+
102
+ # Whether trying to bind an object using this association should raise
103
+ # an error.
104
+ #
105
+ # @param [ Document ] doc The document to be bound.
106
+ #
107
+ # @return [ true, false ] Whether the document can be bound.
108
+ #
109
+ # @since 7.0
110
+ def bindable?(doc); false; end
111
+
112
+ # Get the inverse names.
113
+ #
114
+ # @param [ Object ] other The other model class or model object to use when
115
+ # determining inverses.
116
+ #
117
+ # @return [ Array<Symbol> ] The list of inverse names.
118
+ #
119
+ # @since 7.0
120
+ def inverses(other = nil)
121
+ return [ inverse_of ] if inverse_of
122
+ if polymorphic?
123
+ polymorphic_inverses(other)
124
+ else
125
+ determine_inverses(other)
126
+ end
127
+ end
128
+
129
+ # Get the inverse's association metadata.
130
+ #
131
+ # @param [ Object ] other The other model class or model object to use when
132
+ # determining inverses.
133
+ #
134
+ # @return [ Association ] The inverse's association metadata.
135
+ #
136
+ # @since 7.0
137
+ def inverse_association(other = nil)
138
+ (other || relation_class).relations[inverse(other)]
139
+ end
140
+
141
+ # Get the inverse type.
142
+ #
143
+ # @return [ nil ] Default is nil for an association.
144
+ #
145
+ # @since 7.0
146
+ def inverse_type; end
147
+
148
+ # The class name, possibly unqualified or :: prefixed, of the association
149
+ # object(s).
150
+ #
151
+ # This method returns the class name as it is used in the association
152
+ # definition. If :class_name option is given in the association, the
153
+ # exact value of that option is returned here. If :class_name option is
154
+ # not given, the name of the class is calculated from association name
155
+ # but is not resolved to the actual class.
156
+ #
157
+ # The class name returned by this method may not correspond to a defined
158
+ # class, either because the corresponding class has not been loaded yet,
159
+ # or because the association references a non-existent class altogether.
160
+ # To obtain the association class, use +relation_class+ method.
161
+ #
162
+ # @note The return value of this method should not be used to determine
163
+ # whether two associations have the same target class, because the
164
+ # return value is not always a fully qualified class name. To compare
165
+ # classes, retrieve the class instance of the association target using
166
+ # the +relation_class+ method.
167
+ #
168
+ # @return [ String ] The association objects' class name.
169
+ #
170
+ # @since 7.0
171
+ def relation_class_name
172
+ @class_name ||= @options[:class_name] || ActiveSupport::Inflector.classify(name)
173
+ end
174
+ alias :class_name :relation_class_name
175
+
176
+ # The class of the relation object(s).
177
+ #
178
+ # This method returns the class instance corresponding to
179
+ # +relation_class_name+, resolved relative to the host document class.
180
+ #
181
+ # If the class does not exist, this method raises NameError. This can
182
+ # happen because the target class has not yet been defined. Note that
183
+ # polymorphic associations generally do not have a well defined target
184
+ # class because the target class can change from one object to another,
185
+ # and calling this method on a polymorphic association will generally
186
+ # fail with a NameError or produce misleading results (if a class does
187
+ # happen to be defined with the same name as the association name).
188
+ #
189
+ # @return [ String ] The association objects' class.
190
+ #
191
+ # @since 7.0
192
+ def relation_class
193
+ @klass ||= begin
194
+ cls_name = @options[:class_name] || ActiveSupport::Inflector.classify(name)
195
+ resolve_name(inverse_class, cls_name)
196
+ end
197
+ end
198
+ alias :klass :relation_class
199
+
200
+ # The class name of the object owning this relation.
201
+ #
202
+ # @return [ String ] The owning objects' class name.
203
+ #
204
+ # @since 7.0
205
+ def inverse_class_name
206
+ @inverse_class_name ||= @owner_class.name
207
+ end
208
+
209
+ # The class of the object owning this relation.
210
+ #
211
+ # @return [ String ] The owning objects' class.
212
+ #
213
+ # @since 7.0
214
+ def inverse_class
215
+ @owner_class
216
+ end
217
+ alias :inverse_klass :inverse_class
218
+
219
+ # The foreign key field if this relation stores a foreign key.
220
+ # Otherwise, the primary key.
221
+ #
222
+ # @return [ Symbol, String ] The primary key.
223
+ #
224
+ # @since 7.0
225
+ def key
226
+ stores_foreign_key? ? foreign_key : primary_key
227
+ end
228
+
229
+ # The name of the setter on this object for assigning an associated object.
230
+ #
231
+ # @return [ String ] The setter name.
232
+ #
233
+ # @since 7.0
234
+ def setter
235
+ @setter ||= "#{name}="
236
+ end
237
+
238
+ # The name of the inverse setter method.
239
+ #
240
+ # @return [ String ] The name of the inverse setter.
241
+ #
242
+ # @since 7.0
243
+ def inverse_setter(other = nil)
244
+ @inverse_setter ||= "#{inverses(other).first}=" unless inverses(other).blank?
245
+ end
246
+
247
+ # The name of the foreign key setter method.
248
+ #
249
+ # @return [ String ] The name of the foreign key setter.
250
+ #
251
+ # @since 7.0
252
+ def foreign_key_setter
253
+ # note: You can't check if this association stores foreign key
254
+ # See HasOne and HasMany binding, they referenced foreign_key_setter
255
+ @foreign_key_setter ||= "#{foreign_key}=" if foreign_key
256
+ end
257
+
258
+ # The atomic path for this relation.
259
+ #
260
+ # @return [ Mongoid::Atomic::Paths::Root ] The atomic path object.
261
+ #
262
+ # @since 7.0
263
+ def path(document)
264
+ relation.path(document)
265
+ end
266
+
267
+ # Gets the setter for the field that sets the type of document on a
268
+ # polymorphic relation.
269
+ #
270
+ # @example Get the inverse type setter.
271
+ # association.inverse_type_setter
272
+ #
273
+ # @return [ String ] The name of the setter.
274
+ #
275
+ # @since 7.0
276
+ def inverse_type_setter
277
+ @inverse_type_setter ||= inverse_type.__setter__
278
+ end
279
+
280
+ # Get the name of the method to check if the foreign key has changed.
281
+ #
282
+ # @example Get the foreign key check method.
283
+ # association.foreign_key_check
284
+ #
285
+ # @return [ String ] The foreign key check.
286
+ #
287
+ # @since 7.0
288
+ def foreign_key_check
289
+ @foreign_key_check ||= "#{foreign_key}_changed?" if (stores_foreign_key? && foreign_key)
290
+ end
291
+
292
+ # Create a relation proxy object using the owner and target.
293
+ #
294
+ # @param [ Document ] owner The document this relation hangs off of.
295
+ # @param [ Document, Array<Document> ] target The target (parent) of the
296
+ # relation.
297
+ #
298
+ # @return [ Proxy ]
299
+ #
300
+ # @since 7.0
301
+ def create_relation(owner, target)
302
+ relation.new(owner, target, self)
303
+ end
304
+
305
+ # Whether the dependent method is destructive.
306
+ #
307
+ # @return [ true, false ] If the dependent method is destructive.
308
+ #
309
+ # @since 7.0
310
+ def destructive?
311
+ @destructive ||= !!(dependent && (dependent == :delete_all || dependent == :destroy))
312
+ end
313
+
314
+ # Get the counter cache column name.
315
+ #
316
+ # @return [ String ] The counter cache column name.
317
+ #
318
+ # @since 7.0
319
+ def counter_cache_column_name
320
+ @counter_cache_column_name ||= (@options[:counter_cache].is_a?(String) ||
321
+ @options[:counter_cache].is_a?(Symbol)) ?
322
+ @options[:counter_cache] : "#{inverse || inverse_class_name.demodulize.underscore.pluralize}_count"
323
+ end
324
+
325
+ # Get the extension.
326
+ #
327
+ # @return [ Module ] The extension module, if one has been defined.
328
+ #
329
+ # @since 7.0
330
+ def extension
331
+ @extension ||= @options[:extend]
332
+ end
333
+
334
+ # Get the inverse name.
335
+ #
336
+ # @return [ Symbol ] The inverse name.
337
+ #
338
+ # @since 7.0
339
+ def inverse(other = nil)
340
+ candidates = inverses(other)
341
+ candidates.detect { |c| c } if candidates
342
+ end
343
+
344
+ # Whether the associated object(s) should be validated.
345
+ #
346
+ # @return [ true, false ] If the associated object(s)
347
+ # should be validated.
348
+ #
349
+ # @since 7.0
350
+ def validate?
351
+ @validate ||= if @options[:validate].nil?
352
+ validation_default
353
+ else
354
+ !!@options[:validate]
355
+ end
356
+ end
357
+
358
+ private
359
+
360
+ # Gets the model classes with inverse associations of this model. This is used to determine
361
+ # the classes on the other end of polymorphic relations with models.
362
+ def inverse_association_classes
363
+ Mongoid::Config.models.map { |m| inverse_association(m) }.compact.map(&:inverse_class)
364
+ end
365
+
366
+ def setup_index!
367
+ @owner_class.index(index_spec, background: true) if indexed?
368
+ end
369
+
370
+ def define_touchable!
371
+ if touchable?
372
+ Touchable.define_touchable!(self)
373
+ end
374
+ end
375
+
376
+ def define_autosaver!
377
+ if autosave?
378
+ Association::Referenced::AutoSave.define_autosave!(self)
379
+ end
380
+ end
381
+
382
+ def define_builder!
383
+ Association::Builders.define_builder!(self)
384
+ end
385
+
386
+ def define_creator!
387
+ Association::Builders.define_creator!(self)
388
+ end
389
+
390
+ def define_getter!
391
+ Association::Accessors.define_getter!(self)
392
+ end
393
+
394
+ def define_setter!
395
+ Association::Accessors.define_setter!(self)
396
+ end
397
+
398
+ def define_existence_check!
399
+ Association::Accessors.define_existence_check!(self)
400
+ end
401
+
402
+ def define_ids_getter!
403
+ Association::Accessors.define_ids_getter!(self)
404
+ end
405
+
406
+ def define_ids_setter!
407
+ Association::Accessors.define_ids_setter!(self)
408
+ end
409
+
410
+ def define_counter_cache_callbacks!
411
+ if counter_cached?
412
+ Association::Referenced::CounterCache.define_callbacks!(self)
413
+ end
414
+ end
415
+
416
+ def define_dependency!
417
+ if dependent
418
+ Association::Depending.define_dependency!(self)
419
+ end
420
+ end
421
+
422
+ def validate!
423
+ @options.keys.each do |opt|
424
+ unless self.class::VALID_OPTIONS.include?(opt)
425
+ raise Errors::InvalidRelationOption.new(@owner_class, name, opt, self.class::VALID_OPTIONS)
426
+ end
427
+ end
428
+
429
+ [name, "#{name}?".to_sym, "#{name}=".to_sym].each do |n|
430
+ if Mongoid.destructive_fields.include?(n)
431
+ raise Errors::InvalidRelation.new(@owner_class, n)
432
+ end
433
+ end
434
+ end
435
+
436
+ def polymorph!
437
+ if polymorphic?
438
+ @owner_class.polymorphic = true
439
+ end
440
+ end
441
+
442
+ def create_extension!(&block)
443
+ if block
444
+ extension_module_name = "#{@owner_class.to_s.demodulize}#{name.to_s.camelize}RelationExtension"
445
+ silence_warnings do
446
+ @owner_class.const_set(extension_module_name, Module.new(&block))
447
+ end
448
+ @extension = "#{@owner_class}::#{extension_module_name}".constantize
449
+ end
450
+ end
451
+
452
+ def default_inverse
453
+ @default_inverse ||= klass.relations[inverse_klass.name.underscore]
454
+ end
455
+
456
+ # Returns an array of classes/modules forming the namespace hierarchy
457
+ # where symbols referenced in the provided class/module would be looked
458
+ # up by Ruby. For example, if mod is Foo::Bar, this method would return
459
+ # [Foo::Bar, Foo, Object].
460
+ def namespace_hierarchy(mod)
461
+ parent = Object
462
+ hier = [parent]
463
+ mod.name.split('::').each do |part|
464
+ parent = parent.const_get(part)
465
+ hier << parent
466
+ end
467
+ hier.reverse
468
+ end
469
+
470
+ # Resolves the given class/module name in the context of the specified
471
+ # module, as Ruby would when a constant is referenced in the source.
472
+ #
473
+ # @note This method can swallow exceptions produced during class loading,
474
+ # because it rescues NameError internally. Since this method attempts
475
+ # to load classes, failure during the loading process may also lead to
476
+ # there being incomplete class definitions.
477
+ def resolve_name(mod, name)
478
+ cls = exc = nil
479
+ parts = name.to_s.split('::')
480
+ if parts.first == ''
481
+ parts.shift
482
+ hierarchy = [Object]
483
+ else
484
+ hierarchy = namespace_hierarchy(mod)
485
+ end
486
+ hierarchy.each do |ns|
487
+ begin
488
+ parts.each do |part|
489
+ # Simple const_get sometimes pulls names out of weird scopes,
490
+ # perhaps confusing the receiver (ns in this case) with the
491
+ # local scope. Walk the class hierarchy ourselves one node
492
+ # at a time by specifying false as the second argument.
493
+ ns = ns.const_get(part, false)
494
+ end
495
+ cls = ns
496
+ break
497
+ rescue NameError => e
498
+ if exc.nil?
499
+ exc = e
500
+ end
501
+ end
502
+ end
503
+ if cls.nil?
504
+ # Raise the first exception, this is from the most specific namespace
505
+ raise exc
506
+ end
507
+ cls
508
+ end
509
+ end
510
+ end
511
+ 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
@@ -35,7 +35,7 @@ module Mongoid
35
35
  def position
36
36
  pos = parent.atomic_position
37
37
  locator = document.new_record? ? "" : ".#{document._index}"
38
- "#{pos}#{"." unless pos.blank?}#{document.__metadata.store_as}#{locator}"
38
+ "#{pos}#{"." unless pos.blank?}#{document._association.store_as}#{locator}"
39
39
  end
40
40
  end
41
41
  end
@@ -34,7 +34,7 @@ module Mongoid
34
34
  # @since 2.1.0
35
35
  def position
36
36
  pos = parent.atomic_position
37
- "#{pos}#{"." unless pos.blank?}#{document.__metadata.store_as}"
37
+ "#{pos}#{"." unless pos.blank?}#{document._association.store_as}"
38
38
  end
39
39
  end
40
40
  end
@@ -20,7 +20,7 @@ module Mongoid
20
20
  #
21
21
  # @since 2.1.0
22
22
  def path
23
- @path ||= position.sub(/\.\d+$/, "")
23
+ @path ||= position.sub(/\.\d+\z/, "")
24
24
  end
25
25
  end
26
26
  end