mongoid 6.4.2 → 7.0.3

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 (318) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/config/locales/en.yml +17 -0
  4. data/lib/mongoid/association/accessors.rb +339 -0
  5. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  6. data/lib/mongoid/association/builders.rb +92 -0
  7. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  8. data/lib/mongoid/association/depending.rb +137 -0
  9. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
  10. data/lib/mongoid/{relations → association}/embedded/batchable.rb +19 -19
  11. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  12. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  13. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  14. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  15. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  16. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
  17. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  18. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +552 -0
  19. data/lib/mongoid/association/embedded/embeds_many.rb +210 -0
  20. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
  21. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
  22. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  23. data/lib/mongoid/association/embedded/embeds_one.rb +173 -0
  24. data/lib/mongoid/association/embedded.rb +4 -0
  25. data/lib/mongoid/association/macros.rb +204 -0
  26. data/lib/mongoid/{relations → association}/many.rb +19 -49
  27. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  28. data/lib/mongoid/association/nested/many.rb +200 -0
  29. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  30. data/lib/mongoid/association/nested/one.rb +127 -0
  31. data/lib/mongoid/association/nested.rb +15 -0
  32. data/lib/mongoid/{relations → association}/one.rb +6 -6
  33. data/lib/mongoid/association/options.rb +152 -0
  34. data/lib/mongoid/{relations → association}/proxy.rb +31 -58
  35. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  36. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  37. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  38. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  39. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  40. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  41. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  42. data/lib/mongoid/association/referenced/eager.rb +162 -0
  43. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  44. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  45. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +312 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  48. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
  49. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  50. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  51. data/lib/mongoid/association/referenced/has_many/enumerable.rb +510 -0
  52. data/lib/mongoid/association/referenced/has_many/proxy.rb +578 -0
  53. data/lib/mongoid/association/referenced/has_many.rb +275 -0
  54. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  55. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  56. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  57. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  58. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  59. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  60. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  61. data/lib/mongoid/association/referenced.rb +7 -0
  62. data/lib/mongoid/{relations → association}/reflections.rb +21 -17
  63. data/lib/mongoid/association/relatable.rb +509 -0
  64. data/lib/mongoid/{relations.rb → association.rb} +57 -56
  65. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  66. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  67. data/lib/mongoid/atomic.rb +4 -4
  68. data/lib/mongoid/attributes/dynamic.rb +2 -2
  69. data/lib/mongoid/attributes/nested.rb +22 -11
  70. data/lib/mongoid/attributes/processing.rb +2 -2
  71. data/lib/mongoid/attributes/readonly.rb +2 -4
  72. data/lib/mongoid/attributes.rb +22 -13
  73. data/lib/mongoid/changeable.rb +1 -1
  74. data/lib/mongoid/clients/options.rb +7 -5
  75. data/lib/mongoid/composable.rb +4 -4
  76. data/lib/mongoid/config.rb +1 -0
  77. data/lib/mongoid/contextual/atomic.rb +1 -1
  78. data/lib/mongoid/contextual/geo_near.rb +1 -1
  79. data/lib/mongoid/contextual/memory.rb +21 -3
  80. data/lib/mongoid/contextual/mongo.rb +10 -8
  81. data/lib/mongoid/copyable.rb +7 -6
  82. data/lib/mongoid/criteria/includable.rb +14 -14
  83. data/lib/mongoid/criteria/modifiable.rb +8 -14
  84. data/lib/mongoid/criteria/options.rb +2 -2
  85. data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
  86. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  87. data/lib/mongoid/criteria/queryable/selectable.rb +37 -7
  88. data/lib/mongoid/criteria.rb +2 -2
  89. data/lib/mongoid/document.rb +15 -6
  90. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  91. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  92. data/lib/mongoid/errors/unknown_model.rb +25 -0
  93. data/lib/mongoid/errors.rb +3 -0
  94. data/lib/mongoid/extensions/array.rb +5 -5
  95. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  96. data/lib/mongoid/extensions/hash.rb +5 -2
  97. data/lib/mongoid/extensions/object.rb +4 -4
  98. data/lib/mongoid/extensions/range.rb +1 -0
  99. data/lib/mongoid/extensions/regexp.rb +1 -0
  100. data/lib/mongoid/extensions.rb +0 -4
  101. data/lib/mongoid/factory.rb +13 -3
  102. data/lib/mongoid/fields/foreign_key.rb +5 -5
  103. data/lib/mongoid/fields/standard.rb +2 -14
  104. data/lib/mongoid/fields/validators/macro.rb +1 -1
  105. data/lib/mongoid/fields.rb +3 -3
  106. data/lib/mongoid/indexable.rb +4 -1
  107. data/lib/mongoid/interceptable.rb +5 -5
  108. data/lib/mongoid/matchable/and.rb +1 -1
  109. data/lib/mongoid/matchable/elem_match.rb +9 -3
  110. data/lib/mongoid/matchable/eq.rb +22 -0
  111. data/lib/mongoid/matchable/ne.rb +1 -1
  112. data/lib/mongoid/matchable.rb +3 -1
  113. data/lib/mongoid/persistable/deletable.rb +7 -6
  114. data/lib/mongoid/persistable/incrementable.rb +1 -1
  115. data/lib/mongoid/persistable/logical.rb +1 -1
  116. data/lib/mongoid/persistable/settable.rb +57 -12
  117. data/lib/mongoid/persistable.rb +4 -5
  118. data/lib/mongoid/persistence_context.rb +20 -5
  119. data/lib/mongoid/query_cache.rb +8 -4
  120. data/lib/mongoid/railtie.rb +17 -0
  121. data/lib/mongoid/railties/controller_runtime.rb +86 -0
  122. data/lib/mongoid/scopable.rb +3 -3
  123. data/lib/mongoid/serializable.rb +4 -4
  124. data/lib/mongoid/shardable.rb +1 -1
  125. data/lib/mongoid/threaded.rb +36 -0
  126. data/lib/mongoid/touchable.rb +102 -0
  127. data/lib/mongoid/traversable.rb +3 -3
  128. data/lib/mongoid/validatable/presence.rb +2 -2
  129. data/lib/mongoid/validatable/uniqueness.rb +4 -4
  130. data/lib/mongoid/validatable.rb +8 -8
  131. data/lib/mongoid/version.rb +1 -1
  132. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -0
  133. data/spec/app/models/animal.rb +2 -1
  134. data/spec/app/models/bomb.rb +1 -1
  135. data/spec/app/models/message.rb +1 -1
  136. data/spec/app/models/minim.rb +7 -0
  137. data/spec/app/models/person.rb +5 -2
  138. data/spec/app/models/shipment_address.rb +1 -0
  139. data/spec/app/models/store_as_dup_test3.rb +7 -0
  140. data/spec/app/models/store_as_dup_test4.rb +7 -0
  141. data/spec/app/models/updatable.rb +7 -0
  142. data/spec/app/models/vertex.rb +6 -0
  143. data/spec/app/models/wiki_page.rb +1 -1
  144. data/spec/config/mongoid.yml +13 -3
  145. data/spec/integration/associations/belongs_to_spec.rb +13 -0
  146. data/spec/lite_spec_helper.rb +56 -0
  147. data/spec/mongoid/{relations → association}/accessors_spec.rb +40 -1
  148. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  149. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  150. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  151. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  152. data/spec/mongoid/association/depending_spec.rb +866 -0
  153. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  154. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  155. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  156. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  157. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +5 -77
  158. data/spec/mongoid/association/embedded/embedded_in_spec.rb +843 -0
  159. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  160. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  161. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +124 -182
  162. data/spec/mongoid/association/embedded/embeds_many_spec.rb +852 -0
  163. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  164. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  165. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  166. data/spec/mongoid/association/embedded/embeds_one_spec.rb +908 -0
  167. data/spec/mongoid/{relations → association}/macros_spec.rb +148 -73
  168. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  169. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  170. data/spec/mongoid/association/options_spec.rb +1321 -0
  171. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +66 -34
  172. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  173. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  174. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +33 -14
  175. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  176. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2006 -0
  177. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
  178. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  179. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +26 -7
  180. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +56 -0
  181. data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +107 -98
  182. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +26 -0
  183. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
  184. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  185. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  186. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +26 -11
  187. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +122 -1
  188. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  189. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +28 -93
  190. data/spec/mongoid/association/referenced/has_many_models.rb +37 -0
  191. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  192. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  193. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  194. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  195. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  196. data/spec/mongoid/association/referenced/has_one_models.rb +48 -0
  197. data/spec/mongoid/association/referenced/has_one_spec.rb +1350 -0
  198. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  199. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
  200. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  201. data/spec/mongoid/atomic/modifiers_spec.rb +2 -2
  202. data/spec/mongoid/atomic_spec.rb +4 -4
  203. data/spec/mongoid/attributes/nested_spec.rb +29 -11
  204. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  205. data/spec/mongoid/attributes_spec.rb +38 -2
  206. data/spec/mongoid/clients/factory_spec.rb +24 -18
  207. data/spec/mongoid/clients/options_spec.rb +58 -44
  208. data/spec/mongoid/clients/sessions_spec.rb +1 -1
  209. data/spec/mongoid/clients/transactions_spec.rb +369 -0
  210. data/spec/mongoid/clients_spec.rb +68 -8
  211. data/spec/mongoid/config_spec.rb +27 -1
  212. data/spec/mongoid/contextual/memory_spec.rb +19 -0
  213. data/spec/mongoid/contextual/mongo_spec.rb +33 -5
  214. data/spec/mongoid/copyable_spec.rb +90 -6
  215. data/spec/mongoid/copyable_spec_models.rb +17 -0
  216. data/spec/mongoid/criteria/modifiable_spec.rb +183 -60
  217. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
  218. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +43 -0
  219. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  220. data/spec/mongoid/criteria/queryable/selectable_spec.rb +42 -3
  221. data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
  222. data/spec/mongoid/criteria/scopable_spec.rb +81 -0
  223. data/spec/mongoid/criteria_spec.rb +33 -18
  224. data/spec/mongoid/document_spec.rb +83 -4
  225. data/spec/mongoid/extensions/array_spec.rb +11 -15
  226. data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
  227. data/spec/mongoid/extensions/hash_spec.rb +18 -1
  228. data/spec/mongoid/extensions/object_spec.rb +7 -11
  229. data/spec/mongoid/extensions/range_spec.rb +7 -0
  230. data/spec/mongoid/extensions/regexp_spec.rb +23 -0
  231. data/spec/mongoid/factory_spec.rb +19 -1
  232. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  233. data/spec/mongoid/fields_spec.rb +2 -2
  234. data/spec/mongoid/findable_spec.rb +1 -1
  235. data/spec/mongoid/indexable_spec.rb +18 -8
  236. data/spec/mongoid/interceptable_spec.rb +22 -1
  237. data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
  238. data/spec/mongoid/matchable/eq_spec.rb +48 -0
  239. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  240. data/spec/mongoid/persistable/savable_spec.rb +2 -2
  241. data/spec/mongoid/persistable/settable_spec.rb +95 -10
  242. data/spec/mongoid/persistable_spec.rb +21 -6
  243. data/spec/mongoid/persistence_context_spec.rb +1 -1
  244. data/spec/mongoid/query_cache_spec.rb +61 -22
  245. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  246. data/spec/mongoid/scopable_spec.rb +13 -0
  247. data/spec/mongoid/shardable_spec.rb +32 -12
  248. data/spec/mongoid/threaded_spec.rb +68 -0
  249. data/spec/mongoid/{relations/touchable_spec.rb → touchable_spec.rb} +40 -1
  250. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  251. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  252. data/spec/mongoid/validatable_spec.rb +1 -1
  253. data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
  254. data/spec/spec_helper.rb +51 -25
  255. data/spec/support/constraints.rb +101 -0
  256. data/spec/support/macros.rb +20 -0
  257. data/spec/support/spec_config.rb +39 -0
  258. metadata +602 -582
  259. checksums.yaml.gz.sig +0 -2
  260. data/lib/mongoid/relations/accessors.rb +0 -267
  261. data/lib/mongoid/relations/auto_save.rb +0 -94
  262. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  263. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  264. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  265. data/lib/mongoid/relations/bindings.rb +0 -9
  266. data/lib/mongoid/relations/builder.rb +0 -57
  267. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  268. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  269. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  270. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  271. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  272. data/lib/mongoid/relations/builders.rb +0 -106
  273. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  274. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  275. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  276. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  277. data/lib/mongoid/relations/cascading.rb +0 -56
  278. data/lib/mongoid/relations/conversions.rb +0 -34
  279. data/lib/mongoid/relations/counter_cache.rb +0 -160
  280. data/lib/mongoid/relations/cyclic.rb +0 -107
  281. data/lib/mongoid/relations/eager/base.rb +0 -153
  282. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  283. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  284. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  285. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  286. data/lib/mongoid/relations/embedded/in.rb +0 -241
  287. data/lib/mongoid/relations/embedded/many.rb +0 -683
  288. data/lib/mongoid/relations/embedded/one.rb +0 -235
  289. data/lib/mongoid/relations/macros.rb +0 -367
  290. data/lib/mongoid/relations/metadata.rb +0 -1179
  291. data/lib/mongoid/relations/nested_builder.rb +0 -74
  292. data/lib/mongoid/relations/options.rb +0 -49
  293. data/lib/mongoid/relations/polymorphic.rb +0 -39
  294. data/lib/mongoid/relations/referenced/in.rb +0 -304
  295. data/lib/mongoid/relations/referenced/many.rb +0 -812
  296. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  297. data/lib/mongoid/relations/referenced/one.rb +0 -290
  298. data/lib/mongoid/relations/synchronization.rb +0 -169
  299. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  300. data/lib/mongoid/relations/targets.rb +0 -2
  301. data/lib/mongoid/relations/touchable.rb +0 -97
  302. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  303. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  304. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  305. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  306. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  307. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  308. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  309. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  310. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  311. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  312. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  313. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  314. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  315. data/spec/mongoid/relations/options_spec.rb +0 -35
  316. data.tar.gz.sig +0 -0
  317. metadata.gz.sig +0 -0
  318. /data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
