mongoid 7.0.5 → 8.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (1108) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +33 -33
  4. data/LICENSE +1 -0
  5. data/README.md +34 -20
  6. data/Rakefile +88 -5
  7. data/lib/config/locales/en.yml +220 -105
  8. data/lib/mongoid/association/accessors.rb +176 -84
  9. data/lib/mongoid/association/bindable.rb +57 -28
  10. data/lib/mongoid/association/builders.rb +9 -15
  11. data/lib/mongoid/association/constrainable.rb +5 -7
  12. data/lib/mongoid/association/depending.rb +9 -18
  13. data/lib/mongoid/association/eager_loadable.rb +31 -10
  14. data/lib/mongoid/association/embedded/batchable.rb +68 -54
  15. data/lib/mongoid/association/embedded/cyclic.rb +10 -17
  16. data/lib/mongoid/association/embedded/embedded_in/binding.rb +27 -9
  17. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +9 -6
  18. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +16 -25
  19. data/lib/mongoid/association/embedded/embedded_in.rb +9 -28
  20. data/lib/mongoid/association/embedded/embeds_many/binding.rb +5 -8
  21. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +10 -6
  22. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +172 -136
  23. data/lib/mongoid/association/embedded/embeds_many.rb +10 -37
  24. data/lib/mongoid/association/embedded/embeds_one/binding.rb +4 -8
  25. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +27 -10
  26. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +64 -30
  27. data/lib/mongoid/association/embedded/embeds_one.rb +11 -34
  28. data/lib/mongoid/association/embedded.rb +2 -0
  29. data/lib/mongoid/association/macros.rb +71 -41
  30. data/lib/mongoid/association/many.rb +25 -35
  31. data/lib/mongoid/association/marshalable.rb +3 -6
  32. data/lib/mongoid/association/nested/many.rb +22 -30
  33. data/lib/mongoid/association/nested/nested_buildable.rb +9 -15
  34. data/lib/mongoid/association/nested/one.rb +57 -30
  35. data/lib/mongoid/association/nested.rb +3 -3
  36. data/lib/mongoid/association/one.rb +5 -12
  37. data/lib/mongoid/association/options.rb +16 -46
  38. data/lib/mongoid/association/proxy.rb +52 -40
  39. data/lib/mongoid/association/referenced/auto_save.rb +9 -14
  40. data/lib/mongoid/association/referenced/belongs_to/binding.rb +5 -9
  41. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +11 -9
  42. data/lib/mongoid/association/referenced/belongs_to/eager.rb +40 -3
  43. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +19 -31
  44. data/lib/mongoid/association/referenced/belongs_to.rb +16 -38
  45. data/lib/mongoid/association/referenced/counter_cache.rb +14 -25
  46. data/lib/mongoid/association/referenced/eager.rb +41 -40
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +12 -11
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +5 -5
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -1
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +105 -68
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +29 -46
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +3 -6
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +5 -5
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -1
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +440 -456
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +113 -127
  57. data/lib/mongoid/association/referenced/has_many.rb +21 -45
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +4 -9
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +20 -6
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +2 -1
  61. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +16 -29
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +25 -30
  63. data/lib/mongoid/association/referenced/has_one.rb +16 -36
  64. data/lib/mongoid/association/referenced/syncable.rb +11 -26
  65. data/lib/mongoid/association/referenced.rb +2 -0
  66. data/lib/mongoid/association/reflections.rb +7 -6
  67. data/lib/mongoid/association/relatable.rb +62 -84
  68. data/lib/mongoid/association.rb +13 -27
  69. data/lib/mongoid/atomic/modifiers.rb +29 -53
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +23 -7
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +4 -7
  72. data/lib/mongoid/atomic/paths/embedded.rb +2 -3
  73. data/lib/mongoid/atomic/paths/root.rb +4 -7
  74. data/lib/mongoid/atomic/paths.rb +2 -1
  75. data/lib/mongoid/atomic.rb +51 -47
  76. data/lib/mongoid/attributes/dynamic.rb +22 -36
  77. data/lib/mongoid/attributes/nested.rb +12 -15
  78. data/lib/mongoid/attributes/processing.rb +46 -30
  79. data/lib/mongoid/attributes/projector.rb +119 -0
  80. data/lib/mongoid/attributes/readonly.rb +6 -9
  81. data/lib/mongoid/attributes.rb +103 -100
  82. data/lib/mongoid/cacheable.rb +7 -10
  83. data/lib/mongoid/changeable.rb +152 -73
  84. data/lib/mongoid/clients/factory.rb +42 -17
  85. data/lib/mongoid/clients/options.rb +15 -14
  86. data/lib/mongoid/clients/sessions.rb +10 -10
  87. data/lib/mongoid/clients/storage_options.rb +9 -17
  88. data/lib/mongoid/clients/validators/storage.rb +5 -24
  89. data/lib/mongoid/clients/validators.rb +2 -1
  90. data/lib/mongoid/clients.rb +3 -10
  91. data/lib/mongoid/collection_configurable.rb +58 -0
  92. data/lib/mongoid/composable.rb +7 -9
  93. data/lib/mongoid/config/defaults.rb +60 -0
  94. data/lib/mongoid/config/environment.rb +51 -13
  95. data/lib/mongoid/config/options.rb +23 -23
  96. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  97. data/lib/mongoid/config/validators/client.rb +8 -23
  98. data/lib/mongoid/config/validators/option.rb +2 -3
  99. data/lib/mongoid/config/validators.rb +3 -1
  100. data/lib/mongoid/config.rb +265 -48
  101. data/lib/mongoid/contextual/aggregable/memory.rb +40 -27
  102. data/lib/mongoid/contextual/aggregable/mongo.rb +32 -33
  103. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  104. data/lib/mongoid/contextual/aggregable.rb +17 -0
  105. data/lib/mongoid/contextual/atomic.rb +29 -31
  106. data/lib/mongoid/contextual/command.rb +2 -5
  107. data/lib/mongoid/contextual/geo_near.rb +13 -44
  108. data/lib/mongoid/contextual/map_reduce.rb +7 -35
  109. data/lib/mongoid/contextual/memory.rb +387 -81
  110. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  111. data/lib/mongoid/contextual/mongo.rb +664 -283
  112. data/lib/mongoid/contextual/none.rb +264 -31
  113. data/lib/mongoid/contextual/queryable.rb +3 -4
  114. data/lib/mongoid/contextual.rb +21 -11
  115. data/lib/mongoid/copyable.rb +42 -17
  116. data/lib/mongoid/criteria/findable.rb +20 -20
  117. data/lib/mongoid/criteria/includable.rb +32 -34
  118. data/lib/mongoid/criteria/inspectable.rb +2 -3
  119. data/lib/mongoid/criteria/marshalable.rb +12 -7
  120. data/lib/mongoid/criteria/modifiable.rb +4 -20
  121. data/lib/mongoid/criteria/options.rb +2 -3
  122. data/lib/mongoid/criteria/permission.rb +3 -2
  123. data/lib/mongoid/criteria/queryable/aggregable.rb +4 -15
  124. data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
  125. data/lib/mongoid/criteria/queryable/extensions/array.rb +7 -41
  126. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +28 -8
  127. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -6
  128. data/lib/mongoid/criteria/queryable/extensions/date.rb +9 -9
  129. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +11 -12
  130. data/lib/mongoid/criteria/queryable/extensions/hash.rb +4 -41
  131. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -14
  132. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -21
  133. data/lib/mongoid/criteria/queryable/extensions/object.rb +6 -30
  134. data/lib/mongoid/criteria/queryable/extensions/range.rb +49 -17
  135. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +12 -19
  136. data/lib/mongoid/criteria/queryable/extensions/set.rb +4 -5
  137. data/lib/mongoid/criteria/queryable/extensions/string.rb +7 -32
  138. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +7 -22
  139. data/lib/mongoid/criteria/queryable/extensions/time.rb +10 -10
  140. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +19 -7
  141. data/lib/mongoid/criteria/queryable/extensions.rb +1 -4
  142. data/lib/mongoid/criteria/queryable/key.rb +40 -25
  143. data/lib/mongoid/criteria/queryable/macroable.rb +3 -4
  144. data/lib/mongoid/criteria/queryable/mergeable.rb +205 -44
  145. data/lib/mongoid/criteria/queryable/optional.rb +16 -65
  146. data/lib/mongoid/criteria/queryable/options.rb +4 -21
  147. data/lib/mongoid/criteria/queryable/pipeline.rb +5 -15
  148. data/lib/mongoid/criteria/queryable/selectable.rb +453 -177
  149. data/lib/mongoid/criteria/queryable/selector.rb +127 -30
  150. data/lib/mongoid/criteria/queryable/smash.rb +42 -18
  151. data/lib/mongoid/criteria/queryable/storable.rb +237 -0
  152. data/lib/mongoid/criteria/queryable.rb +18 -15
  153. data/lib/mongoid/criteria/scopable.rb +29 -21
  154. data/lib/mongoid/criteria/translator.rb +45 -0
  155. data/lib/mongoid/criteria.rb +106 -111
  156. data/lib/mongoid/deprecable.rb +37 -0
  157. data/lib/mongoid/deprecation.rb +25 -0
  158. data/lib/mongoid/document.rb +151 -99
  159. data/lib/mongoid/equality.rb +35 -18
  160. data/lib/mongoid/errors/ambiguous_relationship.rb +4 -5
  161. data/lib/mongoid/errors/callback.rb +2 -3
  162. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  163. data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
  164. data/lib/mongoid/errors/delete_restriction.rb +10 -13
  165. data/lib/mongoid/errors/document_not_destroyed.rb +4 -7
  166. data/lib/mongoid/errors/document_not_found.rb +35 -21
  167. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  168. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  169. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  170. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -3
  171. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  172. data/lib/mongoid/errors/invalid_collection.rb +2 -1
  173. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  174. data/lib/mongoid/errors/invalid_config_option.rb +3 -4
  175. data/lib/mongoid/errors/invalid_dependent_strategy.rb +3 -4
  176. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  177. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  178. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  179. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  180. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  181. data/lib/mongoid/errors/invalid_field.rb +8 -7
  182. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  183. data/lib/mongoid/errors/invalid_field_option.rb +2 -3
  184. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  185. data/lib/mongoid/errors/invalid_find.rb +2 -3
  186. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  187. data/lib/mongoid/errors/invalid_includes.rb +2 -3
  188. data/lib/mongoid/errors/invalid_index.rb +2 -3
  189. data/lib/mongoid/errors/invalid_options.rb +4 -5
  190. data/lib/mongoid/errors/invalid_path.rb +2 -3
  191. data/lib/mongoid/errors/invalid_persistence_option.rb +2 -5
  192. data/lib/mongoid/errors/invalid_query.rb +40 -0
  193. data/lib/mongoid/errors/invalid_relation.rb +5 -10
  194. data/lib/mongoid/errors/invalid_relation_option.rb +4 -5
  195. data/lib/mongoid/errors/invalid_scope.rb +2 -3
  196. data/lib/mongoid/errors/invalid_session_use.rb +3 -6
  197. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
  198. data/lib/mongoid/errors/invalid_storage_options.rb +3 -4
  199. data/lib/mongoid/errors/invalid_storage_parent.rb +4 -3
  200. data/lib/mongoid/errors/invalid_time.rb +2 -3
  201. data/lib/mongoid/errors/inverse_not_found.rb +3 -4
  202. data/lib/mongoid/errors/mixed_client_configuration.rb +2 -3
  203. data/lib/mongoid/errors/mixed_relations.rb +2 -3
  204. data/lib/mongoid/errors/mongoid_error.rb +6 -13
  205. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
  206. data/lib/mongoid/errors/no_client_config.rb +4 -5
  207. data/lib/mongoid/errors/no_client_database.rb +3 -4
  208. data/lib/mongoid/errors/no_client_hosts.rb +3 -4
  209. data/lib/mongoid/errors/no_clients_config.rb +2 -3
  210. data/lib/mongoid/errors/no_default_client.rb +3 -4
  211. data/lib/mongoid/errors/no_environment.rb +2 -3
  212. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
  213. data/lib/mongoid/errors/no_metadata.rb +2 -3
  214. data/lib/mongoid/errors/no_parent.rb +2 -3
  215. data/lib/mongoid/errors/readonly_attribute.rb +3 -4
  216. data/lib/mongoid/errors/readonly_document.rb +3 -6
  217. data/lib/mongoid/errors/scope_overwrite.rb +2 -1
  218. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -1
  219. data/lib/mongoid/errors/unknown_attribute.rb +3 -4
  220. data/lib/mongoid/errors/unknown_model.rb +2 -3
  221. data/lib/mongoid/errors/unsaved_document.rb +3 -2
  222. data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
  223. data/lib/mongoid/errors/validations.rb +2 -1
  224. data/lib/mongoid/errors.rb +18 -4
  225. data/lib/mongoid/evolvable.rb +4 -5
  226. data/lib/mongoid/extensions/array.rb +37 -44
  227. data/lib/mongoid/extensions/big_decimal.rb +35 -21
  228. data/lib/mongoid/extensions/binary.rb +42 -0
  229. data/lib/mongoid/extensions/boolean.rb +10 -6
  230. data/lib/mongoid/extensions/date.rb +32 -25
  231. data/lib/mongoid/extensions/date_time.rb +5 -13
  232. data/lib/mongoid/extensions/decimal128.rb +2 -5
  233. data/lib/mongoid/extensions/false_class.rb +5 -8
  234. data/lib/mongoid/extensions/float.rb +12 -14
  235. data/lib/mongoid/extensions/hash.rb +91 -47
  236. data/lib/mongoid/extensions/integer.rb +12 -16
  237. data/lib/mongoid/extensions/module.rb +3 -4
  238. data/lib/mongoid/extensions/nil_class.rb +2 -5
  239. data/lib/mongoid/extensions/object.rb +27 -52
  240. data/lib/mongoid/extensions/object_id.rb +2 -7
  241. data/lib/mongoid/extensions/range.rb +42 -20
  242. data/lib/mongoid/extensions/regexp.rb +14 -8
  243. data/lib/mongoid/extensions/set.rb +13 -11
  244. data/lib/mongoid/extensions/string.rb +30 -61
  245. data/lib/mongoid/extensions/symbol.rb +6 -22
  246. data/lib/mongoid/extensions/time.rb +38 -22
  247. data/lib/mongoid/extensions/time_with_zone.rb +26 -9
  248. data/lib/mongoid/extensions/true_class.rb +5 -8
  249. data/lib/mongoid/extensions.rb +19 -3
  250. data/lib/mongoid/factory.rb +104 -17
  251. data/lib/mongoid/fields/foreign_key.rb +14 -26
  252. data/lib/mongoid/fields/localized.rb +21 -15
  253. data/lib/mongoid/fields/standard.rb +23 -43
  254. data/lib/mongoid/fields/validators/macro.rb +32 -20
  255. data/lib/mongoid/fields/validators.rb +2 -1
  256. data/lib/mongoid/fields.rb +360 -76
  257. data/lib/mongoid/findable.rb +115 -34
  258. data/lib/mongoid/indexable/specification.rb +5 -18
  259. data/lib/mongoid/indexable/validators/options.rb +8 -9
  260. data/lib/mongoid/indexable.rb +6 -21
  261. data/lib/mongoid/inspectable.rb +4 -11
  262. data/lib/mongoid/interceptable.rb +195 -42
  263. data/lib/mongoid/loggable.rb +13 -16
  264. data/lib/mongoid/matchable.rb +4 -156
  265. data/lib/mongoid/matcher/all.rb +22 -0
  266. data/lib/mongoid/matcher/and.rb +21 -0
  267. data/lib/mongoid/matcher/bits.rb +41 -0
  268. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  269. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  270. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  271. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  272. data/lib/mongoid/matcher/elem_match.rb +36 -0
  273. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  274. data/lib/mongoid/matcher/eq.rb +11 -0
  275. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  276. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  277. data/lib/mongoid/matcher/exists.rb +15 -0
  278. data/lib/mongoid/matcher/expression.rb +35 -0
  279. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  280. data/lib/mongoid/matcher/field_expression.rb +62 -0
  281. data/lib/mongoid/matcher/field_operator.rb +54 -0
  282. data/lib/mongoid/matcher/gt.rb +17 -0
  283. data/lib/mongoid/matcher/gte.rb +17 -0
  284. data/lib/mongoid/matcher/in.rb +25 -0
  285. data/lib/mongoid/matcher/lt.rb +17 -0
  286. data/lib/mongoid/matcher/lte.rb +17 -0
  287. data/lib/mongoid/matcher/mod.rb +17 -0
  288. data/lib/mongoid/matcher/ne.rb +16 -0
  289. data/lib/mongoid/matcher/nin.rb +11 -0
  290. data/lib/mongoid/matcher/nor.rb +25 -0
  291. data/lib/mongoid/matcher/not.rb +29 -0
  292. data/lib/mongoid/matcher/or.rb +21 -0
  293. data/lib/mongoid/matcher/regex.rb +41 -0
  294. data/lib/mongoid/matcher/size.rb +26 -0
  295. data/lib/mongoid/matcher/type.rb +99 -0
  296. data/lib/mongoid/matcher.rb +130 -0
  297. data/lib/mongoid/persistable/creatable.rb +23 -30
  298. data/lib/mongoid/persistable/deletable.rb +7 -23
  299. data/lib/mongoid/persistable/destroyable.rb +12 -11
  300. data/lib/mongoid/persistable/incrementable.rb +6 -7
  301. data/lib/mongoid/persistable/logical.rb +4 -6
  302. data/lib/mongoid/persistable/poppable.rb +3 -6
  303. data/lib/mongoid/persistable/pullable.rb +3 -8
  304. data/lib/mongoid/persistable/pushable.rb +14 -10
  305. data/lib/mongoid/persistable/renamable.rb +10 -8
  306. data/lib/mongoid/persistable/savable.rb +16 -9
  307. data/lib/mongoid/persistable/settable.rb +3 -6
  308. data/lib/mongoid/persistable/unsettable.rb +10 -10
  309. data/lib/mongoid/persistable/updatable.rb +99 -30
  310. data/lib/mongoid/persistable/upsertable.rb +23 -9
  311. data/lib/mongoid/persistable.rb +138 -40
  312. data/lib/mongoid/persistence_context.rb +91 -51
  313. data/lib/mongoid/positional.rb +2 -5
  314. data/lib/mongoid/query_cache.rb +18 -238
  315. data/lib/mongoid/railtie.rb +3 -16
  316. data/lib/mongoid/railties/controller_runtime.rb +4 -2
  317. data/lib/mongoid/railties/database.rake +16 -2
  318. data/lib/mongoid/reloadable.rb +19 -22
  319. data/lib/mongoid/scopable.rb +34 -57
  320. data/lib/mongoid/selectable.rb +8 -18
  321. data/lib/mongoid/serializable.rb +33 -34
  322. data/lib/mongoid/shardable.rb +108 -21
  323. data/lib/mongoid/stateful.rb +60 -20
  324. data/lib/mongoid/stringified_symbol.rb +52 -0
  325. data/lib/mongoid/tasks/database.rake +24 -5
  326. data/lib/mongoid/tasks/database.rb +105 -7
  327. data/lib/mongoid/threaded/lifecycle.rb +7 -26
  328. data/lib/mongoid/threaded.rb +44 -67
  329. data/lib/mongoid/timestamps/created/short.rb +2 -1
  330. data/lib/mongoid/timestamps/created.rb +4 -3
  331. data/lib/mongoid/timestamps/short.rb +2 -1
  332. data/lib/mongoid/timestamps/timeless.rb +6 -9
  333. data/lib/mongoid/timestamps/updated/short.rb +2 -1
  334. data/lib/mongoid/timestamps/updated.rb +5 -6
  335. data/lib/mongoid/timestamps.rb +3 -2
  336. data/lib/mongoid/touchable.rb +54 -25
  337. data/lib/mongoid/traversable.rb +185 -61
  338. data/lib/mongoid/utils.rb +22 -0
  339. data/lib/mongoid/validatable/associated.rb +99 -22
  340. data/lib/mongoid/validatable/format.rb +2 -1
  341. data/lib/mongoid/validatable/length.rb +2 -1
  342. data/lib/mongoid/validatable/localizable.rb +3 -4
  343. data/lib/mongoid/validatable/macros.rb +7 -14
  344. data/lib/mongoid/validatable/presence.rb +10 -15
  345. data/lib/mongoid/validatable/queryable.rb +2 -3
  346. data/lib/mongoid/validatable/uniqueness.rb +30 -42
  347. data/lib/mongoid/validatable.rb +24 -32
  348. data/lib/mongoid/version.rb +3 -2
  349. data/lib/mongoid/warnings.rb +44 -0
  350. data/lib/mongoid.rb +50 -17
  351. data/lib/rails/generators/mongoid/config/config_generator.rb +10 -2
  352. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +53 -32
  353. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -2
  354. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  355. data/lib/rails/generators/mongoid_generator.rb +2 -1
  356. data/lib/rails/mongoid.rb +4 -5
  357. data/spec/README.md +19 -4
  358. data/spec/config/mongoid.yml +17 -0
  359. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  360. data/spec/integration/app_spec.rb +345 -0
  361. data/spec/integration/associations/belongs_to_spec.rb +20 -0
  362. data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
  363. data/spec/integration/associations/embedded_spec.rb +283 -0
  364. data/spec/integration/associations/embeds_many_spec.rb +219 -0
  365. data/spec/integration/associations/embeds_one_spec.rb +41 -0
  366. data/spec/integration/associations/foreign_key_spec.rb +107 -0
  367. data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
  368. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +61 -0
  369. data/spec/integration/associations/has_many_spec.rb +128 -0
  370. data/spec/integration/associations/has_one_spec.rb +272 -0
  371. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  372. data/spec/integration/associations/reverse_population_spec.rb +34 -0
  373. data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
  374. data/spec/integration/associations/scope_option_spec.rb +101 -0
  375. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  376. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  377. data/spec/integration/callbacks_models.rb +192 -0
  378. data/spec/integration/callbacks_spec.rb +605 -0
  379. data/spec/integration/contextual/empty_spec.rb +141 -0
  380. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  381. data/spec/integration/criteria/date_field_spec.rb +40 -0
  382. data/spec/integration/criteria/default_scope_spec.rb +72 -0
  383. data/spec/integration/criteria/logical_spec.rb +124 -0
  384. data/spec/integration/criteria/range_spec.rb +359 -0
  385. data/spec/integration/criteria/time_with_zone_spec.rb +142 -0
  386. data/spec/integration/discriminator_key_spec.rb +391 -0
  387. data/spec/integration/discriminator_value_spec.rb +206 -0
  388. data/spec/integration/document_spec.rb +51 -0
  389. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  390. data/spec/integration/i18n_fallbacks_spec.rb +74 -0
  391. data/spec/integration/matcher_examples_spec.rb +765 -0
  392. data/spec/integration/matcher_operator_data/all.yml +140 -0
  393. data/spec/integration/matcher_operator_data/and.yml +93 -0
  394. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  395. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  396. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  397. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  398. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  399. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  400. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  401. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  402. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  403. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  404. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  405. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  406. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  407. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  408. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  409. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  410. data/spec/integration/matcher_operator_data/in.yml +210 -0
  411. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  412. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  413. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  414. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  415. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  416. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  417. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  418. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  419. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  420. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  421. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  422. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  423. data/spec/integration/matcher_operator_data/not.yml +196 -0
  424. data/spec/integration/matcher_operator_data/or.yml +137 -0
  425. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  426. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  427. data/spec/integration/matcher_operator_data/size.yml +174 -0
  428. data/spec/integration/matcher_operator_data/type.yml +70 -0
  429. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  430. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  431. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  432. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  433. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  434. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  435. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  436. data/spec/integration/matcher_operator_data/type_decimal.yml +41 -0
  437. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  438. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  439. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  440. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  441. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  442. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  443. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  444. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  445. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  446. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  447. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  448. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  449. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  450. data/spec/integration/matcher_operator_spec.rb +122 -0
  451. data/spec/integration/matcher_spec.rb +283 -0
  452. data/spec/integration/persistence/range_field_spec.rb +350 -0
  453. data/spec/integration/server_query_spec.rb +141 -0
  454. data/spec/integration/shardable_spec.rb +148 -0
  455. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  456. data/spec/lite_spec_helper.rb +35 -8
  457. data/spec/mongoid/association/accessors_spec.rb +284 -77
  458. data/spec/mongoid/association/auto_save_spec.rb +74 -33
  459. data/spec/mongoid/association/builders_spec.rb +3 -1
  460. data/spec/mongoid/association/constrainable_spec.rb +2 -0
  461. data/spec/mongoid/association/counter_cache_spec.rb +35 -33
  462. data/spec/mongoid/association/depending_spec.rb +431 -338
  463. data/spec/mongoid/association/eager_spec.rb +8 -5
  464. data/spec/mongoid/association/embedded/cyclic_spec.rb +4 -2
  465. data/spec/mongoid/association/embedded/dirty_spec.rb +4 -2
  466. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +4 -1
  467. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +56 -0
  468. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +152 -13
  469. data/spec/mongoid/association/embedded/embedded_in_spec.rb +3 -1
  470. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +2 -0
  471. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +114 -0
  472. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +741 -197
  473. data/spec/mongoid/association/embedded/embeds_many_models.rb +227 -0
  474. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +63 -0
  475. data/spec/mongoid/association/embedded/embeds_many_spec.rb +81 -1
  476. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +2 -0
  477. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +27 -0
  478. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +38 -23
  479. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +2 -0
  480. data/spec/mongoid/association/embedded/embeds_one_models.rb +22 -0
  481. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
  482. data/spec/mongoid/association/embedded/embeds_one_spec.rb +31 -3
  483. data/spec/mongoid/association/macros_spec.rb +11 -9
  484. data/spec/mongoid/association/nested/many_spec.rb +2 -0
  485. data/spec/mongoid/association/nested/one_spec.rb +18 -12
  486. data/spec/mongoid/association/options_spec.rb +2 -0
  487. data/spec/mongoid/association/polymorphic_spec.rb +2 -0
  488. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +4 -1
  489. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +111 -16
  490. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +242 -12
  491. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +114 -58
  492. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  493. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
  494. data/spec/mongoid/association/referenced/belongs_to_spec.rb +28 -21
  495. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +3 -1
  496. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -1
  497. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +46 -2
  498. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +25 -5
  499. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +559 -385
  500. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +68 -2
  501. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
  502. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +81 -4
  503. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +3 -1
  504. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +132 -0
  505. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +40 -9
  506. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +415 -129
  507. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +901 -502
  508. data/spec/mongoid/association/referenced/has_many_models.rb +61 -1
  509. data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
  510. data/spec/mongoid/association/referenced/has_many_spec.rb +48 -0
  511. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +2 -0
  512. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +55 -9
  513. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +34 -4
  514. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +135 -27
  515. data/spec/mongoid/association/referenced/has_one_models.rb +65 -0
  516. data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
  517. data/spec/mongoid/association/referenced/has_one_spec.rb +24 -1
  518. data/spec/mongoid/association/reflections_spec.rb +2 -0
  519. data/spec/mongoid/association/syncable_spec.rb +48 -32
  520. data/spec/mongoid/association_spec.rb +2 -0
  521. data/spec/mongoid/atomic/modifiers_spec.rb +49 -0
  522. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +2 -0
  523. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +2 -0
  524. data/spec/mongoid/atomic/paths/root_spec.rb +2 -0
  525. data/spec/mongoid/atomic/paths_spec.rb +93 -12
  526. data/spec/mongoid/atomic_spec.rb +53 -6
  527. data/spec/mongoid/attributes/dynamic_spec.rb +152 -0
  528. data/spec/mongoid/attributes/nested_spec.rb +149 -78
  529. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  530. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  531. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  532. data/spec/mongoid/attributes/projector_spec.rb +40 -0
  533. data/spec/mongoid/attributes/readonly_spec.rb +24 -22
  534. data/spec/mongoid/attributes_spec.rb +922 -54
  535. data/spec/mongoid/cacheable_spec.rb +6 -4
  536. data/spec/mongoid/changeable_spec.rb +484 -67
  537. data/spec/mongoid/clients/factory_spec.rb +128 -28
  538. data/spec/mongoid/clients/options_spec.rb +49 -30
  539. data/spec/mongoid/clients/sessions_spec.rb +29 -66
  540. data/spec/mongoid/clients/transactions_spec.rb +74 -37
  541. data/spec/mongoid/clients_spec.rb +189 -23
  542. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  543. data/spec/mongoid/composable_spec.rb +2 -0
  544. data/spec/mongoid/config/defaults_spec.rb +160 -0
  545. data/spec/mongoid/config/environment_spec.rb +126 -8
  546. data/spec/mongoid/config/options_spec.rb +22 -3
  547. data/spec/mongoid/config_spec.rb +513 -1
  548. data/spec/mongoid/contextual/aggregable/memory_spec.rb +433 -153
  549. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  550. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  551. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +122 -20
  552. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  553. data/spec/mongoid/contextual/atomic_spec.rb +242 -81
  554. data/spec/mongoid/contextual/geo_near_spec.rb +30 -19
  555. data/spec/mongoid/contextual/map_reduce_spec.rb +22 -19
  556. data/spec/mongoid/contextual/memory_spec.rb +1828 -303
  557. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  558. data/spec/mongoid/contextual/mongo_spec.rb +3514 -1205
  559. data/spec/mongoid/contextual/none_spec.rb +80 -67
  560. data/spec/mongoid/copyable_spec.rb +659 -36
  561. data/spec/mongoid/copyable_spec_models.rb +30 -0
  562. data/spec/mongoid/criteria/findable_spec.rb +161 -228
  563. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  564. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  565. data/spec/mongoid/criteria/inspectable_spec.rb +2 -0
  566. data/spec/mongoid/criteria/marshalable_spec.rb +20 -1
  567. data/spec/mongoid/criteria/modifiable_spec.rb +43 -40
  568. data/spec/mongoid/criteria/options_spec.rb +2 -0
  569. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -1
  570. data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
  571. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +9 -19
  572. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +136 -26
  573. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -1
  574. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +13 -0
  575. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +46 -17
  576. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +2 -0
  577. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +2 -15
  578. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +2 -0
  579. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +2 -0
  580. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -8
  581. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +2 -0
  582. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +239 -178
  583. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +3 -1
  584. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +9 -7
  585. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +2 -0
  586. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +7 -70
  587. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +2 -59
  588. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +53 -23
  589. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +41 -1
  590. data/spec/mongoid/criteria/queryable/key_spec.rb +2 -0
  591. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +145 -12
  592. data/spec/mongoid/criteria/queryable/optional_spec.rb +18 -485
  593. data/spec/mongoid/criteria/queryable/options_spec.rb +3 -1
  594. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +2 -0
  595. data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -1
  596. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +2538 -0
  597. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  598. data/spec/mongoid/criteria/queryable/selectable_spec.rb +1100 -2880
  599. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  600. data/spec/mongoid/criteria/queryable/selector_spec.rb +92 -5
  601. data/spec/mongoid/criteria/queryable/smash_spec.rb +2 -0
  602. data/spec/mongoid/criteria/queryable/storable_spec.rb +298 -0
  603. data/spec/mongoid/criteria/scopable_spec.rb +129 -0
  604. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  605. data/spec/mongoid/criteria_projection_spec.rb +406 -0
  606. data/spec/mongoid/criteria_spec.rb +1320 -1723
  607. data/spec/mongoid/document_fields_spec.rb +262 -0
  608. data/spec/mongoid/document_persistence_context_spec.rb +32 -0
  609. data/spec/mongoid/document_query_spec.rb +89 -0
  610. data/spec/mongoid/document_spec.rb +153 -87
  611. data/spec/mongoid/equality_spec.rb +144 -41
  612. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +5 -3
  613. data/spec/mongoid/errors/callback_spec.rb +2 -0
  614. data/spec/mongoid/errors/delete_restriction_spec.rb +4 -2
  615. data/spec/mongoid/errors/document_not_destroyed_spec.rb +2 -0
  616. data/spec/mongoid/errors/document_not_found_spec.rb +78 -0
  617. data/spec/mongoid/errors/invalid_collection_spec.rb +2 -0
  618. data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +7 -5
  619. data/spec/mongoid/errors/invalid_config_option_spec.rb +2 -0
  620. data/spec/mongoid/errors/invalid_field_option_spec.rb +2 -0
  621. data/spec/mongoid/errors/invalid_field_spec.rb +3 -1
  622. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  623. data/spec/mongoid/errors/invalid_find_spec.rb +2 -0
  624. data/spec/mongoid/errors/invalid_includes_spec.rb +2 -0
  625. data/spec/mongoid/errors/invalid_index_spec.rb +2 -0
  626. data/spec/mongoid/errors/invalid_options_spec.rb +4 -2
  627. data/spec/mongoid/errors/invalid_path_spec.rb +2 -0
  628. data/spec/mongoid/errors/invalid_relation_spec.rb +4 -2
  629. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -1
  630. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +2 -0
  631. data/spec/mongoid/errors/invalid_storage_options_spec.rb +2 -0
  632. data/spec/mongoid/errors/invalid_time_spec.rb +2 -0
  633. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -1
  634. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +2 -0
  635. data/spec/mongoid/errors/mixed_relations_spec.rb +2 -0
  636. data/spec/mongoid/errors/mongoid_error_spec.rb +24 -8
  637. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +5 -3
  638. data/spec/mongoid/errors/no_client_config_spec.rb +4 -2
  639. data/spec/mongoid/errors/no_client_database_spec.rb +5 -3
  640. data/spec/mongoid/errors/no_client_hosts_spec.rb +5 -3
  641. data/spec/mongoid/errors/no_clients_config_spec.rb +2 -0
  642. data/spec/mongoid/errors/no_environment_spec.rb +5 -3
  643. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +2 -0
  644. data/spec/mongoid/errors/no_metadata_spec.rb +4 -2
  645. data/spec/mongoid/errors/no_parent_spec.rb +3 -1
  646. data/spec/mongoid/errors/readonly_attribute_spec.rb +2 -0
  647. data/spec/mongoid/errors/readonly_document_spec.rb +4 -2
  648. data/spec/mongoid/errors/scope_overwrite_spec.rb +2 -0
  649. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -1
  650. data/spec/mongoid/errors/unknown_attribute_spec.rb +4 -2
  651. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -1
  652. data/spec/mongoid/errors/unsupported_javascript_spec.rb +2 -0
  653. data/spec/mongoid/errors/validations_spec.rb +2 -0
  654. data/spec/mongoid/extensions/array_spec.rb +41 -45
  655. data/spec/mongoid/extensions/big_decimal_spec.rb +714 -212
  656. data/spec/mongoid/extensions/binary_spec.rb +46 -9
  657. data/spec/mongoid/extensions/boolean_spec.rb +70 -82
  658. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +339 -0
  659. data/spec/mongoid/extensions/date_spec.rb +58 -140
  660. data/spec/mongoid/extensions/date_time_spec.rb +32 -69
  661. data/spec/mongoid/extensions/decimal128_spec.rb +2 -0
  662. data/spec/mongoid/extensions/false_class_spec.rb +3 -1
  663. data/spec/mongoid/extensions/float_spec.rb +66 -73
  664. data/spec/mongoid/extensions/hash_spec.rb +138 -3
  665. data/spec/mongoid/extensions/integer_spec.rb +61 -63
  666. data/spec/mongoid/extensions/module_spec.rb +2 -0
  667. data/spec/mongoid/extensions/nil_class_spec.rb +2 -0
  668. data/spec/mongoid/extensions/object_id_spec.rb +2 -0
  669. data/spec/mongoid/extensions/object_spec.rb +13 -24
  670. data/spec/mongoid/extensions/range_spec.rb +257 -54
  671. data/spec/mongoid/extensions/regexp_spec.rb +60 -33
  672. data/spec/mongoid/extensions/set_spec.rb +108 -0
  673. data/spec/mongoid/extensions/string_spec.rb +111 -50
  674. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  675. data/spec/mongoid/extensions/symbol_spec.rb +20 -25
  676. data/spec/mongoid/extensions/time_spec.rb +668 -106
  677. data/spec/mongoid/extensions/time_with_zone_spec.rb +57 -83
  678. data/spec/mongoid/extensions/true_class_spec.rb +3 -1
  679. data/spec/mongoid/extensions_spec.rb +16 -2
  680. data/spec/mongoid/factory_spec.rb +347 -27
  681. data/spec/mongoid/fields/foreign_key_spec.rb +2 -0
  682. data/spec/mongoid/fields/localized_spec.rb +86 -41
  683. data/spec/mongoid/fields/standard_spec.rb +2 -0
  684. data/spec/mongoid/fields_spec.rb +912 -114
  685. data/spec/mongoid/findable_spec.rb +520 -64
  686. data/spec/mongoid/indexable/specification_spec.rb +4 -2
  687. data/spec/mongoid/indexable_spec.rb +87 -32
  688. data/spec/mongoid/inspectable_spec.rb +39 -2
  689. data/spec/mongoid/interceptable_spec.rb +972 -98
  690. data/spec/mongoid/interceptable_spec_models.rb +307 -0
  691. data/spec/mongoid/loggable_spec.rb +2 -0
  692. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  693. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  694. data/spec/mongoid/matcher/extract_attribute_spec.rb +36 -0
  695. data/spec/mongoid/mongoizable_spec.rb +285 -0
  696. data/spec/mongoid/persistable/creatable_spec.rb +114 -29
  697. data/spec/mongoid/persistable/deletable_spec.rb +300 -18
  698. data/spec/mongoid/persistable/destroyable_spec.rb +228 -18
  699. data/spec/mongoid/persistable/incrementable_spec.rb +60 -7
  700. data/spec/mongoid/persistable/logical_spec.rb +56 -3
  701. data/spec/mongoid/persistable/poppable_spec.rb +55 -3
  702. data/spec/mongoid/persistable/pullable_spec.rb +108 -6
  703. data/spec/mongoid/persistable/pushable_spec.rb +163 -7
  704. data/spec/mongoid/persistable/renamable_spec.rb +54 -2
  705. data/spec/mongoid/persistable/savable_spec.rb +284 -25
  706. data/spec/mongoid/persistable/settable_spec.rb +91 -8
  707. data/spec/mongoid/persistable/unsettable_spec.rb +55 -3
  708. data/spec/mongoid/persistable/updatable_spec.rb +63 -49
  709. data/spec/mongoid/persistable/upsertable_spec.rb +93 -3
  710. data/spec/mongoid/persistable_spec.rb +85 -9
  711. data/spec/mongoid/persistence_context_spec.rb +59 -58
  712. data/spec/mongoid/positional_spec.rb +2 -0
  713. data/spec/mongoid/query_cache_middleware_spec.rb +50 -0
  714. data/spec/mongoid/query_cache_spec.rb +410 -95
  715. data/spec/mongoid/relations/proxy_spec.rb +9 -7
  716. data/spec/mongoid/reloadable_spec.rb +381 -26
  717. data/spec/mongoid/scopable_spec.rb +193 -38
  718. data/spec/mongoid/selectable_spec.rb +8 -6
  719. data/spec/mongoid/serializable_spec.rb +148 -38
  720. data/spec/mongoid/shardable_models.rb +75 -0
  721. data/spec/mongoid/shardable_spec.rb +239 -34
  722. data/spec/mongoid/stateful_spec.rb +153 -9
  723. data/spec/mongoid/tasks/database_rake_spec.rb +89 -13
  724. data/spec/mongoid/tasks/database_spec.rb +130 -1
  725. data/spec/mongoid/threaded_spec.rb +4 -2
  726. data/spec/mongoid/timestamps/created/short_spec.rb +3 -1
  727. data/spec/mongoid/timestamps/created_spec.rb +3 -1
  728. data/spec/mongoid/timestamps/timeless_spec.rb +4 -2
  729. data/spec/mongoid/timestamps/updated/short_spec.rb +5 -3
  730. data/spec/mongoid/timestamps/updated_spec.rb +5 -3
  731. data/spec/mongoid/timestamps_spec.rb +400 -10
  732. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  733. data/spec/mongoid/touchable_spec.rb +568 -33
  734. data/spec/mongoid/touchable_spec_models.rb +59 -0
  735. data/spec/mongoid/traversable_spec.rb +1145 -1
  736. data/spec/mongoid/validatable/associated_spec.rb +15 -30
  737. data/spec/mongoid/validatable/format_spec.rb +2 -0
  738. data/spec/mongoid/validatable/length_spec.rb +2 -0
  739. data/spec/mongoid/validatable/numericality_spec.rb +2 -0
  740. data/spec/mongoid/validatable/presence_spec.rb +28 -22
  741. data/spec/mongoid/validatable/uniqueness_spec.rb +159 -103
  742. data/spec/mongoid/validatable_spec.rb +5 -3
  743. data/spec/mongoid/warnings_spec.rb +35 -0
  744. data/spec/mongoid_spec.rb +36 -10
  745. data/spec/rails/controller_extension/controller_runtime_spec.rb +5 -3
  746. data/spec/rails/mongoid_spec.rb +8 -18
  747. data/spec/shared/LICENSE +20 -0
  748. data/spec/shared/bin/get-mongodb-download-url +17 -0
  749. data/spec/shared/bin/s3-copy +45 -0
  750. data/spec/shared/bin/s3-upload +69 -0
  751. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  752. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  753. data/spec/shared/lib/mrss/constraints.rb +378 -0
  754. data/spec/shared/lib/mrss/docker_runner.rb +298 -0
  755. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  756. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  757. data/spec/shared/lib/mrss/lite_constraints.rb +238 -0
  758. data/spec/shared/lib/mrss/server_version_registry.rb +113 -0
  759. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  760. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  761. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  762. data/spec/shared/lib/mrss/utils.rb +37 -0
  763. data/spec/shared/share/Dockerfile.erb +321 -0
  764. data/spec/shared/share/haproxy-1.conf +16 -0
  765. data/spec/shared/share/haproxy-2.conf +17 -0
  766. data/spec/shared/shlib/config.sh +27 -0
  767. data/spec/shared/shlib/distro.sh +74 -0
  768. data/spec/shared/shlib/server.sh +416 -0
  769. data/spec/shared/shlib/set_env.sh +169 -0
  770. data/spec/spec_helper.rb +44 -66
  771. data/spec/support/authorization.rb +2 -0
  772. data/spec/support/client_registry.rb +9 -0
  773. data/spec/support/constraints.rb +45 -69
  774. data/spec/support/expectations.rb +21 -3
  775. data/spec/support/helpers.rb +11 -0
  776. data/spec/support/immutable_ids.rb +118 -0
  777. data/spec/support/macros.rb +109 -0
  778. data/spec/{app → support}/models/account.rb +3 -1
  779. data/spec/{app → support}/models/acolyte.rb +2 -0
  780. data/spec/{app → support}/models/actor.rb +3 -1
  781. data/spec/support/models/actress.rb +4 -0
  782. data/spec/{app → support}/models/address.rb +6 -0
  783. data/spec/{app → support}/models/address_component.rb +2 -0
  784. data/spec/{app → support}/models/address_number.rb +2 -0
  785. data/spec/{app → support}/models/agency.rb +2 -0
  786. data/spec/{app → support}/models/agent.rb +2 -0
  787. data/spec/{app → support}/models/album.rb +2 -0
  788. data/spec/{app → support}/models/alert.rb +2 -0
  789. data/spec/{app → support}/models/animal.rb +2 -0
  790. data/spec/{app → support}/models/answer.rb +2 -0
  791. data/spec/{app → support}/models/appointment.rb +2 -0
  792. data/spec/support/models/armrest.rb +9 -0
  793. data/spec/{app → support}/models/article.rb +2 -0
  794. data/spec/{app → support}/models/artist.rb +4 -1
  795. data/spec/{app → support}/models/artwork.rb +2 -0
  796. data/spec/support/models/audible_sound.rb +3 -0
  797. data/spec/{app → support}/models/audio.rb +2 -0
  798. data/spec/support/models/augmentation.rb +25 -0
  799. data/spec/{app → support}/models/author.rb +2 -0
  800. data/spec/{app → support}/models/baby.rb +2 -0
  801. data/spec/{app → support}/models/band.rb +10 -0
  802. data/spec/{app → support}/models/bar.rb +2 -0
  803. data/spec/{app → support}/models/basic.rb +2 -0
  804. data/spec/support/models/bed.rb +3 -0
  805. data/spec/{app → support}/models/big_palette.rb +2 -0
  806. data/spec/{app → support}/models/birthday.rb +2 -0
  807. data/spec/support/models/bolt.rb +7 -0
  808. data/spec/{app → support}/models/bomb.rb +2 -0
  809. data/spec/{app → support}/models/book.rb +3 -0
  810. data/spec/{app → support}/models/breed.rb +2 -0
  811. data/spec/{app → support}/models/browser.rb +3 -1
  812. data/spec/{app → support}/models/building.rb +4 -0
  813. data/spec/{app → support}/models/building_address.rb +2 -0
  814. data/spec/{app → support}/models/bus.rb +2 -0
  815. data/spec/{app → support}/models/business.rb +2 -0
  816. data/spec/{app → support}/models/callback_test.rb +2 -0
  817. data/spec/{app → support}/models/canvas.rb +3 -1
  818. data/spec/support/models/car.rb +3 -0
  819. data/spec/{app → support}/models/cat.rb +2 -0
  820. data/spec/support/models/catalog.rb +24 -0
  821. data/spec/{app → support}/models/category.rb +2 -0
  822. data/spec/{app → support}/models/child.rb +2 -0
  823. data/spec/{app → support}/models/child_doc.rb +5 -3
  824. data/spec/{app → support}/models/church.rb +2 -0
  825. data/spec/{app → support}/models/circle.rb +2 -0
  826. data/spec/{app → support}/models/circuit.rb +2 -0
  827. data/spec/support/models/circus.rb +12 -0
  828. data/spec/{app → support}/models/code.rb +4 -0
  829. data/spec/support/models/coding/pull_request.rb +11 -0
  830. data/spec/support/models/coding.rb +3 -0
  831. data/spec/{app → support}/models/comment.rb +2 -0
  832. data/spec/{app → support}/models/company.rb +2 -0
  833. data/spec/{app → support}/models/consumption_period.rb +2 -0
  834. data/spec/{app → support}/models/contextable_item.rb +2 -0
  835. data/spec/{app → support}/models/contractor.rb +2 -0
  836. data/spec/{app → support}/models/cookie.rb +2 -0
  837. data/spec/{app → support}/models/country_code.rb +4 -0
  838. data/spec/{app → support}/models/courier_job.rb +2 -0
  839. data/spec/support/models/cover.rb +10 -0
  840. data/spec/support/models/crate.rb +12 -0
  841. data/spec/support/models/customer.rb +10 -0
  842. data/spec/support/models/customer_address.rb +11 -0
  843. data/spec/support/models/deed.rb +7 -0
  844. data/spec/{app → support}/models/definition.rb +2 -0
  845. data/spec/support/models/delegating_patient.rb +15 -0
  846. data/spec/{app → support}/models/description.rb +2 -0
  847. data/spec/{app → support}/models/dictionary.rb +8 -0
  848. data/spec/{app → support}/models/division.rb +2 -0
  849. data/spec/{app → support}/models/doctor.rb +2 -0
  850. data/spec/{app → support}/models/dog.rb +2 -0
  851. data/spec/{app → support}/models/dokument.rb +2 -0
  852. data/spec/{app → support}/models/draft.rb +2 -0
  853. data/spec/{app → support}/models/dragon.rb +2 -0
  854. data/spec/{app → support}/models/driver.rb +3 -1
  855. data/spec/{app → support}/models/drug.rb +2 -0
  856. data/spec/{app → support}/models/dungeon.rb +2 -0
  857. data/spec/{app → support}/models/edit.rb +2 -0
  858. data/spec/{app → support}/models/email.rb +2 -0
  859. data/spec/{app → support}/models/employer.rb +2 -0
  860. data/spec/{app → support}/models/entry.rb +2 -0
  861. data/spec/support/models/eraser.rb +3 -0
  862. data/spec/{app → support}/models/even.rb +2 -0
  863. data/spec/{app → support}/models/event.rb +2 -0
  864. data/spec/{app → support}/models/exhibition.rb +2 -0
  865. data/spec/{app → support}/models/exhibitor.rb +2 -0
  866. data/spec/{app → support}/models/explosion.rb +2 -0
  867. data/spec/{app → support}/models/eye.rb +2 -0
  868. data/spec/{app → support}/models/eye_bowl.rb +2 -0
  869. data/spec/{app → support}/models/face.rb +2 -0
  870. data/spec/support/models/fanatic.rb +8 -0
  871. data/spec/{app → support}/models/favorite.rb +2 -0
  872. data/spec/{app → support}/models/filesystem.rb +2 -0
  873. data/spec/{app → support}/models/fire_hydrant.rb +2 -0
  874. data/spec/{app → support}/models/firefox.rb +2 -0
  875. data/spec/{app → support}/models/fish.rb +2 -0
  876. data/spec/{app → support}/models/folder.rb +2 -0
  877. data/spec/{app → support}/models/folder_item.rb +2 -0
  878. data/spec/{app → support}/models/fruits.rb +2 -0
  879. data/spec/{app → support}/models/game.rb +2 -0
  880. data/spec/{app → support}/models/ghost.rb +2 -0
  881. data/spec/support/models/guitar.rb +4 -0
  882. data/spec/support/models/hole.rb +12 -0
  883. data/spec/{app → support}/models/home.rb +2 -0
  884. data/spec/{app → support}/models/house.rb +2 -0
  885. data/spec/{app → support}/models/html_writer.rb +2 -0
  886. data/spec/{app → support}/models/id_key.rb +2 -0
  887. data/spec/support/models/idnodef.rb +7 -0
  888. data/spec/{app → support}/models/image.rb +2 -0
  889. data/spec/{app → support}/models/implant.rb +11 -0
  890. data/spec/support/models/instrument.rb +8 -0
  891. data/spec/{app → support}/models/item.rb +3 -1
  892. data/spec/{app → support}/models/jar.rb +2 -0
  893. data/spec/{app → support}/models/kaleidoscope.rb +2 -0
  894. data/spec/{app → support}/models/kangaroo.rb +3 -1
  895. data/spec/{app → support}/models/label.rb +6 -1
  896. data/spec/{app → support}/models/language.rb +2 -0
  897. data/spec/{app → support}/models/lat_lng.rb +2 -0
  898. data/spec/{app → support}/models/league.rb +2 -0
  899. data/spec/support/models/learner.rb +4 -0
  900. data/spec/{app → support}/models/line_item.rb +2 -0
  901. data/spec/{app → support}/models/location.rb +2 -0
  902. data/spec/{app → support}/models/login.rb +2 -0
  903. data/spec/{app → support}/models/manufacturer.rb +2 -0
  904. data/spec/{app → support}/models/meat.rb +2 -0
  905. data/spec/{app → support}/models/membership.rb +3 -0
  906. data/spec/{app → support}/models/message.rb +2 -0
  907. data/spec/{app → support}/models/minim.rb +0 -1
  908. data/spec/{app → support}/models/mixed_drink.rb +2 -0
  909. data/spec/support/models/mop.rb +24 -0
  910. data/spec/{app → support}/models/movie.rb +2 -0
  911. data/spec/support/models/my_hash.rb +4 -0
  912. data/spec/{app → support}/models/name.rb +12 -0
  913. data/spec/support/models/name_only.rb +8 -0
  914. data/spec/{app → support}/models/node.rb +2 -0
  915. data/spec/{app → support}/models/note.rb +2 -0
  916. data/spec/support/models/nut.rb +7 -0
  917. data/spec/{app → support}/models/odd.rb +2 -0
  918. data/spec/support/models/order.rb +12 -0
  919. data/spec/{app → support}/models/ordered_post.rb +3 -1
  920. data/spec/{app → support}/models/ordered_preference.rb +2 -0
  921. data/spec/{app → support}/models/oscar.rb +2 -0
  922. data/spec/support/models/other_owner_object.rb +4 -0
  923. data/spec/{app → support}/models/override.rb +2 -0
  924. data/spec/{app → support}/models/ownable.rb +2 -0
  925. data/spec/{app → support}/models/owner.rb +4 -0
  926. data/spec/{app → support}/models/pack.rb +2 -0
  927. data/spec/{app → support}/models/page.rb +2 -0
  928. data/spec/{app → support}/models/page_question.rb +2 -0
  929. data/spec/{app → support}/models/palette.rb +3 -1
  930. data/spec/{app → support}/models/parent.rb +2 -0
  931. data/spec/{app → support}/models/parent_doc.rb +2 -0
  932. data/spec/support/models/passport.rb +22 -0
  933. data/spec/{app → support}/models/patient.rb +2 -0
  934. data/spec/{app → support}/models/pdf_writer.rb +2 -0
  935. data/spec/support/models/pencil.rb +3 -0
  936. data/spec/{app → support}/models/person.rb +23 -1
  937. data/spec/{app → support}/models/pet.rb +2 -0
  938. data/spec/{app → support}/models/pet_owner.rb +2 -0
  939. data/spec/{app → support}/models/phone.rb +5 -1
  940. data/spec/support/models/piano.rb +4 -0
  941. data/spec/{app → support}/models/pizza.rb +2 -0
  942. data/spec/{app → support}/models/player.rb +4 -0
  943. data/spec/{app → support}/models/post.rb +2 -0
  944. data/spec/{app → support}/models/post_genre.rb +2 -0
  945. data/spec/support/models/powerup.rb +25 -0
  946. data/spec/{app → support}/models/preference.rb +2 -0
  947. data/spec/{app → support}/models/princess.rb +2 -0
  948. data/spec/{app → support}/models/product.rb +3 -0
  949. data/spec/support/models/profile.rb +17 -0
  950. data/spec/{app → support}/models/pronunciation.rb +2 -0
  951. data/spec/{app → support}/models/pub.rb +2 -0
  952. data/spec/support/models/publication/encyclopedia.rb +11 -0
  953. data/spec/support/models/publication/review.rb +13 -0
  954. data/spec/support/models/publication.rb +4 -0
  955. data/spec/{app → support}/models/purchase.rb +2 -0
  956. data/spec/support/models/purchased_item.rb +10 -0
  957. data/spec/support/models/purse.rb +9 -0
  958. data/spec/{app → support}/models/question.rb +2 -0
  959. data/spec/{app → support}/models/quiz.rb +2 -0
  960. data/spec/{app → support}/models/rating.rb +2 -0
  961. data/spec/{app → support}/models/record.rb +2 -0
  962. data/spec/{app → support}/models/registry.rb +3 -0
  963. data/spec/{app → support}/models/role.rb +2 -0
  964. data/spec/{app → support}/models/root_category.rb +2 -0
  965. data/spec/{app → support}/models/sandwich.rb +2 -0
  966. data/spec/{app → support}/models/scheduler.rb +2 -0
  967. data/spec/support/models/school.rb +14 -0
  968. data/spec/support/models/scribe.rb +7 -0
  969. data/spec/support/models/sealer.rb +7 -0
  970. data/spec/support/models/seat.rb +24 -0
  971. data/spec/{app → support}/models/seo.rb +2 -0
  972. data/spec/support/models/series.rb +7 -0
  973. data/spec/{app → support}/models/server.rb +2 -0
  974. data/spec/{app → support}/models/service.rb +2 -0
  975. data/spec/{app → support}/models/shape.rb +4 -2
  976. data/spec/{app → support}/models/shelf.rb +2 -0
  977. data/spec/support/models/shield.rb +18 -0
  978. data/spec/{app → support}/models/shipment_address.rb +2 -0
  979. data/spec/{app → support}/models/shipping_container.rb +2 -0
  980. data/spec/{app → support}/models/shipping_pack.rb +2 -0
  981. data/spec/support/models/shirt.rb +11 -0
  982. data/spec/{app → support}/models/shop.rb +2 -0
  983. data/spec/{app → support}/models/short_agent.rb +2 -0
  984. data/spec/{app → support}/models/short_quiz.rb +2 -0
  985. data/spec/{app → support}/models/simple.rb +2 -0
  986. data/spec/{app → support}/models/slave.rb +2 -0
  987. data/spec/{app → support}/models/song.rb +2 -0
  988. data/spec/{app → support}/models/sound.rb +2 -0
  989. data/spec/support/models/spacer.rb +7 -0
  990. data/spec/{app → support}/models/square.rb +2 -0
  991. data/spec/{app → support}/models/staff.rb +2 -0
  992. data/spec/{app → support}/models/store_as_dup_test1.rb +2 -0
  993. data/spec/{app → support}/models/store_as_dup_test2.rb +2 -0
  994. data/spec/{app → support}/models/strategy.rb +2 -0
  995. data/spec/support/models/student.rb +14 -0
  996. data/spec/{app → support}/models/sub_item.rb +2 -0
  997. data/spec/{app → support}/models/subscription.rb +2 -0
  998. data/spec/{app → support}/models/survey.rb +2 -0
  999. data/spec/{app → support}/models/symptom.rb +2 -0
  1000. data/spec/support/models/system_role.rb +7 -0
  1001. data/spec/{app → support}/models/tag.rb +2 -0
  1002. data/spec/{app → support}/models/target.rb +2 -0
  1003. data/spec/{app → support}/models/template.rb +2 -0
  1004. data/spec/{app → support}/models/thing.rb +2 -0
  1005. data/spec/support/models/threadlocker.rb +7 -0
  1006. data/spec/{app → support}/models/title.rb +2 -0
  1007. data/spec/{app → support}/models/tool.rb +4 -2
  1008. data/spec/{app → support}/models/topping.rb +2 -0
  1009. data/spec/support/models/toy.rb +9 -0
  1010. data/spec/{app → support}/models/track.rb +2 -0
  1011. data/spec/{app → support}/models/translation.rb +2 -0
  1012. data/spec/{app → support}/models/tree.rb +2 -0
  1013. data/spec/support/models/truck.rb +7 -0
  1014. data/spec/{app → support}/models/user.rb +2 -0
  1015. data/spec/{app → support}/models/user_account.rb +2 -0
  1016. data/spec/{app → support}/models/validation_callback.rb +2 -0
  1017. data/spec/support/models/vehicle.rb +18 -0
  1018. data/spec/{app → support}/models/version.rb +2 -0
  1019. data/spec/{app → support}/models/vertex.rb +3 -1
  1020. data/spec/{app → support}/models/vet_visit.rb +2 -0
  1021. data/spec/{app → support}/models/video.rb +2 -0
  1022. data/spec/support/models/video_game.rb +3 -0
  1023. data/spec/support/models/washer.rb +7 -0
  1024. data/spec/support/models/weapon.rb +25 -0
  1025. data/spec/{app → support}/models/wiki_page.rb +3 -0
  1026. data/spec/{app → support}/models/word.rb +2 -0
  1027. data/spec/{app → support}/models/word_origin.rb +2 -0
  1028. data/spec/{app → support}/models/writer.rb +4 -2
  1029. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1030. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1031. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1032. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1033. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1034. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1035. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1036. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1037. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1038. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1039. data/spec/support/shared/time.rb +53 -0
  1040. data/spec/support/spec_config.rb +30 -5
  1041. data.tar.gz.sig +0 -0
  1042. metadata +1249 -749
  1043. metadata.gz.sig +0 -0
  1044. data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
  1045. data/lib/mongoid/errors/eager_load.rb +0 -22
  1046. data/lib/mongoid/errors/invalid_value.rb +0 -16
  1047. data/lib/mongoid/matchable/all.rb +0 -27
  1048. data/lib/mongoid/matchable/and.rb +0 -30
  1049. data/lib/mongoid/matchable/default.rb +0 -72
  1050. data/lib/mongoid/matchable/elem_match.rb +0 -34
  1051. data/lib/mongoid/matchable/eq.rb +0 -22
  1052. data/lib/mongoid/matchable/exists.rb +0 -23
  1053. data/lib/mongoid/matchable/gt.rb +0 -23
  1054. data/lib/mongoid/matchable/gte.rb +0 -23
  1055. data/lib/mongoid/matchable/in.rb +0 -24
  1056. data/lib/mongoid/matchable/lt.rb +0 -23
  1057. data/lib/mongoid/matchable/lte.rb +0 -23
  1058. data/lib/mongoid/matchable/ne.rb +0 -21
  1059. data/lib/mongoid/matchable/nin.rb +0 -22
  1060. data/lib/mongoid/matchable/nor.rb +0 -37
  1061. data/lib/mongoid/matchable/or.rb +0 -33
  1062. data/lib/mongoid/matchable/regexp.rb +0 -27
  1063. data/lib/mongoid/matchable/size.rb +0 -21
  1064. data/lib/support/ruby_version.rb +0 -26
  1065. data/spec/app/models/actress.rb +0 -2
  1066. data/spec/app/models/augmentation.rb +0 -11
  1067. data/spec/app/models/bed.rb +0 -1
  1068. data/spec/app/models/car.rb +0 -1
  1069. data/spec/app/models/circus.rb +0 -7
  1070. data/spec/app/models/eraser.rb +0 -1
  1071. data/spec/app/models/learner.rb +0 -2
  1072. data/spec/app/models/my_hash.rb +0 -2
  1073. data/spec/app/models/other_owner_object.rb +0 -2
  1074. data/spec/app/models/passport.rb +0 -5
  1075. data/spec/app/models/pencil.rb +0 -1
  1076. data/spec/app/models/powerup.rb +0 -11
  1077. data/spec/app/models/profile.rb +0 -5
  1078. data/spec/app/models/series.rb +0 -4
  1079. data/spec/app/models/truck.rb +0 -3
  1080. data/spec/app/models/vehicle.rb +0 -11
  1081. data/spec/app/models/video_game.rb +0 -1
  1082. data/spec/app/models/weapon.rb +0 -11
  1083. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -58
  1084. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -58
  1085. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
  1086. data/spec/mongoid/matchable/all_spec.rb +0 -31
  1087. data/spec/mongoid/matchable/and_spec.rb +0 -187
  1088. data/spec/mongoid/matchable/default_spec.rb +0 -130
  1089. data/spec/mongoid/matchable/elem_match_spec.rb +0 -106
  1090. data/spec/mongoid/matchable/eq_spec.rb +0 -48
  1091. data/spec/mongoid/matchable/exists_spec.rb +0 -57
  1092. data/spec/mongoid/matchable/gt_spec.rb +0 -86
  1093. data/spec/mongoid/matchable/gte_spec.rb +0 -84
  1094. data/spec/mongoid/matchable/in_spec.rb +0 -49
  1095. data/spec/mongoid/matchable/lt_spec.rb +0 -85
  1096. data/spec/mongoid/matchable/lte_spec.rb +0 -85
  1097. data/spec/mongoid/matchable/ne_spec.rb +0 -46
  1098. data/spec/mongoid/matchable/nin_spec.rb +0 -48
  1099. data/spec/mongoid/matchable/nor_spec.rb +0 -209
  1100. data/spec/mongoid/matchable/or_spec.rb +0 -131
  1101. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
  1102. data/spec/mongoid/matchable/size_spec.rb +0 -25
  1103. data/spec/mongoid/matchable_spec.rb +0 -853
  1104. data/spec/support/cluster_config.rb +0 -158
  1105. /data/spec/{app → support}/models/array_field.rb +0 -0
  1106. /data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  1107. /data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  1108. /data/spec/{app → support}/models/updatable.rb +0 -0
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Mongoid::Validatable::UniquenessValidator do
@@ -20,7 +22,7 @@ describe Mongoid::Validatable::UniquenessValidator do
20
22
 
