forked from pandas-dev/pandas-stubs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path_job.py
67 lines (51 loc) · 1.44 KB
/
_job.py
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
from collections import deque
from dataclasses import dataclass
import sys
import time
from typing import (
Callable,
Optional,
)
from loguru import logger
@dataclass
class Step:
name: str
run: Callable[[], None]
rollback: Optional[Callable[[], None]] = None
def __rollback_job(steps: deque[Step]):
"""
Responsible to run rollback of steps.
"""
while steps:
step = steps.pop()
if step.rollback is not None:
logger.warning(f"Undoing: {step.name}")
try:
step.rollback()
except Exception:
logger.error(
f"Rollback of Step: '{step.name}' failed! The project could be in a unstable mode."
)
def run_job(steps: list[Step]) -> None:
"""
Responsible to run steps with logs.
"""
rollback_steps = deque[Step]()
failed = False
for step in steps:
start = time.perf_counter()
logger.info(f"Beginning: '{step.name}'")
try:
rollback_steps.append(step)
step.run()
except Exception:
logger.error(f"Step: '{step.name}' failed!")
__rollback_job(rollback_steps)
failed = True
break
end = time.perf_counter()
logger.success(f"End: '{step.name}', runtime: {end - start:.3f} seconds.")
if not failed:
__rollback_job(rollback_steps)
if failed:
sys.exit(1)