From 904edd65e4d9b15e99bb2b7eba495274211c822d Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Wed, 25 Mar 2026 15:14:29 +0100 Subject: [PATCH] docs: document CI workflows, inheritance, MAME clones, tests, scrapers --- scripts/generate_site.py | 49 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/scripts/generate_site.py b/scripts/generate_site.py index 7b1a71a0..172ac464 100644 --- a/scripts/generate_site.py +++ b/scripts/generate_site.py @@ -1336,6 +1336,49 @@ def generate_wiki_architecture() -> str: "| MAME BIOS ZIPs | `contents` field documents inner structure |", "| RPG Maker/ScummVM | excluded from dedup (NODEDUP) to preserve directory structure |", "| `strip_components` in data dirs | flattens cache prefix to match expected path |", + "| case-insensitive dedup | prevents `font.rom` + `FONT.ROM` conflicts on Windows/macOS |", + "", + "## Platform inheritance", + "", + "Platform configs support `inherits:` to share definitions.", + "Lakka inherits from RetroArch, RetroPie inherits from RetroArch with `base_destination: BIOS`.", + "`overrides:` allows child platforms to modify specific systems from the parent.", + "", + "Core resolution (`resolve_platform_cores`) uses three strategies:", + "", + "- `cores: all_libretro` - include all profiles with `libretro` in their type", + "- `cores: [list]` - include only named profiles", + "- `cores:` absent - fallback to system ID intersection between platform and profiles", + "", + "## MAME clone map", + "", + "`_mame_clones.json` at repo root maps MAME clone ROM names to their canonical parent.", + "When a clone ZIP was deduplicated, `resolve_local_file` uses this map to find the canonical file.", + "", + "## Tests", + "", + "`tests/test_e2e.py` contains 75 end-to-end tests with synthetic fixtures.", + "Covers: file resolution, verification, severity, cross-reference, aliases,", + "inheritance, shared groups, data dirs, storage tiers, HLE, launchers,", + "platform grouping, core resolution (3 strategies + alias exclusion).", + "", + "```bash", + "python -m unittest tests.test_e2e -v", + "```", + "", + "## CI workflows", + "", + "| Workflow | File | Trigger | Role |", + "|----------|------|---------|------|", + "| Build & Release | `build.yml` | `workflow_dispatch` (manual) | restore large files, build packs, deploy site, create GitHub release |", + "| PR Validation | `validate.yml` | pull request on `bios/`/`platforms/` | validate BIOS hashes, schema check, run tests, auto-label PR |", + "| Weekly Sync | `watch.yml` | cron (Monday 6 AM UTC) + manual | scrape upstream sources, detect changes, create update PR |", + "", + "Build workflow has a 7-day rate limit between releases and keeps the 3 most recent.", + "", + "## License", + "", + "See `LICENSE` at repo root. Files are provided for personal backup and archival.", "", ] return "\n".join(lines) + "\n" @@ -1466,6 +1509,12 @@ def generate_wiki_tools() -> str: "| `retrodeck_scraper` | component manifests | JSON per component |", "| `coreinfo_scraper` | .info files from libretro-core-info | INI-like |", "", + "Internal modules: `base_scraper.py` (abstract base with `_fetch_raw()` caching", + "and shared CLI), `dat_parser.py` (clrmamepro DAT format parser).", + "", + "Adding a scraper: inherit `BaseScraper`, implement `fetch_requirements()`,", + "call `scraper_cli(YourScraper)` in `__main__`.", + "", ] return "\n".join(lines) + "\n"