21
23
  before do
22
24
  Dictionary.with(collection: "dicts") do |klass|
23
- klass.create(name: "websters")
25
+ klass.create!(name: "websters")
24
26
  end
25
27
  end
26
28
 
@@ -78,7 +80,7 @@ describe Mongoid::Validatable::UniquenessValidator do
78
80
  context "when the attribute id is unique" do
79
81
 
80
82
  let(:dictionary) do
81
- Dictionary.create
83
+ Dictionary.create!
82
84
  end
83
85
 
84
86
  let(:word) do
@@ -118,7 +120,7 @@ describe Mongoid::Validatable::UniquenessValidator do
118
120
  it "adds the uniqueness error to the aliased field name" do
119
121
  dictionary.valid?
120
122
  expect(dictionary.errors).to have_key(:language)
121
- expect(dictionary.errors[:language]).to eq([ "is already taken" ])
123
+ expect(dictionary.errors[:language]).to eq([ "has already been taken" ])
122
124
  end
123
125
  end
124
126
 
@@ -135,7 +137,7 @@ describe Mongoid::Validatable::UniquenessValidator do
135
137
  it "adds the uniqueness error to the underlying field name" do
136
138
  dictionary.valid?
137
139
  expect(dictionary.errors).to have_key(:l)
138
- expect(dictionary.errors[:l]).to eq([ "is already taken" ])
140
+ expect(dictionary.errors[:l]).to eq([ "has already been taken" ])
139
141
  end
