diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 1d5909d..4b2aa46 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -15,9 +15,33 @@ jobs:
- uses: actions/checkout@v4
with:
persist-credentials: false
+ fetch-depth: 0 # Fetch the full history
+ ref: ${{ github.ref }} # Check out the current branch or tag
+
+ - name: Fetch tags only
+ run: git fetch --tags --no-recurse-submodules
+
+ - name: Set up Python
+ uses: actions/setup-python@v4
+ with:
+ python-version: "3.9"
+
+ - name: Install dependencies
+ run: |
+ python -m pip install --upgrade pip
+ pip install -r docs/requirements.txt
+
+ - name: Build documentation
+ run: sphinx-multiversion docs/source docs/build/html --keep-going --no-color
- - name: Build HTML
- uses: ammaraskar/sphinx-action@7.0.0
+ - name: Generate index.html for judge0.github.io/judge0-python.
+ run: |
+ echo '
+
+
+
+
+ ' > docs/build/html/index.html
- name: Upload artifacts
uses: actions/upload-artifact@v4
@@ -30,4 +54,4 @@ jobs:
if: github.ref == 'refs/heads/master'
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
- publish_dir: docs/build/html
\ No newline at end of file
+ publish_dir: docs/build/html
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 38c14e8..3c33777 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -4,6 +4,9 @@ on:
push:
branches: ["master"]
paths: ["src/**", "tests/**"]
+ pull_request:
+ branches: ["master"]
+ paths: ["src/**", "tests/**"]
permissions:
contents: read
diff --git a/docs/requirements.txt b/docs/requirements.txt
index 8e76ca0..cd3bc0f 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1,2 +1,4 @@
+sphinx==7.4.7
sphinxawesome-theme==5.3.2
sphinx-autodoc-typehints==2.3.0
+sphinx-multiversion==0.2.4
\ No newline at end of file
diff --git a/docs/source/_templates/versioning.html b/docs/source/_templates/versioning.html
new file mode 100644
index 0000000..ef74ed4
--- /dev/null
+++ b/docs/source/_templates/versioning.html
@@ -0,0 +1,8 @@
+{% if versions %}
+{{ _('Versions') }}
+
+{% endif %}
\ No newline at end of file
diff --git a/docs/source/api/api.rst b/docs/source/api/api.rst
index 08b5d0e..e5b41b5 100644
--- a/docs/source/api/api.rst
+++ b/docs/source/api/api.rst
@@ -3,4 +3,4 @@ API Module
.. automodule:: judge0.api
:members:
- :undoc-members:
+ :exclude-members: sync_run, async_run
diff --git a/docs/source/api/clients.rst b/docs/source/api/clients.rst
index 52e7e4e..b4d15c9 100644
--- a/docs/source/api/clients.rst
+++ b/docs/source/api/clients.rst
@@ -1,6 +1,46 @@
Clients Module
==============
-.. automodule:: judge0.clients
- :members:
- :member-order: groupwise
+
+.. autoclass:: judge0.clients.Client
+ :exclude-members: API_KEY_ENV
+
+.. autoclass:: judge0.clients.ATD
+ :show-inheritance:
+
+.. autoclass:: judge0.clients.ATDJudge0CE
+ :show-inheritance:
+ :exclude-members: DEFAULT_ENDPOINT, DEFAULT_HOST, HOME_URL, DEFAULT_ABOUT_ENDPOINT,
+ DEFAULT_CONFIG_INFO_ENDPOINT, DEFAULT_LANGUAGE_ENDPOINT, DEFAULT_LANGUAGES_ENDPOINT,
+ DEFAULT_STATUSES_ENDPOINT, DEFAULT_CREATE_SUBMISSION_ENDPOINT, DEFAULT_GET_SUBMISSION_ENDPOINT,
+ DEFAULT_CREATE_SUBMISSIONS_ENDPOINT, DEFAULT_GET_SUBMISSIONS_ENDPOINT, get_about,
+ get_config_info, get_language, get_languages, get_statuses, create_submission, get_submission,
+ create_submissions, get_submissions
+
+.. autoclass:: judge0.clients.ATDJudge0ExtraCE
+ :show-inheritance:
+ :exclude-members: DEFAULT_ENDPOINT, DEFAULT_HOST, HOME_URL, DEFAULT_ABOUT_ENDPOINT,
+ DEFAULT_CONFIG_INFO_ENDPOINT, DEFAULT_LANGUAGE_ENDPOINT, DEFAULT_LANGUAGES_ENDPOINT,
+ DEFAULT_STATUSES_ENDPOINT, DEFAULT_CREATE_SUBMISSION_ENDPOINT, DEFAULT_GET_SUBMISSION_ENDPOINT,
+ DEFAULT_CREATE_SUBMISSIONS_ENDPOINT, DEFAULT_GET_SUBMISSIONS_ENDPOINT, get_about,
+ get_config_info, get_language, get_languages, get_statuses, create_submission, get_submission,
+ create_submissions, get_submissions
+
+
+.. autoclass:: judge0.clients.Rapid
+ :show-inheritance:
+
+.. autoclass:: judge0.clients.RapidJudge0CE
+ :show-inheritance:
+
+.. autoclass:: judge0.clients.RapidJudge0ExtraCE
+ :show-inheritance:
+
+.. autoclass:: judge0.clients.Sulu
+ :show-inheritance:
+
+.. autoclass:: judge0.clients.SuluJudge0CE
+ :show-inheritance:
+
+.. autoclass:: judge0.clients.SuluJudge0ExtraCE
+ :show-inheritance:
\ No newline at end of file
diff --git a/docs/source/api/index.rst b/docs/source/api/index.rst
deleted file mode 100644
index eb4ed67..0000000
--- a/docs/source/api/index.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-.. toctree::
- :maxdepth: 2
-
- api
- submission
- clients
- types
\ No newline at end of file
diff --git a/docs/source/api/submission.rst b/docs/source/api/submission.rst
index e42a6aa..4f9977a 100644
--- a/docs/source/api/submission.rst
+++ b/docs/source/api/submission.rst
@@ -3,4 +3,6 @@ Submission Module
.. automodule:: judge0.submission
:members:
+ :exclude-members: process_encoded_fields, process_language, process_post_execution_filesystem,
+ process_status
:member-order: groupwise
diff --git a/docs/source/api/types.rst b/docs/source/api/types.rst
index 2b415b3..219d7ed 100644
--- a/docs/source/api/types.rst
+++ b/docs/source/api/types.rst
@@ -3,4 +3,4 @@ Types Module
.. automodule:: judge0.base_types
:members:
- :undoc-members:
+
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 77420a5..a9ae07c 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -13,7 +13,7 @@
project = "Judge0 Python SDK"
copyright = "2024, Judge0"
author = "Judge0"
-release = "0.1"
+release = ""
# -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
@@ -21,28 +21,33 @@
extensions = [
"sphinx.ext.autodoc",
"sphinx.ext.napoleon",
- "sphinx.ext.autosummary",
+ # "sphinx.ext.autosummary",
"sphinx_autodoc_typehints",
+ "sphinx_multiversion",
]
templates_path = ["_templates"]
exclude_patterns = []
-
-# add_module_names = False
-
# -- Options for HTML output -------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
html_theme = "sphinxawesome_theme"
html_show_sphinx = False
+html_sidebars = {
+ "**": [
+ "sidebar_main_nav_links.html",
+ "sidebar_toc.html",
+ "versioning.html",
+ ],
+}
sys.path.insert(0, os.path.abspath("../../src/")) # Adjust as needed
autodoc_default_options = {
"members": True,
- "undoc-members": True,
+ "undoc-members": False,
"private-members": False,
"special-members": False,
"inherited-members": False,
@@ -50,3 +55,17 @@
autodoc_mock_imports = ["requests", "pydantic"]
napoleon_google_docstring = False
+
+# Whitelist pattern for tags (set to None to ignore all tags)
+smv_tag_whitelist = r"^.*$"
+# Whitelist pattern for branches (set to None to ignore all branches)
+smv_branch_whitelist = r"^master$"
+# Whitelist pattern for remotes (set to None to use local branches only)
+smv_remote_whitelist = None
+# Pattern for released versions
+smv_released_pattern = "" # r"^tags/.*$"
+# Format for versioned output directories inside the build directory
+smv_outputdir_format = "{ref.name}"
+# Determines whether remote or local git branches/tags are preferred if their
+# output dirs conflict
+smv_prefer_remote_refs = False
diff --git a/docs/source/contributors_guide/index.rst b/docs/source/contributors_guide/index.rst
deleted file mode 100644
index 312258b..0000000
--- a/docs/source/contributors_guide/index.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-.. toctree::
- :maxdepth: 2
-
- contributing
- release_notes
diff --git a/docs/source/contributors_guide/release_notes.rst b/docs/source/contributors_guide/release_notes.rst
index 0b6251f..ec66b1c 100644
--- a/docs/source/contributors_guide/release_notes.rst
+++ b/docs/source/contributors_guide/release_notes.rst
@@ -1,4 +1,4 @@
-How to create a release candidate
-=================================
+How to create a release
+=======================
TODO
\ No newline at end of file
diff --git a/docs/source/index.rst b/docs/source/index.rst
index 6c202aa..3510578 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -15,7 +15,7 @@ You can run minimal Hello World example in three easy steps:
2. Create a minimal script:
-.. code-block:: Python
+.. code-block:: python
import judge0
@@ -25,15 +25,14 @@ You can run minimal Hello World example in three easy steps:
3. Run the script.
Want to learn more
-------------------
-
+==================
To learn what is happening behind the scenes and how to best use Judge0 Python
SDK to facilitate the development of your own product see In Depth guide and
Examples.
Getting Involved
-----------------
+================
TODO
@@ -43,7 +42,10 @@ TODO
:titlesonly:
:hidden:
- api/index
+ api/api
+ api/submission
+ api/clients
+ api/types
.. toctree::
:caption: Getting Involved
@@ -51,4 +53,5 @@ TODO
:titlesonly:
:hidden:
- contributors_guide/index
\ No newline at end of file
+ contributors_guide/contributing
+ contributors_guide/release_notes
\ No newline at end of file
diff --git a/examples/0006_exe.py b/examples/0006_exe.py
new file mode 100644
index 0000000..81d4ada
--- /dev/null
+++ b/examples/0006_exe.py
@@ -0,0 +1,9 @@
+from base64 import b64decode
+
+import judge0
+
+source_code = b64decode(
+ "f0VMRgIBAQAAAAAAAAAAAAIAPgABAAAAAABAAAAAAABAAAAAAAAAAEAQAAAAAAAAAAAAAEAAOAABAEAABAADAAEAAAAFAAAAABAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAJQAAAAAAAAAlAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHAjVANsAG+GABAAInHDwUx/41HPA8FAGhlbGxvLCB3b3JsZAoALnNoc3RydGFiAC50ZXh0AC5yb2RhdGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAEAAAAGAAAAAAAAAAAAQAAAAAAAABAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABEAAAABAAAAAgAAAAAAAAAYAEAAAAAAABgQAAAAAAAADQAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAlEAAAAAAAABkAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA" # noqa: E501
+)
+result = judge0.run(source_code=source_code, language=judge0.EXECUTABLE)
+print(result.stdout)
diff --git a/pyproject.toml b/pyproject.toml
index 3568054..212569c 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "judge0"
-version = "0.0.2"
+version = "0.0.3"
description = "The official Python library for Judge0."
readme = "README.md"
requires-python = ">=3.9"
@@ -49,5 +49,15 @@ docs = ["sphinx==7.4.7"]
[tool.flake8]
docstring-convention = "numpy"
-extend-ignore = ["D205", "D400", "D105", "D100", "D101", "D102", "D103", "F821"]
+extend-ignore = [
+ 'D100',
+ 'D101',
+ 'D102',
+ 'D103',
+ 'D104',
+ 'D105',
+ 'D205',
+ 'D400',
+ 'F821',
+]
max-line-length = 88
diff --git a/src/judge0/__init__.py b/src/judge0/__init__.py
index 5ccf40b..df0f78a 100644
--- a/src/judge0/__init__.py
+++ b/src/judge0/__init__.py
@@ -113,11 +113,70 @@ def _get_implicit_client(flavor: Flavor) -> Client:
CE = Flavor.CE
EXTRA_CE = Flavor.EXTRA_CE
-# TODO: Let's use getattr and setattr for this language ALIASES and raise an
-# exception if a value already exists.
-PYTHON = LanguageAlias.PYTHON
+ASSEMBLY = LanguageAlias.ASSEMBLY
+BASH = LanguageAlias.BASH
+BASIC = LanguageAlias.BASIC
+BOSQUE = LanguageAlias.BOSQUE
+C = LanguageAlias.C
+C3 = LanguageAlias.C3
+CLOJURE = LanguageAlias.CLOJURE
+COBOL = LanguageAlias.COBOL
+COMMON_LISP = LanguageAlias.COMMON_LISP
CPP = LanguageAlias.CPP
-JAVA = LanguageAlias.JAVA
-CPP_GCC = LanguageAlias.CPP_GCC
CPP_CLANG = LanguageAlias.CPP_CLANG
+CPP_GCC = LanguageAlias.CPP_GCC
+CPP_TEST = LanguageAlias.CPP_TEST
+CPP_TEST_CLANG = LanguageAlias.CPP_TEST_CLANG
+CPP_TEST_GCC = LanguageAlias.CPP_TEST_GCC
+CSHARP = LanguageAlias.CSHARP
+CSHARP_DOTNET = LanguageAlias.CSHARP_DOTNET
+CSHARP_MONO = LanguageAlias.CSHARP_MONO
+CSHARP_TEST = LanguageAlias.CSHARP_TEST
+C_CLANG = LanguageAlias.C_CLANG
+C_GCC = LanguageAlias.C_GCC
+D = LanguageAlias.D
+DART = LanguageAlias.DART
+ELIXIR = LanguageAlias.ELIXIR
+ERLANG = LanguageAlias.ERLANG
+EXECUTABLE = LanguageAlias.EXECUTABLE
+FORTRAN = LanguageAlias.FORTRAN
+FSHARP = LanguageAlias.FSHARP
+GO = LanguageAlias.GO
+GROOVY = LanguageAlias.GROOVY
+HASKELL = LanguageAlias.HASKELL
+JAVA = LanguageAlias.JAVA
+JAVAFX = LanguageAlias.JAVAFX
+JAVASCRIPT = LanguageAlias.JAVASCRIPT
+JAVA_JDK = LanguageAlias.JAVA_JDK
+JAVA_OPENJDK = LanguageAlias.JAVA_OPENJDK
+JAVA_TEST = LanguageAlias.JAVA_TEST
+KOTLIN = LanguageAlias.KOTLIN
+LUA = LanguageAlias.LUA
+MPI_C = LanguageAlias.MPI_C
+MPI_CPP = LanguageAlias.MPI_CPP
+MPI_PYTHON = LanguageAlias.MPI_PYTHON
+MULTI_FILE = LanguageAlias.MULTI_FILE
+NIM = LanguageAlias.NIM
+OBJECTIVE_C = LanguageAlias.OBJECTIVE_C
+OCAML = LanguageAlias.OCAML
+OCTAVE = LanguageAlias.OCTAVE
+PASCAL = LanguageAlias.PASCAL
+PERL = LanguageAlias.PERL
+PHP = LanguageAlias.PHP
+PLAIN_TEXT = LanguageAlias.PLAIN_TEXT
+PROLOG = LanguageAlias.PROLOG
+PYTHON = LanguageAlias.PYTHON
+PYTHON2 = LanguageAlias.PYTHON2
+PYTHON2_PYPY = LanguageAlias.PYTHON2_PYPY
+PYTHON3 = LanguageAlias.PYTHON3
+PYTHON3_PYPY = LanguageAlias.PYTHON3_PYPY
PYTHON_FOR_ML = LanguageAlias.PYTHON_FOR_ML
+PYTHON_PYPY = LanguageAlias.PYTHON_PYPY
+R = LanguageAlias.R
+RUBY = LanguageAlias.RUBY
+RUST = LanguageAlias.RUST
+SCALA = LanguageAlias.SCALA
+SQLITE = LanguageAlias.SQLITE
+SWIFT = LanguageAlias.SWIFT
+TYPESCRIPT = LanguageAlias.TYPESCRIPT
+VISUAL_BASIC = LanguageAlias.VISUAL_BASIC
diff --git a/src/judge0/api.py b/src/judge0/api.py
index e254dd9..92b91b1 100644
--- a/src/judge0/api.py
+++ b/src/judge0/api.py
@@ -188,6 +188,11 @@ def wait(
retry_strategy : RetryStrategy, optional
A retry strategy.
+ Returns
+ -------
+ Submission or Submissions
+ A single submission or a list of submissions.
+
Raises
------
ClientResolutionError
diff --git a/src/judge0/base_types.py b/src/judge0/base_types.py
index 05a7a64..8b892ba 100644
--- a/src/judge0/base_types.py
+++ b/src/judge0/base_types.py
@@ -1,7 +1,7 @@
import copy
from dataclasses import dataclass
-from enum import IntEnum
+from enum import IntEnum, auto
from typing import Optional, Protocol, runtime_checkable, Sequence, Union
from pydantic import BaseModel
@@ -59,13 +59,73 @@ class Language(BaseModel):
class LanguageAlias(IntEnum):
"""Language enumeration."""
-
- PYTHON = 0
- CPP = 1
- JAVA = 2
- CPP_GCC = 3
- CPP_CLANG = 4
- PYTHON_FOR_ML = 5
+ ASSEMBLY = auto()
+ BASH = auto()
+ BASIC = auto()
+ BOSQUE = auto()
+ C = auto()
+ C3 = auto()
+ CLOJURE = auto()
+ COBOL = auto()
+ COMMON_LISP = auto()
+ CPP = auto()
+ CPP_CLANG = auto()
+ CPP_GCC = auto()
+ CPP_TEST = auto()
+ CPP_TEST_CLANG = auto()
+ CPP_TEST_GCC = auto()
+ CSHARP = auto()
+ CSHARP_DOTNET = auto()
+ CSHARP_MONO = auto()
+ CSHARP_TEST = auto()
+ C_CLANG = auto()
+ C_GCC = auto()
+ D = auto()
+ DART = auto()
+ ELIXIR = auto()
+ ERLANG = auto()
+ EXECUTABLE = auto()
+ FORTRAN = auto()
+ FSHARP = auto()
+ GO = auto()
+ GROOVY = auto()
+ HASKELL = auto()
+ JAVA = auto()
+ JAVAFX = auto()
+ JAVASCRIPT = auto()
+ JAVA_JDK = auto()
+ JAVA_OPENJDK = auto()
+ JAVA_TEST = auto()
+ KOTLIN = auto()
+ LUA = auto()
+ MPI_C = auto()
+ MPI_CPP = auto()
+ MPI_PYTHON = auto()
+ MULTI_FILE = auto()
+ NIM = auto()
+ OBJECTIVE_C = auto()
+ OCAML = auto()
+ OCTAVE = auto()
+ PASCAL = auto()
+ PERL = auto()
+ PHP = auto()
+ PLAIN_TEXT = auto()
+ PROLOG = auto()
+ PYTHON = auto()
+ PYTHON2 = auto()
+ PYTHON2_PYPY = auto()
+ PYTHON3 = auto()
+ PYTHON3_PYPY = auto()
+ PYTHON_FOR_ML = auto()
+ PYTHON_PYPY = auto()
+ R = auto()
+ RUBY = auto()
+ RUST = auto()
+ SCALA = auto()
+ SQLITE = auto()
+ SWIFT = auto()
+ TYPESCRIPT = auto()
+ VISUAL_BASIC = auto()
class Flavor(IntEnum):
diff --git a/src/judge0/clients.py b/src/judge0/clients.py
index ff8e989..311d26b 100644
--- a/src/judge0/clients.py
+++ b/src/judge0/clients.py
@@ -10,6 +10,24 @@
class Client:
+ """Base class for all clients.
+
+ Parameters
+ ----------
+ endpoint : str
+ Client's default endpoint.
+ auth_headers : dict
+ Request authentication headers.
+
+ Attributes
+ ----------
+ API_KEY_ENV : str
+ Environment variable where judge0-python should look for API key for
+ the client. Set to default values for ATD, RapidAPI, and Sulu clients.
+ """
+
+ # Environment variable where judge0-python should look for API key for
+ # the client. Set to default values for ATD, RapidAPI, and Sulu clients.
API_KEY_ENV: ClassVar[str] = None
def __init__(
@@ -24,7 +42,6 @@ def __init__(
self.retry_strategy = retry_strategy
self.session = requests.Session()
- # TODO: Should be handled differently.
try:
self.languages = self.get_languages()
self.config = self.get_config_info()
@@ -39,6 +56,13 @@ def __del__(self):
@handle_too_many_requests_error_for_preview_client
def get_about(self) -> dict:
+ """Get general information about judge0.
+
+ Returns
+ -------
+ dict
+ General information about judge0.
+ """
response = self.session.get(
f"{self.endpoint}/about",
headers=self.auth_headers,
@@ -48,6 +72,13 @@ def get_about(self) -> dict:
@handle_too_many_requests_error_for_preview_client
def get_config_info(self) -> Config:
+ """Get information about client's configuration.
+
+ Returns
+ -------
+ Config
+ Client's configuration.
+ """
response = self.session.get(
f"{self.endpoint}/config_info",
headers=self.auth_headers,
@@ -57,6 +88,18 @@ def get_config_info(self) -> Config:
@handle_too_many_requests_error_for_preview_client
def get_language(self, language_id: int) -> Language:
+ """Get language corresponding to the id.
+
+ Parameters
+ ----------
+ language_id : int
+ Language id.
+
+ Returns
+ -------
+ Language
+ Language corresponding to the passed id.
+ """
request_url = f"{self.endpoint}/languages/{language_id}"
response = self.session.get(request_url, headers=self.auth_headers)
response.raise_for_status()
@@ -64,6 +107,13 @@ def get_language(self, language_id: int) -> Language:
@handle_too_many_requests_error_for_preview_client
def get_languages(self) -> list[Language]:
+ """Get a list of supported languages.
+
+ Returns
+ -------
+ list of language
+ A list of supported languages.
+ """
request_url = f"{self.endpoint}/languages"
response = self.session.get(request_url, headers=self.auth_headers)
response.raise_for_status()
@@ -71,6 +121,13 @@ def get_languages(self) -> list[Language]:
@handle_too_many_requests_error_for_preview_client
def get_statuses(self) -> list[dict]:
+ """Get a list of possible submission statuses.
+
+ Returns
+ -------
+ list of dict
+ A list of possible submission statues.
+ """
response = self.session.get(
f"{self.endpoint}/statuses",
headers=self.auth_headers,
@@ -80,20 +137,43 @@ def get_statuses(self) -> list[dict]:
@property
def version(self):
+ """Property corresponding to the current client's version."""
if not hasattr(self, "_version"):
_version = self.get_about()["version"]
setattr(self, "_version", _version)
return self._version
def get_language_id(self, language: Union[LanguageAlias, int]) -> int:
- """Get language id corresponding to the language alias for the client."""
+ """Get language id corresponding to the language alias for the client.
+
+ Parameters
+ ----------
+ language : LanguageAlias or int
+ Language alias or language id.
+
+ Returns
+ -------
+ Language id corresponding to the language alias.
+ """
if isinstance(language, LanguageAlias):
supported_language_ids = LANGUAGE_TO_LANGUAGE_ID[self.version]
language = supported_language_ids.get(language, -1)
return language
def is_language_supported(self, language: Union[LanguageAlias, int]) -> bool:
- """Check if language is supported by the client."""
+ """Check if language is supported by the client.
+
+ Parameters
+ ----------
+ language : LanguageAlias or int
+ Language alias or language id.
+
+ Returns
+ -------
+ bool
+ Return True if language is supported by the client, otherwise returns
+ False.
+ """
language_id = self.get_language_id(language)
return any(language_id == lang.id for lang in self.languages)
@@ -208,9 +288,6 @@ def create_submissions(self, submissions: Submissions) -> Submissions:
f"{submission.language}!"
)
- # TODO: Maybe raise an exception if the number of submissions is bigger
- # than the batch size a client supports?
-
submissions_body = [submission.as_body(self) for submission in submissions]
response = self.session.post(
@@ -516,7 +593,15 @@ def __init__(self, api_key, **kwargs):
class Sulu(Client):
- """Base class for all Sulu clients."""
+ """Base class for all Sulu clients.
+
+ Parameters
+ ----------
+ endpoint : str
+ Default request endpoint.
+ api_key : str, optional
+ Sulu API key.
+ """
API_KEY_ENV: ClassVar[str] = "JUDGE0_SULU_API_KEY"
@@ -530,7 +615,13 @@ def __init__(self, endpoint, api_key=None, **kwargs):
class SuluJudge0CE(Sulu):
- """Sulu client for CE flavor."""
+ """Sulu client for CE flavor.
+
+ Parameters
+ ----------
+ api_key : str, optional
+ Sulu API key.
+ """
DEFAULT_ENDPOINT: ClassVar[str] = "https://judge0-ce.p.sulu.sh"
HOME_URL: ClassVar[str] = "https://sparkhub.sulu.sh/apis/judge0/judge0-ce/readme"
@@ -544,7 +635,13 @@ def __init__(self, api_key=None, **kwargs):
class SuluJudge0ExtraCE(Sulu):
- """Sulu client for Extra CE flavor."""
+ """Sulu client for Extra CE flavor.
+
+ Parameters
+ ----------
+ api_key : str
+ Sulu API key.
+ """
DEFAULT_ENDPOINT: ClassVar[str] = "https://judge0-extra-ce.p.sulu.sh"
HOME_URL: ClassVar[str] = (
diff --git a/src/judge0/data.py b/src/judge0/data.py
index 1e759c2..39ad1b3 100644
--- a/src/judge0/data.py
+++ b/src/judge0/data.py
@@ -2,31 +2,165 @@
LANGUAGE_TO_LANGUAGE_ID = {
"1.13.1": {
- LanguageAlias.PYTHON: 71,
- LanguageAlias.CPP: 54,
- LanguageAlias.JAVA: 62,
- LanguageAlias.CPP_GCC: 54,
+ LanguageAlias.ASSEMBLY: 45,
+ LanguageAlias.BASH: 46,
+ LanguageAlias.BASIC: 47,
+ LanguageAlias.C: 50,
+ LanguageAlias.CLOJURE: 86,
+ LanguageAlias.COBOL: 77,
+ LanguageAlias.COMMON_LISP: 55,
+ LanguageAlias.CPP: 52,
LanguageAlias.CPP_CLANG: 76,
+ LanguageAlias.CPP_GCC: 52,
+ LanguageAlias.CSHARP: 51,
+ LanguageAlias.CSHARP_MONO: 51,
+ LanguageAlias.C_CLANG: 75,
+ LanguageAlias.C_GCC: 50,
+ LanguageAlias.D: 56,
+ LanguageAlias.ELIXIR: 57,
+ LanguageAlias.ERLANG: 58,
+ LanguageAlias.EXECUTABLE: 44,
+ LanguageAlias.FORTRAN: 59,
+ LanguageAlias.FSHARP: 87,
+ LanguageAlias.GO: 60,
+ LanguageAlias.GROOVY: 88,
+ LanguageAlias.HASKELL: 61,
+ LanguageAlias.JAVA: 62,
+ LanguageAlias.JAVASCRIPT: 63,
+ LanguageAlias.JAVA_OPENJDK: 62,
+ LanguageAlias.KOTLIN: 78,
+ LanguageAlias.LUA: 64,
+ LanguageAlias.MULTI_FILE: 89,
+ LanguageAlias.OBJECTIVE_C: 79,
+ LanguageAlias.OCAML: 65,
+ LanguageAlias.OCTAVE: 66,
+ LanguageAlias.PASCAL: 67,
+ LanguageAlias.PERL: 85,
+ LanguageAlias.PHP: 68,
+ LanguageAlias.PLAIN_TEXT: 43,
+ LanguageAlias.PROLOG: 69,
+ LanguageAlias.PYTHON: 71,
+ LanguageAlias.PYTHON2: 70,
+ LanguageAlias.PYTHON3: 71,
+ LanguageAlias.R: 80,
+ LanguageAlias.RUBY: 72,
+ LanguageAlias.RUST: 73,
+ LanguageAlias.SCALA: 81,
+ LanguageAlias.SQLITE: 82,
+ LanguageAlias.SWIFT: 83,
+ LanguageAlias.TYPESCRIPT: 74,
+ LanguageAlias.VISUAL_BASIC: 84,
},
"1.13.1-extra": {
- LanguageAlias.PYTHON: 10,
+ LanguageAlias.BOSQUE: 11,
+ LanguageAlias.C: 1,
+ LanguageAlias.C3: 3,
LanguageAlias.CPP: 2,
- LanguageAlias.JAVA: 4,
LanguageAlias.CPP_CLANG: 2,
+ LanguageAlias.CPP_TEST: 12,
+ LanguageAlias.CPP_TEST_CLANG: 15,
+ LanguageAlias.CPP_TEST_GCC: 12,
+ LanguageAlias.CSHARP: 22,
+ LanguageAlias.CSHARP_MONO: 22,
+ LanguageAlias.CSHARP_DOTNET: 21,
+ LanguageAlias.CSHARP_TEST: 23,
+ LanguageAlias.C_CLANG: 1,
+ LanguageAlias.FSHARP: 24,
+ LanguageAlias.JAVA: 4,
+ LanguageAlias.JAVA_OPENJDK: 4,
+ LanguageAlias.JAVA_TEST: 5,
+ LanguageAlias.MPI_C: 6,
+ LanguageAlias.MPI_CPP: 7,
+ LanguageAlias.MPI_PYTHON: 8,
+ LanguageAlias.MULTI_FILE: 89,
+ LanguageAlias.NIM: 9,
+ LanguageAlias.PYTHON: 10,
+ LanguageAlias.PYTHON3: 10,
LanguageAlias.PYTHON_FOR_ML: 10,
+ LanguageAlias.VISUAL_BASIC: 20,
},
"1.14.0": {
- LanguageAlias.PYTHON: 100,
+ LanguageAlias.ASSEMBLY: 45,
+ LanguageAlias.BASH: 46,
+ LanguageAlias.BASIC: 47,
+ LanguageAlias.C: 103,
+ LanguageAlias.CLOJURE: 86,
+ LanguageAlias.COBOL: 77,
+ LanguageAlias.COMMON_LISP: 55,
LanguageAlias.CPP: 105,
- LanguageAlias.JAVA: 91,
- LanguageAlias.CPP_GCC: 105,
LanguageAlias.CPP_CLANG: 76,
+ LanguageAlias.CPP_GCC: 105,
+ LanguageAlias.CSHARP: 51,
+ LanguageAlias.CSHARP_MONO: 51,
+ LanguageAlias.C_CLANG: 104,
+ LanguageAlias.C_GCC: 103,
+ LanguageAlias.D: 56,
+ LanguageAlias.DART: 90,
+ LanguageAlias.ELIXIR: 57,
+ LanguageAlias.ERLANG: 58,
+ LanguageAlias.EXECUTABLE: 44,
+ LanguageAlias.FORTRAN: 59,
+ LanguageAlias.FSHARP: 87,
+ LanguageAlias.GO: 95,
+ LanguageAlias.GROOVY: 88,
+ LanguageAlias.HASKELL: 61,
+ LanguageAlias.JAVA: 62,
+ LanguageAlias.JAVAFX: 96,
+ LanguageAlias.JAVASCRIPT: 102,
+ LanguageAlias.JAVA_JDK: 91,
+ LanguageAlias.JAVA_OPENJDK: 62,
+ LanguageAlias.KOTLIN: 78,
+ LanguageAlias.LUA: 64,
+ LanguageAlias.MULTI_FILE: 89,
+ LanguageAlias.OBJECTIVE_C: 79,
+ LanguageAlias.OCAML: 65,
+ LanguageAlias.OCTAVE: 66,
+ LanguageAlias.PASCAL: 67,
+ LanguageAlias.PERL: 85,
+ LanguageAlias.PHP: 98,
+ LanguageAlias.PLAIN_TEXT: 43,
+ LanguageAlias.PROLOG: 69,
+ LanguageAlias.PYTHON: 100,
+ LanguageAlias.PYTHON2: 70,
+ LanguageAlias.PYTHON3: 100,
+ LanguageAlias.R: 99,
+ LanguageAlias.RUBY: 72,
+ LanguageAlias.RUST: 73,
+ LanguageAlias.SCALA: 81,
+ LanguageAlias.SQLITE: 82,
+ LanguageAlias.SWIFT: 83,
+ LanguageAlias.TYPESCRIPT: 101,
+ LanguageAlias.VISUAL_BASIC: 84,
},
"1.14.0-extra": {
- LanguageAlias.PYTHON: 25,
+ LanguageAlias.BOSQUE: 11,
+ LanguageAlias.C: 1,
+ LanguageAlias.C3: 3,
LanguageAlias.CPP: 2,
- LanguageAlias.JAVA: 4,
LanguageAlias.CPP_CLANG: 2,
+ LanguageAlias.CPP_TEST: 12,
+ LanguageAlias.CPP_TEST_CLANG: 15,
+ LanguageAlias.CPP_TEST_GCC: 12,
+ LanguageAlias.CSHARP: 29,
+ LanguageAlias.CSHARP_MONO: 22,
+ LanguageAlias.CSHARP_DOTNET: 29,
+ LanguageAlias.CSHARP_TEST: 23,
+ LanguageAlias.C_CLANG: 1,
+ LanguageAlias.FSHARP: 24,
+ LanguageAlias.JAVA: 4,
+ LanguageAlias.JAVA_OPENJDK: 4,
+ LanguageAlias.JAVA_TEST: 5,
+ LanguageAlias.MPI_C: 6,
+ LanguageAlias.MPI_CPP: 7,
+ LanguageAlias.MPI_PYTHON: 8,
+ LanguageAlias.MULTI_FILE: 89,
+ LanguageAlias.NIM: 9,
+ LanguageAlias.PYTHON: 25,
+ LanguageAlias.PYTHON2: 26,
+ LanguageAlias.PYTHON2_PYPY: 26,
+ LanguageAlias.PYTHON3: 25,
+ LanguageAlias.PYTHON3_PYPY: 28,
LanguageAlias.PYTHON_FOR_ML: 25,
+ LanguageAlias.VISUAL_BASIC: 20,
},
}
diff --git a/src/judge0/submission.py b/src/judge0/submission.py
index b9d474c..55b7660 100644
--- a/src/judge0/submission.py
+++ b/src/judge0/submission.py
@@ -126,7 +126,7 @@ class Submission(BaseModel):
URL for a callback to report execution results or status.
"""
- source_code: Optional[str] = Field(default=None, repr=True)
+ source_code: Optional[Union[str, bytes]] = Field(default=None, repr=True)
language: Union[LanguageAlias, int] = Field(
default=LanguageAlias.PYTHON,
repr=True,
@@ -208,7 +208,7 @@ def process_language(
return value
def set_attributes(self, attributes: dict[str, Any]) -> None:
- """Set Submissions attributes while taking into account different
+ """Set submissions attributes while taking into account different
attribute's types.
Parameters
@@ -236,7 +236,7 @@ def set_attributes(self, attributes: dict[str, Any]) -> None:
def as_body(self, client: "Client") -> dict:
"""Prepare Submission as a dictionary while taking into account
- the `client`'s restrictions.
+ the client's restrictions.
"""
body = {
"source_code": encode(self.source_code),
diff --git a/tests/test_submission.py b/tests/test_submission.py
index fb1bf73..ddae140 100644
--- a/tests/test_submission.py
+++ b/tests/test_submission.py
@@ -1,3 +1,5 @@
+from base64 import b64decode
+
from judge0 import run, Status, Submission, wait
from judge0.base_types import LanguageAlias
@@ -92,3 +94,19 @@ def test_language_before_and_after_execution(request):
assert submission.language == LanguageAlias.JAVA
submission = run(client=client, submissions=submission)
assert submission.language == LanguageAlias.JAVA
+
+
+def test_language_executable(request):
+ client = request.getfixturevalue("judge0_ce_client")
+ code = b64decode(
+ "f0VMRgIBAQAAAAAAAAAAAAIAPgABAAAAAABAAAAAAABAAAAAAAAAAEAQAAAAAAAAAAAAAEAAOAABAEAABAADAAEAAAAFAAAAABAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAJQAAAAAAAAAlAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHAjVANsAG+GABAAInHDwUx/41HPA8FAGhlbGxvLCB3b3JsZAoALnNoc3RydGFiAC50ZXh0AC5yb2RhdGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAEAAAAGAAAAAAAAAAAAQAAAAAAAABAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABEAAAABAAAAAgAAAAAAAAAYAEAAAAAAABgQAAAAAAAADQAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAlEAAAAAAAABkAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA" # noqa: E501
+ )
+ submission = Submission(
+ source_code=code,
+ language=LanguageAlias.EXECUTABLE,
+ )
+
+ assert submission.language == LanguageAlias.EXECUTABLE
+ submission = run(client=client, submissions=submission)
+ assert submission.language == LanguageAlias.EXECUTABLE
+ assert submission.stdout == "hello, world\n"