mongoid 7.5.4 → 8.1.9

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 (446) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -3
  3. data/README.md +6 -6
  4. data/Rakefile +44 -46
  5. data/lib/config/locales/en.yml +92 -43
  6. data/lib/mongoid/association/accessors.rb +44 -11
  7. data/lib/mongoid/association/bindable.rb +50 -2
  8. data/lib/mongoid/association/builders.rb +5 -3
  9. data/lib/mongoid/association/constrainable.rb +0 -1
  10. data/lib/mongoid/association/eager_loadable.rb +32 -7
  11. data/lib/mongoid/association/embedded/batchable.rb +34 -11
  12. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  13. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  14. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
  15. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
  16. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  17. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  18. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
  19. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +85 -46
  20. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  21. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
  22. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
  23. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  24. data/lib/mongoid/association/macros.rb +8 -1
  25. data/lib/mongoid/association/many.rb +11 -7
  26. data/lib/mongoid/association/nested/many.rb +5 -4
  27. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  28. data/lib/mongoid/association/nested/one.rb +45 -7
  29. data/lib/mongoid/association/one.rb +2 -2
  30. data/lib/mongoid/association/options.rb +9 -9
  31. data/lib/mongoid/association/proxy.rb +15 -4
  32. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  33. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  34. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  35. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  36. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  37. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  38. data/lib/mongoid/association/referenced/eager.rb +2 -2
  39. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  40. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  41. data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
  42. data/lib/mongoid/association/referenced/has_many/proxy.rb +40 -21
  43. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  44. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  45. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  46. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  47. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  48. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  49. data/lib/mongoid/association/reflections.rb +4 -4
  50. data/lib/mongoid/association/relatable.rb +44 -10
  51. data/lib/mongoid/association.rb +5 -5
  52. data/lib/mongoid/atomic/modifiers.rb +2 -2
  53. data/lib/mongoid/atomic.rb +16 -7
  54. data/lib/mongoid/attributes/dynamic.rb +4 -4
  55. data/lib/mongoid/attributes/nested.rb +6 -6
  56. data/lib/mongoid/attributes/processing.rb +37 -6
  57. data/lib/mongoid/attributes/projector.rb +2 -2
  58. data/lib/mongoid/attributes/readonly.rb +11 -6
  59. data/lib/mongoid/attributes.rb +51 -42
  60. data/lib/mongoid/changeable.rb +147 -14
  61. data/lib/mongoid/clients/options.rb +5 -1
  62. data/lib/mongoid/clients/sessions.rb +2 -14
  63. data/lib/mongoid/clients/storage_options.rb +2 -5
  64. data/lib/mongoid/clients/validators/storage.rb +3 -15
  65. data/lib/mongoid/collection_configurable.rb +58 -0
  66. data/lib/mongoid/composable.rb +2 -0
  67. data/lib/mongoid/config/defaults.rb +60 -0
  68. data/lib/mongoid/config/options.rb +3 -0
  69. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  70. data/lib/mongoid/config/validators/client.rb +6 -6
  71. data/lib/mongoid/config/validators.rb +1 -0
  72. data/lib/mongoid/config.rb +153 -18
  73. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  74. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  75. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  76. data/lib/mongoid/contextual/atomic.rb +1 -1
  77. data/lib/mongoid/contextual/geo_near.rb +7 -7
  78. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  79. data/lib/mongoid/contextual/memory.rb +285 -58
  80. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  81. data/lib/mongoid/contextual/mongo.rb +540 -346
  82. data/lib/mongoid/contextual/none.rb +193 -20
  83. data/lib/mongoid/contextual/queryable.rb +1 -1
  84. data/lib/mongoid/contextual.rb +14 -2
  85. data/lib/mongoid/copyable.rb +32 -8
  86. data/lib/mongoid/criteria/findable.rb +8 -5
  87. data/lib/mongoid/criteria/includable.rb +27 -22
  88. data/lib/mongoid/criteria/marshalable.rb +10 -2
  89. data/lib/mongoid/criteria/permission.rb +1 -1
  90. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  91. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
  92. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  93. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  94. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  95. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  96. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
  97. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +15 -9
  98. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  99. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  100. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  101. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  102. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  103. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  104. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  105. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  106. data/lib/mongoid/criteria/queryable/key.rb +4 -4
  107. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  108. data/lib/mongoid/criteria/queryable/optional.rb +11 -17
  109. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  110. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  111. data/lib/mongoid/criteria/queryable/selectable.rb +48 -39
  112. data/lib/mongoid/criteria/queryable/selector.rb +92 -7
  113. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  114. data/lib/mongoid/criteria/queryable.rb +12 -7
  115. data/lib/mongoid/criteria/scopable.rb +2 -2
  116. data/lib/mongoid/criteria/translator.rb +45 -0
  117. data/lib/mongoid/criteria.rb +20 -40
  118. data/lib/mongoid/deprecable.rb +37 -0
  119. data/lib/mongoid/deprecation.rb +25 -0
  120. data/lib/mongoid/document.rb +135 -36
  121. data/lib/mongoid/equality.rb +9 -8
  122. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  123. data/lib/mongoid/errors/document_not_found.rb +10 -6
  124. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  125. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  126. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  127. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  128. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  129. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  130. data/lib/mongoid/errors/invalid_field.rb +6 -2
  131. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  132. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  133. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  134. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  135. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  136. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  137. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  138. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  139. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  140. data/lib/mongoid/errors/no_client_database.rb +1 -1
  141. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  142. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  143. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  144. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  145. data/lib/mongoid/errors.rb +6 -3
  146. data/lib/mongoid/extensions/array.rb +9 -7
  147. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  148. data/lib/mongoid/extensions/binary.rb +42 -0
  149. data/lib/mongoid/extensions/boolean.rb +8 -2
  150. data/lib/mongoid/extensions/date.rb +26 -20
  151. data/lib/mongoid/extensions/date_time.rb +1 -1
  152. data/lib/mongoid/extensions/false_class.rb +1 -1
  153. data/lib/mongoid/extensions/float.rb +7 -4
  154. data/lib/mongoid/extensions/hash.rb +38 -9
  155. data/lib/mongoid/extensions/integer.rb +7 -4
  156. data/lib/mongoid/extensions/module.rb +1 -1
  157. data/lib/mongoid/extensions/object.rb +10 -8
  158. data/lib/mongoid/extensions/range.rb +41 -10
  159. data/lib/mongoid/extensions/regexp.rb +11 -4
  160. data/lib/mongoid/extensions/set.rb +11 -4
  161. data/lib/mongoid/extensions/string.rb +11 -22
  162. data/lib/mongoid/extensions/symbol.rb +4 -15
  163. data/lib/mongoid/extensions/time.rb +29 -16
  164. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  165. data/lib/mongoid/extensions/true_class.rb +1 -1
  166. data/lib/mongoid/extensions.rb +1 -0
  167. data/lib/mongoid/factory.rb +55 -7
  168. data/lib/mongoid/fields/foreign_key.rb +11 -4
  169. data/lib/mongoid/fields/localized.rb +19 -4
  170. data/lib/mongoid/fields/standard.rb +17 -7
  171. data/lib/mongoid/fields/validators/macro.rb +3 -9
  172. data/lib/mongoid/fields.rb +142 -28
  173. data/lib/mongoid/findable.rb +54 -24
  174. data/lib/mongoid/indexable/specification.rb +2 -2
  175. data/lib/mongoid/indexable/validators/options.rb +6 -2
  176. data/lib/mongoid/interceptable.rb +187 -16
  177. data/lib/mongoid/matchable.rb +1 -1
  178. data/lib/mongoid/matcher/eq_impl.rb +1 -1
  179. data/lib/mongoid/matcher/type.rb +1 -1
  180. data/lib/mongoid/matcher.rb +48 -14
  181. data/lib/mongoid/persistable/creatable.rb +19 -9
  182. data/lib/mongoid/persistable/deletable.rb +2 -2
  183. data/lib/mongoid/persistable/destroyable.rb +1 -1
  184. data/lib/mongoid/persistable/savable.rb +14 -2
  185. data/lib/mongoid/persistable/unsettable.rb +2 -2
  186. data/lib/mongoid/persistable/updatable.rb +69 -12
  187. data/lib/mongoid/persistable/upsertable.rb +21 -2
  188. data/lib/mongoid/persistable.rb +6 -3
  189. data/lib/mongoid/persistence_context.rb +6 -4
  190. data/lib/mongoid/query_cache.rb +13 -261
  191. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  192. data/lib/mongoid/railties/database.rake +7 -2
  193. data/lib/mongoid/reloadable.rb +10 -8
  194. data/lib/mongoid/scopable.rb +15 -13
  195. data/lib/mongoid/selectable.rb +1 -2
  196. data/lib/mongoid/serializable.rb +17 -13
  197. data/lib/mongoid/stateful.rb +57 -10
  198. data/lib/mongoid/tasks/database.rake +12 -0
  199. data/lib/mongoid/tasks/database.rb +20 -2
  200. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  201. data/lib/mongoid/threaded.rb +42 -12
  202. data/lib/mongoid/timestamps/created.rb +9 -2
  203. data/lib/mongoid/timestamps/updated.rb +2 -2
  204. data/lib/mongoid/touchable.rb +3 -4
  205. data/lib/mongoid/traversable.rb +41 -5
  206. data/lib/mongoid/utils.rb +22 -0
  207. data/lib/mongoid/validatable/associated.rb +98 -17
  208. data/lib/mongoid/validatable/localizable.rb +1 -1
  209. data/lib/mongoid/validatable/macros.rb +5 -7
  210. data/lib/mongoid/validatable/presence.rb +2 -2
  211. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  212. data/lib/mongoid/validatable.rb +17 -6
  213. data/lib/mongoid/version.rb +1 -1
  214. data/lib/mongoid/warnings.rb +19 -4
  215. data/lib/mongoid.rb +17 -3
  216. data/spec/config/mongoid.yml +16 -0
  217. data/spec/integration/app_spec.rb +24 -19
  218. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  219. data/spec/integration/associations/embedded_spec.rb +15 -0
  220. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  221. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  222. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  223. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +61 -0
  224. data/spec/integration/associations/has_one_spec.rb +97 -1
  225. data/spec/integration/associations/scope_option_spec.rb +1 -1
  226. data/spec/integration/callbacks_models.rb +132 -1
  227. data/spec/integration/callbacks_spec.rb +381 -4
  228. data/spec/integration/criteria/range_spec.rb +95 -1
  229. data/spec/integration/discriminator_key_spec.rb +118 -80
  230. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  231. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  232. data/spec/integration/matcher_examples_spec.rb +20 -13
  233. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  234. data/spec/integration/matcher_operator_spec.rb +3 -5
  235. data/spec/integration/persistence/range_field_spec.rb +350 -0
  236. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  237. data/spec/mongoid/association/depending_spec.rb +9 -9
  238. data/spec/mongoid/association/eager_spec.rb +26 -3
  239. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  240. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  241. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  242. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  243. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +290 -65
  244. data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
  245. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +16 -0
  246. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  247. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  248. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  249. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  250. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  251. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  252. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  253. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +19 -0
  254. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  255. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  256. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
  257. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  258. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  259. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  260. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  261. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +215 -177
  262. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  263. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  264. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  265. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  266. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  267. data/spec/mongoid/association/syncable_spec.rb +15 -1
  268. data/spec/mongoid/association_spec.rb +60 -0
  269. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  270. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  271. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  272. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  273. data/spec/mongoid/attributes/readonly_spec.rb +19 -0
  274. data/spec/mongoid/attributes_spec.rb +526 -33
  275. data/spec/mongoid/changeable_spec.rb +429 -37
  276. data/spec/mongoid/clients/factory_spec.rb +23 -30
  277. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  278. data/spec/mongoid/clients_spec.rb +149 -15
  279. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  280. data/spec/mongoid/config/defaults_spec.rb +160 -0
  281. data/spec/mongoid/config_spec.rb +214 -31
  282. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  283. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  284. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  285. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  286. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  287. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  288. data/spec/mongoid/contextual/mongo_spec.rb +2256 -1005
  289. data/spec/mongoid/contextual/none_spec.rb +60 -21
  290. data/spec/mongoid/copyable_spec.rb +453 -11
  291. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  292. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  293. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  294. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  295. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  296. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  297. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  298. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  299. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  300. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  301. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  302. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  303. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  304. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  305. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  306. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  307. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  308. data/spec/mongoid/criteria/queryable/selectable_spec.rb +107 -86
  309. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
  310. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  311. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  312. data/spec/mongoid/criteria_spec.rb +469 -1205
  313. data/spec/mongoid/document_fields_spec.rb +173 -24
  314. data/spec/mongoid/document_spec.rb +59 -41
  315. data/spec/mongoid/equality_spec.rb +6 -0
  316. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  317. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  318. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  319. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  320. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  321. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  322. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  323. data/spec/mongoid/extensions/array_spec.rb +16 -2
  324. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  325. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  326. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  327. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  328. data/spec/mongoid/extensions/date_spec.rb +71 -1
  329. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  330. data/spec/mongoid/extensions/float_spec.rb +53 -74
  331. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  332. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  333. data/spec/mongoid/extensions/range_spec.rb +255 -54
  334. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  335. data/spec/mongoid/extensions/set_spec.rb +106 -0
  336. data/spec/mongoid/extensions/string_spec.rb +53 -25
  337. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  338. data/spec/mongoid/extensions/time_spec.rb +639 -106
  339. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  340. data/spec/mongoid/factory_spec.rb +61 -1
  341. data/spec/mongoid/fields/localized_spec.rb +80 -37
  342. data/spec/mongoid/fields_spec.rb +503 -87
  343. data/spec/mongoid/findable_spec.rb +450 -58
  344. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  345. data/spec/mongoid/indexable_spec.rb +55 -30
  346. data/spec/mongoid/interceptable_spec.rb +904 -22
  347. data/spec/mongoid/interceptable_spec_models.rb +189 -22
  348. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  349. data/spec/mongoid/mongoizable_spec.rb +285 -0
  350. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  351. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  352. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  353. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  354. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  355. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  356. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  357. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  358. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  359. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  360. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  361. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  362. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  363. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  364. data/spec/mongoid/persistence_context_spec.rb +31 -57
  365. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  366. data/spec/mongoid/query_cache_spec.rb +56 -215
  367. data/spec/mongoid/reloadable_spec.rb +83 -6
  368. data/spec/mongoid/scopable_spec.rb +91 -1
  369. data/spec/mongoid/serializable_spec.rb +25 -39
  370. data/spec/mongoid/shardable_spec.rb +4 -4
  371. data/spec/mongoid/stateful_spec.rb +150 -8
  372. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  373. data/spec/mongoid/tasks/database_spec.rb +127 -0
  374. data/spec/mongoid/timestamps/created_spec.rb +23 -0
  375. data/spec/mongoid/timestamps_spec.rb +392 -4
  376. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  377. data/spec/mongoid/touchable_spec.rb +390 -2
  378. data/spec/mongoid/touchable_spec_models.rb +14 -8
  379. data/spec/mongoid/traversable_spec.rb +13 -35
  380. data/spec/mongoid/validatable/associated_spec.rb +27 -34
  381. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  382. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  383. data/spec/mongoid/warnings_spec.rb +35 -0
  384. data/spec/mongoid_spec.rb +34 -16
  385. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  386. data/spec/rails/mongoid_spec.rb +4 -16
  387. data/spec/spec_helper.rb +5 -0
  388. data/spec/support/constraints.rb +24 -0
  389. data/spec/support/immutable_ids.rb +118 -0
  390. data/spec/support/macros.rb +78 -0
  391. data/spec/support/models/artist.rb +0 -1
  392. data/spec/support/models/augmentation.rb +12 -0
  393. data/spec/support/models/band.rb +5 -0
  394. data/spec/support/models/book.rb +1 -0
  395. data/spec/support/models/building.rb +2 -0
  396. data/spec/support/models/catalog.rb +24 -0
  397. data/spec/support/models/circus.rb +3 -0
  398. data/spec/support/models/cover.rb +10 -0
  399. data/spec/support/models/fanatic.rb +8 -0
  400. data/spec/support/models/implant.rb +9 -0
  401. data/spec/support/models/label.rb +2 -0
  402. data/spec/support/models/lat_lng.rb +6 -0
  403. data/spec/support/models/name.rb +10 -0
  404. data/spec/support/models/passport.rb +9 -0
  405. data/spec/support/models/person.rb +2 -0
  406. data/spec/support/models/player.rb +2 -0
  407. data/spec/support/models/powerup.rb +12 -0
  408. data/spec/support/models/product.rb +1 -0
  409. data/spec/support/models/purse.rb +9 -0
  410. data/spec/support/models/registry.rb +1 -0
  411. data/spec/support/models/school.rb +14 -0
  412. data/spec/support/models/shield.rb +18 -0
  413. data/spec/support/models/student.rb +14 -0
  414. data/spec/support/models/weapon.rb +12 -0
  415. metadata +98 -96
  416. checksums.yaml.gz.sig +0 -0
  417. data/lib/mongoid/errors/eager_load.rb +0 -23
  418. data/lib/mongoid/errors/invalid_value.rb +0 -17
  419. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  420. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  421. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
  422. data/spec/shared/LICENSE +0 -20
  423. data/spec/shared/bin/get-mongodb-download-url +0 -17
  424. data/spec/shared/bin/s3-copy +0 -45
  425. data/spec/shared/bin/s3-upload +0 -69
  426. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  427. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  428. data/spec/shared/lib/mrss/constraints.rb +0 -378
  429. data/spec/shared/lib/mrss/docker_runner.rb +0 -291
  430. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  431. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  432. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  433. data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
  434. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  435. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  436. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  437. data/spec/shared/lib/mrss/utils.rb +0 -15
  438. data/spec/shared/share/Dockerfile.erb +0 -325
  439. data/spec/shared/share/haproxy-1.conf +0 -16
  440. data/spec/shared/share/haproxy-2.conf +0 -17
  441. data/spec/shared/shlib/config.sh +0 -27
  442. data/spec/shared/shlib/distro.sh +0 -74
  443. data/spec/shared/shlib/server.sh +0 -392
  444. data/spec/shared/shlib/set_env.sh +0 -169
  445. data.tar.gz.sig +0 -0
  446. metadata.gz.sig +0 -3
@@ -8,401 +8,901 @@ describe Mongoid::Extensions::BigDecimal do
8
8
  BigDecimal("123456.789")
9
9
  end
10
10
 
11
- describe ".demongoize" do
11
+ context 'when map_big_decimal_to_decimal128 is false' do
12
+ config_override :map_big_decimal_to_decimal128, false
12
13
 
13
- context "when the value is an empty String" do
14
+ describe ".demongoize" do
14
15
 
15
- let(:string) do
16
- ""
16
+ let(:demongoized) do
17
+ BigDecimal.demongoize(value)
17
18
  end
18
19
 
19
- it "returns nil" do
20
- expect(BigDecimal.demongoize(string)).to be_nil
20
+ context "when the value is an empty String" do
21
+
22
+ let(:value) do
23
+ ""
24
+ end
25
+
26
+ it "raises an error" do
27
+ expect(demongoized).to be_nil
28
+ end
21
29
  end
22
- end
23
30
 
24
- context "when the value is a numeric String" do
31
+ context "when the value is a numeric String" do
32
+
33
+ let(:value) do
34
+ "123456.789"
35
+ end
25
36
 
26
- let(:string) do
27
- "123456.789"
37
+ it "returns a BigDecimal" do
38
+ expect(demongoized).to eq(BigDecimal(value))
39
+ end
28
40
  end
29
41
 
30
- it "returns a BigDecimal" do
31
- expect(BigDecimal.demongoize(string)).to eq(BigDecimal(string))
42
+ context "when the value is the numeric String zero" do
43
+
44
+ let(:value) do
45
+ "0.0"
46
+ end
47
+
48
+ it "returns a BigDecimal" do
49
+ expect(demongoized).to eq(BigDecimal(value))
50
+ end
32
51
  end
33
- end
34
52
 
35
- context "when the value is the numeric String zero" do
53
+ context "when the value is the numeric String negative zero" do
54
+
55
+ let(:value) do
56
+ "-0.0"
57
+ end
36
58
 
37
- let(:string) do
38
- "0.0"
59
+ it "returns a BigDecimal" do
60
+ expect(demongoized).to eq(BigDecimal(value))
61
+ end
39
62
  end
40
63
 
41
- it "returns a BigDecimal" do
42
- expect(BigDecimal.demongoize(string)).to eq(BigDecimal(string))
64
+ context "when the value is a non-numeric String" do
65
+
66
+ let(:value) do
67
+ "1a2"
68
+ end
69
+
70
+ it "returns nil" do
71
+ expect(demongoized).to be_nil
72
+ end
43
73
  end
44
- end
45
74
 
46
- context "when the value is the numeric String negative zero" do
75
+ context "when the value is nil" do
47
76
 
48
- let(:string) do
49
- "-0.0"
77
+ let(:value) do
78
+ nil
79
+ end
80
+
81
+ it "returns nil" do
82
+ expect(demongoized).to be_nil
83
+ end
50
84
  end
51
85
 
52
- it "returns a BigDecimal" do
53
- expect(BigDecimal.demongoize(string)).to eq(BigDecimal(string))
86
+ context "when the value is true" do
87
+
88
+ let(:value) do
89
+ true
90
+ end
91
+
92
+ it "returns nil" do
93
+ expect(demongoized).to be_nil
94
+ end
54
95
  end
55
- end
56
96
 
57
- context "when the value is a non-numeric String" do
97
+ context "when the value is false" do
98
+
99
+ let(:value) do
100
+ false
101
+ end
58
102
 
59
- let(:string) do
60
- "1a2"
103
+ it "returns nil" do
104
+ expect(demongoized).to be_nil
105
+ end
61
106
  end
62
107
 
63
- it "returns nil" do
64
- expect(BigDecimal.demongoize(string)).to be_nil
108
+ context "when the value is an Integer" do
109
+
110
+ let(:value) do
111
+ 123456
112
+ end
113
+
114
+ it "returns an integer" do
115
+ expect(demongoized).to eq(value)
116
+ end
65
117
  end
66
- end
67
118
 
68
- context "when the value is nil" do
119
+ context "when the value is a Float" do
120
+
121
+ let(:value) do
122
+ 123456.789
123
+ end
69
124
 
70
- it "returns nil" do
71
- expect(BigDecimal.demongoize(nil)).to be_nil
125
+ it "returns a float" do
126
+ expect(demongoized).to eq(value)
127
+ end
72
128
  end
73
- end
74
129
 
75
- context "when the value is true" do
130
+ context "when the value is the String 'NaN'" do
131
+
132
+ let(:value) do
133
+ "NaN"
134
+ end
135
+
136
+ it "returns a BigDecimal" do
137
+ expect(demongoized).to be_a(BigDecimal)
138
+ end
76
139
 
77
- let(:value) do
78
- true
140
+ it "is a NaN BigDecimal" do
141
+ expect(demongoized).to be_nan
142
+ end
79
143
  end
80
144
 
81
- it "returns nil" do
82
- expect(BigDecimal.demongoize(value)).to be_nil
145
+ context "when the value is the String 'Infinity'" do
146
+
147
+ let(:value) do
148
+ "Infinity"
149
+ end
150
+
151
+ it "returns a BigDecimal" do
152
+ expect(demongoized).to be_a(BigDecimal)
153
+ end
154
+
155
+ it "is a infinity BigDecimal" do
156
+ expect(demongoized.infinite?).to eq 1
157
+ end
83
158
  end
84
- end
85
159
 
86
- context "when the value is false" do
160
+ context "when the value is the String '-Infinity'" do
161
+
162
+ let(:value) do
163
+ "-Infinity"
164
+ end
165
+
166
+ it "returns a BigDecimal" do
167
+ expect(demongoized).to be_a(BigDecimal)
168
+ end
87
169
 
88
- let(:value) do
89
- false
170
+ it "is a negative infinity BigDecimal" do
171
+ expect(demongoized.infinite?).to eq -1
172
+ end
90
173
  end
91
174
 
92
- it "returns nil" do
93
- expect(BigDecimal.demongoize(value)).to be_nil
175
+ context "when the value is a BSON::Decimal128" do
176
+
177
+ let(:value) do
178
+ BSON::Decimal128.new("1.2")
179
+ end
180
+
181
+ it "does not raise an error" do
182
+ expect do
183
+ demongoized
184
+ end.to_not raise_error
185
+ end
186
+
187
+ it "returns a big decimal" do
188
+ expect(demongoized).to eq(value.to_big_decimal)
189
+ end
94
190
  end
95
191
  end
96
192
 
97
- context "when the value is an Integer" do
193
+ describe ".mongoize" do
98
194
 
99
- let(:integer) do
100
- 123456
195
+ let(:mongoized) do
196
+ BigDecimal.mongoize(value)
101
197
  end
102
198
 
103
- it "returns an integer" do
104
- expect(BigDecimal.demongoize(integer)).to eq(integer)
199
+ context "when the value is a BigDecimal" do
200
+
201
+ let(:value) do
202
+ big_decimal
203
+ end
204
+
205
+ it "returns a string" do
206
+ expect(mongoized).to eq(value.to_s)
207
+ end
105
208
  end
106
- end
107
209
 
108
- context "when the value is a Float" do
210
+ context "when the value is the BigDecimal zero" do
109
211
 
110
- let(:float) do
111
- 123456.789
212
+ let(:value) do
213
+ BigDecimal("0.0")
214
+ end
215
+
216
+ it "returns a string" do
217
+ expect(mongoized).to eq(value.to_s)
218
+ end
112
219
  end
113
220
 
114
- it "returns a float" do
115
- expect(BigDecimal.demongoize(float)).to eq(float)
221
+ context "when the value is the BigDecimal negative zero" do
222
+
223
+ let(:value) do
224
+ BigDecimal("-0.0")
225
+ end
226
+
227
+ it "returns a string" do
228
+ expect(mongoized).to eq(value.to_s)
229
+ end
116
230
  end
117
- end
118
231
 
119
- context "when the value is the String 'NaN'" do
232
+ context "when the value is an empty String" do
233
+
234
+ let(:value) do
235
+ ""
236
+ end
120
237
 
121
- let(:nan) do
122
- "NaN"
238
+ it "returns nil" do
239
+ expect(mongoized).to be_nil
240
+ end
123
241
  end
124
242
 
125
- let(:demongoized) do
126
- BigDecimal.demongoize(nan)
243
+ context "when the value is an integer numeric String" do
244
+
245
+ let(:value) do
246
+ "123456"
247
+ end
248
+
249
+ it "returns the String" do
250
+ expect(mongoized).to eq(value)
251
+ end
252
+ end
253
+
254
+ context "when the value is a float numeric String" do
255
+
256
+ let(:value) do
257
+ "123456.789"
258
+ end
259
+
260
+ it "returns the String" do
261
+ expect(mongoized).to eq(value)
262
+ end
127
263
  end
128
264
 
129
- it "returns a BigDecimal" do
130
- expect(demongoized).to be_a(BigDecimal)
265
+ context "when the value is a non-numeric String" do
266
+
267
+ let(:value) do
268
+ "1a2"
269
+ end
270
+
271
+ it "returns nil" do
272
+ expect(mongoized).to be_nil
273
+ end
131
274
  end
132
275
 
133
- it "is a NaN BigDecimal" do
134
- expect(demongoized).to be_nan
276
+ context "when the value is castable" do
277
+
278
+ let(:value) do
279
+ 2.hours
280
+ end
281
+
282
+ before do
283
+ expect(value).to be_a(ActiveSupport::Duration)
284
+ end
285
+
286
+ it "returns nil" do
287
+ expect(mongoized).to eq(7200)
288
+ end
135
289
  end
136
- end
137
290
 
138
- context "when the value is the String 'Infinity'" do
291
+ context "when the value is nil" do
292
+
293
+ let(:value) do
294
+ nil
295
+ end
139
296
 
140
- let(:infinity) do
141
- "Infinity"
297
+ it "returns nil" do
298
+ expect(mongoized).to be_nil
299
+ end
142
300
  end
143
301
 
144
- let(:demongoized) do
145
- BigDecimal.demongoize(infinity)
302
+ context "when the value is true" do
303
+
304
+ let(:value) do
305
+ true
306
+ end
307
+
308
+ it "returns nil" do
309
+ expect(mongoized).to be_nil
310
+ end
146
311
  end
147
312
 
148
- it "returns a BigDecimal" do
149
- expect(demongoized).to be_a(BigDecimal)
313
+ context "when the value is false" do
314
+
315
+ let(:value) do
316
+ false
317
+ end
318
+
319
+ it "returns nil" do
320
+ expect(mongoized).to be_nil
321
+ end
150
322
  end
151
323
 
152
- it "is a infinity BigDecimal" do
153
- expect(demongoized.infinite?).to eq 1
324
+ context "when the value is an Integer" do
325
+ let(:value) do
326
+ 123456
327
+ end
328
+
329
+ it "returns a string" do
330
+ expect(mongoized).to eq(value.to_s)
331
+ end
154
332
  end
155
- end
156
333
 
157
- context "when the value is the String '-Infinity'" do
334
+ context "when the value is a Float" do
158
335
 
159
- let(:neg_infinity) do
160
- "-Infinity"
336
+ let(:value) do
337
+ 123456.789
338
+ end
339
+
340
+ it "returns a string" do
341
+ expect(mongoized).to eq(value.to_s)
342
+ end
161
343
  end
162
344
 
163
- let(:demongoized) do
164
- BigDecimal.demongoize(neg_infinity)
345
+ context "when the value is String NaN" do
346
+
347
+ let(:value) do
348
+ "NaN"
349
+ end
350
+
351
+ it "returns a String" do
352
+ expect(mongoized).to eq("NaN")
353
+ end
165
354
  end
166
355
 
167
- it "returns a BigDecimal" do
168
- expect(demongoized).to be_a(BigDecimal)
356
+ context "when the value is String Infinity" do
357
+
358
+ let(:value) do
359
+ "Infinity"
360
+ end
361
+
362
+ it "returns a String" do
363
+ expect(mongoized).to eq("Infinity")
364
+ end
169
365
  end
170
366
 
171
- it "is a negative infinity BigDecimal" do
172
- expect(demongoized.infinite?).to eq -1
367
+ context "when the value is String negative Infinity" do
368
+
369
+ let(:value) do
370
+ "-Infinity"
371
+ end
372
+
373
+ it "returns a String" do
374
+ expect(mongoized).to eq("-Infinity")
375
+ end
173
376
  end
174
- end
175
- end
176
377
 
177
- describe ".mongoize" do
378
+ context "when the value is BigDecimal NaN" do
178
379
 
179
- context "when the value is a BigDecimal" do
380
+ let(:value) do
381
+ BigDecimal("NaN")
382
+ end
180
383
 
181
- it "returns a string" do
182
- expect(BigDecimal.mongoize(big_decimal)).to eq(big_decimal.to_s)
384
+ it "returns a String" do
385
+ expect(mongoized).to eq("NaN")
386
+ end
183
387
  end
