mongoid 7.5.0 → 8.0.2

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 (358) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/lib/config/locales/en.yml +47 -30
  5. data/lib/mongoid/association/accessors.rb +38 -9
  6. data/lib/mongoid/association/bindable.rb +50 -2
  7. data/lib/mongoid/association/builders.rb +4 -2
  8. data/lib/mongoid/association/constrainable.rb +0 -1
  9. data/lib/mongoid/association/eager_loadable.rb +29 -7
  10. data/lib/mongoid/association/embedded/batchable.rb +53 -13
  11. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  12. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  13. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -2
  14. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  15. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  16. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  17. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +50 -28
  18. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  19. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  20. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +23 -4
  21. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  22. data/lib/mongoid/association/macros.rb +2 -1
  23. data/lib/mongoid/association/many.rb +11 -7
  24. data/lib/mongoid/association/nested/many.rb +5 -4
  25. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  26. data/lib/mongoid/association/nested/one.rb +5 -5
  27. data/lib/mongoid/association/one.rb +2 -2
  28. data/lib/mongoid/association/options.rb +9 -9
  29. data/lib/mongoid/association/proxy.rb +14 -3
  30. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  31. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  32. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  33. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  34. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  35. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  36. data/lib/mongoid/association/referenced/eager.rb +2 -2
  37. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +66 -13
  38. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  39. data/lib/mongoid/association/referenced/has_many/enumerable.rb +20 -28
  40. data/lib/mongoid/association/referenced/has_many/proxy.rb +24 -18
  41. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  42. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  43. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  44. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  45. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  46. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  47. data/lib/mongoid/association/reflections.rb +2 -2
  48. data/lib/mongoid/association/relatable.rb +44 -10
  49. data/lib/mongoid/association.rb +5 -5
  50. data/lib/mongoid/atomic/modifiers.rb +2 -2
  51. data/lib/mongoid/atomic/paths/embedded/many.rb +19 -0
  52. data/lib/mongoid/attributes/dynamic.rb +3 -3
  53. data/lib/mongoid/attributes/nested.rb +5 -5
  54. data/lib/mongoid/attributes/processing.rb +10 -3
  55. data/lib/mongoid/attributes/projector.rb +1 -1
  56. data/lib/mongoid/attributes/readonly.rb +2 -2
  57. data/lib/mongoid/attributes.rb +43 -40
  58. data/lib/mongoid/changeable.rb +42 -7
  59. data/lib/mongoid/clients/options.rb +5 -1
  60. data/lib/mongoid/clients/sessions.rb +2 -14
  61. data/lib/mongoid/clients/validators/storage.rb +3 -3
  62. data/lib/mongoid/config/validators/client.rb +6 -6
  63. data/lib/mongoid/config.rb +27 -17
  64. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  65. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  66. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  67. data/lib/mongoid/contextual/atomic.rb +1 -1
  68. data/lib/mongoid/contextual/geo_near.rb +7 -7
  69. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  70. data/lib/mongoid/contextual/memory.rb +59 -32
  71. data/lib/mongoid/contextual/mongo.rb +184 -256
  72. data/lib/mongoid/contextual/none.rb +34 -16
  73. data/lib/mongoid/contextual/queryable.rb +1 -1
  74. data/lib/mongoid/contextual.rb +2 -2
  75. data/lib/mongoid/copyable.rb +32 -8
  76. data/lib/mongoid/criteria/findable.rb +7 -4
  77. data/lib/mongoid/criteria/includable.rb +24 -20
  78. data/lib/mongoid/criteria/marshalable.rb +10 -2
  79. data/lib/mongoid/criteria/permission.rb +1 -1
  80. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  81. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -15
  82. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  83. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  84. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  85. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  86. data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -16
  87. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  88. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  89. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  90. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  91. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  92. data/lib/mongoid/criteria/queryable/extensions/string.rb +3 -3
  93. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -2
  94. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  95. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  96. data/lib/mongoid/criteria/queryable/key.rb +3 -3
  97. data/lib/mongoid/criteria/queryable/optional.rb +5 -11
  98. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  99. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  100. data/lib/mongoid/criteria/queryable/selectable.rb +5 -27
  101. data/lib/mongoid/criteria/queryable/selector.rb +92 -7
  102. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  103. data/lib/mongoid/criteria/queryable.rb +12 -7
  104. data/lib/mongoid/criteria/scopable.rb +2 -2
  105. data/lib/mongoid/criteria.rb +15 -37
  106. data/lib/mongoid/deprecable.rb +36 -0
  107. data/lib/mongoid/deprecation.rb +25 -0
  108. data/lib/mongoid/document.rb +98 -36
  109. data/lib/mongoid/equality.rb +12 -12
  110. data/lib/mongoid/errors/document_not_found.rb +10 -6
  111. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  112. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  113. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  114. data/lib/mongoid/errors/invalid_field.rb +6 -2
  115. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  116. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  117. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  118. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  119. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  120. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  121. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  122. data/lib/mongoid/errors/no_client_database.rb +1 -1
  123. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  124. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  125. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  126. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  127. data/lib/mongoid/errors.rb +2 -2
  128. data/lib/mongoid/extensions/array.rb +9 -7
  129. data/lib/mongoid/extensions/big_decimal.rb +29 -10
  130. data/lib/mongoid/extensions/binary.rb +42 -0
  131. data/lib/mongoid/extensions/boolean.rb +8 -2
  132. data/lib/mongoid/extensions/date.rb +26 -20
  133. data/lib/mongoid/extensions/date_time.rb +1 -1
  134. data/lib/mongoid/extensions/false_class.rb +1 -1
  135. data/lib/mongoid/extensions/float.rb +4 -5
  136. data/lib/mongoid/extensions/hash.rb +13 -6
  137. data/lib/mongoid/extensions/integer.rb +4 -5
  138. data/lib/mongoid/extensions/module.rb +1 -1
  139. data/lib/mongoid/extensions/object.rb +8 -6
  140. data/lib/mongoid/extensions/range.rb +41 -10
  141. data/lib/mongoid/extensions/regexp.rb +11 -4
  142. data/lib/mongoid/extensions/set.rb +11 -4
  143. data/lib/mongoid/extensions/string.rb +11 -22
  144. data/lib/mongoid/extensions/symbol.rb +4 -15
  145. data/lib/mongoid/extensions/time.rb +27 -16
  146. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  147. data/lib/mongoid/extensions/true_class.rb +1 -1
  148. data/lib/mongoid/extensions.rb +1 -0
  149. data/lib/mongoid/factory.rb +42 -7
  150. data/lib/mongoid/fields/foreign_key.rb +11 -4
  151. data/lib/mongoid/fields/localized.rb +2 -2
  152. data/lib/mongoid/fields/standard.rb +7 -7
  153. data/lib/mongoid/fields/validators/macro.rb +3 -9
  154. data/lib/mongoid/fields.rb +57 -15
  155. data/lib/mongoid/findable.rb +28 -22
  156. data/lib/mongoid/indexable/specification.rb +2 -2
  157. data/lib/mongoid/indexable/validators/options.rb +6 -2
  158. data/lib/mongoid/interceptable.rb +73 -13
  159. data/lib/mongoid/matchable.rb +1 -1
  160. data/lib/mongoid/matcher.rb +12 -7
  161. data/lib/mongoid/persistable/creatable.rb +18 -9
  162. data/lib/mongoid/persistable/deletable.rb +1 -1
  163. data/lib/mongoid/persistable/destroyable.rb +1 -1
  164. data/lib/mongoid/persistable/savable.rb +2 -2
  165. data/lib/mongoid/persistable/unsettable.rb +1 -1
  166. data/lib/mongoid/persistable/updatable.rb +19 -12
  167. data/lib/mongoid/persistable/upsertable.rb +1 -1
  168. data/lib/mongoid/persistable.rb +3 -3
  169. data/lib/mongoid/persistence_context.rb +22 -5
  170. data/lib/mongoid/query_cache.rb +8 -260
  171. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  172. data/lib/mongoid/reloadable.rb +7 -3
  173. data/lib/mongoid/scopable.rb +17 -15
  174. data/lib/mongoid/selectable.rb +1 -2
  175. data/lib/mongoid/serializable.rb +10 -6
  176. data/lib/mongoid/stateful.rb +35 -9
  177. data/lib/mongoid/tasks/database.rb +0 -2
  178. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  179. data/lib/mongoid/threaded.rb +9 -9
  180. data/lib/mongoid/timestamps/created.rb +1 -1
  181. data/lib/mongoid/timestamps/updated.rb +2 -2
  182. data/lib/mongoid/touchable.rb +2 -3
  183. data/lib/mongoid/traversable.rb +4 -3
  184. data/lib/mongoid/validatable/localizable.rb +1 -1
  185. data/lib/mongoid/validatable/macros.rb +0 -2
  186. data/lib/mongoid/validatable/presence.rb +2 -2
  187. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  188. data/lib/mongoid/validatable.rb +6 -6
  189. data/lib/mongoid/version.rb +1 -1
  190. data/lib/mongoid/warnings.rb +3 -4
  191. data/lib/mongoid.rb +1 -0
  192. data/spec/config/mongoid.yml +16 -0
  193. data/spec/integration/app_spec.rb +8 -12
  194. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  195. data/spec/integration/associations/embedded_spec.rb +15 -0
  196. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  197. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  198. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  199. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  200. data/spec/integration/associations/has_one_spec.rb +97 -1
  201. data/spec/integration/associations/scope_option_spec.rb +1 -1
  202. data/spec/integration/callbacks_models.rb +95 -1
  203. data/spec/integration/callbacks_spec.rb +226 -4
  204. data/spec/integration/criteria/range_spec.rb +95 -1
  205. data/spec/integration/discriminator_key_spec.rb +115 -76
  206. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  207. data/spec/integration/i18n_fallbacks_spec.rb +1 -15
  208. data/spec/integration/matcher_examples_spec.rb +20 -13
  209. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  210. data/spec/integration/matcher_operator_spec.rb +3 -5
  211. data/spec/integration/persistence/range_field_spec.rb +350 -0
  212. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  213. data/spec/mongoid/association/depending_spec.rb +9 -9
  214. data/spec/mongoid/association/eager_spec.rb +2 -1
  215. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  216. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  217. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  218. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  219. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +219 -8
  220. data/spec/mongoid/association/embedded/embeds_many_models.rb +157 -0
  221. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  222. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  223. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  224. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  225. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  226. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  227. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  228. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  229. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  230. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  231. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +67 -4
  232. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  233. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  234. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  235. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  236. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +82 -13
  237. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  238. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  239. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  240. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  241. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  242. data/spec/mongoid/association/syncable_spec.rb +14 -0
  243. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  244. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  245. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  246. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  247. data/spec/mongoid/attributes_spec.rb +524 -27
  248. data/spec/mongoid/changeable_spec.rb +130 -13
  249. data/spec/mongoid/clients/factory_spec.rb +23 -30
  250. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  251. data/spec/mongoid/clients_spec.rb +32 -2
  252. data/spec/mongoid/config_spec.rb +58 -13
  253. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  254. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  255. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  256. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  257. data/spec/mongoid/contextual/memory_spec.rb +521 -14
  258. data/spec/mongoid/contextual/mongo_spec.rb +564 -394
  259. data/spec/mongoid/contextual/none_spec.rb +11 -19
  260. data/spec/mongoid/copyable_spec.rb +451 -1
  261. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  262. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  263. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  264. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  265. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  266. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  267. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  268. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  269. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  270. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  271. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  272. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  273. data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
  274. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  275. data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
  276. data/spec/mongoid/criteria/queryable/selector_spec.rb +14 -2
  277. data/spec/mongoid/criteria_spec.rb +469 -1201
  278. data/spec/mongoid/document_fields_spec.rb +173 -24
  279. data/spec/mongoid/document_spec.rb +32 -41
  280. data/spec/mongoid/equality_spec.rb +12 -12
  281. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  282. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  283. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  284. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  285. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  286. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  287. data/spec/mongoid/extensions/array_spec.rb +16 -2
  288. data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
  289. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  290. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  291. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  292. data/spec/mongoid/extensions/date_spec.rb +71 -1
  293. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  294. data/spec/mongoid/extensions/float_spec.rb +48 -76
  295. data/spec/mongoid/extensions/hash_spec.rb +30 -0
  296. data/spec/mongoid/extensions/integer_spec.rb +45 -66
  297. data/spec/mongoid/extensions/range_spec.rb +255 -54
  298. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  299. data/spec/mongoid/extensions/set_spec.rb +106 -0
  300. data/spec/mongoid/extensions/string_spec.rb +53 -25
  301. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  302. data/spec/mongoid/extensions/time_spec.rb +634 -66
  303. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  304. data/spec/mongoid/factory_spec.rb +61 -1
  305. data/spec/mongoid/fields_spec.rb +321 -50
  306. data/spec/mongoid/findable_spec.rb +64 -29
  307. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  308. data/spec/mongoid/indexable_spec.rb +39 -20
  309. data/spec/mongoid/interceptable_spec.rb +584 -5
  310. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  311. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  312. data/spec/mongoid/mongoizable_spec.rb +285 -0
  313. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  314. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  315. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  316. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  317. data/spec/mongoid/persistence_context_spec.rb +50 -1
  318. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  319. data/spec/mongoid/query_cache_spec.rb +0 -154
  320. data/spec/mongoid/reloadable_spec.rb +35 -2
  321. data/spec/mongoid/scopable_spec.rb +54 -16
  322. data/spec/mongoid/shardable_spec.rb +14 -0
  323. data/spec/mongoid/stateful_spec.rb +28 -0
  324. data/spec/mongoid/timestamps_spec.rb +390 -0
  325. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  326. data/spec/mongoid/touchable_spec.rb +116 -0
  327. data/spec/mongoid/touchable_spec_models.rb +12 -8
  328. data/spec/mongoid/traversable_spec.rb +4 -11
  329. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  330. data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
  331. data/spec/mongoid/warnings_spec.rb +35 -0
  332. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  333. data/spec/rails/mongoid_spec.rb +4 -16
  334. data/spec/shared/lib/mrss/event_subscriber.rb +5 -15
  335. data/spec/support/constraints.rb +24 -0
  336. data/spec/support/macros.rb +30 -0
  337. data/spec/support/models/augmentation.rb +12 -0
  338. data/spec/support/models/band.rb +3 -0
  339. data/spec/support/models/catalog.rb +24 -0
  340. data/spec/support/models/circus.rb +3 -0
  341. data/spec/support/models/fanatic.rb +8 -0
  342. data/spec/support/models/implant.rb +9 -0
  343. data/spec/support/models/label.rb +2 -0
  344. data/spec/support/models/passport.rb +9 -0
  345. data/spec/support/models/person.rb +1 -0
  346. data/spec/support/models/player.rb +2 -0
  347. data/spec/support/models/powerup.rb +12 -0
  348. data/spec/support/models/registry.rb +1 -0
  349. data/spec/support/models/school.rb +14 -0
  350. data/spec/support/models/shield.rb +18 -0
  351. data/spec/support/models/student.rb +14 -0
  352. data/spec/support/models/weapon.rb +12 -0
  353. data.tar.gz.sig +0 -0
  354. metadata +49 -13
  355. metadata.gz.sig +0 -0
  356. data/lib/mongoid/errors/eager_load.rb +0 -23
  357. data/lib/mongoid/errors/invalid_value.rb +0 -17
  358. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -118,7 +118,7 @@ module Mongoid
