mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-10-23 20:29:06 -05:00
generate_site.py writes the Starlight project in website/ and nothing else: mkdocs.yml, the MkDocs hooks, theme overrides and stylesheet go, and the wiki is written in Starlight's syntax. Both workflows set up Node with the official actions/setup-node pinned by commit, run npm ci from the committed lockfile, build with the strict link validator and check the result with validate_site.py. The search weighs a page by what it answers: Start here pages first, a system page's cards and file names before a guide citing them, deep guides, launchers, aliases and frozen copies after. Status badges, hash blocks and the export change lists leave the index. The ranking sits at the centre of a range where the 13 queries of search_gate.py all answer, in the search box itself. 839 pages, every URL and 45,611 ids match the MkDocs build. The tests read the Starlight content and syntax.
47 lines
1.5 KiB
Python
47 lines
1.5 KiB
Python
"""The generated site pages, for the tests that read them.
|
|
|
|
generate_site.py writes each page into the Starlight project's content
|
|
collection, as .md or as .mdx when it uses a component. A test names a
|
|
page by its docs path (``which-pack.md``) and gets whichever file holds it.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
REPO_ROOT = Path(__file__).resolve().parents[1]
|
|
CONTENT = REPO_ROOT / "website" / "src" / "content" / "docs"
|
|
|
|
|
|
def require() -> Path:
|
|
"""The content folder, or a skip when the site was not generated (a
|
|
failure in CI, which generates it before the suite)."""
|
|
if not (CONTENT / "index.md").is_file():
|
|
if os.environ.get("CI"):
|
|
raise AssertionError("CI generates the site before the suite")
|
|
raise unittest.SkipTest("site not generated (python scripts/generate_site.py)")
|
|
return CONTENT
|
|
|
|
|
|
def page(name: str) -> Path:
|
|
"""The file of a page named by its docs path."""
|
|
stem = name[:-3] if name.endswith(".md") else name
|
|
for suffix in (".md", ".mdx"):
|
|
candidate = CONTENT / f"{stem}{suffix}"
|
|
if candidate.is_file():
|
|
return candidate
|
|
return CONTENT / f"{stem}.md"
|
|
|
|
|
|
def pages() -> list[Path]:
|
|
"""Every page file, sorted."""
|
|
root = require()
|
|
return sorted(p for p in root.rglob("*") if p.suffix in (".md", ".mdx"))
|
|
|
|
|
|
def name(path: Path) -> str:
|
|
"""A page file's docs path, the name tests use for it."""
|
|
return path.relative_to(CONTENT).with_suffix(".md").as_posix()
|