import textwrap from typing import Optional from cpl_core.console.console import Console from cpl_core.console.foreground_color_enum import ForegroundColorEnum from cpl_core.dependency_injection.service_provider_abc import ServiceProviderABC from cpl_cli.command_handler_service import CommandHandler from cpl_cli.command_abc import CommandABC class HelpService(CommandABC): def __init__(self, services: ServiceProviderABC, cmd_handler: CommandHandler): """ Service for CLI command help """ CommandABC.__init__(self) self._services = services self._commands = cmd_handler.commands @property def help_message(self) -> str: return textwrap.dedent("""\ Lists available command and their short descriptions. Usage: cpl help Arguments: command The command to display the help message for """) def run(self, args: list[str]): """ Entry point of command :param args: :return: """ if len(args) > 0: command_name = args[0] command: Optional[CommandABC] = None for cmd in self._commands: if cmd.name == command_name or command_name in cmd.aliases: command = self._services.get_service(cmd.command) if command is None: Console.error(f'Invalid argument: {command_name}') return Console.write_line(command.help_message) return Console.write_line('Available Commands:') commands = [ ['add (a|a)', 'Adds a project reference to given project.'], ['build (b|B)', 'Prepares files for publish into an output directory named dist/ at the given output path. Must be executed from within a workspace directory.'], ['generate (g|G)', 'Generate a new file.'], ['help (h|H)', 'Lists available command and their short descriptions.'], ['install (i|I)', 'With argument installs packages to project, without argument installs project dependencies.'], ['new (n|N)', 'Creates new CPL project.'], ['publish (p|P)', 'Prepares files for publish into an output directory named dist/ at the given output path and executes setup.py. Must be executed from within a library workspace directory.'], ['remove (r|R)', 'Removes a project from workspace.'], ['start (s|S)', 'Starts CPL project, restarting on file changes.'], ['uninstall (ui|UI)', 'Uninstalls packages from project.'], ['update (u|u)', 'Update CPL and project dependencies.'], ['version (v|V)', 'Outputs CPL CLI version.'] ] for name, description in commands: Console.set_foreground_color(ForegroundColorEnum.blue) Console.write(f'\n\t{name} ') Console.set_foreground_color(ForegroundColorEnum.default) Console.write(f'{description}')