Files
Nivora/tools/sync_readme_versions.py
T
Александр 8564f84ed5 fix: avoid substring collision in sync_readme_versions.py
Wrap the install command in backticks when matching README rows, so
nivora/claude no longer matches inside the nivora/claude-alt row.
2026-07-25 02:28:09 +10:00

72 lines
2.1 KiB
Python
Executable File

#!/usr/bin/env python3
from __future__ import annotations
import re
import shlex
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
README = ROOT / "README.md"
def package_metadata(package: str) -> tuple[str, list[str]]:
text = (ROOT / package / "Staplerfile").read_text(encoding="utf-8")
version_match = re.search(
r"^version=(?:'([^']+)'|\"([^\"]+)\"|([^#\s]+))",
text,
re.MULTILINE,
)
if not version_match:
raise RuntimeError(f"{package}: version is missing")
version = next(
value for value in version_match.groups() if value is not None
)
architectures_match = re.search(
r"^architectures=\((.*?)\)", text, re.MULTILINE | re.DOTALL
)
if not architectures_match:
raise RuntimeError(f"{package}: architectures are missing")
architectures = shlex.split(architectures_match.group(1))
if not architectures:
raise RuntimeError(f"{package}: architectures are empty")
return version, architectures
def main() -> None:
lines = README.read_text(encoding="utf-8").splitlines()
package_dirs = sorted(
path.parent.name for path in ROOT.glob("*/Staplerfile")
)
for package in package_dirs:
command = f"`stplr install nivora/{package}`"
version, architectures = package_metadata(package)
matching_lines = [
index
for index, line in enumerate(lines)
if line.startswith("|") and command in line
]
if len(matching_lines) != 1:
raise RuntimeError(
f"{package}: expected one README catalog row, "
f"got {len(matching_lines)}"
)
index = matching_lines[0]
cells = lines[index].split("|")
if len(cells) != 6:
raise RuntimeError(f"{package}: malformed README catalog row")
cells[2] = f" `{version}` "
cells[3] = " " + ", ".join(
f"`{architecture}`" for architecture in architectures
) + " "
lines[index] = "|".join(cells)
README.write_text("\n".join(lines) + "\n", encoding="utf-8")
if __name__ == "__main__":
main()