Coverage for aipyapp/cli/command/cmd_role.py: 0%
82 statements
« prev ^ index » next coverage.py v7.10.3, created at 2025-08-11 12:02 +0200
« prev ^ index » next coverage.py v7.10.3, created at 2025-08-11 12:02 +0200
1import json
3from rich.tree import Tree
4from rich.syntax import Syntax
6from ... import T
7from .base import Completable
8from .base_parser import ParserCommand
9from .utils import print_records
11class RoleCommand(ParserCommand):
12 name = 'role'
13 description = T('Role operations')
15 def add_subcommands(self, subparsers):
16 # List subcommand
17 subparsers.add_parser('list', help=T('List available roles'))
19 # Show subcommand
20 show_parser = subparsers.add_parser('show', help=T('Show role details'))
21 show_parser.add_argument('role', type=str, help=T('Role name'))
23 # Use subcommand
24 use_parser = subparsers.add_parser('use', help=T('Use a role'))
25 use_parser.add_argument('role', type=str, help=T('Role name'))
27 def get_arg_values(self, arg, subcommand=None, partial_value=''):
28 if subcommand in ['show', 'use'] and arg.name == 'role':
29 ctx = self.manager.context
30 return [Completable(name, role.short) for name, role in ctx.tm.role_manager.roles.items()]
31 return super().get_arg_values(arg, subcommand)
33 def cmd_list(self, args, ctx):
34 rows = ctx.tm.list_roles()
35 print_records(rows)
37 def cmd_show(self, args, ctx):
38 role_name = args.role.lower()
39 role = ctx.tm.role_manager.roles.get(role_name)
40 if not role:
41 self.log.error(T('Role not found').format(args.role))
42 return
44 from rich.table import Table
45 from rich import print
47 # 基本信息表格
48 basic_table = Table(title=f"{T('Role Information')}: {role.name}", show_lines=True)
49 basic_table.add_column(T('Property'), style="bold cyan", justify="right")
50 basic_table.add_column(T('Value'), style="bold white", justify="left")
52 basic_table.add_row(T('Role name'), role.name)
53 basic_table.add_row(T('Role description'), role.short)
54 basic_table.add_row(T('Tips count'), str(len(role.tips)))
55 basic_table.add_row(T('Environment variables count'), str(len(role.envs)))
56 basic_table.add_row(T('Package dependencies count'), str(len(role.packages)))
57 basic_table.add_row(T('Plugins count'), str(len(role.plugins)))
59 print(basic_table)
61 # 详细描述
62 if role.detail:
63 from rich.panel import Panel
64 detail_panel = Panel(role.detail, title=T('Role detail'), border_style="blue")
65 print(detail_panel)
67 # 提示信息表格
68 if role.tips:
69 tips_table = Table(title=T('Tips'), show_lines=True)
70 tips_table.add_column(T('Name'), style="bold green", justify="left")
71 tips_table.add_column(T('Description'), style="bold white", justify="left")
73 for tip_name, tip in role.tips.items():
74 tips_table.add_row(tip_name, tip.short)
76 print(tips_table)
78 # 环境变量表格
79 if role.envs:
80 env_table = Table(title=T('Environment variables'), show_lines=True)
81 env_table.add_column(T('Name'), style="bold yellow", justify="left")
82 env_table.add_column(T('Description'), style="bold white", justify="left")
83 env_table.add_column(T('Value'), style="dim", justify="left")
85 for env_name, (value, desc) in role.envs.items():
86 # 截断过长的值
87 display_value = value[:50] + "..." if len(value) > 50 else value
88 env_table.add_row(env_name, desc, display_value)
90 print(env_table)
92 # 包依赖表格
93 if role.packages:
94 pkg_table = Table(title=T('Package dependencies'), show_lines=True)
95 pkg_table.add_column(T('Language'), style="bold magenta", justify="left")
96 pkg_table.add_column(T('Packages'), style="bold white", justify="left")
98 for lang, packages in role.packages.items():
99 pkg_table.add_row(lang, ', '.join(packages))
101 print(pkg_table)
103 # 插件表格
104 if role.plugins:
105 tree = Tree(T('Plugins'))
106 for plugin_name, plugin_config in role.plugins.items():
107 t = tree.add(plugin_name)
108 t.add(Syntax(json.dumps(plugin_config, ensure_ascii=False, indent=2), "json", word_wrap=True))
110 print(tree)
112 def cmd_use(self, args, ctx):
113 success = ctx.tm.use(role=args.role)
114 if success:
115 self.log.info(f'Use {args.role} role')
116 else:
117 self.log.error(T('Failed to use role').format(args.role))
119 def cmd(self, args, ctx):
120 self.cmd_list(args, ctx)