mongoid 7.1.1 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1094) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +20 -20
  4. data/README.md +15 -8
  5. data/Rakefile +61 -5
  6. data/lib/config/locales/en.yml +162 -56
  7. data/lib/mongoid/association/accessors.rb +89 -40
  8. data/lib/mongoid/association/bindable.rb +50 -23
  9. data/lib/mongoid/association/builders.rb +5 -12
  10. data/lib/mongoid/association/constrainable.rb +1 -5
  11. data/lib/mongoid/association/depending.rb +5 -17
  12. data/lib/mongoid/association/eager_loadable.rb +29 -10
  13. data/lib/mongoid/association/embedded/batchable.rb +64 -52
  14. data/lib/mongoid/association/embedded/cyclic.rb +3 -12
  15. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -9
  16. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -5
  17. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -16
  18. data/lib/mongoid/association/embedded/embedded_in.rb +4 -26
  19. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -7
  20. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -6
  21. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +110 -92
  22. data/lib/mongoid/association/embedded/embeds_many.rb +4 -34
  23. data/lib/mongoid/association/embedded/embeds_one/binding.rb +0 -7
  24. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -8
  25. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +50 -19
  26. data/lib/mongoid/association/embedded/embeds_one.rb +5 -31
  27. data/lib/mongoid/association/embedded.rb +0 -1
  28. data/lib/mongoid/association/macros.rb +27 -5
  29. data/lib/mongoid/association/many.rb +14 -27
  30. data/lib/mongoid/association/marshalable.rb +0 -5
  31. data/lib/mongoid/association/nested/many.rb +6 -16
  32. data/lib/mongoid/association/nested/nested_buildable.rb +4 -13
  33. data/lib/mongoid/association/nested/one.rb +48 -23
  34. data/lib/mongoid/association/nested.rb +0 -3
  35. data/lib/mongoid/association/one.rb +2 -11
  36. data/lib/mongoid/association/options.rb +9 -42
  37. data/lib/mongoid/association/proxy.rb +22 -27
  38. data/lib/mongoid/association/referenced/auto_save.rb +6 -14
  39. data/lib/mongoid/association/referenced/belongs_to/binding.rb +2 -8
  40. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +5 -6
  41. data/lib/mongoid/association/referenced/belongs_to/eager.rb +0 -1
  42. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -19
  43. data/lib/mongoid/association/referenced/belongs_to.rb +11 -36
  44. data/lib/mongoid/association/referenced/counter_cache.rb +12 -25
  45. data/lib/mongoid/association/referenced/eager.rb +5 -26
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +0 -5
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +0 -3
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +0 -1
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +81 -51
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +17 -41
  51. data/lib/mongoid/association/referenced/has_many/binding.rb +0 -5
  52. data/lib/mongoid/association/referenced/has_many/buildable.rb +0 -3
  53. data/lib/mongoid/association/referenced/has_many/eager.rb +0 -1
  54. data/lib/mongoid/association/referenced/has_many/enumerable.rb +438 -461
  55. data/lib/mongoid/association/referenced/has_many/proxy.rb +58 -84
  56. data/lib/mongoid/association/referenced/has_many.rb +15 -42
  57. data/lib/mongoid/association/referenced/has_one/binding.rb +0 -7
  58. data/lib/mongoid/association/referenced/has_one/buildable.rb +12 -5
  59. data/lib/mongoid/association/referenced/has_one/eager.rb +0 -1
  60. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +7 -22
  61. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -16
  62. data/lib/mongoid/association/referenced/has_one.rb +12 -35
  63. data/lib/mongoid/association/referenced/syncable.rb +4 -21
  64. data/lib/mongoid/association/referenced.rb +0 -1
  65. data/lib/mongoid/association/reflections.rb +4 -5
  66. data/lib/mongoid/association/relatable.rb +46 -71
  67. data/lib/mongoid/association.rb +5 -22
  68. data/lib/mongoid/atomic/modifiers.rb +7 -54
  69. data/lib/mongoid/atomic/paths/embedded/many.rb +19 -5
  70. data/lib/mongoid/atomic/paths/embedded/one.rb +0 -5
  71. data/lib/mongoid/atomic/paths/embedded.rb +0 -3
  72. data/lib/mongoid/atomic/paths/root.rb +0 -5
  73. data/lib/mongoid/atomic/paths.rb +0 -1
  74. data/lib/mongoid/atomic.rb +40 -47
  75. data/lib/mongoid/attributes/dynamic.rb +5 -22
  76. data/lib/mongoid/attributes/nested.rb +6 -11
  77. data/lib/mongoid/attributes/processing.rb +11 -21
  78. data/lib/mongoid/attributes/projector.rb +119 -0
  79. data/lib/mongoid/attributes/readonly.rb +3 -8
  80. data/lib/mongoid/attributes.rb +82 -88
  81. data/lib/mongoid/cacheable.rb +4 -9
  82. data/lib/mongoid/changeable.rb +148 -69
  83. data/lib/mongoid/clients/factory.rb +41 -17
  84. data/lib/mongoid/clients/options.rb +13 -14
  85. data/lib/mongoid/clients/sessions.rb +8 -11
  86. data/lib/mongoid/clients/storage_options.rb +7 -17
  87. data/lib/mongoid/clients/validators/storage.rb +3 -24
  88. data/lib/mongoid/clients/validators.rb +0 -1
  89. data/lib/mongoid/clients.rb +1 -10
  90. data/lib/mongoid/collection_configurable.rb +58 -0
  91. data/lib/mongoid/composable.rb +3 -7
  92. data/lib/mongoid/config/defaults.rb +60 -0
  93. data/lib/mongoid/config/environment.rb +28 -5
  94. data/lib/mongoid/config/options.rb +0 -11
  95. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  96. data/lib/mongoid/config/validators/client.rb +6 -23
  97. data/lib/mongoid/config/validators/option.rb +0 -3
  98. data/lib/mongoid/config/validators.rb +1 -1
  99. data/lib/mongoid/config.rb +183 -39
  100. data/lib/mongoid/contextual/aggregable/memory.rb +37 -26
  101. data/lib/mongoid/contextual/aggregable/mongo.rb +29 -32
  102. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  103. data/lib/mongoid/contextual/aggregable.rb +17 -0
  104. data/lib/mongoid/contextual/atomic.rb +7 -27
  105. data/lib/mongoid/contextual/command.rb +0 -5
  106. data/lib/mongoid/contextual/geo_near.rb +8 -41
  107. data/lib/mongoid/contextual/map_reduce.rb +2 -33
  108. data/lib/mongoid/contextual/memory.rb +383 -79
  109. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  110. data/lib/mongoid/contextual/mongo.rb +636 -283
  111. data/lib/mongoid/contextual/none.rb +262 -31
  112. data/lib/mongoid/contextual/queryable.rb +1 -4
  113. data/lib/mongoid/contextual.rb +14 -7
  114. data/lib/mongoid/copyable.rb +39 -16
  115. data/lib/mongoid/criteria/findable.rb +9 -19
  116. data/lib/mongoid/criteria/includable.rb +27 -31
  117. data/lib/mongoid/criteria/inspectable.rb +0 -3
  118. data/lib/mongoid/criteria/marshalable.rb +10 -7
  119. data/lib/mongoid/criteria/modifiable.rb +2 -20
  120. data/lib/mongoid/criteria/options.rb +0 -3
  121. data/lib/mongoid/criteria/permission.rb +1 -2
  122. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -15
  123. data/lib/mongoid/criteria/queryable/expandable.rb +0 -25
  124. data/lib/mongoid/criteria/queryable/extensions/array.rb +4 -40
  125. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -7
  126. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +3 -6
  127. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -8
  128. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -6
  129. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -40
  130. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +0 -13
  131. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -20
  132. data/lib/mongoid/criteria/queryable/extensions/object.rb +3 -29
  133. data/lib/mongoid/criteria/queryable/extensions/range.rb +46 -16
  134. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -18
  135. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -4
  136. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -31
  137. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -21
  138. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -8
  139. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +16 -6
  140. data/lib/mongoid/criteria/queryable/extensions.rb +0 -5
  141. data/lib/mongoid/criteria/queryable/key.rb +6 -19
  142. data/lib/mongoid/criteria/queryable/macroable.rb +0 -3
  143. data/lib/mongoid/criteria/queryable/mergeable.rb +123 -38
  144. data/lib/mongoid/criteria/queryable/optional.rb +11 -62
  145. data/lib/mongoid/criteria/queryable/options.rb +2 -21
  146. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -14
  147. data/lib/mongoid/criteria/queryable/selectable.rb +138 -125
  148. data/lib/mongoid/criteria/queryable/selector.rb +94 -30
  149. data/lib/mongoid/criteria/queryable/smash.rb +40 -18
  150. data/lib/mongoid/criteria/queryable/storable.rb +14 -10
  151. data/lib/mongoid/criteria/queryable.rb +11 -13
  152. data/lib/mongoid/criteria/scopable.rb +27 -21
  153. data/lib/mongoid/criteria/translator.rb +45 -0
  154. data/lib/mongoid/criteria.rb +88 -108
  155. data/lib/mongoid/deprecable.rb +36 -0
  156. data/lib/mongoid/deprecation.rb +25 -0
  157. data/lib/mongoid/document.rb +149 -99
  158. data/lib/mongoid/equality.rb +32 -16
  159. data/lib/mongoid/errors/ambiguous_relationship.rb +2 -5
  160. data/lib/mongoid/errors/callback.rb +0 -3
  161. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  162. data/lib/mongoid/errors/criteria_argument_required.rb +0 -1
  163. data/lib/mongoid/errors/delete_restriction.rb +8 -12
  164. data/lib/mongoid/errors/document_not_destroyed.rb +2 -7
  165. data/lib/mongoid/errors/document_not_found.rb +33 -21
  166. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  167. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  168. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  169. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -3
  170. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  171. data/lib/mongoid/errors/invalid_collection.rb +0 -1
  172. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  173. data/lib/mongoid/errors/invalid_config_option.rb +1 -4
  174. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -4
  175. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  176. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  177. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  178. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  179. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  180. data/lib/mongoid/errors/invalid_field.rb +6 -7
  181. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  182. data/lib/mongoid/errors/invalid_field_option.rb +0 -3
  183. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  184. data/lib/mongoid/errors/invalid_find.rb +0 -3
  185. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  186. data/lib/mongoid/errors/invalid_includes.rb +0 -3
  187. data/lib/mongoid/errors/invalid_index.rb +0 -3
  188. data/lib/mongoid/errors/invalid_options.rb +0 -3
  189. data/lib/mongoid/errors/invalid_path.rb +0 -3
  190. data/lib/mongoid/errors/invalid_persistence_option.rb +0 -5
  191. data/lib/mongoid/errors/invalid_query.rb +40 -0
  192. data/lib/mongoid/errors/invalid_relation.rb +1 -8
  193. data/lib/mongoid/errors/invalid_relation_option.rb +1 -4
  194. data/lib/mongoid/errors/invalid_scope.rb +0 -3
  195. data/lib/mongoid/errors/invalid_session_use.rb +1 -6
  196. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +0 -1
  197. data/lib/mongoid/errors/invalid_storage_options.rb +1 -4
  198. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
  199. data/lib/mongoid/errors/invalid_time.rb +0 -3
  200. data/lib/mongoid/errors/inverse_not_found.rb +0 -3
  201. data/lib/mongoid/errors/mixed_client_configuration.rb +0 -3
  202. data/lib/mongoid/errors/mixed_relations.rb +0 -3
  203. data/lib/mongoid/errors/mongoid_error.rb +4 -13
  204. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -4
  205. data/lib/mongoid/errors/no_client_config.rb +2 -5
  206. data/lib/mongoid/errors/no_client_database.rb +1 -4
  207. data/lib/mongoid/errors/no_client_hosts.rb +1 -4
  208. data/lib/mongoid/errors/no_clients_config.rb +0 -3
  209. data/lib/mongoid/errors/no_default_client.rb +1 -4
  210. data/lib/mongoid/errors/no_environment.rb +0 -3
  211. data/lib/mongoid/errors/no_map_reduce_output.rb +0 -3
  212. data/lib/mongoid/errors/no_metadata.rb +0 -3
  213. data/lib/mongoid/errors/no_parent.rb +0 -3
  214. data/lib/mongoid/errors/readonly_attribute.rb +1 -4
  215. data/lib/mongoid/errors/readonly_document.rb +1 -6
  216. data/lib/mongoid/errors/scope_overwrite.rb +0 -1
  217. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -2
  218. data/lib/mongoid/errors/unknown_attribute.rb +1 -4
  219. data/lib/mongoid/errors/unknown_model.rb +0 -3
  220. data/lib/mongoid/errors/unsaved_document.rb +1 -2
  221. data/lib/mongoid/errors/unsupported_javascript.rb +0 -3
  222. data/lib/mongoid/errors/validations.rb +0 -1
  223. data/lib/mongoid/errors.rb +15 -4
  224. data/lib/mongoid/evolvable.rb +1 -4
  225. data/lib/mongoid/extensions/array.rb +12 -36
  226. data/lib/mongoid/extensions/big_decimal.rb +33 -21
  227. data/lib/mongoid/extensions/binary.rb +42 -0
  228. data/lib/mongoid/extensions/boolean.rb +8 -6
  229. data/lib/mongoid/extensions/date.rb +26 -29
  230. data/lib/mongoid/extensions/date_time.rb +1 -10
  231. data/lib/mongoid/extensions/decimal128.rb +0 -5
  232. data/lib/mongoid/extensions/false_class.rb +3 -8
  233. data/lib/mongoid/extensions/float.rb +7 -11
  234. data/lib/mongoid/extensions/hash.rb +19 -37
  235. data/lib/mongoid/extensions/integer.rb +7 -13
  236. data/lib/mongoid/extensions/module.rb +1 -4
  237. data/lib/mongoid/extensions/nil_class.rb +0 -5
  238. data/lib/mongoid/extensions/object.rb +11 -48
  239. data/lib/mongoid/extensions/object_id.rb +0 -7
  240. data/lib/mongoid/extensions/range.rb +40 -20
  241. data/lib/mongoid/extensions/regexp.rb +12 -8
  242. data/lib/mongoid/extensions/set.rb +11 -11
  243. data/lib/mongoid/extensions/string.rb +12 -52
  244. data/lib/mongoid/extensions/symbol.rb +4 -22
  245. data/lib/mongoid/extensions/time.rb +28 -26
  246. data/lib/mongoid/extensions/time_with_zone.rb +14 -11
  247. data/lib/mongoid/extensions/true_class.rb +3 -8
  248. data/lib/mongoid/extensions.rb +17 -3
  249. data/lib/mongoid/factory.rb +80 -16
  250. data/lib/mongoid/fields/foreign_key.rb +11 -25
  251. data/lib/mongoid/fields/localized.rb +19 -15
  252. data/lib/mongoid/fields/standard.rb +17 -40
  253. data/lib/mongoid/fields/validators/macro.rb +25 -24
  254. data/lib/mongoid/fields/validators.rb +0 -1
  255. data/lib/mongoid/fields.rb +346 -75
  256. data/lib/mongoid/findable.rb +107 -31
  257. data/lib/mongoid/indexable/specification.rb +2 -17
  258. data/lib/mongoid/indexable/validators/options.rb +6 -9
  259. data/lib/mongoid/indexable.rb +3 -20
  260. data/lib/mongoid/inspectable.rb +2 -11
  261. data/lib/mongoid/interceptable.rb +79 -41
  262. data/lib/mongoid/loggable.rb +0 -9
  263. data/lib/mongoid/matchable.rb +2 -155
  264. data/lib/mongoid/matcher/all.rb +22 -0
  265. data/lib/mongoid/matcher/and.rb +21 -0
  266. data/lib/mongoid/matcher/bits.rb +41 -0
  267. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  268. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  269. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  270. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  271. data/lib/mongoid/matcher/elem_match.rb +36 -0
  272. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  273. data/lib/mongoid/matcher/eq.rb +11 -0
  274. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  275. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  276. data/lib/mongoid/matcher/exists.rb +15 -0
  277. data/lib/mongoid/matcher/expression.rb +35 -0
  278. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  279. data/lib/mongoid/matcher/field_expression.rb +62 -0
  280. data/lib/mongoid/matcher/field_operator.rb +54 -0
  281. data/lib/mongoid/matcher/gt.rb +17 -0
  282. data/lib/mongoid/matcher/gte.rb +17 -0
  283. data/lib/mongoid/matcher/in.rb +25 -0
  284. data/lib/mongoid/matcher/lt.rb +17 -0
  285. data/lib/mongoid/matcher/lte.rb +17 -0
  286. data/lib/mongoid/matcher/mod.rb +17 -0
  287. data/lib/mongoid/matcher/ne.rb +16 -0
  288. data/lib/mongoid/matcher/nin.rb +11 -0
  289. data/lib/mongoid/matcher/nor.rb +25 -0
  290. data/lib/mongoid/matcher/not.rb +29 -0
  291. data/lib/mongoid/matcher/or.rb +21 -0
  292. data/lib/mongoid/matcher/regex.rb +41 -0
  293. data/lib/mongoid/matcher/size.rb +26 -0
  294. data/lib/mongoid/matcher/type.rb +99 -0
  295. data/lib/mongoid/matcher.rb +130 -0
  296. data/lib/mongoid/persistable/creatable.rb +20 -29
  297. data/lib/mongoid/persistable/deletable.rb +4 -22
  298. data/lib/mongoid/persistable/destroyable.rb +9 -10
  299. data/lib/mongoid/persistable/incrementable.rb +0 -5
  300. data/lib/mongoid/persistable/logical.rb +0 -5
  301. data/lib/mongoid/persistable/poppable.rb +0 -5
  302. data/lib/mongoid/persistable/pullable.rb +0 -7
  303. data/lib/mongoid/persistable/pushable.rb +4 -8
  304. data/lib/mongoid/persistable/renamable.rb +0 -5
  305. data/lib/mongoid/persistable/savable.rb +13 -8
  306. data/lib/mongoid/persistable/settable.rb +0 -5
  307. data/lib/mongoid/persistable/unsettable.rb +2 -7
  308. data/lib/mongoid/persistable/updatable.rb +96 -29
  309. data/lib/mongoid/persistable/upsertable.rb +20 -8
  310. data/lib/mongoid/persistable.rb +6 -26
  311. data/lib/mongoid/persistence_context.rb +71 -43
  312. data/lib/mongoid/positional.rb +0 -5
  313. data/lib/mongoid/query_cache.rb +16 -236
  314. data/lib/mongoid/railtie.rb +0 -15
  315. data/lib/mongoid/railties/controller_runtime.rb +1 -2
  316. data/lib/mongoid/railties/database.rake +7 -2
  317. data/lib/mongoid/reloadable.rb +17 -20
  318. data/lib/mongoid/scopable.rb +32 -56
  319. data/lib/mongoid/selectable.rb +5 -17
  320. data/lib/mongoid/serializable.rb +11 -22
  321. data/lib/mongoid/shardable.rb +49 -16
  322. data/lib/mongoid/stateful.rb +57 -19
  323. data/lib/mongoid/stringified_symbol.rb +52 -0
  324. data/lib/mongoid/tasks/database.rake +12 -0
  325. data/lib/mongoid/tasks/database.rb +59 -11
  326. data/lib/mongoid/threaded/lifecycle.rb +5 -26
  327. data/lib/mongoid/threaded.rb +42 -67
  328. data/lib/mongoid/timestamps/created/short.rb +0 -1
  329. data/lib/mongoid/timestamps/created.rb +1 -2
  330. data/lib/mongoid/timestamps/short.rb +0 -1
  331. data/lib/mongoid/timestamps/timeless.rb +0 -7
  332. data/lib/mongoid/timestamps/updated/short.rb +0 -1
  333. data/lib/mongoid/timestamps/updated.rb +2 -5
  334. data/lib/mongoid/timestamps.rb +0 -1
  335. data/lib/mongoid/touchable.rb +34 -13
  336. data/lib/mongoid/traversable.rb +181 -59
  337. data/lib/mongoid/utils.rb +22 -0
  338. data/lib/mongoid/validatable/associated.rb +1 -4
  339. data/lib/mongoid/validatable/format.rb +0 -1
  340. data/lib/mongoid/validatable/length.rb +0 -1
  341. data/lib/mongoid/validatable/localizable.rb +1 -4
  342. data/lib/mongoid/validatable/macros.rb +5 -14
  343. data/lib/mongoid/validatable/presence.rb +6 -13
  344. data/lib/mongoid/validatable/queryable.rb +0 -3
  345. data/lib/mongoid/validatable/uniqueness.rb +26 -40
  346. data/lib/mongoid/validatable.rb +9 -27
  347. data/lib/mongoid/version.rb +1 -2
  348. data/lib/mongoid/warnings.rb +44 -0
  349. data/lib/mongoid.rb +42 -18
  350. data/lib/rails/generators/mongoid/config/config_generator.rb +8 -2
  351. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +12 -6
  352. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  353. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  354. data/lib/rails/generators/mongoid_generator.rb +0 -1
  355. data/lib/rails/mongoid.rb +0 -3
  356. data/spec/README.md +19 -4
  357. data/spec/config/mongoid.yml +16 -0
  358. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  359. data/spec/integration/app_spec.rb +345 -0
  360. data/spec/integration/associations/belongs_to_spec.rb +18 -1
  361. data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
  362. data/spec/integration/associations/embedded_spec.rb +163 -1
  363. data/spec/integration/associations/embeds_many_spec.rb +219 -0
  364. data/spec/integration/associations/embeds_one_spec.rb +41 -0
  365. data/spec/integration/associations/foreign_key_spec.rb +9 -1
  366. data/spec/integration/associations/foreign_key_spec_models.rb +0 -1
  367. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  368. data/spec/integration/associations/has_many_spec.rb +128 -0
  369. data/spec/integration/associations/has_one_spec.rb +272 -0
  370. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  371. data/spec/integration/associations/reverse_population_spec.rb +0 -1
  372. data/spec/integration/associations/reverse_population_spec_models.rb +0 -1
  373. data/spec/integration/associations/scope_option_spec.rb +101 -0
  374. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  375. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  376. data/spec/integration/callbacks_models.rb +192 -0
  377. data/spec/integration/callbacks_spec.rb +584 -0
  378. data/spec/integration/contextual/empty_spec.rb +141 -0
  379. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  380. data/spec/integration/criteria/date_field_spec.rb +40 -0
  381. data/spec/integration/criteria/default_scope_spec.rb +51 -0
  382. data/spec/integration/criteria/logical_spec.rb +43 -0
  383. data/spec/integration/criteria/range_spec.rb +359 -0
  384. data/spec/integration/criteria/time_with_zone_spec.rb +125 -15
  385. data/spec/integration/discriminator_key_spec.rb +391 -0
  386. data/spec/integration/discriminator_value_spec.rb +206 -0
  387. data/spec/integration/document_spec.rb +30 -1
  388. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  389. data/spec/integration/i18n_fallbacks_spec.rb +3 -19
  390. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +130 -45
  391. data/spec/integration/matcher_operator_data/all.yml +140 -0
  392. data/spec/integration/matcher_operator_data/and.yml +93 -0
  393. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  394. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  395. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  396. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  397. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  398. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  399. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  400. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  401. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  402. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  403. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  404. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  405. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  406. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  407. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  408. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  409. data/spec/integration/matcher_operator_data/in.yml +210 -0
  410. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  411. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  412. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  413. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  414. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  415. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  416. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  417. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  418. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  419. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  420. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  421. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  422. data/spec/integration/matcher_operator_data/not.yml +196 -0
  423. data/spec/integration/matcher_operator_data/or.yml +137 -0
  424. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  425. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  426. data/spec/integration/matcher_operator_data/size.yml +174 -0
  427. data/spec/integration/matcher_operator_data/type.yml +70 -0
  428. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  429. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  430. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  431. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  432. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  433. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  434. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  435. data/spec/integration/matcher_operator_data/type_decimal.yml +41 -0
  436. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  437. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  438. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  439. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  440. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  441. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  442. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  443. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  444. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  445. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  446. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  447. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  448. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  449. data/spec/integration/matcher_operator_spec.rb +122 -0
  450. data/spec/integration/matcher_spec.rb +283 -0
  451. data/spec/integration/persistence/range_field_spec.rb +350 -0
  452. data/spec/integration/server_query_spec.rb +141 -0
  453. data/spec/integration/shardable_spec.rb +20 -5
  454. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  455. data/spec/lite_spec_helper.rb +25 -9
  456. data/spec/mongoid/association/accessors_spec.rb +282 -78
  457. data/spec/mongoid/association/auto_save_spec.rb +72 -34
  458. data/spec/mongoid/association/builders_spec.rb +1 -2
  459. data/spec/mongoid/association/constrainable_spec.rb +0 -1
  460. data/spec/mongoid/association/counter_cache_spec.rb +33 -34
  461. data/spec/mongoid/association/depending_spec.rb +429 -339
  462. data/spec/mongoid/association/eager_spec.rb +6 -6
  463. data/spec/mongoid/association/embedded/cyclic_spec.rb +2 -3
  464. data/spec/mongoid/association/embedded/dirty_spec.rb +2 -3
  465. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -2
  466. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -1
  467. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +150 -14
  468. data/spec/mongoid/association/embedded/embedded_in_spec.rb +0 -1
  469. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +0 -1
  470. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -1
  471. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +704 -198
  472. data/spec/mongoid/association/embedded/embeds_many_models.rb +194 -1
  473. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -1
  474. data/spec/mongoid/association/embedded/embeds_many_spec.rb +78 -1
  475. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +0 -1
  476. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -1
  477. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +36 -24
  478. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +0 -1
  479. data/spec/mongoid/association/embedded/embeds_one_models.rb +20 -1
  480. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +0 -1
  481. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -3
  482. data/spec/mongoid/association/macros_spec.rb +9 -10
  483. data/spec/mongoid/association/nested/many_spec.rb +0 -1
  484. data/spec/mongoid/association/nested/one_spec.rb +16 -13
  485. data/spec/mongoid/association/options_spec.rb +0 -1
  486. data/spec/mongoid/association/polymorphic_spec.rb +0 -1
  487. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -2
  488. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +109 -17
  489. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +50 -15
  490. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +112 -59
  491. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  492. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +20 -1
  493. data/spec/mongoid/association/referenced/belongs_to_spec.rb +26 -22
  494. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +1 -2
  495. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +26 -2
  496. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +31 -3
  497. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +0 -1
  498. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +523 -372
  499. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +43 -1
  500. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +0 -1
  501. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +56 -3
  502. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +1 -2
  503. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +130 -1
  504. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +23 -7
  505. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +413 -130
  506. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +0 -1
  507. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +857 -503
  508. data/spec/mongoid/association/referenced/has_many_models.rb +59 -2
  509. data/spec/mongoid/association/referenced/has_many_query_spec.rb +0 -1
  510. data/spec/mongoid/association/referenced/has_many_spec.rb +46 -1
  511. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +0 -1
  512. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +53 -10
  513. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +17 -2
  514. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +133 -28
  515. data/spec/mongoid/association/referenced/has_one_models.rb +63 -1
  516. data/spec/mongoid/association/referenced/has_one_query_spec.rb +0 -1
  517. data/spec/mongoid/association/referenced/has_one_spec.rb +22 -2
  518. data/spec/mongoid/association/reflections_spec.rb +0 -1
  519. data/spec/mongoid/association/syncable_spec.rb +46 -33
  520. data/spec/mongoid/association_spec.rb +0 -1
  521. data/spec/mongoid/atomic/modifiers_spec.rb +47 -1
  522. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +0 -1
  523. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +0 -1
  524. data/spec/mongoid/atomic/paths/root_spec.rb +0 -1
  525. data/spec/mongoid/atomic/paths_spec.rb +91 -13
  526. data/spec/mongoid/atomic_spec.rb +51 -7
  527. data/spec/mongoid/attributes/dynamic_spec.rb +0 -1
  528. data/spec/mongoid/attributes/nested_spec.rb +147 -79
  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 +22 -23
  534. data/spec/mongoid/attributes_spec.rb +888 -62
  535. data/spec/mongoid/cacheable_spec.rb +4 -5
  536. data/spec/mongoid/changeable_spec.rb +464 -73
  537. data/spec/mongoid/clients/factory_spec.rb +91 -9
  538. data/spec/mongoid/clients/options_spec.rb +27 -19
  539. data/spec/mongoid/clients/sessions_spec.rb +27 -67
  540. data/spec/mongoid/clients/transactions_spec.rb +69 -35
  541. data/spec/mongoid/clients_spec.rb +187 -24
  542. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  543. data/spec/mongoid/composable_spec.rb +0 -1
  544. data/spec/mongoid/config/defaults_spec.rb +160 -0
  545. data/spec/mongoid/config/environment_spec.rb +124 -9
  546. data/spec/mongoid/config/options_spec.rb +0 -1
  547. data/spec/mongoid/config_spec.rb +465 -1
  548. data/spec/mongoid/contextual/aggregable/memory_spec.rb +431 -154
  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 +120 -21
  552. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  553. data/spec/mongoid/contextual/atomic_spec.rb +148 -86
  554. data/spec/mongoid/contextual/geo_near_spec.rb +28 -20
  555. data/spec/mongoid/contextual/map_reduce_spec.rb +20 -20
  556. data/spec/mongoid/contextual/memory_spec.rb +1826 -304
  557. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  558. data/spec/mongoid/contextual/mongo_spec.rb +3501 -1272
  559. data/spec/mongoid/contextual/none_spec.rb +78 -68
  560. data/spec/mongoid/copyable_spec.rb +657 -37
  561. data/spec/mongoid/copyable_spec_models.rb +28 -1
  562. data/spec/mongoid/criteria/findable_spec.rb +109 -234
  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 +0 -1
  566. data/spec/mongoid/criteria/marshalable_spec.rb +18 -2
  567. data/spec/mongoid/criteria/modifiable_spec.rb +37 -38
  568. data/spec/mongoid/criteria/options_spec.rb +0 -1
  569. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +1 -2
  570. data/spec/mongoid/criteria/queryable/expandable_spec.rb +0 -74
  571. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -20
  572. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -27
  573. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +1 -2
  574. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -1
  575. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -1
  576. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +0 -1
  577. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -16
  578. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +0 -1
  579. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +0 -1
  580. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -8
  581. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +0 -1
  582. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +237 -179
  583. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -2
  584. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -8
  585. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +0 -1
  586. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +5 -71
  587. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -60
  588. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +30 -8
  589. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +39 -2
  590. data/spec/mongoid/criteria/queryable/key_spec.rb +0 -1
  591. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +143 -13
  592. data/spec/mongoid/criteria/queryable/optional_spec.rb +16 -486
  593. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -2
  594. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +0 -1
  595. data/spec/mongoid/criteria/queryable/queryable_spec.rb +1 -2
  596. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1186 -195
  597. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  598. data/spec/mongoid/criteria/queryable/selectable_spec.rb +307 -705
  599. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  600. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -4
  601. data/spec/mongoid/criteria/queryable/smash_spec.rb +0 -1
  602. data/spec/mongoid/criteria/queryable/storable_spec.rb +37 -1
  603. data/spec/mongoid/criteria/scopable_spec.rb +127 -1
  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 +1267 -1739
  607. data/spec/mongoid/document_fields_spec.rb +179 -5
  608. data/spec/mongoid/document_persistence_context_spec.rb +32 -0
  609. data/spec/mongoid/document_query_spec.rb +51 -1
  610. data/spec/mongoid/document_spec.rb +151 -88
  611. data/spec/mongoid/equality_spec.rb +142 -42
  612. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +0 -1
  613. data/spec/mongoid/errors/callback_spec.rb +0 -1
  614. data/spec/mongoid/errors/delete_restriction_spec.rb +2 -3
  615. data/spec/mongoid/errors/document_not_destroyed_spec.rb +0 -1
  616. data/spec/mongoid/errors/document_not_found_spec.rb +76 -1
  617. data/spec/mongoid/errors/invalid_collection_spec.rb +0 -1
  618. data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +5 -6
  619. data/spec/mongoid/errors/invalid_config_option_spec.rb +0 -1
  620. data/spec/mongoid/errors/invalid_field_option_spec.rb +0 -1
  621. data/spec/mongoid/errors/invalid_field_spec.rb +1 -2
  622. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  623. data/spec/mongoid/errors/invalid_find_spec.rb +0 -1
  624. data/spec/mongoid/errors/invalid_includes_spec.rb +0 -1
  625. data/spec/mongoid/errors/invalid_index_spec.rb +0 -1
  626. data/spec/mongoid/errors/invalid_options_spec.rb +0 -1
  627. data/spec/mongoid/errors/invalid_path_spec.rb +0 -1
  628. data/spec/mongoid/errors/invalid_relation_spec.rb +0 -1
  629. data/spec/mongoid/errors/invalid_scope_spec.rb +1 -2
  630. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +0 -1
  631. data/spec/mongoid/errors/invalid_storage_options_spec.rb +0 -1
  632. data/spec/mongoid/errors/invalid_time_spec.rb +0 -1
  633. data/spec/mongoid/errors/inverse_not_found_spec.rb +0 -1
  634. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +0 -1
  635. data/spec/mongoid/errors/mixed_relations_spec.rb +0 -1
  636. data/spec/mongoid/errors/mongoid_error_spec.rb +22 -9
  637. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +0 -1
  638. data/spec/mongoid/errors/no_client_config_spec.rb +2 -3
  639. data/spec/mongoid/errors/no_client_database_spec.rb +3 -4
  640. data/spec/mongoid/errors/no_client_hosts_spec.rb +3 -4
  641. data/spec/mongoid/errors/no_clients_config_spec.rb +0 -1
  642. data/spec/mongoid/errors/no_environment_spec.rb +3 -4
  643. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +0 -1
  644. data/spec/mongoid/errors/no_metadata_spec.rb +0 -1
  645. data/spec/mongoid/errors/no_parent_spec.rb +0 -1
  646. data/spec/mongoid/errors/readonly_attribute_spec.rb +0 -1
  647. data/spec/mongoid/errors/readonly_document_spec.rb +2 -3
  648. data/spec/mongoid/errors/scope_overwrite_spec.rb +0 -1
  649. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -2
  650. data/spec/mongoid/errors/unknown_attribute_spec.rb +2 -3
  651. data/spec/mongoid/errors/unsaved_document_spec.rb +0 -1
  652. data/spec/mongoid/errors/unsupported_javascript_spec.rb +0 -1
  653. data/spec/mongoid/errors/validations_spec.rb +0 -1
  654. data/spec/mongoid/extensions/array_spec.rb +16 -3
  655. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -213
  656. data/spec/mongoid/extensions/binary_spec.rb +44 -10
  657. data/spec/mongoid/extensions/boolean_spec.rb +68 -83
  658. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -4
  659. data/spec/mongoid/extensions/date_spec.rb +71 -2
  660. data/spec/mongoid/extensions/date_time_spec.rb +15 -10
  661. data/spec/mongoid/extensions/decimal128_spec.rb +0 -1
  662. data/spec/mongoid/extensions/false_class_spec.rb +1 -2
  663. data/spec/mongoid/extensions/float_spec.rb +53 -75
  664. data/spec/mongoid/extensions/hash_spec.rb +30 -1
  665. data/spec/mongoid/extensions/integer_spec.rb +50 -65
  666. data/spec/mongoid/extensions/module_spec.rb +0 -1
  667. data/spec/mongoid/extensions/nil_class_spec.rb +0 -1
  668. data/spec/mongoid/extensions/object_id_spec.rb +0 -1
  669. data/spec/mongoid/extensions/object_spec.rb +0 -1
  670. data/spec/mongoid/extensions/range_spec.rb +255 -55
  671. data/spec/mongoid/extensions/regexp_spec.rb +58 -34
  672. data/spec/mongoid/extensions/set_spec.rb +106 -1
  673. data/spec/mongoid/extensions/string_spec.rb +58 -31
  674. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  675. data/spec/mongoid/extensions/symbol_spec.rb +18 -26
  676. data/spec/mongoid/extensions/time_spec.rb +639 -107
  677. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -84
  678. data/spec/mongoid/extensions/true_class_spec.rb +1 -2
  679. data/spec/mongoid/extensions_spec.rb +14 -3
  680. data/spec/mongoid/factory_spec.rb +323 -30
  681. data/spec/mongoid/fields/foreign_key_spec.rb +0 -1
  682. data/spec/mongoid/fields/localized_spec.rb +84 -42
  683. data/spec/mongoid/fields/standard_spec.rb +0 -1
  684. data/spec/mongoid/fields_spec.rb +855 -118
  685. data/spec/mongoid/findable_spec.rb +518 -65
  686. data/spec/mongoid/indexable/specification_spec.rb +2 -3
  687. data/spec/mongoid/indexable_spec.rb +85 -33
  688. data/spec/mongoid/inspectable_spec.rb +37 -3
  689. data/spec/mongoid/interceptable_spec.rb +702 -104
  690. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  691. data/spec/mongoid/loggable_spec.rb +0 -1
  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 +112 -30
  697. data/spec/mongoid/persistable/deletable_spec.rb +298 -19
  698. data/spec/mongoid/persistable/destroyable_spec.rb +226 -19
  699. data/spec/mongoid/persistable/incrementable_spec.rb +45 -9
  700. data/spec/mongoid/persistable/logical_spec.rb +41 -5
  701. data/spec/mongoid/persistable/poppable_spec.rb +40 -5
  702. data/spec/mongoid/persistable/pullable_spec.rb +80 -9
  703. data/spec/mongoid/persistable/pushable_spec.rb +80 -9
  704. data/spec/mongoid/persistable/renamable_spec.rb +39 -4
  705. data/spec/mongoid/persistable/savable_spec.rb +282 -26
  706. data/spec/mongoid/persistable/settable_spec.rb +76 -10
  707. data/spec/mongoid/persistable/unsettable_spec.rb +40 -5
  708. data/spec/mongoid/persistable/updatable_spec.rb +61 -50
  709. data/spec/mongoid/persistable/upsertable_spec.rb +91 -4
  710. data/spec/mongoid/persistable_spec.rb +3 -4
  711. data/spec/mongoid/persistence_context_spec.rb +57 -59
  712. data/spec/mongoid/positional_spec.rb +0 -1
  713. data/spec/mongoid/query_cache_middleware_spec.rb +7 -5
  714. data/spec/mongoid/query_cache_spec.rb +424 -68
  715. data/spec/mongoid/relations/proxy_spec.rb +7 -8
  716. data/spec/mongoid/reloadable_spec.rb +355 -27
  717. data/spec/mongoid/scopable_spec.rb +191 -39
  718. data/spec/mongoid/selectable_spec.rb +6 -7
  719. data/spec/mongoid/serializable_spec.rb +35 -39
  720. data/spec/mongoid/shardable_models.rb +15 -1
  721. data/spec/mongoid/shardable_spec.rb +181 -32
  722. data/spec/mongoid/stateful_spec.rb +151 -10
  723. data/spec/mongoid/tasks/database_rake_spec.rb +87 -14
  724. data/spec/mongoid/tasks/database_spec.rb +128 -2
  725. data/spec/mongoid/threaded_spec.rb +2 -3
  726. data/spec/mongoid/timestamps/created/short_spec.rb +1 -2
  727. data/spec/mongoid/timestamps/created_spec.rb +1 -2
  728. data/spec/mongoid/timestamps/timeless_spec.rb +2 -3
  729. data/spec/mongoid/timestamps/updated/short_spec.rb +3 -4
  730. data/spec/mongoid/timestamps/updated_spec.rb +3 -4
  731. data/spec/mongoid/timestamps_spec.rb +398 -11
  732. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  733. data/spec/mongoid/touchable_spec.rb +525 -36
  734. data/spec/mongoid/touchable_spec_models.rb +59 -0
  735. data/spec/mongoid/traversable_spec.rb +1143 -2
  736. data/spec/mongoid/validatable/associated_spec.rb +0 -1
  737. data/spec/mongoid/validatable/format_spec.rb +0 -1
  738. data/spec/mongoid/validatable/length_spec.rb +0 -1
  739. data/spec/mongoid/validatable/numericality_spec.rb +0 -1
  740. data/spec/mongoid/validatable/presence_spec.rb +26 -23
  741. data/spec/mongoid/validatable/uniqueness_spec.rb +125 -99
  742. data/spec/mongoid/validatable_spec.rb +3 -4
  743. data/spec/mongoid/warnings_spec.rb +35 -0
  744. data/spec/mongoid_spec.rb +35 -10
  745. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -3
  746. data/spec/rails/mongoid_spec.rb +4 -17
  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 +24 -54
  771. data/spec/support/authorization.rb +0 -1
  772. data/spec/support/client_registry.rb +9 -0
  773. data/spec/support/constraints.rb +34 -197
  774. data/spec/support/expectations.rb +0 -1
  775. data/spec/support/helpers.rb +1 -1
  776. data/spec/support/immutable_ids.rb +118 -0
  777. data/spec/support/macros.rb +109 -1
  778. data/spec/{app → support}/models/account.rb +1 -2
  779. data/spec/{app → support}/models/acolyte.rb +0 -1
  780. data/spec/{app → support}/models/actor.rb +1 -2
  781. data/spec/{app → support}/models/actress.rb +0 -1
  782. data/spec/{app → support}/models/address.rb +4 -1
  783. data/spec/{app → support}/models/address_component.rb +0 -1
  784. data/spec/{app → support}/models/address_number.rb +0 -1
  785. data/spec/{app → support}/models/agency.rb +0 -1
  786. data/spec/{app → support}/models/agent.rb +0 -1
  787. data/spec/{app → support}/models/album.rb +0 -1
  788. data/spec/{app → support}/models/alert.rb +0 -1
  789. data/spec/{app → support}/models/animal.rb +0 -1
  790. data/spec/{app → support}/models/answer.rb +0 -1
  791. data/spec/{app → support}/models/appointment.rb +0 -1
  792. data/spec/support/models/armrest.rb +9 -0
  793. data/spec/{app → support}/models/array_field.rb +0 -1
  794. data/spec/{app → support}/models/article.rb +0 -1
  795. data/spec/{app → support}/models/artist.rb +2 -2
  796. data/spec/{app → support}/models/artwork.rb +0 -1
  797. data/spec/support/models/audible_sound.rb +3 -0
  798. data/spec/{app → support}/models/audio.rb +0 -1
  799. data/spec/support/models/augmentation.rb +25 -0
  800. data/spec/{app → support}/models/author.rb +0 -1
  801. data/spec/{app → support}/models/baby.rb +0 -1
  802. data/spec/{app → support}/models/band.rb +8 -1
  803. data/spec/{app → support}/models/bar.rb +0 -1
  804. data/spec/{app → support}/models/basic.rb +0 -1
  805. data/spec/{app → support}/models/bed.rb +0 -1
  806. data/spec/{app → support}/models/big_palette.rb +0 -1
  807. data/spec/{app → support}/models/birthday.rb +0 -1
  808. data/spec/support/models/bolt.rb +7 -0
  809. data/spec/{app → support}/models/bomb.rb +0 -1
  810. data/spec/{app → support}/models/book.rb +1 -1
  811. data/spec/{app → support}/models/breed.rb +0 -1
  812. data/spec/{app → support}/models/browser.rb +1 -2
  813. data/spec/{app → support}/models/building.rb +2 -1
  814. data/spec/{app → support}/models/building_address.rb +0 -1
  815. data/spec/{app → support}/models/bus.rb +0 -1
  816. data/spec/{app → support}/models/business.rb +0 -1
  817. data/spec/{app → support}/models/callback_test.rb +0 -1
  818. data/spec/{app → support}/models/canvas.rb +1 -2
  819. data/spec/{app → support}/models/car.rb +0 -1
  820. data/spec/{app → support}/models/cat.rb +0 -1
  821. data/spec/support/models/catalog.rb +24 -0
  822. data/spec/{app → support}/models/category.rb +0 -1
  823. data/spec/{app → support}/models/child.rb +0 -1
  824. data/spec/{app → support}/models/child_doc.rb +3 -4
  825. data/spec/{app → support}/models/church.rb +0 -1
  826. data/spec/{app → support}/models/circle.rb +0 -1
  827. data/spec/{app → support}/models/circuit.rb +0 -1
  828. data/spec/{app → support}/models/circus.rb +3 -1
  829. data/spec/{app → support}/models/code.rb +2 -1
  830. data/spec/{app → support}/models/coding/pull_request.rb +0 -1
  831. data/spec/support/models/coding.rb +3 -0
  832. data/spec/{app → support}/models/comment.rb +0 -1
  833. data/spec/{app → support}/models/company.rb +0 -1
  834. data/spec/{app → support}/models/consumption_period.rb +0 -1
  835. data/spec/{app → support}/models/contextable_item.rb +0 -1
  836. data/spec/{app → support}/models/contractor.rb +0 -1
  837. data/spec/{app → support}/models/cookie.rb +0 -1
  838. data/spec/{app → support}/models/country_code.rb +2 -1
  839. data/spec/{app → support}/models/courier_job.rb +0 -1
  840. data/spec/support/models/cover.rb +10 -0
  841. data/spec/support/models/crate.rb +12 -0
  842. data/spec/support/models/customer.rb +10 -0
  843. data/spec/support/models/customer_address.rb +11 -0
  844. data/spec/support/models/deed.rb +7 -0
  845. data/spec/{app → support}/models/definition.rb +0 -1
  846. data/spec/{app → support}/models/delegating_patient.rb +0 -1
  847. data/spec/{app → support}/models/description.rb +0 -1
  848. data/spec/{app → support}/models/dictionary.rb +6 -1
  849. data/spec/{app → support}/models/division.rb +0 -1
  850. data/spec/{app → support}/models/doctor.rb +0 -1
  851. data/spec/{app → support}/models/dog.rb +0 -1
  852. data/spec/{app → support}/models/dokument.rb +0 -1
  853. data/spec/{app → support}/models/draft.rb +0 -1
  854. data/spec/{app → support}/models/dragon.rb +0 -1
  855. data/spec/{app → support}/models/driver.rb +1 -2
  856. data/spec/{app → support}/models/drug.rb +0 -1
  857. data/spec/{app → support}/models/dungeon.rb +0 -1
  858. data/spec/{app → support}/models/edit.rb +0 -1
  859. data/spec/{app → support}/models/email.rb +0 -1
  860. data/spec/{app → support}/models/employer.rb +0 -1
  861. data/spec/{app → support}/models/entry.rb +0 -1
  862. data/spec/{app → support}/models/eraser.rb +0 -1
  863. data/spec/{app → support}/models/even.rb +0 -1
  864. data/spec/{app → support}/models/event.rb +0 -1
  865. data/spec/{app → support}/models/exhibition.rb +0 -1
  866. data/spec/{app → support}/models/exhibitor.rb +0 -1
  867. data/spec/{app → support}/models/explosion.rb +0 -1
  868. data/spec/{app → support}/models/eye.rb +0 -1
  869. data/spec/{app → support}/models/eye_bowl.rb +0 -1
  870. data/spec/{app → support}/models/face.rb +0 -1
  871. data/spec/support/models/fanatic.rb +8 -0
  872. data/spec/{app → support}/models/favorite.rb +0 -1
  873. data/spec/{app → support}/models/filesystem.rb +0 -1
  874. data/spec/{app → support}/models/fire_hydrant.rb +0 -1
  875. data/spec/{app → support}/models/firefox.rb +0 -1
  876. data/spec/{app → support}/models/fish.rb +0 -1
  877. data/spec/{app → support}/models/folder.rb +0 -1
  878. data/spec/{app → support}/models/folder_item.rb +0 -1
  879. data/spec/{app → support}/models/fruits.rb +0 -1
  880. data/spec/{app → support}/models/game.rb +0 -1
  881. data/spec/{app → support}/models/ghost.rb +0 -1
  882. data/spec/support/models/guitar.rb +4 -0
  883. data/spec/support/models/hole.rb +12 -0
  884. data/spec/{app → support}/models/home.rb +0 -1
  885. data/spec/{app → support}/models/house.rb +0 -1
  886. data/spec/{app → support}/models/html_writer.rb +0 -1
  887. data/spec/{app → support}/models/id_key.rb +0 -1
  888. data/spec/support/models/idnodef.rb +7 -0
  889. data/spec/{app → support}/models/image.rb +0 -1
  890. data/spec/{app → support}/models/implant.rb +9 -1
  891. data/spec/support/models/instrument.rb +8 -0
  892. data/spec/{app → support}/models/item.rb +1 -2
  893. data/spec/{app → support}/models/jar.rb +0 -1
  894. data/spec/{app → support}/models/kaleidoscope.rb +0 -1
  895. data/spec/{app → support}/models/kangaroo.rb +0 -1
  896. data/spec/{app → support}/models/label.rb +4 -2
  897. data/spec/{app → support}/models/language.rb +0 -1
  898. data/spec/{app → support}/models/lat_lng.rb +0 -1
  899. data/spec/{app → support}/models/league.rb +0 -1
  900. data/spec/{app → support}/models/learner.rb +0 -1
  901. data/spec/{app → support}/models/line_item.rb +0 -1
  902. data/spec/{app → support}/models/location.rb +0 -1
  903. data/spec/{app → support}/models/login.rb +0 -1
  904. data/spec/{app → support}/models/manufacturer.rb +0 -1
  905. data/spec/{app → support}/models/meat.rb +0 -1
  906. data/spec/{app → support}/models/membership.rb +1 -1
  907. data/spec/{app → support}/models/message.rb +0 -1
  908. data/spec/{app → support}/models/minim.rb +0 -1
  909. data/spec/{app → support}/models/mixed_drink.rb +0 -1
  910. data/spec/support/models/mop.rb +24 -0
  911. data/spec/{app → support}/models/movie.rb +0 -1
  912. data/spec/{app → support}/models/my_hash.rb +0 -1
  913. data/spec/{app → support}/models/name.rb +0 -1
  914. data/spec/{app → support}/models/name_only.rb +0 -1
  915. data/spec/{app → support}/models/node.rb +0 -1
  916. data/spec/{app → support}/models/note.rb +0 -1
  917. data/spec/support/models/nut.rb +7 -0
  918. data/spec/{app → support}/models/odd.rb +0 -1
  919. data/spec/support/models/order.rb +12 -0
  920. data/spec/{app → support}/models/ordered_post.rb +1 -2
  921. data/spec/{app → support}/models/ordered_preference.rb +0 -1
  922. data/spec/{app → support}/models/oscar.rb +0 -1
  923. data/spec/{app → support}/models/other_owner_object.rb +0 -1
  924. data/spec/{app → support}/models/override.rb +0 -1
  925. data/spec/{app → support}/models/ownable.rb +0 -1
  926. data/spec/{app → support}/models/owner.rb +2 -1
  927. data/spec/{app → support}/models/pack.rb +0 -1
  928. data/spec/{app → support}/models/page.rb +0 -1
  929. data/spec/{app → support}/models/page_question.rb +0 -1
  930. data/spec/{app → support}/models/palette.rb +1 -2
  931. data/spec/{app → support}/models/parent.rb +0 -1
  932. data/spec/{app → support}/models/parent_doc.rb +0 -1
  933. data/spec/support/models/passport.rb +22 -0
  934. data/spec/{app → support}/models/patient.rb +0 -1
  935. data/spec/{app → support}/models/pdf_writer.rb +0 -1
  936. data/spec/{app → support}/models/pencil.rb +0 -1
  937. data/spec/{app → support}/models/person.rb +20 -2
  938. data/spec/{app → support}/models/pet.rb +0 -1
  939. data/spec/{app → support}/models/pet_owner.rb +0 -1
  940. data/spec/{app → support}/models/phone.rb +3 -2
  941. data/spec/support/models/piano.rb +4 -0
  942. data/spec/{app → support}/models/pizza.rb +0 -1
  943. data/spec/{app → support}/models/player.rb +2 -1
  944. data/spec/{app → support}/models/post.rb +0 -1
  945. data/spec/{app → support}/models/post_genre.rb +0 -1
  946. data/spec/support/models/powerup.rb +25 -0
  947. data/spec/{app → support}/models/preference.rb +0 -1
  948. data/spec/{app → support}/models/princess.rb +0 -1
  949. data/spec/{app → support}/models/product.rb +1 -1
  950. data/spec/support/models/profile.rb +17 -0
  951. data/spec/{app → support}/models/pronunciation.rb +0 -1
  952. data/spec/{app → support}/models/pub.rb +0 -1
  953. data/spec/{app → support}/models/publication/encyclopedia.rb +0 -1
  954. data/spec/{app → support}/models/publication/review.rb +0 -1
  955. data/spec/support/models/publication.rb +4 -0
  956. data/spec/{app → support}/models/purchase.rb +0 -1
  957. data/spec/support/models/purchased_item.rb +10 -0
  958. data/spec/{app → support}/models/question.rb +0 -1
  959. data/spec/{app → support}/models/quiz.rb +0 -1
  960. data/spec/{app → support}/models/rating.rb +0 -1
  961. data/spec/{app → support}/models/record.rb +0 -1
  962. data/spec/{app → support}/models/registry.rb +1 -1
  963. data/spec/{app → support}/models/role.rb +0 -1
  964. data/spec/{app → support}/models/root_category.rb +0 -1
  965. data/spec/{app → support}/models/sandwich.rb +0 -1
  966. data/spec/{app → support}/models/scheduler.rb +0 -1
  967. data/spec/support/models/school.rb +14 -0
  968. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -3
  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 +0 -1
  972. data/spec/{app → support}/models/series.rb +1 -1
  973. data/spec/{app → support}/models/server.rb +0 -1
  974. data/spec/{app → support}/models/service.rb +0 -1
  975. data/spec/{app → support}/models/shape.rb +2 -3
  976. data/spec/{app → support}/models/shelf.rb +0 -1
  977. data/spec/support/models/shield.rb +18 -0
  978. data/spec/{app → support}/models/shipment_address.rb +0 -1
  979. data/spec/{app → support}/models/shipping_container.rb +0 -1
  980. data/spec/{app → support}/models/shipping_pack.rb +0 -1
  981. data/spec/support/models/shirt.rb +11 -0
  982. data/spec/{app → support}/models/shop.rb +0 -1
  983. data/spec/{app → support}/models/short_agent.rb +0 -1
  984. data/spec/{app → support}/models/short_quiz.rb +0 -1
  985. data/spec/{app → support}/models/simple.rb +0 -1
  986. data/spec/{app → support}/models/slave.rb +0 -1
  987. data/spec/{app → support}/models/song.rb +0 -1
  988. data/spec/{app → support}/models/sound.rb +0 -1
  989. data/spec/support/models/spacer.rb +7 -0
  990. data/spec/{app → support}/models/square.rb +0 -1
  991. data/spec/{app → support}/models/staff.rb +0 -1
  992. data/spec/{app → support}/models/store_as_dup_test1.rb +0 -1
  993. data/spec/{app → support}/models/store_as_dup_test2.rb +0 -1
  994. data/spec/{app → support}/models/store_as_dup_test3.rb +0 -1
  995. data/spec/{app → support}/models/store_as_dup_test4.rb +0 -1
  996. data/spec/{app → support}/models/strategy.rb +0 -1
  997. data/spec/support/models/student.rb +14 -0
  998. data/spec/{app → support}/models/sub_item.rb +0 -1
  999. data/spec/{app → support}/models/subscription.rb +0 -1
  1000. data/spec/{app → support}/models/survey.rb +0 -1
  1001. data/spec/{app → support}/models/symptom.rb +0 -1
  1002. data/spec/support/models/system_role.rb +7 -0
  1003. data/spec/{app → support}/models/tag.rb +0 -1
  1004. data/spec/{app → support}/models/target.rb +0 -1
  1005. data/spec/{app → support}/models/template.rb +0 -1
  1006. data/spec/{app → support}/models/thing.rb +0 -1
  1007. data/spec/support/models/threadlocker.rb +7 -0
  1008. data/spec/{app → support}/models/title.rb +0 -1
  1009. data/spec/{app → support}/models/tool.rb +2 -3
  1010. data/spec/{app → support}/models/topping.rb +0 -1
  1011. data/spec/support/models/toy.rb +9 -0
  1012. data/spec/{app → support}/models/track.rb +0 -1
  1013. data/spec/{app → support}/models/translation.rb +0 -1
  1014. data/spec/{app → support}/models/tree.rb +0 -1
  1015. data/spec/{app → support}/models/truck.rb +2 -1
  1016. data/spec/{app → support}/models/updatable.rb +0 -1
  1017. data/spec/{app → support}/models/user.rb +0 -1
  1018. data/spec/{app → support}/models/user_account.rb +0 -1
  1019. data/spec/{app → support}/models/validation_callback.rb +0 -1
  1020. data/spec/{app → support}/models/vehicle.rb +7 -3
  1021. data/spec/{app → support}/models/version.rb +0 -1
  1022. data/spec/{app → support}/models/vertex.rb +0 -1
  1023. data/spec/{app → support}/models/vet_visit.rb +0 -1
  1024. data/spec/{app → support}/models/video.rb +0 -1
  1025. data/spec/{app → support}/models/video_game.rb +0 -1
  1026. data/spec/support/models/washer.rb +7 -0
  1027. data/spec/support/models/weapon.rb +25 -0
  1028. data/spec/{app → support}/models/wiki_page.rb +1 -1
  1029. data/spec/{app → support}/models/word.rb +0 -1
  1030. data/spec/{app → support}/models/word_origin.rb +0 -1
  1031. data/spec/{app → support}/models/writer.rb +2 -3
  1032. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1033. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1034. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1035. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1036. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1037. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1038. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1039. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1040. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1041. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1042. data/spec/support/shared/time.rb +0 -1
  1043. data/spec/support/spec_config.rb +28 -6
  1044. data.tar.gz.sig +0 -0
  1045. metadata +1216 -799
  1046. metadata.gz.sig +0 -0
  1047. data/lib/mongoid/errors/eager_load.rb +0 -26
  1048. data/lib/mongoid/errors/invalid_value.rb +0 -18
  1049. data/lib/mongoid/matchable/all.rb +0 -30
  1050. data/lib/mongoid/matchable/and.rb +0 -32
  1051. data/lib/mongoid/matchable/default.rb +0 -121
  1052. data/lib/mongoid/matchable/elem_match.rb +0 -36
  1053. data/lib/mongoid/matchable/eq.rb +0 -23
  1054. data/lib/mongoid/matchable/exists.rb +0 -25
  1055. data/lib/mongoid/matchable/gt.rb +0 -25
  1056. data/lib/mongoid/matchable/gte.rb +0 -25
  1057. data/lib/mongoid/matchable/in.rb +0 -26
  1058. data/lib/mongoid/matchable/lt.rb +0 -25
  1059. data/lib/mongoid/matchable/lte.rb +0 -25
  1060. data/lib/mongoid/matchable/ne.rb +0 -23
  1061. data/lib/mongoid/matchable/nin.rb +0 -24
  1062. data/lib/mongoid/matchable/nor.rb +0 -38
  1063. data/lib/mongoid/matchable/or.rb +0 -35
  1064. data/lib/mongoid/matchable/regexp.rb +0 -30
  1065. data/lib/mongoid/matchable/size.rb +0 -23
  1066. data/lib/support/ruby_version.rb +0 -29
  1067. data/spec/app/models/augmentation.rb +0 -14
  1068. data/spec/app/models/coding.rb +0 -4
  1069. data/spec/app/models/passport.rb +0 -8
  1070. data/spec/app/models/powerup.rb +0 -14
  1071. data/spec/app/models/publication.rb +0 -5
  1072. data/spec/app/models/weapon.rb +0 -14
  1073. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -61
  1074. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -61
  1075. data/spec/mongoid/matchable/all_spec.rb +0 -34
  1076. data/spec/mongoid/matchable/and_spec.rb +0 -190
  1077. data/spec/mongoid/matchable/default_spec.rb +0 -140
  1078. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  1079. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  1080. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  1081. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  1082. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  1083. data/spec/mongoid/matchable/in_spec.rb +0 -52
  1084. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  1085. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  1086. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  1087. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  1088. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  1089. data/spec/mongoid/matchable/or_spec.rb +0 -134
  1090. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  1091. data/spec/mongoid/matchable/size_spec.rb +0 -28
  1092. data/spec/mongoid/matchable_spec.rb +0 -856
  1093. data/spec/support/cluster_config.rb +0 -158
  1094. data/spec/support/lite_constraints.rb +0 -22
