-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathanalyze_worklog.py
More file actions
67 lines (53 loc) · 2.26 KB
/
Copy pathanalyze_worklog.py
File metadata and controls
67 lines (53 loc) · 2.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
"""Report front-end for the worklog format.
Parses a single worklog file via worklog.parse (the one and only parser)
and prints a per-task / per-day / per-prefix time report.
Usage: python3 analyze_worklog.py <worklogfile>
"""
from collections import defaultdict
from sys import argv, exit
import worklog
WEEKDAYS = {0: "Mo", 1: "Tu", 2: "We", 3: "Th", 4: "Fr", 5: "Sa", 6: "Su"}
def format_time(minutes):
hours, mins = divmod(int(minutes), 60)
return f"{hours:2}:{mins:02}"
def task_sorting(pair):
task, segments = pair
return worklog.project(task), min(s.start for s in segments)
def summarize(journal):
by_task = journal.by_task()
for task, segments in sorted(by_task.items(), key=task_sorting):
total_minutes = journal.total_minutes(segments)
if len(segments) > 1:
print(f"{task:18}total {format_time(total_minutes)}")
else:
print(f"{task:11}")
by_day = defaultdict(list)
for s in segments:
by_day[s.start.date()].append(s)
for day, items in sorted(by_day.items()):
items.sort(key=lambda s: s.start)
for i, s in enumerate(items):
day_str = f"{WEEKDAYS[day.weekday()]} {day.day:02}.:" if i == 0 else " " * 7
duration = (s.end - s.start).total_seconds() // 60
print(f" {day_str} {s.start.strftime('%H:%M')} -{s.end.strftime('%H:%M')} (+{format_time(duration).strip()}) {s.comment[:150]}")
prefix_totals = defaultdict(int)
for task, segments in by_task.items():
prefix_totals[worklog.project(task)] += journal.total_minutes(segments)
print("\nSummary by task prefix:")
for prefix, total_minutes in sorted(prefix_totals.items()):
print(f" {prefix:2} {format_time(total_minutes)}")
def main(filename):
with open(filename) as f:
journal = worklog.parse(f.read())
summarize(journal)
if journal.problems:
for lineno, message in journal.problems:
print(f"line {lineno}: {message}")
print("\nThere were errors in the log file. Please fix them before using the data.")
exit(1)
if __name__ == "__main__":
args = argv[1:]
if args:
main(args[0])
else:
print("Usage: python analyze_worklog.py <worklogfile>")