97 lines
3.6 KiB
Python
97 lines
3.6 KiB
Python
class DevCommandPresenter:
|
|
"""
|
|
开发命令文本渲染器。
|
|
|
|
该渲染器负责将 `dev` 命令组产生的结构化 payload 转换为稳定的文本摘要,
|
|
同时保持 JSON 输出仍由控制器直接返回,不在此处做契约变形。
|
|
"""
|
|
|
|
def build_dev_lint_text(self, payload: dict[str, object]) -> str:
|
|
"""
|
|
将 lint 执行结果渲染为文本摘要。
|
|
|
|
:param payload: lint 执行结果字典
|
|
:return: 文本摘要
|
|
"""
|
|
targets = payload.get('targets')
|
|
lines = [
|
|
f'ok: {str(payload.get("ok", False)).lower()}',
|
|
f'env: {payload.get("env", "")}',
|
|
f'check_only: {str(payload.get("checkOnly", False)).lower()}',
|
|
f'fix: {str(payload.get("fix", False)).lower()}',
|
|
f'unsafe_fixes: {str(payload.get("unsafeFixes", False)).lower()}',
|
|
]
|
|
if isinstance(targets, list) and targets:
|
|
lines.append('targets:')
|
|
lines.extend(f' - {target}' for target in targets)
|
|
else:
|
|
lines.append('targets: none')
|
|
lines.extend(self._build_command_result_section('format', payload.get('format')))
|
|
lines.extend(self._build_command_result_section('check', payload.get('check')))
|
|
return '\n'.join(lines)
|
|
|
|
def build_dev_test_text(self, payload: dict[str, object]) -> str:
|
|
"""
|
|
将测试执行结果渲染为文本摘要。
|
|
|
|
:param payload: 测试执行结果字典
|
|
:return: 文本摘要
|
|
"""
|
|
targets = payload.get('targets')
|
|
lines = [
|
|
f'ok: {str(payload.get("ok", False)).lower()}',
|
|
f'env: {payload.get("env", "")}',
|
|
f'keyword: {payload.get("keyword", "") or "-"}',
|
|
f'maxfail: {payload.get("maxfail", 0)}',
|
|
f'quiet: {str(payload.get("quiet", False)).lower()}',
|
|
]
|
|
if isinstance(targets, list) and targets:
|
|
lines.append('targets:')
|
|
lines.extend(f' - {target}' for target in targets)
|
|
else:
|
|
lines.append('targets: none')
|
|
lines.extend(self._build_command_result_section('test', payload.get('test')))
|
|
return '\n'.join(lines)
|
|
|
|
@staticmethod
|
|
def _build_command_result_section(title: str, payload: dict[str, object] | None) -> list[str]:
|
|
"""
|
|
构建单个子命令执行结果段落。
|
|
|
|
:param title: 段落标题
|
|
:param payload: 子命令执行结果
|
|
:return: 文本行列表
|
|
"""
|
|
if not isinstance(payload, dict):
|
|
return [f'{title}: none']
|
|
|
|
lines = [
|
|
f'{title}:',
|
|
f' ok: {str(payload.get("ok", False)).lower()}',
|
|
f' return_code: {payload.get("returnCode", "-")}',
|
|
f' command: {DevCommandPresenter._format_command_text(payload.get("command"))}',
|
|
]
|
|
stdout = payload.get('stdout')
|
|
stderr = payload.get('stderr')
|
|
if stdout:
|
|
lines.append(' stdout:')
|
|
lines.append(' |')
|
|
lines.extend(f' {line}' for line in str(stdout).splitlines())
|
|
if stderr:
|
|
lines.append(' stderr:')
|
|
lines.append(' |')
|
|
lines.extend(f' {line}' for line in str(stderr).splitlines())
|
|
return lines
|
|
|
|
@staticmethod
|
|
def _format_command_text(command: object) -> str:
|
|
"""
|
|
将命令参数列表格式化为可读文本。
|
|
|
|
:param command: 命令参数列表
|
|
:return: 格式化后的命令文本
|
|
"""
|
|
if not isinstance(command, list):
|
|
return '-'
|
|
return ' '.join(str(item) for item in command) or '-'
|