Initial SQL-only 1C adapter baseline
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Build root CAS manifests for all parsed 1C extensions."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
from extract_1c_extension_cas_manifest import extract_manifest
|
||||
|
||||
|
||||
def safe_name(value: str) -> str:
|
||||
result = "".join(char if char.isalnum() or char in "-_." else "_" for char in value)
|
||||
return result[:120] or "extension"
|
||||
|
||||
|
||||
def main() -> int:
|
||||
parser = argparse.ArgumentParser(description="Build CAS manifests for all extensions.")
|
||||
parser.add_argument("--zipped-info", type=Path, required=True)
|
||||
parser.add_argument("--cas-dir", type=Path, required=True)
|
||||
parser.add_argument("--output-dir", type=Path, required=True)
|
||||
parser.add_argument("--summary", type=Path, required=True)
|
||||
args = parser.parse_args()
|
||||
|
||||
zipped = json.loads(args.zipped_info.read_text(encoding="utf-8"))
|
||||
args.output_dir.mkdir(parents=True, exist_ok=True)
|
||||
items = []
|
||||
for item in zipped.get("items") or []:
|
||||
root_key = item.get("root_cas_key")
|
||||
if not root_key:
|
||||
continue
|
||||
root_path = args.cas_dir / root_key
|
||||
if not root_path.is_file():
|
||||
items.append({**item, "manifest_status": "root_cas_missing"})
|
||||
continue
|
||||
try:
|
||||
manifest = extract_manifest(root_path, args.cas_dir)
|
||||
except Exception as exc:
|
||||
items.append(
|
||||
{
|
||||
"extension_zipped_info_file": item.get("file_name"),
|
||||
"root_cas_key": root_key,
|
||||
"manifest_status": "parse_error",
|
||||
"error": str(exc),
|
||||
}
|
||||
)
|
||||
continue
|
||||
stem = safe_name(item.get("file_name", "").replace("__ExtensionZippedInfo.bin", ""))
|
||||
output_path = args.output_dir / f"{stem}-{root_key[:8]}.json"
|
||||
report = {
|
||||
"schema": "onec_extension_cas_manifest.v1",
|
||||
"extension_zipped_info": item,
|
||||
**manifest,
|
||||
}
|
||||
output_path.write_text(json.dumps(report, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
|
||||
items.append(
|
||||
{
|
||||
"extension_zipped_info_file": item.get("file_name"),
|
||||
"root_cas_key": root_key,
|
||||
"manifest_path": str(output_path),
|
||||
"extension_configuration_guid": manifest.get("extension_configuration_guid"),
|
||||
"declared_count": manifest.get("declared_count"),
|
||||
"entry_count": manifest.get("entry_count"),
|
||||
"missing_cas_entries": sum(1 for entry in manifest.get("entries") or [] if not entry.get("cas_exists")),
|
||||
"manifest_status": "ok",
|
||||
}
|
||||
)
|
||||
summary = {
|
||||
"schema": "onec_extension_manifests_summary.v1",
|
||||
"zipped_info": str(args.zipped_info),
|
||||
"cas_dir": str(args.cas_dir),
|
||||
"output_dir": str(args.output_dir),
|
||||
"extension_count": len(items),
|
||||
"items": items,
|
||||
}
|
||||
args.summary.parent.mkdir(parents=True, exist_ok=True)
|
||||
args.summary.write_text(json.dumps(summary, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
|
||||
print(
|
||||
json.dumps(
|
||||
{
|
||||
"summary": str(args.summary),
|
||||
"extensions": len(items),
|
||||
"ok": sum(1 for item in items if item.get("manifest_status") == "ok"),
|
||||
},
|
||||
ensure_ascii=False,
|
||||
)
|
||||
)
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in New Issue
Block a user