140
142
  end
141
143
  end
@@ -170,7 +172,7 @@ describe Mongoid::Validatable::UniquenessValidator do
170
172
  context "when a document with no value exists in the database" do
171
173
 
172
174
  before do
173
- Dictionary.create
175
+ Dictionary.create!
174
176
  end
175
177
 
176
178
  let(:dictionary) do
@@ -188,7 +190,7 @@ describe Mongoid::Validatable::UniquenessValidator do
188
190
  context "when single localization" do
189
191
 
190
192
  before do
191
- Dictionary.create(description: "english")
193
+ Dictionary.create!(description: "english")
192
194
  end
193
195
 
194
196
  let(:dictionary) do
@@ -224,7 +226,7 @@ describe Mongoid::Validatable::UniquenessValidator do
224
226
  context "when single localization" do
225
227
 
226
228
  before do
227
- Dictionary.create(description: "english")
229
+ Dictionary.create!(description: "english")
228
230
  end
229
231
 
230
232
  let(:dictionary) do
@@ -237,7 +239,7 @@ describe Mongoid::Validatable::UniquenessValidator do
237
239
 
238
240
  it "adds the uniqueness error" do
239
241
  dictionary.valid?
240
- expect(dictionary.errors[:description]).to eq([ "is already taken" ])
242
+ expect(dictionary.errors[:description]).to eq([ "has already been taken" ])
241
243
  end
242
244
  end
243
245
 
@@ -258,7 +260,7 @@ describe Mongoid::Validatable::UniquenessValidator do
258
260
 
259
261
  it "adds the uniqueness error" do
260
262
  dictionary.valid?
261
- expect(dictionary.errors[:description]).to eq([ "is already taken" ])
263
+ expect(dictionary.errors[:description]).to eq([ "has already been taken" ])
262
264
  end
263
265
  end
264
266
  end
@@ -280,7 +282,7 @@ describe Mongoid::Validatable::UniquenessValidator do
280
282
  context "when there are no special characters" do
281
283
 
282
284
  before do
283
- Dictionary.create(description: "english")
285
+ Dictionary.create!(description: "english")
284
286
  end
285
287
 
286
288
  let(:dictionary) do
@@ -295,7 +297,7 @@ describe Mongoid::Validatable::UniquenessValidator do
295
297
  context "when special characters exist" do
296
298
 
297
299
  before do
298
- Dictionary.create(description: "english")
300
+ Dictionary.create!(description: "english")
299
301
  end
300
302
 
301
303
  let(:dictionary) do
@@ -315,7 +317,7 @@ describe Mongoid::Validatable::UniquenessValidator do
315
317
  context "when signle localization" do
316
318
 
317
319
  before do
