初始提交
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
from dataclasses import dataclass
|
||||
from typing import Annotated, Literal
|
||||
|
||||
import typer
|
||||
|
||||
from cli.completion.providers import COMPLETION_PROVIDER_GATEWAY
|
||||
|
||||
|
||||
@dataclass
|
||||
class CliContext:
|
||||
"""
|
||||
CLI 运行上下文。
|
||||
|
||||
env: 当前命令使用的环境名称
|
||||
output: 结果输出格式
|
||||
operator: 操作者标识,后续用于审计
|
||||
allow_prod: 是否显式允许生产环境执行危险命令
|
||||
yes: 是否跳过二次确认
|
||||
dry_run: 是否执行演练模式
|
||||
"""
|
||||
|
||||
env: str = 'dev'
|
||||
output: Literal['text', 'json'] = 'text'
|
||||
operator: str | None = None
|
||||
allow_prod: bool = False
|
||||
yes: bool = False
|
||||
dry_run: bool = False
|
||||
|
||||
|
||||
class CliContextBuilder:
|
||||
"""
|
||||
CLI 上下文构建器。
|
||||
|
||||
该对象负责将命令层显式参数收口为统一的 `CliContext` 数据对象,
|
||||
供上下文工厂与测试场景复用。
|
||||
"""
|
||||
|
||||
@staticmethod
|
||||
def build(
|
||||
env: str,
|
||||
output: Literal['text', 'json'],
|
||||
allow_prod: bool,
|
||||
yes: bool,
|
||||
dry_run: bool,
|
||||
) -> CliContext:
|
||||
"""
|
||||
构建命令执行上下文。
|
||||
|
||||
:param env: 当前命令环境
|
||||
:param output: 输出格式
|
||||
:param allow_prod: 是否允许生产环境危险命令
|
||||
:param yes: 是否跳过二次确认
|
||||
:param dry_run: 是否执行演练模式
|
||||
:return: 构建完成的 CLI 上下文
|
||||
"""
|
||||
return CliContext(
|
||||
env=env,
|
||||
output=output,
|
||||
allow_prod=allow_prod,
|
||||
yes=yes,
|
||||
dry_run=dry_run,
|
||||
)
|
||||
|
||||
|
||||
CLI_CONTEXT_BUILDER = CliContextBuilder()
|
||||
|
||||
EnvOption = Annotated[
|
||||
str,
|
||||
typer.Option('--env', help='运行环境名称', autocompletion=COMPLETION_PROVIDER_GATEWAY.complete_env_values),
|
||||
]
|
||||
OutputOption = Annotated[Literal['text', 'json'], typer.Option('--output', help='输出格式,支持 text 或 json')]
|
||||
AllowProdOption = Annotated[bool, typer.Option('--allow-prod', help='允许在生产环境中执行危险命令')]
|
||||
YesOption = Annotated[bool, typer.Option('--yes', help='跳过危险命令确认')]
|
||||
DryRunOption = Annotated[bool, typer.Option('--dry-run', help='仅执行预演,不落地实际变更')]
|
||||
Reference in New Issue
Block a user