@@ -1,13 +1,9 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
3
2
 
4
3
  require "spec_helper"
5
4
 
6
5
  describe Mongoid::Fields do
7
-
8
- before(:all) do
9
- Mongoid.use_activesupport_time_zone = false
10
- end
6
+ config_override :use_activesupport_time_zone, false
11
7
 
12
8
  describe "#\{field}_translations" do
13
9
 
@@ -18,18 +14,15 @@ describe Mongoid::Fields do
18
14
  context "when the field is localized" do
19
15
 
20
16
  context "when translations exist" do
17
+ with_default_i18n_configs
21
18
 
22
19
  before do
20
+ I18n.locale = :en
23
21
  product.description = "test"
24
- I18n.enforce_available_locales = false
25
- ::I18n.locale = :de
22
+ I18n.locale = :de
26
23
  product.description = "The best"
27
24
  end
28
25
 
29
- after do
30
- ::I18n.locale = :en
31
- end
32
-
33
26
  let(:translations) do
34
27
  product.description_translations
35
28
  end
@@ -110,7 +103,7 @@ describe Mongoid::Fields do
110
103
  context "when saving the new translations" do
111
104
 
112
105
  before do
113
- product.save
106
+ product.save!
114
107
  end
115
108
 
116
109
  it "persists the changes" do
