From 83498ac6540ffecbbca5744ac6c4e821fe39d47e Mon Sep 17 00:00:00 2001 From: Abraham Toriz Date: Fri, 25 Nov 2022 09:03:40 -0600 Subject: [PATCH] display sheet name(s) in chart formatter --- CHANGELOG.md | 1 + src/formatters/chart.rs | 69 ++++++++++++++++++++++++++++++++++++++--- src/models.rs | 7 +++++ 3 files changed, 72 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd60d8e..ae8d46c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## next - `t now` displays a nicer message if no entries are running. +- `chart` formatter now shows the sheet name(s) that are being displayed. ## 1.5.3 diff --git a/src/formatters/chart.rs b/src/formatters/chart.rs index bdd020a..00d1b2b 100644 --- a/src/formatters/chart.rs +++ b/src/formatters/chart.rs @@ -1,6 +1,6 @@ use std::io::Write; use std::fmt::Write as _; -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use crate::tabulate::{Tabulate, Col, Align::*}; use chrono::{Local, Datelike, Date, Duration}; @@ -81,6 +81,7 @@ pub fn print_formatted(entries: Vec, out: &mut W, facts: &Facts let mut entries_by_date = HashMap::new(); let mut first_date = None; let mut last_date = None; + let mut timesheets = HashSet::new(); for entry in entries.into_iter() { let entrys_date = entry.start.with_timezone(&Local).date(); @@ -97,6 +98,8 @@ pub fn print_formatted(entries: Vec, out: &mut W, facts: &Facts last_date = last_date.map(|d| d.max(entrys_date)); } + timesheets.insert(entry.sheet); + let e = entries_by_date.entry(entrys_date).or_insert(0.0); *e += hours; @@ -173,6 +176,16 @@ pub fn print_formatted(entries: Vec, out: &mut W, facts: &Facts week_total(week_accumulated, weekly_goal_hours), ]); + if timesheets.len() == 1 { + out.write_all(format!("Timesheet: {}\n\n", timesheets.into_iter().next().unwrap()).as_bytes())?; + } else { + let mut timesheets: Vec<_> = timesheets.into_iter().collect(); + + timesheets.sort_unstable(); + + out.write_all(format!("Timesheets: {}\n\n", timesheets.join(", ")).as_bytes())?; + } + out.write_all(tabs.print(facts.env.stdout_is_tty).as_bytes())?; Ok(()) @@ -218,7 +231,10 @@ mod tests { print_formatted(entries, &mut out, &facts).unwrap(); - assert_str_eq!(String::from_utf8_lossy(&out), " Date Day Chart Hours + assert_str_eq!(String::from_utf8_lossy(&out), "\ +Timesheet: default + + Date Day Chart Hours Aug 15 Mon \u{1b}[42m \u{1b}[0m\u{1b}[48;5;10m \u{1b}[0m 5.0 16 Tue \u{1b}[42m \u{1b}[0m\u{1b}[47m \u{1b}[0m 3.5 @@ -246,7 +262,10 @@ Aug 15 Mon \u{1b}[42m \u{1b}[0m\u{1b}[48;5;10m \u{1b}[0m 5.0 print_formatted(entries, &mut out, &facts).unwrap(); - assert_str_eq!(String::from_utf8_lossy(&out), " Date Day Chart Hours + assert_str_eq!(String::from_utf8_lossy(&out), "\ +Timesheet: default + + Date Day Chart Hours Aug 28 Sun \u{1b}[48;5;10m \u{1b}[0m 5.0 @@ -285,7 +304,10 @@ Aug 29 Mon \u{1b}[48;5;10m \u{1b}[0m 3.0 print_formatted(entries, &mut out, &facts).unwrap(); - assert_str_eq!(String::from_utf8_lossy(&out), " Date Day Chart Hours + assert_str_eq!(String::from_utf8_lossy(&out), "\ +Timesheet: default + + Date Day Chart Hours Aug 15 Mon \u{1b}[48;5;10m \u{1b}[0m 5.0 16 Tue 0.0 @@ -315,7 +337,44 @@ Aug 15 Mon \u{1b}[48;5;10m \u{1b}[0m 5.0 print_formatted(entries, &mut out, &facts).unwrap(); - assert_str_eq!(String::from_utf8_lossy(&out), " Date Day Chart Hours + assert_str_eq!(String::from_utf8_lossy(&out), "\ +Timesheet: default + + Date Day Chart Hours + +Aug 15 Mon \u{1b}[48;5;10m \u{1b}[0m 5.0 + 16 Tue \u{1b}[48;5;10m \u{1b}[0m 3.5 + 17 Wed \u{1b}[48;5;10m \u{1b}[0m 4.0 + 18 Thu \u{1b}[48;5;10m \u{1b}[0m 2.0 + + Week 14.5 +"); + } + + #[test] + fn multiple_timesheets_to_display() { + std::env::set_var("TZ", "CST+6"); + + let day1 = Utc.ymd(2022, 8, 15).and_hms(12, 0, 0); + let day2 = Utc.ymd(2022, 8, 16).and_hms(12, 0, 0); + let day3 = Utc.ymd(2022, 8, 17).and_hms(12, 0, 0); + let day4 = Utc.ymd(2022, 8, 18).and_hms(12, 0, 0); + + let entries = vec![ + Entry::new_sample(1, day1, Some(day1 + Duration::hours(5))).with_sheet("var"), + Entry::new_sample(2, day2, Some(day2 + Duration::minutes(60 * 3 + 30))).with_sheet("var"), + Entry::new_sample(3, day3, Some(day3 + Duration::hours(4))).with_sheet("foo"), + Entry::new_sample(4, day4, Some(day4 + Duration::hours(2))).with_sheet("foo"), + ]; + let mut out = Vec::new(); + let facts = Facts::new(); + + print_formatted(entries, &mut out, &facts).unwrap(); + + assert_str_eq!(String::from_utf8_lossy(&out), "\ +Timesheets: foo, var + + Date Day Chart Hours Aug 15 Mon \u{1b}[48;5;10m \u{1b}[0m 5.0 16 Tue \u{1b}[48;5;10m \u{1b}[0m 3.5 diff --git a/src/models.rs b/src/models.rs index 2dcf28d..a0cfec2 100644 --- a/src/models.rs +++ b/src/models.rs @@ -28,6 +28,13 @@ impl Entry { } } + pub fn with_sheet(self, sheet: &str) -> Entry { + Entry { + sheet: sheet.into(), + ..self + } + } + pub fn timespan(&self) -> Option { self.end.map(|e| e - self.start) }