184
- end
185
388
 
186
- context "when the value is the BigDecimal zero" do
389
+ context "when the value is BigDecimal Infinity" do
187
390
 
188
- let(:big_decimal) do
189
- BigDecimal("0.0")
391
+ let(:value) do
392
+ BigDecimal("Infinity")
393
+ end
394
+
395
+ it "returns a String" do
396
+ expect(mongoized).to eq("Infinity")
397
+ end
190
398
  end
191
399
 
192
- it "returns a BigDecimal" do
193
- expect(BigDecimal.mongoize(big_decimal)).to eq(big_decimal.to_s)
400
+ context "when the value is BigDecimal negative Infinity" do
401
+
402
+ let(:value) do
403
+ BigDecimal("-Infinity")
404
+ end
405
+
406
+ it "returns a String" do
407
+ expect(mongoized).to eq("-Infinity")
408
+ end
194
409
  end
195
- end
196
410
 
197
- context "when the value is the BigDecimal negative zero" do
411
+ context "when the value is the constant Float::NAN" do
412
+
413
+ let(:value) do
414
+ Float::NAN
415
+ end
198
416
 
199
- let(:big_decimal) do
200
- BigDecimal("-0.0")
417
+ it "returns a String" do
418
+ expect(mongoized).to eq("NaN")
419
+ end
201
420
  end
202
421
 
203
- it "returns a BigDecimal" do
204
- expect(BigDecimal.mongoize(big_decimal)).to eq(big_decimal.to_s)
422
+ context "when the value is constant Float::INFINITY" do
423
+
424
+ let(:value) do
425
+ Float::INFINITY
426
+ end
427
+
428
+ it "returns a String" do
429
+ expect(mongoized).to eq("Infinity")
430
+ end
205
431
  end
206
- end
207
432
 
208
- context "when the value is an empty String" do
433
+ context "when the value is constant Float::INFINITY * -1" do
434
+
435
+ let(:value) do
436
+ Float::INFINITY * -1
437
+ end
209
438
 
210
- let(:string) do
211
- ""
439
+ it "returns a String" do
440
+ expect(mongoized).to eq("-Infinity")
441
+ end
212
442
  end
213
443
 
214
- it "returns nil" do
215
- expect(BigDecimal.mongoize(string)).to be_nil
444
+ context "when the value is a decimal128" do
445
+ let(:value) do
446
+ BSON::Decimal128.new("42")
447
+ end
448
+
449
+ it "returns a String" do
450
+ expect(mongoized).to eq("42")
451
+ end
216
452
  end
217
453
  end
218
454
 
219
- context "when the value is an integer numeric String" do
455
+ describe "#mongoize" do
220
456
 
221
- let(:string) do
222
- "123456"
457
+ it "returns a string" do
458
+ expect(big_decimal.mongoize).to eq(big_decimal.to_s)
223
459
  end
460
+ end
224
461
 
225
- it "returns the String" do
226
- expect(BigDecimal.mongoize(string)).to eq string
462
+ describe "#numeric?" do
463
+
464
+ it "returns true" do
465
+ expect(big_decimal.numeric?).to eq(true)
227
466
  end
228
467
  end
468
+ end
469
+
470
+ context 'when map_big_decimal_to_decimal128 is true' do
471
+ config_override :map_big_decimal_to_decimal128, true
229
472
 
230
- context "when the value is a float numeric String" do
473
+ describe ".demongoize" do
231
474
 
232
- let(:string) do
233
- "123456.789"
475
+ let(:demongoized) do
476
+ BigDecimal.demongoize(value)
234
477
  end
235
478
 
236
- it "returns the String" do
237
- expect(BigDecimal.mongoize(string)).to eq string
479
+ context "when the value is an empty String" do
480
+
481
+ let(:value) do
482
+ ""
483
+ end
484
+
485
+ it "raises an error" do
486
+ expect(demongoized).to eq(nil)
487
+ end
238
488
  end
239
- end
240
489
 
241
- context "when the value is a non-numeric String" do
490
+ context "when the value is a numeric String" do
491
+
492
+ let(:value) do
493
+ "123456.789"
494
+ end
242
495
 
243
- let(:string) do
244
- "1a2"
496
+ it "returns a BigDecimal" do
497
+ expect(demongoized).to eq(BigDecimal(value))
498
+ end
245
499
  end
246
500
 
247
- it "returns nil" do
248
- expect(BigDecimal.mongoize(string)).to be_nil
501
+ context "when the value is the numeric String zero" do
502
+
503
+ let(:value) do
504
+ "0.0"
505
+ end
506
+
507
+ it "returns a BigDecimal" do
508
+ expect(demongoized).to eq(BigDecimal(value))
509
+ end
249
510
  end
250
- end
251
511
 
252
- context "when the value is nil" do
512
+ context "when the value is the numeric String negative zero" do
253
513
 
254
- it "returns nil" do
255
- expect(BigDecimal.mongoize(nil)).to be_nil
514
+ let(:value) do
515
+ "-0.0"
516
+ end
517
+
518
+ it "returns a BigDecimal" do
519
+ expect(demongoized).to eq(BigDecimal(value))
520
+ end
256
521
  end
257
- end
258
522
 
259
- context "when the value is true" do
523
+ context "when the value is a non-numeric String" do
524
+
525
+ let(:value) do
526
+ "1a2"
527
+ end
260
528
 
261
- let(:value) do
262
- true
529
+ it "returns nil" do
530
+ expect(demongoized).to be_nil
531
+ end
263
532
  end
264
533
 
265
- it "returns nil" do
266
- expect(BigDecimal.mongoize(value)).to be_nil
534
+ context "when the value is nil" do
535
+
536
+ let(:value) do
537
+ nil
538
+ end
539
+
540
+ it "returns nil" do
541
+ expect(demongoized).to be_nil
542
+ end
267
543
  end
268
- end
269
544
 
270
- context "when the value is false" do
545
+ context "when the value is an Integer" do
271
546
 
272
- let(:value) do
273
- false
547
+ let(:value) do
548
+ 123456
549
+ end
550
+
551
+ it "returns an integer" do
552
+ expect(demongoized).to eq(value)
553
+ end
274
554
  end
275
555
 
