ShiErFeng/shierfeng-fastapi-backend/cli/groups/dev/presenter.py
2026-07-24 09:43:10 +08:00

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 '-'