v1: executing-plans 模式生成,54 文件 1320 行 Python
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
from .field_tree import Field, FieldTree
|
||||
from .test_case import TestCase, TestSuite, SparkConfig
|
||||
from .diff_result import FieldResult, VerificationRun
|
||||
@@ -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 != ""
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user