Bug 1817900 - Update rust_decimal to 1.28.1. r=emilio,supply-chain-reviewers

Differential Revision: https://phabricator.services.mozilla.com/D170453
This commit is contained in:
Mike Hommey 2023-02-23 01:25:36 +00:00
parent f441e0bb77
commit fd46c51d7f
12 changed files with 147 additions and 30 deletions

4
Cargo.lock generated
View File

@ -4659,9 +4659,9 @@ dependencies = [
[[package]]
name = "rust_decimal"
version = "1.27.0"
version = "1.28.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33c321ee4e17d2b7abe12b5d20c1231db708dd36185c8a21e9de5fed6da4dbe9"
checksum = "e13cf35f7140155d02ba4ec3294373d513a3c7baa8364c162b030e33c61520a8"
dependencies = [
"arrayvec",
"num-traits",

View File

@ -2049,6 +2049,11 @@ who = "Mike Hommey <mh+mozilla@glandium.org>"
criteria = "safe-to-deploy"
delta = "1.26.1 -> 1.27.0"
[[audits.rust_decimal]]
who = "Mike Hommey <mh+mozilla@glandium.org>"
criteria = "safe-to-deploy"
delta = "1.27.0 -> 1.28.1"
[[audits.rustc-hash]]
who = "Bobby Holley <bobbyholley@gmail.com>"
criteria = "safe-to-deploy"

View File

@ -1 +1 @@
{"files":{"BUILD.md":"302c5260cb6eb87efc1d968b42f082ea3569cca084c0cbcc1821a8670235c19a","CHANGELOG.md":"e5e9c86930f1e0e939c17d6fb3b24edd35c50cdcbcefc1737ee22ffb854a17ad","CODE_OF_CONDUCT.md":"64765f10290cfce7191b4208cb21698b708a118568f5016602cccc304846a09a","CONTRIBUTING.md":"471d6281fb5038e17e32d3b4450aacf542a396709605aa170e07d3971d70b9c1","Cargo.toml":"0cbab1d6804a7e986912ed474bafd1f2c6481d7da38344340ea66c0b6fc291b6","LICENSE":"f8218253704e32441cafea1b9b3bcb2c6a3c51c5553cd8513d179290202bccb2","Makefile.toml":"d8d548ac651ce87294bafb6f55bedd1e6e78ce6332594963f6d02db9d7452d13","README.md":"7c954859ce5f2e41584a966d919e52e69c0c37c8c5694c321591bca2c35a4fa6","benches/comparison.rs":"e8b14531b129acb8ffca2dd44565d9160f510ec38abd32fc49fd4e2386067e25","benches/lib_benches.rs":"899ecdd258350ab1c49218b8f0213bbbc2ae937093bd0afa46be7eb1a28afd72","build.rs":"ae5b0e60460390f8411e19d7721524f492a8a988132c74f05867a261b513d54e","rustfmt.toml":"f33bda44a494d17c95b7bc1b3dd88c203030b75be766f3a7f9b63ef45d960bb0","src/arithmetic_impls.rs":"87a87bc46214ba7f239dfafcffb6ca05453f2ff07ed36e94792548d508da7a9d","src/constants.rs":"5a31626a234e4bb1f06752d7db6ebb39a543c5e0df1e929dd0032689ef7aaa1f","src/decimal.rs":"b73235b13b1f2c3aeb9dd3893a0127cde14d99856aba5d19c210c62b57426e63","src/error.rs":"27cdf052d2a956b81cfe0bf512354e3e0772fa9fe5a2a9e8b2246a53ed58ad28","src/fuzz.rs":"86c07d8d541b9ee92a51275993b686902712f94c30785ba93f38997f3569e700","src/lib.rs":"0a8ee05028cd74878fda08d40850e75704349b9782bc5ad9462be7127d09312c","src/maths.rs":"f82016c5ae8406103835a3fedebeb1360cfe3cc40ac4ab28e13da89636c6782c","src/mysql.rs":"3352e1d72561b022427539fc5025f5f01f00be65ebf6492761668effc9e1eeeb","src/ops.rs":"4d426a35f73b0b69cbceee6e01c6eff59b8cc09aab7c885570aea52d8f258f66","src/ops/add.rs":"a85b6214be92a5563e8bb4a936275d8de094507d77384c9184d63583a78b3f55","src/ops/array.rs":"17a1af576390c8f33ed6c13e1b62722eeaa24c0c0086fb951def6d5dacfdc1cd","src/ops/cmp.rs":"95437401daf93d60425c388fc243e52ad5570cfe6c5d818b5aa144759a5f2ef1","src/ops/common.rs":"6d48ecfa4796a38cb9d4c48f50ffed5d1ee79ba8e168a175615b6fe97194b7c2","src/ops/div.rs":"6b1e90b383293eb51f20f22846002a61f17211f7791860d4e9d6f82ad940fb87","src/ops/legacy.rs":"08bc45454b1815a592cc2fd02df8c50bec36c831ab7af098018e29dfc81f0ec4","src/ops/mul.rs":"b0bb69461b4934cb53c49e105d21da8aa661e1215e8797b8fdc64564df431d92","src/ops/rem.rs":"125d64e9425effd01d4ff400f811f43ef76bf846b6823195059648fdf004b592","src/postgres.rs":"34e35b73cb55fa5f303251f3e074c4e30509973900810a9f423f80294effcc05","src/postgres/common.rs":"7f52920a83f9c5081f7b7a626ef4cff65bbaef51133c7eaf364318212d4aed15","src/postgres/diesel.rs":"fb2d7783d279730a6c77458c6bb58f839e9b48d8209ed2e8395e2f72d7032c87","src/postgres/driver.rs":"de3081afea1038ff1d69d10b62ea65f97186c7ad949f964db0cdb17979bdd763","src/rand.rs":"382f057f4a8752a6028afbecd3cb27422d530c6aa0142ddc04b698b501f8f9db","src/rocket.rs":"4d05f292281e4d463abeba603b07ea460065cb1b8ec1c6dafdb4e41f7b89e828","src/serde.rs":"dbb622e628b799d556a23a6fe52bd5bc33726e9cb661b48535c61f50bcf12cae","src/str.rs":"ca8ce5a61fc7d940355a8f1154492a62d06a8c2f825061044a1d422354d6c5ea","tests/decimal_tests.rs":"b2d4a497942575acb0b87e87c9cd17b6afb2ce0fb4e8a359f197fa417228b323","tests/macros.rs":"f4e1ade99bf8a7aaf2a2d4ee557df5b0b32266a349daf59b2e8b1ae7bc72599c","tests/version-numbers.rs":"73301b7bfe500eada5ede66f0dce89bd3e354af50a8e7a123b02931cd5eb8e16"},"package":"33c321ee4e17d2b7abe12b5d20c1231db708dd36185c8a21e9de5fed6da4dbe9"}
{"files":{"BUILD.md":"302c5260cb6eb87efc1d968b42f082ea3569cca084c0cbcc1821a8670235c19a","CHANGELOG.md":"f4eab626b23c7a76e17e2601e7e6fc920090134f59411472c0eaab5b06bd62d1","CODE_OF_CONDUCT.md":"64765f10290cfce7191b4208cb21698b708a118568f5016602cccc304846a09a","CONTRIBUTING.md":"471d6281fb5038e17e32d3b4450aacf542a396709605aa170e07d3971d70b9c1","Cargo.toml":"70a6cc3be824c2c135094b3f217262d86d16a3bc613acf9a12c71cb317002bec","LICENSE":"f8218253704e32441cafea1b9b3bcb2c6a3c51c5553cd8513d179290202bccb2","Makefile.toml":"d8d548ac651ce87294bafb6f55bedd1e6e78ce6332594963f6d02db9d7452d13","README.md":"c65eef618921de6d55955f7ec88c5fdde88a2b8ccdcab6e7fd07def01d90ab14","benches/comparison.rs":"e8b14531b129acb8ffca2dd44565d9160f510ec38abd32fc49fd4e2386067e25","benches/lib_benches.rs":"899ecdd258350ab1c49218b8f0213bbbc2ae937093bd0afa46be7eb1a28afd72","build.rs":"ae5b0e60460390f8411e19d7721524f492a8a988132c74f05867a261b513d54e","rustfmt.toml":"f33bda44a494d17c95b7bc1b3dd88c203030b75be766f3a7f9b63ef45d960bb0","src/arithmetic_impls.rs":"87a87bc46214ba7f239dfafcffb6ca05453f2ff07ed36e94792548d508da7a9d","src/constants.rs":"5a31626a234e4bb1f06752d7db6ebb39a543c5e0df1e929dd0032689ef7aaa1f","src/decimal.rs":"f4f9883e1196b1b316dc7fcaaf94f8b06963ab1d26d56274caaf793afca582b2","src/error.rs":"27cdf052d2a956b81cfe0bf512354e3e0772fa9fe5a2a9e8b2246a53ed58ad28","src/fuzz.rs":"86c07d8d541b9ee92a51275993b686902712f94c30785ba93f38997f3569e700","src/lib.rs":"efff31de36fdfd0b8959982e4dc42eda6512f5fa5bb66fe25eb5ba948f0af6f2","src/maths.rs":"f82016c5ae8406103835a3fedebeb1360cfe3cc40ac4ab28e13da89636c6782c","src/mysql.rs":"3352e1d72561b022427539fc5025f5f01f00be65ebf6492761668effc9e1eeeb","src/ops.rs":"4d426a35f73b0b69cbceee6e01c6eff59b8cc09aab7c885570aea52d8f258f66","src/ops/add.rs":"a85b6214be92a5563e8bb4a936275d8de094507d77384c9184d63583a78b3f55","src/ops/array.rs":"8a900c845e52843f34ae19742a5886cd8becf54ddd6d1923fd0fbd9588c605e9","src/ops/cmp.rs":"95437401daf93d60425c388fc243e52ad5570cfe6c5d818b5aa144759a5f2ef1","src/ops/common.rs":"6d48ecfa4796a38cb9d4c48f50ffed5d1ee79ba8e168a175615b6fe97194b7c2","src/ops/div.rs":"6b1e90b383293eb51f20f22846002a61f17211f7791860d4e9d6f82ad940fb87","src/ops/legacy.rs":"08bc45454b1815a592cc2fd02df8c50bec36c831ab7af098018e29dfc81f0ec4","src/ops/mul.rs":"b0bb69461b4934cb53c49e105d21da8aa661e1215e8797b8fdc64564df431d92","src/ops/rem.rs":"125d64e9425effd01d4ff400f811f43ef76bf846b6823195059648fdf004b592","src/postgres.rs":"34e35b73cb55fa5f303251f3e074c4e30509973900810a9f423f80294effcc05","src/postgres/common.rs":"7f52920a83f9c5081f7b7a626ef4cff65bbaef51133c7eaf364318212d4aed15","src/postgres/diesel.rs":"fb2d7783d279730a6c77458c6bb58f839e9b48d8209ed2e8395e2f72d7032c87","src/postgres/driver.rs":"dfc5001e4d6235e8ce535066887a910681581e9e1aedffd73b265c065dbc497c","src/rand.rs":"382f057f4a8752a6028afbecd3cb27422d530c6aa0142ddc04b698b501f8f9db","src/rocket.rs":"4d05f292281e4d463abeba603b07ea460065cb1b8ec1c6dafdb4e41f7b89e828","src/serde.rs":"b3fda74ee7ec9317e074f2d271a59ae6024c2a324beef1169d5df1747dad9ba2","src/str.rs":"ca8ce5a61fc7d940355a8f1154492a62d06a8c2f825061044a1d422354d6c5ea","tests/decimal_tests.rs":"6e06f4f9558e983c1e39875508f5e96341284664e0f245b2b265587c3b5ab3a0","tests/macros.rs":"f4e1ade99bf8a7aaf2a2d4ee557df5b0b32266a349daf59b2e8b1ae7bc72599c","tests/version-numbers.rs":"73301b7bfe500eada5ede66f0dce89bd3e354af50a8e7a123b02931cd5eb8e16"},"package":"e13cf35f7140155d02ba4ec3294373d513a3c7baa8364c162b030e33c61520a8"}

View File

@ -1,5 +1,29 @@
# Version History
## 1.28.1
### Fixed
* Bumped `borsh` and `criterion` dependencies to the latest versions. ([#568](https://github.com/paupino/rust-decimal/pull/568))
* Removed erroneous debug statements in `serde-with-str` feature. ([#571](https://github.com/paupino/rust-decimal/pull/571))
Thanks [@attila-lin](https://github.com/attila-lin) for your help bumping dependencies.
## 1.28.0
### Added
* Implement `TryFrom<&str>` for `Decimal` ([#560](https://github.com/paupino/rust-decimal/pull/560))
### Fixed
* Explicit string deserialize for `Option<Decimal>` when using `serde-with-str` ([#565](https://github.com/paupino/rust-decimal/pull/565))
* Fix for `rescale` preventing `Decimal::ZERO` to be rescaled to an invalid precision ([#566](https://github.com/paupino/rust-decimal/pull/566))
### Credit
Thank you to [@c410-f3r](https://github.com/c410-f3r) for your diligent help adding features to this library!
## 1.27.0
### Added

View File

@ -13,7 +13,7 @@
edition = "2021"
rust-version = "1.60"
name = "rust_decimal"
version = "1.27.0"
version = "1.28.1"
authors = ["Paul Mason <paul@form1.co.nz>"]
build = "build.rs"
exclude = ["tests/generated/*"]
@ -53,7 +53,7 @@ version = "0.7"
default-features = false
[dependencies.borsh]
version = "0.9"
version = "0.10.0"
optional = true
default-features = false
@ -137,7 +137,7 @@ version = "1.0"
default-features = false
[dev-dependencies.criterion]
version = "0.3"
version = "0.4.0"
default-features = false
[dev-dependencies.csv]
@ -223,6 +223,7 @@ rkyv-safe = [
]
rocket-traits = ["rocket"]
rust-fuzz = ["arbitrary"]
serde = ["dep:serde"]
serde-arbitrary-precision = ["serde-with-arbitrary-precision"]
serde-bincode = ["serde-str"]
serde-float = ["serde-with-float"]

View File

@ -29,8 +29,8 @@ Alternatively, you can edit your `Cargo.toml` directly and run `cargo update`:
```toml
[dependencies]
rust_decimal = "1.27"
rust_decimal_macros = "1.27"
rust_decimal = "1.28"
rust_decimal_macros = "1.28"
```
## Usage

View File

@ -1770,7 +1770,7 @@ impl_try_from_decimal!(u128, Decimal::to_u128, integer_docs!(true));
// See https://github.com/rust-lang/rustfmt/issues/5062 for more information.
#[rustfmt::skip]
macro_rules! impl_try_from_primitive {
($TFrom:ty, $conversion_fn:path) => {
($TFrom:ty, $conversion_fn:path $(, $err:expr)?) => {
#[doc = concat!(
"Try to convert a `",
stringify!($TFrom),
@ -1781,14 +1781,15 @@ macro_rules! impl_try_from_primitive {
#[inline]
fn try_from(t: $TFrom) -> Result<Self, Error> {
$conversion_fn(t).ok_or_else(|| Error::ConversionTo("Decimal".into()))
$conversion_fn(t) $( .ok_or_else(|| $err) )?
}
}
};
}
impl_try_from_primitive!(f32, Self::from_f32);
impl_try_from_primitive!(f64, Self::from_f64);
impl_try_from_primitive!(f32, Self::from_f32, Error::ConversionTo("Decimal".into()));
impl_try_from_primitive!(f64, Self::from_f64, Error::ConversionTo("Decimal".into()));
impl_try_from_primitive!(&str, core::str::FromStr::from_str);
macro_rules! impl_from {
($T:ty, $from_ty:path) => {

View File

@ -1,5 +1,6 @@
#![doc = include_str!(concat!(env!("OUT_DIR"), "/README-lib.md"))]
#![forbid(unsafe_code)]
#![deny(clippy::print_stdout, clippy::print_stderr)]
#![cfg_attr(not(feature = "std"), no_std)]
extern crate alloc;

View File

@ -1,4 +1,4 @@
use crate::constants::{POWERS_10, U32_MASK};
use crate::constants::{MAX_PRECISION_U32, POWERS_10, U32_MASK};
/// Rescales the given decimal to new scale.
/// e.g. with 1.23 and new scale 3 rescale the value to 1.230
@ -10,7 +10,7 @@ pub(crate) fn rescale_internal(value: &mut [u32; 3], value_scale: &mut u32, new_
}
if is_all_zero(value) {
*value_scale = new_scale;
*value_scale = new_scale.min(MAX_PRECISION_U32);
return;
}
@ -299,29 +299,42 @@ mod test {
}
let tests = &[
("1", 0, "1"),
("1", 1, "1.0"),
("1", 5, "1.00000"),
("1", 10, "1.0000000000"),
("1", 20, "1.00000000000000000000"),
("0.6386554621848739495798319328", 27, "0.638655462184873949579831933"),
("1", 0, "1", 0),
("1", 1, "1.0", 1),
("1", 5, "1.00000", 5),
("1", 10, "1.0000000000", 10),
("1", 20, "1.00000000000000000000", 20),
(
"843.65000000", // Scale 8
25, // 25
"843.6500000000000000000000000", // 25
"0.6386554621848739495798319328",
27,
"0.638655462184873949579831933",
27,
),
(
"843.65000000", // Scale 8
30, // 30
"843.6500000000000000000000000000", // 28
"843.65000000", // Scale 8
25,
"843.6500000000000000000000000",
25,
),
(
"843.65000000", // Scale 8
30,
"843.6500000000000000000000000",
25, // Only fits 25
),
("0", 130, "0.000000000000000000000000000000", 28),
];
for &(value_raw, new_scale, expected_value) in tests {
for &(value_raw, new_scale, expected_value, expected_scale) in tests {
let (expected_value, _) = extract(expected_value);
let (mut value, mut value_scale) = extract(value_raw);
rescale_internal(&mut value, &mut value_scale, new_scale);
assert_eq!(value, expected_value);
assert_eq!(
value_scale, expected_scale,
"value: {}, requested scale: {}",
value_raw, new_scale
);
}
}

View File

@ -236,6 +236,20 @@ mod test {
assert_eq!(None, result);
}
#[test]
fn read_very_small_numeric_type() {
let mut client = match Client::connect(&get_postgres_url(), NoTls) {
Ok(x) => x,
Err(err) => panic!("{:#?}", err),
};
let result: Decimal = match client.query("SELECT 1e-130::NUMERIC(130, 0)", &[]) {
Ok(x) => x.iter().next().unwrap().get(0),
Err(err) => panic!("error - {:#?}", err),
};
// We compare this to zero since it is so small that it is effectively zero
assert_eq!(Decimal::ZERO, result);
}
#[test]
fn read_numeric_type() {
let mut client = match Client::connect(&get_postgres_url(), NoTls) {

View File

@ -259,7 +259,7 @@ pub mod str_option {
where
D: serde::de::Deserializer<'de>,
{
deserializer.deserialize_option(OptionDecimalVisitor)
deserializer.deserialize_option(OptionDecimalStrVisitor)
}
pub fn serialize<S>(value: &Option<Decimal>, serializer: S) -> Result<S::Ok, S::Error>
@ -269,7 +269,7 @@ pub mod str_option {
match *value {
Some(ref decimal) => {
let decimal = crate::str::to_str_internal(decimal, true, None);
serializer.serialize_str(decimal.0.as_ref())
serializer.serialize_some(decimal.0.as_ref())
}
None => serializer.serialize_none(),
}
@ -404,6 +404,32 @@ impl<'de> serde::de::Visitor<'de> for OptionDecimalVisitor {
}
}
#[cfg(feature = "serde-with-str")]
struct OptionDecimalStrVisitor;
#[cfg(feature = "serde-with-str")]
impl<'de> serde::de::Visitor<'de> for OptionDecimalStrVisitor {
type Value = Option<Decimal>;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("a Decimal type representing a fixed-point number")
}
fn visit_none<E>(self) -> Result<Option<Decimal>, E>
where
E: serde::de::Error,
{
Ok(None)
}
fn visit_some<D>(self, d: D) -> Result<Option<Decimal>, D::Error>
where
D: serde::de::Deserializer<'de>,
{
d.deserialize_str(DecimalVisitor).map(Some)
}
}
#[cfg(feature = "serde-with-arbitrary-precision")]
struct DecimalKey;
@ -744,7 +770,7 @@ mod test {
use bincode::{deserialize, serialize};
#[derive(Serialize, Deserialize)]
pub struct BincodeExample {
struct BincodeExample {
#[serde(with = "crate::serde::str")]
value: Decimal,
}
@ -752,6 +778,7 @@ mod test {
let data = [
("0", "0"),
("0.00", "0.00"),
("1.234", "1.234"),
("3.14159", "3.14159"),
("-3.14159", "-3.14159"),
("1234567890123.4567890", "1234567890123.4567890"),
@ -768,6 +795,31 @@ mod test {
}
}
#[test]
#[cfg(feature = "serde-with-str")]
fn with_str_bincode_optional() {
use bincode::{deserialize, serialize};
#[derive(Serialize, Deserialize)]
struct BincodeExample {
#[serde(with = "crate::serde::str_option")]
value: Option<Decimal>,
}
// Some(value)
let value = Some(Decimal::new(1234, 3));
let input = BincodeExample { value };
let encoded = serialize(&input).unwrap();
let decoded: BincodeExample = deserialize(&encoded[..]).unwrap();
assert_eq!(value, decoded.value, "Some(value)");
// None
let input = BincodeExample { value: None };
let encoded = serialize(&input).unwrap();
let decoded: BincodeExample = deserialize(&encoded[..]).unwrap();
assert_eq!(None, decoded.value, "None");
}
#[test]
#[cfg(feature = "serde-with-str")]
fn with_str_optional() {

View File

@ -2859,6 +2859,12 @@ fn it_converts_from_u128() {
}
}
#[test]
fn it_converts_from_str() {
assert_eq!(Decimal::try_from("1").unwrap(), Decimal::ONE);
assert_eq!(Decimal::try_from("10").unwrap(), Decimal::TEN);
}
#[test]
fn it_converts_from_f32() {
use num_traits::FromPrimitive;