refactor(atcoder): replace custom main_async with run_cli()

Problem: `atcoder.py` had a hand-rolled `main_async`/`main` dispatch
that duplicated `BaseScraper._run_cli_async` and missed the new
`login` subcommand.

Solution: delete the duplicate dispatch and use `AtcoderScraper().run_cli()`
like every other scraper. Remove now-unused imports (`sys`,
`get_language_id`, `CombinedTest`, `TestsResult`).
This commit is contained in:
Barrett Ruth 2026-03-05 15:09:49 -05:00
parent 06f5e24ebc
commit f17eb85407
Signed by: barrett
GPG key ID: A6C96C9349D2FC81

View file

@ -5,7 +5,6 @@ import json
import os import os
import re import re
import subprocess import subprocess
import sys
import time import time
from pathlib import Path from pathlib import Path
from typing import Any from typing import Any
@ -18,9 +17,7 @@ from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry from urllib3.util.retry import Retry
from .base import BaseScraper, extract_precision from .base import BaseScraper, extract_precision
from .language_ids import get_language_id
from .models import ( from .models import (
CombinedTest,
ContestListResult, ContestListResult,
ContestSummary, ContestSummary,
LoginResult, LoginResult,
@ -28,7 +25,6 @@ from .models import (
ProblemSummary, ProblemSummary,
SubmitResult, SubmitResult,
TestCase, TestCase,
TestsResult,
) )
from .timeouts import ( from .timeouts import (
BROWSER_ELEMENT_WAIT, BROWSER_ELEMENT_WAIT,
@ -681,94 +677,5 @@ class AtcoderScraper(BaseScraper):
return await asyncio.to_thread(_login_headless, credentials) return await asyncio.to_thread(_login_headless, credentials)
async def main_async() -> int:
if len(sys.argv) < 2:
result = MetadataResult(
success=False,
error="Usage: atcoder.py metadata <contest_id> OR atcoder.py tests <contest_id> OR atcoder.py contests",
url="",
)
print(result.model_dump_json())
return 1
mode: str = sys.argv[1]
scraper = AtcoderScraper()
if mode == "metadata":
if len(sys.argv) != 3:
result = MetadataResult(
success=False,
error="Usage: atcoder.py metadata <contest_id>",
url="",
)
print(result.model_dump_json())
return 1
contest_id = sys.argv[2]
result = await scraper.scrape_contest_metadata(contest_id)
print(result.model_dump_json())
return 0 if result.success else 1
if mode == "tests":
if len(sys.argv) != 3:
tests_result = TestsResult(
success=False,
error="Usage: atcoder.py tests <contest_id>",
problem_id="",
combined=CombinedTest(input="", expected=""),
tests=[],
timeout_ms=0,
memory_mb=0,
)
print(tests_result.model_dump_json())
return 1
contest_id = sys.argv[2]
await scraper.stream_tests_for_category_async(contest_id)
return 0
if mode == "contests":
if len(sys.argv) != 2:
contest_result = ContestListResult(
success=False, error="Usage: atcoder.py contests"
)
print(contest_result.model_dump_json())
return 1
contest_result = await scraper.scrape_contest_list()
print(contest_result.model_dump_json())
return 0 if contest_result.success else 1
if mode == "submit":
if len(sys.argv) != 6:
print(
SubmitResult(
success=False,
error="Usage: atcoder.py submit <contest_id> <problem_id> <language> <file_path>",
).model_dump_json()
)
return 1
creds_raw = os.environ.get("CP_CREDENTIALS", "{}")
try:
credentials = json.loads(creds_raw)
except json.JSONDecodeError:
credentials = {}
language_id = get_language_id("atcoder", sys.argv[4]) or sys.argv[4]
submit_result = await scraper.submit(
sys.argv[2], sys.argv[3], sys.argv[5], language_id, credentials
)
print(submit_result.model_dump_json())
return 0 if submit_result.success else 1
result = MetadataResult(
success=False,
error="Unknown mode. Use 'metadata <contest_id>', 'tests <contest_id>', 'contests', or 'submit <contest_id> <problem_id> <language>'",
url="",
)
print(result.model_dump_json())
return 1
def main() -> None:
sys.exit(asyncio.run(main_async()))
if __name__ == "__main__": if __name__ == "__main__":
main() AtcoderScraper().run_cli()