diff --git a/scripts/scraper/romset_dat_importer.py b/scripts/scraper/romset_dat_importer.py index 2a3f230f..68b53ccb 100644 --- a/scripts/scraper/romset_dat_importer.py +++ b/scripts/scraper/romset_dat_importer.py @@ -305,10 +305,19 @@ def _iter_dat_contents(pack: Path) -> Iterator[tuple[str, bytes]]: if pack.suffix.lower() == ".zip": with zipfile.ZipFile(pack) as archive: for info in sorted(archive.infolist(), key=lambda i: i.filename): - if info.is_dir() or info.file_size > MAX_MEMBER_SIZE: + if info.is_dir(): continue if Path(info.filename).suffix.lower() not in (".dat", ".xml"): continue + if info.file_size > MAX_MEMBER_SIZE: + # Said out loud: a DAT left out silently ended the run + # on "Unchanged" with a version missing. + print( + f" Skipping {info.filename}: {info.file_size} bytes " + f"exceeds {MAX_MEMBER_SIZE}", + file=sys.stderr, + ) + continue yield info.filename, archive.read(info) return yield pack.name, pack.read_bytes() diff --git a/tests/test_romset_recipes.py b/tests/test_romset_recipes.py index f1345cbf..6f0712b0 100644 --- a/tests/test_romset_recipes.py +++ b/tests/test_romset_recipes.py @@ -641,5 +641,29 @@ class WriteRunsTheReportItWrites(unittest.TestCase): self.assertEqual((alone.identify, alone.missing), (True, False)) + +class AnOversizedDatIsNamed(unittest.TestCase): + """The romset importer skipped a DAT over its size cap without a word, + and the run ended on "Unchanged" with a version missing.""" + + def test_the_skip_is_reported(self): + import contextlib + import io + import zipfile + from unittest import mock + + from scripts.scraper import romset_dat_importer as importer + + with tempfile.TemporaryDirectory(dir=TMP_ROOT) as directory: + pack = Path(directory) / "pack.zip" + with zipfile.ZipFile(pack, "w") as archive: + archive.writestr("big.dat", b"x" * 64) + err = io.StringIO() + with mock.patch.object(importer, "MAX_MEMBER_SIZE", 16), \ + contextlib.redirect_stderr(err): + self.assertEqual(list(importer._iter_dat_contents(pack)), []) + self.assertIn("Skipping big.dat", err.getvalue()) + + if __name__ == "__main__": unittest.main()