@@ -121,7 +114,7 @@ describe Mongoid::Fields do
121
114
 
122
115
  before do
123
116
  product.description_translations = { "en" => "overwritten" }
124
- product.save
117
+ product.save!
125
118
  end
126
119
 
127
120
  it "persists the changes" do
@@ -152,7 +145,7 @@ describe Mongoid::Fields do
152
145
  context "when saving the new translations" do
153
146
 
154
147
  before do
155
- dictionary.save
148
+ dictionary.save!
156
149
  end
157
150
 
158
151
  it "persists the changes" do
@@ -165,7 +158,7 @@ describe Mongoid::Fields do
165
158
 
166
159
  before do
167
160
  dictionary.description_translations = { "en" => "overwritten" }
168
- dictionary.save
161
+ dictionary.save!
169
162
  end
170
163
 
171
164
  it "persists the changes" do
@@ -322,7 +315,7 @@ describe Mongoid::Fields do
322
315
  end
323
316
 
324
317
  it "converts to Mongoid::Boolean" do
325
- expect(klass.field(:test, type: Boolean).type).to be(Mongoid::Boolean)
318
+ expect(klass.field(:test, type: Mongoid::Boolean).type).to be(Mongoid::Boolean)
326
319
  end
327
320
  end
328
321
 
@@ -397,6 +390,22 @@ describe Mongoid::Fields do
397
390
  it "converts :time to Time" do
