From 91e113a7d3ee25200041f7910142d9e91024495c Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Tue, 6 Oct 2026 12:23:48 +0200 Subject: [PATCH] fix: refuse an emudeck scrape with no cores --- scripts/scraper/emudeck_scraper.py | 18 ++++++++++-------- tests/test_scraper_contract.py | 11 +++++++++++ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/scripts/scraper/emudeck_scraper.py b/scripts/scraper/emudeck_scraper.py index 45484723..0afb8c97 100644 --- a/scripts/scraper/emudeck_scraper.py +++ b/scripts/scraper/emudeck_scraper.py @@ -22,6 +22,7 @@ try: BaseScraper, BiosRequirement, fetch_github_latest_version, + github_headers, requirement_entry, ) except ImportError: @@ -29,6 +30,7 @@ except ImportError: BaseScraper, BiosRequirement, fetch_github_latest_version, + github_headers, requirement_entry, ) @@ -462,17 +464,15 @@ class Scraper(BaseScraper): skip = {"retroarch_maincfg", "retroarch"} try: - req = urllib.request.Request( - api_url, - headers={"User-Agent": "retrobios-scraper/1.0"}, - ) - data = json.loads(urllib.request.urlopen(req, timeout=30).read()) - except (urllib.error.URLError, OSError): - return [] + req = urllib.request.Request(api_url, headers=github_headers()) + with urllib.request.urlopen(req, timeout=30) as resp: + data = json.loads(resp.read()) + except (urllib.error.URLError, json.JSONDecodeError) as e: + raise RuntimeError(f"cannot list EmuDeck EmuScripts: {e}") from e cores: list[str] = [] seen: set[str] = set() - for entry in data: + for entry in data if isinstance(data, list) else []: name = entry.get("name", "") if not name.endswith(".sh"): continue @@ -487,6 +487,8 @@ class Scraper(BaseScraper): if core not in seen: seen.add(core) cores.append(core) + if not cores: + raise RuntimeError(f"no emulator script in {api_url}") return sorted(cores) diff --git a/tests/test_scraper_contract.py b/tests/test_scraper_contract.py index c66f4251..f1317906 100644 --- a/tests/test_scraper_contract.py +++ b/tests/test_scraper_contract.py @@ -278,3 +278,14 @@ class UnreadableReleaseStopsTheScrape(unittest.TestCase): with mock.patch.dict("os.environ", {"GITHUB_TOKEN": "t0k"}): self.assertEqual(github_headers()["Authorization"], "Bearer t0k") + + def test_emudeck_cores_raise(self): + """EmuDeck wrote cores: [] when the GitHub listing was refused.""" + from unittest import mock + + from scraper.emudeck_scraper import Scraper + + with mock.patch("urllib.request.urlopen", self._refuse), self.assertRaises( + RuntimeError + ): + Scraper()._fetch_installed_emulators()