Skip to content

Commit f35c424

Browse files
committed
Add functions for calls to create submissions batch and get submissions batch.
1 parent fc727c1 commit f35c424

File tree

4 files changed

+193
-12
lines changed

4 files changed

+193
-12
lines changed

examples/atd_submissions.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import os
2+
import time
3+
4+
import judge0
5+
6+
from dotenv import load_dotenv
7+
8+
load_dotenv()
9+
10+
api_key = os.getenv("ATD_API_KEY")
11+
12+
13+
def run_example(client_class, lang_id_python, lang_id_c):
14+
client = client_class(api_key=api_key)
15+
submission1 = judge0.SingleFileSubmission(
16+
source_code="print('Hello Judge0')",
17+
language_id=lang_id_python,
18+
expected_output="Hello Judge0",
19+
)
20+
submission2 = judge0.SingleFileSubmission(
21+
source_code='#include <stdio.h>\n\nint main() {\n printf("Hello World!");\n return 0;\n}',
22+
language_id=lang_id_c,
23+
expected_output="Hello World!",
24+
)
25+
26+
submissions = [submission1, submission2]
27+
client.create_submissions(submissions)
28+
time.sleep(1)
29+
client.get_submissions(submissions)
30+
31+
for submission in submissions:
32+
print(f"{submission.status=}")
33+
print(f"{submission.stdout=}")
34+
35+
36+
def main():
37+
run_example(judge0.ATDJudge0CE, 100, 103)
38+
run_example(judge0.ATDJudge0ExtraCE, 25, 1)
39+
40+
41+
if __name__ == "__main__":
42+
main()

examples/rapid_submissions.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import os
2+
import time
3+
4+
import judge0
5+
6+
from dotenv import load_dotenv
7+
8+
load_dotenv()
9+
10+
api_key = os.getenv("RAPID_API_KEY")
11+
12+
13+
def run_example(client_class, lang_id_python, lang_id_c):
14+
client = client_class(api_key=api_key)
15+
submission1 = judge0.SingleFileSubmission(
16+
source_code="print('Hello Judge0')",
17+
language_id=lang_id_python,
18+
expected_output="Hello Judge0",
19+
)
20+
submission2 = judge0.SingleFileSubmission(
21+
source_code='#include <stdio.h>\n\nint main() {\n printf("Hello World!");\n return 0;\n}',
22+
language_id=lang_id_c,
23+
expected_output="Hello World!",
24+
)
25+
26+
submissions = [submission1, submission2]
27+
client.create_submissions(submissions)
28+
time.sleep(1)
29+
client.get_submissions(submissions)
30+
31+
for submission in submissions:
32+
print(f"{submission.status=}")
33+
print(f"{submission.stdout=}")
34+
35+
36+
def main():
37+
run_example(judge0.RapidJudge0CE, 100, 50)
38+
run_example(judge0.RapidJudge0ExtraCE, 25, 1)
39+
40+
41+
if __name__ == "__main__":
42+
main()

examples/sulu_submissions.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import os
2+
import time
3+
4+
import judge0
5+
6+
from dotenv import load_dotenv
7+
8+
load_dotenv()
9+
10+
api_key = os.getenv("SULU_API_KEY")
11+
12+
13+
def run_example(client_class, lang_id_python, lang_id_c):
14+
client = client_class(api_key=api_key)
15+
submission1 = judge0.SingleFileSubmission(
16+
source_code="print('Hello Judge0')",
17+
language_id=lang_id_python,
18+
expected_output="Hello Judge0",
19+
)
20+
submission2 = judge0.SingleFileSubmission(
21+
source_code='#include <stdio.h>\n\nint main() {\n printf("Hello World!");\n return 0;\n}',
22+
language_id=lang_id_c,
23+
expected_output="Hello World!",
24+
)
25+
26+
submissions = [submission1, submission2]
27+
client.create_submissions(submissions)
28+
time.sleep(1)
29+
client.get_submissions(submissions)
30+
31+
for submission in submissions:
32+
print(f"{submission.status=}")
33+
print(f"{submission.stdout=}")
34+
35+
36+
def main():
37+
run_example(judge0.SuluJudge0CE, 100, 50)
38+
run_example(judge0.SuluJudge0ExtraCE, 25, 1)
39+
40+
41+
if __name__ == "__main__":
42+
main()

src/judge0/clients.py

Lines changed: 67 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,6 @@ def __init__(self, endpoint, auth_headers, *, wait=False) -> None:
1515
except Exception:
1616
raise RuntimeError("Client authentication failed.")
1717

18-
# .....
19-
# judge0.BASH = language_id
20-
# for lang in BaseLanguage.values:
21-
# setattr(self.Language, lang, self.resolve_language(self.languages, lang))
22-
2318
def get_about(self) -> dict:
2419
r = requests.get(
2520
f"{self.endpoint}/about",
@@ -56,7 +51,7 @@ def get_statuses(self) -> list[dict]:
5651
r.raise_for_status()
5752
return r.json()
5853

59-
def create_submission(self, submission: Submission):
54+
def create_submission(self, submission: Submission) -> None:
6055
# TODO: check if client supports specified language_id
6156
params = {
6257
"base64_encoded": "true",
@@ -67,15 +62,15 @@ def create_submission(self, submission: Submission):
6762

6863
resp = requests.post(
6964
f"{self.endpoint}/submissions",
70-
headers=self.auth_headers,
71-
params=params,
7265
json=body,
66+
params=params,
67+
headers=self.auth_headers,
7368
)
7469
resp.raise_for_status()
7570

7671
submission.set_attributes(resp.json())
7772

78-
def get_submission(self, submission: Submission, *, fields=None):
73+
def get_submission(self, submission: Submission, *, fields=None) -> None:
7974
"""Check the submission status."""
8075

8176
params = {
@@ -87,13 +82,53 @@ def get_submission(self, submission: Submission, *, fields=None):
8782

8883
resp = requests.get(
8984
f"{self.endpoint}/submissions/{submission.token}",
90-
headers=self.auth_headers,
9185
params=params,
86+
headers=self.auth_headers,
9287
)
9388
resp.raise_for_status()
9489

9590
submission.set_attributes(resp.json())
9691

92+
def create_submissions(self, submissions: list[Submission]) -> None:
93+
params = {
94+
"base64_encoded": "true",
95+
"wait": str(self.wait).lower(),
96+
}
97+
98+
submissions_body = [submission.to_dict() for submission in submissions]
99+
100+
resp = requests.post(
101+
f"{self.endpoint}/submissions/batch",
102+
headers=self.auth_headers,
103+
params=params,
104+
json={"submissions": submissions_body},
105+
)
106+
resp.raise_for_status()
107+
108+
for submission, attrs in zip(submissions, resp.json()):
109+
submission.set_attributes(attrs)
110+
111+
def get_submissions(self, submissions: list[Submission], *, fields=None) -> None:
112+
params = {
113+
"base64_encoded": "true",
114+
}
115+
116+
if fields is not None:
117+
params["fields"] = ",".join(fields)
118+
119+
tokens = ",".join(submission.token for submission in submissions)
120+
params["tokens"] = tokens
121+
122+
resp = requests.get(
123+
f"{self.endpoint}/submissions/batch",
124+
params=params,
125+
headers=self.auth_headers,
126+
)
127+
resp.raise_for_status()
128+
129+
for submission, attrs in zip(submissions, resp.json()["submissions"]):
130+
submission.set_attributes(attrs)
131+
97132

98133
class ATD(Client):
99134

@@ -122,6 +157,8 @@ class ATDJudge0CE(ATD):
122157
DEFAULT_STATUSES_ENDPOINT: str = "c37b603f-6f99-4e31-a361-7154c734f19b"
123158
DEFAULT_CREATE_SUBMISSION_ENDPOINT: str = "6e65686d-40b0-4bf7-a12f-1f6d033c4473"
124159
DEFAULT_GET_SUBMISSION_ENDPOINT: str = "b7032b8b-86da-40b4-b9d3-b1f5e2b4ee1e"
160+
DEFAULT_CREATE_SUBMISSIONS_ENDPOINT: str = "402b857c-1126-4450-bfd8-22e1f2cbff2f"
161+
DEFAULT_GET_SUBMISSIONS_ENDPOINT: str = "e42f2a26-5b02-472a-80c9-61c4bdae32ec"
125162

126163
def __init__(self, api_key):
127164
super().__init__(
@@ -150,14 +187,22 @@ def get_statuses(self) -> list[dict]:
150187
self._update_endpoint_header(self.DEFAULT_STATUSES_ENDPOINT)
151188
return super().get_statuses()
152189

153-
def create_submission(self, submission: Submission):
190+
def create_submission(self, submission: Submission) -> None:
154191
self._update_endpoint_header(self.DEFAULT_CREATE_SUBMISSION_ENDPOINT)
155192
return super().create_submission(submission)
156193

157-
def get_submission(self, submission: Submission, *, fields=None):
194+
def get_submission(self, submission: Submission, *, fields=None) -> None:
158195
self._update_endpoint_header(self.DEFAULT_GET_SUBMISSION_ENDPOINT)
159196
return super().get_submission(submission, fields=fields)
160197

198+
def create_submissions(self, submissions: Submission) -> None:
199+
self._update_endpoint_header(self.DEFAULT_CREATE_SUBMISSIONS_ENDPOINT)
200+
return super().create_submissions(submissions)
201+
202+
def get_submissions(self, submissions: Submission, *, fields=None) -> None:
203+
self._update_endpoint_header(self.DEFAULT_GET_SUBMISSIONS_ENDPOINT)
204+
return super().get_submissions(submissions, fields=fields)
205+
161206

162207
class ATDJudge0ExtraCE(ATD):
163208
DEFAULT_ENDPOINT: str = "https://judge0-extra-ce.proxy-production.allthingsdev.co"
@@ -170,6 +215,8 @@ class ATDJudge0ExtraCE(ATD):
170215
DEFAULT_STATUSES_ENDPOINT: str = "a2843b3c-673d-4966-9a14-2e7d76dcd0cb"
171216
DEFAULT_CREATE_SUBMISSION_ENDPOINT: str = "be2d195e-dd58-4770-9f3c-d6c0fbc2b6e5"
172217
DEFAULT_GET_SUBMISSION_ENDPOINT: str = "c3a457cd-37a6-4106-97a8-9e60a223abbc"
218+
DEFAULT_CREATE_SUBMISSIONS_ENDPOINT: str = "c64df5d3-edfd-4b08-8687-561af2f80d2f"
219+
DEFAULT_GET_SUBMISSIONS_ENDPOINT: str = "5d173718-8e6a-4cf5-9d8c-db5e6386d037"
173220

174221
def __init__(self, api_key):
175222
super().__init__(
@@ -206,6 +253,14 @@ def get_submission(self, submission: Submission, *, fields=None):
206253
self._update_endpoint_header(self.DEFAULT_GET_SUBMISSION_ENDPOINT)
207254
return super().get_submission(submission, fields=fields)
208255

256+
def create_submissions(self, submission: Submission) -> None:
257+
self._update_endpoint_header(self.DEFAULT_CREATE_SUBMISSIONS_ENDPOINT)
258+
return super().create_submissions(submission)
259+
260+
def get_submissions(self, submission: Submission, *, fields=None) -> None:
261+
self._update_endpoint_header(self.DEFAULT_GET_SUBMISSIONS_ENDPOINT)
262+
return super().get_submissions(submission, fields=fields)
263+
209264

210265
class Rapid(Client):
211266

0 commit comments

Comments
 (0)