398
391
  expect(klass.field(:test, type: :time).type).to be(Time)
399
392
  end
393
+
394
+ context 'when using an unknown symbol' do
395
+ it 'raises InvalidFieldType' do
396
+ lambda do
397
+ klass.field(:test, type: :bogus)
398
+ end.should raise_error(Mongoid::Errors::InvalidFieldType, /defines a field 'test' with an unknown type value :bogus/)
399
+ end
400
+ end
401
+
402
+ context 'when using an unknown string' do
403
+ it 'raises InvalidFieldType' do
404
+ lambda do
405
+ klass.field(:test, type: 'bogus')
406
+ end.should raise_error(Mongoid::Errors::InvalidFieldType, /defines a field 'test' with an unknown type value "bogus"/)
407
+ end
408
+ end
400
409
  end
401
410
 
402
411
  context "when the options are valid" do
@@ -404,7 +413,7 @@ describe Mongoid::Fields do
404
413
  context "when the options are all standard" do
405
414
 
406
415
  before do
407
- Band.field :acceptable, type: Boolean
416
+ Band.field :acceptable, type: Mongoid::Boolean
408
417
  end
409
418
 
410
419
  after do
@@ -419,7 +428,7 @@ describe Mongoid::Fields do
419
428
  context "when a custom option is provided" do
