"""Точка входа: `python -m synthgen --config synthgen/examples/default.yaml --set group_size=12 --out DIR`. Генерирует набор (спека §7) и печатает путь и сводку. Каталог результата по умолчанию — `./out/`; непустой каталог без `--force` — код 3. """ import argparse import sys from dataclasses import replace from pathlib import Path from synthgen import generate from synthgen.config import ConfigError, load_config def _parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser(prog="synthgen", description="Генератор синтетического набора АРМ КА.") parser.add_argument("--config", type=Path, default=None, help="YAML с настройками") parser.add_argument( "--set", dest="overrides", action="append", default=[], metavar="КЛЮЧ=ЗНАЧЕНИЕ", help="переопределение настройки (можно повторять)", ) parser.add_argument("--out", type=Path, default=None, help="каталог результата (по умолчанию ./out/)") parser.add_argument("--force", action="store_true", help="очистить и перезаписать непустой каталог результата") return parser def main(argv: list[str] | None = None) -> int: args = _parser().parse_args(argv) try: cfg = load_config(args.config, args.overrides) except ConfigError as exc: print(f"ошибка конфигурации: {exc}", file=sys.stderr) return 2 if args.out is not None: cfg = replace(cfg, out=args.out) out = generate.default_out(cfg) try: manifest = generate.generate(cfg, out, force=args.force) except FileExistsError as exc: print(f"{exc}", file=sys.stderr) return 3 mismatches = sum(len(p.mismatches) for p in manifest.pairs) print(f"Набор записан: {out}") print(f"файлов: {len(manifest.files)}; пар ВГО: {len(manifest.pairs)}; расхождений: {mismatches}") return 0 if __name__ == "__main__": raise SystemExit(main())