From 7ad01d4bdd1bd9d60ef84d663453ff9ba483eda6 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Fri, 9 Apr 2021 22:09:55 +0200 Subject: [PATCH] Improved new command to use workspace when found --- src/cpl/utils/string.py | 2 +- src/cpl_cli/command/new_service.py | 13 ++- src/cpl_cli/command_handler_service.py | 19 ++-- src/cpl_cli/source_creator/library_builder.py | 98 +++++++++++++------ .../new/library/source/name/application.py | 5 +- .../templates/new/library/source/name/init.py | 5 +- .../templates/new/library/source/name/main.py | 17 ++-- .../new/library/source/name/startup.py | 5 +- 8 files changed, 105 insertions(+), 59 deletions(-) diff --git a/src/cpl/utils/string.py b/src/cpl/utils/string.py index 29d2da95..d794f02d 100644 --- a/src/cpl/utils/string.py +++ b/src/cpl/utils/string.py @@ -16,7 +16,7 @@ class String: pattern1 = re.compile(r'(.)([A-Z][a-z]+)') pattern2 = re.compile(r'([a-z0-9])([A-Z])') file_name = re.sub(pattern1, r'\1_\2', name) - return re.sub(pattern2, r'\1_\2', file_name).lower() + return re.sub(pattern2, r'\1_\2', file_name).lower().replace('-', '_') @staticmethod def first_to_upper(string: str) -> str: diff --git a/src/cpl_cli/command/new_service.py b/src/cpl_cli/command/new_service.py index 5f8b92d1..4ed83338 100644 --- a/src/cpl_cli/command/new_service.py +++ b/src/cpl_cli/command/new_service.py @@ -18,6 +18,7 @@ from cpl_cli.configuration.project_settings import ProjectSettings from cpl_cli.configuration.project_settings_name_enum import ProjectSettingsNameEnum from cpl_cli.configuration.project_type_enum import ProjectTypeEnum from cpl_cli.configuration.version_settings_name_enum import VersionSettingsNameEnum +from cpl_cli.configuration.workspace_settings import WorkspaceSettings from cpl_cli.source_creator.console_builder import ConsoleBuilder from cpl_cli.source_creator.library_builder import LibraryBuilder @@ -34,6 +35,7 @@ class NewService(CommandABC): self._config = configuration self._env = self._config.environment + self._workspace = self._config.get_configuration(WorkspaceSettings) self._project: ProjectSettings = ProjectSettings() self._project_dict = {} self._build: BuildSettings = BuildSettings() @@ -127,7 +129,11 @@ class NewService(CommandABC): Gets project path :return: """ - project_path = os.path.join(self._env.working_directory, self._project.name) + if self._workspace is None: + project_path = os.path.join(self._env.working_directory, self._project.name) + else: + project_path = os.path.join(self._env.working_directory, 'src', self._project.name) + if os.path.isdir(project_path) and len(os.listdir(project_path)) > 0: Console.error('Project path is not empty\n') return None @@ -204,7 +210,8 @@ class NewService(CommandABC): self._use_startup, self._use_service_providing, self._project.name, - self._project_json + self._project_json, + self._workspace ) except Exception as e: Console.error('Could not create project', str(e)) @@ -219,6 +226,8 @@ class NewService(CommandABC): self._help('Usage: cpl new [options]') return + Console.write_line(1, self._workspace) + self._command = str(args[0]).lower() if self._command == ProjectTypeEnum.console.value: self._console(args) diff --git a/src/cpl_cli/command_handler_service.py b/src/cpl_cli/command_handler_service.py index 70a6eefd..26d32f5e 100644 --- a/src/cpl_cli/command_handler_service.py +++ b/src/cpl_cli/command_handler_service.py @@ -1,5 +1,4 @@ import os -import sys from abc import ABC from typing import Optional @@ -49,16 +48,16 @@ class CommandHandler(ABC): """ for command in self._commands: if cmd == command.name or cmd in command.aliases: + error = None + project_name: Optional[str] = None + workspace: Optional[WorkspaceSettings] = None + + if os.path.isfile(os.path.join(self._env.working_directory, 'cpl-workspace.json')): + self._config.add_json_file('cpl-workspace.json', optional=True, output=False) + workspace = self._config.get_configuration(WorkspaceSettings) + if command.is_project_needed: - error = None - project_name: Optional[str] = None - workspace: Optional[WorkspaceSettings] = None - - if os.path.isfile(os.path.join(self._env.working_directory, 'cpl-workspace.json')): - self._config.add_json_file('cpl-workspace.json', optional=True, output=False) - workspace = self._config.get_configuration(WorkspaceSettings) - - elif os.path.isfile( + if os.path.isfile( os.path.join( self._env.working_directory, f'{os.path.basename(self._env.working_directory)}.json' diff --git a/src/cpl_cli/source_creator/library_builder.py b/src/cpl_cli/source_creator/library_builder.py index 0d06e361..81713cfa 100644 --- a/src/cpl_cli/source_creator/library_builder.py +++ b/src/cpl_cli/source_creator/library_builder.py @@ -1,8 +1,11 @@ import json import os +from typing import Optional + from cpl.console.foreground_color_enum import ForegroundColorEnum from cpl.console.console import Console from cpl.utils.string import String +from cpl_cli.configuration.workspace_settings import WorkspaceSettings from cpl_cli.configuration.workspace_settings_name_enum import WorkspaceSettingsNameEnum from cpl_cli.source_creator.template_builder import TemplateBuilder from cpl_cli.templates.new.library.appsettings_json import AppsettingsTemplate @@ -34,7 +37,7 @@ class LibraryBuilder: @classmethod def build(cls, project_path: str, use_application_api: bool, use_startup: bool, use_service_providing: bool, - project_name: str, project_settings: dict): + project_name: str, project_settings: dict, workspace: Optional[WorkspaceSettings]): """ Builds the library project files :param project_path: @@ -43,54 +46,85 @@ class LibraryBuilder: :param use_service_providing: :param project_name: :param project_settings: + :param workspace: :return: """ + project_name_snake = String.convert_to_snake_case(project_name) + + if workspace is None: + templates: list[TemplateFileABC] = [ + LicenseTemplate(), + ReadmeTemplate(), + TestsInitTemplate(), + NameInitTemplate(project_name, 'src/'), + AppsettingsTemplate() + ] + else: + project_path = os.path.join( + os.path.dirname(project_path), + project_name_snake + ) + Console.write_line(project_path) + + templates: list[TemplateFileABC] = [ + LicenseTemplate(), + ReadmeTemplate(), + NameInitTemplate('', ''), + AppsettingsTemplate() + ] + if not os.path.isdir(project_path): os.makedirs(project_path) - templates: list[TemplateFileABC] = [ - LicenseTemplate(), - ReadmeTemplate(), - TestsInitTemplate(), - NameInitTemplate(project_name), - AppsettingsTemplate() - ] + src_rel_path = '' + src_name = '' + if workspace is None: + src_rel_path = 'src/' + src_name = project_name_snake if use_application_api: - templates.append(ApplicationTemplate(project_name)) + templates.append(ApplicationTemplate(src_name, src_rel_path)) if use_startup: - templates.append(StartupTemplate(project_name)) - templates.append(MainWithApplicationHostAndStartupTemplate(project_name)) + templates.append(StartupTemplate(src_name, src_rel_path)) + templates.append(MainWithApplicationHostAndStartupTemplate(src_name, src_rel_path)) else: - templates.append(MainWithApplicationBaseTemplate(project_name)) + templates.append(MainWithApplicationBaseTemplate(src_name, src_rel_path)) else: if use_service_providing: - templates.append(MainWithDependencyInjection()) + templates.append(MainWithDependencyInjection(src_name, src_rel_path)) else: - templates.append(MainWithoutApplicationBaseTemplate()) + templates.append(MainWithoutApplicationBaseTemplate(src_name, src_rel_path)) - workspace_file_path = f'{project_name}/cpl-workspace.json' - project_file_rel_path = f'src/{String.convert_to_snake_case(project_name)}/{project_name}.json' - Console.spinner( - f'Creating {workspace_file_path}', - cls._create_file, - workspace_file_path, - { - WorkspaceSettingsNameEnum.default_project.value: project_name, - WorkspaceSettingsNameEnum.projects.value: { - project_name: project_file_rel_path - } - }, - text_foreground_color=ForegroundColorEnum.green, - spinner_foreground_color=ForegroundColorEnum.cyan - ) + proj_name = project_name + if workspace is not None: + proj_name = project_name_snake - project_file_path = f'{project_name}/{project_file_rel_path}' + project_file_path = f'{project_name_snake}/{project_name}.json' + if workspace is None: + src_path = f'{proj_name}/src/{project_name_snake}' + workspace_file_path = f'{proj_name}/cpl-workspace.json' + project_file_path = f'{src_path}/{project_name}.json' + + Console.spinner( + f'Creating {workspace_file_path}', + cls._create_file, + workspace_file_path, + { + WorkspaceSettingsNameEnum.default_project.value: project_name, + WorkspaceSettingsNameEnum.projects.value: { + project_name: project_file_path + } + }, + text_foreground_color=ForegroundColorEnum.green, + spinner_foreground_color=ForegroundColorEnum.cyan + ) + + Console.write_line(project_file_path) Console.spinner( f'Creating {project_file_path}', cls._create_file, - project_file_path, + project_file_path if workspace is None else f'src/{project_file_path}', project_settings, text_foreground_color=ForegroundColorEnum.green, spinner_foreground_color=ForegroundColorEnum.cyan @@ -98,7 +132,7 @@ class LibraryBuilder: for template in templates: Console.spinner( - f'Creating {project_name}/{template.path}{template.name}', + f'Creating {proj_name}/{template.path}{template.name}', TemplateBuilder.build, project_path, template, diff --git a/src/cpl_cli/templates/new/library/source/name/application.py b/src/cpl_cli/templates/new/library/source/name/application.py index 516c77aa..995b0566 100644 --- a/src/cpl_cli/templates/new/library/source/name/application.py +++ b/src/cpl_cli/templates/new/library/source/name/application.py @@ -1,3 +1,4 @@ +import os import textwrap from cpl.utils.string import String @@ -6,12 +7,12 @@ from cpl_cli.templates.template_file_abc import TemplateFileABC class ApplicationTemplate(TemplateFileABC): - def __init__(self, name: str): + def __init__(self, name: str, path: str): TemplateFileABC.__init__(self) name = String.convert_to_snake_case(name) self._name = 'application.py' - self._path = f'src/{name}/' + self._path = os.path.join(path, name) self._value = textwrap.dedent("""\ from cpl.application import ApplicationABC from cpl.configuration import ConfigurationABC diff --git a/src/cpl_cli/templates/new/library/source/name/init.py b/src/cpl_cli/templates/new/library/source/name/init.py index d9f74786..82e76950 100644 --- a/src/cpl_cli/templates/new/library/source/name/init.py +++ b/src/cpl_cli/templates/new/library/source/name/init.py @@ -1,3 +1,4 @@ +import os import textwrap from cpl.utils.string import String @@ -6,12 +7,12 @@ from cpl_cli.templates.template_file_abc import TemplateFileABC class NameInitTemplate(TemplateFileABC): - def __init__(self, name: str): + def __init__(self, name: str, path: str): TemplateFileABC.__init__(self) name = String.convert_to_snake_case(name) self._name = '__init__.py' - self._path = f'src/{name}/' + self._path = os.path.join(path, name) self._value = textwrap.dedent("""\ # imports: """) diff --git a/src/cpl_cli/templates/new/library/source/name/main.py b/src/cpl_cli/templates/new/library/source/name/main.py index a3e80509..c33e2b7f 100644 --- a/src/cpl_cli/templates/new/library/source/name/main.py +++ b/src/cpl_cli/templates/new/library/source/name/main.py @@ -1,3 +1,4 @@ +import os.path import textwrap from cpl.utils.string import String @@ -6,12 +7,12 @@ from cpl_cli.templates.template_file_abc import TemplateFileABC class MainWithApplicationHostAndStartupTemplate(TemplateFileABC): - def __init__(self, name: str): + def __init__(self, name: str, path: str): TemplateFileABC.__init__(self) name = String.convert_to_snake_case(name) self._name = 'main.py' - self._path = f'src/{name}/' + self._path = os.path.join(path, name) self._value = textwrap.dedent(f"""\ from cpl.application import ApplicationBuilder @@ -44,12 +45,12 @@ class MainWithApplicationHostAndStartupTemplate(TemplateFileABC): class MainWithApplicationBaseTemplate(TemplateFileABC): - def __init__(self, name: str): + def __init__(self, name: str, path: str): TemplateFileABC.__init__(self) name = String.convert_to_snake_case(name) self._name = 'main.py' - self._path = 'src/' + self._path = os.path.join(path, name) self._value = textwrap.dedent(f"""\ from cpl.application import ApplicationBuilder @@ -80,11 +81,11 @@ class MainWithApplicationBaseTemplate(TemplateFileABC): class MainWithoutApplicationBaseTemplate(TemplateFileABC): - def __init__(self): + def __init__(self, name: str, path: str): TemplateFileABC.__init__(self) self._name = 'main.py' - self._path = 'src/' + self._path = os.path.join(path, name) self._value = textwrap.dedent("""\ from cpl.console import Console @@ -112,11 +113,11 @@ class MainWithoutApplicationBaseTemplate(TemplateFileABC): class MainWithDependencyInjection(TemplateFileABC): - def __init__(self): + def __init__(self, name: str, path: str): TemplateFileABC.__init__(self) self._name = 'main.py' - self._path = 'src/' + self._path = os.path.join(path, name) self._value = textwrap.dedent("""\ from cpl.configuration import Configuration, ConfigurationABC from cpl.console import Console diff --git a/src/cpl_cli/templates/new/library/source/name/startup.py b/src/cpl_cli/templates/new/library/source/name/startup.py index 90881b96..fe37fdf4 100644 --- a/src/cpl_cli/templates/new/library/source/name/startup.py +++ b/src/cpl_cli/templates/new/library/source/name/startup.py @@ -1,3 +1,4 @@ +import os import textwrap from cpl.utils.string import String @@ -6,12 +7,12 @@ from cpl_cli.templates.template_file_abc import TemplateFileABC class StartupTemplate(TemplateFileABC): - def __init__(self, name: str): + def __init__(self, name: str, path: str): TemplateFileABC.__init__(self) name = String.convert_to_snake_case(name) self._name = 'startup.py' - self._path = f'src/{name}/' + self._path = os.path.join(path, name) self._value = textwrap.dedent("""\ from cpl.application import StartupABC from cpl.configuration import ConfigurationABC