From 0198445ee47aa651336e8816220554c36ca3e220 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Fri, 16 Oct 2026 15:56:50 +0200 Subject: [PATCH] fix: stop the core-info scrape on a failed fetch --- scripts/scraper/coreinfo_scraper.py | 13 +++++++++---- tests/test_scraper_contract.py | 13 +++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/scripts/scraper/coreinfo_scraper.py b/scripts/scraper/coreinfo_scraper.py index 4a33ff12..d9e34925 100644 --- a/scripts/scraper/coreinfo_scraper.py +++ b/scripts/scraper/coreinfo_scraper.py @@ -228,7 +228,12 @@ class Scraper(BaseScraper): raise ConnectionError(f"Failed to list core-info files: {e}") from e def _fetch_info_file(self, filename: str) -> dict: - """Fetch and parse a single .info file.""" + """Fetch and parse a single .info file. + + A file the listing names and the fetch cannot read is an error: read + as empty, the core dropped out of the result and --compare-db + counted none of its firmware missing. + """ url = f"{RAW_BASE}/{filename}" try: req = urllib.request.Request( @@ -236,9 +241,9 @@ class Scraper(BaseScraper): ) with urllib.request.urlopen(req, timeout=15) as resp: content = resp.read().decode("utf-8") - return _parse_info_file(content) - except (urllib.error.URLError, urllib.error.HTTPError): - return {} + except (urllib.error.URLError, TimeoutError) as e: + raise ConnectionError(f"Failed to fetch {url}: {e}") from e + return _parse_info_file(content) def fetch_requirements(self) -> list[BiosRequirement]: """Fetch firmware requirements from all core .info files.""" diff --git a/tests/test_scraper_contract.py b/tests/test_scraper_contract.py index 5abff128..304e64a4 100644 --- a/tests/test_scraper_contract.py +++ b/tests/test_scraper_contract.py @@ -284,6 +284,19 @@ class UnreadableReleaseStopsTheScrape(unittest.TestCase): ): libretro_scraper.Scraper()._fetch_core_metadata() + def test_a_core_info_file_the_forge_refuses_raises(self): + """Read as empty, the core left the result and --compare-db counted + none of its firmware missing.""" + from scraper import coreinfo_scraper # noqa: PLC0415 + + scraper = coreinfo_scraper.Scraper() + with mock.patch.object( + scraper, "_fetch_info_list", return_value=["mednafen_psx_libretro.info"] + ), mock.patch("urllib.request.urlopen", self._refuse), self.assertRaises( + ConnectionError + ): + scraper.fetch_requirements() + class EveryGitHubApiCallerSendsTheToken(unittest.TestCase):