118
118
  #
119
119
  # @note Only relevant for polymorphic associations.
120
120
  #
121
- # @return [ String, nil ] The type field.
121
+ # @return [ String | nil ] The type field.
122
122
  def type
123
123
  @type ||= "#{as}_type" if polymorphic?
124
124
  end
@@ -140,7 +140,7 @@ module Mongoid
140
140
 
141
141
  # Is this association polymorphic?
142
142
  #
143
- # @return [ true, false ] Whether this association is polymorphic.
143
+ # @return [ true | false ] Whether this association is polymorphic.
144
144
  def polymorphic?
145
145
  @polymorphic ||= !!as
146
146
  end
@@ -150,7 +150,7 @@ module Mongoid
150
150
  #
151
151
  # @param [ Document ] doc The document to be bound.
152
152
  #
153
- # @return [ true, false ] Whether the document can be bound.
153
+ # @return [ true | false ] Whether the document can be bound.
154
154
  def bindable?(doc)
155
155
  forced_nil_inverse? || (!!inverse && doc.fields.keys.include?(foreign_key))
156
156
  end
@@ -53,7 +53,7 @@ module Mongoid
53
53
  end
54
54
 
55
55
  def execute_query(object, base)
56
- query_criteria(object, base).limit(1).first(id_sort: :none)
56
+ query_criteria(object, base).take
57
57
  end