@@ -1,6 +1,8 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  require "spec_helper"
3
3
 
4
+ require_relative './copyable_spec_models'
5
+
4
6
  describe Mongoid::Copyable do
5
7
 
6
8
  [ :clone, :dup ].each do |method|
@@ -35,6 +37,10 @@ describe Mongoid::Copyable do
35
37
  person.build_game(name: "Tron")
36
38
  end
37
39
 
40
+ let!(:name_translations) do
41
+ person.name.translations.build(language: 'en')
42
+ end
43
+
38
44
  context "when the document has an id field in the database" do
39
45
 
40
46
  let!(:band) do
@@ -86,16 +92,48 @@ describe Mongoid::Copyable do
86
92
 
87
93
  context "and dynamic attributes are not set" do
88
94
 
89
- it "clones" do
90
- t = StoreAsDupTest1.new(:name => "hi")
91
- t.build_store_as_dup_test2(:name => "there")
92
- t.save
93
- copy = t.send(method)
94
- expect(copy.store_as_dup_test2.name).to eq(t.store_as_dup_test2.name)
95
+ context 'embeds_one' do
96
+
97
+ it "clones" do
98
+ t = StoreAsDupTest1.new(:name => "hi")
99
+ t.build_store_as_dup_test2(:name => "there")
100
+ t.save
101
+ copy = t.send(method)
102
+ expect(copy.object_id).not_to eq(t.object_id)
103
+ expect(copy.store_as_dup_test2.name).to eq(t.store_as_dup_test2.name)
104
+ end
105
+ end
106
+
107
+ context 'embeds_many' do
108
+
109
+
110
+ it "clones" do
111
+ t = StoreAsDupTest3.new(:name => "hi")
112
+ t.store_as_dup_test4s << StoreAsDupTest4.new
113
+ t.save
114
+ copy = t.send(method)
115
+ expect(copy.object_id).not_to eq(t.object_id)
116
+ expect(copy.store_as_dup_test4s).not_to be_empty
117
+ expect(copy.store_as_dup_test4s.first.object_id).not_to eq(t.store_as_dup_test4s.first.object_id)
118
+ end
95
119
  end
