iter49-卡1:效果端口与掷格分件批(轴戊两件建件):EffectPort六Callable路由+RewardRoller掷格面迁出+两业务类零引擎直连+effect_port_test V1-V3
This commit is contained in:
1 parent
926b05a61c
commit
11beb4fc59
31 files changed
+697
-586
No files matched your search
+19
-24
@@ -2,7 +2,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
r"""extract_checks.py — 断言静态提取器(验证集清单生成与出口对账)
|
||||
|
||||
机器提取宿主脚本的全部静态断言调用点(每个调用点记录:所在文件、所在函数、
|
||||
机器提取宿主脚本的全部静态 check( 调用点(每个调用点记录:所在文件、所在函数、
|
||||
行号、标签字符串字面量原文、cond 表达式原文),提供两种模式:
|
||||
|
||||
用法:
|
||||
@@ -19,11 +19,10 @@ r"""extract_checks.py — 断言静态提取器(验证集清单生成与出口
|
||||
断言,对账时以「新增」出现(非迁移面),出口判定以显式模式为准。
|
||||
|
||||
提取口径:
|
||||
- 静态断言调用点,三通道都认:smoke/系统宿主的 check(cond, label)(cond 在前)、
|
||||
单元/集成宿主的 Kit.check("label", cond)(点前缀=标签在前)、静默收集通道
|
||||
Kit.check_quiet(cond, label)(cond 在前,条目 quiet 列记 channel:check_quiet);
|
||||
`_check(` 等同名前缀调用非标准通道,不取。
|
||||
- 调用点可跨行:从调用名起括号配平归集完整实参文本(() [] {} 三种括号都计深度);
|
||||
- 静态 check( 调用点,两种通道都认:smoke/系统宿主的 check(cond, label)(cond 在前)
|
||||
与单元/集成宿主的 Kit.check("label", cond)(点前缀=标签在前);`_check(` 等同名
|
||||
前缀调用非标准通道,不取。
|
||||
- 调用点可跨行:从 `check(` 起括号配平归集完整实参文本(() [] {} 三种括号都计深度);
|
||||
字符串字面量内的括号/逗号/井号、行尾注释、转义序列均不参与结构判定(码位掩码单趟预扫)。
|
||||
- cond 摘要=cond 原文跨行折叠为单行(连续空白并一空格);标签原文=标签实参里的字符串
|
||||
字面量逐字保真(含引号与转义序列原样,禁改写);标签实参若带格式化/拼接后缀
|
||||
@@ -65,8 +64,8 @@ def default_sources():
|
||||
files.extend(sorted(p.rglob("*.gd")))
|
||||
return sorted(files)
|
||||
|
||||
CALL_RE = re.compile(r"check(?:_quiet)?\(")
|
||||
DEF_RE = re.compile(r"^\s*(static\s+)?func\s+check(?:_quiet)?\s*\(")
|
||||
CALL_RE = re.compile(r"check\(")
|
||||
DEF_RE = re.compile(r"^\s*(static\s+)?func\s+check\s*\(")
|
||||
FUNC_RE = re.compile(r"^(static\s+)?func\s+([A-Za-z_][A-Za-z0-9_]*)")
|
||||
LITERAL_RE = re.compile(r'"((?:[^"\\]|\\.)*)"')
|
||||
OPENERS = "([{"
|
||||
@@ -189,9 +188,9 @@ def split_args(body):
|
||||
return args
|
||||
|
||||
|
||||
def collect_call(joined, start, call_len):
|
||||
"""从调用名起点起括号配平归集调用。返回 (body, end_pos);不配平返回 None。"""
|
||||
i = start + call_len
|
||||
def collect_call(joined, start):
|
||||
"""从 check( 的 start 起括号配平归集调用。返回 (body, end_pos);不配平返回 None。"""
|
||||
i = start + len("check(")
|
||||
depth = 1
|
||||
in_str = False
|
||||
parts = []
|
||||
@@ -229,7 +228,7 @@ def collect_call(joined, start, call_len):
|
||||
|
||||
|
||||
def extract(src_path: Path):
|
||||
"""提取单文件全部静态断言调用点(check/check_quiet)。返回(条目列表, 函数表),条目保持源码顺序。"""
|
||||
"""提取单文件全部静态 check( 调用点。返回(条目列表, 函数表),条目保持源码顺序。"""
|
||||
src = src_path.read_text(encoding="utf-8")
|
||||
lines = src.split("\n")
|
||||
funcs = func_table(lines)
|
||||
@@ -248,32 +247,28 @@ def extract(src_path: Path):
|
||||
entries = []
|
||||
for m in CALL_RE.finditer(joined):
|
||||
if not mask[m.start()]:
|
||||
continue # 字符串字面量内 / 注释里的调用名字样
|
||||
continue # 字符串字面量内 / 注释里的 check( 字样
|
||||
ln = line_of(m.start())
|
||||
if DEF_RE.match(lines[ln - 1]):
|
||||
continue # func check / func check_quiet 定义行
|
||||
continue # func check 定义行
|
||||
prev = joined[m.start() - 1] if m.start() > 0 else ""
|
||||
if prev and (prev.isalnum() or prev == "_"):
|
||||
continue # `_check(` 等同名前缀——非标准通道
|
||||
is_quiet = m.group(0).startswith("check_quiet")
|
||||
if is_quiet:
|
||||
label_first = False # Kit.check_quiet(cond, label)——cond 在前
|
||||
else:
|
||||
label_first = prev == "." # Kit.check("label", cond)——点前缀=标签在前
|
||||
body, end_pos = collect_call(joined, m.start(), len(m.group(0)))
|
||||
label_first = prev == "." # Kit.check("label", cond)——点前缀=标签在前
|
||||
body, end_pos = collect_call(joined, m.start())
|
||||
if body is None:
|
||||
raise SystemExit("[extract_checks] FAIL:%s 行 %d 起的断言调用括号不配平到文件尾——先查解析缺口"
|
||||
raise SystemExit("[extract_checks] FAIL:%s 行 %d 起的 check( 括号不配平到文件尾——先查解析缺口"
|
||||
% (src_path.name, ln))
|
||||
args = split_args(body)
|
||||
if len(args) not in (2, 3):
|
||||
raise SystemExit(
|
||||
"[extract_checks] FAIL:%s 行 %d 的断言调用拆出 %d 个实参(预期 2/3)——解析缺口,先查再跑"
|
||||
"[extract_checks] FAIL:%s 行 %d 的 check( 拆出 %d 个实参(预期 2/3)——解析缺口,先查再跑"
|
||||
% (src_path.name, ln, len(args)))
|
||||
if label_first:
|
||||
label_expr, cond = args[0], args[1]
|
||||
else:
|
||||
cond, label_expr = args[0], args[1]
|
||||
quiet = "channel:check_quiet" if is_quiet else (args[2] if len(args) == 3 else "")
|
||||
quiet = args[2] if len(args) == 3 else ""
|
||||
lm = LITERAL_RE.search(label_expr)
|
||||
if lm is None:
|
||||
continue # 标签实参无字面量(wrapper 直传变量——既有套件先例 reward_overlay_test _req)
|
||||
@@ -341,7 +336,7 @@ def render_list(entries, funcs_by_src, src_names, carry=None) -> str:
|
||||
out.append("# 验证集清单(断言快照·冻结)")
|
||||
out.append("")
|
||||
out.append("> 生成日期:%s · 基点 commit:`%s` · 源:%s" % (date.today().isoformat(), base_commit(), "、".join(src_names)))
|
||||
out.append("> 提取口径:静态 `check(`/`check_quiet(` 调用点,括号配平归集(可跨行);缺省源=三宿主遍历")
|
||||
out.append("> 提取口径:静态 `check(` 调用点,括号配平归集(可跨行);缺省源=三宿主遍历")
|
||||
out.append("> (unit/**+integration/**+system_test.gd)。本基点实测 %d 个静态调用点;行级" % len(entries))
|
||||
out.append("> `grep -c \"check(\"` 是另一口径(含 `func check(` 定义行与注释行),两口径各自浮动,")
|
||||
out.append("> 禁互相换算(tests/README「断言计数双口径」)。运行时计数大于静态计数=循环展开条目。")
|
||||
|
||||
Reference in new issue
Block a user