420
429
 
421
430
  before do
422
- Band.field :acceptable, type: Boolean, custom: true
431
+ Band.field :acceptable, type: Mongoid::Boolean, custom: true
423
432
  end
424
433
 
425
434
  it "adds the field to the model" do
@@ -431,15 +440,38 @@ describe Mongoid::Fields do
431
440
  context "when the Symbol type is used" do
432
441
 
433
442
  before do
434
- expect(Mongoid.logger).to receive(:warn)
443
+ Mongoid::Warnings.class_eval do
444
+ @symbol_type_deprecated = false
445
+ end
435
446
  end
436
447
 
437
448
  after do
438
- Band.fields.delete("should_warn")
449
+ Label.fields.delete("should_warn")
439
450
  end
440
451
 
441
452
  it "warns that the BSON symbol type is deprecated" do
442
- Band.field :should_warn, type: Symbol
453
+ expect(Mongoid.logger).to receive(:warn)
454
+
455
+ Label.field :should_warn, type: Symbol
456
+ end
457
+
458
+ it "warns on first use of Symbol type only" do
459
+ expect(Mongoid.logger).to receive(:warn).once
460
+
461
+ Label.field :should_warn, type: Symbol
462
+ end
463
+
464
+ context 'when using Symbol field type in multiple classes' do
465
+ after do
466
+ Truck.fields.delete("should_warn")
467
+ end
468
+
469
+ it "warns on first use of Symbol type only" do
470
+ expect(Mongoid.logger).to receive(:warn).once
471
+
472
+ Label.field :should_warn, type: Symbol
473
+ Truck.field :should_warn, type: Symbol
474
+ end
443
475
  end