96
120
  end
97
121
  end
98
122
 
123
+ context 'nested embeds_many' do
124
+ it 'works' do
125
+ a = CopyableSpec::A.new
126
+ a.locations << CopyableSpec::Location.new
127
+ a.locations.first.buildings << CopyableSpec::Building.new
128
+ a.save!
129
+
130
+ new_a = a.send(method)
131
+
132
+ expect(new_a.locations.length).to be 1
133
+ expect(new_a.locations.first.buildings.length).to be 1
134
+ end
135
+ end
136
+
99
137
  context "when cloning a document with multiple languages field" do
100
138
 
101
139
  before do
@@ -144,6 +182,40 @@ describe Mongoid::Copyable do
144
182
  end
145
183
  end
146
184
 
185
+ context "when cloning a document with polymorphic embedded documents with multiple language field" do
186
+
187
+ let!(:shipment_address) do
188
+ person.addresses.build({ shipping_name: "Title" }, ShipmentAddress)
189
+ end
190
+
191
+ before do
192
+ I18n.enforce_available_locales = false
193
+ I18n.locale = 'pt_BR'
194
+ person.addresses.type(ShipmentAddress).each { |address| address.shipping_name = "Título" }
195
+ person.save
196
+ end
197
+
198
+ after do
199
+ I18n.locale = :en
200
+ end
201
+
202
+ let!(:from_db) do
203
+ Person.find(person.id)
204
+ end
205
+
206
+ let(:copy) do
207
+ from_db.send(method)
208
+ end
209
+
210
+ it 'sets embedded translations' do
211
+ I18n.locale = 'pt_BR'
212
+ copy.addresses.type(ShipmentAddress).each do |address|
213
+ expect(address.shipping_name).to eq("Título")
214
+ end
215
+ end
216
+
217
+ end
218
+
147
219
  context "when cloning a loaded document" do
