Coverage for aipyapp/cli/command/cmd_plugin.py: 0%
47 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
2from ... import T
3from .base import CommandMode, Completable
4from .base_parser import ParserCommand
5from .utils import print_table
7class Command(ParserCommand):
8 name = 'plugin'
9 description = T('Plugin operations')
10 modes = [CommandMode.MAIN, CommandMode.TASK]
12 def add_subcommands(self, subparsers):
13 subparsers.add_parser('list', help=T('List available plugins'))
15 parser = subparsers.add_parser('show', help=T('Show plugin details'))
16 parser.add_argument('name', type=str, help=T('Plugin name'))
18 def get_subcommands(self):
19 if self.manager.is_main_mode():
20 subcommands = self.subcommands.copy()
21 subcommands.pop('show')
22 return subcommands
23 return super().get_subcommands()
25 def get_arg_values(self, arg, subcommand=None, partial_value=''):
26 if arg.name == 'name':
27 ctx = self.manager.context
28 return [Completable(plugin.name, plugin.description) for plugin in ctx.tm.plugin_manager]
29 return super().get_arg_values(arg, subcommand, partial_value)
31 def cmd_list(self, args, ctx):
32 """列出可用的插件"""
33 rows = []
34 for plugin in ctx.tm.plugin_manager:
35 rows.append([plugin.name, plugin.description, plugin.get_type().name, plugin.version, plugin.author])
36 print_table(rows, headers=[T('Name'), T('Description'), T('Type'), T('Version'), T('Author')], title=T('Available Plugins'))
38 def _get_first_line(self, doc: str) -> str:
39 """Get the first non-empty line of the docstring"""
40 return next((line for line in doc.split('\n') if line.strip()), '')
42 def cmd_show(self, args, ctx):
43 """显示插件详情"""
44 task = ctx.task
45 if not task:
46 ctx.console.print(T('Task mode only'), style='yellow')
47 return
48 plugin = task.plugins.get(args.name)
49 if not plugin:
50 ctx.console.print(f"[red]{T('Plugin not found')}: {args.name}[/red]")
51 return
53 rows = []
54 for name, func in plugin.get_handlers().items():
55 rows.append([T('Event'), name, self._get_first_line(func.__doc__)])
56 for name, func in plugin.get_functions().items():
57 rows.append([T('Function'), name, self._get_first_line(func.__doc__)])
58 print_table(rows, headers=[T('Type'), T('Name'), T('Description')], title=T('Plugin Details'))
60 def cmd(self, args, ctx):
61 self.cmd_list(args, ctx)