chore: 规范标点
This commit is contained in:
1 parent
e54390a9f8
commit
15e79887fa
84 files changed
+5439
-5398
No files matched your search
+28
-28
@@ -1,13 +1,13 @@
|
||||
#!/usr/bin/env python3
|
||||
"""shell_screen_check.py - 验证 /shell 记录里对全屏程序的处理
|
||||
|
||||
交互式 shell 的原始输出里混着转义序列、重绘空格和全屏程序的整屏画面。
|
||||
不清洗的话模型看到的就是几百个空格加一串光标定位;清过头又会把命令和
|
||||
状态行一起吃掉。这里用 printf 造出确定的输入来钉住行为:
|
||||
交互式 shell 的原始输出里混着转义序列、重绘空格和全屏程序的整屏画面.
|
||||
不清洗的话模型看到的就是几百个空格加一串光标定位; 清过头又会把命令和
|
||||
状态行一起吃掉. 这里用 printf 造出确定的输入来钉住行为:
|
||||
|
||||
1. 备用屏幕(vim/less/top 走这条路)——画面必须省略,只留首尾标记;
|
||||
2. 成片空格(nano/top 靠空格重绘)——必须压掉,但短缩进要原样保留;
|
||||
3. 大输出里夹着的备用屏幕——跨 read 也要能认出来。
|
||||
1. 备用屏幕 (vim/less/top 走这条路)——画面必须省略, 只留首尾标记;
|
||||
2. 成片空格 (nano/top 靠空格重绘)——必须压掉, 但短缩进要原样保留;
|
||||
3. 大输出里夹着的备用屏幕——跨 read 也要能认出来.
|
||||
|
||||
用法:
|
||||
shell_screen_check.py <ligent 二进制> <mock base-url>
|
||||
@@ -27,18 +27,18 @@ NORMAL_TEXT = "正常输出"
|
||||
|
||||
|
||||
def drive(binary, base, commands, wait=1.6, term="xterm-256color"):
|
||||
"""在 pty 里跑 ligent,进 /shell 执行 commands,导出后返回记录文本。
|
||||
"""在 pty 里跑 ligent, 进 /shell 执行 commands, 导出后返回记录文本.
|
||||
|
||||
term=None 表示不设 TERM,用来观察退化行为。"""
|
||||
term=None 表示不设 TERM, 用来观察退化行为. """
|
||||
saved = os.environ.copy()
|
||||
os.environ["LIGENT_API_KEY"] = "sk-test"
|
||||
# 没有 TERM 的话 less/vim 会退回非全屏模式,测不到备用屏幕那条路。
|
||||
# 没有 TERM 的话 less/vim 会退回非全屏模式, 测不到备用屏幕那条路.
|
||||
if term is None:
|
||||
os.environ.pop("TERM", None)
|
||||
else:
|
||||
os.environ["TERM"] = term
|
||||
|
||||
# 每轮都清空归档:归档名是随机的,按文件名排序取"最后一个"会拿到上一轮。
|
||||
# 每轮都清空归档:归档名是随机的, 按文件名排序取"最后一个"会拿到上一轮.
|
||||
bindir = os.path.dirname(os.path.abspath(binary))
|
||||
shutil.rmtree(os.path.join(bindir, "ligent.archive"), ignore_errors=True)
|
||||
|
||||
@@ -47,9 +47,9 @@ def drive(binary, base, commands, wait=1.6, term="xterm-256color"):
|
||||
os.execv(binary, [binary, "--base-url", base, "--no-confirm", "--auto-save"])
|
||||
os._exit(127)
|
||||
|
||||
# 行编辑器每次回到提示符都会打开括号粘贴 —— 用它当"轮到输入了"的信号。
|
||||
# 只按"输出安静"等是不行的:等待动画每 250ms 画一帧,pty 永远不会安静
|
||||
# 超过 idle,于是每次都要白等满整个额度。
|
||||
# 行编辑器每次回到提示符都会打开括号粘贴 —— 用它当"轮到输入了"的信号.
|
||||
# 只按"输出安静"等是不行的:等待动画每 250ms 画一帧, pty 永远不会安静
|
||||
# 超过 idle, 于是每次都要白等满整个额度.
|
||||
PROMPT_READY = b"\x1b[?2004h"
|
||||
ready_seen = 0
|
||||
tail = b""
|
||||
@@ -104,11 +104,11 @@ def drive(binary, base, commands, wait=1.6, term="xterm-256color"):
|
||||
return users[-1] if users else ""
|
||||
|
||||
|
||||
def between_markers(rec, start="[全屏程序运行中,画面内容已省略]", end="[全屏程序结束]"):
|
||||
"""取出"全屏程序"首尾标记之间的内容。
|
||||
def between_markers(rec, start="[全屏程序运行中, 画面内容已省略]", end="[全屏程序结束]"):
|
||||
"""取出"全屏程序"首尾标记之间的内容.
|
||||
|
||||
命令回显必然把输入里的字面文本也录进去,所以不能直接断言"机密文本不在
|
||||
记录里"——只能断言它没出现在真正被省略的那段区间内。"""
|
||||
命令回显必然把输入里的字面文本也录进去, 所以不能直接断言"机密文本不在
|
||||
记录里"——只能断言它没出现在真正被省略的那段区间内. """
|
||||
parts = rec.split(start)
|
||||
if len(parts) < 2:
|
||||
return None
|
||||
@@ -135,8 +135,8 @@ def main():
|
||||
fails += 1
|
||||
print(" ✗ %s%s" % (name, (" " + detail) if detail else ""))
|
||||
|
||||
# ---- 1. 备用屏幕:画面省略,只留首尾标记 ----
|
||||
print("备用屏幕(vim/less 路径)")
|
||||
# ---- 1. 备用屏幕:画面省略, 只留首尾标记 ----
|
||||
print("备用屏幕 (vim/less 路径)")
|
||||
rec = drive(binary, base, [
|
||||
r"printf '\033[?1049h" + ALT_TEXT + r"\033[?1049l'",
|
||||
"echo " + NORMAL_TEXT,
|
||||
@@ -154,8 +154,8 @@ def main():
|
||||
check("标记之外的输出还在", NORMAL_TEXT in rec)
|
||||
check("记录里没有裸转义符", "\x1b" not in rec)
|
||||
|
||||
# ---- 2. 成片空格:压掉,但缩进保留 ----
|
||||
print("成片空格(nano/top 重绘路径)")
|
||||
# ---- 2. 成片空格:压掉, 但缩进保留 ----
|
||||
print("成片空格 (nano/top 重绘路径)")
|
||||
rec = drive(binary, base, [
|
||||
r"printf 'A'; printf '%0.s ' $(seq 1 200); printf 'B\n'",
|
||||
r"printf ' 缩进四个空格\n'",
|
||||
@@ -171,7 +171,7 @@ def main():
|
||||
check("空白占比低于 40%", blank < 0.40, "实际 %.0f%%" % (100 * blank))
|
||||
|
||||
# ---- 3. 大输出里夹着的备用屏幕 ----
|
||||
print("大输出(跨 read)里的备用屏幕")
|
||||
print("大输出 (跨 read)里的备用屏幕")
|
||||
rec = drive(binary, base, [
|
||||
"head -c 8000 /dev/zero | tr '\\0' 'x'; printf '\\033[?1049h"
|
||||
+ ALT_TEXT + "\\033[?1049l'",
|
||||
@@ -185,7 +185,7 @@ def main():
|
||||
"切断后漏了画面")
|
||||
check("跨块标记成对出现", body is not None)
|
||||
|
||||
# ---- 4. 同一个会话里进两次全屏,标记必须成对 ----
|
||||
# ---- 4. 同一个会话里进两次全屏, 标记必须成对 ----
|
||||
print("连续两次进入全屏")
|
||||
rec = drive(binary, base, [
|
||||
r"printf '\033[?1049hAAA\033[?1049l'; printf '\033[?1049hBBB\033[?1049l'",
|
||||
@@ -194,14 +194,14 @@ def main():
|
||||
check("拿到记录", False, "没有生成归档")
|
||||
return 1
|
||||
check("拿到记录", True)
|
||||
check("两次开始标记", rec.count("[全屏程序运行中,画面内容已省略]") == 2,
|
||||
"实际 %d 个" % rec.count("[全屏程序运行中,画面内容已省略]"))
|
||||
check("两次开始标记", rec.count("[全屏程序运行中, 画面内容已省略]") == 2,
|
||||
"实际 %d 个" % rec.count("[全屏程序运行中, 画面内容已省略]"))
|
||||
check("两次结束标记", rec.count("[全屏程序结束]") == 2,
|
||||
"实际 %d 个" % rec.count("[全屏程序结束]"))
|
||||
|
||||
# ---- 5. TERM 退化时补一个像样的值 ----
|
||||
# TERM=dumb 时 nano 会放弃备用屏幕、改成逐行重绘,整段忽略就失效了。
|
||||
# 而 ligent 自己的 REPL 就在用光标定位,说明终端并非真的 dumb。
|
||||
# TERM=dumb 时 nano 会放弃备用屏幕、改成逐行重绘, 整段忽略就失效了.
|
||||
# 而 ligent 自己的 REPL 就在用光标定位, 说明终端并非真的 dumb.
|
||||
for bad in ("dumb", None):
|
||||
label = "TERM=%s" % (bad if bad else "(未设置)")
|
||||
print("退化的 %s" % label)
|
||||
@@ -213,7 +213,7 @@ def main():
|
||||
"实际记录:%s" % rec.strip().replace("\n", " | ")[-80:])
|
||||
|
||||
shutil.rmtree(archive, ignore_errors=True)
|
||||
print("\n%d 项检查,%d 项失败" % (total, fails))
|
||||
print("\n%d 项检查, %d 项失败" % (total, fails))
|
||||
return 1 if fails else 0
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user