318
- Dictionary.create(description: "english")
320
+ Dictionary.create!(description: "english")
319
321
  end
320
322
 
321
323
  let(:dictionary) do
@@ -328,7 +330,7 @@ describe Mongoid::Validatable::UniquenessValidator do
328
330
 
329
331
  it "adds the uniqueness error" do
330
332
  dictionary.valid?
331
- expect(dictionary.errors[:description]).to eq([ "is already taken" ])
333
+ expect(dictionary.errors[:description]).to eq([ "has already been taken" ])
332
334
  end
333
335
  end
334
336
 
@@ -349,7 +351,7 @@ describe Mongoid::Validatable::UniquenessValidator do
349
351
 
350
352
  it "adds the uniqueness error" do
351
353
  dictionary.valid?
352
- expect(dictionary.errors[:description]).to eq([ "is already taken" ])
354
+ expect(dictionary.errors[:description]).to eq([ "has already been taken" ])
353
355
  end
354
356
  end
355
357
  end
@@ -357,7 +359,7 @@ describe Mongoid::Validatable::UniquenessValidator do
357
359
  context "when the document is the match in the database" do
358
360
 
359
361
  let!(:dictionary) do
360
- Dictionary.create(description: "english")
362
+ Dictionary.create!(description: "english")
361
363
  end
