v1: executing-plans 模式生成,54 文件 1320 行 Python

This commit is contained in:
hangshuo652
2026-05-24 10:02:52 +08:00
commit 06b295f780
55 changed files with 1749 additions and 0 deletions
+3
View File
@@ -0,0 +1,3 @@
from .field_tree import Field, FieldTree
from .test_case import TestCase, TestSuite, SparkConfig
from .diff_result import FieldResult, VerificationRun
+52
View File
@@ -0,0 +1,52 @@
from __future__ import annotations
from dataclasses import dataclass, field
from datetime import datetime
from typing import Optional
@dataclass
class FieldResult:
field_name: str = ""
status: str = "PASS"
cobol_value: str = ""
java_value: str = ""
tolerance_applied: float = 0.0
rounding_detected: str = ""
suggestion: str = ""
@dataclass
class VerificationRun:
program: str = ""
timestamp: str = ""
status: str = "PASS"
exit_code: int = 0
duration_s: float = 0.0
fields_matched: int = 0
fields_mismatched: int = 0
coverage_target: str = "boundary"
field_results: list[FieldResult] = field(default_factory=list)
runner: str = "native"
branch_rate: float = 0.0
llm_cost: float = 0.0
report_path: str = ""
def __post_init__(self):
if not self.timestamp:
self.timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
def verdict(self) -> str:
return self.status
@property
def total_fields(self) -> int:
return self.fields_matched + self.fields_mismatched
_fr = FieldResult(field_name="BR-AMT", status="MISMATCH")
assert _fr.status == "MISMATCH"
_vr = VerificationRun(program="BILL-CALC", runner="spark")
assert _vr.program == "BILL-CALC"
assert _vr.runner == "spark"
assert _vr.timestamp != ""
+54
View File
@@ -0,0 +1,54 @@
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class Field:
name: str
level: int
pic: str
usage: str = "DISPLAY"
offset: int = 0
length: int = 0
decimal: int = 0
signed: bool = False
sign_separate: bool = False
occurs: Optional[int] = None
occurs_max: Optional[int] = None
redefines: Optional[str] = None
conditions: list[dict] = field(default_factory=list)
children: list["Field"] = field(default_factory=list)
@dataclass
class FieldTree:
fields: list[Field] = field(default_factory=list)
copybook_name: str = ""
sha256: str = ""
def flatten(self) -> dict[str, Field]:
result = {}
def _walk(ff):
for f in ff:
result[f.name] = f
_walk(f.children)
_walk(self.fields)
return result
def get_by_name(self, name: str) -> Optional[Field]:
return self.flatten().get(name)
@classmethod
def from_list(cls, fields: list[Field], name: str = "") -> "FieldTree":
return cls(fields=fields, copybook_name=name)
_f = Field(name="BR-AMT", level=5, pic="S9(7)V99", usage="COMP-3", offset=0, length=5, decimal=2, signed=True)
assert _f.name == "BR-AMT"
assert _f.decimal == 2
assert _f.signed == True
_ft = FieldTree(fields=[_f], copybook_name="BILLCPY")
assert "BR-AMT" in _ft.flatten()
assert _ft.get_by_name("BR-AMT") is _f
+41
View File
@@ -0,0 +1,41 @@
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class SparkConfig:
num_records: int = 100
replication: str = "key_varied"
key_field: str = ""
edge_cases: list[str] = field(default_factory=list)
@dataclass
class TestCase:
id: str
fields: dict = field(default_factory=dict)
coverage_targets: list[str] = field(default_factory=list)
@dataclass
class TestSuite:
schema: Optional[dict] = None
test_cases: list[TestCase] = field(default_factory=list)
spark_config: Optional[SparkConfig] = None
def with_spark(self, num_records: int = 1000, key_field: str = "") -> "TestSuite":
self.spark_config = SparkConfig(num_records=num_records, key_field=key_field)
return self
@property
def has_spark(self) -> bool:
return self.spark_config is not None
_tc = TestCase(id="TC-001", fields={"BR-AMT": 1500000, "BR-TYPE": "A"})
assert _tc.id == "TC-001"
assert _tc.fields["BR-AMT"] == 1500000
_ts = TestSuite(test_cases=[_tc], spark_config=SparkConfig(num_records=1000))
assert _ts.spark_config.num_records == 1000