-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstat.py
More file actions
executable file
·66 lines (53 loc) · 2.15 KB
/
Copy pathstat.py
File metadata and controls
executable file
·66 lines (53 loc) · 2.15 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
#!/usr/bin/python3
from datetime import date, datetime, timedelta
import store
import worklog
def pretty_duration(minutes):
hours, minutes = divmod(int(minutes), 60)
return f"{hours}:{minutes:02}"
def load_journal():
return worklog.parse("\n".join(store.read_all()))
def period_start(period):
today = date.today()
if period == "day":
return today
if period == "week":
return today - timedelta(days=today.weekday())
if period == "month":
return today.replace(day=1)
if period == "year":
return today.replace(month=1, day=1)
return datetime.strptime(period, "%Y-%m-%d").date()
def main(start=None, project=None):
journal = load_journal()
segments = [s for s in journal.segments if start is None or s.start.date() >= start]
if project:
segments = [s for s in segments if worklog.project(s.task) == project]
by_task = {}
for s in segments:
by_task.setdefault(s.task, []).append(s)
total = 0
for task in sorted(by_task, key=lambda t: (worklog.project(t), min(s.start for s in by_task[t]))):
task_segments = by_task[task]
task_total = journal.total_minutes(task_segments)
print(task, pretty_duration(task_total))
by_day = {}
for s in task_segments:
by_day.setdefault(s.start.date(), []).append(s)
for day in sorted(by_day):
day_segments = by_day[day]
print("\t", day, pretty_duration(journal.total_minutes(day_segments)))
for s in sorted(day_segments, key=lambda s: s.start):
duration = (s.end - s.start).total_seconds() // 60
print("\t\t", s.start.strftime("%H:%M"), "+", pretty_duration(duration), s.comment)
total += task_total
print("Total time shown:", pretty_duration(total))
if __name__ == "__main__":
from sys import argv
if len(argv) == 1:
main()
elif argv[1] in ("-h", "--help"):
print("USAGE: stat.py [period [project]]")
print(" period may be: 'day', 'week', 'month', 'year' or a starting date like '2018-01-01'")
else:
main(period_start(argv[1]), argv[2] if len(argv) > 2 else None)