Skip to content
This repository was archived by the owner on Mar 13, 2026. It is now read-only.

Commit d27ef87

Browse files
committed
Add job time attributes
1 parent b3bd49c commit d27ef87

4 files changed

Lines changed: 113 additions & 17 deletions

File tree

src/github.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ def job_id(self):
1717
def run_id(self):
1818
return self.data["workflow_job"]["run_id"]
1919

20+
@property
21+
def node_id(self):
22+
return self.data["workflow_job"]["node_id"]
23+
2024
@property
2125
def name(self):
2226
return self.data["workflow_job"]["name"].replace("\n", " ")

src/jobs.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,36 @@
1+
from datetime import datetime
12
from github import GithubJob
23

34

45
class Job:
56
def __init__(self, github_job: GithubJob) -> None:
6-
self.github_job = github_job
7+
self.github_job: GithubJob = None
8+
self.stauts: str = None
9+
10+
self.queued_at: datetime = None
11+
self.in_progress_at: datetime = None
12+
self.completed_at: datetime = None
13+
14+
self._update_attributes(github_job)
15+
16+
self.node_id = self.github_job.node_id
17+
18+
def _update_attributes(self, github_job: GithubJob):
19+
self.github_job: GithubJob = github_job
20+
self.status = github_job.action
21+
22+
if self.github_job.action == "queued":
23+
self.queued_at = self.github_job.time_start
24+
25+
if (
26+
self.github_job.action == "in_progress"
27+
or self.github_job.action == "completed"
28+
):
29+
self.in_progress_at = self.github_job.time_start
30+
self.completed_at = self.github_job.time_completed
31+
32+
def update(self, github_job: GithubJob):
33+
self._update_attributes(github_job)
734

835

936
class JobEventsHandler:
@@ -43,8 +70,7 @@ def _process_in_progress_event(self, event: dict):
4370
if not job:
4471
job = self._create_job(GithubJob(event))
4572
else:
46-
# Update github job event from job
47-
job.github_job = GithubJob(event)
73+
job.update(GithubJob(event))
4874

4975
self.in_progress[job_id] = job
5076

src/utils.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33

44
def parse_datetime(date: str) -> datetime:
55
"""Parse GitHub date to object."""
6-
exp = "%Y-%m-%dT%H:%M:%SZ"
7-
return datetime.strptime(date, exp)
6+
if date:
7+
exp = "%Y-%m-%dT%H:%M:%SZ"
8+
return datetime.strptime(date, exp)
89

910

1011
def dict_to_logfmt(data: dict) -> str:

tests/test_jobs.py

Lines changed: 77 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,61 @@
22

33
from unittest.mock import Mock
44

5-
from jobs import JobEventsHandler
5+
from datetime import datetime
6+
from github import GithubJob
7+
from jobs import Job, JobEventsHandler
8+
9+
GITHUB_TIME_FORMAT = "%Y-%m-%dT%H:%M:%SZ"
610

711

812
@pytest.fixture
913
def new_job_event():
10-
return {"workflow_job": {"id": "workflow_id"}, "action": "queued"}
14+
return {
15+
"workflow_job": {
16+
"id": "workflow_id",
17+
"started_at": "2024-04-29T12:43:16Z",
18+
"completed_at": None,
19+
"node_id": "CR_kwDOHC6jj88AAAAFqGXrPQ",
20+
},
21+
"action": "queued",
22+
}
1123

1224

1325
@pytest.fixture
1426
def in_progress_job_event():
15-
return {"workflow_job": {"id": "workflow_id"}, "action": "in_progress"}
27+
return {
28+
"workflow_job": {
29+
"id": "workflow_id",
30+
"started_at": "2024-04-29T12:43:32Z",
31+
"completed_at": None,
32+
"node_id": "CR_kwDOHC6jj88AAAAFqGXrPQ",
33+
},
34+
"action": "in_progress",
35+
}
1636

1737

1838
@pytest.fixture
1939
def completed_job_event():
20-
return {"workflow_job": {"id": "workflow_id"}, "action": "completed"}
21-
22-
23-
def test_new_job(new_job_event):
40+
return {
41+
"workflow_job": {
42+
"id": "workflow_id",
43+
"started_at": "2024-04-29T12:43:32Z",
44+
"completed_at": "2024-04-29T12:45:09Z",
45+
"node_id": "CR_kwDOHC6jj88AAAAFqGXrPQ",
46+
},
47+
"action": "completed",
48+
}
49+
50+
51+
def test_new_job_event(new_job_event):
2452
handler = JobEventsHandler()
2553

2654
handler.process_event(new_job_event)
2755

2856
assert handler.queued.get("workflow_id")
2957

3058

31-
def test_in_progress_job(in_progress_job_event):
59+
def test_in_progress_job_event(in_progress_job_event):
3260
handler = JobEventsHandler()
3361
job = Mock()
3462
handler.queued["workflow_id"] = job
@@ -39,18 +67,55 @@ def test_in_progress_job(in_progress_job_event):
3967
assert handler.in_progress.get("workflow_id") == job
4068

4169

42-
def test_unprocessed_in_progress_job(in_progress_job_event):
70+
def test_unprocessed_in_progress_job_event(in_progress_job_event):
4371
handler = JobEventsHandler()
4472
handler.process_event(in_progress_job_event)
4573

4674
assert handler.in_progress.get("workflow_id")
4775

4876

49-
def test_completed_job(completed_job_event):
77+
def test_completed_job_event(completed_job_event):
5078
handler = JobEventsHandler()
5179
handler.in_progress["workflow_id"] = Mock()
5280

5381
handler.process_event(completed_job_event)
5482

55-
assert not handler.queued.get("workflow_id")
56-
assert not handler.in_progress.get("workflow_id")
83+
assert handler.queued.get("workflow_id") is None
84+
assert handler.in_progress.get("workflow_id") is None
85+
86+
87+
def test_new_job(new_job_event):
88+
job = Job(GithubJob(new_job_event))
89+
90+
assert job.status == "queued"
91+
assert job.queued_at == datetime.strptime(
92+
"2024-04-29T12:43:16Z", GITHUB_TIME_FORMAT
93+
)
94+
assert job.in_progress_at is None
95+
96+
97+
def test_update_in_progress_job(new_job_event, in_progress_job_event):
98+
job = Job(GithubJob(new_job_event))
99+
job.update(GithubJob(in_progress_job_event))
100+
101+
assert job.status == "in_progress"
102+
assert job.queued_at == datetime.strptime(
103+
"2024-04-29T12:43:16Z", GITHUB_TIME_FORMAT
104+
)
105+
assert job.in_progress_at == datetime.strptime(
106+
"2024-04-29T12:43:32Z", GITHUB_TIME_FORMAT
107+
)
108+
assert job.completed_at is None
109+
110+
111+
def test_update_completed_job(in_progress_job_event, completed_job_event):
112+
job = Job(GithubJob(in_progress_job_event))
113+
job.update(GithubJob(completed_job_event))
114+
115+
assert job.status == "completed"
116+
assert job.in_progress_at == datetime.strptime(
117+
"2024-04-29T12:43:32Z", GITHUB_TIME_FORMAT
118+
)
119+
assert job.completed_at == datetime.strptime(
120+
"2024-04-29T12:45:09Z", GITHUB_TIME_FORMAT
121+
)

0 commit comments

Comments
 (0)