From 0e48ce265c70d0b8d6bb6a44eb8778a40f9b23ff Mon Sep 17 00:00:00 2001 From: Elias Kohout Date: Thu, 13 Nov 2025 19:04:55 +0100 Subject: [PATCH] add accumulation of captured time --- main.py | 6 +++++- model/TimeSlot.py | 5 +++++ model/TimeSlotContainer.py | 13 +++++++++++-- util/parser.py | 4 ++++ util/str_to_datetime.py | 2 +- 5 files changed, 26 insertions(+), 4 deletions(-) diff --git a/main.py b/main.py index b63927a..7eccf7d 100755 --- a/main.py +++ b/main.py @@ -1,6 +1,6 @@ #!/usr/bin/python3 -from util.str_to_datetime import datetime +from util.str_to_datetime import str_to_datetime as datetime from model.TimeSlotContainer import time_slot_container as tsc from model.TimeSlot import TimeSlot @@ -35,3 +35,7 @@ if __name__ == "__main__": elif args.command == "add": tsc.add_time_slot(args.name, datetime(args.start), datetime(args.end)) + + elif args.command == "acc": + d = tsc.accumulate_duration(args.query) + print(f"{d.seconds // 3600}:{d.seconds % 3600 // 60}") diff --git a/model/TimeSlot.py b/model/TimeSlot.py index d084f36..a1d4368 100644 --- a/model/TimeSlot.py +++ b/model/TimeSlot.py @@ -42,3 +42,8 @@ class TimeSlot(): def end_now(self): self.end = datetime.now() + + def duration(self) -> datetime.timedelta: + end = self.end + if not end: end = datetime.now() + return self.end - self.start diff --git a/model/TimeSlotContainer.py b/model/TimeSlotContainer.py index 3c1519d..84a99d1 100644 --- a/model/TimeSlotContainer.py +++ b/model/TimeSlotContainer.py @@ -1,4 +1,6 @@ -from datetime import date, datetime +import re + +from datetime import date, datetime, timedelta from model.DataStore import DataStore from model.TimeSlot import TimeSlot @@ -43,5 +45,12 @@ class TimeSlotContainer: def delete_time_slot(self, ts: TimeSlot): raise NotImplementedError + def accumulate_duration(self, query: str) -> timedelta: + pattern = re.compile(query) + return sum([ts.duration() for ts in self._ds.get_all_time_slots() + if pattern.search(ts.name) ], start=timedelta(0)) -time_slot_container = TimeSlotContainer(DataStore("data.json")) +try: + time_slot_container = TimeSlotContainer(DataStore("data.json")) +except FileNotFoundError: + time_slot_container = TimeSlotContainer(DataStore("data.json", create=True)) diff --git a/util/parser.py b/util/parser.py index 45a9a9b..b44bcc2 100644 --- a/util/parser.py +++ b/util/parser.py @@ -27,4 +27,8 @@ def create_parser(): parser_end = subparsers.add_parser("end", help="Ending the current event.") parser_end.add_argument("-e", "--end", help="End datetime") + # Create the parser for the "acc" command + parser_end = subparsers.add_parser("acc", help="Accumulate the duration of events.") + parser_end.add_argument("query", help="The regex matching for the name of the event.") + return parser diff --git a/util/str_to_datetime.py b/util/str_to_datetime.py index 99f277c..812ff6e 100644 --- a/util/str_to_datetime.py +++ b/util/str_to_datetime.py @@ -1,7 +1,7 @@ from datetime import datetime as dt -def datetime(s: str) -> dt: +def str_to_datetime(s: str) -> dt: s = s.strip() try: