moreover's picture
first commit
acd4009
from dataclasses import dataclass, field
import requests
from exec_outcome import ExecOutcome
from typing import List, Optional, Union, Tuple
@dataclass
class ExtendedUnittest:
input: str
output: List[str] = field(default_factory=list)
result: Optional[str] = None
exec_outcome: Optional[ExecOutcome] = None
def json(self):
_json = self.__dict__
if self.exec_outcome is not None:
_json["exec_outcome"] = self.exec_outcome.name
return _json
@classmethod
def from_json(cls, _json):
return cls(
input=_json.get("input", ""),
output=_json.get("output", list()),
result=_json.get("result", None),
exec_outcome=_json.get("exec_outcome", None),
)
class EmptyValueError(Exception):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
class EmptyUnittestError(EmptyValueError):
pass
class EmptyLanguageError(EmptyValueError):
pass
class EmptySourceCodeError(EmptyValueError):
pass
class APICommunication:
_session: requests.Session
def __init__(self, server_url: str = "http://localhost:5000"):
self._session = requests.Session()
self.execute_code_url = f"{server_url}/api/execute_code"
self.get_runtimes_url = f"{server_url}/api/all_runtimes"
def __enter__(self):
return self
def __exit__(self, *args):
self._session.close()
def get_runtimes(self):
return self._session.get(self.get_runtimes_url).json()
def execute_code(
self,
language: str,
source_code: str,
unittests: List[dict],
limits: Optional[dict] = None,
block_network: bool = True,
stop_on_first_fail: bool = True,
use_sanitizer: bool = False,
compiler_program_name: Optional[str] = None,
compiler_flags: Optional[str] = None,
interpreter_cmd: Optional[str] = None,
interpreter_flags: Optional[str] = None,
sample_id: Optional[int] = None,
task_id: Union[str, int, None] = None,
) -> Tuple[List[ExtendedUnittest], Optional[int], Union[str, int, None]]:
if language is None:
raise EmptyLanguageError
if source_code is None:
raise EmptySourceCodeError
if unittests is None or len(unittests) == 0:
raise EmptyUnittestError
request_body = dict(
language=language,
source_code=source_code,
unittests=unittests,
limits=limits,
compile_cmd=compiler_program_name,
compile_flags=compiler_flags,
execute_cmd=interpreter_cmd,
execute_flags=interpreter_flags,
block_network=block_network,
stop_on_first_fail=stop_on_first_fail,
use_sanitizer=use_sanitizer,
)
json_response = self._session.post(
self.execute_code_url,
json=request_body,
headers={"Content-Type": "application/json"},
).json()
if "data" not in json_response:
return json_response, sample_id, task_id
return (
json_response["data"],
sample_id,
task_id,
)