display sheet name(s) in chart formatter

This commit is contained in:
Abraham Toriz 2022-11-25 09:03:40 -06:00
parent b75b412c23
commit 83498ac654
No known key found for this signature in database
GPG Key ID: D5B4A746DB5DD42A
3 changed files with 72 additions and 5 deletions

View File

@ -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

View File

@ -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<W: Write>(entries: Vec<Entry>, 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<W: Write>(entries: Vec<Entry>, 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<W: Write>(entries: Vec<Entry>, 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

View File

@ -28,6 +28,13 @@ impl Entry {
}
}
pub fn with_sheet(self, sheet: &str) -> Entry {
Entry {
sheet: sheet.into(),
..self
}
}
pub fn timespan(&self) -> Option<Duration> {
self.end.map(|e| e - self.start)
}