444
476
  end
445
477
 
@@ -447,7 +479,7 @@ describe Mongoid::Fields do
447
479
 
448
480
  it "raises an error" do
449
481
  expect {
450
- Band.field :unacceptable, bad: true
482
+ Label.field :unacceptable, bad: true
451
483
  }.to raise_error(Mongoid::Errors::InvalidFieldOption)
452
484
  end
453
485
  end
@@ -492,16 +524,13 @@ describe Mongoid::Fields do
492
524
  end
493
525
 
494
526
  context "when a single locale is set" do
527
+ with_default_i18n_configs
495
528
 
496
529
  before do
497
- ::I18n.locale = :de
530
+ I18n.locale = :de
498
531
  product.description = "The best"
499
532
  end
500
533
 
501
- after do
502
- ::I18n.locale = :en
503
- end
504
-
505
534
  let(:description) do
506
535
  product.description
507
536
  end
@@ -512,17 +541,15 @@ describe Mongoid::Fields do
512
541
  end
513
542
 
514
543
  context "when multiple locales are set" do
544
+ with_default_i18n_configs
515
545
 
516
546
  before do
547
+ I18n.locale = :end
517
548
  product.description = "Cheap drinks"
518
- ::I18n.locale = :de
549
+ I18n.locale = :de
519
550
  product.description = "Cheaper drinks"
520
551
  end
521
552
 
522
- after do
523
- ::I18n.locale = :en
524
- end
525
-
526
553
  let(:description) do
527
554
  product.description
528
555
  end
@@ -549,8 +576,144 @@ describe Mongoid::Fields do
549
576
  context "when the attribute has been assigned" do
550
577
 
551
578
  it "returns the attribute before type cast" do
552
- person.age = "old"
553
- expect(person.age_before_type_cast).to eq("old")
579
+ person.age = "42"
580
+ expect(person.age_before_type_cast).to eq("42")
581
+ end
582
+ end
583
+
584
+ context "when reloading" do
585
+
586
+ let(:product) do
587
+ Product.create!(price: '1')
588
+ end
589
+
590
+ before do
591
+ product.reload
592
+ end
593
+
594
+ it "resets the attributes_before_type_cast to the attributes hash" do
595
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
596
+ end
597
+
598
+ it "the *_before_type_cast method returns the demongoized value" do
599
+ expect(product.price_before_type_cast).to eq(1)
600
+ end
601
+ end
602
+
603
+ context "when reloading and writing a demongoizable value" do
604
+
605
+ let(:product) do
606
+ Product.create!.tap do |product|
607
+ Product.collection.update_one({ _id: product.id }, { :$set => { price: '1' }})
608
+ end
609
+ end
610
+
611
+ before do
612
+ product.reload
613
+ end
614
+
615
+ it "resets the attributes_before_type_cast to the attributes hash" do
616
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
617
+ end
618
+
619
+ it "the *_before_type_cast method returns the mongoized value" do
620
+ expect(product.price_before_type_cast).to eq('1')
621
+ end
622
+ end
623
+
624
+ context "when reading from the db" do
625
+
626
+ let(:product) do
627
+ Product.create!(price: '1')
628
+ end
629
+
630
+ let(:from_db) do
631
+ Product.find(product.id)
632
+ end
633
+
634
+ it "resets the attributes_before_type_cast to the attributes hash" do
635
+ expect(from_db.attributes_before_type_cast).to eq(from_db.attributes)
636
+ end
637
+
638
+ it "the *_before_type_cast method returns the demongoized value" do
639
+ expect(from_db.price_before_type_cast).to eq(1)
640
+ end
641
+ end
642
+
643
+ context "when reading from the db after writing a demongoizable value" do
644
+
645
+ let(:product) do
646
+ Product.create!.tap do |product|
647
+ Product.collection.update_one({ _id: product.id }, { :$set => { price: '1' }})
648
+ end
649
+ end
650
+
651
+ let(:from_db) do
652
+ Product.find(product.id)
653
+ end
654
+
655
+ it "resets the attributes_before_type_cast to the attributes hash" do
656
+ expect(from_db.attributes_before_type_cast).to eq(from_db.attributes)
657
+ end
658
+
659
+ it "the *_before_type_cast method returns the mongoized value" do
660
+ expect(from_db.price_before_type_cast).to eq('1')
661
+ end
662
+ end
663
+
664
+ context "when making a new model" do
665
+
666
+ context "when using new with no options" do
667
+ let(:product) { Product.new }
668
+
669
+ it "sets the attributes_before_type_cast to the attributes hash" do
670
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
671
+ end
672
+ end
673
+
674
+ context "when using new with options" do
675
+ let(:product) { Product.new(price: '1') }
676
+
677
+ let(:abtc) do
678
+ product.attributes.merge('price' => '1')
679
+ end
680
+
681
+ it "has the attributes before type cast" do
682
+ expect(product.attributes_before_type_cast).to eq(abtc)
683
+ end
684
+ end
685
+
686
+ context "when persisting the model" do
687
+ let(:product) { Product.new(price: '1') }
688
+
689
+ let(:abtc) do
690
+ product.attributes.merge('price' => '1')
691
+ end
692
+
693
+ before do
694
+ expect(product.attributes_before_type_cast).to eq(abtc)
695
+ product.save!
696
+ end
697
+
698
+ it "resets the attributes_before_type_cast to the attributes" do
699
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
700
+ end
701
+ end
702
+
703
+ context "when using create! without options" do
704
+ let(:product) { Product.create! }
705
+
706
+ it "resets the attributes_before_type_cast to the attributes" do
707
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
708
+ end
709
+ end
710
+
711
+ context "when using create! with options" do
712
+ let(:product) { Product.create!(price: '1') }
713
+
714
+ it "resets the attributes_before_type_cast to the attributes" do
715
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
716
+ end
554
717
  end
555
718
  end
556
719
  end
@@ -598,14 +761,14 @@ describe Mongoid::Fields do
598
761
 
599
762
  before do
600
763
  product.stores = [ "kadewe", "karstadt" ]
601
- product.save
764
+ product.save!
602
765
  end
603
766
 
604
767
  context "when setting the value to nil" do
605
768
 
606
769
  before do
607
770
  product.stores = nil
608
- product.save
771
+ product.save!
609
772
  end
610
773
 
611
774
  it "allows the set" do
@@ -617,7 +780,7 @@ describe Mongoid::Fields do
617
780
 
618
781
  before do
619
782
  product.stores = [ "kadewe", nil ]
620
- product.save
783
+ product.save!
621
784
  end
622
785
 
623
786
  it "allows the set of nil values" do
@@ -633,7 +796,7 @@ describe Mongoid::Fields do
633
796
 
634
797
  before do
635
798
  product.stores = [ "karstadt", "kadewe" ]
636
- product.save
799
+ product.save!
637
800
  end
638
801
 
639
802
  it "reverses the values" do
@@ -664,16 +827,13 @@ describe Mongoid::Fields do
664
827
  end
665
828
 
666
829
  context "when a locale is set" do
830
+ with_default_i18n_configs
667
831
 
668
832
  before do
669
- ::I18n.locale = :de
833
+ I18n.locale = :de
670
834
  product.description = "Cheaper drinks"
671
835
  end
672
836
 
673
- after do
674
- ::I18n.locale = :en
675
- end
676
-
677
837
  let(:description) do
678
838
  product.attributes["description"]
679
839
  end
@@ -684,17 +844,15 @@ describe Mongoid::Fields do
684
844
  end
685
845
 
686
846
  context "when having multiple locales" do
847
+ with_default_i18n_configs
687
848
 
688
849
  before do
850
+ I18n.locale = :en
689
851
  product.description = "Cheap drinks"
690
- ::I18n.locale = :de
852
+ I18n.locale = :de
691
853
  product.description = "Cheaper drinks"
692
854
  end
693
855
 
694
- after do
695
- ::I18n.locale = :en
696
- end
697
-
698
856
  let(:description) do
699
857
  product.attributes["description"]
700
858
  end
@@ -706,6 +864,22 @@ describe Mongoid::Fields do
706
864
  end
707
865
  end
708
866
  end
867
+
868
+ context "when the field needs to be mongoized" do
869
+
870
+ before do
871
+ product.price = "1"
872
+ product.save!
873
+ end
874
+
875
+ it "mongoizes the value" do
876
+ expect(product.price).to eq(1)
877
+ end
878
+
879
+ it "stores the value in the mongoized form" do
880
+ expect(product.attributes_before_type_cast["price"]).to eq(1)
881
+ end
882
+ end
709
883
  end
710
884
 
711
885
  describe "#defaults" do
@@ -810,7 +984,8 @@ describe Mongoid::Fields do
810
984
  end
811
985
 
812
986
  it "does not return subclass defaults" do
813
- expect(shape.pre_processed_defaults).to eq([ "_id", "x", "y", "_type" ])
987
+ expect(shape.pre_processed_defaults).to eq([ "_id", "x", "y" ])
988
+ expect(shape.post_processed_defaults).to eq([ "_type" ])
814
989
  end
815
990
  end
816
991
 
@@ -821,7 +996,8 @@ describe Mongoid::Fields do
821
996
  end
822
997
 
823
998
  it "has the parent and child defaults" do
824
- expect(circle.pre_processed_defaults).to eq([ "_id", "x", "y", "_type", "radius" ])
999
+ expect(circle.pre_processed_defaults).to eq([ "_id", "x", "y", "radius" ])
1000
+ expect(circle.post_processed_defaults).to eq([ "_type" ])
825
1001
  end
826
1002
  end
827
1003
  end
@@ -840,32 +1016,30 @@ describe Mongoid::Fields do
840
1016
  it "raises an error" do
841
1017
  expect {
842
1018
  Person.field(meth)
843
- }.to raise_error(Mongoid::Errors::InvalidField)
1019
+ }.to raise_error(Mongoid::Errors::InvalidField, /Defining a field named '#{meth}' is not allowed/)
844
1020
  end
845
1021
  end
846
1022
  end
847
1023
  end
848
1024
 
849
1025
  context "when field already exist and validate_duplicate is enable" do
1026
+ context 'when exception is enabled' do
1027
+ config_override :duplicate_fields_exception, true
850
1028
 
851
- before do
852
- Mongoid.duplicate_fields_exception = true
853
- end
854
-
855
- after do
856
- Mongoid.duplicate_fields_exception = false
857
- end
858
-
859
- it "raises an error" do
860
- expect {
861
- Person.field(:title)
862
- }.to raise_error(Mongoid::Errors::InvalidField)
1029
+ it "raises an error" do
1030
+ expect {
1031
+ Person.field(:title)
1032
+ }.to raise_error(Mongoid::Errors::InvalidField)
1033
+ end
863
1034
  end
864
1035
 
865
- it "doesn't raise an error" do
866
- expect {
867
- Class.new(Person)
868
- }.to_not raise_error
1036
+ context 'when exception is disabled' do
1037
+ config_override :duplicate_fields_exception, false
1038
+ it "doesn't raise an error" do
1039
+ expect {
1040
+ Class.new(Person)
1041
+ }.to_not raise_error
1042
+ end
869
1043
  end
870
1044
  end
871
1045
 
@@ -880,14 +1054,7 @@ describe Mongoid::Fields do
880
1054
  end
881
1055
 
