#!/usr/bin/env python3 """Create XML fixtures for learning 1C form button CommandName storage.""" from __future__ import annotations import argparse import json import shutil from pathlib import Path DEFAULT_SOURCE = Path( r"\\nas\MST\codex\1C\XML\UPO\Структура базы 1с\Расширения\фс_ДоработкиОбщее\DataProcessors\фс_НастройкаУсловногоОформления\Forms\ТестНастройки\Ext\Form.xml" ) DEFAULT_OUTPUT_DIR = Path("reports/1c-sql/upo_test/xml-command-binding-fixtures") VARIANTS = [ { "id": "01-local-button-command-example1", "description": "Change only ФормаКомандаОбновить CommandName from КомандаПрименить to КомандаПример1.", "replacements": [ ( "", "\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t", ) ], }, ] def apply_variant(text: str, replacements: list[tuple[str, str]]) -> str: result = text for old, new in replacements: if old not in result: raise ValueError(f"Could not find expected XML fragment: {old[:120]!r}") result = result.replace(old, new, 1) return result def main() -> int: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--source", type=Path, default=DEFAULT_SOURCE) parser.add_argument("--output-dir", type=Path, default=DEFAULT_OUTPUT_DIR) args = parser.parse_args() source_text = args.source.read_text(encoding="utf-8-sig") args.output_dir.mkdir(parents=True, exist_ok=True) baseline = args.output_dir / "00-original" / "Form.xml" baseline.parent.mkdir(parents=True, exist_ok=True) shutil.copyfile(args.source, baseline) manifest = { "schema": "onec_form_command_binding_xml_fixtures.v1", "source": str(args.source), "output_dir": str(args.output_dir), "baseline": str(baseline), "variants": [], } for variant in VARIANTS: variant_dir = args.output_dir / variant["id"] variant_dir.mkdir(parents=True, exist_ok=True) output = variant_dir / "Form.xml" output.write_text(apply_variant(source_text, variant["replacements"]), encoding="utf-8") manifest["variants"].append( { "id": variant["id"], "description": variant["description"], "form_xml": str(output), "replacements": len(variant["replacements"]), } ) manifest_path = args.output_dir / "manifest.json" manifest_path.write_text(json.dumps(manifest, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") print(json.dumps({"status": "ok", "manifest": str(manifest_path), "variants": len(VARIANTS)}, ensure_ascii=False, indent=2)) return 0 if __name__ == "__main__": raise SystemExit(main())