148
220
 
149
221
  before do
@@ -211,14 +283,26 @@ describe Mongoid::Copyable do
211
283
  expect(copy.addresses).to eq(person.addresses)
212
284
  end
213
285
 
286
+ it "copys deep embeds many documents" do
287
+ expect(copy.name.translations).to eq(person.name.translations)
288
+ end
289
+
214
290
  it "sets the embedded many documents as new" do
215
291
  expect(copy.addresses.first).to be_new_record
216
292
  end
217
293
 
294
+ it "sets the deep embedded many documents as new" do
295
+ expect(copy.name.translations.first).to be_new_record
296
+ end
297
+
218
298
  it "creates new embeds many instances" do
219
299
  expect(copy.addresses).to_not equal(person.addresses)
220
300
  end
221
301
 
302
+ it "creates new deep embeds many instances" do
303
+ expect(copy.name.translations).to_not equal(person.name.translations)
304
+ end
305
+
222
306
  it "copys embeds one documents" do
223
307
  expect(copy.name).to eq(person.name)
224
308
  end
@@ -0,0 +1,17 @@
1
+ module CopyableSpec
2
+ class A
3
+ include Mongoid::Document
4
+
5
+ embeds_many :locations
6
+ end
7
+
8
+ class Location
9
+ include Mongoid::Document
10
+
11
+ embeds_many :buildings
12
+ end
13
+
14
+ class Building
15
+ include Mongoid::Document
16
+ end
17
+ end
@@ -49,6 +49,29 @@ describe Mongoid::Criteria::Modifiable do
49
49
  end
