Initial SQL-only 1C adapter baseline
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Capture and summarize the two remaining 1C form command-binding learning cases."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import time
|
||||
import urllib.request
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
|
||||
DEFAULT_BASE_URL = "http://docker-gpu.cin.su:8011"
|
||||
DEFAULT_BASE_ID = "upo_test"
|
||||
DEFAULT_TABLE = "ConfigCASSave"
|
||||
DEFAULT_FILE_NAME = "f96a0c45-3eff-11f1-8287-005056b0d483__25c39fbf-35a4-4b43-8e3f-cd1f91082c88.0"
|
||||
DEFAULT_REPORT = Path("reports/1c-sql/upo_test/form-command-binding-learning-run.json")
|
||||
|
||||
CASES = [
|
||||
{
|
||||
"learning_id": "form-command-binding-local-apply-command",
|
||||
"element": "ФормаКомандаОбновить",
|
||||
"property": "ИмяКоманды",
|
||||
"expected_xml": "Form.Command.КомандаПрименить",
|
||||
},
|
||||
{
|
||||
"learning_id": "form-command-binding-standard-customize-form",
|
||||
"element": "ТЗИзменитьФорму",
|
||||
"property": "ИмяКоманды",
|
||||
"expected_xml": "Form.StandardCommand.CustomizeForm",
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
def rpc(base_url: str, method: str, payload: dict[str, Any], timeout: int) -> dict[str, Any]:
|
||||
req = urllib.request.Request(
|
||||
f"{base_url.rstrip('/')}/rpc",
|
||||
data=json.dumps({"method": method, "payload": payload}, ensure_ascii=False).encode("utf-8"),
|
||||
headers={"Content-Type": "application/json"},
|
||||
)
|
||||
with urllib.request.urlopen(req, timeout=timeout) as response:
|
||||
return json.loads(response.read().decode("utf-8"))
|
||||
|
||||
|
||||
def storage_sha(base_url: str, base_id: str, table: str, file_name: str, timeout: int) -> str | None:
|
||||
result = rpc(
|
||||
base_url,
|
||||
"metadata.write_learning.capture_after",
|
||||
{
|
||||
"base_id": base_id,
|
||||
"learning_id": "_command_binding_probe",
|
||||
"table": table,
|
||||
"file_name": file_name,
|
||||
"timeout_seconds": timeout,
|
||||
"max_items": 5000,
|
||||
},
|
||||
timeout,
|
||||
)
|
||||
storage = result.get("storage") if isinstance(result.get("storage"), dict) else {}
|
||||
return storage.get("sha1")
|
||||
|
||||
|
||||
def run_case(base_url: str, base_id: str, table: str, file_name: str, case: dict[str, str], timeout: int) -> dict[str, Any]:
|
||||
capture_payload = {
|
||||
"base_id": base_id,
|
||||
"learning_id": case["learning_id"],
|
||||
"table": table,
|
||||
"file_name": file_name,
|
||||
"form": "ТестНастройки",
|
||||
"element": case["element"],
|
||||
"property": case["property"],
|
||||
"timeout_seconds": timeout,
|
||||
"max_items": 5000,
|
||||
}
|
||||
after = rpc(base_url, "metadata.write_learning.capture_after", capture_payload, timeout)
|
||||
diff = rpc(base_url, "metadata.write_learning.diff", {"learning_id": case["learning_id"]}, timeout)
|
||||
infer = rpc(base_url, "metadata.write_learning.infer_rule", {"learning_id": case["learning_id"]}, timeout)
|
||||
return {
|
||||
"learning_id": case["learning_id"],
|
||||
"element": case["element"],
|
||||
"property": case["property"],
|
||||
"expected_xml": case["expected_xml"],
|
||||
"after": after,
|
||||
"diff": diff,
|
||||
"infer_rule": infer,
|
||||
}
|
||||
|
||||
|
||||
def main() -> int:
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("--base-url", default=DEFAULT_BASE_URL)
|
||||
parser.add_argument("--base-id", default=DEFAULT_BASE_ID)
|
||||
parser.add_argument("--table", default=DEFAULT_TABLE)
|
||||
parser.add_argument("--file-name", default=DEFAULT_FILE_NAME)
|
||||
parser.add_argument("--report", type=Path, default=DEFAULT_REPORT)
|
||||
parser.add_argument("--timeout", type=int, default=60)
|
||||
parser.add_argument("--wait-for-sha-change", default="", help="Poll until storage sha1 differs from this value.")
|
||||
parser.add_argument("--poll-seconds", type=int, default=10)
|
||||
parser.add_argument("--max-wait-seconds", type=int, default=0)
|
||||
args = parser.parse_args()
|
||||
|
||||
waited = 0
|
||||
observed_sha = None
|
||||
if args.wait_for_sha_change:
|
||||
while True:
|
||||
observed_sha = storage_sha(args.base_url, args.base_id, args.table, args.file_name, args.timeout)
|
||||
if observed_sha and observed_sha != args.wait_for_sha_change:
|
||||
break
|
||||
if args.max_wait_seconds and waited >= args.max_wait_seconds:
|
||||
break
|
||||
time.sleep(max(1, args.poll_seconds))
|
||||
waited += max(1, args.poll_seconds)
|
||||
|
||||
cases = [run_case(args.base_url, args.base_id, args.table, args.file_name, case, args.timeout) for case in CASES]
|
||||
report = {
|
||||
"schema": "onec_form_command_binding_learning_run.v1",
|
||||
"status": "changed" if any((case.get("diff") or {}).get("status") == "changed" for case in cases) else "no_changes",
|
||||
"base_id": args.base_id,
|
||||
"source": {"table": args.table, "file_name": args.file_name},
|
||||
"wait": {"expected_old_sha1": args.wait_for_sha_change or None, "observed_sha1": observed_sha, "waited_seconds": waited},
|
||||
"cases": cases,
|
||||
}
|
||||
args.report.parent.mkdir(parents=True, exist_ok=True)
|
||||
args.report.write_text(json.dumps(report, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
|
||||
print(json.dumps({"status": report["status"], "report": str(args.report), "cases": [{ "learning_id": c["learning_id"], "diff_status": (c.get("diff") or {}).get("status"), "counts": (c.get("diff") or {}).get("counts")} for c in cases]}, ensure_ascii=False, indent=2))
|
||||
return 0 if report["status"] == "changed" else 2
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in New Issue
Block a user