58
58
 
59
59
  def with_polymorphic_criterion(criteria, base)
@@ -60,7 +60,7 @@ module Mongoid
60
60
  # @example Is the id acceptable?
61
61
  # one.acceptable_id?
62
62
  #
63
- # @return [ true, false ] If the id part of the logic will allow an update.
63
+ # @return [ true | false ] If the id part of the logic will allow an update.
64
64
  def acceptable_id?
65
65
  id = convert_id(existing.class, attributes[:_id])
66
66
  existing._id == id || id.nil? || (existing._id != id && update_only?)
@@ -71,7 +71,7 @@ module Mongoid
71
71
  # @example Can the existing object be deleted?
72
72
  # one.delete?
73
73
  #
74
- # @return [ true, false ] If the association should be deleted.
74
+ # @return [ true | false ] If the association should be deleted.
75
75
  def delete?
76
76
  destroyable? && !attributes[:_id].nil?
77
77
  end
@@ -81,7 +81,7 @@ module Mongoid
81
81
  # @example Is the object destroyable?
82
82
  # one.destroyable?({ :_destroy => "1" })
83
83
  #
84
- # @return [ true, false ] If the association can potentially be
84
+ # @return [ true | false ] If the association can potentially be
85
85
  # destroyed.
86
86
  def destroyable?