882
1056
  context "when reading the field" do
883
-
884
- before do
885
- Time.zone = "Berlin"
886
- end
887
-
888
- after do
889
- Time.zone = nil
890
- end
1057
+ time_zone_override "Berlin"
891
1058
 
892
1059
  it "performs the necessary time conversions" do
893
1060
  expect(person.lunch_time.to_s).to eq(time.getlocal.to_s)
@@ -965,11 +1132,11 @@ describe Mongoid::Fields do
965
1132
  end
966
1133
 
967
1134
  before do
968
- Person.field :aliased, as: :alias, type: Boolean, overwrite: true
1135
+ Person.field :aliased, as: :alias, type: Mongoid::Boolean, overwrite: true
969
1136
  end
970
1137
 
971
1138
  it "uses the alias to write the attribute" do
972
- (person.alias = expect(true)).to be true
1139
+ expect(person.alias = true).to be true
973
1140
  end
974
1141
 
975
1142
  it "uses the alias to read the attribute" do
@@ -981,7 +1148,7 @@ describe Mongoid::Fields do
981
1148
  end
982
1149
 
983
1150
  it "uses the name to write the attribute" do
984
- (person.aliased = expect(true)).to be true
1151
+ expect(person.aliased = true).to be true
985
1152
  end
986
1153
 
987
1154
  it "uses the name to read the attribute" do
@@ -1093,6 +1260,10 @@ describe Mongoid::Fields do
1093
1260
  it "does not return subclass fields" do
1094
1261
  expect(shape.fields.keys).to_not include("radius")
1095
1262
  end
1263
+
1264
+ it 'includes _type field' do
1265
+ expect(shape.fields.keys).to include("_type")
1266
+ end
1096
1267
  end
1097
1268
 
1098
1269
  context "on subclasses" do
@@ -1112,6 +1283,28 @@ describe Mongoid::Fields do
1112
1283
  it "includes the child fields" do
1113
1284
  expect(circle.fields.keys).to include("radius")
1114
1285
  end
1286
+
1287
+ it 'includes _type field' do
1288
+ expect(circle.fields.keys).to include("_type")
1289
+ end
1290
+ end
1291
+
1292
+ context "on new subclasses" do
1293
+ it "all subclasses get the discriminator key" do
1294
+ class DiscriminatorParent
1295
+ include Mongoid::Document
1296
+ end
1297
+
1298
+ class DiscriminatorChild1 < DiscriminatorParent
1299
+ end
1300
+
1301
+ class DiscriminatorChild2 < DiscriminatorParent
1302
+ end
1303
+
1304
+ expect(DiscriminatorParent.fields.keys).to include("_type")
1305
+ expect(DiscriminatorChild1.fields.keys).to include("_type")
1306
+ expect(DiscriminatorChild2.fields.keys).to include("_type")
1307
+ end
1115
1308
  end
1116
1309
  end
1117
1310
 
@@ -1184,71 +1377,147 @@ describe Mongoid::Fields do
1184
1377
 
1185
1378
  context "when a field is defined as a big decimal" do
1186
1379
 
1187
- let(:band) do
1188
- Band.new(name: "Tool")
1189
- end
1380
+ context 'when Mongoid.map_big_decimal_to_decimal128 is false' do
1381
+ config_override :map_big_decimal_to_decimal128, false
1190
1382
 
1191
- let(:decimal) do
1192
- BigDecimal("1000000.00")
1193
- end
1194
-
1195
- context "when setting to a big decimal" do
1196
-
1197
- before do
1198
- band.sales = decimal
1383
+ let(:band) do
1384
+ Band.new(name: "Tool")
1199
1385
  end
1200
1386
 
1201
- it "properly persists as a string" do
1202
- expect(band.attributes["sales"]).to eq(decimal.to_s)
1387
+ let(:decimal) do
1388
+ BigDecimal("1000000.00")
1203
1389
  end
1204
1390
 
1205
- it "returns the proper big decimal" do
1206
- expect(band.sales).to eq(decimal)
1391
+ context "when setting to a big decimal" do
1392
+
1393
+ before do
1394
+ band.sales = decimal
1395
+ end
1396
+
1397
+ it "properly persists as a string" do
1398
+ expect(band.attributes["sales"]).to eq(decimal.to_s)
1399
+ end
1400
+
1401
+ it "returns the proper big decimal" do
1402
+ expect(band.sales).to eq(decimal)
1403
+ end
1207
1404
  end
1208
- end
1209
1405
 
1210
- context "when setting to a string" do
1406
+ context "when setting to a string" do
1211
1407
 
1212
- before do
1213
- band.sales = decimal.to_s
1408
+ before do
1409
+ band.sales = decimal.to_s
1410
+ end
1411
+
1412
+ it "properly persists as a string" do
1413
+ expect(band.attributes["sales"]).to eq(decimal.to_s)
1414
+ end
1415
+
1416
+ it "returns the proper big decimal" do
1417
+ expect(band.sales).to eq(decimal)
1418
+ end
1214
1419
  end
1215
1420
 
1216
- it "properly persists as a string" do
1217
- expect(band.attributes["sales"]).to eq(decimal.to_s)
1421
+ context "when setting to an integer" do
1422
+
1423
+ before do
1424
+ band.sales = decimal.to_i
1425
+ end
1426
+
1427
+ it "properly persists as a string" do
1428
+ expect(band.attributes["sales"]).to eq("1000000")
1429
+ end
1430
+
1431
+ it "returns the proper big decimal" do
1432
+ expect(band.sales).to eq(decimal)
1433
+ end
1218
1434
  end
1219
1435
 
1220
- it "returns the proper big decimal" do
1221
- expect(band.sales).to eq(decimal)
1436
+ context "when setting to a float" do
1437
+
1438
+ before do
1439
+ band.sales = decimal.to_f
1440
+ end
1441
+
1442
+ it "properly persists as a string" do
1443
+ expect(band.attributes["sales"]).to eq(decimal.to_s)
1444
+ end
1445
+
1446
+ it "returns the proper big decimal" do
1447
+ expect(band.sales).to eq(decimal)
1448
+ end
1222
1449
  end
1223
1450
  end
1224
1451
 
1225
- context "when setting to an integer" do
1452
+ context 'when Mongoid.map_big_decimal_to_decimal128 is true' do
1453
+ config_override :map_big_decimal_to_decimal128, true
1226
1454
 
1227
- before do
1228
- band.sales = decimal.to_i
1455
+ let(:band) do
1456
+ Band.new(name: "Tool")
1229
1457
  end
1230
1458
 
1231
- it "properly persists as a string" do
1232
- expect(band.attributes["sales"]).to eq("1000000")
1459
+ let(:decimal) do
1460
+ BigDecimal("1000000.00")
1233
1461
  end
1234
1462
 
1235
- it "returns the proper big decimal" do
1236
- expect(band.sales).to eq(decimal)
1463
+ context "when setting to a big decimal" do
1464
+
1465
+ before do
1466
+ band.sales = decimal
1467
+ end
1468
+
1469
+ it "properly persists as a BSON::Decimal128" do
1470
+ expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal))
1471
+ end
1472
+
1473
+ it "returns the proper big decimal" do
1474
+ expect(band.sales).to eq(decimal)
1475
+ end
1237
1476
  end
1238
- end
1239
1477
 
1240
- context "when setting to a float" do
1478
+ context "when setting to a string" do
1241
1479
 
1242
- before do
1243
- band.sales = decimal.to_f
1480
+ before do
1481
+ band.sales = decimal.to_s
1482
+ end
1483
+
1484
+ it "persists as a BSON::Decimal128" do
1485
+ expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal.to_s))
1486
+ end
1487
+
1488
+ it "returns the proper big decimal" do
1489
+ expect(band.sales).to eq(decimal)
1490
+ end
1244
1491
  end
1245
1492
 
1246
- it "properly persists as a string" do
1247
- expect(band.attributes["sales"]).to eq(decimal.to_s)
1493
+ context "when setting to an integer" do
1494
+
1495
+ before do
1496
+ band.sales = decimal.to_i
1497
+ end
1498
+
1499
+ it "persists as a BSON::Decimal128" do
1500
+ expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal.to_i.to_s))
1501
+ end
1502
+
1503
+ it "returns the proper big decimal" do
1504
+ expect(band.sales).to eq(decimal)
1505
+ end
1248
1506
  end
1249
1507
 
1250
- it "returns the proper big decimal" do
1251
- expect(band.sales).to eq(decimal)
1508
+ context "when setting to a float" do
1509
+
1510
+ before do
1511
+ band.sales = decimal.to_f
1512
+ end
1513
+
1514
+ it "properly persists as a BSON::Decimal128" do
1515
+ expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal.to_f.to_s))
1516
+ end
1517
+
1518
+ it "returns the proper big decimal" do
1519
+ expect(band.sales).to eq(decimal)
1520
+ end
1252
1521
  end
1253
1522
  end
1254
1523
  end
@@ -1256,7 +1525,7 @@ describe Mongoid::Fields do
1256
1525
  context "when the field is a hash of arrays" do
1257
1526
 
1258
1527
  let(:person) do
1259
- Person.create
1528
+ Person.create!
1260
1529
  end
1261
1530
 
1262
1531
  let(:map) do
@@ -1270,7 +1539,7 @@ describe Mongoid::Fields do
1270
1539
  before do
1271
1540
  person.map = map
1272
1541
  person.map["stack1"].reverse!
1273
- person.save
1542
+ person.save!
1274
1543
  end
1275
1544
 
1276
1545
  it "properly updates the hash" do
@@ -1329,4 +1598,472 @@ describe Mongoid::Fields do
1329
1598
  end
1330
1599
  end
1331
1600
  end
