Andrey Epifancev 004c21041c synthgen: сборка набора, README, детерминированность (#38)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-13 00:37:42 +04:00

51 lines
2.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Точка входа: `python -m synthgen --config synthgen/examples/default.yaml --set group_size=12 --out DIR`.
Генерирует набор (спека §7) и печатает путь и сводку. Каталог результата по умолчанию — `./out/<prefix>`;
непустой каталог без `--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/<prefix>)")
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())