87
87
  [ 1, "1", true, "true" ].include?(destroy) && allow_destroy?
@@ -92,7 +92,7 @@ module Mongoid
92
92
  # @example Is the document to be replaced?
93
93
  # one.replace?
94
94
  #
95
- # @return [ true, false ] If the document should be replaced.
95
+ # @return [ true | false ] If the document should be replaced.
96
96
  def replace?
97
97
  !existing && !destroyable? && !attributes.blank?
98
98
  end
@@ -102,7 +102,7 @@ module Mongoid
102
102
  # @example Should the document be updated?
103
103
  # one.update?
104
104
  #
105
- # @return [ true, false ] If the object should have its attributes updated.
105
+ # @return [ true | false ] If the object should have its attributes updated.
106
106
  def update?
107
107
  existing && !destroyable? && acceptable_id?
108
108
  end
@@ -49,17 +49,14 @@ module Mongoid
49
49
  #
50
50
  # @return [ One ] The association.
51
51
  def substitute(replacement)
52
- # If the same object currently associated is being assigned,
53
- # rebind the association and save the target but do not destroy
54
- # the target.
55
-
56
- unbind_one
57
- if persistable?
58
- # TODO can this entire method be skipped if self == replacement?
59
- if _association.destructive? && self != replacement
60
- send(_association.dependent)
61
- else
62
- save if persisted?
52
+ if self != replacement
53
+ unbind_one
54
+ if persistable?
55
+ if _association.destructive?
56
+ send(_association.dependent)
57
+ else
58
+ save if persisted?
59
+ end
63
60
  end
64
61
  end
65
62
  HasOne::Proxy.new(_base, replacement, _association) if replacement
@@ -82,7 +79,7 @@ module Mongoid
82
79
  # @example Can we persist the association?
83
80
  # relation.persistable?
84
81
  #
85
- # @return [ true, false ] If the association is persistable.
82
+ # @return [ true | false ] If the association is persistable.
86
83
  def persistable?
87
84
  _base.persisted? && !_binding? && !_building?
88
85
  end
@@ -92,7 +92,7 @@ module Mongoid
92
92
 
93
93
  # Is this association polymorphic?
94
94
  #
95
- # @return [ true, false ] Whether this association is polymorphic.
95
+ # @return [ true | false ] Whether this association is polymorphic.
96
96
  def polymorphic?
97
97
  @polymorphic ||= !!as
98
98
  end
@@ -101,7 +101,7 @@ module Mongoid
101
101
  #
102
102
  # @note Only relevant for polymorphic associations.
103
103
  #
104
- # @return [ String, nil ] The type field.
104
+ # @return [ String | nil ] The type field.
105
105
  def type
106
106
  @type ||= "#{as}_type" if polymorphic?
107
107
  end
@@ -111,7 +111,7 @@ module Mongoid
111
111
  #
112
112
  # @param [ Document ] doc The document to be bound.
113
113
  #
114
- # @return [ true, false ] Whether the document can be bound.
114
+ # @return [ true | false ] Whether the document can be bound.
115
115
  def bindable?(doc)
116
116
  forced_nil_inverse? || (!!inverse && doc.fields.keys.include?(foreign_key))
117
117
  end
@@ -16,7 +16,7 @@ module Mongoid
16
16
  #
17
17
  # @param [ Association ] association The association metadata.
18
18
  #
19
- # @return [ true, false ] If we can sync.
19
+ # @return [ true | false ] If we can sync.
20
20
  def _syncable?(association)
21
21
  !_synced?(association.foreign_key) && send(association.foreign_key_check)
22
22
  end
@@ -38,7 +38,7 @@ module Mongoid
38
38
  #
39
39
  # @param [ String ] foreign_key The foreign key.
40
40
  #
41
- # @return [ true, false ] If we can sync.
41
+ # @return [ true | false ] If we can sync.
42
42
  def _synced?(foreign_key)
43
43
  !!_synced[foreign_key]
44
44
  end
@@ -67,8 +67,8 @@ module Mongoid
67
67
  #
68
68
  # @return [ Object ] The updated values.
69
69
  def update_inverse_keys(association)
70
- if changes.has_key?(association.foreign_key)
71
- old, new = changes[association.foreign_key]
70
+ if previous_changes.has_key?(association.foreign_key)
71
+ old, new = previous_changes[association.foreign_key]
72
72
  adds, subs = new - (old || []), (old || []) - new
73
73
 
74
74
  # If we are autosaving we don't want a duplicate to get added - the
@@ -13,7 +13,7 @@ module Mongoid
13
13
  # @example Find association metadata by name.
14
14
  # person.reflect_on_association(:addresses)
15
15
  #
16
- # @param [ String, Symbol ] name The name of the association to find.
16
+ # @param [ String | Symbol ] name The name of the association to find.
17
17
  #
18
18
  # @return [ Association ] The matching association metadata.
19
19
  def reflect_on_association(name)
@@ -39,7 +39,7 @@ module Mongoid
39
39
  # @example Find association metadata by name.
40
40
  # Person.reflect_on_association(:addresses)
41
41
  #
42
- # @param [ String, Symbol ] name The name of the association to find.
42
+ # @param [ String | Symbol ] name The name of the association to find.
43
43
  #
44
44
  # @return [ Association ] The matching association metadata.
45
45
  def reflect_on_association(name)
@@ -69,7 +69,7 @@ module Mongoid
69
69
  #
70
70
  # @param [ Symbol ] callback_type The type of callback type.
71
71
  #
72
- # @return [ Array<Proc, Symbol> ] A list of the callbacks, either method
72
+ # @return [ Array<Proc | Symbol> ] A list of the callbacks, either method
73
73
  # names or Procs.
74
74
  def get_callbacks(callback_type)
75
75
  Array(options[callback_type])
@@ -88,7 +88,7 @@ module Mongoid
88
88
  #
89
89
  # @param [ Document ] doc The document to be bound.
90
90
  #
91
- # @return [ true, false ] Whether the document can be bound.
91
+ # @return [ true | false ] Whether the document can be bound.
92
92
  def bindable?(doc); false; end
93
93
 
94
94
  # Get the inverse names.
@@ -189,7 +189,7 @@ module Mongoid
189
189
  # The foreign key field if this association stores a foreign key.
190
190
  # Otherwise, the primary key.
191
191
  #
192
- # @return [ Symbol, String ] The primary key.
192
+ # @return [ Symbol | String ] The primary key.
193
193
  def key
194
194
  stores_foreign_key? ? foreign_key : primary_key
195
195
  end
@@ -242,13 +242,13 @@ module Mongoid
242
242
  #
243
243
  # @return [ String ] The foreign key check.
244
244
  def foreign_key_check
245
- @foreign_key_check ||= "#{foreign_key}_changed?" if (stores_foreign_key? && foreign_key)
245
+ @foreign_key_check ||= "#{foreign_key}_previously_changed?" if (stores_foreign_key? && foreign_key)
246
246
  end
247
247
 
248
248
  # Create an association proxy object using the owner and target.
249
249
  #
250
250
  # @param [ Document ] owner The document this association hangs off of.
251
- # @param [ Document, Array<Document> ] target The target (parent) of the
251
+ # @param [ Document | Array<Document> ] target The target (parent) of the
252
252
  # association.
253
253
  #
254
254
  # @return [ Proxy ]
@@ -258,7 +258,7 @@ module Mongoid
258
258
 
259
259
  # Whether the dependent method is destructive.
260
260
  #
261
- # @return [ true, false ] If the dependent method is destructive.
261
+ # @return [ true | false ] If the dependent method is destructive.
262
262
  def destructive?
263
263
  @destructive ||= !!(dependent && (dependent == :delete_all || dependent == :destroy))
264
264
  end
@@ -289,7 +289,7 @@ module Mongoid
289
289
 
290
290
  # Whether the associated object(s) should be validated.
291
291
  #
292
- # @return [ true, false ] If the associated object(s)
292
+ # @return [ true | false ] If the associated object(s)
293
293
  # should be validated.
294
294
  def validate?
295
295
  @validate ||= if @options[:validate].nil?
@@ -299,6 +299,35 @@ module Mongoid
299
299
  end
300
300
  end
301
301
 
302
+ # @return [ Array<String> ] The associations above this one in the inclusion tree.
303
+ attr_accessor :parent_inclusions
304
+
305
+ def parent_inclusions
306
+ @parent_inclusions ||= []
307
+ end
308
+
309
+ # Is this association an embeds_many or has_many association?
310
+ #
311
+ # @return [ true | false ] true if it is a *_many association, false if not.
312
+ def many?
313
+ [Referenced::HasMany, Embedded::EmbedsMany].any? { |a| self.is_a?(a) }
314
+ end
315
+
316
+ # Is this association an embeds_one or has_one association?
317
+ #
318
+ # @return [ true | false ] true if it is a *_one association, false if not.
319
+ def one?
320
+ [Referenced::HasOne, Embedded::EmbedsOne].any? { |a| self.is_a?(a) }
321
+ end
322
+
323
+ # Is this association an embedded_in or belongs_to association?
324
+ #
325
+ # @return [ true | false ] true if it is an embedded_in or belongs_to
326
+ # association, false if not.
327
+ def in_to?
328
+ [Referenced::BelongsTo, Embedded::EmbeddedIn].any? { |a| self.is_a?(a) }
329
+ end
330
+
302
331
  private
