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

Commit c514cb4

Browse files
committed
Add job handler to process jobs
1 parent e3f267b commit c514cb4

4 files changed

Lines changed: 120 additions & 2 deletions

File tree

.github/workflows/tests.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,4 @@ jobs:
2929
flake8
3030
- name: Test with pytest
3131
run: |
32-
pytest --cov=src
32+
pytest --cov=src tests/

src/app.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
from const import GithubHeaders, LOGGING_CONFIG
1111
from github import GithubJob
12+
from jobs import JobEventsHandler
1213
from utils import dict_to_logfmt
1314

1415
dictConfig(LOGGING_CONFIG)
@@ -26,6 +27,7 @@
2627
logging.getLogger('apscheduler.executors.default').setLevel(logging.WARNING)
2728

2829
jobs = dict()
30+
job_handler = JobEventsHandler()
2931

3032

3133
# check all calls are valid
@@ -50,7 +52,10 @@ def validate_origin_github():
5052

5153

5254
def process_workflow_job():
53-
job = GithubJob(request.get_json())
55+
event = request.get_json()
56+
job_handler.process_event(event)
57+
58+
job = GithubJob(event)
5459

5560
context_details = {
5661
"action": job.action,

src/jobs.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
from github import GithubJob
2+
3+
4+
class Job:
5+
def __init__(self, github_job: GithubJob) -> None:
6+
self.github_job = github_job
7+
8+
9+
class JobEventsHandler:
10+
def __init__(self) -> None:
11+
self.queued = dict()
12+
self.in_progress = dict()
13+
14+
def process_event(self, event: dict):
15+
status = event["action"]
16+
17+
if status == "queued":
18+
self._process_queued_event(event)
19+
20+
elif status == "in_progress":
21+
self._process_in_progress_event(event)
22+
23+
elif status == "completed":
24+
self._process_completed_event(event)
25+
26+
else:
27+
pass
28+
29+
def _get_event_job_id(self, event: dict):
30+
return event["workflow_job"]["id"]
31+
32+
def _create_job(self, githubJob: GithubJob) -> Job:
33+
return Job(github_job=githubJob)
34+
35+
def _process_queued_event(self, event: dict):
36+
job = self._create_job(GithubJob(event))
37+
self.queued[self._get_event_job_id(event)] = job
38+
39+
def _process_in_progress_event(self, event: dict):
40+
job_id = self._get_event_job_id(event)
41+
job = self.queued.pop(job_id, None)
42+
43+
if not job:
44+
job = self._create_job(GithubJob(event))
45+
else:
46+
# Update github job event from job
47+
job.github_job = GithubJob(event)
48+
49+
self.in_progress[job_id] = job
50+
51+
# TODO send final time in queue
52+
53+
def _process_completed_event(self, event: dict):
54+
job_id = self._get_event_job_id(event)
55+
self.in_progress.pop(job_id, None)
56+
57+
# TODO send final time in progress

tests/test_jobs.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import pytest
2+
3+
from unittest.mock import Mock
4+
5+
from jobs import JobEventsHandler
6+
7+
8+
@pytest.fixture
9+
def new_job_event():
10+
return {"workflow_job": {"id": "workflow_id"}, "action": "queued"}
11+
12+
13+
@pytest.fixture
14+
def in_progress_job_event():
15+
return {"workflow_job": {"id": "workflow_id"}, "action": "in_progress"}
16+
17+
18+
@pytest.fixture
19+
def completed_job_event():
20+
return {"workflow_job": {"id": "workflow_id"}, "action": "completed"}
21+
22+
23+
def test_new_job(new_job_event):
24+
handler = JobEventsHandler()
25+
26+
handler.process_event(new_job_event)
27+
28+
assert handler.queued.get("workflow_id")
29+
30+
31+
def test_in_progress_job(in_progress_job_event):
32+
handler = JobEventsHandler()
33+
job = Mock()
34+
handler.queued["workflow_id"] = job
35+
36+
handler.process_event(in_progress_job_event)
37+
38+
assert not handler.queued.get("workflow_id")
39+
assert handler.in_progress.get("workflow_id") == job
40+
41+
42+
def test_unprocessed_in_progress_job(in_progress_job_event):
43+
handler = JobEventsHandler()
44+
handler.process_event(in_progress_job_event)
45+
46+
assert handler.in_progress.get("workflow_id")
47+
48+
49+
def test_completed_job(completed_job_event):
50+
handler = JobEventsHandler()
51+
handler.in_progress["workflow_id"] = Mock()
52+
53+
handler.process_event(completed_job_event)
54+
55+
assert not handler.queued.get("workflow_id")
56+
assert not handler.in_progress.get("workflow_id")

0 commit comments

Comments
 (0)