50
50
  end
51
51
  end
52
+
53
+ context 'when the object is polymorphic' do
54
+
55
+ let(:movie) do
56
+ Movie.new
57
+ end
58
+
59
+ let(:criteria) do
60
+ Rating.where(ratable: movie)
61
+ end
62
+
63
+ let(:document) do
64
+ criteria.create
65
+ end
66
+
67
+ it 'sets the polymorphic id' do
68
+ expect(document.ratable_id).to eq(movie.id)
69
+ end
70
+
71
+ it 'sets the type field' do
72
+ expect(document.ratable_type).to eq('Movie')
73
+ end
74
+ end
52
75
  end
53
76
 
54
77
  describe "#create!" do
@@ -65,6 +88,29 @@ describe Mongoid::Criteria::Modifiable do
65
88
  }.to raise_error(Mongoid::Errors::Validations)
66
89
  end
67
90
  end
91
+
92
+ context 'when the object is polymorphic' do
93
+
94
+ let(:movie) do
95
+ Movie.new
96
+ end
97
+
98
+ let(:criteria) do
99
+ Rating.where(ratable: movie)
100
+ end
101
+
102
+ let(:document) do
103
+ criteria.create!
104
+ end
105
+
106
+ it 'sets the polymorphic id' do
107
+ expect(document.ratable_id).to eq(movie.id)
108
+ end
109
+
110
+ it 'sets the type field' do
111
+ expect(document.ratable_type).to eq('Movie')
112
+ end
113
+ end
68
114
  end
69
115
 
70
116
  [ :delete, :delete_all, :destroy, :destroy_all ].each do |method|
@@ -295,6 +341,25 @@ describe Mongoid::Criteria::Modifiable do
295
341
  expect(person.pets).to be true
296
342
  end
297
343
  end
344
+
345
+ context 'when the object is polymorphic' do
346
+
347
+ let(:movie) do
348
+ Movie.new
349
+ end
350
+
351
+ let(:document) do
352
+ Rating.find_or_create_by(ratable: movie)
353
+ end
354
+
355
+ it 'sets the polymorphic id' do
356
+ expect(document.ratable_id).to eq(movie.id)
357
+ end
358
+
359
+ it 'sets the type field' do
360
+ expect(document.ratable_type).to eq('Movie')
361
+ end
362
+ end
298
363
  end
299
364
  end
300
365
 
@@ -447,6 +512,25 @@ describe Mongoid::Criteria::Modifiable do
447
512
  end
448
513
  end
449
514
  end
515
+
516
+ context 'when the object is polymorphic' do
517
+
518
+ let(:movie) do
519
+ Movie.new
520
+ end
521
+
522
+ let(:document) do
523
+ Rating.find_or_create_by!(ratable: movie)
524
+ end
525
+
526
+ it 'sets the polymorphic id' do
527
+ expect(document.ratable_id).to eq(movie.id)
528
+ end
529
+
530
+ it 'sets the type field' do
531
+ expect(document.ratable_type).to eq('Movie')
532
+ end
533
+ end
450
534
  end
451
535
 
452
536
  describe ".find_or_initialize_by" do
@@ -500,6 +584,25 @@ describe Mongoid::Criteria::Modifiable do
500
584
  end
501
585
  end
502
586
  end
587
+
588
+ context 'when the object is polymorphic' do
589
+
590
+ let(:movie) do
591
+ Movie.new
592
+ end
593
+
594
+ let(:document) do
595
+ Rating.find_or_initialize_by(ratable: movie)
596
+ end
597
+
598
+ it 'sets the polymorphic id' do
599
+ expect(document.ratable_id).to eq(movie.id)
600
+ end
601
+
602
+ it 'sets the type field' do
603
+ expect(document.ratable_type).to eq('Movie')
604
+ end
605
+ end
503
606
  end
504
607
 
505
608
  describe "first_or_create" do
@@ -649,7 +752,7 @@ describe Mongoid::Criteria::Modifiable do
649
752
  band = Band.create
650
753
  Mongoid::Criteria.new(Record) do |criteria|
651
754
  criteria.embedded = true