362
364
 
363
365
  it "returns true" do
@@ -397,7 +399,7 @@ describe Mongoid::Validatable::UniquenessValidator do
397
399
 
398
400
  it "adds the uniqueness error" do
399
401
  dictionary.valid?
400
- expect(dictionary.errors[:description]).to eq([ "is already taken" ])
402
+ expect(dictionary.errors[:description]).to eq([ "has already been taken" ])
401
403
  end
402
404
  end
403
405
  end
@@ -417,7 +419,7 @@ describe Mongoid::Validatable::UniquenessValidator do
417
419
  context "when the attribute is unique" do
418
420
 
419
421
  let!(:oxford) do
420
- Dictionary.create(name: "Oxford")
422
+ Dictionary.create!(name: "Oxford")
421
423
  end
422
424
 
423
425
  let(:dictionary) do
@@ -445,7 +447,7 @@ describe Mongoid::Validatable::UniquenessValidator do
445
447
  context "when the document is not the match" do
446
448
 
447
449
  before do
448
- Dictionary.create(name: "Oxford")
450
+ Dictionary.create!(name: "Oxford")
449
451
  end
450
452
 
451
453
  let!(:dictionary) do
@@ -458,7 +460,7 @@ describe Mongoid::Validatable::UniquenessValidator do
458
460
 
459
461
  it "adds the uniqueness error" do
460
462
  dictionary.valid?
461
- expect(dictionary.errors[:name]).to eq([ "is already taken" ])
463
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
462
464
  end
463
465
  end
464
466
 
@@ -467,7 +469,7 @@ describe Mongoid::Validatable::UniquenessValidator do
467
469
  context "when the field has changed" do
468
470
 
469
471
  let!(:dictionary) do
470
- Dictionary.create(name: "Oxford")
472
+ Dictionary.create!(name: "Oxford")
471
473
  end
472
474
 
473
475
  it "returns true" do
@@ -519,7 +521,7 @@ describe Mongoid::Validatable::UniquenessValidator do
519
521
  context "when the attribute is not unique" do
520
522
 
521
523
  before do
522
- Dictionary.create(name: "Oxford")
524
+ Dictionary.create!(name: "Oxford")
523
525
  end
524
526
 
525
527
  let(:dictionary) do
@@ -546,7 +548,7 @@ describe Mongoid::Validatable::UniquenessValidator do
546
548
  context "when the attribute is unique" do
547
549
 
548
550
  before do
549
- Dictionary.create(name: "Oxford", language: "English")
551
+ Dictionary.create!(name: "Oxford", language: "English")
550
552
  end
551
553
 
552
554
  let(:dictionary) do
@@ -561,7 +563,7 @@ describe Mongoid::Validatable::UniquenessValidator do
561
563
  context "when the attribute is unique in the scope" do
562
564
 
563
565
  before do
564
- Dictionary.create(name: "Oxford", language: "English")
566
+ Dictionary.create!(name: "Oxford", language: "English")
565
567
  end
566
568
 
567
569
  let(:dictionary) do
@@ -576,7 +578,7 @@ describe Mongoid::Validatable::UniquenessValidator do
576
578
  context "when the attribute is not unique with no scope" do
577
579
 
578
580
  before do
579
- Dictionary.create(name: "Oxford", language: "English")
581
+ Dictionary.create!(name: "Oxford", language: "English")
580
582
  end
581
583
 
582
584
  let(:dictionary) do
@@ -591,7 +593,7 @@ describe Mongoid::Validatable::UniquenessValidator do
591
593
  context "when the attribute is not unique in another scope" do
592
594
 
593
595
  before do
594
- Dictionary.create(name: "Oxford", language: "English")
596
+ Dictionary.create!(name: "Oxford", language: "English")
595
597
  end
596
598
 
597
599
  let(:dictionary) do
@@ -608,7 +610,7 @@ describe Mongoid::Validatable::UniquenessValidator do
608
610
  context "when the document is not the match" do
609
611
 
610
612
  before do
611
- Dictionary.create(name: "Oxford", language: "English")
613
+ Dictionary.create!(name: "Oxford", language: "English")
612
614
  end
613
615
 
614
616
  let(:dictionary) do
@@ -621,14 +623,14 @@ describe Mongoid::Validatable::UniquenessValidator do
621
623
 
622
624
  it "adds the uniqueness errors" do
623
625
  dictionary.valid?
624
- expect(dictionary.errors[:name]).to eq([ "is already taken" ])
626
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
625
627
  end
626
628
  end
627
629
 
628
630
  context "when the document is the match in the database" do
629
631
 
630
632
  let!(:dictionary) do
631
- Dictionary.create(name: "Oxford", language: "English")
633
+ Dictionary.create!(name: "Oxford", language: "English")
632
634
  end
633
635
 
634
636
  it "returns true" do
@@ -651,7 +653,7 @@ describe Mongoid::Validatable::UniquenessValidator do
651
653
  context "when the attribute is unique" do
652
654
 
653
655
  before do
654
- Dictionary.create(name: "Oxford", publisher: "Amazon")
656
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
655
657
  end
656
658
 
657
659
  let(:dictionary) do
@@ -666,7 +668,7 @@ describe Mongoid::Validatable::UniquenessValidator do
666
668
  context "when the attribute is unique in the scope" do
667
669
 
668
670
  before do
669
- Dictionary.create(name: "Oxford", publisher: "Amazon")
671
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
670
672
  end
671
673
 
672
674
  let(:dictionary) do
@@ -699,14 +701,14 @@ describe Mongoid::Validatable::UniquenessValidator do
699
701
 
700
702
  it "should set an error for associated object not being unique" do
701
703
  item.update_attributes(folder_id: personal_folder.id)
702
- expect(item.errors.messages[:name].first).to eq("is already taken")
704
+ expect(item.errors.messages[:name].first).to eq("has already been taken")
703
705
  end
704
706
  end
705
707
 
706
708
  context "when the attribute is not unique with no scope" do
707
709
 
708
710
  before do
709
- Dictionary.create(name: "Oxford", publisher: "Amazon")
711
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
710
712
  end
711
713
 
712
714
  let(:dictionary) do
@@ -721,7 +723,7 @@ describe Mongoid::Validatable::UniquenessValidator do
721
723
  context "when the attribute is not unique in another scope" do
722
724
 
723
725
  before do
724
- Dictionary.create(name: "Oxford", publisher: "Amazon")
726
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
725
727
  end
726
728
 
727
729
  let(:dictionary) do
@@ -738,7 +740,7 @@ describe Mongoid::Validatable::UniquenessValidator do
738
740
  context "when the document is not the match" do
739
741
 
740
742
  before do
741
- Dictionary.create(name: "Oxford", publisher: "Amazon")
743
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
742
744
  end
743
745
 
744
746
  let(:dictionary) do
@@ -751,14 +753,14 @@ describe Mongoid::Validatable::UniquenessValidator do
751
753
 
752
754
  it "adds the uniqueness errors" do
753
755
  dictionary.valid?
754
- expect(dictionary.errors[:name]).to eq([ "is already taken" ])
756
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
755
757
  end
756
758
  end
757
759
 
758
760
  context "when the document is the match in the database" do
759
761
 
760
762
  let!(:dictionary) do
761
- Dictionary.create(name: "Oxford", publisher: "Amazon")
763
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
762
764
  end
763
765
 
764
766
  it "returns true" do
@@ -769,7 +771,7 @@ describe Mongoid::Validatable::UniquenessValidator do
769
771
  context "when one of the scopes is a time" do
770
772
 
771
773
  before do
