| 20 | |
| 21 | @dataclasses.dataclass(frozen=True) |
| 22 | class JobData: |
| 23 | @staticmethod |
| 24 | def running() -> "JobData": |
| 25 | return JobData( |
| 26 | status=JobStatus.Running, |
| 27 | stime=now(), |
| 28 | qtime=now() - datetime.timedelta(seconds=1), |
| 29 | mtime=now(), |
| 30 | ) |
| 31 | |
| 32 | @staticmethod |
| 33 | def queued() -> "JobData": |
| 34 | return JobData( |
| 35 | status=JobStatus.Queued, |
| 36 | qtime=now() - datetime.timedelta(seconds=1), |
| 37 | ) |
| 38 | |
| 39 | @staticmethod |
| 40 | def finished() -> "JobData": |
| 41 | return JobData( |
| 42 | status=JobStatus.Finished, |
| 43 | stime=now(), |
| 44 | qtime=now() - datetime.timedelta(seconds=1), |
| 45 | mtime=now() + datetime.timedelta(seconds=1), |
| 46 | exit_code=0, |
| 47 | ) |
| 48 | |
| 49 | @staticmethod |
| 50 | def failed() -> "JobData": |
| 51 | return JobData( |
| 52 | status=JobStatus.Failed, |
| 53 | stime=now(), |
| 54 | qtime=now() - datetime.timedelta(seconds=1), |
| 55 | mtime=now() + datetime.timedelta(seconds=1), |
| 56 | exit_code=1, |
| 57 | ) |
| 58 | |
| 59 | status: JobStatus |
| 60 | qtime: Optional[datetime.datetime] = None |
| 61 | stime: Optional[datetime.datetime] = None |
| 62 | mtime: Optional[datetime.datetime] = None |
| 63 | exit_code: Optional[int] = None |
| 64 | |
| 65 | |
| 66 | class ManagerException(BaseException): |