diff --git a/tests/test_site_density_cards.py b/tests/test_site_density_cards.py index a3cea5df1..969f429b4 100644 --- a/tests/test_site_density_cards.py +++ b/tests/test_site_density_cards.py @@ -280,12 +280,14 @@ class TheScriptWiresBoth(unittest.TestCase): # Visible words of each built page: measured before the round and after it, -# the ceiling being the after value with 5 % of room. +# the ceiling being the after value with 5 % of room. A page whose content +# grew is measured again on the same layout: Sega on 2026-11-09, with Model 2 +# and new Chihiro and Hikaru files. WORD_CEILINGS = { "systems/sony": (2012, 1407), "systems/sony-playstation": (2709, 2130), "systems/nintendo": (3598, 2941), - "systems/sega": (4151, 3370), + "systems/sega": (4151, 3545), "emulators/duckstation": (1188, 1117), "emulators/yaps2": (3159, 2655), } diff --git a/tests/test_site_emulators.py b/tests/test_site_emulators.py index ee87e12b1..e5a49b586 100644 --- a/tests/test_site_emulators.py +++ b/tests/test_site_emulators.py @@ -511,8 +511,9 @@ class TheBuiltEmulatorPages(unittest.TestCase): page = self._html("emulators/aethersx2") self.assertRegex(page, r'Download ", 1)[0]) def test_the_index_leaves_the_template_out(self): diff --git a/tests/test_site_system_sections.py b/tests/test_site_system_sections.py index 8be186cd0..3cb3ccbd2 100644 --- a/tests/test_site_system_sections.py +++ b/tests/test_site_system_sections.py @@ -44,13 +44,13 @@ UNLINKED: dict[str, str] = { "omicron": "Other > omicron", "rpgmaker": "RPG Maker > easyrpg", "sdlpal": "the SDLPAL section under its own top, named after the program", + "sega-model1": "Arcade > Arcade and Arcade > MAME: the I/O board device sets", "sega-system16b": "Arcade > FBNeo, and isgsm.zip is also the ISG Selection Master's", "smbx": "Game Engines > TheXTech", "thomson-mo6": "Other > Clock Signal", "vgmplay": "qsound.zip, ym2413.zip, ym2608.zip: sound chips, no board", # Files filed with another machine: a link would name the wrong one. "commodore-c64-supercpu": "VICE's tree under the C128", - "emerson-arcadia-2001": "ar_bios.zip is filed with the Saturn", "spectravideo": "the SVI ROMs are filed with the MSX", "taito-type-x": "mame2010 files taitogn.zip, the G-NET BIOS, under this id", "vvvvvv": "SDL's controller database", diff --git a/wiki/adding-a-platform.md b/wiki/adding-a-platform.md index 930e75f79..3e39160d4 100644 --- a/wiki/adding-a-platform.md +++ b/wiki/adding-a-platform.md @@ -90,7 +90,7 @@ def validate_format(self, raw_data: str) -> bool: | `alt_md5` | `str \| None` | A second accepted MD5 (Batocera and ROCKNIX `altmd5`) | | `native_path` | `str \| None` | The file reference as the platform writes it, kept when it differs from `name`. libretro writes `iplromco.dat` bare although the file lives under `keropi/`, and `ep128emu/roms/cpc464.rom` with its directory | | `mirror_of` | `str \| None` | The native system whose entry this one repeats under another system. The platform's own file does not carry the copy, so the export skips it | -| `native` | `dict` | Fields the platform declares that the model has no place for, written back unchanged by the export: `native_name`, `md5_list` (a Batocera md5 written as a list), `core`, `note`, `description`, `hash_match_mandatory`, `mandatory_declared`, `alt_paths`, `component`, `required_label` | +| `native` | `dict` | Fields the platform declares that the model has no place for, written back unchanged by the export: `native_name`, `md5_list` (a Batocera md5 written as a list), `core`, `note`, `description`, `hash_match_mandatory`, `mandatory_declared`, `alt_paths`, `component`, `required_label`, `group` (RetroBat: files of one group are alternatives, one held is enough) | `requirement_entry()` in `base_scraper.py` is the single serializer from a requirement to a platform YAML entry, and every scraper goes through it. @@ -355,7 +355,7 @@ by the resolver and by the pack check, as describes. `firmware_folder_flat: true` is set where the frontend reads a system's firmware -folder without descending into it (RomM 5.4.0, +folder without descending into it (RomM 5.4.1, `backend/handler/filesystem/base_handler.py:1002`, `recursive=False`). On such a platform, a core file whose destination has a subfolder is left out of the pack (`nested` in `scripts/packextras.py`), since no core would receive it. diff --git a/wiki/verification-modes.md b/wiki/verification-modes.md index 59996121e..c9f7faa5d 100644 --- a/wiki/verification-modes.md +++ b/wiki/verification-modes.md @@ -154,7 +154,7 @@ If the inner file is not found inside the ZIP, the status is UNTESTED with a rea ### RomM verification -**Source**: RomM 5.4.0 [`backend/models/firmware.py:58-76`](https://github.com/rommapp/romm/blob/5.4.0/backend/models/firmware.py#L58-L76), `Firmware.verify_file_hashes` +**Source**: RomM 5.4.1 [`backend/models/firmware.py:58-76`](https://github.com/rommapp/romm/blob/5.4.1/backend/models/firmware.py#L58-L76), `Firmware.verify_file_hashes` RomM reads the file's bytes (`verification_mode: md5`) but does not compare one digest. Its platform YAML carries `hash_rule: size_and_any_hash`: the file's @@ -170,7 +170,7 @@ not a single digest gets a new `hash_rule` value, never a new mode. ### ROCKNIX verification -**Source**: ROCKNIX 20261001 [`rocknix-systems:137-197`](https://github.com/ROCKNIX/distribution/blob/20261001/projects/ROCKNIX/packages/rocknix/sources/scripts/rocknix-systems#L137-L197), function `checkBios` +**Source**: ROCKNIX 20261101 [`rocknix-systems:137-197`](https://github.com/ROCKNIX/distribution/blob/20261101/projects/ROCKNIX/packages/rocknix/sources/scripts/rocknix-systems#L137-L197), function `checkBios` ROCKNIX derives its BIOS checker from Batocera's, so the logic has the same shape: `md5sum()` on the file, `checkInsideZip()` for archive entries, and an