Repository navigation
Expand file tree
/
Copy pathtracking.py
More file actions
75 lines (56 loc) · 1.93 KB
/
Copy pathtracking.py
File metadata and controls
75 lines (56 loc) · 1.93 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
import runez
class Trackable:
tracked_category = None
def __eq__(self, other):
return str(self) == str(other)
def __hash__(self):
return hash(str(self))
def __iter__(self):
yield self
class TrackedCollection:
def __init__(self, name):
self.name = name
self.items = []
def __repr__(self):
return "%s %s" % (len(self.items), self.name)
def __bool__(self):
return bool(self.items)
def add(self, item):
if item not in self.items:
self.items.append(item)
def represented(self, verbose=False):
if self.items:
for item in self.items:
yield item.represented(verbose=verbose)
class Tracker(TrackedCollection):
def __init__(self, enum, name=None):
self.kind = enum.__name__.replace("Type", "").lower()
super().__init__(name or self.kind)
self.enum = enum
self.category = {}
self.users = {}
for x in enum:
c = TrackedCollection("%s %s" % (x.name, self.kind))
self.category[x] = c
def add(self, item):
if item not in self.items:
self.items.append(item)
for trackable in item:
if trackable.tracked_category:
c = self.category[trackable.tracked_category]
c.add(trackable)
if trackable is not item:
u = self.users.get(trackable)
if u is None:
u = set()
self.users[trackable] = u
u.add(item)
def represented(self, verbose=False):
report = []
if self.items:
for item in self.items:
report.append(item.represented(verbose))
report = runez.joined(report, delimiter="\n")
if verbose or report:
report = "\n-- %s\n%s" % (runez.colored(self, "bold"), report)
return report