refactor MockBug in preperation for adding `status` field to `Node`
[utils.git] / src / budget_sync / util.py
1 from bugzilla import Bugzilla
2 from bugzilla.bug import Bug
3 from typing import Iterator, Union
4 from enum import Enum
5
6
7 class BugStatus(Enum):
8 UNCONFIRMED = "UNCONFIRMED"
9 CONFIRMED = "CONFIRMED"
10 IN_PROGRESS = "IN_PROGRESS"
11 DEFERRED = "DEFERRED"
12 RESOLVED = "RESOLVED"
13 VERIFIED = "VERIFIED"
14 PAYMENTPENDING = "PAYMENTPENDING"
15
16 def __str__(self):
17 return self.value
18
19 def __repr__(self):
20 return f"BugStatus.{self.value}"
21
22 @staticmethod
23 def cast(v: Union[str, "BugStatus"],
24 unknown_allowed: bool = False) -> Union[str, "BugStatus"]:
25 s = str(v)
26 try:
27 return BugStatus(s)
28 except ValueError:
29 if unknown_allowed:
30 return s
31 raise
32
33
34 def all_bugs(bz: Bugzilla) -> Iterator[Bug]:
35 chunk_start = 1
36 chunk_size = 100
37 while True:
38 bugs = bz.getbugs(list(range(chunk_start, chunk_start + chunk_size)))
39 chunk_start += chunk_size
40 yield from bugs
41 if len(bugs) < chunk_size:
42 return