From c1b95997d95298d78a4f00a8c5448a6d67aa24ba Mon Sep 17 00:00:00 2001 From: Jon Michael Aanes Date: Sat, 8 Jun 2024 15:09:57 +0200 Subject: [PATCH] Year labels --- git_time_tracker/__init__.py | 28 +++++++++++++++++++++++++++- test/test_util.py | 13 +++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 test/test_util.py diff --git a/git_time_tracker/__init__.py b/git_time_tracker/__init__.py index ca9c0cb..d95fd7f 100644 --- a/git_time_tracker/__init__.py +++ b/git_time_tracker/__init__.py @@ -73,10 +73,29 @@ HOUR = datetime.timedelta(hours=1) MINUTE = datetime.timedelta(minutes=1) +def fmt_year_ranges_internal(years: list[int]) -> Iterator[str]: + years = sorted(years) + for idx, year in enumerate(years): + at_end = idx == len(years) - 1 + range_before = idx > 0 and years[idx-1] == year - 1 + range_after = not at_end and years[idx+1] == year + 1 + + if not range_before or not range_after: + yield str(year) + + if not at_end: + if not range_before and range_after: + yield '-' + elif not range_after: + yield ',' + +def fmt_year_ranges(years: list[int]) -> str: + return ''.join(list(fmt_year_ranges_internal(years))) + def fmt_line(label_type: str, label: str, total_time: datetime.timedelta) -> str: hours = int(total_time / HOUR) minutes = int((total_time - hours*HOUR)/MINUTE) - return f' {label_type:8} {label:40} {hours:-4d}h {minutes:-2d}m\n' + return f' {label_type:8} {label:40} {hours:-4d}h {minutes:-2d}m' def generate_report(samples: list[WorkSample]) -> Iterator[str]: SAMPLE_FILTER = {} @@ -84,6 +103,7 @@ def generate_report(samples: list[WorkSample]) -> Iterator[str]: # Time spent per label time_per_label: dict[str, datetime.timedelta] = {} + years_per_label: dict[str, set[int]] = {} prev_time = datetime.datetime.fromtimestamp(0, datetime.UTC) for sample in samples: est_time: datetime.timedelta = DEFAULT_EST_TIME @@ -97,6 +117,7 @@ def generate_report(samples: list[WorkSample]) -> Iterator[str]: for label in sample.labels: time_per_label.setdefault(label, ZERO_DURATION) time_per_label[label] += est_time + years_per_label.setdefault(label,set()).add(sample.registered_at.year) prev_time = sample.registered_at del sample, est_time @@ -119,12 +140,17 @@ def generate_report(samples: list[WorkSample]) -> Iterator[str]: label_type = '' # TODO yield fmt_line(label_type, label, total_time) + yield ' (' + yield fmt_year_ranges(years_per_label.get(label_and_type,[])) + yield ')' + yield '\n' del label, total_time yield '-' * 66 yield '\n' yield fmt_line('', 'TOTAL', time_per_label.get(HIDDEN_LABEL_TOTAL, ZERO_DURATION)) + yield '\n' def main(): logging.basicConfig() diff --git a/test/test_util.py b/test/test_util.py new file mode 100644 index 0000000..c2086a7 --- /dev/null +++ b/test/test_util.py @@ -0,0 +1,13 @@ +import git_time_tracker + +def test_year_ranges_1(): + assert git_time_tracker.fmt_year_ranges([1,2,3]) == '1-3' + +def test_year_ranges_2(): + assert git_time_tracker.fmt_year_ranges([1,3]) == '1,3' + +def test_year_ranges_3(): + assert git_time_tracker.fmt_year_ranges([1,2,4]) == '1-2,4' + +def test_year_ranges_4(): + assert git_time_tracker.fmt_year_ranges([1,2,4,5]) == '1-2,4-5'