first
This commit is contained in:
48
app/add.py
Normal file
48
app/add.py
Normal file
@@ -0,0 +1,48 @@
|
||||
from datetime import datetime, date, time
|
||||
from dateutil import parser
|
||||
from typing import List, Union, Tuple
|
||||
|
||||
from types_ import Minutes
|
||||
|
||||
|
||||
def subtract_times(first: time, second: time) -> Minutes:
|
||||
return int(
|
||||
(
|
||||
datetime.combine(datetime(1, 1, 1, 0, 0, 0), second)
|
||||
- datetime.combine(date.today(), first)
|
||||
).seconds
|
||||
/ 60
|
||||
)
|
||||
|
||||
|
||||
def add_up_timesheet(timesheet_string: str) -> Minutes:
|
||||
total_minutes = 0
|
||||
|
||||
for line in timesheet_string.split("\n"):
|
||||
time_range_strings = find_time_ranges(line)
|
||||
if time_range_strings:
|
||||
for time_range_string in time_range_strings:
|
||||
start_string, end_string = split_time_range_string(time_range_string)
|
||||
start, end = map(parse_time, [start_string, end_string])
|
||||
total_minutes += subtract_times(start, end)
|
||||
return total_minutes
|
||||
|
||||
|
||||
def find_time_ranges(timesheet_line: str) -> Union[list, List[str]]:
|
||||
remove_hashes_and_leading_trailing_spaces = timesheet_line.replace("#", "").strip()
|
||||
try:
|
||||
parse_time(remove_hashes_and_leading_trailing_spaces)
|
||||
except ValueError:
|
||||
return []
|
||||
else:
|
||||
if ":" not in remove_hashes_and_leading_trailing_spaces:
|
||||
return []
|
||||
return remove_hashes_and_leading_trailing_spaces.split(", ")
|
||||
|
||||
|
||||
def parse_time(time_string: str) -> time:
|
||||
return parser.parse(time_string).time()
|
||||
|
||||
|
||||
def split_time_range_string(time_range_string) -> Tuple[str]:
|
||||
return time_range_string.split("-")
|
||||
Reference in New Issue
Block a user