56 lines
2.2 KiB
Python
56 lines
2.2 KiB
Python
import io
|
|
import os
|
|
import zipfile
|
|
from typing import Tuple
|
|
|
|
from colorama import Fore, Style, init
|
|
from joj_submitter import JOJSubmitter, Language
|
|
|
|
from joint_teapot.config import settings
|
|
from joint_teapot.utils.logger import logger
|
|
|
|
|
|
class JOJ:
|
|
def __init__(self, sid: str = ""):
|
|
sid = sid or settings.joj_sid
|
|
init()
|
|
self.submitter = JOJSubmitter(sid, logger)
|
|
|
|
def submit_dir(self, problem_url: str, path: str, lang: str) -> Tuple[int, str]:
|
|
if lang not in list(Language):
|
|
raise Exception(f"unsupported language '{lang}' for JOJ")
|
|
exclude_paths = [".git"]
|
|
zip_buffer = io.BytesIO()
|
|
zip_buffer.name = f"{os.path.basename(path)}.zip"
|
|
with zipfile.ZipFile(zip_buffer, "a", zipfile.ZIP_DEFLATED) as zip_file:
|
|
for root, dirs, files in os.walk(path):
|
|
dirs[:] = [d for d in dirs if d not in exclude_paths]
|
|
for file in files:
|
|
zip_file.write(
|
|
os.path.join(root, file),
|
|
os.path.relpath(os.path.join(root, file), path),
|
|
)
|
|
zip_buffer.seek(0)
|
|
response = self.submitter.upload_file(problem_url, zip_buffer, lang)
|
|
if response.status_code != 200:
|
|
logger.error(
|
|
f"{path} submit to JOJ error, status code {response.status_code}"
|
|
)
|
|
return -1, ""
|
|
logger.info(f"{path} submit to JOJ succeed, record url {response.url}")
|
|
record = self.submitter.get_status(response.url)
|
|
fore_color = Fore.RED if record.status != "Accepted" else Fore.GREEN
|
|
logger.info(
|
|
f"status: {fore_color}{record.status}{Style.RESET_ALL}, "
|
|
+ f"accept number: {Fore.BLUE}{record.accepted_count}{Style.RESET_ALL}, "
|
|
+ f"score: {Fore.BLUE}{record.score}{Style.RESET_ALL}, "
|
|
+ f"total time: {Fore.BLUE}{record.total_time}{Style.RESET_ALL}, "
|
|
+ f"peak memory: {Fore.BLUE}{record.peak_memory}{Style.RESET_ALL}"
|
|
)
|
|
score_int = 0
|
|
try:
|
|
score_int = int(record.score)
|
|
except ValueError:
|
|
pass
|
|
return score_int, response.url
|