276
- it "returns nil" do
277
- expect(BigDecimal.mongoize(value)).to be_nil
556
+ context "when the value is a BSON::Decimal128 object" do
557
+
558
+ let(:value) do
559
+ BSON::Decimal128.new("123456")
560
+ end
561
+
562
+ it "returns a BigDecimal" do
563
+ expect(demongoized).to eq(value.to_big_decimal)
564
+ end
278
565
  end
279
- end
280
566
 
281
- context "when the value is an Integer" do
567
+ context "when the value is a Float" do
282
568
 
283
- it "returns a string" do
284
- expect(BigDecimal.mongoize(123456)).to eq("123456")
569
+ let(:value) do
570
+ 123456.789
571
+ end
572
+
573
+ it "returns a float" do
574
+ expect(demongoized).to eq(value)
575
+ end
285
576
  end
286
- end
287
577
 
288
- context "when the value is a Float" do
578
+ context "when the value is the String 'NaN'" do
289
579
 
290
- it "returns a string" do
291
- expect(BigDecimal.mongoize(123456.789)).to eq("123456.789")
580
+ let(:value) do
581
+ "NaN"
582
+ end
583
+
584
+ it "returns a BigDecimal" do
585
+ expect(demongoized).to be_a(BigDecimal)
586
+ end
587
+
588
+ it "is a NaN BigDecimal" do
589
+ expect(demongoized).to be_nan
590
+ end
292
591
  end
293
- end
294
592
 
295
- context "when the value is String NaN" do
593
+ context "when the value is the String 'Infinity'" do
594
+
595
+ let(:value) do
596
+ "Infinity"
597
+ end
296
598
 
297
- let(:nan) do
298
- "NaN"
599
+ it "returns a BigDecimal" do
600
+ expect(demongoized).to be_a(BigDecimal)
601
+ end
602
+
603
+ it "is a infinity BigDecimal" do
604
+ expect(demongoized.infinite?).to eq 1
605
+ end
299
606
  end
300
607
 
301
- it "returns a String" do
302
- expect(BigDecimal.mongoize(nan)).to eq("NaN")
608
+ context "when the value is the String '-Infinity'" do
609
+
610
+ let(:value) do
611
+ "-Infinity"
612
+ end
613
+
614
+ it "returns a BigDecimal" do
615
+ expect(demongoized).to be_a(BigDecimal)
616
+ end
617
+
618
+ it "is a negative infinity BigDecimal" do
619
+ expect(demongoized.infinite?).to eq -1
620
+ end
303
621
  end
304
- end
305
622
 
306
- context "when the value is String Infinity" do
623
+ context "when the value is true" do
624
+
625
+ let(:value) do
626
+ true
627
+ end
307
628
 
308
- let(:infinity) do
309
- "Infinity"
629
+ it "returns nil" do
630
+ expect(demongoized).to be_nil
631
+ end
310
632
  end
311
633
 
312
- it "returns a String" do
313
- expect(BigDecimal.mongoize(infinity)).to eq("Infinity")
634
+ context "when the value is false" do
635
+
636
+ let(:value) do
637
+ false
638
+ end
639
+
640
+ it "returns nil" do
641
+ expect(demongoized).to be_nil
642
+ end
314
643
  end
315
644
  end
316
645
 
317
- context "when the value is String negative Infinity" do
646
+ describe ".mongoize" do
318
647
 
319
- let(:neg_infinity) do
320
- "-Infinity"
648
+ let(:mongoized) do
649
+ BigDecimal.mongoize(value)
321
650
  end
322
651
 
323
- it "returns a String" do
324
- expect(BigDecimal.mongoize(neg_infinity)).to eq("-Infinity")
652
+ context "when the value is a BigDecimal" do
653
+
654
+ let(:value) do
655
+ big_decimal
656
+ end
657
+
658
+ it "returns a BSON::Decimal128" do
659
+ expect(mongoized).to eq(BSON::Decimal128.new(value))
660
+ end
325
661
  end
326
- end
327
662
 
328
- context "when the value is BigDecimal NaN" do
663
+ context "when the value is the BigDecimal zero" do
664
+
665
+ let(:value) do
666
+ BigDecimal("0.0")
667
+ end
329
668
 
330
- let(:nan) do
331
- BigDecimal("NaN")
669
+ it "returns a BSON::Decimal128" do
670
+ expect(mongoized).to eq(BSON::Decimal128.new(value))
671
+ end
332
672
  end
333
673
 
334
- it "returns a String" do
335
- expect(BigDecimal.mongoize(nan)).to eq("NaN")
674
+ context "when the value is the BigDecimal negative zero" do
675
+
676
+ let(:value) do
677
+ BigDecimal("-0.0")
678
+ end
679
+
680
+ it "returns a BSON::Decimal128" do
681
+ expect(mongoized).to eq(BSON::Decimal128.new(value))
682
+ end
336
683
  end
337
- end
338
684
 
339
- context "when the value is BigDecimal Infinity" do
685
+ context "when the value is an empty String" do
340
686
 
341
- let(:infinity) do
342
- BigDecimal("Infinity")
687
+ let(:value) do
688
+ ""
689
+ end
690
+
691
+ it "returns nil" do
692
+ expect(mongoized).to be_nil
693
+ end
343
694
  end
344
695
 
345
- it "returns a String" do
346
- expect(BigDecimal.mongoize(infinity)).to eq("Infinity")
696
+ context "when the value is an integer numeric String" do
697
+
698
+ let(:value) do
699
+ "123456"
700
+ end
701
+
702
+ it "returns the BSON::Decimal128" do
703
+ expect(mongoized).to eq(BSON::Decimal128.new(value))
704
+ end
347
705
  end
348
- end
349
706
 
350
- context "when the value is BigDecimal negative Infinity" do
707
+ context "when the value is a float numeric String" do
708
+
709
+ let(:value) do
710
+ "123456.789"
711
+ end
351
712
 
352
- let(:neg_infinity) do
353
- BigDecimal("-Infinity")
713
+ it "returns the BSON::Decimal128" do
714
+ expect(mongoized).to eq(BSON::Decimal128.new(value))
715
+ end
354
716
  end
355
717
 
356
- it "returns a String" do
357
- expect(BigDecimal.mongoize(neg_infinity)).to eq("-Infinity")
718
+ context "when the value is a non-numeric String" do
719
+
720
+ let(:value) do
721
+ "1a2"
722
+ end
723
+
724
+ it "returns nil" do
725
+ expect(mongoized).to be_nil
726
+ end
358
727
  end
359
- end
360
728
 
361
- context "when the value is the constant Float::NAN" do
729
+ context "when the value is nil" do
730
+
731
+ let(:value) do
732
+ nil
733
+ end
734
+
735
+ it "returns nil" do
736
+ expect(mongoized).to be_nil
737
+ end
738
+ end
739
+
740
+ context "when the value is true" do
741
+
742
+ let(:value) do
743
+ true
744
+ end
362
745
 
363
- let(:nan) do
364
- Float::NAN
746
+ it "returns nil" do
747
+ expect(mongoized).to be_nil
748
+ end
365
749
  end
366
750
 
367
- it "returns a String" do
368
- expect(BigDecimal.mongoize(nan)).to eq("NaN")
751
+ context "when the value is false" do
752
+
753
+ let(:value) do
754
+ false
755
+ end
756
+
757
+ it "returns nil" do
758
+ expect(mongoized).to be_nil
759
+ end
369
760
  end
370
- end
371
761
 
372
- context "when the value is constant Float::INFINITY" do
762
+ context "when the value is an Integer" do
763
+
764
+ let(:value) do
765
+ 123456
766
+ end
373
767
 
374
- let(:infinity) do
375
- Float::INFINITY
768
+ it "returns a BSON::Decimal128" do
769
+ expect(mongoized).to eq(BSON::Decimal128.new(value.to_s))
770
+ end
376
771
  end
377
772
 
378
- it "returns a String" do
379
- expect(BigDecimal.mongoize(infinity)).to eq("Infinity")
773
+ context "when the value is a Float" do
774
+
775
+ let(:value) do
776
+ 123456.789
777
+ end
778
+
779
+ it "returns a BSON::Decimal128" do
780
+ expect(mongoized).to eq(BSON::Decimal128.new(value.to_s))
781
+ end
380
782
  end
381
- end
382
783
 
383
- context "when the value is constant Float::INFINITY * -1" do
784
+ context "when the value is String NaN" do
785
+
786
+ let(:value) do
787
+ "NaN"
788
+ end
789
+
790
+ it "returns a BSON::Decimal128 representation of NaN" do
791
+ expect(mongoized).to eq(BSON::Decimal128.new(value))
792
+ end
793
+ end
794
+
795
+ context "when the value is String Infinity" do
796
+
797
+ let(:value) do
798
+ "Infinity"
799
+ end
800
+
801
+ it "returns a BSON::Decimal128 representation of Infinity" do
802
+ expect(mongoized).to eq(BSON::Decimal128.new(value))
803
+ end
804
+ end
805
+
806
+ context "when the value is String negative Infinity" do
807
+
808
+ let(:value) do
809
+ "-Infinity"
810
+ end
384
811
 
385
- let(:neg_infinity) do
386
- Float::INFINITY * -1
812
+ it "returns a BSON::Decimal128 representation of -Infinity" do
813
+ expect(mongoized).to eq(BSON::Decimal128.new(value))
814
+ end
387
815
  end
388
816
 
389
- it "returns a String" do
390
- expect(BigDecimal.mongoize(neg_infinity)).to eq("-Infinity")
817
+ context "when the value is BigDecimal NaN" do
818
+
819
+ let(:value) do
820
+ BigDecimal("NaN")
821
+ end
822
+
823
+ it "returns a BSON::Decimal128 representation of BigDecimal NaN" do
824
+ expect(mongoized).to eq(BSON::Decimal128.new("NaN"))
825
+ end
826
+ end
827
+
828
+ context "when the value is BigDecimal Infinity" do
829
+
830
+ let(:value) do
831
+ BigDecimal("Infinity")
832
+ end
833
+
834
+ it "returns a BSON::Decimal128 representation of BigDecimal Infinity" do
835
+ expect(mongoized).to eq(BSON::Decimal128.new("Infinity"))
836
+ end
837
+ end
838
+
839
+ context "when the value is BigDecimal negative Infinity" do
840
+
841
+ let(:value) do
842
+ BigDecimal("-Infinity")
843
+ end
844
+
845
+ it "returns a BSON::Decimal128 representation of BigDecimal negative Infinity" do
846
+ expect(mongoized).to eq(BSON::Decimal128.new("-Infinity"))
847
+ end
848
+ end
849
+
850
+ context "when the value is the constant Float::NAN" do
851
+
852
+ let(:value) do
853
+ Float::NAN
854
+ end
855
+
856
+ it "returns a BSON::Decimal128 representation of NaN" do
857
+ expect(mongoized).to eq(BSON::Decimal128.new("NaN"))
858
+ end
859
+ end
860
+
861
+ context "when the value is constant Float::INFINITY" do
862
+
863
+ let(:value) do
864
+ Float::INFINITY
865
+ end
866
+
867
+ it "returns a BSON::Decimal128 representation of Infinity" do
868
+ expect(mongoized).to eq(BSON::Decimal128.new("Infinity"))
869
+ end
870
+ end
871
+
872
+ context "when the value is constant Float::INFINITY * -1" do
873
+
874
+ let(:value) do
875
+ Float::INFINITY * -1
876
+ end
877
+
878
+ it "returns a BSON::Decimal128 representation of negative Infinity" do
879
+ expect(mongoized).to eq(BSON::Decimal128.new("-Infinity"))
880
+ end
881
+ end
882
+
883
+ context "when the value is a decimal128" do
884
+ let(:value) do
885
+ BSON::Decimal128.new("42")
886
+ end
887
+
888
+ it "returns a String" do
889
+ expect(mongoized).to eq(value)
890
+ end
391
891
  end
392
892
  end
393
- end
394
893
 
395
- describe "#mongoize" do
894
+ describe "#mongoize" do
396
895
 
397
- it "returns a string" do
398
- expect(big_decimal.mongoize).to eq(big_decimal.to_s)
896
+ it "returns a BSON::Decimal128 representation of the BigDecimal" do
897
+ expect(big_decimal.mongoize).to eq(BSON::Decimal128.new(big_decimal))
898
+ end
399
899
  end
400
- end
401
900
 
402
- describe "#numeric?" do
901
+ describe "#numeric?" do
403
902
 
404
- it "returns true" do
405
- expect(big_decimal.numeric?).to eq(true)
903
+ it "returns true" do
904
+ expect(big_decimal.numeric?).to eq(true)
905
+ end
406
906
  end
407
907
  end
408
908
  end