Skip to content

Commit 891ddad

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

File tree

8 files changed

+96
-53
lines changed

8 files changed

+96
-53
lines changed

examples/atd_submission.py

Lines changed: 1 addition & 2 deletions
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

Lines changed: 1 addition & 2 deletions
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

Lines changed: 1 addition & 2 deletions
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

Lines changed: 1 addition & 2 deletions
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

Lines changed: 1 addition & 2 deletions
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

Lines changed: 1 addition & 2 deletions
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

Lines changed: 8 additions & 0 deletions
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

Lines changed: 82 additions & 41 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy