Skip to content

Commit 891ddad

Browse files
committed
Add async_execute, sync_execute, execute. Separate wait from client
1 parent ddb839e commit 891ddad

8 files changed

+96
-53
lines changed

examples/atd_submission.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ def run_example(client_class, language_id):
1717
expected_output="Hello Judge0",
1818
)
1919

20-
client.create_submission(submission)
21-
client.wait(submission)
20+
judge0.execute(client=client, submissions=submission)
2221

2322
print(f"{submission.status=}")
2423
print(f"{submission.stdout=}")

examples/atd_submissions.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ def run_example(client_class, lang_id_python, lang_id_c):
2323
)
2424

2525
submissions = [submission1, submission2]
26-
client.create_submissions(submissions)
27-
client.wait(submissions)
26+
judge0.execute(client=client, submissions=submissions)
2827

2928
for submission in submissions:
3029
print(f"{submission.status=}")

examples/rapid_submission.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ def run_example(client_class, language_id):
1717
expected_output="Hello Judge0",
1818
)
1919

20-
client.create_submission(submission)
21-
client.wait(submission)
20+
judge0.execute(client=client, submissions=submission)
2221

2322
print(f"{submission.status=}")
2423
print(f"{submission.stdout=}")

examples/rapid_submissions.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ def run_example(client_class, lang_id_python, lang_id_c):
2323
)
2424

2525
submissions = [submission1, submission2]
26-
client.create_submissions(submissions)
27-
client.wait(submissions)
26+
judge0.execute(client=client, submissions=submissions)
2827

2928
for submission in submissions:
3029
print(f"{submission.status=}")

examples/sulu_submission.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ def run_example(client_class, language_id):
1717
expected_output="Hello Judge0",
1818
)
1919

20-
client.create_submission(submission)
21-
client.wait(submission)
20+
judge0.execute(client=client, submissions=submission)
2221

2322
print(f"{submission.status=}")
2423
print(f"{submission.stdout=}")

examples/sulu_submissions.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ def run_example(client_class, lang_id_python, lang_id_c):
2323
)
2424

2525
submissions = [submission1, submission2]
26-
client.create_submissions(submissions)
27-
client.wait(submissions)
26+
judge0.execute(client=client, submissions=submissions)
2827

2928
for submission in submissions:
3029
print(f"{submission.status=}")

src/judge0/__init__.py

+8
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
from .clients import (
2+
async_execute,
23
ATDJudge0CE,
34
ATDJudge0ExtraCE,
45
Client,
6+
execute,
57
RapidJudge0CE,
68
RapidJudge0ExtraCE,
79
SuluJudge0CE,
810
SuluJudge0ExtraCE,
11+
sync_execute,
12+
wait,
913
)
1014
from .retry import MaxRetries, MaxWaitTime, RegularPeriodRetry
1115

@@ -23,4 +27,8 @@
2327
RegularPeriodRetry,
2428
MaxRetries,
2529
MaxWaitTime,
30+
async_execute,
31+
sync_execute,
32+
execute,
33+
wait,
2634
]

src/judge0/clients.py

+82-41
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def get_statuses(self) -> list[dict]:
5555
def is_language_supported(self, language_id: int) -> bool:
5656
return language_id in self.languages
5757

58-
def create_submission(self, submission: Submission) -> None:
58+
def create_submission(self, submission: Submission) -> Submission:
5959
# Check if submission contains supported language.
6060
if not self.is_language_supported(language_id=submission.language_id):
6161
raise RuntimeError(
@@ -80,12 +80,14 @@ def create_submission(self, submission: Submission) -> None:
8080

8181
submission.set_attributes(resp.json())
8282

83+
return submission
84+
8385
def get_submission(
8486
self,
8587
submission: Submission,
8688
*,
8789
fields: Union[str, Iterable[str], None] = None,
88-
) -> None:
90+
) -> Submission:
8991
"""Check the submission status."""
9092