1601
+
1602
+ describe '_type field' do
1603
+ context 'on parent class' do
1604
+ let(:shape) { Shape.new }
1605
+
1606
+ it 'is correctly set' do
1607
+ shape.attributes['_type'].should == 'Shape'
1608
+ end
1609
+ end
1610
+
1611
+ context 'on child class' do
1612
+ let(:circle) { Circle.new }
1613
+
1614
+ it 'is correctly set' do
1615
+ circle.attributes['_type'].should == 'Circle'
1616
+ end
1617
+ end
1618
+ end
1619
+
1620
+ describe '.database_field_name' do
1621
+
1622
+ shared_examples_for 'database_field_name' do
1623
+ subject { Person.database_field_name(key) }
1624
+
1625
+ context 'non-aliased field name' do
1626
+ let(:key) { 't' }
1627
+ it { is_expected.to eq 't' }
1628
+ end
1629
+
1630
+ context 'aliased field name' do
1631
+ let(:key) { 'test' }
1632
+ it { is_expected.to eq 't' }
1633
+ end
1634
+
1635
+ context 'non-aliased embeds one relation' do
1636
+ let(:key) { 'pass' }
1637
+ it { is_expected.to eq 'pass' }
1638
+ end
1639
+
1640
+ context 'aliased embeds one relation' do
1641
+ let(:key) { 'passport' }
1642
+ it { is_expected.to eq 'pass' }
1643
+ end
1644
+
1645
+ context 'non-aliased embeds many relation' do
1646
+ let(:key) { 'mobile_phones' }
1647
+ it { is_expected.to eq 'mobile_phones' }
1648
+ end
1649
+
1650
+ context 'aliased embeds many relation' do
1651
+ let(:key) { 'phones' }
1652
+ it { is_expected.to eq 'mobile_phones' }
1653
+ end
1654
+
1655
+ context 'non-aliased embeds one field' do
1656
+ let(:key) { 'pass.exp' }
1657
+ it { is_expected.to eq 'pass.exp' }
1658
+ end
1659
+
1660
+ context 'aliased embeds one field' do
1661
+ let(:key) { 'passport.expiration_date' }
1662
+ it { is_expected.to eq 'pass.exp' }
1663
+ end
1664
+
1665
+ context 'non-aliased embeds many field' do
1666
+ let(:key) { 'mobile_phones.landline' }
1667
+ it { is_expected.to eq 'mobile_phones.landline' }
1668
+ end
1669
+
1670
+ context 'aliased embeds many field' do
1671
+ let(:key) { 'phones.extension' }
1672
+ it { is_expected.to eq 'mobile_phones.ext' }
1673
+ end
1674
+
1675
+ context 'aliased multi-level embedded document' do
1676
+ let(:key) { 'phones.extension' }
1677
+ it { is_expected.to eq 'mobile_phones.ext' }
1678
+ end
1679
+
1680
+ context 'non-aliased multi-level embedded document' do
1681
+ let(:key) { 'phones.extension' }
1682
+ it { is_expected.to eq 'mobile_phones.ext' }
1683
+ end
1684
+
1685
+ context 'aliased multi-level embedded document field' do
1686
+ let(:key) { 'mobile_phones.country_code.code' }
1687
+ it { is_expected.to eq 'mobile_phones.country_code.code' }
1688
+ end
1689
+
1690
+ context 'non-aliased multi-level embedded document field' do
1691
+ let(:key) { 'phones.country_code.iso_alpha2_code' }
1692
+ it { is_expected.to eq 'mobile_phones.country_code.iso' }
1693
+ end
1694
+
1695
+ context 'when field is unknown' do
1696
+ let(:key) { 'shenanigans' }
1697
+ it { is_expected.to eq 'shenanigans' }
1698
+ end
1699
+
1700
+ context 'when embedded field is unknown' do
1701
+ let(:key) { 'phones.bamboozle' }
1702
+ it { is_expected.to eq 'mobile_phones.bamboozle' }
1703
+ end
1704
+
1705
+ context 'when multi-level embedded field is unknown' do
1706
+ let(:key) { 'phones.bamboozle.brouhaha' }
1707
+ it { is_expected.to eq 'mobile_phones.bamboozle.brouhaha' }
1708
+ end
1709
+ end
1710
+
1711
+ shared_examples_for 'pre-fix database_field_name' do
1712
+ subject { Person.database_field_name(key) }
1713
+
1714
+ context 'non-aliased field name' do
1715
+ let(:key) { 't' }
1716
+ it { is_expected.to eq 't' }
1717
+ end
1718
+
1719
+ context 'aliased field name' do
1720
+ let(:key) { 'test' }
1721
+ it { is_expected.to eq 't' }
1722
+ end
1723
+
1724
+ context 'non-aliased embeds one relation' do
1725
+ let(:key) { 'pass' }
1726
+ it { is_expected.to eq 'pass' }
1727
+ end
1728
+
1729
+ context 'aliased embeds one relation' do
1730
+ let(:key) { 'passport' }
1731
+ it { is_expected.to eq 'pass' }
1732
+ end
1733
+
1734
+ context 'non-aliased embeds many relation' do
1735
+ let(:key) { 'mobile_phones' }
1736
+ it { is_expected.to eq 'mobile_phones' }
1737
+ end
1738
+
1739
+ context 'aliased embeds many relation' do
1740
+ let(:key) { 'phones' }
1741
+ it { is_expected.to eq 'mobile_phones' }
1742
+ end
1743
+
1744
+ context 'non-aliased embeds one field' do
1745
+ let(:key) { 'pass.exp' }
1746
+ it { is_expected.to eq 'pass.exp' }
1747
+ end
1748
+
1749
+ context 'aliased embeds one field' do
1750
+ let(:key) { 'passport.expiration_date' }
1751
+ it { is_expected.to eq 'passport.expiration_date' }
1752
+ end
1753
+
1754
+ context 'non-aliased embeds many field' do
1755
+ let(:key) { 'mobile_phones.landline' }
1756
+ it { is_expected.to eq 'mobile_phones.landline' }
1757
+ end
1758
+
1759
+ context 'aliased embeds many field' do
1760
+ let(:key) { 'phones.extension' }
1761
+ it { is_expected.to eq 'phones.extension' }
1762
+ end
1763
+
1764
+ context 'aliased multi-level embedded document' do
1765
+ let(:key) { 'phones.extension' }
1766
+ it { is_expected.to eq 'phones.extension' }
1767
+ end
1768
+
1769
+ context 'non-aliased multi-level embedded document' do
1770
+ let(:key) { 'phones.extension' }
1771
+ it { is_expected.to eq 'phones.extension' }
1772
+ end
1773
+
1774
+ context 'aliased multi-level embedded document field' do
1775
+ let(:key) { 'mobile_phones.country_code.code' }
1776
+ it { is_expected.to eq 'mobile_phones.country_code.code' }
1777
+ end
1778
+
1779
+ context 'non-aliased multi-level embedded document field' do
1780
+ let(:key) { 'phones.country_code.iso_alpha2_code' }
1781
+ it { is_expected.to eq 'phones.country_code.iso_alpha2_code' }
1782
+ end
1783
+
1784
+ context 'when field is unknown' do
1785
+ let(:key) { 'shenanigans' }
1786
+ it { is_expected.to eq 'shenanigans' }
1787
+ end
1788
+
1789
+ context 'when embedded field is unknown' do
1790
+ let(:key) { 'phones.bamboozle' }
1791
+ it { is_expected.to eq 'phones.bamboozle' }
1792
+ end
1793
+
1794
+ context 'when multi-level embedded field is unknown' do
1795
+ let(:key) { 'phones.bamboozle.brouhaha' }
1796
+ it { is_expected.to eq 'phones.bamboozle.brouhaha' }
1797
+ end
1798
+ end
1799
+
1800
+ context "when the broken_alias_handling is not set" do
1801
+ config_override :broken_alias_handling, false
1802
+
1803
+ context 'given nil' do
1804
+ subject { Person.database_field_name(nil) }
1805
+ it { is_expected.to eq nil }
1806
+ end
1807
+
1808
+ context 'given an empty String' do
1809
+ subject { Person.database_field_name('') }
1810
+ it { is_expected.to eq nil }
1811
+ end
1812
+
1813
+ context 'given a String' do
1814
+ subject { Person.database_field_name(key.to_s) }
1815
+ it_behaves_like 'database_field_name'
1816
+ end
1817
+
1818
+ context 'given a Symbol' do
1819
+ subject { Person.database_field_name(key.to_sym) }
1820
+ it_behaves_like 'database_field_name'
1821
+ end
1822
+ end
1823
+
1824
+ context "when the broken_alias_handling is set" do
1825
+ config_override :broken_alias_handling, true
1826
+
1827
+ context 'given nil' do
1828
+ subject { Person.database_field_name(nil) }
1829
+ it { is_expected.to eq nil }
1830
+ end
1831
+
1832
+ context 'given an empty String' do
1833
+ subject { Person.database_field_name('') }
1834
+ it { is_expected.to eq "" }
1835
+ end
1836
+
1837
+ context 'given a String' do
1838
+ subject { Person.database_field_name(key.to_s) }
1839
+ it_behaves_like 'pre-fix database_field_name'
1840
+ end
1841
+
1842
+ context 'given a Symbol' do
1843
+ subject { Person.database_field_name(key.to_sym) }
1844
+ it_behaves_like 'pre-fix database_field_name'
1845
+ end
1846
+ end
1847
+
1848
+ context 'when getting the database field name of a belongs_to associations' do
1849
+ # These tests only apply when the flag is not set
1850
+ config_override :broken_alias_handling, false
1851
+
1852
+ context "when the broken_alias_handling is not set" do
1853
+ context "when the association is the last item" do
1854
+ let(:name) do
1855
+ Game.database_field_name("person")
1856
+ end
1857
+
1858
+ it "gets the alias" do
1859
+ expect(name).to eq("person_id")
1860
+ end
1861
+ end
1862
+
1863
+ context "when the association is not the last item" do
1864
+ let(:name) do
1865
+ Game.database_field_name("person.name")
1866
+ end
1867
+
1868
+ it "gets the alias" do
1869
+ expect(name).to eq("person.name")
1870
+ end
1871
+ end
1872
+ end
1873
+ end
1874
+ end
1875
+
1876
+ describe "#get_field" do
1877
+
1878
+ let(:klass) { Person }
1879
+ let(:field) { klass.cleanse_localized_field_names(field_name) }
1880
+
1881
+ context "when cleansing a field" do
1882
+ let(:field_name) { "employer_id" }
1883
+ it "returns the correct field name" do
1884
+ expect(field).to eq(field_name)
1885
+ end
1886
+ end
1887
+
1888
+ context "when cleansing a localized field" do
1889
+ let(:field_name) { "desc" }
1890
+ it "returns the correct field name" do
1891
+ expect(field).to eq(field_name)
1892
+ end
1893
+ end
1894
+
1895
+ context "when cleansing a translation field" do
1896
+ let(:field_name) { "desc_translations" }
1897
+ it "returns the correct field name" do
1898
+ expect(field).to eq("desc")
1899
+ end
1900
+ end
1901
+
1902
+ context "when cleansing an existing translation field" do
1903
+ let(:field_name) { "localized_translations" }
1904
+ it "returns the correct field name" do
1905
+ expect(field).to eq(field_name)
1906
+ end
1907
+ end
1908
+
1909
+ context "when cleansing an existing translation field with a _translations" do
1910
+ let(:field_name) { "localized_translations_translations" }
1911
+ it "returns the correct field name" do
1912
+ expect(field).to eq("localized_translations")
1913
+ end
1914
+ end
1915
+
1916
+ context "when cleansing dotted translation field" do
1917
+ config_override :broken_alias_handling, false
1918
+ let(:field_name) { "passport.name_translations.asd" }
1919
+ it "returns the correct field name" do
1920
+ expect(field).to eq("pass.name.asd")
1921
+ end
1922
+ end
1923
+
1924
+ context "when cleansing dotted translation field as a symbol" do
1925
+ config_override :broken_alias_handling, false
1926
+ let(:field_name) { "passport.name_translations.asd".to_sym }
1927
+ it "returns the correct field name" do
1928
+ expect(field).to eq("pass.name.asd")
1929
+ end
1930
+ end
1931
+
1932
+ context "when cleansing dotted existing translation field" do
1933
+ config_override :broken_alias_handling, false
1934
+ let(:field_name) { "passport.localized_translations.asd" }
1935
+ it "returns the correct field name" do
1936
+ expect(field).to eq("pass.localized_translations.asd")
1937
+ end
1938
+ end
1939
+
1940
+ context "when cleansing aliased dotted translation field" do
1941
+ let(:field_name) { "pass.name_translations.asd" }
1942
+ it "returns the correct field name" do
1943
+ expect(field).to eq("pass.name.asd")
1944
+ end
1945
+ end
1946
+ end
1947
+
1948
+ describe "localize: :present" do
1949
+
1950
+ let(:product) do
1951
+ Product.new
1952
+ end
1953
+
1954
+ context "when assigning a non blank value" do
1955
+
1956
+ before do
1957
+ product.title = "hello"
1958
+ end
1959
+
1960
+ it "assigns the value" do
1961
+ expect(product.title).to eq("hello")
1962
+ end
1963
+
1964
+ it "populates the translations hash" do
1965
+ expect(product.title_translations).to eq({ "en" => "hello" })
1966
+ end
1967
+ end
1968
+
1969
+ context "when assigning an empty string" do
1970
+ with_default_i18n_configs
1971
+
1972
+ before do
1973
+ I18n.locale = :en
1974
+ product.title = "hello"
1975
+ I18n.locale = :de
1976
+ product.title = "hello there!"
1977
+ product.title = ""
1978
+ end
1979
+
1980
+ it "assigns the value" do
1981
+ expect(product.title).to eq(nil)
1982
+ end
1983
+
1984
+ it "populates the translations hash" do
1985
+ expect(product.title_translations).to eq({ "en" => "hello" })
1986
+ end
1987
+ end
1988
+
1989
+ context "when assigning nil" do
1990
+ with_default_i18n_configs
1991
+
1992
+ before do
1993
+ I18n.locale = :en
1994
+ product.title = "hello"
1995
+ I18n.locale = :de
1996
+ product.title = "hello there!"
1997
+ product.title = nil
1998
+ end
1999
+
2000
+ it "assigns the value" do
2001
+ expect(product.title).to eq(nil)
2002
+ end
2003
+
2004
+ it "populates the translations hash" do
2005
+ expect(product.title_translations).to eq({ "en" => "hello" })
2006
+ end
2007
+ end
2008
+
2009
+ context "when assigning an empty array" do
2010
+ with_default_i18n_configs
2011
+
2012
+ before do
2013
+ I18n.locale = :en
2014
+ product.title = "hello"
2015
+ I18n.locale = :de
2016
+ product.title = "hello there!"
2017
+ product.title = []
2018
+ end
2019
+
2020
+ it "assigns the value" do
2021
+ expect(product.title).to eq(nil)
2022
+ end
2023
+
2024
+ it "populates the translations hash" do
2025
+ expect(product.title_translations).to eq({ "en" => "hello" })
2026
+ end
2027
+ end
2028
+
2029
+ context "when assigning an empty string first" do
2030
+ with_default_i18n_configs
2031
+
2032
+ before do
2033
+ product.title = ""
2034
+ end
2035
+
2036
+ it "assigns the value" do
2037
+ expect(product.title).to eq(nil)
2038
+ end
2039
+
2040
+ it "populates the translations hash" do
2041
+ expect(product.title_translations).to eq({})
2042
+ end
2043
+ end
2044
+
2045
+ context "when assigning an empty string with only one translation" do
2046
+ with_default_i18n_configs
2047
+
2048
+ before do
2049
+ product.title = "Hello"
2050
+ product.title = ""
2051
+ product.save!
2052
+ end
2053
+
2054
+ let(:from_db) { Product.first }
2055
+
2056
+ it "assigns the value" do
2057
+ expect(product.title).to eq(nil)
2058
+ end
2059
+
2060
+ it "populates the translations hash" do
2061
+ expect(product.title_translations).to eq({})
2062
+ end
2063
+
2064
+ it "round trips an empty hash" do
2065
+ expect(from_db.title_translations).to eq({})
2066
+ end
2067
+ end
2068
+ end
1332
2069
  end