ci: format
This commit is contained in:
parent
ad90d564ca
commit
bad219e578
9 changed files with 134 additions and 24 deletions
|
|
@ -1,7 +1,19 @@
|
||||||
local M = {}
|
local M = {}
|
||||||
|
|
||||||
M.PLATFORMS = { 'atcoder', 'codechef', 'codeforces', 'cses', 'kattis', 'usaco' }
|
M.PLATFORMS = { 'atcoder', 'codechef', 'codeforces', 'cses', 'kattis', 'usaco' }
|
||||||
M.ACTIONS = { 'run', 'panel', 'next', 'prev', 'pick', 'cache', 'interact', 'edit', 'race', 'stress', 'submit' }
|
M.ACTIONS = {
|
||||||
|
'run',
|
||||||
|
'panel',
|
||||||
|
'next',
|
||||||
|
'prev',
|
||||||
|
'pick',
|
||||||
|
'cache',
|
||||||
|
'interact',
|
||||||
|
'edit',
|
||||||
|
'race',
|
||||||
|
'stress',
|
||||||
|
'submit',
|
||||||
|
}
|
||||||
|
|
||||||
M.PLATFORM_DISPLAY_NAMES = {
|
M.PLATFORM_DISPLAY_NAMES = {
|
||||||
atcoder = 'AtCoder',
|
atcoder = 'AtCoder',
|
||||||
|
|
|
||||||
|
|
@ -369,15 +369,26 @@ class AtcoderScraper(BaseScraper):
|
||||||
|
|
||||||
await asyncio.gather(*(emit(r) for r in rows))
|
await asyncio.gather(*(emit(r) for r in rows))
|
||||||
|
|
||||||
async def submit(self, contest_id: str, problem_id: str, source_code: str, language_id: str, credentials: dict[str, str]) -> SubmitResult:
|
async def submit(
|
||||||
|
self,
|
||||||
|
contest_id: str,
|
||||||
|
problem_id: str,
|
||||||
|
source_code: str,
|
||||||
|
language_id: str,
|
||||||
|
credentials: dict[str, str],
|
||||||
|
) -> SubmitResult:
|
||||||
def _submit_sync() -> SubmitResult:
|
def _submit_sync() -> SubmitResult:
|
||||||
try:
|
try:
|
||||||
login_page = _session.get(f"{BASE_URL}/login", headers=HEADERS, timeout=TIMEOUT_SECONDS)
|
login_page = _session.get(
|
||||||
|
f"{BASE_URL}/login", headers=HEADERS, timeout=TIMEOUT_SECONDS
|
||||||
|
)
|
||||||
login_page.raise_for_status()
|
login_page.raise_for_status()
|
||||||
soup = BeautifulSoup(login_page.text, "html.parser")
|
soup = BeautifulSoup(login_page.text, "html.parser")
|
||||||
csrf_input = soup.find("input", {"name": "csrf_token"})
|
csrf_input = soup.find("input", {"name": "csrf_token"})
|
||||||
if not csrf_input:
|
if not csrf_input:
|
||||||
return SubmitResult(success=False, error="Could not find CSRF token on login page")
|
return SubmitResult(
|
||||||
|
success=False, error="Could not find CSRF token on login page"
|
||||||
|
)
|
||||||
csrf_token = csrf_input.get("value", "")
|
csrf_token = csrf_input.get("value", "")
|
||||||
|
|
||||||
login_resp = _session.post(
|
login_resp = _session.post(
|
||||||
|
|
@ -401,7 +412,9 @@ class AtcoderScraper(BaseScraper):
|
||||||
soup = BeautifulSoup(submit_page.text, "html.parser")
|
soup = BeautifulSoup(submit_page.text, "html.parser")
|
||||||
csrf_input = soup.find("input", {"name": "csrf_token"})
|
csrf_input = soup.find("input", {"name": "csrf_token"})
|
||||||
if not csrf_input:
|
if not csrf_input:
|
||||||
return SubmitResult(success=False, error="Could not find CSRF token on submit page")
|
return SubmitResult(
|
||||||
|
success=False, error="Could not find CSRF token on submit page"
|
||||||
|
)
|
||||||
csrf_token = csrf_input.get("value", "")
|
csrf_token = csrf_input.get("value", "")
|
||||||
|
|
||||||
task_screen_name = f"{contest_id}_{problem_id}"
|
task_screen_name = f"{contest_id}_{problem_id}"
|
||||||
|
|
@ -418,7 +431,9 @@ class AtcoderScraper(BaseScraper):
|
||||||
)
|
)
|
||||||
submit_resp.raise_for_status()
|
submit_resp.raise_for_status()
|
||||||
|
|
||||||
return SubmitResult(success=True, error="", submission_id="", verdict="submitted")
|
return SubmitResult(
|
||||||
|
success=True, error="", submission_id="", verdict="submitted"
|
||||||
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return SubmitResult(success=False, error=str(e))
|
return SubmitResult(success=False, error=str(e))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,13 @@ import sys
|
||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
|
|
||||||
from .language_ids import get_language_id
|
from .language_ids import get_language_id
|
||||||
from .models import CombinedTest, ContestListResult, MetadataResult, SubmitResult, TestsResult
|
from .models import (
|
||||||
|
CombinedTest,
|
||||||
|
ContestListResult,
|
||||||
|
MetadataResult,
|
||||||
|
SubmitResult,
|
||||||
|
TestsResult,
|
||||||
|
)
|
||||||
|
|
||||||
_PRECISION_ABS_REL_RE = re.compile(
|
_PRECISION_ABS_REL_RE = re.compile(
|
||||||
r"(?:absolute|relative)\s+error[^.]*?10\s*[\^{]\s*\{?\s*[-\u2212]\s*(\d+)\s*\}?",
|
r"(?:absolute|relative)\s+error[^.]*?10\s*[\^{]\s*\{?\s*[-\u2212]\s*(\d+)\s*\}?",
|
||||||
|
|
@ -43,7 +49,14 @@ class BaseScraper(ABC):
|
||||||
async def stream_tests_for_category_async(self, category_id: str) -> None: ...
|
async def stream_tests_for_category_async(self, category_id: str) -> None: ...
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
async def submit(self, contest_id: str, problem_id: str, source_code: str, language_id: str, credentials: dict[str, str]) -> SubmitResult: ...
|
async def submit(
|
||||||
|
self,
|
||||||
|
contest_id: str,
|
||||||
|
problem_id: str,
|
||||||
|
source_code: str,
|
||||||
|
language_id: str,
|
||||||
|
credentials: dict[str, str],
|
||||||
|
) -> SubmitResult: ...
|
||||||
|
|
||||||
def _usage(self) -> str:
|
def _usage(self) -> str:
|
||||||
name = self.platform_name
|
name = self.platform_name
|
||||||
|
|
@ -102,7 +115,11 @@ class BaseScraper(ABC):
|
||||||
|
|
||||||
case "submit":
|
case "submit":
|
||||||
if len(args) != 5:
|
if len(args) != 5:
|
||||||
print(self._submit_error("Usage: <platform> submit <contest_id> <problem_id> <language_id>").model_dump_json())
|
print(
|
||||||
|
self._submit_error(
|
||||||
|
"Usage: <platform> submit <contest_id> <problem_id> <language_id>"
|
||||||
|
).model_dump_json()
|
||||||
|
)
|
||||||
return 1
|
return 1
|
||||||
source_code = sys.stdin.read()
|
source_code = sys.stdin.read()
|
||||||
creds_raw = os.environ.get("CP_CREDENTIALS", "{}")
|
creds_raw = os.environ.get("CP_CREDENTIALS", "{}")
|
||||||
|
|
@ -111,7 +128,9 @@ class BaseScraper(ABC):
|
||||||
except json.JSONDecodeError:
|
except json.JSONDecodeError:
|
||||||
credentials = {}
|
credentials = {}
|
||||||
language_id = get_language_id(self.platform_name, args[4]) or args[4]
|
language_id = get_language_id(self.platform_name, args[4]) or args[4]
|
||||||
result = await self.submit(args[2], args[3], source_code, language_id, credentials)
|
result = await self.submit(
|
||||||
|
args[2], args[3], source_code, language_id, credentials
|
||||||
|
)
|
||||||
print(result.model_dump_json())
|
print(result.model_dump_json())
|
||||||
return 0 if result.success else 1
|
return 0 if result.success else 1
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -252,8 +252,20 @@ class CodeChefScraper(BaseScraper):
|
||||||
payload = await coro
|
payload = await coro
|
||||||
print(json.dumps(payload), flush=True)
|
print(json.dumps(payload), flush=True)
|
||||||
|
|
||||||
async def submit(self, contest_id: str, problem_id: str, source_code: str, language_id: str, credentials: dict[str, str]) -> SubmitResult:
|
async def submit(
|
||||||
return SubmitResult(success=False, error="CodeChef submit not yet implemented", submission_id="", verdict="")
|
self,
|
||||||
|
contest_id: str,
|
||||||
|
problem_id: str,
|
||||||
|
source_code: str,
|
||||||
|
language_id: str,
|
||||||
|
credentials: dict[str, str],
|
||||||
|
) -> SubmitResult:
|
||||||
|
return SubmitResult(
|
||||||
|
success=False,
|
||||||
|
error="CodeChef submit not yet implemented",
|
||||||
|
submission_id="",
|
||||||
|
verdict="",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
||||||
|
|
@ -281,8 +281,20 @@ class CodeforcesScraper(BaseScraper):
|
||||||
flush=True,
|
flush=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
async def submit(self, contest_id: str, problem_id: str, source_code: str, language_id: str, credentials: dict[str, str]) -> SubmitResult:
|
async def submit(
|
||||||
return SubmitResult(success=False, error="Codeforces submit not yet implemented", submission_id="", verdict="")
|
self,
|
||||||
|
contest_id: str,
|
||||||
|
problem_id: str,
|
||||||
|
source_code: str,
|
||||||
|
language_id: str,
|
||||||
|
credentials: dict[str, str],
|
||||||
|
) -> SubmitResult:
|
||||||
|
return SubmitResult(
|
||||||
|
success=False,
|
||||||
|
error="Codeforces submit not yet implemented",
|
||||||
|
submission_id="",
|
||||||
|
verdict="",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
||||||
|
|
@ -262,8 +262,20 @@ class CSESScraper(BaseScraper):
|
||||||
payload = await coro
|
payload = await coro
|
||||||
print(json.dumps(payload), flush=True)
|
print(json.dumps(payload), flush=True)
|
||||||
|
|
||||||
async def submit(self, contest_id: str, problem_id: str, source_code: str, language_id: str, credentials: dict[str, str]) -> SubmitResult:
|
async def submit(
|
||||||
return SubmitResult(success=False, error="CSES submit not yet implemented", submission_id="", verdict="")
|
self,
|
||||||
|
contest_id: str,
|
||||||
|
problem_id: str,
|
||||||
|
source_code: str,
|
||||||
|
language_id: str,
|
||||||
|
credentials: dict[str, str],
|
||||||
|
) -> SubmitResult:
|
||||||
|
return SubmitResult(
|
||||||
|
success=False,
|
||||||
|
error="CSES submit not yet implemented",
|
||||||
|
submission_id="",
|
||||||
|
verdict="",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
||||||
|
|
@ -222,9 +222,20 @@ class KattisScraper(BaseScraper):
|
||||||
flush=True,
|
flush=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
async def submit(
|
||||||
async def submit(self, contest_id: str, problem_id: str, source_code: str, language_id: str, credentials: dict[str, str]) -> SubmitResult:
|
self,
|
||||||
return SubmitResult(success=False, error="Kattis submit not yet implemented", submission_id="", verdict="")
|
contest_id: str,
|
||||||
|
problem_id: str,
|
||||||
|
source_code: str,
|
||||||
|
language_id: str,
|
||||||
|
credentials: dict[str, str],
|
||||||
|
) -> SubmitResult:
|
||||||
|
return SubmitResult(
|
||||||
|
success=False,
|
||||||
|
error="Kattis submit not yet implemented",
|
||||||
|
submission_id="",
|
||||||
|
verdict="",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
||||||
|
|
@ -279,9 +279,20 @@ class USACOScraper(BaseScraper):
|
||||||
payload = await coro
|
payload = await coro
|
||||||
print(json.dumps(payload), flush=True)
|
print(json.dumps(payload), flush=True)
|
||||||
|
|
||||||
|
async def submit(
|
||||||
async def submit(self, contest_id: str, problem_id: str, source_code: str, language_id: str, credentials: dict[str, str]) -> SubmitResult:
|
self,
|
||||||
return SubmitResult(success=False, error="USACO submit not yet implemented", submission_id="", verdict="")
|
contest_id: str,
|
||||||
|
problem_id: str,
|
||||||
|
source_code: str,
|
||||||
|
language_id: str,
|
||||||
|
credentials: dict[str, str],
|
||||||
|
) -> SubmitResult:
|
||||||
|
return SubmitResult(
|
||||||
|
success=False,
|
||||||
|
error="USACO submit not yet implemented",
|
||||||
|
submission_id="",
|
||||||
|
verdict="",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,10 @@ def main() -> None:
|
||||||
timeout=timeout,
|
timeout=timeout,
|
||||||
)
|
)
|
||||||
except subprocess.TimeoutExpired:
|
except subprocess.TimeoutExpired:
|
||||||
print(f"[stress] generator timed out on iteration {iteration}", file=sys.stderr)
|
print(
|
||||||
|
f"[stress] generator timed out on iteration {iteration}",
|
||||||
|
file=sys.stderr,
|
||||||
|
)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
if gen_result.returncode != 0:
|
if gen_result.returncode != 0:
|
||||||
|
|
@ -80,7 +83,10 @@ def main() -> None:
|
||||||
timeout=timeout,
|
timeout=timeout,
|
||||||
)
|
)
|
||||||
except subprocess.TimeoutExpired:
|
except subprocess.TimeoutExpired:
|
||||||
print(f"[stress] candidate timed out on iteration {iteration}", file=sys.stderr)
|
print(
|
||||||
|
f"[stress] candidate timed out on iteration {iteration}",
|
||||||
|
file=sys.stderr,
|
||||||
|
)
|
||||||
print(f"\n--- input ---\n{test_input}", end="")
|
print(f"\n--- input ---\n{test_input}", end="")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue