Improved command handling
This commit is contained in:
		| @@ -1,11 +1,14 @@ | |||||||
| from typing import Optional | from typing import Optional | ||||||
|  |  | ||||||
| from cpl.application.application_abc import ApplicationABC | from cpl.application.application_abc import ApplicationABC | ||||||
| from cpl_cli.command import Command | from cpl.console.console import Console | ||||||
|  | from cpl_cli.command.build import Build | ||||||
| from cpl_cli.command_handler import CommandHandler | from cpl_cli.command_handler import CommandHandler | ||||||
|  | from cpl_cli.command_model import CommandModel | ||||||
| from cpl_cli.error import Error | from cpl_cli.error import Error | ||||||
| from cpl_cli.commands.help import Help | from cpl_cli.command.help import Help | ||||||
| from cpl_cli.commands.version import Version | from cpl_cli.command.version import Version | ||||||
|  | from cpl_cli.publish.project_settings import ProjectSettings | ||||||
|  |  | ||||||
|  |  | ||||||
| class CLI(ApplicationABC): | class CLI(ApplicationABC): | ||||||
| @@ -18,8 +21,9 @@ class CLI(ApplicationABC): | |||||||
|     def configure(self): |     def configure(self): | ||||||
|         self._command_handler: CommandHandler = self._services.get_service(CommandHandler) |         self._command_handler: CommandHandler = self._services.get_service(CommandHandler) | ||||||
|  |  | ||||||
|         self._command_handler.add_command(Command('help', ['h', 'H'], self._services.get_service(Help))) |         self._command_handler.add_command(CommandModel('build', ['h', 'B'], Build)) | ||||||
|         self._command_handler.add_command(Command('version', ['v', 'V'], self._services.get_service(Version))) |         self._command_handler.add_command(CommandModel('help', ['h', 'H'], Help)) | ||||||
|  |         self._command_handler.add_command(CommandModel('version', ['v', 'V'], Version)) | ||||||
|  |  | ||||||
|     def main(self): |     def main(self): | ||||||
|         if len(self._configuration.additional_arguments) < 1: |         if len(self._configuration.additional_arguments) < 1: | ||||||
|   | |||||||
							
								
								
									
										0
									
								
								src/cpl_cli/command/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								src/cpl_cli/command/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										13
									
								
								src/cpl_cli/command/build.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/cpl_cli/command/build.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | from cpl_cli.command_abc import CommandABC | ||||||
|  | from cpl_cli.publish.publisher_abc import PublisherABC | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class Build(CommandABC): | ||||||
|  |  | ||||||
|  |     def __init__(self, publisher: PublisherABC): | ||||||
|  |         CommandABC.__init__(self) | ||||||
|  |  | ||||||
|  |         self._publisher = publisher | ||||||
|  |  | ||||||
|  |     def run(self, args: list[str]): | ||||||
|  |         self._publisher.build() | ||||||
							
								
								
									
										0
									
								
								src/cpl_cli/command/generate.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								src/cpl_cli/command/generate.py
									
									
									
									
									
										Normal file
									
								
							| @@ -10,12 +10,12 @@ class Help(CommandABC): | |||||||
|     def run(self, args: list[str]): |     def run(self, args: list[str]): | ||||||
|         Console.write_line('Available Commands:') |         Console.write_line('Available Commands:') | ||||||
|         commands = [ |         commands = [ | ||||||
|             ['build (-b|-B)', 'Prepares files for publishing into an output directory named dist/ at the given output path. Must be executed from within a workspace directory.'], |             ['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.'], |             ['generate (-g|-G)', 'Generate a new file.'], | ||||||
|             ['help (-h|-H)', 'Lists available commands and their short descriptions.'], |             ['help (-h|-H)', 'Lists available command and their short descriptions.'], | ||||||
|             ['new (-n|-N)', 'Creates new CPL project.'], |             ['new (-n|-N)', 'Creates new CPL project.'], | ||||||
|             ['start (-s|-S)', 'Starts CPL project, restarting on file changes'], |             ['start (-s|-S)', 'Starts CPL project, restarting on file changes'], | ||||||
|             ['publish (-p|-P)', 'Prepares files for publishing into an output directory named dist/ at the given output path and executes setup.py. Must be executed from within a workspace directory.'], |             ['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 workspace directory.'], | ||||||
|             ['update (-u|-u)', 'Update CPL and project dependencies.'], |             ['update (-u|-u)', 'Update CPL and project dependencies.'], | ||||||
|             ['version (-v|-V)', 'Outputs CPL CLI version.'] |             ['version (-v|-V)', 'Outputs CPL CLI version.'] | ||||||
|         ] |         ] | ||||||
							
								
								
									
										0
									
								
								src/cpl_cli/command/new.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								src/cpl_cli/command/new.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										0
									
								
								src/cpl_cli/command/publish.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								src/cpl_cli/command/publish.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										0
									
								
								src/cpl_cli/command/start.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								src/cpl_cli/command/start.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										0
									
								
								src/cpl_cli/command/update.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								src/cpl_cli/command/update.py
									
									
									
									
									
										Normal file
									
								
							| @@ -1,24 +1,26 @@ | |||||||
| from cpl.application.application_runtime_abc import ApplicationRuntimeABC | from cpl.application.application_runtime_abc import ApplicationRuntimeABC | ||||||
| from cpl.dependency_injection.service_abc import ServiceABC | from cpl.dependency_injection.service_abc import ServiceABC | ||||||
| from cpl_cli.command import Command | from cpl.dependency_injection.service_provider_base import ServiceProviderABC | ||||||
|  | from cpl_cli.command_model import CommandModel | ||||||
|  |  | ||||||
|  |  | ||||||
| class CommandHandler(ServiceABC): | class CommandHandler(ServiceABC): | ||||||
|  |  | ||||||
|     def __init__(self, runtime: ApplicationRuntimeABC): |     def __init__(self, runtime: ApplicationRuntimeABC, services: ServiceProviderABC): | ||||||
|         ServiceABC.__init__(self) |         ServiceABC.__init__(self) | ||||||
|  |  | ||||||
|         self._runtime = runtime |         self._runtime = runtime | ||||||
|  |         self._services = services | ||||||
|  |  | ||||||
|         self._commands: list[Command] = [] |         self._commands: list[CommandModel] = [] | ||||||
|  |  | ||||||
|     def add_command(self, cmd: Command): |     def add_command(self, cmd: CommandModel): | ||||||
|         self._commands.append(cmd) |         self._commands.append(cmd) | ||||||
|  |  | ||||||
|     def remove_command(self, cmd: Command): |     def remove_command(self, cmd: CommandModel): | ||||||
|         self._commands.remove(cmd) |         self._commands.remove(cmd) | ||||||
|  |  | ||||||
|     def handle(self, cmd: str, args: list[str]): |     def handle(self, cmd: str, args: list[str]): | ||||||
|         for command in self._commands: |         for command in self._commands: | ||||||
|             if cmd == command.name or cmd in command.aliases: |             if cmd == command.name or cmd in command.aliases: | ||||||
|                 command.command.run(args) |                 self._services.get_service(command.command).run(args) | ||||||
|   | |||||||
							
								
								
									
										0
									
								
								src/cpl_cli/publish/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								src/cpl_cli/publish/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										46
									
								
								src/cpl_cli/publish/project_settings.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/cpl_cli/publish/project_settings.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | |||||||
|  | import traceback | ||||||
|  | from typing import Optional | ||||||
|  |  | ||||||
|  | from cpl.configuration.configuration_model_abc import ConfigurationModelABC | ||||||
|  | from cpl.console.console import Console | ||||||
|  | from cpl.console.foreground_color import ForegroundColor | ||||||
|  | from cpl.version.version import Version | ||||||
|  | from cpl_cli.publish.project_settings_name import ProjectSettingsName | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class ProjectSettings(ConfigurationModelABC): | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         ConfigurationModelABC.__init__(self) | ||||||
|  |  | ||||||
|  |         self._dist_path: Optional[str] = None | ||||||
|  |         self._excluded_files: list[str] = [] | ||||||
|  |         self._version: Optional[Version] = None | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def excluded_files(self) -> list[str]: | ||||||
|  |         return self._excluded_files | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def dist_path(self) -> str: | ||||||
|  |         return self._dist_path | ||||||
|  |  | ||||||
|  |     @dist_path.setter | ||||||
|  |     def dist_path(self, dist_path: str): | ||||||
|  |         self._dist_path = dist_path | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def version(self) -> Version: | ||||||
|  |         return self._version | ||||||
|  |  | ||||||
|  |     def from_dict(self, settings: dict): | ||||||
|  |         try: | ||||||
|  |             self._dist_path = settings[ProjectSettingsName.dist_path.value] | ||||||
|  |             self._excluded_files = settings[ProjectSettingsName.excluded_files.value] | ||||||
|  |             self._version = settings[ProjectSettingsName.version.value] | ||||||
|  |         except Exception as e: | ||||||
|  |             Console.set_foreground_color(ForegroundColor.red) | ||||||
|  |             Console.write_line( | ||||||
|  |                 f'[ ERROR ] [ {__name__} ]: Reading error in {ProjectSettingsName.project.value} settings') | ||||||
|  |             Console.write_line(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}') | ||||||
|  |             Console.set_foreground_color(ForegroundColor.default) | ||||||
							
								
								
									
										9
									
								
								src/cpl_cli/publish/project_settings_name.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/cpl_cli/publish/project_settings_name.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | from enum import Enum | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class ProjectSettingsName(Enum): | ||||||
|  |  | ||||||
|  |     dist_path = 'DistPath' | ||||||
|  |     excluded_files = 'ExcludedFiles' | ||||||
|  |     version = 'Version' | ||||||
|  |     project = 'Project' | ||||||
							
								
								
									
										65
									
								
								src/cpl_cli/publish/publisher.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								src/cpl_cli/publish/publisher.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | |||||||
|  | import os | ||||||
|  | import shutil | ||||||
|  |  | ||||||
|  | from cpl.application.application_runtime_abc import ApplicationRuntimeABC | ||||||
|  | from cpl.console.console import Console | ||||||
|  | from cpl_cli.publish.project_settings import ProjectSettings | ||||||
|  | from cpl_cli.publish.publisher_abc import PublisherABC | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class Publisher(PublisherABC): | ||||||
|  |  | ||||||
|  |     def __init__(self, runtime: ApplicationRuntimeABC, project: ProjectSettings): | ||||||
|  |         PublisherABC.__init__(self) | ||||||
|  |  | ||||||
|  |         self._runtime = runtime | ||||||
|  |  | ||||||
|  |         self._project = project | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def source_path(self) -> str: | ||||||
|  |         return '' | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def dist_path(self) -> str: | ||||||
|  |         return '' | ||||||
|  |  | ||||||
|  |     def _create_dist_path(self): | ||||||
|  |         self._project.dist_path = os.path.join(self._runtime.working_directory, self._project.dist_path) | ||||||
|  |  | ||||||
|  |         Console.write_line('DIST:', self._project.dist_path) | ||||||
|  |  | ||||||
|  |         if os.path.isdir(self._project.dist_path): | ||||||
|  |             try: | ||||||
|  |                 shutil.rmtree(self._project.dist_path) | ||||||
|  |             except Exception as e: | ||||||
|  |                 Console.error(f'{e}') | ||||||
|  |                 exit() | ||||||
|  |  | ||||||
|  |         if not os.path.isdir(self._project.dist_path): | ||||||
|  |             try: | ||||||
|  |                 os.makedirs(self._project.dist_path) | ||||||
|  |             except Exception as e: | ||||||
|  |                 Console.error(f'{e}') | ||||||
|  |                 exit() | ||||||
|  |  | ||||||
|  |     def _create_packages(self): | ||||||
|  |         pass | ||||||
|  |  | ||||||
|  |     def _dist_files(self): | ||||||
|  |         pass | ||||||
|  |  | ||||||
|  |     def include(self, path: str): | ||||||
|  |         pass | ||||||
|  |  | ||||||
|  |     def exclude(self, path: str): | ||||||
|  |         pass | ||||||
|  |  | ||||||
|  |     def build(self): | ||||||
|  |         Console.write_line('Creating internal packages:') | ||||||
|  |         self._create_packages() | ||||||
|  |         Console.write_line('Building application:') | ||||||
|  |         self._dist_files() | ||||||
|  |  | ||||||
|  |     def publish(self): | ||||||
|  |         pass | ||||||
							
								
								
									
										30
									
								
								src/cpl_cli/publish/publisher_abc.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								src/cpl_cli/publish/publisher_abc.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | |||||||
|  | from abc import abstractmethod | ||||||
|  |  | ||||||
|  | from cpl.dependency_injection.service_abc import ServiceABC | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class PublisherABC(ServiceABC): | ||||||
|  |  | ||||||
|  |     @abstractmethod | ||||||
|  |     def __init__(self): | ||||||
|  |         ServiceABC.__init__(self) | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     @abstractmethod | ||||||
|  |     def source_path(self) -> str: pass | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     @abstractmethod | ||||||
|  |     def dist_path(self) -> str: pass | ||||||
|  |  | ||||||
|  |     @abstractmethod | ||||||
|  |     def include(self, path: str): pass | ||||||
|  |  | ||||||
|  |     @abstractmethod | ||||||
|  |     def exclude(self, path: str): pass | ||||||
|  |  | ||||||
|  |     @abstractmethod | ||||||
|  |     def build(self): pass | ||||||
|  |  | ||||||
|  |     @abstractmethod | ||||||
|  |     def publish(self): pass | ||||||
| @@ -4,11 +4,15 @@ from cpl.application.application_host import ApplicationHost | |||||||
| from cpl.application.application_host_abc import ApplicationHostABC | from cpl.application.application_host_abc import ApplicationHostABC | ||||||
| from cpl.application.startup_abc import StartupABC | from cpl.application.startup_abc import StartupABC | ||||||
| from cpl.configuration.configuration_abc import ConfigurationABC | from cpl.configuration.configuration_abc import ConfigurationABC | ||||||
|  | from cpl.console.console import Console | ||||||
| from cpl.dependency_injection.service_provider_base import ServiceProviderABC | from cpl.dependency_injection.service_provider_base import ServiceProviderABC | ||||||
|  | from cpl_cli.command.build import Build | ||||||
| from cpl_cli.command_handler import CommandHandler | from cpl_cli.command_handler import CommandHandler | ||||||
| from cpl_cli.commands.help import Help | from cpl_cli.command.help import Help | ||||||
| from cpl_cli.commands.version import Version | from cpl_cli.command.version import Version | ||||||
| from cpl_cli.error import Error | from cpl_cli.error import Error | ||||||
|  | from cpl_cli.publish.publisher import Publisher | ||||||
|  | from cpl_cli.publish.publisher_abc import PublisherABC | ||||||
|  |  | ||||||
|  |  | ||||||
| class Startup(StartupABC): | class Startup(StartupABC): | ||||||
| @@ -34,6 +38,8 @@ class Startup(StartupABC): | |||||||
|     def create_configuration(self) -> ConfigurationABC: |     def create_configuration(self) -> ConfigurationABC: | ||||||
|         self._configuration.add_environment_variables('PYTHON_') |         self._configuration.add_environment_variables('PYTHON_') | ||||||
|         self._configuration.add_environment_variables('CPL_') |         self._configuration.add_environment_variables('CPL_') | ||||||
|  |         self._configuration.add_json_file('cpl.json', optional=True, output=False) | ||||||
|  |         self._configuration.add_console_argument('', 'build', ['-b', '-B'], '') | ||||||
|         self._configuration.add_console_argument('', 'help', ['-h', '-H'], '') |         self._configuration.add_console_argument('', 'help', ['-h', '-H'], '') | ||||||
|         self._configuration.add_console_argument('', 'version', ['-v', '-V'], '') |         self._configuration.add_console_argument('', 'version', ['-v', '-V'], '') | ||||||
|         self._configuration.add_console_arguments() |         self._configuration.add_console_arguments() | ||||||
| @@ -41,9 +47,12 @@ class Startup(StartupABC): | |||||||
|         return self._configuration |         return self._configuration | ||||||
|  |  | ||||||
|     def create_services(self) -> ServiceProviderABC: |     def create_services(self) -> ServiceProviderABC: | ||||||
|         self._services.add_singleton(CommandHandler, CommandHandler) |         self._services.add_singleton(CommandHandler) | ||||||
|  |  | ||||||
|         self._services.add_scoped(Help, Help) |         self._services.add_transient(PublisherABC, Publisher) | ||||||
|         self._services.add_scoped(Version, Version) |  | ||||||
|  |         self._services.add_transient(Build) | ||||||
|  |         self._services.add_transient(Help) | ||||||
|  |         self._services.add_transient(Version) | ||||||
|  |  | ||||||
|         return self._services |         return self._services | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user