From e87589705d16015a375d40d8633749dc406ab4a2 Mon Sep 17 00:00:00 2001 From: Savanni D'Gerinel Date: Thu, 5 Oct 2023 11:19:55 -0400 Subject: [PATCH] Resolve linter warnings in emseries --- emseries/src/criteria.rs | 1 - emseries/src/date_time_tz.rs | 65 ++++++++++++++++++++++++------------ emseries/src/series.rs | 10 +++--- emseries/src/types.rs | 59 ++++++++++++++++++++------------ emseries/tests/test_io.rs | 39 +++++++++++----------- 5 files changed, 104 insertions(+), 70 deletions(-) diff --git a/emseries/src/criteria.rs b/emseries/src/criteria.rs index fab7945..9f304e6 100644 --- a/emseries/src/criteria.rs +++ b/emseries/src/criteria.rs @@ -10,7 +10,6 @@ Luminescent Dreams Tools is distributed in the hope that it will be useful, but You should have received a copy of the GNU General Public License along with Lumeto. If not, see . */ -use date_time_tz::DateTimeTz; use types::{Recordable, Timestamp}; /// This trait is used for constructing queries for searching the database. diff --git a/emseries/src/date_time_tz.rs b/emseries/src/date_time_tz.rs index 2ef3607..1022767 100644 --- a/emseries/src/date_time_tz.rs +++ b/emseries/src/date_time_tz.rs @@ -33,19 +33,13 @@ use std::{fmt, str::FromStr}; #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] pub struct DateTimeTz(pub chrono::DateTime); -impl DateTimeTz { - pub fn map(&self, f: F) -> DateTimeTz - where - F: FnOnce(chrono::DateTime) -> chrono::DateTime, - { - DateTimeTz(f(self.0)) - } - - pub fn to_string(&self) -> String { +impl fmt::Display for DateTimeTz { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> { if self.0.timezone() == UTC { - self.0.to_rfc3339_opts(SecondsFormat::Secs, true) + write!(f, "{}", self.0.to_rfc3339_opts(SecondsFormat::Secs, true)) } else { - format!( + write!( + f, "{} {}", self.0 .with_timezone(&chrono_tz::Etc::UTC) @@ -56,11 +50,20 @@ impl DateTimeTz { } } +impl DateTimeTz { + pub fn map(&self, f: F) -> DateTimeTz + where + F: FnOnce(chrono::DateTime) -> chrono::DateTime, + { + DateTimeTz(f(self.0)) + } +} + impl std::str::FromStr for DateTimeTz { type Err = chrono::ParseError; fn from_str(s: &str) -> Result { - let v: Vec<&str> = s.split_terminator(" ").collect(); + let v: Vec<&str> = s.split_terminator(' ').collect(); if v.len() == 2 { let tz = v[1].parse::().unwrap(); chrono::DateTime::parse_from_rfc3339(v[0]).map(|ts| DateTimeTz(ts.with_timezone(&tz))) @@ -86,9 +89,9 @@ impl<'de> Visitor<'de> for DateTimeTzVisitor { } fn visit_str(self, s: &str) -> Result { - DateTimeTz::from_str(s).or(Err(E::custom(format!( - "string is not a parsable datetime representation" - )))) + DateTimeTz::from_str(s).or(Err(E::custom( + "string is not a parsable datetime representation".to_owned(), + ))) } } @@ -117,28 +120,43 @@ mod test { #[test] fn it_creates_timestamp_with_z() { - let t = DateTimeTz(UTC.ymd(2019, 5, 15).and_hms(12, 0, 0)); + let t = DateTimeTz(UTC.with_ymd_and_hms(2019, 5, 15, 12, 0, 0).unwrap()); assert_eq!(t.to_string(), "2019-05-15T12:00:00Z"); } #[test] fn it_parses_utc_rfc3339_z() { let t = DateTimeTz::from_str("2019-05-15T12:00:00Z").unwrap(); - assert_eq!(t, DateTimeTz(UTC.ymd(2019, 5, 15).and_hms(12, 0, 0))); + assert_eq!( + t, + DateTimeTz(UTC.with_ymd_and_hms(2019, 5, 15, 12, 0, 0).unwrap()) + ); } #[test] fn it_parses_rfc3339_with_offset() { let t = DateTimeTz::from_str("2019-05-15T12:00:00-06:00").unwrap(); - assert_eq!(t, DateTimeTz(UTC.ymd(2019, 5, 15).and_hms(18, 0, 0))); + assert_eq!( + t, + DateTimeTz(UTC.with_ymd_and_hms(2019, 5, 15, 18, 0, 0).unwrap()) + ); } #[test] fn it_parses_rfc3339_with_tz() { let t = DateTimeTz::from_str("2019-06-15T19:00:00Z US/Arizona").unwrap(); - assert_eq!(t, DateTimeTz(UTC.ymd(2019, 6, 15).and_hms(19, 0, 0))); - assert_eq!(t, DateTimeTz(Arizona.ymd(2019, 6, 15).and_hms(12, 0, 0))); - assert_eq!(t, DateTimeTz(Central.ymd(2019, 6, 15).and_hms(14, 0, 0))); + assert_eq!( + t, + DateTimeTz(UTC.with_ymd_and_hms(2019, 6, 15, 19, 0, 0).unwrap()) + ); + assert_eq!( + t, + DateTimeTz(Arizona.with_ymd_and_hms(2019, 6, 15, 12, 0, 0).unwrap()) + ); + assert_eq!( + t, + DateTimeTz(Central.with_ymd_and_hms(2019, 6, 15, 14, 0, 0).unwrap()) + ); assert_eq!(t.to_string(), "2019-06-15T19:00:00Z US/Arizona"); } @@ -172,6 +190,9 @@ mod test { fn it_json_parses() { let t = serde_json::from_str::("\"2019-06-15T19:00:00Z America/Phoenix\"").unwrap(); - assert_eq!(t, DateTimeTz(Phoenix.ymd(2019, 6, 15).and_hms(12, 0, 0))); + assert_eq!( + t, + DateTimeTz(Phoenix.with_ymd_and_hms(2019, 6, 15, 12, 0, 0).unwrap()) + ); } } diff --git a/emseries/src/series.rs b/emseries/src/series.rs index 8fad160..71e089f 100644 --- a/emseries/src/series.rs +++ b/emseries/src/series.rs @@ -47,7 +47,7 @@ where .read(true) .append(true) .create(true) - .open(&path) + .open(path) .map_err(EmseriesReadError::IOError)?; let records = Series::load_file(&f)?; @@ -88,8 +88,8 @@ where /// Put a new record into the database. A unique id will be assigned to the record and /// returned. pub fn put(&mut self, entry: T) -> Result { - let uuid = UniqueId::new(); - self.update(uuid.clone(), entry).and_then(|_| Ok(uuid)) + let uuid = UniqueId::default(); + self.update(uuid.clone(), entry).map(|_| uuid) } /// Update an existing record. The `UniqueId` of the record passed into this function must match @@ -138,7 +138,7 @@ where } /// Get all of the records in the database. - pub fn records<'s>(&'s self) -> impl Iterator + 's { + pub fn records(&self) -> impl Iterator { self.records.iter() } @@ -166,7 +166,7 @@ where /// Get an exact record from the database based on unique id. pub fn get(&self, uuid: &UniqueId) -> Option { - self.records.get(uuid).map(|v| v.clone()) + self.records.get(uuid).cloned() } /* diff --git a/emseries/src/types.rs b/emseries/src/types.rs index a2a1606..2b72c73 100644 --- a/emseries/src/types.rs +++ b/emseries/src/types.rs @@ -55,8 +55,8 @@ impl str::FromStr for Timestamp { type Err = chrono::ParseError; fn from_str(line: &str) -> Result { DateTimeTz::from_str(line) - .map(|dtz| Timestamp::DateTime(dtz)) - .or(NaiveDate::from_str(line).map(|d| Timestamp::Date(d))) + .map(Timestamp::DateTime) + .or(NaiveDate::from_str(line).map(Timestamp::Date)) } } @@ -70,8 +70,8 @@ impl Ord for Timestamp { fn cmp(&self, other: &Timestamp) -> Ordering { match (self, other) { (Timestamp::DateTime(dt1), Timestamp::DateTime(dt2)) => dt1.cmp(dt2), - (Timestamp::DateTime(dt1), Timestamp::Date(dt2)) => dt1.0.date().naive_utc().cmp(&dt2), - (Timestamp::Date(dt1), Timestamp::DateTime(dt2)) => dt1.cmp(&dt2.0.date().naive_utc()), + (Timestamp::DateTime(dt1), Timestamp::Date(dt2)) => dt1.0.date_naive().cmp(dt2), + (Timestamp::Date(dt1), Timestamp::DateTime(dt2)) => dt1.cmp(&dt2.0.date_naive()), (Timestamp::Date(dt1), Timestamp::Date(dt2)) => dt1.cmp(dt2), } } @@ -105,11 +105,9 @@ pub trait Recordable { #[derive(Clone, Debug, Eq, Hash, PartialEq, Deserialize, Serialize)] pub struct UniqueId(Uuid); -impl UniqueId { - /// Create a new V4 UUID (this is the most common type in use these days). - pub fn new() -> UniqueId { - let id = Uuid::new_v4(); - UniqueId(id) +impl Default for UniqueId { + fn default() -> Self { + Self(Uuid::new_v4()) } } @@ -120,14 +118,14 @@ impl str::FromStr for UniqueId { fn from_str(val: &str) -> Result { Uuid::parse_str(val) .map(UniqueId) - .map_err(|err| EmseriesReadError::UUIDParseError(err)) + .map_err(EmseriesReadError::UUIDParseError) } } impl fmt::Display for UniqueId { /// Convert to a hyphenated string fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { - write!(f, "{}", self.0.to_hyphenated().to_string()) + write!(f, "{}", self.0.to_hyphenated()) } } @@ -146,7 +144,7 @@ where type Err = EmseriesReadError; fn from_str(line: &str) -> Result { - serde_json::from_str(&line).map_err(|err| EmseriesReadError::JSONParseError(err)) + serde_json::from_str(line).map_err(EmseriesReadError::JSONParseError) } } @@ -184,7 +182,9 @@ mod test { fn timestamp_parses_datetimetz_without_timezone() { assert_eq!( "2003-11-10T06:00:00Z".parse::().unwrap(), - Timestamp::DateTime(DateTimeTz(UTC.ymd(2003, 11, 10).and_hms(6, 0, 0))), + Timestamp::DateTime(DateTimeTz( + UTC.with_ymd_and_hms(2003, 11, 10, 6, 0, 0).unwrap() + )), ); } @@ -210,7 +210,9 @@ mod test { assert_eq!( rec.data, Some(WeightRecord { - date: Timestamp::DateTime(DateTimeTz(UTC.ymd(2003, 11, 10).and_hms(6, 0, 0))), + date: Timestamp::DateTime(DateTimeTz( + UTC.with_ymd_and_hms(2003, 11, 10, 6, 0, 0).unwrap() + )), weight: Weight(77.79109 * KG), }) ); @@ -219,7 +221,9 @@ mod test { #[test] fn serialization_output() { let rec = WeightRecord { - date: Timestamp::DateTime(DateTimeTz(UTC.ymd(2003, 11, 10).and_hms(6, 0, 0))), + date: Timestamp::DateTime(DateTimeTz( + UTC.with_ymd_and_hms(2003, 11, 10, 6, 0, 0).unwrap(), + )), weight: Weight(77.0 * KG), }; assert_eq!( @@ -228,7 +232,12 @@ mod test { ); let rec2 = WeightRecord { - date: Timestamp::DateTime(Central.ymd(2003, 11, 10).and_hms(0, 0, 0).into()), + date: Timestamp::DateTime( + Central + .with_ymd_and_hms(2003, 11, 10, 0, 0, 0) + .unwrap() + .into(), + ), weight: Weight(77.0 * KG), }; assert_eq!( @@ -239,22 +248,28 @@ mod test { #[test] fn two_datetimes_can_be_compared() { - let time1 = Timestamp::DateTime(DateTimeTz(UTC.ymd(2003, 11, 10).and_hms(6, 0, 0))); - let time2 = Timestamp::DateTime(DateTimeTz(UTC.ymd(2003, 11, 11).and_hms(6, 0, 0))); + let time1 = Timestamp::DateTime(DateTimeTz( + UTC.with_ymd_and_hms(2003, 11, 10, 6, 0, 0).unwrap(), + )); + let time2 = Timestamp::DateTime(DateTimeTz( + UTC.with_ymd_and_hms(2003, 11, 11, 6, 0, 0).unwrap(), + )); assert!(time1 < time2); } #[test] fn two_dates_can_be_compared() { - let time1 = Timestamp::Date(NaiveDate::from_ymd(2003, 11, 10)); - let time2 = Timestamp::Date(NaiveDate::from_ymd(2003, 11, 11)); + let time1 = Timestamp::Date(NaiveDate::from_ymd_opt(2003, 11, 10).unwrap()); + let time2 = Timestamp::Date(NaiveDate::from_ymd_opt(2003, 11, 11).unwrap()); assert!(time1 < time2); } #[test] fn datetime_and_date_can_be_compared() { - let time1 = Timestamp::DateTime(DateTimeTz(UTC.ymd(2003, 11, 10).and_hms(6, 0, 0))); - let time2 = Timestamp::Date(NaiveDate::from_ymd(2003, 11, 11)); + let time1 = Timestamp::DateTime(DateTimeTz( + UTC.with_ymd_and_hms(2003, 11, 10, 6, 0, 0).unwrap(), + )); + let time2 = Timestamp::Date(NaiveDate::from_ymd_opt(2003, 11, 11).unwrap()); assert!(time1 < time2) } } diff --git a/emseries/tests/test_io.rs b/emseries/tests/test_io.rs index 92b1a8b..c599369 100644 --- a/emseries/tests/test_io.rs +++ b/emseries/tests/test_io.rs @@ -22,7 +22,7 @@ extern crate emseries; mod test { use chrono::prelude::*; use chrono_tz::Etc::UTC; - use dimensioned::si::{Kilogram, Meter, Second, KG, M, S}; + use dimensioned::si::{Kilogram, Meter, Second, M, S}; use emseries::*; @@ -52,31 +52,31 @@ mod test { fn mk_trips() -> [BikeTrip; 5] { [ BikeTrip { - datetime: DateTimeTz(UTC.ymd(2011, 10, 29).and_hms(0, 0, 0)), + datetime: DateTimeTz(UTC.with_ymd_and_hms(2011, 10, 29, 0, 0, 0).unwrap()), distance: Distance(58741.055 * M), duration: Duration(11040.0 * S), comments: String::from("long time ago"), }, BikeTrip { - datetime: DateTimeTz(UTC.ymd(2011, 10, 31).and_hms(0, 0, 0)), + datetime: DateTimeTz(UTC.with_ymd_and_hms(2011, 10, 31, 0, 0, 0).unwrap()), distance: Distance(17702.0 * M), duration: Duration(2880.0 * S), comments: String::from("day 2"), }, BikeTrip { - datetime: DateTimeTz(UTC.ymd(2011, 11, 02).and_hms(0, 0, 0)), + datetime: DateTimeTz(UTC.with_ymd_and_hms(2011, 11, 02, 0, 0, 0).unwrap()), distance: Distance(41842.945 * M), duration: Duration(7020.0 * S), comments: String::from("Do Some Distance!"), }, BikeTrip { - datetime: DateTimeTz(UTC.ymd(2011, 11, 04).and_hms(0, 0, 0)), + datetime: DateTimeTz(UTC.with_ymd_and_hms(2011, 11, 04, 0, 0, 0).unwrap()), distance: Distance(34600.895 * M), duration: Duration(5580.0 * S), comments: String::from("I did a lot of distance back then"), }, BikeTrip { - datetime: DateTimeTz(UTC.ymd(2011, 11, 05).and_hms(0, 0, 0)), + datetime: DateTimeTz(UTC.with_ymd_and_hms(2011, 11, 05, 0, 0, 0).unwrap()), distance: Distance(6437.376 * M), duration: Duration(960.0 * S), comments: String::from("day 5"), @@ -122,7 +122,7 @@ mod test { Some(tr) => { assert_eq!( tr.timestamp(), - DateTimeTz(UTC.ymd(2011, 10, 29).and_hms(0, 0, 0)).into() + DateTimeTz(UTC.with_ymd_and_hms(2011, 10, 29, 0, 0, 0).unwrap()).into() ); assert_eq!(tr.duration, Duration(11040.0 * S)); assert_eq!(tr.comments, String::from("long time ago")); @@ -145,7 +145,7 @@ mod test { let v: Vec<(&UniqueId, &BikeTrip)> = ts .search(exact_time( - DateTimeTz(UTC.ymd(2011, 10, 31).and_hms(0, 0, 0)).into(), + DateTimeTz(UTC.with_ymd_and_hms(2011, 10, 31, 0, 0, 0).unwrap()).into(), )) .collect(); assert_eq!(v.len(), 1); @@ -166,9 +166,9 @@ mod test { let v: Vec<(&UniqueId, &BikeTrip)> = ts.search_sorted( time_range( - DateTimeTz(UTC.ymd(2011, 10, 31).and_hms(0, 0, 0)).into(), + DateTimeTz(UTC.with_ymd_and_hms(2011, 10, 31, 0, 0, 0).unwrap()).into(), true, - DateTimeTz(UTC.ymd(2011, 11, 04).and_hms(0, 0, 0)).into(), + DateTimeTz(UTC.with_ymd_and_hms(2011, 11, 04, 0, 0, 0).unwrap()).into(), true, ), |l, r| l.1.timestamp().cmp(&r.1.timestamp()), @@ -199,9 +199,9 @@ mod test { .expect("expect the time series to open correctly"); let v: Vec<(&UniqueId, &BikeTrip)> = ts.search_sorted( time_range( - DateTimeTz(UTC.ymd(2011, 10, 31).and_hms(0, 0, 0)).into(), + DateTimeTz(UTC.with_ymd_and_hms(2011, 10, 31, 0, 0, 0).unwrap()).into(), true, - DateTimeTz(UTC.ymd(2011, 11, 04).and_hms(0, 0, 0)).into(), + DateTimeTz(UTC.with_ymd_and_hms(2011, 11, 04, 0, 0, 0).unwrap()).into(), true, ), |l, r| l.1.timestamp().cmp(&r.1.timestamp()), @@ -233,9 +233,9 @@ mod test { .expect("expect the time series to open correctly"); let v: Vec<(&UniqueId, &BikeTrip)> = ts.search_sorted( time_range( - DateTimeTz(UTC.ymd(2011, 10, 31).and_hms(0, 0, 0)).into(), + DateTimeTz(UTC.with_ymd_and_hms(2011, 10, 31, 0, 0, 0).unwrap()).into(), true, - DateTimeTz(UTC.ymd(2011, 11, 04).and_hms(0, 0, 0)).into(), + DateTimeTz(UTC.with_ymd_and_hms(2011, 11, 04, 0, 0, 0).unwrap()).into(), true, ), |l, r| l.1.timestamp().cmp(&r.1.timestamp()), @@ -252,9 +252,9 @@ mod test { .expect("expect the time series to open correctly"); let v: Vec<(&UniqueId, &BikeTrip)> = ts.search_sorted( time_range( - DateTimeTz(UTC.ymd(2011, 10, 31).and_hms(0, 0, 0)).into(), + DateTimeTz(UTC.with_ymd_and_hms(2011, 10, 31, 0, 0, 0).unwrap()).into(), true, - DateTimeTz(UTC.ymd(2011, 11, 05).and_hms(0, 0, 0)).into(), + DateTimeTz(UTC.with_ymd_and_hms(2011, 11, 05, 0, 0, 0).unwrap()).into(), true, ), |l, r| l.1.timestamp().cmp(&r.1.timestamp()), @@ -294,7 +294,7 @@ mod test { Some(trip) => { assert_eq!( trip.datetime, - DateTimeTz(UTC.ymd(2011, 11, 02).and_hms(0, 0, 0)) + DateTimeTz(UTC.with_ymd_and_hms(2011, 11, 02, 0, 0, 0).unwrap()) ); assert_eq!(trip.distance, Distance(50000.0 * M)); assert_eq!(trip.duration, Duration(7020.0 * S)); @@ -335,13 +335,13 @@ mod test { let trips: Vec<(&UniqueId, &BikeTrip)> = ts .search(exact_time( - DateTimeTz(UTC.ymd(2011, 11, 02).and_hms(0, 0, 0)).into(), + DateTimeTz(UTC.with_ymd_and_hms(2011, 11, 02, 0, 0, 0).unwrap()).into(), )) .collect(); assert_eq!(trips.len(), 1); assert_eq!( trips[0].1.datetime, - DateTimeTz(UTC.ymd(2011, 11, 02).and_hms(0, 0, 0)) + DateTimeTz(UTC.with_ymd_and_hms(2011, 11, 02, 0, 0, 0).unwrap()) ); assert_eq!(trips[0].1.distance, Distance(50000.0 * M)); assert_eq!(trips[0].1.duration, Duration(7020.0 * S)); @@ -361,7 +361,6 @@ mod test { let trip_id = ts.put(trips[0].clone()).expect("expect a successful put"); ts.put(trips[1].clone()).expect("expect a successful put"); ts.put(trips[2].clone()).expect("expect a successful put"); - ts.delete(&trip_id).expect("successful delete"); let recs: Vec<(&UniqueId, &BikeTrip)> = ts.records().collect();