303
332
 
304
333
  # Gets the model classes with inverse associations of this model. This is used to determine
@@ -404,10 +433,15 @@ module Mongoid
404
433
  def namespace_hierarchy(mod)
405
434
  parent = Object
406
435
  hier = [parent]
407
- mod.name.split('::').each do |part|
408
- parent = parent.const_get(part)
409
- hier << parent
436
+
437
+ # name is not present on anonymous modules
438
+ if mod.name
439
+ mod.name.split('::').each do |part|
440
+ parent = parent.const_get(part)
441
+ hier << parent
442
+ end
410
443
  end
444
+
411
445
  hier.reverse
412
446
  end
413
447
 
@@ -56,7 +56,7 @@ module Mongoid
56
56
  # @example Is the document embedded?
57
57
  # address.embedded?
58
58
  #
59
- # @return [ true, false ] True if the document has a parent document.
59
+ # @return [ true | false ] True if the document has a parent document.
60
60
  def embedded?
61
61
  @embedded ||= (cyclic ? _parent.present? : self.class.embedded?)
62
62
  end
@@ -66,7 +66,7 @@ module Mongoid
66
66
  # @example Is the document in an embeds many?
67
67
  # address.embedded_many?
68
68
  #
69
- # @return [ true, false ] True if in an embeds many.
69
+ # @return [ true | false ] True if in an embeds many.
70
70
  def embedded_many?
71
71
  _association && _association.is_a?(Association::Embedded::EmbedsMany)
72
72
  end
@@ -76,7 +76,7 @@ module Mongoid
76
76
  # @example Is the document in an embeds one?
77
77
  # address.embedded_one?
78
78
  #
79
- # @return [ true, false ] True if in an embeds one.
79
+ # @return [ true | false ] True if in an embeds one.
80
80
  def embedded_one?
81
81
  _association && _association.is_a?(Association::Embedded::EmbedsOne)
82
82
  end
@@ -100,7 +100,7 @@ module Mongoid
100
100
  # @example Is the document in a references many?
101
101
  # post.referenced_many?
102
102
  #
103
- # @return [ true, false ] True if in a references many.
103
+ # @return [ true | false ] True if in a references many.
104
104
  def referenced_many?
105
105
  _association && _association.is_a?(Association::Referenced::HasMany)
106
106
  end
@@ -110,7 +110,7 @@ module Mongoid
110
110
  # @example Is the document in a references one?
111
111
  # address.referenced_one?
112
112
  #
113
- # @return [ true, false ] True if in a references one.
113
+ # @return [ true | false ] True if in a references one.
114
114
  def referenced_one?
115
115
  _association && _association.is_a?(Association::Referenced::HasOne)
116
116
  end
@@ -153,7 +153,7 @@ module Mongoid
153
153
  #
154
154
  # @param [ String ] field The field.
155
155
  #
156
- # @return [ true, false ] If this field is a conflict.
156
+ # @return [ true | false ] If this field is a conflict.
157
157
  def set_conflict?(field)
158
158
  name = field.split(".", 2)[0]
159
159
  pull_fields.has_key?(name) || push_fields.has_key?(name)
@@ -166,7 +166,7 @@ module Mongoid
166
166
  #
167
167
  # @param [ String ] field The field.
168
168
  #
169
- # @return [ true, false ] If this field is a conflict.
169
+ # @return [ true | false ] If this field is a conflict.
170
170
  def push_conflict?(field)
171
171
  name = field.split(".", 2)[0]
172
172
  set_fields.has_key?(name) || pull_fields.has_key?(name) ||
@@ -34,6 +34,25 @@ module Mongoid
34
34
  locator = document.new_record? ? "" : ".#{document._index}"
35
35
  "#{pos}#{"." unless pos.blank?}#{document._association.store_as}#{locator}"
36
36
  end
