feat(config): open url option

This commit is contained in:
Barrett Ruth 2025-10-12 16:19:02 -04:00
parent 2bc56195fd
commit c0e175d84b
9 changed files with 45 additions and 18 deletions

View file

@ -286,6 +286,7 @@ class AtcoderScraper(BaseScraper):
error="",
contest_id=cid,
problems=problems,
url=f"https://atcoder.jp/contests/{contest_id}/tasks",
)
return await self._safe_execute("metadata", impl, contest_id)
@ -335,6 +336,7 @@ async def main_async() -> int:
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
@ -345,7 +347,9 @@ async def main_async() -> int:
if mode == "metadata":
if len(sys.argv) != 3:
result = MetadataResult(
success=False, error="Usage: atcoder.py metadata <contest_id>"
success=False,
error="Usage: atcoder.py metadata <contest_id>",
url="",
)
print(result.model_dump_json())
return 1
@ -360,7 +364,6 @@ async def main_async() -> int:
success=False,
error="Usage: atcoder.py tests <contest_id>",
problem_id="",
url="",
tests=[],
timeout_ms=0,
memory_mb=0,
@ -385,6 +388,7 @@ async def main_async() -> int:
result = MetadataResult(
success=False,
error="Unknown mode. Use 'metadata <contest_id>', 'tests <contest_id>', or 'contests'",
url="",
)
print(result.model_dump_json())
return 1

View file

@ -28,6 +28,7 @@ class BaseScraper(ABC):
error=f"{self.platform_name}: {error_msg}",
contest_id=contest_id,
problems=[],
url="",
)
def _create_tests_error(
@ -37,7 +38,6 @@ class BaseScraper(ABC):
success=False,
error=f"{self.platform_name}: {error_msg}",
problem_id=problem_id,
url=url,
tests=[],
timeout_ms=0,
memory_mb=0,

View file

@ -198,7 +198,11 @@ class CodeforcesScraper(BaseScraper):
f"No problems found for contest {cid}", cid
)
return MetadataResult(
success=True, error="", contest_id=cid, problems=problems
success=True,
error="",
contest_id=cid,
problems=problems,
url=f"https://codeforces.com/contest/{contest_id}",
)
return await self._safe_execute("metadata", impl, contest_id)
@ -259,6 +263,7 @@ async def main_async() -> int:
result = MetadataResult(
success=False,
error="Usage: codeforces.py metadata <contest_id> OR codeforces.py tests <contest_id> OR codeforces.py contests",
url="",
)
print(result.model_dump_json())
return 1
@ -269,7 +274,9 @@ async def main_async() -> int:
if mode == "metadata":
if len(sys.argv) != 3:
result = MetadataResult(
success=False, error="Usage: codeforces.py metadata <contest_id>"
success=False,
error="Usage: codeforces.py metadata <contest_id>",
url="",
)
print(result.model_dump_json())
return 1
@ -284,7 +291,6 @@ async def main_async() -> int:
success=False,
error="Usage: codeforces.py tests <contest_id>",
problem_id="",
url="",
tests=[],
timeout_ms=0,
memory_mb=0,
@ -309,6 +315,7 @@ async def main_async() -> int:
result = MetadataResult(
success=False,
error="Unknown mode. Use 'metadata <contest_id>', 'tests <contest_id>', or 'contests'",
url="",
)
print(result.model_dump_json())
return 1

View file

@ -193,9 +193,14 @@ class CSESScraper(BaseScraper):
return MetadataResult(
success=False,
error=f"{self.platform_name}: No problems found for category: {contest_id}",
url="",
)
return MetadataResult(
success=True, error="", contest_id=contest_id, problems=problems
success=True,
error="",
contest_id=contest_id,
problems=problems,
url="https://cses.fi/problemset",
)
async def scrape_contest_list(self) -> ContestListResult:
@ -249,6 +254,7 @@ async def main_async() -> int:
result = MetadataResult(
success=False,
error="Usage: cses.py metadata <category_id> OR cses.py tests <category> OR cses.py contests",
url="",
)
print(result.model_dump_json())
return 1
@ -259,7 +265,9 @@ async def main_async() -> int:
if mode == "metadata":
if len(sys.argv) != 3:
result = MetadataResult(
success=False, error="Usage: cses.py metadata <category_id>"
success=False,
error="Usage: cses.py metadata <category_id>",
url="",
)
print(result.model_dump_json())
return 1
@ -274,7 +282,6 @@ async def main_async() -> int:
success=False,
error="Usage: cses.py tests <category>",
problem_id="",
url="",
tests=[],
timeout_ms=0,
memory_mb=0,
@ -299,6 +306,7 @@ async def main_async() -> int:
result = MetadataResult(
success=False,
error=f"Unknown mode: {mode}. Use 'metadata <category>', 'tests <category>', or 'contests'",
url="",
)
print(result.model_dump_json())
return 1

View file

@ -33,6 +33,7 @@ class ScrapingResult(BaseModel):
class MetadataResult(ScrapingResult):
contest_id: str = ""
problems: list[ProblemSummary] = Field(default_factory=list)
url: str
model_config = ConfigDict(extra="forbid")
@ -45,7 +46,6 @@ class ContestListResult(ScrapingResult):
class TestsResult(ScrapingResult):
problem_id: str
url: str
tests: list[TestCase] = Field(default_factory=list)
timeout_ms: int
memory_mb: float