652
- criteria.metadata = Band.reflect_on_association(:records)
755
+ criteria.association = Band.reflect_on_association(:records)
653
756
  criteria.parent_document = band
654
757
  criteria.selector = { "records" => { "producers"=>{"$in"=>["nonexistent"] } } }
655
758
  end
@@ -703,6 +806,29 @@ describe Mongoid::Criteria::Modifiable do
703
806
  end
704
807
  end
705
808
 
809
+ context 'when the object is polymorphic' do
810
+
811
+ let(:movie) do
812
+ Movie.new
813
+ end
814
+
815
+ let(:criteria) do
816
+ Rating.where(ratable: movie)
817
+ end
818
+
819
+ let(:document) do
820
+ criteria.first_or_create
821
+ end
822
+
823
+ it 'sets the polymorphic id' do
824
+ expect(document.ratable_id).to eq(movie.id)
825
+ end
826
+
827
+ it 'sets the type field' do
828
+ expect(document.ratable_type).to eq('Movie')
829
+ end
830
+ end
831
+
706
832
  context "when a block is provided" do
707
833
 
708
834
  let(:document) do
@@ -919,6 +1045,29 @@ describe Mongoid::Criteria::Modifiable do
919
1045
  end
920
1046
  end
921
1047
  end
1048
+
1049
+ context 'when the object is polymorphic' do
1050
+
1051
+ let(:movie) do
1052
+ Movie.new
1053
+ end
1054
+
1055
+ let(:criteria) do
1056
+ Rating.where(ratable: movie)
1057
+ end
1058
+
1059
+ let(:document) do
1060
+ criteria.first_or_create!
1061
+ end
1062
+
1063
+ it 'sets the polymorphic id' do
1064
+ expect(document.ratable_id).to eq(movie.id)
1065
+ end
1066
+
1067
+ it 'sets the type field' do
1068
+ expect(document.ratable_type).to eq('Movie')
1069
+ end
1070
+ end
922
1071
  end
923
1072
 
924
1073
  describe "first_or_initialize" do
@@ -938,6 +1087,29 @@ describe Mongoid::Criteria::Modifiable do
938
1087
  end
939
1088
  end
940
1089
 
1090
+ context 'when the object is polymorphic' do
1091
+
1092
+ let(:movie) do
1093
+ Movie.new
1094
+ end
1095
+
1096
+ let(:criteria) do
1097
+ Rating.where(ratable: movie)
1098
+ end
1099
+
1100
+ let(:document) do
1101
+ criteria.first_or_initialize
1102
+ end
1103
+
1104
+ it 'sets the polymorphic id' do
1105
+ expect(document.ratable_id).to eq(movie.id)
1106
+ end
1107
+
1108
+ it 'sets the type field' do
1109
+ expect(document.ratable_type).to eq('Movie')
1110
+ end
1111
+ end
1112
+
941
1113
  context "when the document is not found" do
942
1114
 
943
1115
  context "when attributes are provided" do
@@ -1471,15 +1643,11 @@ describe Mongoid::Criteria::Modifiable do
1471
1643
  { 'username' => 'Turnip' }
1472
1644
  end
1473
1645
 
1474
- it 'does not modify the selector' do
1475
- expect(Person.create_with(attrs).selector[:username]).to be_nil
1476
- end
1477
-
1478
- it 'create_attrs is modified' do
1479
- expect(Person.create_with(attrs).create_attrs).to eq(attrs)
1646
+ it 'returns a criteria with the defined attributes' do
1647
+ expect(Person.create_with(attrs).selector).to eq(attrs)
1480
1648
  end
1481
1649
 
1482
- context 'when a create is chained' do
1650
+ context 'when a method is chained' do
1483
1651
 
1484
1652
  context 'when a write method is chained' do
1485
1653
 
@@ -1503,25 +1671,6 @@ describe Mongoid::Criteria::Modifiable do
1503
1671
  expect(new_person.age).to eq(50)
1504
1672
  end
1505
1673
 
1506
- context 'when a matching document is already in the collection' do
1507
- let(:query) do
1508
- { 'username' => 'foo', 'age' => 12 }
1509
- end
1510
-
1511
- let(:person) do
1512
- Person.create!(query)
1513
- end
1514
-
1515
- let(:found_person) do
1516
- Person.create_with(attrs).find_or_create_by(query)
1517
- end
1518
-
1519
- it 'finds the matching document' do
1520
- person
1521
- expect(found_person.id).to eq(person.id)
1522
- end
1523
- end
1524
-
1525
1674
  context 'when the attributes are shared with the write method args' do
1526
1675
 
1527
1676
  let(:query) do
@@ -1532,7 +1681,7 @@ describe Mongoid::Criteria::Modifiable do
1532
1681
  Person.create_with(attrs).find_or_create_by(query)
1533
1682
  end
