51 lines
2.2 KiB
Python
51 lines
2.2 KiB
Python
"""Точка входа: `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())
|