772
- Dictionary.create(
774
+ Dictionary.create!(
773
775
  name: "Oxford",
774
776
  publisher: "Amazon",
775
777
  published: 10.days.ago.to_time
@@ -790,26 +792,53 @@ describe Mongoid::Validatable::UniquenessValidator do
790
792
 
791
793
  it "adds the uniqueness errors" do
792
794
  dictionary.valid?
793
- expect(dictionary.errors[:name]).to eq([ "is already taken" ])
795
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
794
796
  end
795
797
  end
796
798
  end
797
799
  end
798
800
 
799
- context "when a range scope is provided" do
801
+ context "when a range condition is provided" do
800
802
 
801
803
  before do
802
- Dictionary.validates_uniqueness_of(:name, :scope => Dictionary.where(:year.gte => 1900, :year.lt => 2000))
803
- Dictionary.create(name: "French-English", year: 1950)
804
- Dictionary.create(name: "French-English", year: 1960)
804
+ Dictionary.validates_uniqueness_of(:name,
805
+ conditions: -> { Dictionary.where(:year.gte => 1900, :year.lt => 2000) })
805
806
  end
806
807
 
807
808
  after do
808
809
  Dictionary.reset_callbacks(:validate)
809
810
  end
810
811
 
811
- it "successfully prevents uniqueness violation" do
812
- expect(Dictionary.all.size).to eq(1)
812
+ context 'when multiple documents would match the condition' do
813
+ it "prevents creation of new document" do
814
+ Dictionary.create!(name: "French-English", year: 1950)
815
+
816
+ expect do
817
+ Dictionary.create!(name: "French-English", year: 1960)
818
+ end.to raise_error(Mongoid::Errors::Validations, /Name has already been taken/)
819
+
820
+ expect(Dictionary.all.size).to eq(1)
821
+ end
822
+ end
823
+
824
+ context 'when only new document would match the condition' do
825
+ it 'creates the new document' do
826
+ Dictionary.create!(name: "French-English", year: 950)
827
+ expect do
828
+ Dictionary.create!(name: "French-English", year: 1950)
829
+ end.not_to raise_error
830
+ end
831
+ end
832
+
833
+ context 'when only existing document matches the condition' do
834
+ it 'creates the new document' do
835
+ pending 'https://jira.mongodb.org/browse/MONGOID-4815'
836
+
837
+ Dictionary.create!(name: "French-English", year: 1950)
838
+ expect do
839
+ Dictionary.create!(name: "French-English", year: 950)
840
+ end.not_to raise_error
841
+ end
813
842
  end
814
843
  end
815
844
 
@@ -826,7 +855,7 @@ describe Mongoid::Validatable::UniquenessValidator do
826
855
  context "when the attribute is unique" do
827
856
 
828
857
  before do
829
- Dictionary.create(name: "Oxford", publisher: "Amazon")
858
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
830
859
  end
831
860
 
832
861
  let(:dictionary) do
@@ -841,7 +870,7 @@ describe Mongoid::Validatable::UniquenessValidator do
841
870
  context "when the attribute is unique in the scope" do
842
871
 
843
872
  before do
844
- Dictionary.create(
873
+ Dictionary.create!(
845
874
  name: "Oxford",
846
875
  publisher: "Amazon",
847
876
  year: 2011
@@ -864,7 +893,7 @@ describe Mongoid::Validatable::UniquenessValidator do
864
893
  context "when the attribute is not unique with no scope" do
865
894
 
866
895
  before do
867
- Dictionary.create(name: "Oxford", publisher: "Amazon")
896
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
868
897
  end
869
898
 
870
899
  let(:dictionary) do
@@ -879,7 +908,7 @@ describe Mongoid::Validatable::UniquenessValidator do
879
908
  context "when the attribute is not unique in another scope" do
880
909
 
881
910
  before do
882
- Dictionary.create(
911
+ Dictionary.create!(
883
912
  name: "Oxford",
884
913
  publisher: "Amazon",
885
914
  year: 1995
@@ -904,7 +933,7 @@ describe Mongoid::Validatable::UniquenessValidator do
904
933
  context "when the document is not the match" do
905
934
 
906
935
  before do
907
- Dictionary.create(
936
+ Dictionary.create!(
908
937
  name: "Oxford",
909
938
  publisher: "Amazon",
910
939
  year: 1960
@@ -925,14 +954,14 @@ describe Mongoid::Validatable::UniquenessValidator do
925
954
 
926
955
  it "adds the uniqueness errors" do
927
956
  dictionary.valid?
928
- expect(dictionary.errors[:name]).to eq([ "is already taken" ])
957
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
929
958
  end
930
959
  end
931
960
 
932
961
  context "when the document is the match in the database" do
933
962
 
934
963
  let!(:dictionary) do
935
- Dictionary.create(
964
+ Dictionary.create!(
936
965
  name: "Oxford",
937
966
  publisher: "Amazon",
938
967
  year: 1960
@@ -959,7 +988,7 @@ describe Mongoid::Validatable::UniquenessValidator do
959
988
  context "when the attribute is unique" do
960
989
 
961
990
  before do
962
- Dictionary.create(name: "Oxford")
991
+ Dictionary.create!(name: "Oxford")
963
992
  end
964
993
 
965
994
  let(:dictionary) do
@@ -976,7 +1005,7 @@ describe Mongoid::Validatable::UniquenessValidator do
976
1005
  context "when the document is not the match" do
977
1006
 
978
1007
  before do
979
- Dictionary.create(name: "Oxford")
1008
+ Dictionary.create!(name: "Oxford")
980
1009
  end
981
1010
 
982
1011
  let(:dictionary) do
@@ -989,14 +1018,14 @@ describe Mongoid::Validatable::UniquenessValidator do
989
1018
 
990
1019
  it "adds the uniqueness error" do
991
1020
  dictionary.valid?
992
- expect(dictionary.errors[:name]).to eq([ "is already taken" ])
1021
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
993
1022
  end
994
1023
  end
995
1024
 
996
1025
  context "when the document is the match in the database" do
997
1026
 
998
1027
  let!(:dictionary) do
999
- Dictionary.create(name: "Oxford")
1028
+ Dictionary.create!(name: "Oxford")
1000
1029
  end
1001
1030
 
1002
1031
  it "returns true" do
@@ -1021,7 +1050,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1021
1050
  context "when there are no special characters" do
1022
1051
 
1023
1052
  before do
1024
- Dictionary.create(name: "Oxford")
1053
+ Dictionary.create!(name: "Oxford")
1025
1054
  end
1026
1055
 
1027
1056
  let(:dictionary) do
@@ -1036,7 +1065,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1036
1065
  context "when special characters exist" do
1037
1066
 
1038
1067
  before do
1039
- Dictionary.create(name: "Oxford")
1068
+ Dictionary.create!(name: "Oxford")
1040
1069
  end
1041
1070
 
1042
1071
  let(:dictionary) do
@@ -1054,7 +1083,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1054
1083
  context "when the document is not the match" do
1055
1084
 
1056
1085
  before do
1057
- Dictionary.create(name: "Oxford")
1086
+ Dictionary.create!(name: "Oxford")
1058
1087
  end
1059
1088
 
1060
1089
  let(:dictionary) do
@@ -1067,14 +1096,14 @@ describe Mongoid::Validatable::UniquenessValidator do
1067
1096
 
1068
1097
  it "adds the uniqueness error" do
1069
1098
  dictionary.valid?
1070
- expect(dictionary.errors[:name]).to eq([ "is already taken" ])
1099
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
1071
1100
  end
1072
1101
  end
1073
1102
 
1074
1103
  context "when the document is the match in the database" do
1075
1104
 
1076
1105
  let!(:dictionary) do
1077
- Dictionary.create(name: "Oxford")
1106
+ Dictionary.create!(name: "Oxford")
1078
1107
  end
1079
1108
 
1080
1109
  it "returns true" do
@@ -1104,7 +1133,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1104
1133
  context "when the attribute is nil" do
1105
1134
 
1106
1135
  before do
1107
- Dictionary.create
1136
+ Dictionary.create!
1108
1137
  end
1109
1138
 
1110
1139
  let(:dictionary) do
@@ -1130,7 +1159,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1130
1159
  context "when the attribute is blank" do
1131
1160
 
1132
1161
  before do
1133
- Dictionary.create(name: "")
1162
+ Dictionary.create!(name: "")
1134
1163
  end
1135
1164
 
1136
1165
  let(:dictionary) do
@@ -1159,7 +1188,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1159
1188
  context "when the attribute is unique" do
1160
1189
 
1161
1190
  before do
1162
- Login.create(username: "Oxford")
1191
+ Login.create!(username: "Oxford")
1163
1192
  end
1164
1193
 
1165
1194
  let(:login) do
@@ -1176,7 +1205,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1176
1205
  context "when the document is not the match" do
1177
1206
 
1178
1207
  before do
1179
- Login.create(username: "Oxford")
1208
+ Login.create!(username: "Oxford")
1180
1209
  end
1181
1210
 
1182
1211
  let(:login) do
@@ -1189,14 +1218,14 @@ describe Mongoid::Validatable::UniquenessValidator do
1189
1218
 
1190
1219
  it "adds the uniqueness error" do
1191
1220
  login.valid?
1192
- expect(login.errors[:username]).to eq([ "is already taken" ])
1221
+ expect(login.errors[:username]).to eq([ "has already been taken" ])
1193
1222
  end
1194
1223
  end
1195
1224
 
1196
1225
  context "when the document is the match in the database" do
1197
1226
 
1198
1227
  let!(:login) do
1199
- Login.create(username: "Oxford")
1228
+ Login.create!(username: "Oxford")
1200
1229
  end
1201
1230
 
1202
1231
  it "returns true" do
@@ -1219,7 +1248,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1219
1248
  context "when the attribute is unique" do
1220
1249
 
1221
1250
  before do
1222
- Login.create(username: "Oxford", application_id: 1)
1251
+ Login.create!(username: "Oxford", application_id: 1)
1223
1252
  end
1224
1253
 
1225
1254
  let(:login) do
@@ -1234,7 +1263,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1234
1263
  context "when the attribute is unique in the scope" do
1235
1264
 
1236
1265
  before do
1237
- Login.create(username: "Oxford", application_id: 1)
1266
+ Login.create!(username: "Oxford", application_id: 1)
1238
1267
  end
1239
1268
 
1240
1269
  let(:login) do
@@ -1249,7 +1278,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1249
1278
  context "when the attribute is not unique with no scope" do
1250
1279
 
1251
1280
  before do
1252
- Login.create(username: "Oxford", application_id: 1)
1281
+ Login.create!(username: "Oxford", application_id: 1)
1253
1282
  end
1254
1283
 
1255
1284
  let(:login) do
@@ -1264,7 +1293,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1264
1293
  context "when the attribute is not unique in another scope" do
1265
1294
 
1266
1295
  before do
1267
- Login.create(username: "Oxford", application_id: 1)
1296
+ Login.create!(username: "Oxford", application_id: 1)
1268
1297
  end
1269
1298
 
1270
1299
  let(:login) do
@@ -1281,7 +1310,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1281
1310
  context "when the document is not the match" do
1282
1311
 
1283
1312
  before do
1284
- Login.create(username: "Oxford", application_id: 1)
1313
+ Login.create!(username: "Oxford", application_id: 1)
1285
1314
  end
1286
1315
 
1287
1316
  let(:login) do
@@ -1294,14 +1323,14 @@ describe Mongoid::Validatable::UniquenessValidator do
1294
1323
 
1295
1324
  it "adds the uniqueness errors" do
1296
1325
  login.valid?
1297
- expect(login.errors[:username]).to eq([ "is already taken" ])
1326
+ expect(login.errors[:username]).to eq([ "has already been taken" ])
1298
1327
  end
1299
1328
  end
1300
1329
 
1301
1330
  context "when the document is the match in the database" do
1302
1331
 
1303
1332
  let!(:login) do
1304
- Login.create(username: "Oxford", application_id: 1)
1333
+ Login.create!(username: "Oxford", application_id: 1)
1305
1334
  end
1306
1335
 
1307
1336
  it "returns true" do
@@ -1324,7 +1353,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1324
1353
  context "when the attribute is unique" do
1325
1354
 
1326
1355
  before do
1327
- Login.create(username: "Oxford")
1356
+ Login.create!(username: "Oxford")
1328
1357
  end
1329
1358
 
1330
1359
  let(:login) do
@@ -1341,7 +1370,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1341
1370
  context "when the document is not the match" do
1342
1371
 
1343
1372
  before do
1344
- Login.create(username: "Oxford")
1373
+ Login.create!(username: "Oxford")
1345
1374
  end
1346
1375
 
1347
1376
  let(:login) do
@@ -1354,14 +1383,14 @@ describe Mongoid::Validatable::UniquenessValidator do
1354
1383
 
1355
1384
  it "adds the uniqueness error" do
1356
1385
  login.valid?
1357
- expect(login.errors[:username]).to eq([ "is already taken" ])
1386
+ expect(login.errors[:username]).to eq([ "has already been taken" ])
1358
1387
  end
1359
1388
  end
1360
1389
 
1361
1390
  context "when the document is the match in the database" do
1362
1391
 
1363
1392
  let!(:login) do
1364
- Login.create(username: "Oxford")
1393
+ Login.create!(username: "Oxford")
1365
1394
  end
1366
1395
 
1367
1396
  it "returns true" do
@@ -1386,7 +1415,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1386
1415
  context "when there are no special characters" do
1387
1416
 
1388
1417
  before do
1389
- Login.create(username: "Oxford")
1418
+ Login.create!(username: "Oxford")
1390
1419
  end
1391
1420
 
1392
1421
  let(:login) do
@@ -1401,7 +1430,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1401
1430
  context "when special characters exist" do
1402
1431
 
1403
1432
  before do
1404
- Login.create(username: "Oxford")
1433
+ Login.create!(username: "Oxford")
1405
1434
  end
1406
1435
 
1407
1436
  let(:login) do
@@ -1419,7 +1448,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1419
1448
  context "when the document is not the match" do
1420
1449
 
1421
1450
  before do
1422
- Login.create(username: "Oxford")
1451
+ Login.create!(username: "Oxford")
1423
1452
  end
1424
1453
 
1425
1454
  let(:login) do
@@ -1432,14 +1461,14 @@ describe Mongoid::Validatable::UniquenessValidator do
1432
1461
 
1433
1462
  it "adds the uniqueness error" do
1434
1463
  login.valid?
1435
- expect(login.errors[:username]).to eq([ "is already taken" ])
1464
+ expect(login.errors[:username]).to eq([ "has already been taken" ])
1436
1465
  end
1437
1466
  end
1438
1467
 
1439
1468
  context "when the document is the match in the database" do
1440
1469
 
1441
1470
  let!(:login) do
1442
- Login.create(username: "Oxford")
1471
+ Login.create!(username: "Oxford")
1443
1472
  end
1444
1473
 
1445
1474
  it "returns true" do
@@ -1462,7 +1491,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1462
1491
  context "when the attribute is nil" do
1463
1492
 
1464
1493
  before do
1465
- Login.create
1494
+ Login.create!
1466
1495
  end
1467
1496
 
1468
1497
  let(:login) do
@@ -1488,7 +1517,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1488
1517
  context "when the attribute is blank" do
1489
1518
 
1490
1519
  before do
1491
- Login.create(username: "")
1520
+ Login.create!(username: "")
1492
1521
  end
1493
1522
 
1494
1523
  let(:login) do
@@ -1515,7 +1544,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1515
1544
  context "when the attribute is unique" do
1516
1545
 
1517
1546
  before do
1518
- Bar.create(lat_lng: LatLng.new(52.30, 13.25))
1547
+ Bar.create!(lat_lng: LatLng.new(52.30, 13.25))
1519
1548
  end
1520
1549
 
1521
1550
  let(:unique_bar) do
@@ -1531,7 +1560,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1531
1560
  context "when the attribute is not unique" do
1532
1561
 
1533
1562
  before do
1534
- Bar.create(lat_lng: LatLng.new(52.30, 13.25))
1563
+ Bar.create!(lat_lng: LatLng.new(52.30, 13.25))
1535
1564
  end
1536
1565
 
1537
1566
  let(:non_unique_bar) do
@@ -1558,7 +1587,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1558
1587
  context "when the attribute is unique" do
1559
1588
 
1560
1589
  before do
1561
- Band.create(name: 'Foo', active: false)
1590
+ Band.create!(name: 'Foo', active: false)
1562
1591
  end
1563
1592
 
1564
1593
  let(:unique_band) do
@@ -1574,7 +1603,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1574
1603
  context "when the attribute is not unique" do
1575
1604
 
1576
1605
  before do
1577
- Band.create(name: 'Foo')
1606
+ Band.create!(name: 'Foo')
1578
1607
  end
1579
1608
 
1580
1609
  let(:non_unique_band) do
@@ -1592,17 +1621,17 @@ describe Mongoid::Validatable::UniquenessValidator do
1592
1621
  context "when the document is embedded" do
1593
1622
 
1594
1623
  let(:word) do
1595
- Word.create(name: "Schadenfreude")
1624
+ Word.create!(name: "Schadenfreude")
1596
1625
  end
1597
1626
 
1598
1627
  context "when in an embeds_many" do
1599
1628
 
1600
1629
  let!(:def_one) do
1601
- word.definitions.create(description: "1")
1630
+ word.definitions.create!(description: "1")
1602
1631
  end
1603
1632
 
1604
1633
  let!(:def_two) do
1605
- word.definitions.create(description: "2")
1634
+ word.definitions.create!(description: "2")
1606
1635
  end
1607
1636
 
1608
1637
  context "when a document is being destroyed" do
@@ -1681,7 +1710,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1681
1710
 
1682
1711
  it "adds the uniqueness error" do
1683
1712
  definition.valid?
1684
- expect(definition.errors[:description]).to eq([ "is already taken" ])
1713
+ expect(definition.errors[:description]).to eq([ "has already been taken" ])
1685
1714
  end
1686
1715
  end
1687
1716
 
@@ -1809,7 +1838,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1809
1838
 
1810
1839
  it "adds the uniqueness errors" do
1811
1840
  definition.valid?
1812
- expect(definition.errors[:description]).to eq([ "is already taken" ])
1841
+ expect(definition.errors[:description]).to eq([ "has already been taken" ])
1813
1842
  end
1814
1843
  end
1815
1844
 
@@ -1947,7 +1976,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1947
1976
 
1948
1977
  it "adds the uniqueness errors" do
1949
1978
  definition.valid?
1950
- expect(definition.errors[:description]).to eq([ "is already taken" ])
1979
+ expect(definition.errors[:description]).to eq([ "has already been taken" ])
1951
1980
  end
1952
1981
  end
1953
1982
 
@@ -2011,7 +2040,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2011
2040
 
2012
2041
  it "adds the uniqueness error" do
2013
2042
  definition.valid?
2014
- expect(definition.errors[:description]).to eq([ "is already taken" ])
2043
+ expect(definition.errors[:description]).to eq([ "has already been taken" ])
2015
2044
  end
2016
2045
  end
2017
2046
 
@@ -2089,7 +2118,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2089
2118
 
2090
2119
  it "adds the uniqueness error" do
2091
2120
  definition.valid?
2092
- expect(definition.errors[:description]).to eq([ "is already taken" ])
2121
+ expect(definition.errors[:description]).to eq([ "has already been taken" ])
2093
2122
  end
2094
2123
  end
2095
2124
 
@@ -2185,7 +2214,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2185
2214
  it "adds the uniqueness error to the aliased field name" do
2186
2215
  definition.valid?
2187
2216
  expect(definition.errors).to have_key(:part)
2188
- expect(definition.errors[:part]).to eq([ "is already taken" ])
2217
+ expect(definition.errors[:part]).to eq([ "has already been taken" ])
2189
2218
  end
2190
2219
  end
2191
2220
 
@@ -2202,7 +2231,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2202
2231
  it "adds the uniqueness error to the underlying field name" do
2203
2232
  definition.valid?
2204
2233
  expect(definition.errors).to have_key(:p)
2205
- expect(definition.errors[:p]).to eq([ "is already taken" ])
2234
+ expect(definition.errors[:p]).to eq([ "has already been taken" ])
2206
2235
  end
2207
2236
  end
2208
2237
 
@@ -2221,7 +2250,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2221
2250
  it "adds the uniqueness error to the aliased field name" do
2222
2251
  definition.valid?
2223
2252
  expect(definition.errors).to have_key(:synonyms)
2224
- expect(definition.errors[:synonyms]).to eq([ "is already taken" ])
2253
+ expect(definition.errors[:synonyms]).to eq([ "has already been taken" ])
2225
2254
  end
2226
2255
  end
2227
2256
 
@@ -2238,7 +2267,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2238
2267
  it "adds the uniqueness error to the aliased field name" do
2239
2268
  definition.valid?
2240
2269
  expect(definition.errors).to have_key(:syn)
2241
- expect(definition.errors[:syn]).to eq([ "is already taken" ])
2270
+ expect(definition.errors[:syn]).to eq([ "has already been taken" ])
2242
2271
  end
2243
2272
  end
2244
2273
  end
@@ -2290,7 +2319,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2290
2319
 
2291
2320
  it "adds the uniqueness error" do
2292
2321
  word_origin.valid?
2293
- expect(word_origin.errors[:origin_id]).to eq([ "is already taken" ])
2322
+ expect(word_origin.errors[:origin_id]).to eq([ "has already been taken" ])
2294
2323
  end
2295
2324
  end
2296
2325
 
@@ -2415,7 +2444,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2415
2444
  it "should be invalid" do
2416
2445
  subclass_document_with_duplicated_name.tap do |d|
2417
2446
  expect(d).to be_invalid
2418
- expect(d.errors[:name]).to eq([ "is already taken" ])
2447
+ expect(d.errors[:name]).to eq([ "has already been taken" ])
2419
2448
  end
2420
2449
  end
2421
2450
  end
@@ -2429,7 +2458,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2429
2458
  end
2430
2459
 
2431
2460
  let!(:person) do
2432
- Person.create(ssn: "132-11-1111", username: "aaasdaffff")
2461
+ Person.create!(ssn: "132-11-1111", username: "aaasdaffff")
2433
2462
  end
2434
2463
 
2435
2464
  after do
@@ -2443,4 +2472,31 @@ describe Mongoid::Validatable::UniquenessValidator do
2443
2472
  }.to raise_error(Mongo::Error::OperationFailure)
2444
2473
  end
2445
2474
  end
2475
+
2476
+ describe "i18n" do
2477
+
2478
+ context 'when using a different locale' do
2479
+ with_default_i18n_configs
2480
+
2481
+ before do
2482
+ I18n.locale = :fr
2483
+ # Translation key location is as per rails-i18n gem.
2484
+ # See: https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/en.yml
2485
+ I18n.backend.store_translations(:fr, { errors: { messages: { taken: 'est déjà utilisé(e)' } } })
2486
+ end
2487
+
2488
+ after do
2489
+ # i18n 1.0 requires +send+ because +translations+ aren't public.
2490
+ # Newer i18n versions have it as public.
2491
+ I18n.backend.send(:translations).delete(:fr)
2492
+ end
2493
+
2494
+ it "correctly translates the error message" do
2495
+ Circus.create!(slogan: 'The Greatest Show on Mars')
2496
+ dict = Circus.new(slogan: 'The Greatest Show on Mars')
2497
+ dict.valid?
2498
+ expect(dict.errors.messages[:slogan]).to eq(["est déjà utilisé(e)"])
2499
+ end
2500
+ end
2501
+ end
2446
2502
  end