-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path__init__.py
More file actions
82 lines (60 loc) · 1.94 KB
/
__init__.py
File metadata and controls
82 lines (60 loc) · 1.94 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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import datetime
from typing import List
class Timespan(object):
def __init__(self, start: datetime.datetime = None, end: datetime.datetime = None,
duration: datetime.timedelta = None):
super().__init__()
if not start:
self.start = datetime.datetime.now()
else:
self.start = start
if end:
self.end = end
elif duration:
self.end = start + duration
else:
self.end = self.start
def __eq__(self, o: object) -> bool:
"""Overrides the default implementation"""
if isinstance(o, Timespan):
return self.start == o.start and self.end == o.end
return False
def __str__(self) -> str:
return f"{self.start} - {self.end} ({self.duration()})"
def duration(self):
return self.end - self.start
class Timestack(List):
def __init__(self) -> None:
super().__init__()
self.stack = []
def __len__(self) -> int:
return len(self.stack)
def __str__(self) -> str:
return str(self.stack)
def is_empty(self):
return len(self.stack) == 0
def append(self, span: Timespan):
self.stack.append(span)
def duration(self):
total = datetime.timedelta()
for span in self.stack:
total += span.duration()
return total
def span(self):
if not len(self):
return []
return Timespan(self.stack[0].start, self.stack[-1].end)
def gaps(self):
gaps = Timestack()
before = None
for span in self.stack:
if before and before.end != span.start:
gaps.append(Timespan(before.end, span.start))
before = span
return gaps
def span_top(self):
if not len(self):
return None
return Timespan(self.stack[0].start, duration=self.duration())
def list(self):
return self.stack