From c6a6fcec33845b07d4ec2534fb51db109ec3017f Mon Sep 17 00:00:00 2001 From: "Guillaume W. Bres" Date: Tue, 15 Nov 2022 08:54:23 +0100 Subject: [PATCH 1/8] epoch, duration: improve and fix serdes feature Signed-off-by: Guillaume W. Bres --- src/duration.rs | 17 +++-------------- src/epoch.rs | 17 +++-------------- 2 files changed, 6 insertions(+), 28 deletions(-) diff --git a/src/duration.rs b/src/duration.rs index 9f01bfe8..36d39568 100644 --- a/src/duration.rs +++ b/src/duration.rs @@ -21,8 +21,8 @@ use core::fmt; use core::hash::{Hash, Hasher}; use core::ops::{Add, AddAssign, Div, Mul, Neg, Sub, SubAssign}; -#[cfg(feature = "std")] -use serde::{de, Deserialize, Deserializer}; +#[cfg(feature = "serde")] +use serde_derive::{Deserialize, Serialize}; use core::str::FromStr; @@ -57,6 +57,7 @@ pub const NANOSECONDS_PER_CENTURY: u64 = DAYS_PER_CENTURY_U64 * NANOSECONDS_PER_ #[derive(Clone, Copy, Debug, PartialOrd, Eq, Ord)] #[repr(C)] #[cfg_attr(feature = "python", pyclass)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct Duration { pub(crate) centuries: i16, pub(crate) nanoseconds: u64, @@ -758,18 +759,6 @@ impl Duration { } } -#[cfg(feature = "std")] -#[cfg(not(kani))] -impl<'de> Deserialize<'de> for Duration { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - let s = String::deserialize(deserializer)?; - FromStr::from_str(&s).map_err(de::Error::custom) - } -} - impl Mul for Duration { type Output = Duration; fn mul(self, q: i64) -> Self::Output { diff --git a/src/epoch.rs b/src/epoch.rs index 780a7bb6..0f9ddc8f 100644 --- a/src/epoch.rs +++ b/src/epoch.rs @@ -28,8 +28,8 @@ use pyo3::prelude::*; #[cfg(feature = "python")] use pyo3::pyclass::CompareOp; -#[cfg(feature = "std")] -use serde::{de, Deserialize, Deserializer}; +#[cfg(feature = "serde")] +use serde_derive::{Deserialize, Serialize}; use core::str::FromStr; #[cfg(feature = "std")] @@ -159,6 +159,7 @@ const CUMULATIVE_DAYS_FOR_MONTH: [u16; 12] = { #[derive(Copy, Clone, Eq)] #[repr(C)] #[cfg_attr(feature = "python", pyclass)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct Epoch { /// An Epoch is always stored as the duration of since J1900 in the TAI time scale. pub duration_since_j1900_tai: Duration, @@ -2477,18 +2478,6 @@ impl FromStr for Epoch { } } -#[cfg(feature = "std")] -#[cfg(not(kani))] -impl<'de> Deserialize<'de> for Epoch { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - let s = String::deserialize(deserializer)?; - FromStr::from_str(&s).map_err(de::Error::custom) - } -} - impl fmt::Debug for Epoch { /// Print this epoch in Gregorian in the time scale used at initialization fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { From 3f8c96c17b4e406ca8fdc1d73f8d581d3d8b3b26 Mon Sep 17 00:00:00 2001 From: "Guillaume W. Bres" Date: Tue, 15 Nov 2022 18:25:19 +0100 Subject: [PATCH 2/8] epoch: test serdes ops --- Cargo.toml | 1 + src/epoch.rs | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index ab3feb85..dc5d6386 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,6 +26,7 @@ num-traits = {version = "0.2.15", default-features = false, features = ["libm"]} lexical-core = {version = "0.8.5", default-features = false, features = ["parse-integers", "parse-floats"]} [dev-dependencies] +serde_json = "1" criterion = "0.4.0" [features] diff --git a/src/epoch.rs b/src/epoch.rs index 0f9ddc8f..d2c57b70 100644 --- a/src/epoch.rs +++ b/src/epoch.rs @@ -2751,3 +2751,13 @@ fn cumulative_days_for_month() { [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334] ) } + +#[test] +#[cfg(feature = "serde")] +fn test_serdes() { + let e = Epoch::from_gregorian_utc(2020, 01, 01, 0, 0, 0, 0); + let content = r#"{"duration_since_j1900_tai":{"centuries":1,"nanoseconds":631065637000000000},"time_scale":"UTC"}"#; + assert_eq!(content, serde_json::to_string(&e).unwrap()); + let parsed: Epoch = serde_json::from_str(content).unwrap(); + assert_eq!(e, parsed); +} From 87df2db8c9441ee01c23807c8622fd41c7138214 Mon Sep 17 00:00:00 2001 From: "Guillaume W. Bres" Date: Tue, 15 Nov 2022 18:26:17 +0100 Subject: [PATCH 3/8] github workflow: add test with all features Signed-off-by: Guillaume W. Bres --- .github/workflows/tests.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 64a216d5..8962e0fd 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -61,6 +61,9 @@ jobs: - name: Test (no default features) run: cargo test --no-default-features + + - name: Test (all features) + run: cargo test --all-features test_no_std: strategy: From 3721627838d0a598460fade1b4bb3031c7780786 Mon Sep 17 00:00:00 2001 From: "Guillaume W. Bres" Date: Tue, 15 Nov 2022 18:31:22 +0100 Subject: [PATCH 4/8] duration: add serdes test Signed-off-by: Guillaume W. Bres --- src/duration.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/duration.rs b/src/duration.rs index 36d39568..7e552eac 100644 --- a/src/duration.rs +++ b/src/duration.rs @@ -1190,16 +1190,6 @@ impl From for Duration { } } -#[cfg(feature = "std")] -#[test] -fn deser_test() { - use serde_derive::Deserialize; - #[derive(Deserialize)] - struct _D { - pub _d: Duration, - } -} - #[cfg(kani)] #[kani::proof] fn formal_normalize_any() { @@ -1207,3 +1197,13 @@ fn formal_normalize_any() { let nanoseconds: u64 = kani::any(); let _dur = Duration::from_parts(centuries, nanoseconds); } + +#[test] +#[cfg(feature = "serde")] +fn test_serdes() { + let dt = Duration::from_seconds(10.1); + let content = r#"{"centuries":0,"nanoseconds":10100000000}"#; + assert_eq!(content, serde_json::to_string(&dt).unwrap()); + let parsed: Duration = serde_json::from_str(content).unwrap(); + assert_eq!(dt, parsed); +} From cdc0dbaf6eac5a4d844fa5e47d5b2310ef61d0d9 Mon Sep 17 00:00:00 2001 From: "Guillaume W. Bres" Date: Tue, 15 Nov 2022 18:31:33 +0100 Subject: [PATCH 5/8] timescale: add serdes test Signed-off-by: Guillaume W. Bres --- src/timescale.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/timescale.rs b/src/timescale.rs index f38ff233..46682da4 100644 --- a/src/timescale.rs +++ b/src/timescale.rs @@ -186,3 +186,13 @@ impl FromStr for TimeScale { } } } + +#[test] +#[cfg(feature = "serde")] +fn test_serdes() { + let ts = TimeScale::UTC; + let content = "\"UTC\""; + assert_eq!(content, serde_json::to_string(&ts).unwrap()); + let parsed: TimeScale = serde_json::from_str(content).unwrap(); + assert_eq!(ts, parsed); +} From ef829bfc339933f9c4a1dfd0d82f104bdfc283aa Mon Sep 17 00:00:00 2001 From: "Guillaume W. Bres" Date: Tue, 15 Nov 2022 18:31:46 +0100 Subject: [PATCH 6/8] epoch: remove deprecated serde test Signed-off-by: Guillaume W. Bres --- src/epoch.rs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/epoch.rs b/src/epoch.rs index d2c57b70..5d69515f 100644 --- a/src/epoch.rs +++ b/src/epoch.rs @@ -2732,18 +2732,6 @@ fn leap_year() { } } -#[cfg(feature = "std")] -#[test] -fn deser_test() { - use serde_derive::Deserialize; - #[derive(Deserialize)] - struct _D { - pub _e: Epoch, - } - - println!("{}", (1 * Unit::Century + 12 * Unit::Hour).to_seconds()); -} - #[test] fn cumulative_days_for_month() { assert_eq!( From cebaf5e3b1fb7ce3f996c8a91d7cc51334bd6206 Mon Sep 17 00:00:00 2001 From: "Guillaume W. Bres" Date: Tue, 15 Nov 2022 20:42:20 +0100 Subject: [PATCH 7/8] github workflow: test serde features Signed-off-by: Guillaume W. Bres --- .github/workflows/tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 8962e0fd..f6c3bd33 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -62,8 +62,8 @@ jobs: - name: Test (no default features) run: cargo test --no-default-features - - name: Test (all features) - run: cargo test --all-features + - name: Test (serde) + run: cargo test --features serde test_no_std: strategy: From 82593bed943c07f7715785f570e6974e807e5b8a Mon Sep 17 00:00:00 2001 From: Christopher Rabotin Date: Wed, 16 Nov 2022 00:28:48 -0700 Subject: [PATCH 8/8] Cargo fmt Signed-off-by: Christopher Rabotin --- src/duration.rs | 2 +- src/epoch.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/duration.rs b/src/duration.rs index 7e552eac..4ed4e787 100644 --- a/src/duration.rs +++ b/src/duration.rs @@ -1204,6 +1204,6 @@ fn test_serdes() { let dt = Duration::from_seconds(10.1); let content = r#"{"centuries":0,"nanoseconds":10100000000}"#; assert_eq!(content, serde_json::to_string(&dt).unwrap()); - let parsed: Duration = serde_json::from_str(content).unwrap(); + let parsed: Duration = serde_json::from_str(content).unwrap(); assert_eq!(dt, parsed); } diff --git a/src/epoch.rs b/src/epoch.rs index 5d69515f..dce8fdb3 100644 --- a/src/epoch.rs +++ b/src/epoch.rs @@ -2746,6 +2746,6 @@ fn test_serdes() { let e = Epoch::from_gregorian_utc(2020, 01, 01, 0, 0, 0, 0); let content = r#"{"duration_since_j1900_tai":{"centuries":1,"nanoseconds":631065637000000000},"time_scale":"UTC"}"#; assert_eq!(content, serde_json::to_string(&e).unwrap()); - let parsed: Epoch = serde_json::from_str(content).unwrap(); + let parsed: Epoch = serde_json::from_str(content).unwrap(); assert_eq!(e, parsed); }