"""Generate source/Docker dependency files from the same module manifests.""" from __future__ import annotations import argparse import json from pathlib import Path ROOT = Path(__file__).resolve().parents[1] def generated(): modules = { p.stem: json.loads(p.read_text()) for p in (ROOT / "deeptutor/modules/manifests").glob("*.json") } header = "# Generated by scripts/sync_module_requirements.py; edit module manifests.\n" result = {} for name, row in modules.items(): dependencies = list(row["requirements"]) prefix = [] if name == "core" else ["-r ../core.txt"] if name != "core": prefix += [ f"-r {dependency}.txt" for dependency in row["requires"] if dependency != "core" ] filename = "core.txt" if name == "core" else f"modules/{name}.txt" result[filename] = header + "\n".join(prefix + dependencies) + "\n" result["cli.txt"] = header + "-r core.txt\n" result["server.txt"] = header + "-r modules/server.txt\n" result["full.txt"] = ( header + "\n".join( f"-r modules/{name}.txt" for name in sorted(modules) if name not in {"core", "renderer-manim"} and not name.startswith("parser-") ) + "\n" ) return result def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--check", action="store_true") args = parser.parse_args() for filename, content in generated().items(): path = ROOT / "requirements" / filename if args.check: if not path.exists() or path.read_text() != content: raise SystemExit(f"Stale dependency file: {path}") else: path.parent.mkdir(parents=True, exist_ok=True) path.write_text(content) if __name__ == "__main__": main()