1534
1683
 
1535
- it 'gives the find method args precedence' do
1684
+ it 'gives the write method args precedence' do
1536
1685
  expect(new_person.username).to eq('Beet')
1537
1686
  expect(new_person.age).to eq(50)
1538
1687
  end
@@ -1559,12 +1708,8 @@ describe Mongoid::Criteria::Modifiable do
1559
1708
  { 'username' => 'Beet', 'age' => 50 }
1560
1709
  end
1561
1710
 
1562
- it 'does not modify the selector' do
1563
- expect(criteria.create_with(attrs).selector).to eq(criteria_selector)
1564
- end
1565
-
1566
1711
  it 'overwrites all the original attributes' do
1567
- expect(criteria.create_with(attrs).create_attrs).to eq(attrs)
1712
+ expect(criteria.create_with(attrs).selector).to eq(attrs)
1568
1713
  end
1569
1714
  end
1570
1715
  end
@@ -1575,12 +1720,8 @@ describe Mongoid::Criteria::Modifiable do
1575
1720
  { 'username' => 'Beet' }
1576
1721
  end
1577
1722
 
1578
- it 'does not modify the selector' do
1579
- expect(criteria.create_with(attrs).selector).to eq(criteria_selector)
1580
- end
1581
-
1582
1723
  it 'only overwrites the shared attributes' do
1583
- expect(criteria.create_with(attrs).create_attrs).to eq(attrs)
1724
+ expect(criteria.create_with(attrs).selector).to eq(criteria_selector.merge!(attrs))
1584
1725
  end
1585
1726
  end
1586
1727
 
@@ -1589,11 +1730,12 @@ describe Mongoid::Criteria::Modifiable do
1589
1730
  let(:attrs) do
1590
1731
  { 'username' => 'Turnip' }
1591
1732
  end
1733
+
1592
1734
  let(:query) do
1593
1735
  { 'username' => 'Beet', 'age' => 50 }
1594
1736
  end
1595
1737
 
1596
- context 'when a create method is chained' do
1738
+ context 'when a write method is chained' do
1597
1739
 
1598
1740
  it 'executes the method' do
1599
1741
  expect(criteria.create_with(attrs).new.username).to eq('Turnip')
@@ -1607,28 +1749,9 @@ describe Mongoid::Criteria::Modifiable do
1607
1749
  criteria.create_with(attrs).find_or_create_by(query)
1608
1750
  end
1609
1751
 
1610
- it 'gives the find method arg precedence' do
1752
+ it 'executes the query' do
1611
1753
  expect(new_person.username).to eq('Beet')
1612
- expect(new_person.age).to be(50)
1613
- end
1614
-
1615
- context 'when a matching document is already in the collection' do
1616
- let(:query) do
1617
- { 'username' => 'foo', 'age' => 12 }
1618
- end
1619
-
1620
- let(:person) do
1621
- Person.create!(query)
1622
- end
1623
-
1624
- let(:found_person) do
1625
- criteria.create_with(attrs).find_or_create_by(query)
1626
- end
1627
-
1628
- it 'finds the matching document' do
1629
- person
1630
- expect(found_person.id).to eq(person.id)
1631
- end
1754
+ expect(new_person.age).to eq(50)
1632
1755
  end
1633
1756
  end
1634
1757
  end
@@ -7,7 +7,7 @@ describe BigDecimal do
7
7
  context "when provided a big decimal" do
8
8
 
9
9
  let(:big_decimal) do
10
- BigDecimal.new("123456.789")
10
+ BigDecimal("123456.789")
11
11
  end
12
12
 
13
13
  it "returns the decimal as a string" do
@@ -25,11 +25,11 @@ describe BigDecimal do
25
25
  context "when provided an array of big decimals" do
26
26
 
27
27
  let(:bd_one) do
28
- BigDecimal.new("123456.789")
28
+ BigDecimal("123456.789")
29
29
  end
30
30
 
31
31
  let(:bd_two) do
32
- BigDecimal.new("123333.789")
32
+ BigDecimal("123333.789")
33
33
  end
34
34
 
35
35
  let(:array) do
@@ -66,6 +66,49 @@ describe String do
66
66
  expect(evolved).to eq(Time.new(2010, 1, 1, 11, 0, 0, 0).utc)
67
67
  end
68
68
  end
69
+
70
+ context "when the string without timezone" do
71
+
72
+ context "when using active support's time zone" do
73
+
74
+ before do
75
+ Mongoid.use_activesupport_time_zone = true
76
+ ::Time.zone = "Tokyo"
77
+ end
78
+
79
+ let(:date) do
80
+ "2010-01-01 5:00:00"
81
+ end
82
+
83
+ let(:evolved) do
84
+ date.__evolve_time__
85
+ end
86
+
87
+ it "parses string using active support's time zone" do
88
+ expect(evolved).to eq(Time.zone.parse(date).utc)
89
+ end
90
+ end
91
+
92
+ context "when not using active support's time zone" do
93
+
94
+ before do
95
+ Mongoid.use_activesupport_time_zone = false
96
+ ::Time.zone = nil
97
+ end
98
+
99
+ let(:date) do
100
+ "2010-01-01 5:00:00"
101
+ end
102
+
103
+ let(:evolved) do
104
+ date.__evolve_time__
105
+ end
106
+
107
+ it "parses string using system time zone" do
108
+ expect(evolved).to eq(Time.parse(date).utc)
109
+ end
110
+ end
111
+ end
69
112
  end
70
113
 
71
114
  describe "#__sort_option__" do
@@ -196,5 +196,17 @@ describe Mongoid::Criteria::Queryable::Pipeline do
196
196
  end
197
197
  end
198
198
  end
199
+
200
+ context "when provided a hash" do
201
+ before do
202
+ pipeline.unwind(path: "$author", "includeArrayIndex" => "author_index", preserveNullAndEmptyArrays: true)
203
+ end
204
+
205
+ it "sets the hash" do
206
+ expect(pipeline).to eq([
207
+ { "$unwind" => { path: "$author", "includeArrayIndex" => "author_index", preserveNullAndEmptyArrays: true } }
208
+ ])
209
+ end
210
+ end
199
211
  end
200
212
  end
@@ -1073,6 +1073,26 @@ describe Mongoid::Criteria::Queryable::Selectable do
1073
1073
  })
1074
1074
  end
1075
1075
 
1076
+ context "when used with the $box operator ($geoWithin query) " do
1077
+ let(:selection) do
1078
+ query.geo_spacial(
1079
+ :location.within_box => [[ 1, 10 ], [ 2, 10 ]]
1080
+ )
1081
+ end
1082
+
1083
+ it "adds the $geoIntersects expression" do
1084
+ expect(selection.selector).to eq({
1085
+ "location" => {
1086
+ "$geoWithin" => {
1087
+ "$box" => [
1088
+ [ 1, 10 ], [ 2, 10 ]
1089
+ ]
1090
+ }
1091
+ }
1092
+ })
1093
+ end
1094
+ end
1095
+
1076
1096
  it_behaves_like "a cloning selection"
1077
1097
  end
1078
1098
  end
@@ -3369,7 +3389,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
3369
3389
  end
3370
3390
 
3371
3391
  it "constructs a text search document" do
3372
- expect(selection.selector).to eq({ :$text => { :$search => "testing" }})
3392
+ expect(selection.selector).to eq({ '$text' => { '$search' => "testing" }})
3373
3393
  end
3374
3394
 
3375
3395
  it "returns the cloned selectable" do
@@ -3383,16 +3403,35 @@ describe Mongoid::Criteria::Queryable::Selectable do
3383
3403
  end
3384
3404
 
3385
3405
  it "constructs a text search document" do
3386
- expect(selection.selector[:$text][:$search]).to eq("essais")
3406
+ expect(selection.selector['$text']['$search']).to eq("essais")
3387
3407
  end
3388
3408
 
3389
3409
  it "add the options to the text search document" do
3390
- expect(selection.selector[:$text][:$language]).to eq("fr")
3410
+ expect(selection.selector['$text'][:$language]).to eq("fr")
3391
3411
  end
3392
3412
 
3393
3413
  it_behaves_like "a cloning selection"
3394
3414
  end
3395
3415
  end
3416
+
3417
+ context 'when given more than once' do
3418
+ let(:selection) do
3419
+ query.text_search("one").text_search('two')
3420
+ end
3421
+
3422
+ # MongoDB server can only handle one text expression at a time,
3423
+ # per https://docs.mongodb.com/manual/reference/operator/query/text/.
3424
+ # Nonetheless we test that the query is built correctly when
3425
+ # a user supplies more than one text condition.
3426
+ it 'merges conditions' do
3427
+ expect(Mongoid.logger).to receive(:warn)
3428
+ expect(selection.selector).to eq('$and' => [
3429
+ {'$text' => {'$search' => 'one'}}
3430
+ ],
3431
+ '$text' => {'$search' => 'two'},
3432
+ )
3433
+ end
3434
+ end
3396
3435
  end
3397
3436
 
3398
3437
  describe "#where" do
@@ -370,11 +370,11 @@ describe Mongoid::Criteria::Queryable::Selector do
370
370
  context "when providing an array" do
371
371
 
372
372
  let(:big_one) do
373
- BigDecimal.new("1.2321")
373
+ BigDecimal("1.2321")
374
374
  end
375
375
 
376
376
  let(:big_two) do
377
- BigDecimal.new("4.2222")
377
+ BigDecimal("4.2222")
378
378
  end
379
379
 
380
380
  let(:array) do