37
+
38
+ class << self
39
+
40
+ # Get the position of where the document would go for the given
41
+ # association. The use case for this function is when trying to
42
+ # persist an empty list for an embedded association. All of the
43
+ # existing functions for getting the position to store a document
44
+ # require passing in a document to store, which we don't have when
45
+ # trying to store the empty list.
46
+ #
47
+ # @param [ Document ] parent The parent document to store in.
48
+ # @param [ Association ] association The association.
49
+ #
50
+ # @return [ String ] The position string.
51
+ def position_without_document(parent, association)
52
+ pos = parent.atomic_position
53
+ "#{pos}#{"." unless pos.blank?}#{association.store_as}"
54
+ end
55
+ end
37
56
  end
38
57
  end
39
58
  end
@@ -13,9 +13,9 @@ module Mongoid
13
13
  # person.respond_to?(:title)
14
14
  #
15
15
  # @param [ Array ] name The name of the method.
16
- # @param [ true, false ] include_private
16
+ # @param [ true | false ] include_private
17
17
  #
18
- # @return [ true, false ] True if it does, false if not.
18
+ # @return [ true | false ] True if it does, false if not.
19
19
  def respond_to?(name, include_private = false)
20
20
  super || (
21
21
  attributes &&
@@ -114,7 +114,7 @@ module Mongoid
114
114
  # @example Call through method_missing.
115
115
  # document.method_missing(:test)
116
116
  #
117
- # @param [ String, Symbol ] name The name of the method.
117
+ # @param [ String | Symbol ] name The name of the method.
118
118
  # @param [ Array ] args The arguments to the method.
119
119
  #
120
120
  # @return [ Object ] The result of the method call.
@@ -33,15 +33,15 @@ module Mongoid
33
33
  # accepts_nested_attributes_for :addresses, :game, :posts
34
34
  # end
35
35
  #
36
- # @param [ Array<Symbol>, Hash ] args A list of association names, followed
36
+ # @param [ Array<Symbol> | Hash ] args A list of association names, followed
37
37
  # by a hash of options.
38
38
  #
39
- # @option *args [ true, false ] :allow_destroy Can deletion occur?
40
- # @option *args [ Proc, Symbol ] :reject_if Block or symbol pointing
39
+ # @option *args [ true | false ] :allow_destroy Can deletion occur?
40
+ # @option *args [ Proc | Symbol ] :reject_if Block or symbol pointing
41
41
  # to a class method to reject documents with.
42
42
  # @option *args [ Integer ] :limit The max number to create.
43
- # @option *args [ true, false ] :update_only Only update existing docs.
44
- # @options *args [ true, false ] :autosave Whether autosave should be enabled on the
43
+ # @option *args [ true | false ] :update_only Only update existing docs.
44
+ # @option *args [ true | false ] :autosave Whether autosave should be enabled on the
45
45
  # association. Note that since the default is true, setting autosave to nil will still
46
46
  # enable it.
47
47
  def accepts_nested_attributes_for(*args)
@@ -40,14 +40,21 @@ module Mongoid
40
40
  # @param [ Symbol ] key The name of the attribute.
41
41
  # @param [ Object ] value The value of the attribute.
42
42
  #
43
- # @return [ true, false ] True if pending, false if not.
43
+ # @return [ true | false ] True if pending, false if not.
44
44
  def pending_attribute?(key, value)
45
45
  name = key.to_s
46
- if relations.has_key?(name)
46
+
47
+ aliased = if aliased_associations.key?(name)
48
+ aliased_associations[name]
49
+ else
50
+ name
51
+ end
52
+
53
+ if relations.has_key?(aliased)
47
54
  pending_relations[name] = value
48
55
  return true
49
56
  end
50
- if nested_attributes.has_key?(name)
57
+ if nested_attributes.has_key?(aliased)
51
58
  pending_nested[name] = value
52
59
  return true
53
60
  end
@@ -41,7 +41,7 @@ module Mongoid
41
41
  #
42
42
  # @param [ String ] name The name of the attribute or a dot notation path.
43
43
  #
44
- # @return [ true, false ] Whether the attribute is allowed by projection.
44
+ # @return [ true | false ] Whether the attribute is allowed by projection.
45
45
  #
46
46
  # @api private
47
47
  def attribute_or_path_allowed?(name)
@@ -17,9 +17,9 @@ module Mongoid
17
17
  # @example Can we write the attribute?
18
18
  # model.attribute_writable?(:title)
19
19
  #
20
- # @param [ String, Symbol ] name The name of the field.
20
+ # @param [ String | Symbol ] name The name of the field.
21
21
  #
22
- # @return [ true, false ] If the document is new, or if the field is not
22
+ # @return [ true | false ] If the document is new, or if the field is not
23
23
  # readonly.
24
24
  def attribute_writable?(name)
25
25
  new_record? || (!readonly_attributes.include?(name) && _loaded?(name))