diff --git a/scrapers/atcoder.py b/scrapers/atcoder.py index 66b95aa..1b946dd 100644 --- a/scrapers/atcoder.py +++ b/scrapers/atcoder.py @@ -266,43 +266,31 @@ class AtcoderScraper(BaseScraper): return "atcoder" async def scrape_contest_metadata(self, contest_id: str) -> MetadataResult: - async def impl(cid: str) -> MetadataResult: - try: - rows = await asyncio.to_thread(_scrape_tasks_sync, cid) - except requests.HTTPError as e: - if e.response is not None and e.response.status_code == 404: - return self._create_metadata_error( - f"No problems found for contest {cid}", cid - ) - raise - + try: + rows = await asyncio.to_thread(_scrape_tasks_sync, contest_id) problems = _to_problem_summaries(rows) if not problems: - return self._create_metadata_error( - f"No problems found for contest {cid}", cid + return self._metadata_error( + f"No problems found for contest {contest_id}" ) - return MetadataResult( success=True, error="", - contest_id=cid, + contest_id=contest_id, problems=problems, url=f"https://atcoder.jp/contests/{contest_id}/tasks/{contest_id}_%s", ) - - return await self._safe_execute("metadata", impl, contest_id) + except Exception as e: + return self._metadata_error(str(e)) async def scrape_contest_list(self) -> ContestListResult: - async def impl() -> ContestListResult: - try: - contests = await _fetch_all_contests_async() - except Exception as e: - return self._create_contests_error(str(e)) + try: + contests = await _fetch_all_contests_async() if not contests: - return self._create_contests_error("No contests found") + return self._contests_error("No contests found") return ContestListResult(success=True, error="", contests=contests) - - return await self._safe_execute("contests", impl) + except Exception as e: + return self._contests_error(str(e)) async def stream_tests_for_category_async(self, category_id: str) -> None: rows = await asyncio.to_thread(_scrape_tasks_sync, category_id) diff --git a/scrapers/codeforces.py b/scrapers/codeforces.py index 840616f..cf172b8 100644 --- a/scrapers/codeforces.py +++ b/scrapers/codeforces.py @@ -86,14 +86,14 @@ def _extract_samples(block: Tag) -> tuple[list[TestCase], bool]: if not st: return [], False - input_pres: list[Tag] = [ # type: ignore[misc] - inp.find("pre") # type: ignore[misc] - for inp in st.find_all("div", class_="input") # type: ignore[union-attr] + input_pres: list[Tag] = [ + inp.find("pre") + for inp in st.find_all("div", class_="input") if isinstance(inp, Tag) and inp.find("pre") ] output_pres: list[Tag] = [ - out.find("pre") # type: ignore[misc] - for out in st.find_all("div", class_="output") # type: ignore[union-attr] + out.find("pre") + for out in st.find_all("div", class_="output") if isinstance(out, Tag) and out.find("pre") ] input_pres = [p for p in input_pres if isinstance(p, Tag)] diff --git a/tests/conftest.py b/tests/conftest.py index bd84941..aaefec8 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -245,16 +245,16 @@ def run_scraper_offline(fixture_text): offline_fetches = _make_offline_fetches(scraper_name) if scraper_name == "codeforces": - fetchers.Fetcher.get = offline_fetches["Fetcher.get"] # type: ignore[assignment] + fetchers.Fetcher.get = offline_fetches["Fetcher.get"] requests.get = offline_fetches["requests.get"] elif scraper_name == "atcoder": ns._fetch = offline_fetches["_fetch"] ns._get_async = offline_fetches["_get_async"] elif scraper_name == "cses": - httpx.AsyncClient.get = offline_fetches["__offline_fetch_text"] # type: ignore[assignment] + httpx.AsyncClient.get = offline_fetches["__offline_fetch_text"] elif scraper_name == "codechef": - httpx.AsyncClient.get = offline_fetches["__offline_get_async"] # type: ignore[assignment] - fetchers.Fetcher.get = offline_fetches["Fetcher.get"] # type: ignore[assignment] + httpx.AsyncClient.get = offline_fetches["__offline_get_async"] + fetchers.Fetcher.get = offline_fetches["Fetcher.get"] scraper_class = getattr(ns, scraper_classes[scraper_name]) scraper = scraper_class()