9193
params = {
@@ -109,7 +111,9 @@ def get_submission(
109111

110112
submission.set_attributes(resp.json())
111113

112-
def create_submissions(self, submissions: list[Submission]) -> None:
114+
return submission
115+
116+
def create_submissions(self, submissions: list[Submission]) -> list[Submission]:
113117
# Check if all submissions contain supported language.
114118
for submission in submissions:
115119
if not self.is_language_supported(language_id=submission.language_id):
@@ -131,12 +135,14 @@ def create_submissions(self, submissions: list[Submission]) -> None:
131135
for submission, attrs in zip(submissions, resp.json()):
132136
submission.set_attributes(attrs)
133137

138+
return submissions
139+
134140
def get_submissions(
135141
self,
136142
submissions: list[Submission],
137143
*,
138144
fields: Union[str, Iterable[str], None] = None,
139-
) -> None:
145+
) -> list[Submission]:
140146
params = {
141147
"base64_encoded": "true",
142148
}
@@ -162,35 +168,7 @@ def get_submissions(
162168
for submission, attrs in zip(submissions, resp.json()["submissions"]):
163169
submission.set_attributes(attrs)
164170

165-
def wait(
166-
self,
167-
submissions: Union[Submission, list[Submission]],
168-
*,
169-
retry_mechanism: Optional[RetryMechanism] = None,
170-
):
171-
if retry_mechanism is None:
172-
retry_mechanism = RegularPeriodRetry()
173-
174-
if not isinstance(submissions, (list, tuple)):
175-
submissions = [submissions]
176-
177-
submissions_to_check = {
178-
submission.token: submission for submission in submissions
179-
}
180-
181-
while len(submissions_to_check) > 0 and not retry_mechanism.is_done():
182-
self.get_submissions(submissions_to_check.values())
183-
for token in list(submissions_to_check):
184-
submission = submissions_to_check[token]
185-
if submission.is_done():
186-
submissions_to_check.pop(token)
187-
188-
# Don't wait if there is no submissions to check for anymore.
189-
if len(submissions_to_check) == 0:
190-
break
191-
192-
retry_mechanism.wait()
193-
retry_mechanism.step()
171+
return submissions
194172

195173

196174
class ATD(Client):
@@ -249,7 +227,7 @@ def get_statuses(self) -> list[dict]:
249227
self._update_endpoint_header(self.DEFAULT_STATUSES_ENDPOINT)
250228
return super().get_statuses()
251229

252-
def create_submission(self, submission: Submission) -> None:
230+
def create_submission(self, submission: Submission) -> Submission:
253231
self._update_endpoint_header(self.DEFAULT_CREATE_SUBMISSION_ENDPOINT)
254232
return super().create_submission(submission)
255233

@@ -258,11 +236,11 @@ def get_submission(
258236
submission: Submission,
259237
*,
260238
fields: Union[str, Iterable[str], None] = None,
261-
) -> None:
239+
) -> Submission:
262240
self._update_endpoint_header(self.DEFAULT_GET_SUBMISSION_ENDPOINT)
263241
return super().get_submission(submission, fields=fields)
264242

265-
def create_submissions(self, submissions: list[Submission]) -> None:
243+
def create_submissions(self, submissions: list[Submission]) -> list[Submission]:
266244
self._update_endpoint_header(self.DEFAULT_CREATE_SUBMISSIONS_ENDPOINT)
267245
return super().create_submissions(submissions)
268246

@@ -271,7 +249,7 @@ def get_submissions(
271249
submissions: list[Submission],
272250
*,
273251
fields: Union[str, Iterable[str], None] = None,
274-
) -> None:
252+
) -> list[Submission]:
275253
self._update_endpoint_header(self.DEFAULT_GET_SUBMISSIONS_ENDPOINT)
276254
return super().get_submissions(submissions, fields=fields)
277255

@@ -317,7 +295,7 @@ def get_statuses(self) -> list[dict]:
317295
self._update_endpoint_header(self.DEFAULT_STATUSES_ENDPOINT)
318296
return super().get_statuses()
319297

320-
def create_submission(self, submission: Submission):
298+
def create_submission(self, submission: Submission) -> Submission:
321299
self._update_endpoint_header(self.DEFAULT_CREATE_SUBMISSION_ENDPOINT)
322300
return super().create_submission(submission)
323301

@@ -326,11 +304,11 @@ def get_submission(
326304
submission: Submission,
327305
*,
328306
fields: Union[str, Iterable[str], None] = None,
329-
):
307+
) -> Submission:
330308
self._update_endpoint_header(self.DEFAULT_GET_SUBMISSION_ENDPOINT)
331309
return super().get_submission(submission, fields=fields)
332310

333-
def create_submissions(self, submissions: list[Submission]) -> None:
311+
def create_submissions(self, submissions: list[Submission]) -> list[Submission]:
334312
self._update_endpoint_header(self.DEFAULT_CREATE_SUBMISSIONS_ENDPOINT)
335313
return super().create_submissions(submissions)
336314

@@ -339,7 +317,7 @@ def get_submissions(
339317
submissions: list[Submission],
340318
*,
341319
fields: Union[str, Iterable[str], None] = None,
342-
) -> None:
320+
) -> list[Submission]:
343321
self._update_endpoint_header(self.DEFAULT_GET_SUBMISSIONS_ENDPOINT)
344322
return super().get_submissions(submissions, fields=fields)
345323

@@ -398,3 +376,66 @@ class SuluJudge0ExtraCE(Sulu):
398376

399377
def __init__(self, api_key):
400378
super().__init__(self.DEFAULT_ENDPOINT, api_key=api_key)
379+
380+
381+
def wait(
382+
client: Client,
383+
submissions: Union[Submission, list[Submission]],
384+
*,
385+
retry_mechanism: Optional[RetryMechanism] = None,
386+
) -> Union[Submission, list[Submission]]:
387+
if retry_mechanism is None:
388+
retry_mechanism = RegularPeriodRetry()
389+
390+
if not isinstance(submissions, (list, tuple)):
391+
submissions_to_check = {
392+
submission.token: submission for submission in [submissions]
393+
}
394+
else:
395+
submissions_to_check = {
396+
submission.token: submission for submission in submissions
397+
}
398+
399+
while len(submissions_to_check) > 0 and not retry_mechanism.is_done():
400+
client.get_submissions(submissions_to_check.values())
401+
for token in list(submissions_to_check):
402+
submission = submissions_to_check[token]
403+
if submission.is_done():
404+
submissions_to_check.pop(token)
405+
406+
# Don't wait if there is no submissions to check for anymore.
407+
if len(submissions_to_check) == 0:
408+
break
409+
410+
retry_mechanism.wait()
411+
retry_mechanism.step()
412+
413+
return submissions
414+
415+
416+
def async_execute(
417+
*,
418+
client: Client,
419+
submissions: Union[Submission, list[Submission]],
420+
) -> Union[Submission, list[Submission]]:
421+
if isinstance(submissions, (list, tuple)):
422+
return client.create_submissions(submissions)
423+
else:
424+
return client.create_submission(submissions)
425+
426+
427+
def sync_execute(
428+
*,
429+
client: Client,
430+
submissions: Union[Submission, list[Submission]],
431+
) -> Union[Submission, list[Submission]]:
432+
submissions = async_execute(client=client, submissions=submissions)
433+
return wait(client, submissions)
434+
435+
436+
def execute(
437+
*,
438+
client: Client,
439+
submissions: Union[Submission, list[Submission]],
440+
) -> Union[Submission, list[Submission]]:
441+
return sync_execute(client=client, submissions=submissions)

0 commit comments

Comments
 (0)