From 5f10603fe5c36482e2dd544fe4d77c121f7c2b17 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Mon, 5 Dec 2022 23:08:52 +0100 Subject: [PATCH 1/5] [WIP] Improved cpl new templating #139 --- src/cpl_cli/.cpl/project_console.py | 42 +++ src/cpl_cli/.cpl/project_file_appsettings.py | 29 ++ .../.cpl/project_file_code_application.py | 49 +++ src/cpl_cli/.cpl/project_file_code_main.py | 93 +++++ src/cpl_cli/.cpl/project_file_code_startup.py | 29 ++ src/cpl_cli/.cpl/project_file_license.py | 11 + src/cpl_cli/.cpl/project_file_readme.py | 11 + .../{abc_schematic.py => schematic_abc.py} | 0 ...{class_schematic.py => schematic_class.py} | 0 ..._schematic.py => schematic_configmodel.py} | 0 .../{enum_schematic.py => schematic_enum.py} | 0 .../{init_schematic.py => schematic_init.py} | 0 .../{pipe_schematic.py => schematic_pipe.py} | 0 ...vice_schematic.py => schematic_service.py} | 0 ...se_schematic.py => schematic_test_case.py} | 0 ...hread_schematic.py => schematic_thread.py} | 0 ...or_schematic.py => schematic_validator.py} | 0 src/cpl_cli/abc/code_file_template_abc.py | 24 ++ src/cpl_cli/abc/file_template_abc.py | 10 +- src/cpl_cli/abc/generate_schematic_abc.py | 8 +- src/cpl_cli/abc/project_type_abc.py | 35 ++ src/cpl_cli/command/generate_service.py | 2 +- src/cpl_cli/command/new_old_service.py | 356 ++++++++++++++++++ src/cpl_cli/command/new_service.py | 94 ++++- .../source_creator/template_builder.py | 45 ++- ...ustom_schematic.py => schematic_custom.py} | 0 26 files changed, 822 insertions(+), 16 deletions(-) create mode 100644 src/cpl_cli/.cpl/project_console.py create mode 100644 src/cpl_cli/.cpl/project_file_appsettings.py create mode 100644 src/cpl_cli/.cpl/project_file_code_application.py create mode 100644 src/cpl_cli/.cpl/project_file_code_main.py create mode 100644 src/cpl_cli/.cpl/project_file_code_startup.py create mode 100644 src/cpl_cli/.cpl/project_file_license.py create mode 100644 src/cpl_cli/.cpl/project_file_readme.py rename src/cpl_cli/.cpl/{abc_schematic.py => schematic_abc.py} (100%) rename src/cpl_cli/.cpl/{class_schematic.py => schematic_class.py} (100%) rename src/cpl_cli/.cpl/{configmodel_schematic.py => schematic_configmodel.py} (100%) rename src/cpl_cli/.cpl/{enum_schematic.py => schematic_enum.py} (100%) rename src/cpl_cli/.cpl/{init_schematic.py => schematic_init.py} (100%) rename src/cpl_cli/.cpl/{pipe_schematic.py => schematic_pipe.py} (100%) rename src/cpl_cli/.cpl/{service_schematic.py => schematic_service.py} (100%) rename src/cpl_cli/.cpl/{test_case_schematic.py => schematic_test_case.py} (100%) rename src/cpl_cli/.cpl/{thread_schematic.py => schematic_thread.py} (100%) rename src/cpl_cli/.cpl/{validator_schematic.py => schematic_validator.py} (100%) create mode 100644 src/cpl_cli/abc/code_file_template_abc.py create mode 100644 src/cpl_cli/abc/project_type_abc.py create mode 100644 src/cpl_cli/command/new_old_service.py rename tests/custom/general/.cpl/{custom_schematic.py => schematic_custom.py} (100%) diff --git a/src/cpl_cli/.cpl/project_console.py b/src/cpl_cli/.cpl/project_console.py new file mode 100644 index 00000000..7028172d --- /dev/null +++ b/src/cpl_cli/.cpl/project_console.py @@ -0,0 +1,42 @@ +import os + +from cpl_cli.abc.project_type_abc import ProjectTypeABC +from cpl_cli.configuration import WorkspaceSettings +from cpl_core.utils import String + + +class Console(ProjectTypeABC): + + def __init__( + self, + base_path: str, + project_name: str, + workspace: WorkspaceSettings, + use_application_api: bool, + use_startup: bool, + use_service_providing: bool, + use_async: bool, + ): + from project_file_license import ProjectFileLicense + from project_file_readme import ProjectFileReadme + from schematic_init import Init + from project_file_code_application import ProjectFileApplication + from project_file_code_main import ProjectFileMain + from project_file_code_startup import ProjectFileStartup + + ProjectTypeABC.__init__(self, base_path, project_name, workspace, use_application_api, use_startup, use_service_providing, use_async) + + project_path = f'{base_path}{String.convert_to_snake_case(project_name.split("/")[-1])}/' + + self.add_template(ProjectFileLicense('')) + self.add_template(ProjectFileReadme('')) + self.add_template(Init('', 'init', f'{base_path}tests/')) + self.add_template(Init('', 'init', project_path)) + + if use_application_api: + self.add_template(ProjectFileApplication(project_path, use_application_api, use_startup, use_service_providing, use_async)) + + if use_startup: + self.add_template(ProjectFileStartup(project_path, use_application_api, use_startup, use_service_providing, use_async)) + + self.add_template(ProjectFileMain(project_path, use_application_api, use_startup, use_service_providing, use_async)) diff --git a/src/cpl_cli/.cpl/project_file_appsettings.py b/src/cpl_cli/.cpl/project_file_appsettings.py new file mode 100644 index 00000000..e7b0e3ec --- /dev/null +++ b/src/cpl_cli/.cpl/project_file_appsettings.py @@ -0,0 +1,29 @@ +import textwrap + +from cpl_cli.abc.file_template_abc import FileTemplateABC + + +class ProjectFileAppsettings(FileTemplateABC): + + def __init__(self, path: str): + code = textwrap.dedent("""\ + { + "TimeFormatSettings": { + "DateFormat": "%Y-%m-%d", + "TimeFormat": "%H:%M:%S", + "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", + "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" + }, + + "LoggingSettings": { + "Path": "logs/", + "Filename": "log_$start_time.log", + "ConsoleLogLevel": "ERROR", + "FileLogLevel": "WARN" + } + } + """) + FileTemplateABC.__init__(self, 'appsettings.json', path, code) + + def get_code(self) -> str: + return self._code diff --git a/src/cpl_cli/.cpl/project_file_code_application.py b/src/cpl_cli/.cpl/project_file_code_application.py new file mode 100644 index 00000000..59bc447a --- /dev/null +++ b/src/cpl_cli/.cpl/project_file_code_application.py @@ -0,0 +1,49 @@ +from cpl_cli.abc.code_file_template_abc import CodeFileTemplateABC + + +class ProjectFileApplication(CodeFileTemplateABC): + + def __init__(self, path: str, use_application_api: bool, use_startup: bool, use_service_providing: bool, use_async: bool): + CodeFileTemplateABC.__init__(self, 'application', path, '', use_application_api, use_startup, use_service_providing, use_async) + + def get_code(self) -> str: + import textwrap + + if self._use_async: + return textwrap.dedent("""\ + from cpl_core.application import ApplicationABC + from cpl_core.configuration import ConfigurationABC + from cpl_core.console import Console + from cpl_core.dependency_injection import ServiceProviderABC + + + class Application(ApplicationABC): + + def __init__(self, config: ConfigurationABC, services: ServiceProviderABC): + ApplicationABC.__init__(self, config, services) + + async def configure(self): + pass + + async def main(self): + Console.write_line('Hello World') + """) + + return textwrap.dedent("""\ + from cpl_core.application import ApplicationABC + from cpl_core.configuration import ConfigurationABC + from cpl_core.console import Console + from cpl_core.dependency_injection import ServiceProviderABC + + + class Application(ApplicationABC): + + def __init__(self, config: ConfigurationABC, services: ServiceProviderABC): + ApplicationABC.__init__(self, config, services) + + def configure(self): + pass + + def main(self): + Console.write_line('Hello World') + """) diff --git a/src/cpl_cli/.cpl/project_file_code_main.py b/src/cpl_cli/.cpl/project_file_code_main.py new file mode 100644 index 00000000..43b5988f --- /dev/null +++ b/src/cpl_cli/.cpl/project_file_code_main.py @@ -0,0 +1,93 @@ +from cpl_cli.abc.code_file_template_abc import CodeFileTemplateABC + + +class ProjectFileMain(CodeFileTemplateABC): + + def __init__(self, path: str, use_application_api: bool, use_startup: bool, use_service_providing: bool, use_async: bool): + CodeFileTemplateABC.__init__(self, 'main', path, '', use_application_api, use_startup, use_service_providing, use_async) + + import textwrap + + import_pkg = f'{self._name}.' + + self._main_with_application_host_and_startup = textwrap.dedent(f"""\ + {"import asyncio" if self._use_async else ''} + + from cpl_core.application import ApplicationBuilder + + from {import_pkg}application import Application + from {import_pkg}startup import Startup + + + {self._async()}def main(): + app_builder = ApplicationBuilder(Application) + app_builder.use_startup(Startup) + {"app: Application = await app_builder.build_async()" if self._use_async else ""} + {"await app.run_async()" if self._use_async else "app_builder.build().run()"} + + + if __name__ == '__main__': + {"asyncio.run(main())" if self._use_async else "main()"} + """) + self._main_with_application_base = textwrap.dedent(f"""\ + {"import asyncio" if self._use_async else ''} + + from cpl_core.application import ApplicationBuilder + + from {import_pkg}application import Application + + + {self._async()}def main(): + app_builder = ApplicationBuilder(Application) + {"app: Application = await app_builder.build_async()" if self._use_async else ""} + {"await app.run_async()" if self._use_async else "app_builder.build().run()"} + + + if __name__ == '__main__': + {"asyncio.run(main())" if self._use_async else "main()"} + """) + + self._main_with_dependency_injection = textwrap.dedent(f"""\ + {"import asyncio" if self._use_async else ''} + + from cpl_core.application import ApplicationBuilder + + from {import_pkg}application import Application + + + {self._async()}def configure_configuration() -> ConfigurationABC: + config = Configuration() + return config + + + {self._async()}def configure_services(config: ConfigurationABC) -> ServiceProviderABC: + services = ServiceCollection(config) + return services.build_service_provider() + + + {self._async()}def main(): + config = {self._async()}configure_configuration() + provider = {self._async()}configure_services(config) + Console.write_line('Hello World') + + + if __name__ == '__main__': + {"asyncio.run(main())" if self._use_async else "main()"} + """) + + def _async(self) -> str: + if self._use_async: + return 'async ' + return '' + + def get_code(self) -> str: + if self._use_application_api and self._use_startup: + return self._main_with_application_host_and_startup + + if self._use_application_api: + return self._main_with_application_base + + if self._use_service_providing: + return self._main_with_dependency_injection + + return self._main_with_application_base diff --git a/src/cpl_cli/.cpl/project_file_code_startup.py b/src/cpl_cli/.cpl/project_file_code_startup.py new file mode 100644 index 00000000..51ce07c1 --- /dev/null +++ b/src/cpl_cli/.cpl/project_file_code_startup.py @@ -0,0 +1,29 @@ +from cpl_cli.abc.code_file_template_abc import CodeFileTemplateABC + + +class ProjectFileStartup(CodeFileTemplateABC): + + def __init__(self, path: str, use_application_api: bool, use_startup: bool, use_service_providing: bool, use_async: bool): + CodeFileTemplateABC.__init__(self, 'startup', path, '', use_application_api, use_startup, use_service_providing, use_async) + + def get_code(self) -> str: + import textwrap + + return textwrap.dedent("""\ + from cpl_core.application import StartupABC + from cpl_core.configuration import ConfigurationABC + from cpl_core.dependency_injection import ServiceProviderABC, ServiceCollectionABC + from cpl_core.environment import ApplicationEnvironment + + + class Startup(StartupABC): + + def __init__(self): + StartupABC.__init__(self) + + def configure_configuration(self, configuration: ConfigurationABC, environment: ApplicationEnvironment) -> ConfigurationABC: + return configuration + + def configure_services(self, services: ServiceCollectionABC, environment: ApplicationEnvironment) -> ServiceProviderABC: + return services.build_service_provider() + """) diff --git a/src/cpl_cli/.cpl/project_file_license.py b/src/cpl_cli/.cpl/project_file_license.py new file mode 100644 index 00000000..49030517 --- /dev/null +++ b/src/cpl_cli/.cpl/project_file_license.py @@ -0,0 +1,11 @@ +from cpl_cli.abc.file_template_abc import FileTemplateABC + + +class ProjectFileLicense(FileTemplateABC): + + def __init__(self, path: str): + FileTemplateABC.__init__(self, '', path, '') + self._name = 'LICENSE' + + def get_code(self) -> str: + return self._code diff --git a/src/cpl_cli/.cpl/project_file_readme.py b/src/cpl_cli/.cpl/project_file_readme.py new file mode 100644 index 00000000..ff45ab52 --- /dev/null +++ b/src/cpl_cli/.cpl/project_file_readme.py @@ -0,0 +1,11 @@ +from cpl_cli.abc.file_template_abc import FileTemplateABC + + +class ProjectFileReadme(FileTemplateABC): + + def __init__(self, path: str): + FileTemplateABC.__init__(self, '', path, '') + self._name = 'README.md' + + def get_code(self) -> str: + return self._code diff --git a/src/cpl_cli/.cpl/abc_schematic.py b/src/cpl_cli/.cpl/schematic_abc.py similarity index 100% rename from src/cpl_cli/.cpl/abc_schematic.py rename to src/cpl_cli/.cpl/schematic_abc.py diff --git a/src/cpl_cli/.cpl/class_schematic.py b/src/cpl_cli/.cpl/schematic_class.py similarity index 100% rename from src/cpl_cli/.cpl/class_schematic.py rename to src/cpl_cli/.cpl/schematic_class.py diff --git a/src/cpl_cli/.cpl/configmodel_schematic.py b/src/cpl_cli/.cpl/schematic_configmodel.py similarity index 100% rename from src/cpl_cli/.cpl/configmodel_schematic.py rename to src/cpl_cli/.cpl/schematic_configmodel.py diff --git a/src/cpl_cli/.cpl/enum_schematic.py b/src/cpl_cli/.cpl/schematic_enum.py similarity index 100% rename from src/cpl_cli/.cpl/enum_schematic.py rename to src/cpl_cli/.cpl/schematic_enum.py diff --git a/src/cpl_cli/.cpl/init_schematic.py b/src/cpl_cli/.cpl/schematic_init.py similarity index 100% rename from src/cpl_cli/.cpl/init_schematic.py rename to src/cpl_cli/.cpl/schematic_init.py diff --git a/src/cpl_cli/.cpl/pipe_schematic.py b/src/cpl_cli/.cpl/schematic_pipe.py similarity index 100% rename from src/cpl_cli/.cpl/pipe_schematic.py rename to src/cpl_cli/.cpl/schematic_pipe.py diff --git a/src/cpl_cli/.cpl/service_schematic.py b/src/cpl_cli/.cpl/schematic_service.py similarity index 100% rename from src/cpl_cli/.cpl/service_schematic.py rename to src/cpl_cli/.cpl/schematic_service.py diff --git a/src/cpl_cli/.cpl/test_case_schematic.py b/src/cpl_cli/.cpl/schematic_test_case.py similarity index 100% rename from src/cpl_cli/.cpl/test_case_schematic.py rename to src/cpl_cli/.cpl/schematic_test_case.py diff --git a/src/cpl_cli/.cpl/thread_schematic.py b/src/cpl_cli/.cpl/schematic_thread.py similarity index 100% rename from src/cpl_cli/.cpl/thread_schematic.py rename to src/cpl_cli/.cpl/schematic_thread.py diff --git a/src/cpl_cli/.cpl/validator_schematic.py b/src/cpl_cli/.cpl/schematic_validator.py similarity index 100% rename from src/cpl_cli/.cpl/validator_schematic.py rename to src/cpl_cli/.cpl/schematic_validator.py diff --git a/src/cpl_cli/abc/code_file_template_abc.py b/src/cpl_cli/abc/code_file_template_abc.py new file mode 100644 index 00000000..439d8e4f --- /dev/null +++ b/src/cpl_cli/abc/code_file_template_abc.py @@ -0,0 +1,24 @@ +from abc import ABC, abstractmethod + +from cpl_cli.abc.file_template_abc import FileTemplateABC +from cpl_core.utils import String + + +class CodeFileTemplateABC(FileTemplateABC): + + @abstractmethod + def __init__( + self, + name: str, + path: str, + code: str, + use_application_api: bool, + use_startup: bool, + use_service_providing: bool, + use_async: bool, + ): + FileTemplateABC.__init__(self, name, path, code) + self._use_application_api = use_application_api + self._use_startup = use_startup + self._use_service_providing = use_service_providing + self._use_async = use_async diff --git a/src/cpl_cli/abc/file_template_abc.py b/src/cpl_cli/abc/file_template_abc.py index 09e39f23..e86cd436 100644 --- a/src/cpl_cli/abc/file_template_abc.py +++ b/src/cpl_cli/abc/file_template_abc.py @@ -11,6 +11,9 @@ class FileTemplateABC(ABC): self._path = path self._code = code + def __repr__(self): + return f'<{type(self).__name__} {self._path}{self._name}>' + @property def name(self) -> str: return self._name @@ -18,11 +21,14 @@ class FileTemplateABC(ABC): @property def path(self) -> str: return self._path + + @path.setter + def path(self, value: str): + self._path = value @property def value(self) -> str: return self.get_code() @abstractmethod - def get_code(self) -> str: - return self._code + def get_code(self) -> str: pass diff --git a/src/cpl_cli/abc/generate_schematic_abc.py b/src/cpl_cli/abc/generate_schematic_abc.py index 7254e176..5a0b958d 100644 --- a/src/cpl_cli/abc/generate_schematic_abc.py +++ b/src/cpl_cli/abc/generate_schematic_abc.py @@ -15,7 +15,10 @@ class GenerateSchematicABC(FileTemplateABC): if schematic in name.lower(): self._name = f'{String.convert_to_snake_case(name)}.py' - self._class_name = f'{String.first_to_upper(name)}{String.first_to_upper(schematic)}' + self._class_name = name + if name != '': + self._class_name = f'{String.first_to_upper(name)}{String.first_to_upper(schematic)}' + if schematic in name.lower(): self._class_name = f'{String.first_to_upper(name)}' @@ -24,7 +27,8 @@ class GenerateSchematicABC(FileTemplateABC): return self._class_name @abstractmethod - def get_code(self) -> str: pass + def get_code(self) -> str: + pass @classmethod def build_code_str(cls, code: str, **kwargs) -> str: diff --git a/src/cpl_cli/abc/project_type_abc.py b/src/cpl_cli/abc/project_type_abc.py new file mode 100644 index 00000000..7a6d8532 --- /dev/null +++ b/src/cpl_cli/abc/project_type_abc.py @@ -0,0 +1,35 @@ +from abc import ABC, abstractmethod +from typing import Optional + +from cpl_cli.abc.file_template_abc import FileTemplateABC +from cpl_cli.configuration import WorkspaceSettings + + +class ProjectTypeABC(ABC): + + @abstractmethod + def __init__( + self, + base_path: str, + project_name: str, + workspace: Optional[WorkspaceSettings], + use_application_api: bool, + use_startup: bool, + use_service_providing: bool, + use_async: bool, + ): + self._templates: list[FileTemplateABC] = [] + self._base_path = base_path + self._project_name = project_name + self._workspace = workspace + self._use_application_api = use_application_api + self._use_startup = use_startup + self._use_service_providing = use_service_providing + self._use_async = use_async + + @property + def templates(self) -> list[FileTemplateABC]: + return self._templates + + def add_template(self, t: FileTemplateABC): + self._templates.append(t) diff --git a/src/cpl_cli/command/generate_service.py b/src/cpl_cli/command/generate_service.py index 975770d7..32f2f061 100644 --- a/src/cpl_cli/command/generate_service.py +++ b/src/cpl_cli/command/generate_service.py @@ -144,7 +144,7 @@ class GenerateService(CommandABC): for r, d, f in os.walk(os.path.join(path, '.cpl')): for file in f: - if not file.endswith('_schematic.py'): + if not file.startswith('schematic_') and not file.endswith('.py'): continue code = '' diff --git a/src/cpl_cli/command/new_old_service.py b/src/cpl_cli/command/new_old_service.py new file mode 100644 index 00000000..5715f5cd --- /dev/null +++ b/src/cpl_cli/command/new_old_service.py @@ -0,0 +1,356 @@ +import os +import sys +import textwrap +from typing import Optional + +from packaging import version + +import cpl_cli +import cpl_core +from cpl_cli.configuration.venv_helper_service import VenvHelper +from cpl_cli.source_creator.unittest_builder import UnittestBuilder + +from cpl_core.configuration.configuration_abc import ConfigurationABC +from cpl_core.console.foreground_color_enum import ForegroundColorEnum +from cpl_core.console.console import Console +from cpl_core.utils.string import String +from cpl_cli.command_abc import CommandABC +from cpl_cli.configuration.build_settings import BuildSettings +from cpl_cli.configuration.build_settings_name_enum import BuildSettingsNameEnum +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 + + +class NewService(CommandABC): + + def __init__(self, configuration: ConfigurationABC): + """ + Service for the CLI command new + :param configuration: + """ + CommandABC.__init__(self) + + self._config = configuration + self._env = self._config.environment + + self._workspace: WorkspaceSettings = self._config.get_configuration(WorkspaceSettings) + self._project: ProjectSettings = ProjectSettings() + self._project_dict = {} + self._build: BuildSettings = BuildSettings() + self._build_dict = {} + self._project_json = {} + + self._name: str = '' + self._rel_path: str = '' + self._schematic: ProjectTypeEnum = ProjectTypeEnum.console + self._use_nothing: bool = False + self._use_application_api: bool = False + self._use_startup: bool = False + self._use_service_providing: bool = False + self._use_async: bool = False + self._use_venv: bool = False + self._use_base: bool = False + + @property + def help_message(self) -> str: + return textwrap.dedent("""\ + Generates a workspace and initial project or add a project to workspace. + Usage: cpl new + + Arguments: + type The project type of the initial project + name Name of the workspace or the project + + Types: + console (c|C) + library (l|L) + unittest (ut|UT) + """) + + def _create_project_settings(self): + self._rel_path = os.path.dirname(self._name) + self._project_dict = { + ProjectSettingsNameEnum.name.value: os.path.basename(self._name), + ProjectSettingsNameEnum.version.value: { + VersionSettingsNameEnum.major.value: '0', + VersionSettingsNameEnum.minor.value: '0', + VersionSettingsNameEnum.micro.value: '0' + }, + ProjectSettingsNameEnum.author.value: '', + ProjectSettingsNameEnum.author_email.value: '', + ProjectSettingsNameEnum.description.value: '', + ProjectSettingsNameEnum.long_description.value: '', + ProjectSettingsNameEnum.url.value: '', + ProjectSettingsNameEnum.copyright_date.value: '', + ProjectSettingsNameEnum.copyright_name.value: '', + ProjectSettingsNameEnum.license_name.value: '', + ProjectSettingsNameEnum.license_description.value: '', + ProjectSettingsNameEnum.dependencies.value: [ + f'cpl-core>={version.parse(cpl_core.__version__)}' + ], + ProjectSettingsNameEnum.dev_dependencies.value: [ + f'cpl-cli>={version.parse(cpl_cli.__version__)}' + ], + ProjectSettingsNameEnum.python_version.value: f'>={sys.version.split(" ")[0]}', + ProjectSettingsNameEnum.python_path.value: { + sys.platform: '../../venv/bin/python' if self._use_venv else '' + }, + ProjectSettingsNameEnum.classifiers.value: [] + } + + self._project.from_dict(self._project_dict) + + def _create_build_settings(self): + self._build_dict = { + BuildSettingsNameEnum.project_type.value: self._schematic, + BuildSettingsNameEnum.source_path.value: '', + BuildSettingsNameEnum.output_path.value: '../../dist', + BuildSettingsNameEnum.main.value: f'{String.convert_to_snake_case(self._project.name)}.main', + BuildSettingsNameEnum.entry_point.value: self._project.name, + BuildSettingsNameEnum.include_package_data.value: False, + BuildSettingsNameEnum.included.value: [], + BuildSettingsNameEnum.excluded.value: [ + '*/__pycache__', + '*/logs', + '*/tests' + ], + BuildSettingsNameEnum.package_data.value: {}, + BuildSettingsNameEnum.project_references.value: [] + } + self._build.from_dict(self._build_dict) + + def _create_project_json(self): + """ + Creates cpl.json content + :return: + """ + self._project_json = { + ProjectSettings.__name__: self._project_dict, + BuildSettings.__name__: self._build_dict + } + + def _get_project_path(self) -> Optional[str]: + """ + Gets project path + :return: + """ + if self._workspace is None: + project_path = os.path.join(self._env.working_directory, self._rel_path, self._project.name) + else: + base = '' if self._use_base else 'src' + project_path = os.path.join(self._env.working_directory, base, self._rel_path, String.convert_to_snake_case(self._project.name)) + + if os.path.isdir(project_path) and len(os.listdir(project_path)) > 0: + Console.write_line(project_path) + Console.error('Project path is not empty\n') + return None + + return project_path + + def _get_project_information(self, is_unittest=False): + """ + Gets project information's from user + :return: + """ + if self._use_application_api or self._use_startup or self._use_service_providing or self._use_async or self._use_nothing: + Console.set_foreground_color(ForegroundColorEnum.default) + Console.write_line('Skipping question due to given flags') + return + + if not is_unittest: + self._use_application_api = Console.read('Do you want to use application base? (y/n) ').lower() == 'y' + + if not is_unittest and self._use_application_api: + self._use_startup = Console.read('Do you want to use startup? (y/n) ').lower() == 'y' + + if not is_unittest and not self._use_application_api: + self._use_service_providing = Console.read('Do you want to use service providing? (y/n) ').lower() == 'y' + + if not self._use_async: + self._use_async = Console.read('Do you want to use async? (y/n) ').lower() == 'y' + + Console.set_foreground_color(ForegroundColorEnum.default) + + def _console(self, args: list[str]): + """ + Generates new console project + :param args: + :return: + """ + self._create_project_settings() + self._create_build_settings() + self._create_project_json() + path = self._get_project_path() + if path is None: + return + + self._get_project_information() + project_name = self._project.name + if self._rel_path != '': + project_name = f'{self._rel_path}/{project_name}' + try: + ConsoleBuilder.build( + path, + self._use_application_api, + self._use_startup, + self._use_service_providing, + self._use_async, + project_name, + self._project_json, + self._workspace + ) + except Exception as e: + Console.error('Could not create project', str(e)) + + def _unittest(self, args: list[str]): + """ + Generates new unittest project + :param args: + :return: + """ + self._create_project_settings() + self._create_build_settings() + self._create_project_json() + path = self._get_project_path() + if path is None: + return + + self._get_project_information(is_unittest=True) + project_name = self._project.name + if self._rel_path != '': + project_name = f'{self._rel_path}/{project_name}' + try: + UnittestBuilder.build( + path, + self._use_application_api, + self._use_async, + project_name, + self._project_json, + self._workspace + ) + except Exception as e: + Console.error('Could not create project', str(e)) + + def _library(self, args: list[str]): + """ + Generates new library project + :param args: + :return: + """ + self._create_project_settings() + self._create_build_settings() + self._create_project_json() + path = self._get_project_path() + if path is None: + return + + self._get_project_information() + project_name = self._project.name + if self._rel_path != '': + project_name = f'{self._rel_path}/{project_name}' + try: + LibraryBuilder.build( + path, + self._use_application_api, + self._use_startup, + self._use_service_providing, + self._use_async, + project_name, + self._project_json, + self._workspace + ) + except Exception as e: + Console.error('Could not create project', str(e)) + + def _create_venv(self): + + project = self._project.name + if self._workspace is not None: + project = self._workspace.default_project + + if self._env.working_directory.endswith(project): + project = '' + + if self._workspace is None and self._use_base: + project = f'{self._rel_path}/{project}' + + VenvHelper.init_venv( + False, + self._env, + self._project, + explicit_path=os.path.join(self._env.working_directory, project, self._project.python_executable.replace('../', '')) + ) + + def execute(self, args: list[str]): + """ + Entry point of command + :param args: + :return: + """ + if 'nothing' in args: + self._use_nothing = True + self._use_async = False + self._use_application_api = False + self._use_startup = False + self._use_service_providing = False + if 'async' in args: + args.remove('async') + if 'application-base' in args: + args.remove('application-base') + if 'startup' in args: + args.remove('startup') + if 'service-providing' in args: + args.remove('service-providing') + + if 'async' in args: + self._use_async = True + args.remove('async') + if 'application-base' in args: + self._use_application_api = True + args.remove('application-base') + if 'startup' in args: + self._use_startup = True + args.remove('startup') + if 'service-providing' in args: + self._use_service_providing = True + args.remove('service-providing') + if 'venv' in args: + self._use_venv = True + args.remove('venv') + if 'base' in args: + self._use_base = True + args.remove('base') + + console = self._config.get_configuration(ProjectTypeEnum.console.value) + library = self._config.get_configuration(ProjectTypeEnum.library.value) + unittest = self._config.get_configuration(ProjectTypeEnum.unittest.value) + if console is not None and library is None and unittest is None: + self._name = console + self._schematic = ProjectTypeEnum.console.value + self._console(args) + if self._use_venv: + self._create_venv() + + elif console is None and library is not None and unittest is None: + self._name = library + self._schematic = ProjectTypeEnum.library.value + self._library(args) + if self._use_venv: + self._create_venv() + + elif console is None and library is None and unittest is not None: + self._name = unittest + self._schematic = ProjectTypeEnum.unittest.value + self._unittest(args) + if self._use_venv: + self._create_venv() + + else: + Console.error(f'Project type not found') + Console.write_line(self.help_message) + return diff --git a/src/cpl_cli/command/new_service.py b/src/cpl_cli/command/new_service.py index 5715f5cd..8b399d58 100644 --- a/src/cpl_cli/command/new_service.py +++ b/src/cpl_cli/command/new_service.py @@ -7,7 +7,9 @@ from packaging import version import cpl_cli import cpl_core +from cpl_cli.abc.project_type_abc import ProjectTypeABC from cpl_cli.configuration.venv_helper_service import VenvHelper +from cpl_cli.source_creator.template_builder import TemplateBuilder from cpl_cli.source_creator.unittest_builder import UnittestBuilder from cpl_core.configuration.configuration_abc import ConfigurationABC @@ -47,7 +49,7 @@ class NewService(CommandABC): self._name: str = '' self._rel_path: str = '' - self._schematic: ProjectTypeEnum = ProjectTypeEnum.console + self._project_type: ProjectTypeEnum = ProjectTypeEnum.console self._use_nothing: bool = False self._use_application_api: bool = False self._use_startup: bool = False @@ -107,7 +109,7 @@ class NewService(CommandABC): def _create_build_settings(self): self._build_dict = { - BuildSettingsNameEnum.project_type.value: self._schematic, + BuildSettingsNameEnum.project_type.value: self._project_type, BuildSettingsNameEnum.source_path.value: '', BuildSettingsNameEnum.output_path.value: '../../dist', BuildSettingsNameEnum.main.value: f'{String.convert_to_snake_case(self._project.name)}.main', @@ -286,6 +288,85 @@ class NewService(CommandABC): explicit_path=os.path.join(self._env.working_directory, project, self._project.python_executable.replace('../', '')) ) + @staticmethod + def _read_custom_project_types_from_path(path: str): + if not os.path.exists(os.path.join(path, '.cpl')): + return + + sys.path.insert(0, os.path.join(path, '.cpl')) + for r, d, f in os.walk(os.path.join(path, '.cpl')): + for file in f: + if not file.startswith('project_') or not file.endswith('.py'): + continue + + code = '' + with open(os.path.join(r, file), 'r') as py_file: + code = py_file.read() + py_file.close() + + exec(code) + + def _create_project(self): + self._read_custom_project_types_from_path(self._env.runtime_directory) + self._read_custom_project_types_from_path(self._env.working_directory) + + self._create_project_settings() + self._create_build_settings() + self._create_project_json() + path = self._get_project_path() + if path is None: + return + + self._get_project_information() + project_name = self._project.name + if self._rel_path != '': + project_name = f'{self._rel_path}/{project_name}' + + project_type = None + for p in ProjectTypeABC.__subclasses__(): + if p.__name__.lower() != self._project_type: + continue + + project_type = p + + base = 'src/' + split_project_name = project_name.split('/') + if self._use_base and len(split_project_name) > 0: + base = f'{split_project_name[0]}/' + + project = project_type( + base if self._workspace is not None else 'src/', + project_name, + self._workspace, + self._use_application_api, + self._use_startup, + self._use_service_providing, + self._use_async, + ) + + if self._workspace is None: + TemplateBuilder.create_workspace( + f'{project_name}/cpl-workspace.json', + project_name.split('/')[-1], + { + project_name: project_name + }, + {} + ) + else: + self._workspace.projects[project_name] = f'{base}{String.convert_to_snake_case(project_name.split("/")[-1])}' + TemplateBuilder.create_workspace('cpl-workspace.json', self._workspace.default_project, self._workspace.projects, self._workspace.scripts) + + for template in project.templates: + Console.spinner( + f'Creating {os.path.join(project_name, template.path, template.name)}', + TemplateBuilder.build, + project_name, + template, + text_foreground_color=ForegroundColorEnum.green, + spinner_foreground_color=ForegroundColorEnum.cyan + ) + def execute(self, args: list[str]): """ Entry point of command @@ -331,21 +412,22 @@ class NewService(CommandABC): unittest = self._config.get_configuration(ProjectTypeEnum.unittest.value) if console is not None and library is None and unittest is None: self._name = console - self._schematic = ProjectTypeEnum.console.value - self._console(args) + self._project_type = ProjectTypeEnum.console.value + self._create_project() + # self._console(args) if self._use_venv: self._create_venv() elif console is None and library is not None and unittest is None: self._name = library - self._schematic = ProjectTypeEnum.library.value + self._project_type = ProjectTypeEnum.library.value self._library(args) if self._use_venv: self._create_venv() elif console is None and library is None and unittest is not None: self._name = unittest - self._schematic = ProjectTypeEnum.unittest.value + self._project_type = ProjectTypeEnum.unittest.value self._unittest(args) if self._use_venv: self._create_venv() diff --git a/src/cpl_cli/source_creator/template_builder.py b/src/cpl_cli/source_creator/template_builder.py index 20939a64..c661cd7a 100644 --- a/src/cpl_cli/source_creator/template_builder.py +++ b/src/cpl_cli/source_creator/template_builder.py @@ -1,12 +1,49 @@ +import json import os +from typing import Union from cpl_cli._templates.template_file_abc import TemplateFileABC +from cpl_cli.abc.file_template_abc import FileTemplateABC +from cpl_cli.configuration import WorkspaceSettings, WorkspaceSettingsNameEnum +from cpl_core.console import Console, ForegroundColorEnum class TemplateBuilder: @staticmethod - def build(project_path: str, template: TemplateFileABC): + def _create_file(file_name: str, content: dict): + if not os.path.isabs(file_name): + file_name = os.path.abspath(file_name) + + path = os.path.dirname(file_name) + if not os.path.isdir(path): + os.makedirs(path) + + with open(file_name, 'w') as project_json: + project_json.write(json.dumps(content, indent=2)) + project_json.close() + + @classmethod + def create_workspace(cls, path: str, project_name, projects: dict, scripts: dict): + ws_dict = { + WorkspaceSettings.__name__: { + WorkspaceSettingsNameEnum.default_project.value: project_name, + WorkspaceSettingsNameEnum.projects.value: projects, + WorkspaceSettingsNameEnum.scripts.value: scripts + } + } + + Console.spinner( + f'Creating {path}', + cls._create_file, + path, + ws_dict, + text_foreground_color=ForegroundColorEnum.green, + spinner_foreground_color=ForegroundColorEnum.cyan + ) + + @staticmethod + def build(project_path: str, template: Union[TemplateFileABC, FileTemplateABC]): """ Creates template :param project_path: @@ -14,10 +51,8 @@ class TemplateBuilder: :return: """ file_path = os.path.join(project_path, template.path, template.name) - file_rel_path = os.path.join(project_path, template.path) - - if not os.path.isdir(file_rel_path): - os.makedirs(file_rel_path) + if not os.path.isdir(os.path.dirname(file_path)): + os.makedirs(os.path.dirname(file_path)) with open(file_path, 'w') as file: file.write(template.value) diff --git a/tests/custom/general/.cpl/custom_schematic.py b/tests/custom/general/.cpl/schematic_custom.py similarity index 100% rename from tests/custom/general/.cpl/custom_schematic.py rename to tests/custom/general/.cpl/schematic_custom.py From e24453555741807dc1684762c80198f1f838752e Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Tue, 6 Dec 2022 17:42:55 +0100 Subject: [PATCH 2/5] Improved cpl n custom templating #139 --- src/cpl_cli/.cpl/project_console.py | 23 +- src/cpl_cli/.cpl/project_file.py | 14 + src/cpl_cli/.cpl/project_file_appsettings.py | 22 +- src/cpl_cli/.cpl/project_file_code_main.py | 7 +- .../project_file_code_test_application.py | 59 ++++ .../.cpl/project_file_code_test_case.py | 37 +++ src/cpl_cli/.cpl/project_library.py | 49 ++++ src/cpl_cli/.cpl/project_unittest.py | 42 +++ src/cpl_cli/.cpl/schematic_abc.py | 2 - src/cpl_cli/.cpl/schematic_test_case.py | 3 +- src/cpl_cli/_templates/new/__init__.py | 26 -- .../_templates/new/console/__init__.py | 26 -- .../new/console/appsettings_json.py | 41 --- src/cpl_cli/_templates/new/console/license.py | 23 -- .../_templates/new/console/readme_py.py | 23 -- .../_templates/new/console/source/__init__.py | 26 -- .../new/console/source/name/__init__.py | 26 -- .../new/console/source/name/application.py | 64 ----- .../new/console/source/name/init.py | 27 -- .../new/console/source/name/main.py | 254 ------------------ .../new/console/source/name/startup.py | 43 --- .../new/console/source/tests/__init__.py | 26 -- .../new/console/source/tests/init.py | 27 -- .../_templates/new/library/__init__.py | 26 -- .../new/library/appsettings_json.py | 41 --- src/cpl_cli/_templates/new/library/license.py | 23 -- .../_templates/new/library/readme_py.py | 23 -- .../_templates/new/library/source/__init__.py | 26 -- .../new/library/source/name/__init__.py | 26 -- .../new/library/source/name/application.py | 63 ----- .../new/library/source/name/init.py | 27 -- .../new/library/source/name/main.py | 249 ----------------- .../new/library/source/name/startup.py | 42 --- .../new/library/source/tests/__init__.py | 26 -- .../new/library/source/tests/init.py | 27 -- .../_templates/new/unittest/__init__.py | 26 -- .../_templates/new/unittest/license.py | 23 -- .../_templates/new/unittest/readme_py.py | 23 -- .../new/unittest/source/__init__.py | 26 -- .../new/unittest/source/name/__init__.py | 26 -- .../new/unittest/source/name/application.py | 74 ----- .../new/unittest/source/name/init.py | 27 -- .../new/unittest/source/name/main.py | 62 ----- .../new/unittest/source/name/test_case.py | 52 ---- src/cpl_cli/abc/project_type_abc.py | 2 + src/cpl_cli/command/generate_service.py | 19 +- src/cpl_cli/command/new_service.py | 189 ++++--------- src/cpl_cli/publish/publisher_service.py | 14 +- src/cpl_cli/source_creator/console_builder.py | 182 ------------- src/cpl_cli/source_creator/library_builder.py | 186 ------------- .../source_creator/template_builder.py | 11 +- .../source_creator/unittest_builder.py | 164 ----------- .../unittests_cli/abc/command_test_case.py | 6 +- unittests/unittests_cli/add_test_case.py | 2 +- unittests/unittests_cli/new_test_case.py | 15 +- unittests/unittests_cli/publish_test_case.py | 15 +- 56 files changed, 329 insertions(+), 2304 deletions(-) create mode 100644 src/cpl_cli/.cpl/project_file.py create mode 100644 src/cpl_cli/.cpl/project_file_code_test_application.py create mode 100644 src/cpl_cli/.cpl/project_file_code_test_case.py create mode 100644 src/cpl_cli/.cpl/project_library.py create mode 100644 src/cpl_cli/.cpl/project_unittest.py delete mode 100644 src/cpl_cli/_templates/new/__init__.py delete mode 100644 src/cpl_cli/_templates/new/console/__init__.py delete mode 100644 src/cpl_cli/_templates/new/console/appsettings_json.py delete mode 100644 src/cpl_cli/_templates/new/console/license.py delete mode 100644 src/cpl_cli/_templates/new/console/readme_py.py delete mode 100644 src/cpl_cli/_templates/new/console/source/__init__.py delete mode 100644 src/cpl_cli/_templates/new/console/source/name/__init__.py delete mode 100644 src/cpl_cli/_templates/new/console/source/name/application.py delete mode 100644 src/cpl_cli/_templates/new/console/source/name/init.py delete mode 100644 src/cpl_cli/_templates/new/console/source/name/main.py delete mode 100644 src/cpl_cli/_templates/new/console/source/name/startup.py delete mode 100644 src/cpl_cli/_templates/new/console/source/tests/__init__.py delete mode 100644 src/cpl_cli/_templates/new/console/source/tests/init.py delete mode 100644 src/cpl_cli/_templates/new/library/__init__.py delete mode 100644 src/cpl_cli/_templates/new/library/appsettings_json.py delete mode 100644 src/cpl_cli/_templates/new/library/license.py delete mode 100644 src/cpl_cli/_templates/new/library/readme_py.py delete mode 100644 src/cpl_cli/_templates/new/library/source/__init__.py delete mode 100644 src/cpl_cli/_templates/new/library/source/name/__init__.py delete mode 100644 src/cpl_cli/_templates/new/library/source/name/application.py delete mode 100644 src/cpl_cli/_templates/new/library/source/name/init.py delete mode 100644 src/cpl_cli/_templates/new/library/source/name/main.py delete mode 100644 src/cpl_cli/_templates/new/library/source/name/startup.py delete mode 100644 src/cpl_cli/_templates/new/library/source/tests/__init__.py delete mode 100644 src/cpl_cli/_templates/new/library/source/tests/init.py delete mode 100644 src/cpl_cli/_templates/new/unittest/__init__.py delete mode 100644 src/cpl_cli/_templates/new/unittest/license.py delete mode 100644 src/cpl_cli/_templates/new/unittest/readme_py.py delete mode 100644 src/cpl_cli/_templates/new/unittest/source/__init__.py delete mode 100644 src/cpl_cli/_templates/new/unittest/source/name/__init__.py delete mode 100644 src/cpl_cli/_templates/new/unittest/source/name/application.py delete mode 100644 src/cpl_cli/_templates/new/unittest/source/name/init.py delete mode 100644 src/cpl_cli/_templates/new/unittest/source/name/main.py delete mode 100644 src/cpl_cli/_templates/new/unittest/source/name/test_case.py delete mode 100644 src/cpl_cli/source_creator/console_builder.py delete mode 100644 src/cpl_cli/source_creator/library_builder.py delete mode 100644 src/cpl_cli/source_creator/unittest_builder.py diff --git a/src/cpl_cli/.cpl/project_console.py b/src/cpl_cli/.cpl/project_console.py index 7028172d..cdf2ec62 100644 --- a/src/cpl_cli/.cpl/project_console.py +++ b/src/cpl_cli/.cpl/project_console.py @@ -16,22 +16,29 @@ class Console(ProjectTypeABC): use_startup: bool, use_service_providing: bool, use_async: bool, + project_file_data: dict, ): - from project_file_license import ProjectFileLicense - from project_file_readme import ProjectFileReadme - from schematic_init import Init + from project_file import ProjectFile + from project_file_appsettings import ProjectFileAppsettings from project_file_code_application import ProjectFileApplication from project_file_code_main import ProjectFileMain from project_file_code_startup import ProjectFileStartup + from project_file_readme import ProjectFileReadme + from project_file_license import ProjectFileLicense + from schematic_init import Init - ProjectTypeABC.__init__(self, base_path, project_name, workspace, use_application_api, use_startup, use_service_providing, use_async) + ProjectTypeABC.__init__(self, base_path, project_name, workspace, use_application_api, use_startup, use_service_providing, use_async, project_file_data) project_path = f'{base_path}{String.convert_to_snake_case(project_name.split("/")[-1])}/' - self.add_template(ProjectFileLicense('')) - self.add_template(ProjectFileReadme('')) - self.add_template(Init('', 'init', f'{base_path}tests/')) + self.add_template(ProjectFile(project_name.split('/')[-1], project_path, project_file_data)) + if workspace is None: + self.add_template(ProjectFileLicense('')) + self.add_template(ProjectFileReadme('')) + self.add_template(Init('', 'init', f'{base_path}tests/')) + self.add_template(Init('', 'init', project_path)) + self.add_template(ProjectFileAppsettings(project_path)) if use_application_api: self.add_template(ProjectFileApplication(project_path, use_application_api, use_startup, use_service_providing, use_async)) @@ -39,4 +46,4 @@ class Console(ProjectTypeABC): if use_startup: self.add_template(ProjectFileStartup(project_path, use_application_api, use_startup, use_service_providing, use_async)) - self.add_template(ProjectFileMain(project_path, use_application_api, use_startup, use_service_providing, use_async)) + self.add_template(ProjectFileMain(project_name.split('/')[-1], project_path, use_application_api, use_startup, use_service_providing, use_async)) diff --git a/src/cpl_cli/.cpl/project_file.py b/src/cpl_cli/.cpl/project_file.py new file mode 100644 index 00000000..ecee56ce --- /dev/null +++ b/src/cpl_cli/.cpl/project_file.py @@ -0,0 +1,14 @@ +import json + +from cpl_cli.abc.file_template_abc import FileTemplateABC + + +class ProjectFile(FileTemplateABC): + + def __init__(self, name: str, path: str, code: dict): + FileTemplateABC.__init__(self, '', path, '{}') + self._name = f'{name}.json' + self._code = code + + def get_code(self) -> str: + return json.dumps(self._code, indent=2) diff --git a/src/cpl_cli/.cpl/project_file_appsettings.py b/src/cpl_cli/.cpl/project_file_appsettings.py index e7b0e3ec..c6a62b88 100644 --- a/src/cpl_cli/.cpl/project_file_appsettings.py +++ b/src/cpl_cli/.cpl/project_file_appsettings.py @@ -1,29 +1,11 @@ -import textwrap - from cpl_cli.abc.file_template_abc import FileTemplateABC class ProjectFileAppsettings(FileTemplateABC): def __init__(self, path: str): - code = textwrap.dedent("""\ - { - "TimeFormatSettings": { - "DateFormat": "%Y-%m-%d", - "TimeFormat": "%H:%M:%S", - "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", - "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" - }, - - "LoggingSettings": { - "Path": "logs/", - "Filename": "log_$start_time.log", - "ConsoleLogLevel": "ERROR", - "FileLogLevel": "WARN" - } - } - """) - FileTemplateABC.__init__(self, 'appsettings.json', path, code) + FileTemplateABC.__init__(self, '', path, '{}') + self._name = 'appsettings.json' def get_code(self) -> str: return self._code diff --git a/src/cpl_cli/.cpl/project_file_code_main.py b/src/cpl_cli/.cpl/project_file_code_main.py index 43b5988f..614eb1d2 100644 --- a/src/cpl_cli/.cpl/project_file_code_main.py +++ b/src/cpl_cli/.cpl/project_file_code_main.py @@ -1,14 +1,15 @@ from cpl_cli.abc.code_file_template_abc import CodeFileTemplateABC +from cpl_core.utils import String class ProjectFileMain(CodeFileTemplateABC): - def __init__(self, path: str, use_application_api: bool, use_startup: bool, use_service_providing: bool, use_async: bool): + def __init__(self, name: str, path: str, use_application_api: bool, use_startup: bool, use_service_providing: bool, use_async: bool): CodeFileTemplateABC.__init__(self, 'main', path, '', use_application_api, use_startup, use_service_providing, use_async) import textwrap - import_pkg = f'{self._name}.' + import_pkg = f'{String.convert_to_snake_case(name)}.' self._main_with_application_host_and_startup = textwrap.dedent(f"""\ {"import asyncio" if self._use_async else ''} @@ -51,8 +52,6 @@ class ProjectFileMain(CodeFileTemplateABC): {"import asyncio" if self._use_async else ''} from cpl_core.application import ApplicationBuilder - - from {import_pkg}application import Application {self._async()}def configure_configuration() -> ConfigurationABC: diff --git a/src/cpl_cli/.cpl/project_file_code_test_application.py b/src/cpl_cli/.cpl/project_file_code_test_application.py new file mode 100644 index 00000000..06221cd6 --- /dev/null +++ b/src/cpl_cli/.cpl/project_file_code_test_application.py @@ -0,0 +1,59 @@ +from cpl_cli.abc.code_file_template_abc import CodeFileTemplateABC + + +class ProjectFileTestApplication(CodeFileTemplateABC): + + def __init__(self, path: str, use_application_api: bool, use_startup: bool, use_service_providing: bool, use_async: bool): + CodeFileTemplateABC.__init__(self, 'application', path, '', use_application_api, use_startup, use_service_providing, use_async) + + def get_code(self) -> str: + import textwrap + + if self._use_async: + return textwrap.dedent("""\ + import unittest + from unittest import TestSuite + + from cpl_core.application import ApplicationABC + from cpl_core.configuration import ConfigurationABC + from cpl_core.dependency_injection import ServiceProviderABC + from unittests.test_case import TestCase + + + class Application(ApplicationABC): + + def __init__(self, config: ConfigurationABC, services: ServiceProviderABC): + ApplicationABC.__init__(self, config, services) + self._suite: TestSuite = unittest.TestSuite() + + async def configure(self): + self._suite.addTest(TestCase('test_equal')) + + async def main(self): + runner = unittest.TextTestRunner() + runner.run(self._suite) + """) + + return textwrap.dedent("""\ + import unittest + from unittest import TestSuite + + from cpl_core.application import ApplicationABC + from cpl_core.configuration import ConfigurationABC + from cpl_core.dependency_injection import ServiceProviderABC + from unittests.test_case import TestCase + + + class Application(ApplicationABC): + + def __init__(self, config: ConfigurationABC, services: ServiceProviderABC): + ApplicationABC.__init__(self, config, services) + self._suite: TestSuite = unittest.TestSuite() + + def configure(self): + self._suite.addTest(TestCase('test_equal')) + + def main(self): + runner = unittest.TextTestRunner() + runner.run(self._suite) + """) diff --git a/src/cpl_cli/.cpl/project_file_code_test_case.py b/src/cpl_cli/.cpl/project_file_code_test_case.py new file mode 100644 index 00000000..731e9b93 --- /dev/null +++ b/src/cpl_cli/.cpl/project_file_code_test_case.py @@ -0,0 +1,37 @@ +from cpl_cli.abc.code_file_template_abc import CodeFileTemplateABC + + +class ProjectFileTestCase(CodeFileTemplateABC): + + def __init__(self, path: str, use_application_api: bool, use_startup: bool, use_service_providing: bool, use_async: bool): + CodeFileTemplateABC.__init__(self, 'test_case', path, '', use_application_api, use_startup, use_service_providing, use_async) + + def get_code(self) -> str: + import textwrap + + if self._use_async: + return textwrap.dedent("""\ + import unittest + + + class TestCase(unittest.TestCase): + + async def setUp(self) -> None: + pass + + async def test_equal(self): + self.assertEqual(True, True) + """) + + return textwrap.dedent("""\ + import unittest + + + class TestCase(unittest.TestCase): + + def setUp(self) -> None: + pass + + def test_equal(self): + self.assertEqual(True, True) + """) diff --git a/src/cpl_cli/.cpl/project_library.py b/src/cpl_cli/.cpl/project_library.py new file mode 100644 index 00000000..91579b10 --- /dev/null +++ b/src/cpl_cli/.cpl/project_library.py @@ -0,0 +1,49 @@ +import os + +from cpl_cli.abc.project_type_abc import ProjectTypeABC +from cpl_cli.configuration import WorkspaceSettings +from cpl_core.utils import String + + +class Library(ProjectTypeABC): + + def __init__( + self, + base_path: str, + project_name: str, + workspace: WorkspaceSettings, + use_application_api: bool, + use_startup: bool, + use_service_providing: bool, + use_async: bool, + project_file_data: dict, + ): + from project_file import ProjectFile + from project_file_appsettings import ProjectFileAppsettings + from project_file_code_application import ProjectFileApplication + from project_file_code_main import ProjectFileMain + from project_file_code_startup import ProjectFileStartup + from project_file_readme import ProjectFileReadme + from project_file_license import ProjectFileLicense + from schematic_init import Init + + ProjectTypeABC.__init__(self, base_path, project_name, workspace, use_application_api, use_startup, use_service_providing, use_async, project_file_data) + + project_path = f'{base_path}{String.convert_to_snake_case(project_name.split("/")[-1])}/' + + self.add_template(ProjectFile(project_name.split('/')[-1], project_path, project_file_data)) + if workspace is None: + self.add_template(ProjectFileLicense('')) + self.add_template(ProjectFileReadme('')) + self.add_template(Init('', 'init', f'{base_path}tests/')) + + self.add_template(Init('', 'init', project_path)) + self.add_template(ProjectFileAppsettings(project_path)) + + if use_application_api: + self.add_template(ProjectFileApplication(project_path, use_application_api, use_startup, use_service_providing, use_async)) + + if use_startup: + self.add_template(ProjectFileStartup(project_path, use_application_api, use_startup, use_service_providing, use_async)) + + self.add_template(ProjectFileMain(project_name.split('/')[-1], project_path, use_application_api, use_startup, use_service_providing, use_async)) diff --git a/src/cpl_cli/.cpl/project_unittest.py b/src/cpl_cli/.cpl/project_unittest.py new file mode 100644 index 00000000..7b4b4d2b --- /dev/null +++ b/src/cpl_cli/.cpl/project_unittest.py @@ -0,0 +1,42 @@ +import os + +from cpl_cli.abc.project_type_abc import ProjectTypeABC +from cpl_cli.configuration import WorkspaceSettings +from cpl_core.utils import String + + +class Unittest(ProjectTypeABC): + + def __init__( + self, + base_path: str, + project_name: str, + workspace: WorkspaceSettings, + use_application_api: bool, + use_startup: bool, + use_service_providing: bool, + use_async: bool, + project_file_data: dict, + ): + from project_file import ProjectFile + from project_file_code_application import ProjectFileApplication + from project_file_code_main import ProjectFileMain + from project_file_code_test_case import ProjectFileTestCase + from project_file_readme import ProjectFileReadme + from project_file_license import ProjectFileLicense + from schematic_init import Init + + ProjectTypeABC.__init__(self, base_path, project_name, workspace, use_application_api, use_startup, use_service_providing, use_async, project_file_data) + + project_path = f'{base_path}{String.convert_to_snake_case(project_name.split("/")[-1])}/' + + self.add_template(ProjectFile(project_name.split('/')[-1], project_path, project_file_data)) + if workspace is None: + self.add_template(ProjectFileLicense('')) + self.add_template(ProjectFileReadme('')) + self.add_template(Init('', 'init', f'{base_path}tests/')) + + self.add_template(Init('', 'init', project_path)) + self.add_template(ProjectFileApplication(project_path, use_application_api, use_startup, use_service_providing, use_async)) + self.add_template(ProjectFileMain(project_name.split('/')[-1], project_path, use_application_api, use_startup, use_service_providing, use_async)) + self.add_template(ProjectFileTestCase(project_path, use_application_api, use_startup, use_service_providing, use_async)) diff --git a/src/cpl_cli/.cpl/schematic_abc.py b/src/cpl_cli/.cpl/schematic_abc.py index 917a60a6..aaa74cc3 100644 --- a/src/cpl_cli/.cpl/schematic_abc.py +++ b/src/cpl_cli/.cpl/schematic_abc.py @@ -1,5 +1,3 @@ -import textwrap - from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC diff --git a/src/cpl_cli/.cpl/schematic_test_case.py b/src/cpl_cli/.cpl/schematic_test_case.py index 63ffe56c..d0f2b4bd 100644 --- a/src/cpl_cli/.cpl/schematic_test_case.py +++ b/src/cpl_cli/.cpl/schematic_test_case.py @@ -21,8 +21,7 @@ class TestCase(GenerateSchematicABC): def test_equal(self): pass """ - x = self.build_code_str(code, Name=self._class_name) - return x + return self.build_code_str(code, Name=self._class_name) @classmethod def register(cls): diff --git a/src/cpl_cli/_templates/new/__init__.py b/src/cpl_cli/_templates/new/__init__.py deleted file mode 100644 index 6ab3639e..00000000 --- a/src/cpl_cli/_templates/new/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -cpl-cli sh-edraft Common Python library CLI -~~~~~~~~~~~~~~~~~~~ - -sh-edraft Common Python library Command Line Interface - -:copyright: (c) 2020 - 2022 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = 'cpl_cli._templates.new' -__author__ = 'Sven Heidemann' -__license__ = 'MIT' -__copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.12.0' - -from collections import namedtuple - - -# imports: - -VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='12', micro='0') diff --git a/src/cpl_cli/_templates/new/console/__init__.py b/src/cpl_cli/_templates/new/console/__init__.py deleted file mode 100644 index f9bacfd9..00000000 --- a/src/cpl_cli/_templates/new/console/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -cpl-cli sh-edraft Common Python library CLI -~~~~~~~~~~~~~~~~~~~ - -sh-edraft Common Python library Command Line Interface - -:copyright: (c) 2020 - 2022 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = 'cpl_cli._templates.new.console' -__author__ = 'Sven Heidemann' -__license__ = 'MIT' -__copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.12.0' - -from collections import namedtuple - - -# imports: - -VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='12', micro='0') diff --git a/src/cpl_cli/_templates/new/console/appsettings_json.py b/src/cpl_cli/_templates/new/console/appsettings_json.py deleted file mode 100644 index 5bd03eaa..00000000 --- a/src/cpl_cli/_templates/new/console/appsettings_json.py +++ /dev/null @@ -1,41 +0,0 @@ -import textwrap - -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class AppsettingsTemplate(TemplateFileABC): - - def __init__(self): - TemplateFileABC.__init__(self) - - self._name = 'appsettings.json' - self._path = '' - self._value = textwrap.dedent("""\ - { - "TimeFormatSettings": { - "DateFormat": "%Y-%m-%d", - "TimeFormat": "%H:%M:%S", - "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", - "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" - }, - - "LoggingSettings": { - "Path": "logs/", - "Filename": "log_$start_time.log", - "ConsoleLogLevel": "ERROR", - "FileLogLevel": "WARN" - } - } - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/_templates/new/console/license.py b/src/cpl_cli/_templates/new/console/license.py deleted file mode 100644 index fb586904..00000000 --- a/src/cpl_cli/_templates/new/console/license.py +++ /dev/null @@ -1,23 +0,0 @@ -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class LicenseTemplate(TemplateFileABC): - - def __init__(self): - TemplateFileABC.__init__(self) - - self._name = 'LICENSE' - self._path = '' - self._value = """""" - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/_templates/new/console/readme_py.py b/src/cpl_cli/_templates/new/console/readme_py.py deleted file mode 100644 index a40286a8..00000000 --- a/src/cpl_cli/_templates/new/console/readme_py.py +++ /dev/null @@ -1,23 +0,0 @@ -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class ReadmeTemplate(TemplateFileABC): - - def __init__(self): - TemplateFileABC.__init__(self) - - self._name = 'README.md' - self._path = '' - self._value = """""" - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/_templates/new/console/source/__init__.py b/src/cpl_cli/_templates/new/console/source/__init__.py deleted file mode 100644 index 406a219a..00000000 --- a/src/cpl_cli/_templates/new/console/source/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -cpl-cli sh-edraft Common Python library CLI -~~~~~~~~~~~~~~~~~~~ - -sh-edraft Common Python library Command Line Interface - -:copyright: (c) 2020 - 2022 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = 'cpl_cli._templates.new.console.source' -__author__ = 'Sven Heidemann' -__license__ = 'MIT' -__copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.12.0' - -from collections import namedtuple - - -# imports: - -VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='12', micro='0') diff --git a/src/cpl_cli/_templates/new/console/source/name/__init__.py b/src/cpl_cli/_templates/new/console/source/name/__init__.py deleted file mode 100644 index 162a07c3..00000000 --- a/src/cpl_cli/_templates/new/console/source/name/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -cpl-cli sh-edraft Common Python library CLI -~~~~~~~~~~~~~~~~~~~ - -sh-edraft Common Python library Command Line Interface - -:copyright: (c) 2020 - 2022 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = 'cpl_cli._templates.new.console.source.name' -__author__ = 'Sven Heidemann' -__license__ = 'MIT' -__copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.12.0' - -from collections import namedtuple - - -# imports: - -VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='12', micro='0') diff --git a/src/cpl_cli/_templates/new/console/source/name/application.py b/src/cpl_cli/_templates/new/console/source/name/application.py deleted file mode 100644 index 56d9990f..00000000 --- a/src/cpl_cli/_templates/new/console/source/name/application.py +++ /dev/null @@ -1,64 +0,0 @@ -import textwrap - -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class ApplicationTemplate(TemplateFileABC): - - def __init__(self, name: str, path: str, use_async: bool): - TemplateFileABC.__init__(self) - - self._name = 'application.py' - self._path = path - self._use_async = use_async - - if self._use_async: - self._value = textwrap.dedent("""\ - from cpl_core.application import ApplicationABC - from cpl_core.configuration import ConfigurationABC - from cpl_core.console import Console - from cpl_core.dependency_injection import ServiceProviderABC - - - class Application(ApplicationABC): - - def __init__(self, config: ConfigurationABC, services: ServiceProviderABC): - ApplicationABC.__init__(self, config, services) - - async def configure(self): - pass - - async def main(self): - Console.write_line('Hello World') - """) - else: - self._value = textwrap.dedent("""\ - from cpl_core.application import ApplicationABC - from cpl_core.configuration import ConfigurationABC - from cpl_core.console import Console - from cpl_core.dependency_injection import ServiceProviderABC - - - class Application(ApplicationABC): - - def __init__(self, config: ConfigurationABC, services: ServiceProviderABC): - ApplicationABC.__init__(self, config, services) - - def configure(self): - pass - - def main(self): - Console.write_line('Hello World') - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/_templates/new/console/source/name/init.py b/src/cpl_cli/_templates/new/console/source/name/init.py deleted file mode 100644 index b3cbdecb..00000000 --- a/src/cpl_cli/_templates/new/console/source/name/init.py +++ /dev/null @@ -1,27 +0,0 @@ -import textwrap - -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class MainInitTemplate(TemplateFileABC): - - def __init__(self, name: str, path: str): - TemplateFileABC.__init__(self) - - self._name = '__init__.py' - self._path = path - self._value = textwrap.dedent("""\ - # imports: - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/_templates/new/console/source/name/main.py b/src/cpl_cli/_templates/new/console/source/name/main.py deleted file mode 100644 index 8549c490..00000000 --- a/src/cpl_cli/_templates/new/console/source/name/main.py +++ /dev/null @@ -1,254 +0,0 @@ -import textwrap - -from cpl_core.utils.string import String -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class MainWithApplicationHostAndStartupTemplate(TemplateFileABC): - - def __init__(self, name: str, path: str, use_async: bool): - TemplateFileABC.__init__(self) - - name = String.convert_to_snake_case(name) - self._name = 'main.py' - self._path = path - - import_pkg = f'{name}.' - - if use_async: - self._value = textwrap.dedent(f"""\ - import asyncio - - from cpl_core.application import ApplicationBuilder - - from {import_pkg}application import Application - from {import_pkg}startup import Startup - - - async def main(): - app_builder = ApplicationBuilder(Application) - app_builder.use_startup(Startup) - app: Application = await app_builder.build_async() - await app.run_async() - - - if __name__ == '__main__': - asyncio.run(main()) - """) - else: - self._value = textwrap.dedent(f"""\ - from cpl_core.application import ApplicationBuilder - - from {import_pkg}application import Application - from {import_pkg}startup import Startup - - - def main(): - app_builder = ApplicationBuilder(Application) - app_builder.use_startup(Startup) - app_builder.build().run() - - - if __name__ == '__main__': - main() - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value - - -class MainWithApplicationBaseTemplate(TemplateFileABC): - - def __init__(self, name: str, path: str, use_async: bool): - TemplateFileABC.__init__(self) - - name = String.convert_to_snake_case(name) - self._name = 'main.py' - self._path = path - - import_pkg = f'{name}.' - - if use_async: - self._value = textwrap.dedent(f"""\ - import asyncio - - from cpl_core.application import ApplicationBuilder - - from {import_pkg}application import Application - - - async def main(): - app_builder = ApplicationBuilder(Application) - app: Application = await app_builder.build_async() - await app.run_async() - - - if __name__ == '__main__': - asyncio.run(main()) - """) - else: - self._value = textwrap.dedent(f"""\ - from cpl_core.application import ApplicationBuilder - - from {import_pkg}application import Application - - - def main(): - app_builder = ApplicationBuilder(Application) - app_builder.build().run() - - - if __name__ == '__main__': - main() - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value - - -class MainWithoutApplicationBaseTemplate(TemplateFileABC): - - def __init__(self, name: str, path: str, use_async: bool): - TemplateFileABC.__init__(self) - - name = String.convert_to_snake_case(name) - self._name = 'main.py' - self._path = path - - import_pkg = f'{name}.' - - if use_async: - self._value = textwrap.dedent("""\ - import asyncio - - from cpl_core.console import Console - - - async def main(): - Console.write_line('Hello World') - - - if __name__ == '__main__': - asyncio.run(main()) - """) - else: - self._value = textwrap.dedent("""\ - from cpl_core.console import Console - - - def main(): - Console.write_line('Hello World') - - - if __name__ == '__main__': - main() - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value - - -class MainWithDependencyInjection(TemplateFileABC): - - def __init__(self, name: str, path: str, use_async: bool): - TemplateFileABC.__init__(self) - - name = String.convert_to_snake_case(name) - self._name = 'main.py' - self._path = path - - import_pkg = f'{name}.' - - if use_async: - self._value = textwrap.dedent("""\ - import asyncio - - from cpl_core.configuration import Configuration, ConfigurationABC - from cpl_core.console import Console - from cpl_core.dependency_injection import ServiceCollection, ServiceProviderABC - - - async def configure_configuration() -> ConfigurationABC: - config = Configuration() - return config - - - async def configure_services(config: ConfigurationABC) -> ServiceProviderABC: - services = ServiceCollection(config) - return services.build_service_provider() - - - async def main(): - config = await configure_configuration() - provider = await configure_services(config) - Console.write_line('Hello World') - - - if __name__ == '__main__': - asyncio.run(main()) - """) - else: - self._value = textwrap.dedent("""\ - from cpl_core.configuration import Configuration, ConfigurationABC - from cpl_core.console import Console - from cpl_core.dependency_injection import ServiceCollection, ServiceProviderABC - - - def configure_configuration() -> ConfigurationABC: - config = Configuration() - return config - - - def configure_services(config: ConfigurationABC) -> ServiceProviderABC: - services = ServiceCollection(config) - return services.build_service_provider() - - - def main(): - config = configure_configuration() - provider = configure_services(config) - Console.write_line('Hello World') - - - if __name__ == '__main__': - main() - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/_templates/new/console/source/name/startup.py b/src/cpl_cli/_templates/new/console/source/name/startup.py deleted file mode 100644 index 20e14842..00000000 --- a/src/cpl_cli/_templates/new/console/source/name/startup.py +++ /dev/null @@ -1,43 +0,0 @@ -import textwrap - -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class StartupTemplate(TemplateFileABC): - - def __init__(self, name: str, path: str): - TemplateFileABC.__init__(self) - - self._name = 'startup.py' - self._path = path - - self._value = textwrap.dedent("""\ - from cpl_core.application import StartupABC - from cpl_core.configuration import ConfigurationABC - from cpl_core.dependency_injection import ServiceProviderABC, ServiceCollectionABC - from cpl_core.environment import ApplicationEnvironment - - - class Startup(StartupABC): - - def __init__(self): - StartupABC.__init__(self) - - def configure_configuration(self, configuration: ConfigurationABC, environment: ApplicationEnvironment) -> ConfigurationABC: - return configuration - - def configure_services(self, services: ServiceCollectionABC, environment: ApplicationEnvironment) -> ServiceProviderABC: - return services.build_service_provider() - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/_templates/new/console/source/tests/__init__.py b/src/cpl_cli/_templates/new/console/source/tests/__init__.py deleted file mode 100644 index 5c376a46..00000000 --- a/src/cpl_cli/_templates/new/console/source/tests/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -cpl-cli sh-edraft Common Python library CLI -~~~~~~~~~~~~~~~~~~~ - -sh-edraft Common Python library Command Line Interface - -:copyright: (c) 2020 - 2022 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = 'cpl_cli._templates.new.console.source.tests' -__author__ = 'Sven Heidemann' -__license__ = 'MIT' -__copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.12.0' - -from collections import namedtuple - - -# imports: - -VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='12', micro='0') diff --git a/src/cpl_cli/_templates/new/console/source/tests/init.py b/src/cpl_cli/_templates/new/console/source/tests/init.py deleted file mode 100644 index 338ad115..00000000 --- a/src/cpl_cli/_templates/new/console/source/tests/init.py +++ /dev/null @@ -1,27 +0,0 @@ -import textwrap - -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class TestsInitTemplate(TemplateFileABC): - - def __init__(self): - TemplateFileABC.__init__(self) - - self._name = '__init__.py' - self._path = 'src/tests/' - self._value = textwrap.dedent("""\ - # imports: - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/_templates/new/library/__init__.py b/src/cpl_cli/_templates/new/library/__init__.py deleted file mode 100644 index e1cc62fe..00000000 --- a/src/cpl_cli/_templates/new/library/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -cpl-cli sh-edraft Common Python library CLI -~~~~~~~~~~~~~~~~~~~ - -sh-edraft Common Python library Command Line Interface - -:copyright: (c) 2020 - 2022 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = 'cpl_cli._templates.new.library' -__author__ = 'Sven Heidemann' -__license__ = 'MIT' -__copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.12.0' - -from collections import namedtuple - - -# imports: - -VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='12', micro='0') diff --git a/src/cpl_cli/_templates/new/library/appsettings_json.py b/src/cpl_cli/_templates/new/library/appsettings_json.py deleted file mode 100644 index 5bd03eaa..00000000 --- a/src/cpl_cli/_templates/new/library/appsettings_json.py +++ /dev/null @@ -1,41 +0,0 @@ -import textwrap - -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class AppsettingsTemplate(TemplateFileABC): - - def __init__(self): - TemplateFileABC.__init__(self) - - self._name = 'appsettings.json' - self._path = '' - self._value = textwrap.dedent("""\ - { - "TimeFormatSettings": { - "DateFormat": "%Y-%m-%d", - "TimeFormat": "%H:%M:%S", - "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", - "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" - }, - - "LoggingSettings": { - "Path": "logs/", - "Filename": "log_$start_time.log", - "ConsoleLogLevel": "ERROR", - "FileLogLevel": "WARN" - } - } - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/_templates/new/library/license.py b/src/cpl_cli/_templates/new/library/license.py deleted file mode 100644 index fb586904..00000000 --- a/src/cpl_cli/_templates/new/library/license.py +++ /dev/null @@ -1,23 +0,0 @@ -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class LicenseTemplate(TemplateFileABC): - - def __init__(self): - TemplateFileABC.__init__(self) - - self._name = 'LICENSE' - self._path = '' - self._value = """""" - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/_templates/new/library/readme_py.py b/src/cpl_cli/_templates/new/library/readme_py.py deleted file mode 100644 index a40286a8..00000000 --- a/src/cpl_cli/_templates/new/library/readme_py.py +++ /dev/null @@ -1,23 +0,0 @@ -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class ReadmeTemplate(TemplateFileABC): - - def __init__(self): - TemplateFileABC.__init__(self) - - self._name = 'README.md' - self._path = '' - self._value = """""" - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/_templates/new/library/source/__init__.py b/src/cpl_cli/_templates/new/library/source/__init__.py deleted file mode 100644 index e13d13b4..00000000 --- a/src/cpl_cli/_templates/new/library/source/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -cpl-cli sh-edraft Common Python library CLI -~~~~~~~~~~~~~~~~~~~ - -sh-edraft Common Python library Command Line Interface - -:copyright: (c) 2020 - 2022 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = 'cpl_cli._templates.new.library.source' -__author__ = 'Sven Heidemann' -__license__ = 'MIT' -__copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.12.0' - -from collections import namedtuple - - -# imports: - -VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='12', micro='0') diff --git a/src/cpl_cli/_templates/new/library/source/name/__init__.py b/src/cpl_cli/_templates/new/library/source/name/__init__.py deleted file mode 100644 index a688ce5f..00000000 --- a/src/cpl_cli/_templates/new/library/source/name/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -cpl-cli sh-edraft Common Python library CLI -~~~~~~~~~~~~~~~~~~~ - -sh-edraft Common Python library Command Line Interface - -:copyright: (c) 2020 - 2022 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = 'cpl_cli._templates.new.library.source.name' -__author__ = 'Sven Heidemann' -__license__ = 'MIT' -__copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.12.0' - -from collections import namedtuple - - -# imports: - -VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='12', micro='0') diff --git a/src/cpl_cli/_templates/new/library/source/name/application.py b/src/cpl_cli/_templates/new/library/source/name/application.py deleted file mode 100644 index 5ca0b146..00000000 --- a/src/cpl_cli/_templates/new/library/source/name/application.py +++ /dev/null @@ -1,63 +0,0 @@ -import textwrap - -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class ApplicationTemplate(TemplateFileABC): - - def __init__(self, name: str, path: str, use_async: bool): - TemplateFileABC.__init__(self) - - self._name = 'application.py' - self._path = path - - if use_async: - self._value = textwrap.dedent("""\ - from cpl_core.application import ApplicationABC - from cpl_core.configuration import ConfigurationABC - from cpl_core.console import Console - from cpl_core.dependency_injection import ServiceProviderABC - - - class Application(ApplicationABC): - - def __init__(self, config: ConfigurationABC, services: ServiceProviderABC): - ApplicationABC.__init__(self, config, services) - - async def configure(self): - pass - - async def main(self): - Console.write_line('Hello World') - """) - else: - self._value = textwrap.dedent("""\ - from cpl_core.application import ApplicationABC - from cpl_core.configuration import ConfigurationABC - from cpl_core.console import Console - from cpl_core.dependency_injection import ServiceProviderABC - - - class Application(ApplicationABC): - - def __init__(self, config: ConfigurationABC, services: ServiceProviderABC): - ApplicationABC.__init__(self, config, services) - - def configure(self): - pass - - def main(self): - Console.write_line('Hello World') - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/_templates/new/library/source/name/init.py b/src/cpl_cli/_templates/new/library/source/name/init.py deleted file mode 100644 index a3b0b8ea..00000000 --- a/src/cpl_cli/_templates/new/library/source/name/init.py +++ /dev/null @@ -1,27 +0,0 @@ -import textwrap - -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class NameInitTemplate(TemplateFileABC): - - def __init__(self, name: str, path: str): - TemplateFileABC.__init__(self) - - self._name = '__init__.py' - self._path = path - self._value = textwrap.dedent("""\ - # imports: - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/_templates/new/library/source/name/main.py b/src/cpl_cli/_templates/new/library/source/name/main.py deleted file mode 100644 index c40fef1c..00000000 --- a/src/cpl_cli/_templates/new/library/source/name/main.py +++ /dev/null @@ -1,249 +0,0 @@ -import textwrap - -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class MainWithApplicationHostAndStartupTemplate(TemplateFileABC): - - def __init__(self, name: str, path: str, use_async: bool): - TemplateFileABC.__init__(self) - - self._name = 'main.py' - self._path = path - - import_pkg = f'{name}.' - if name == '': - import_pkg = '' - - if use_async: - self._value = textwrap.dedent(f"""\ - import asyncio - - from cpl_core.application import ApplicationBuilder - - from {import_pkg}application import Application - from {import_pkg}startup import Startup - - - async def main(): - app_builder = ApplicationBuilder(Application) - app_builder.use_startup(Startup) - app: Application = await app_builder.build_async() - await app.run_async() - - - if __name__ == '__main__': - asyncio.run(main()) - """) - else: - self._value = textwrap.dedent(f"""\ - from cpl_core.application import ApplicationBuilder - - from {import_pkg}application import Application - from {import_pkg}startup import Startup - - - def main(): - app_builder = ApplicationBuilder(Application) - app_builder.use_startup(Startup) - app_builder.build().run() - - - if __name__ == '__main__': - main() - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value - - -class MainWithApplicationBaseTemplate(TemplateFileABC): - - def __init__(self, name: str, path: str, use_async: bool): - TemplateFileABC.__init__(self) - - self._name = 'main.py' - self._path = path - - import_pkg = f'{name}.' - if name == '': - import_pkg = '' - - if use_async: - self._value = textwrap.dedent(f"""\ - import asyncio - - from cpl_core.application import ApplicationBuilder - - from {import_pkg}application import Application - - - async def main(): - app_builder = ApplicationBuilder(Application) - app: Application = await app_builder.build_async() - await app.run_async() - - - if __name__ == '__main__': - asyncio.run(main()) - """) - else: - self._value = textwrap.dedent(f"""\ - from cpl_core.application import ApplicationBuilder - - from {import_pkg}application import Application - - - def main(): - app_builder = ApplicationBuilder(Application) - app_builder.build().run() - - - if __name__ == '__main__': - main() - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value - - -class MainWithoutApplicationBaseTemplate(TemplateFileABC): - - def __init__(self, name: str, path: str, use_async: bool): - TemplateFileABC.__init__(self) - - self._name = 'main.py' - self._path = path - - if use_async: - self._value = textwrap.dedent("""\ - import asyncio - - from cpl_core.console import Console - - - async def main(): - Console.write_line('Hello World') - - - if __name__ == '__main__': - asyncio.run(main()) - """) - else: - self._value = textwrap.dedent("""\ - from cpl_core.console import Console - - - def main(): - Console.write_line('Hello World') - - - if __name__ == '__main__': - main() - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value - - -class MainWithDependencyInjection(TemplateFileABC): - - def __init__(self, name: str, path: str, use_async: bool): - TemplateFileABC.__init__(self) - - self._name = 'main.py' - self._path = path - - if use_async: - self._value = textwrap.dedent("""\ - import asyncio - - from cpl_core.configuration import Configuration, ConfigurationABC - from cpl_core.console import Console - from cpl_core.dependency_injection import ServiceCollection, ServiceProviderABC - - - async def configure_configuration() -> ConfigurationABC: - config = Configuration() - return config - - - async def configure_services(config: ConfigurationABC) -> ServiceProviderABC: - services = ServiceCollection(config) - return services.build_service_provider() - - - async def main(): - config = await configure_configuration() - provider = await configure_services(config) - Console.write_line('Hello World') - - - if __name__ == '__main__': - asyncio.run(main()) - """) - else: - self._value = textwrap.dedent("""\ - from cpl_core.configuration import Configuration, ConfigurationABC - from cpl_core.console import Console - from cpl_core.dependency_injection import ServiceCollection, ServiceProviderABC - - - def configure_configuration() -> ConfigurationABC: - config = Configuration() - return config - - - def configure_services(config: ConfigurationABC) -> ServiceProviderABC: - services = ServiceCollection(config) - return services.build_service_provider() - - - def main(): - config = configure_configuration() - provider = configure_services(config) - Console.write_line('Hello World') - - - if __name__ == '__main__': - main() - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/_templates/new/library/source/name/startup.py b/src/cpl_cli/_templates/new/library/source/name/startup.py deleted file mode 100644 index 959bc0ce..00000000 --- a/src/cpl_cli/_templates/new/library/source/name/startup.py +++ /dev/null @@ -1,42 +0,0 @@ -import textwrap - -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class StartupTemplate(TemplateFileABC): - - def __init__(self, name: str, path: str): - TemplateFileABC.__init__(self) - - self._name = 'startup.py' - self._path = path - self._value = textwrap.dedent("""\ - from cpl_core.application import StartupABC - from cpl_core.configuration import ConfigurationABC - from cpl_core.dependency_injection import ServiceProviderABC, ServiceCollectionABC - from cpl_core.environment import ApplicationEnvironment - - - class Startup(StartupABC): - - def __init__(self): - StartupABC.__init__(self) - - def configure_configuration(self, configuration: ConfigurationABC, environment: ApplicationEnvironment) -> ConfigurationABC: - return configuration - - def configure_services(self, services: ServiceCollectionABC, environment: ApplicationEnvironment) -> ServiceProviderABC: - return services.build_service_provider() - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/_templates/new/library/source/tests/__init__.py b/src/cpl_cli/_templates/new/library/source/tests/__init__.py deleted file mode 100644 index c030a958..00000000 --- a/src/cpl_cli/_templates/new/library/source/tests/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -cpl-cli sh-edraft Common Python library CLI -~~~~~~~~~~~~~~~~~~~ - -sh-edraft Common Python library Command Line Interface - -:copyright: (c) 2020 - 2022 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = 'cpl_cli._templates.new.library.source.tests' -__author__ = 'Sven Heidemann' -__license__ = 'MIT' -__copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.12.0' - -from collections import namedtuple - - -# imports: - -VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='12', micro='0') diff --git a/src/cpl_cli/_templates/new/library/source/tests/init.py b/src/cpl_cli/_templates/new/library/source/tests/init.py deleted file mode 100644 index 338ad115..00000000 --- a/src/cpl_cli/_templates/new/library/source/tests/init.py +++ /dev/null @@ -1,27 +0,0 @@ -import textwrap - -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class TestsInitTemplate(TemplateFileABC): - - def __init__(self): - TemplateFileABC.__init__(self) - - self._name = '__init__.py' - self._path = 'src/tests/' - self._value = textwrap.dedent("""\ - # imports: - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/_templates/new/unittest/__init__.py b/src/cpl_cli/_templates/new/unittest/__init__.py deleted file mode 100644 index 869714c3..00000000 --- a/src/cpl_cli/_templates/new/unittest/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -cpl-cli sh-edraft Common Python library CLI -~~~~~~~~~~~~~~~~~~~ - -sh-edraft Common Python library Command Line Interface - -:copyright: (c) 2020 - 2022 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = 'cpl_cli._templates.new.unittest' -__author__ = 'Sven Heidemann' -__license__ = 'MIT' -__copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.12.0' - -from collections import namedtuple - - -# imports: - -VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='12', micro='0') diff --git a/src/cpl_cli/_templates/new/unittest/license.py b/src/cpl_cli/_templates/new/unittest/license.py deleted file mode 100644 index fb586904..00000000 --- a/src/cpl_cli/_templates/new/unittest/license.py +++ /dev/null @@ -1,23 +0,0 @@ -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class LicenseTemplate(TemplateFileABC): - - def __init__(self): - TemplateFileABC.__init__(self) - - self._name = 'LICENSE' - self._path = '' - self._value = """""" - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/_templates/new/unittest/readme_py.py b/src/cpl_cli/_templates/new/unittest/readme_py.py deleted file mode 100644 index a40286a8..00000000 --- a/src/cpl_cli/_templates/new/unittest/readme_py.py +++ /dev/null @@ -1,23 +0,0 @@ -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class ReadmeTemplate(TemplateFileABC): - - def __init__(self): - TemplateFileABC.__init__(self) - - self._name = 'README.md' - self._path = '' - self._value = """""" - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/_templates/new/unittest/source/__init__.py b/src/cpl_cli/_templates/new/unittest/source/__init__.py deleted file mode 100644 index 00b558a0..00000000 --- a/src/cpl_cli/_templates/new/unittest/source/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -cpl-cli sh-edraft Common Python library CLI -~~~~~~~~~~~~~~~~~~~ - -sh-edraft Common Python library Command Line Interface - -:copyright: (c) 2020 - 2022 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = 'cpl_cli._templates.new.unittest.source' -__author__ = 'Sven Heidemann' -__license__ = 'MIT' -__copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.12.0' - -from collections import namedtuple - - -# imports: - -VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='12', micro='0') diff --git a/src/cpl_cli/_templates/new/unittest/source/name/__init__.py b/src/cpl_cli/_templates/new/unittest/source/name/__init__.py deleted file mode 100644 index 38c212d0..00000000 --- a/src/cpl_cli/_templates/new/unittest/source/name/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -cpl-cli sh-edraft Common Python library CLI -~~~~~~~~~~~~~~~~~~~ - -sh-edraft Common Python library Command Line Interface - -:copyright: (c) 2020 - 2022 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = 'cpl_cli._templates.new.unittest.source.name' -__author__ = 'Sven Heidemann' -__license__ = 'MIT' -__copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.12.0' - -from collections import namedtuple - - -# imports: - -VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='12', micro='0') diff --git a/src/cpl_cli/_templates/new/unittest/source/name/application.py b/src/cpl_cli/_templates/new/unittest/source/name/application.py deleted file mode 100644 index 6c40e867..00000000 --- a/src/cpl_cli/_templates/new/unittest/source/name/application.py +++ /dev/null @@ -1,74 +0,0 @@ -import textwrap - -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class ApplicationTemplate(TemplateFileABC): - - def __init__(self, name: str, path: str, use_async: bool): - TemplateFileABC.__init__(self) - - self._name = 'application.py' - self._path = path - self._use_async = use_async - - if self._use_async: - self._value = textwrap.dedent("""\ - import unittest - from unittest import TestSuite - - from cpl_core.application import ApplicationABC - from cpl_core.configuration import ConfigurationABC - from cpl_core.dependency_injection import ServiceProviderABC - from unittests.test_case import TestCase - - - class Application(ApplicationABC): - - def __init__(self, config: ConfigurationABC, services: ServiceProviderABC): - ApplicationABC.__init__(self, config, services) - self._suite: TestSuite = unittest.TestSuite() - - async def configure(self): - self._suite.addTest(TestCase('test_equal')) - - async def main(self): - runner = unittest.TextTestRunner() - runner.run(self._suite) - """) - else: - self._value = textwrap.dedent("""\ - import unittest - from unittest import TestSuite - - from cpl_core.application import ApplicationABC - from cpl_core.configuration import ConfigurationABC - from cpl_core.dependency_injection import ServiceProviderABC - from unittests.test_case import TestCase - - - class Application(ApplicationABC): - - def __init__(self, config: ConfigurationABC, services: ServiceProviderABC): - ApplicationABC.__init__(self, config, services) - self._suite: TestSuite = unittest.TestSuite() - - def configure(self): - self._suite.addTest(TestCase('test_equal')) - - def main(self): - runner = unittest.TextTestRunner() - runner.run(self._suite) - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/_templates/new/unittest/source/name/init.py b/src/cpl_cli/_templates/new/unittest/source/name/init.py deleted file mode 100644 index b3cbdecb..00000000 --- a/src/cpl_cli/_templates/new/unittest/source/name/init.py +++ /dev/null @@ -1,27 +0,0 @@ -import textwrap - -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class MainInitTemplate(TemplateFileABC): - - def __init__(self, name: str, path: str): - TemplateFileABC.__init__(self) - - self._name = '__init__.py' - self._path = path - self._value = textwrap.dedent("""\ - # imports: - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/_templates/new/unittest/source/name/main.py b/src/cpl_cli/_templates/new/unittest/source/name/main.py deleted file mode 100644 index ba8e3b41..00000000 --- a/src/cpl_cli/_templates/new/unittest/source/name/main.py +++ /dev/null @@ -1,62 +0,0 @@ -import textwrap - -from cpl_core.utils.string import String -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class MainWithApplicationBaseTemplate(TemplateFileABC): - - def __init__(self, name: str, path: str, use_async: bool): - TemplateFileABC.__init__(self) - - name = String.convert_to_snake_case(name) - self._name = 'main.py' - self._path = path - - import_pkg = f'{name}.' - - if use_async: - self._value = textwrap.dedent(f"""\ - import asyncio - - from cpl_core.application import ApplicationBuilder - - from {import_pkg}application import Application - - - async def main(): - app_builder = ApplicationBuilder(Application) - app: Application = await app_builder.build_async() - await app.run_async() - - - if __name__ == '__main__': - asyncio.run(main()) - """) - else: - self._value = textwrap.dedent(f"""\ - from cpl_core.application import ApplicationBuilder - - from {import_pkg}application import Application - - - def main(): - app_builder = ApplicationBuilder(Application) - app_builder.build().run() - - - if __name__ == '__main__': - main() - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/_templates/new/unittest/source/name/test_case.py b/src/cpl_cli/_templates/new/unittest/source/name/test_case.py deleted file mode 100644 index 096518bd..00000000 --- a/src/cpl_cli/_templates/new/unittest/source/name/test_case.py +++ /dev/null @@ -1,52 +0,0 @@ -import textwrap - -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class TestCaseTemplate(TemplateFileABC): - - def __init__(self, name: str, path: str, use_async: bool): - TemplateFileABC.__init__(self) - - self._name = 'test_case.py' - self._path = path - self._use_async = use_async - - if self._use_async: - self._value = textwrap.dedent("""\ - import unittest - - - class TestCase(unittest.TestCase): - - async def setUp(self) -> None: - pass - - async def test_equal(self): - self.assertEqual(True, True) - """) - else: - self._value = textwrap.dedent("""\ - import unittest - - - class TestCase(unittest.TestCase): - - def setUp(self) -> None: - pass - - def test_equal(self): - self.assertEqual(True, True) - """) - - @property - def name(self) -> str: - return self._name - - @property - def path(self) -> str: - return self._path - - @property - def value(self) -> str: - return self._value diff --git a/src/cpl_cli/abc/project_type_abc.py b/src/cpl_cli/abc/project_type_abc.py index 7a6d8532..68016e49 100644 --- a/src/cpl_cli/abc/project_type_abc.py +++ b/src/cpl_cli/abc/project_type_abc.py @@ -17,6 +17,7 @@ class ProjectTypeABC(ABC): use_startup: bool, use_service_providing: bool, use_async: bool, + project_file_data: dict, ): self._templates: list[FileTemplateABC] = [] self._base_path = base_path @@ -26,6 +27,7 @@ class ProjectTypeABC(ABC): self._use_startup = use_startup self._use_service_providing = use_service_providing self._use_async = use_async + self._project_file_data = project_file_data @property def templates(self) -> list[FileTemplateABC]: diff --git a/src/cpl_cli/command/generate_service.py b/src/cpl_cli/command/generate_service.py index 32f2f061..b1ee7967 100644 --- a/src/cpl_cli/command/generate_service.py +++ b/src/cpl_cli/command/generate_service.py @@ -1,6 +1,7 @@ import os import sys import textwrap +import traceback from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC from cpl_cli.command_abc import CommandABC @@ -34,6 +35,10 @@ class GenerateService(CommandABC): self._read_custom_schematics_from_path(self._env.runtime_directory) self._read_custom_schematics_from_path(self._env.working_directory) + + if len(GenerateSchematicABC.__subclasses__()) == 0: + Console.error(f'No schematics found in template directory: .cpl') + sys.exit() for schematic in GenerateSchematicABC.__subclasses__(): schematic.register() @@ -142,17 +147,17 @@ class GenerateService(CommandABC): if not os.path.exists(os.path.join(path, '.cpl')): return + sys.path.insert(0, os.path.join(path, '.cpl')) for r, d, f in os.walk(os.path.join(path, '.cpl')): for file in f: - if not file.startswith('schematic_') and not file.endswith('.py'): + if not file.startswith('schematic_') or not file.endswith('.py'): continue - code = '' - with open(os.path.join(r, file), 'r') as py_file: - code = py_file.read() - py_file.close() - - exec(code) + try: + exec(open(os.path.join(r, file), 'r').read()) + except Exception as e: + Console.error(str(e), traceback.format_exc()) + sys.exit(-1) def _get_schematic_by_alias(self, schematic: str) -> str: for key in self._schematics: diff --git a/src/cpl_cli/command/new_service.py b/src/cpl_cli/command/new_service.py index 8b399d58..32c27def 100644 --- a/src/cpl_cli/command/new_service.py +++ b/src/cpl_cli/command/new_service.py @@ -1,6 +1,7 @@ import os import sys import textwrap +import traceback from typing import Optional from packaging import version @@ -8,24 +9,20 @@ from packaging import version import cpl_cli import cpl_core from cpl_cli.abc.project_type_abc import ProjectTypeABC -from cpl_cli.configuration.venv_helper_service import VenvHelper -from cpl_cli.source_creator.template_builder import TemplateBuilder -from cpl_cli.source_creator.unittest_builder import UnittestBuilder - -from cpl_core.configuration.configuration_abc import ConfigurationABC -from cpl_core.console.foreground_color_enum import ForegroundColorEnum -from cpl_core.console.console import Console -from cpl_core.utils.string import String from cpl_cli.command_abc import CommandABC from cpl_cli.configuration.build_settings import BuildSettings from cpl_cli.configuration.build_settings_name_enum import BuildSettingsNameEnum 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.venv_helper_service import VenvHelper 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 +from cpl_cli.source_creator.template_builder import TemplateBuilder +from cpl_core.configuration.configuration_abc import ConfigurationABC +from cpl_core.console.console import Console +from cpl_core.console.foreground_color_enum import ForegroundColorEnum +from cpl_core.utils.string import String class NewService(CommandABC): @@ -45,7 +42,6 @@ class NewService(CommandABC): self._project_dict = {} self._build: BuildSettings = BuildSettings() self._build_dict = {} - self._project_json = {} self._name: str = '' self._rel_path: str = '' @@ -107,9 +103,9 @@ class NewService(CommandABC): self._project.from_dict(self._project_dict) - def _create_build_settings(self): + def _create_build_settings(self, project_type: ProjectTypeEnum): self._build_dict = { - BuildSettingsNameEnum.project_type.value: self._project_type, + BuildSettingsNameEnum.project_type.value: project_type.value, BuildSettingsNameEnum.source_path.value: '', BuildSettingsNameEnum.output_path.value: '../../dist', BuildSettingsNameEnum.main.value: f'{String.convert_to_snake_case(self._project.name)}.main', @@ -178,99 +174,7 @@ class NewService(CommandABC): Console.set_foreground_color(ForegroundColorEnum.default) - def _console(self, args: list[str]): - """ - Generates new console project - :param args: - :return: - """ - self._create_project_settings() - self._create_build_settings() - self._create_project_json() - path = self._get_project_path() - if path is None: - return - - self._get_project_information() - project_name = self._project.name - if self._rel_path != '': - project_name = f'{self._rel_path}/{project_name}' - try: - ConsoleBuilder.build( - path, - self._use_application_api, - self._use_startup, - self._use_service_providing, - self._use_async, - project_name, - self._project_json, - self._workspace - ) - except Exception as e: - Console.error('Could not create project', str(e)) - - def _unittest(self, args: list[str]): - """ - Generates new unittest project - :param args: - :return: - """ - self._create_project_settings() - self._create_build_settings() - self._create_project_json() - path = self._get_project_path() - if path is None: - return - - self._get_project_information(is_unittest=True) - project_name = self._project.name - if self._rel_path != '': - project_name = f'{self._rel_path}/{project_name}' - try: - UnittestBuilder.build( - path, - self._use_application_api, - self._use_async, - project_name, - self._project_json, - self._workspace - ) - except Exception as e: - Console.error('Could not create project', str(e)) - - def _library(self, args: list[str]): - """ - Generates new library project - :param args: - :return: - """ - self._create_project_settings() - self._create_build_settings() - self._create_project_json() - path = self._get_project_path() - if path is None: - return - - self._get_project_information() - project_name = self._project.name - if self._rel_path != '': - project_name = f'{self._rel_path}/{project_name}' - try: - LibraryBuilder.build( - path, - self._use_application_api, - self._use_startup, - self._use_service_providing, - self._use_async, - project_name, - self._project_json, - self._workspace - ) - except Exception as e: - Console.error('Could not create project', str(e)) - def _create_venv(self): - project = self._project.name if self._workspace is not None: project = self._workspace.default_project @@ -296,22 +200,25 @@ class NewService(CommandABC): sys.path.insert(0, os.path.join(path, '.cpl')) for r, d, f in os.walk(os.path.join(path, '.cpl')): for file in f: - if not file.startswith('project_') or not file.endswith('.py'): + if file.startswith('project_file_') or not file.startswith('project_') or not file.endswith('.py'): continue - code = '' - with open(os.path.join(r, file), 'r') as py_file: - code = py_file.read() - py_file.close() + try: + exec(open(os.path.join(r, file), 'r').read()) + except Exception as e: + Console.error(str(e), traceback.format_exc()) + sys.exit(-1) - exec(code) - - def _create_project(self): + def _create_project(self, project_type: ProjectTypeEnum): self._read_custom_project_types_from_path(self._env.runtime_directory) self._read_custom_project_types_from_path(self._env.working_directory) + if len(ProjectTypeABC.__subclasses__()) == 0: + Console.error(f'No project types found in template directory: .cpl') + sys.exit() + self._create_project_settings() - self._create_build_settings() + self._create_build_settings(project_type) self._create_project_json() path = self._get_project_path() if path is None: @@ -322,19 +229,23 @@ class NewService(CommandABC): if self._rel_path != '': project_name = f'{self._rel_path}/{project_name}' - project_type = None + project_class = None for p in ProjectTypeABC.__subclasses__(): - if p.__name__.lower() != self._project_type: + if p.__name__.lower() != project_type.value and p.__name__.lower()[0] != project_type.value[0]: continue - project_type = p + project_class = p + + if project_class is None: + Console.error(f'Project type {project_type.value} not found in template directory: .cpl/') + sys.exit() base = 'src/' split_project_name = project_name.split('/') if self._use_base and len(split_project_name) > 0: base = f'{split_project_name[0]}/' - project = project_type( + project = project_class( base if self._workspace is not None else 'src/', project_name, self._workspace, @@ -342,6 +253,7 @@ class NewService(CommandABC): self._use_startup, self._use_service_providing, self._use_async, + self._project_json ) if self._workspace is None: @@ -349,24 +261,41 @@ class NewService(CommandABC): f'{project_name}/cpl-workspace.json', project_name.split('/')[-1], { - project_name: project_name + project_name: f'{base if self._workspace is not None else "src/"}{String.convert_to_snake_case(project_name)}/{project_name}.json' }, {} ) else: - self._workspace.projects[project_name] = f'{base}{String.convert_to_snake_case(project_name.split("/")[-1])}' + self._workspace.projects[project_name] = f'{base if self._workspace is not None else "src/"}{String.convert_to_snake_case(project_name)}/{project_name}.json' TemplateBuilder.create_workspace('cpl-workspace.json', self._workspace.default_project, self._workspace.projects, self._workspace.scripts) for template in project.templates: + rel_base = '/'.join(project_name.split('/')[:-1]) + template_path_base = template.path.split('/')[0] + if not self._use_base and rel_base != '' and template_path_base != '' and template_path_base != rel_base: + template.path = template.path.replace(f'{template_path_base}/', f'{template_path_base}/{rel_base}/') + + if template.name.endswith(f'{project_name.split("/")[-1]}.json'): + pass + + file_path = os.path.join( + project_name if self._workspace is None else '', + template.path, + template.name + ) + Console.spinner( - f'Creating {os.path.join(project_name, template.path, template.name)}', + f'Creating {file_path}', TemplateBuilder.build, - project_name, + file_path, template, text_foreground_color=ForegroundColorEnum.green, spinner_foreground_color=ForegroundColorEnum.cyan ) + if self._use_venv: + self._create_venv() + def execute(self, args: list[str]): """ Entry point of command @@ -412,25 +341,15 @@ class NewService(CommandABC): unittest = self._config.get_configuration(ProjectTypeEnum.unittest.value) if console is not None and library is None and unittest is None: self._name = console - self._project_type = ProjectTypeEnum.console.value - self._create_project() - # self._console(args) - if self._use_venv: - self._create_venv() + self._create_project(ProjectTypeEnum.console) elif console is None and library is not None and unittest is None: self._name = library - self._project_type = ProjectTypeEnum.library.value - self._library(args) - if self._use_venv: - self._create_venv() + self._create_project(ProjectTypeEnum.library) elif console is None and library is None and unittest is not None: self._name = unittest - self._project_type = ProjectTypeEnum.unittest.value - self._unittest(args) - if self._use_venv: - self._create_venv() + self._create_project(ProjectTypeEnum.unittest) else: Console.error(f'Project type not found') diff --git a/src/cpl_cli/publish/publisher_service.py b/src/cpl_cli/publish/publisher_service.py index b1639023..ca1a5382 100644 --- a/src/cpl_cli/publish/publisher_service.py +++ b/src/cpl_cli/publish/publisher_service.py @@ -404,7 +404,7 @@ class PublisherService(PublisherABC): f'--bdist-dir={os.path.join(self._output_path, "bdist")}', f'--dist-dir={os.path.join(self._output_path, "setup")}' ]) - os.remove(setup_py) + # os.remove(setup_py) except Exception as e: Console.error('Executing setup.py failed', str(e)) @@ -492,10 +492,10 @@ class PublisherService(PublisherABC): Console.write_line('Running setup.py:\n') self._run_setup() - Console.spinner( - 'Cleaning dist path:', - self._clean_dist_files, - text_foreground_color=ForegroundColorEnum.green, - spinner_foreground_color=ForegroundColorEnum.blue - ) + # Console.spinner( + # 'Cleaning dist path:', + # self._clean_dist_files, + # text_foreground_color=ForegroundColorEnum.green, + # spinner_foreground_color=ForegroundColorEnum.blue + # ) Console.write_line() diff --git a/src/cpl_cli/source_creator/console_builder.py b/src/cpl_cli/source_creator/console_builder.py deleted file mode 100644 index e8b86f84..00000000 --- a/src/cpl_cli/source_creator/console_builder.py +++ /dev/null @@ -1,182 +0,0 @@ -import json -import os -from typing import Optional - -from cpl_core.console.foreground_color_enum import ForegroundColorEnum -from cpl_core.console.console import Console -from cpl_core.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.console.appsettings_json import AppsettingsTemplate -from cpl_cli._templates.new.console.license import LicenseTemplate -from cpl_cli._templates.new.console.readme_py import ReadmeTemplate -from cpl_cli._templates.new.console.source.name.application import ApplicationTemplate -from cpl_cli._templates.new.console.source.name.init import MainInitTemplate -from cpl_cli._templates.new.console.source.name.main import MainWithApplicationHostAndStartupTemplate, \ - MainWithoutApplicationBaseTemplate, MainWithApplicationBaseTemplate, MainWithDependencyInjection -from cpl_cli._templates.new.console.source.name.startup import StartupTemplate -from cpl_cli._templates.new.console.source.tests.init import TestsInitTemplate -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class ConsoleBuilder: - - def __init__(self): - pass - - @staticmethod - def _create_file(file_name: str, content: dict): - if not os.path.isabs(file_name): - file_name = os.path.abspath(file_name) - - path = os.path.dirname(file_name) - if not os.path.isdir(path): - os.makedirs(path) - - with open(file_name, 'w') as project_json: - project_json.write(json.dumps(content, indent=2)) - project_json.close() - - @classmethod - def _create_workspace(cls, path: str, project_name, projects: dict, scripts: dict): - ws_dict = { - WorkspaceSettings.__name__: { - WorkspaceSettingsNameEnum.default_project.value: project_name, - WorkspaceSettingsNameEnum.projects.value: projects, - WorkspaceSettingsNameEnum.scripts.value: scripts - } - } - - Console.spinner( - f'Creating {path}', - cls._create_file, - path, - ws_dict, - text_foreground_color=ForegroundColorEnum.green, - spinner_foreground_color=ForegroundColorEnum.cyan - ) - - @classmethod - def build(cls, project_path: str, use_application_api: bool, use_startup: bool, use_service_providing: bool, - use_async: bool, project_name: str, project_settings: dict, workspace: Optional[WorkspaceSettings]): - """ - Builds the console project files - :param project_path: - :param use_application_api: - :param use_startup: - :param use_service_providing: - :param use_async: - :param project_name: - :param project_settings: - :param workspace: - :return: - """ - pj_name = project_name - if '/' in pj_name: - pj_name = pj_name.split('/')[len(pj_name.split('/')) - 1] - - project_name_snake = String.convert_to_snake_case(pj_name) - - if workspace is None: - templates: list[TemplateFileABC] = [ - LicenseTemplate(), - ReadmeTemplate(), - TestsInitTemplate(), - AppsettingsTemplate(), - MainInitTemplate(project_name, os.path.join('src/', project_name_snake)) - ] - else: - project_path = os.path.join( - os.path.dirname(project_path), - project_name_snake - ) - - templates: list[TemplateFileABC] = [ - AppsettingsTemplate(), - MainInitTemplate('', '') - ] - - if not os.path.isdir(project_path): - os.makedirs(project_path) - - py_src_rel_path = '' - src_name = project_name_snake - if workspace is None: - py_src_rel_path = f'src/{src_name}' - - if use_application_api: - templates.append(ApplicationTemplate(src_name, py_src_rel_path, use_async)) - - if use_startup: - templates.append(StartupTemplate(src_name, py_src_rel_path)) - templates.append(MainWithApplicationHostAndStartupTemplate(src_name, py_src_rel_path, use_async)) - else: - templates.append(MainWithApplicationBaseTemplate(src_name, py_src_rel_path, use_async)) - else: - if use_service_providing: - templates.append(MainWithDependencyInjection(src_name, py_src_rel_path, use_async)) - else: - templates.append(MainWithoutApplicationBaseTemplate(src_name, py_src_rel_path, use_async)) - - src_rel_path = '' - if '/' in project_name: - old_pj_name = project_name - parts = project_name.split('/') - project_name = parts[len(parts) - 1] - src_rel_path = old_pj_name.split(project_name)[0] - - proj_name = project_name - if src_rel_path.endswith('/'): - src_rel_path = src_rel_path[:len(src_rel_path) - 1] - - if src_rel_path != '': - proj_name = f'{src_rel_path}/{project_name}' - if workspace is not None: - proj_name = project_name_snake - - if src_rel_path != '': - project_file_path = f'{src_rel_path}/{project_name_snake}/{project_name}.json' - else: - project_file_path = f'{project_name_snake}/{project_name}.json' - - if workspace is None: - src_path = f'src/{project_name_snake}' - workspace_file_path = f'{proj_name}/cpl-workspace.json' - project_file_rel_path = f'{src_path}/{project_name}.json' - project_file_path = f'{proj_name}/{src_path}/{project_name}.json' - cls._create_workspace( - workspace_file_path, - project_name, - { - project_name: project_file_rel_path - }, - {} - ) - - else: - workspace.projects[project_name] = f'src/{project_file_path}' - cls._create_workspace('cpl-workspace.json', workspace.default_project, workspace.projects, workspace.scripts) - - Console.spinner( - f'Creating {project_file_path}', - cls._create_file, - 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 - ) - - for template in templates: - divider = '' - if template.path != '' and not template.path.endswith('/'): - divider = '/' - - Console.spinner( - f'Creating {proj_name}/{template.path}{divider}{template.name}', - TemplateBuilder.build, - project_path, - template, - text_foreground_color=ForegroundColorEnum.green, - spinner_foreground_color=ForegroundColorEnum.cyan - ) diff --git a/src/cpl_cli/source_creator/library_builder.py b/src/cpl_cli/source_creator/library_builder.py deleted file mode 100644 index 702aa449..00000000 --- a/src/cpl_cli/source_creator/library_builder.py +++ /dev/null @@ -1,186 +0,0 @@ -import json -import os -from typing import Optional - -from cpl_core.console.foreground_color_enum import ForegroundColorEnum -from cpl_core.console.console import Console -from cpl_core.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 -from cpl_cli._templates.new.library.license import LicenseTemplate -from cpl_cli._templates.new.library.readme_py import ReadmeTemplate -from cpl_cli._templates.new.library.source.name.application import ApplicationTemplate -from cpl_cli._templates.new.library.source.name.init import NameInitTemplate -from cpl_cli._templates.new.library.source.name.main import MainWithApplicationHostAndStartupTemplate, \ - MainWithoutApplicationBaseTemplate, MainWithApplicationBaseTemplate, MainWithDependencyInjection -from cpl_cli._templates.new.library.source.name.startup import StartupTemplate -from cpl_cli._templates.new.library.source.tests.init import TestsInitTemplate -from cpl_cli._templates.template_file_abc import TemplateFileABC - - -class LibraryBuilder: - - def __init__(self): - pass - - @staticmethod - def _create_file(file_name: str, content: dict): - if not os.path.isabs(file_name): - file_name = os.path.abspath(file_name) - - path = os.path.dirname(file_name) - if not os.path.isdir(path): - os.makedirs(path) - - with open(file_name, 'w') as project_json: - project_json.write(json.dumps(content, indent=2)) - project_json.close() - - @classmethod - def _create_workspace(cls, path: str, project_name, projects: dict, scripts: dict): - ws_dict = { - WorkspaceSettings.__name__: { - WorkspaceSettingsNameEnum.default_project.value: project_name, - WorkspaceSettingsNameEnum.projects.value: projects, - WorkspaceSettingsNameEnum.scripts.value: scripts, - } - } - - Console.spinner( - f'Creating {path}', - cls._create_file, - path, - ws_dict, - text_foreground_color=ForegroundColorEnum.green, - spinner_foreground_color=ForegroundColorEnum.cyan - ) - - @classmethod - def build(cls, project_path: str, use_application_api: bool, use_startup: bool, - use_async: bool, use_service_providing: bool, project_name: str, project_settings: dict, - workspace: Optional[WorkspaceSettings]): - """ - Builds the library project files - :param project_path: - :param use_application_api: - :param use_startup: - :param use_service_providing: - :param use_async: - :param project_name: - :param project_settings: - :param workspace: - :return: - """ - pj_name = project_name - if '/' in pj_name: - pj_name = pj_name.split('/')[len(pj_name.split('/')) - 1] - - project_name_snake = String.convert_to_snake_case(pj_name) - - if workspace is None: - templates: list[TemplateFileABC] = [ - LicenseTemplate(), - ReadmeTemplate(), - TestsInitTemplate(), - NameInitTemplate(project_name, os.path.join( - 'src/', project_name_snake)), - AppsettingsTemplate() - ] - else: - project_path = os.path.join( - os.path.dirname(project_path), - project_name_snake - ) - - templates: list[TemplateFileABC] = [ - LicenseTemplate(), - ReadmeTemplate(), - NameInitTemplate('', ''), - AppsettingsTemplate() - ] - - if not os.path.isdir(project_path): - os.makedirs(project_path) - - py_src_rel_path = '' - src_name = project_name_snake - if workspace is None: - py_src_rel_path = f'src/{src_name}' - - if use_application_api: - templates.append(ApplicationTemplate(src_name, py_src_rel_path, use_async)) - - if use_startup: - templates.append(StartupTemplate(src_name, py_src_rel_path)) - templates.append(MainWithApplicationHostAndStartupTemplate(src_name, py_src_rel_path, use_async)) - else: - templates.append(MainWithApplicationBaseTemplate(src_name, py_src_rel_path, use_async)) - else: - if use_service_providing: - templates.append(MainWithDependencyInjection(src_name, py_src_rel_path, use_async)) - else: - templates.append(MainWithoutApplicationBaseTemplate(src_name, py_src_rel_path, use_async)) - - src_rel_path = '' - if '/' in project_name: - old_pj_name = project_name - parts = project_name.split('/') - project_name = parts[len(parts) - 1] - src_rel_path = old_pj_name.split(project_name)[0] - - proj_name = project_name - if src_rel_path.endswith('/'): - src_rel_path = src_rel_path[:len(src_rel_path) - 1] - - if src_rel_path != '': - proj_name = f'{src_rel_path}/{project_name}' - if workspace is not None: - proj_name = project_name_snake - - if src_rel_path != '': - project_file_path = f'{src_rel_path}/{project_name_snake}/{project_name}.json' - else: - project_file_path = f'{project_name_snake}/{project_name}.json' - - if workspace is None: - src_path = f'src/{project_name_snake}' - workspace_file_path = f'{proj_name}/cpl-workspace.json' - project_file_rel_path = f'{src_path}/{project_name}.json' - project_file_path = f'{proj_name}/{src_path}/{project_name}.json' - cls._create_workspace( - workspace_file_path, - project_name, - { - project_name: project_file_rel_path - }, - {} - ) - - else: - workspace.projects[project_name] = f'src/{project_file_path}' - cls._create_workspace('cpl-workspace.json', workspace.default_project, workspace.projects, workspace.scripts) - - Console.spinner( - f'Creating {project_file_path}', - cls._create_file, - 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 - ) - - for template in templates: - divider = '' - if template.path != '' and not template.path.endswith('/'): - divider = '/' - - Console.spinner( - f'Creating {proj_name}/{template.path}{divider}{template.name}', - TemplateBuilder.build, - project_path, - template, - text_foreground_color=ForegroundColorEnum.green, - spinner_foreground_color=ForegroundColorEnum.cyan - ) diff --git a/src/cpl_cli/source_creator/template_builder.py b/src/cpl_cli/source_creator/template_builder.py index c661cd7a..798b4a9b 100644 --- a/src/cpl_cli/source_creator/template_builder.py +++ b/src/cpl_cli/source_creator/template_builder.py @@ -1,8 +1,6 @@ import json import os -from typing import Union -from cpl_cli._templates.template_file_abc import TemplateFileABC from cpl_cli.abc.file_template_abc import FileTemplateABC from cpl_cli.configuration import WorkspaceSettings, WorkspaceSettingsNameEnum from cpl_core.console import Console, ForegroundColorEnum @@ -11,7 +9,7 @@ from cpl_core.console import Console, ForegroundColorEnum class TemplateBuilder: @staticmethod - def _create_file(file_name: str, content: dict): + def build_cpl_file(file_name: str, content: dict): if not os.path.isabs(file_name): file_name = os.path.abspath(file_name) @@ -35,7 +33,7 @@ class TemplateBuilder: Console.spinner( f'Creating {path}', - cls._create_file, + cls.build_cpl_file, path, ws_dict, text_foreground_color=ForegroundColorEnum.green, @@ -43,14 +41,13 @@ class TemplateBuilder: ) @staticmethod - def build(project_path: str, template: Union[TemplateFileABC, FileTemplateABC]): + def build(file_path: str, template: FileTemplateABC): """ Creates template - :param project_path: + :param file_path: :param template: :return: """ - file_path = os.path.join(project_path, template.path, template.name) if not os.path.isdir(os.path.dirname(file_path)): os.makedirs(os.path.dirname(file_path)) diff --git a/src/cpl_cli/source_creator/unittest_builder.py b/src/cpl_cli/source_creator/unittest_builder.py deleted file mode 100644 index 805c6363..00000000 --- a/src/cpl_cli/source_creator/unittest_builder.py +++ /dev/null @@ -1,164 +0,0 @@ -import json -import os -from typing import Optional - -from cpl_cli._templates.new.unittest.license import LicenseTemplate -from cpl_cli._templates.new.unittest.readme_py import ReadmeTemplate -from cpl_cli._templates.new.unittest.source.name.application import ApplicationTemplate -from cpl_cli._templates.new.unittest.source.name.init import MainInitTemplate -from cpl_cli._templates.new.unittest.source.name.main import MainWithApplicationBaseTemplate -from cpl_cli._templates.new.unittest.source.name.test_case import TestCaseTemplate -from cpl_cli._templates.template_file_abc import TemplateFileABC -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_core.console.console import Console -from cpl_core.console.foreground_color_enum import ForegroundColorEnum -from cpl_core.utils.string import String - - -class UnittestBuilder: - - def __init__(self): - pass - - @staticmethod - def _create_file(file_name: str, content: dict): - if not os.path.isabs(file_name): - file_name = os.path.abspath(file_name) - - path = os.path.dirname(file_name) - if not os.path.isdir(path): - os.makedirs(path) - - with open(file_name, 'w') as project_json: - project_json.write(json.dumps(content, indent=2)) - project_json.close() - - @classmethod - def _create_workspace(cls, path: str, project_name, projects: dict, scripts: dict): - ws_dict = { - WorkspaceSettings.__name__: { - WorkspaceSettingsNameEnum.default_project.value: project_name, - WorkspaceSettingsNameEnum.projects.value: projects, - WorkspaceSettingsNameEnum.scripts.value: scripts - } - } - - Console.spinner( - f'Creating {path}', - cls._create_file, - path, - ws_dict, - text_foreground_color=ForegroundColorEnum.green, - spinner_foreground_color=ForegroundColorEnum.cyan - ) - - @classmethod - def build(cls, project_path: str, use_application_api: bool, - use_async: bool, project_name: str, project_settings: dict, workspace: Optional[WorkspaceSettings]): - """ - Builds the console project files - :param project_path: - :param use_application_api: - :param use_async: - :param project_name: - :param project_settings: - :param workspace: - :return: - """ - pj_name = project_name - if '/' in pj_name: - pj_name = pj_name.split('/')[len(pj_name.split('/')) - 1] - - project_name_snake = String.convert_to_snake_case(pj_name) - - if workspace is None: - templates: list[TemplateFileABC] = [ - LicenseTemplate(), - ReadmeTemplate(), - MainInitTemplate(project_name, os.path.join('src/', project_name_snake)) - ] - else: - project_path = os.path.join( - os.path.dirname(project_path), - project_name_snake - ) - - templates: list[TemplateFileABC] = [ - MainInitTemplate('', '') - ] - - if not os.path.isdir(project_path): - os.makedirs(project_path) - - py_src_rel_path = '' - src_name = project_name_snake - if workspace is None: - py_src_rel_path = f'src/{src_name}' - - templates.append(ApplicationTemplate(src_name, py_src_rel_path, use_async)) - templates.append(MainWithApplicationBaseTemplate(src_name, py_src_rel_path, use_async)) - templates.append(TestCaseTemplate(src_name, py_src_rel_path, use_async)) - - src_rel_path = '' - if '/' in project_name: - old_pj_name = project_name - parts = project_name.split('/') - project_name = parts[len(parts) - 1] - src_rel_path = old_pj_name.split(project_name)[0] - - proj_name = project_name - if src_rel_path.endswith('/'): - src_rel_path = src_rel_path[:len(src_rel_path) - 1] - - if src_rel_path != '': - proj_name = f'{src_rel_path}/{project_name}' - if workspace is not None: - proj_name = project_name_snake - - if src_rel_path != '': - project_file_path = f'{src_rel_path}/{project_name_snake}/{project_name}.json' - else: - project_file_path = f'{project_name_snake}/{project_name}.json' - - if workspace is None: - src_path = f'src/{project_name_snake}' - workspace_file_path = f'{proj_name}/cpl-workspace.json' - project_file_rel_path = f'{src_path}/{project_name}.json' - project_file_path = f'{proj_name}/{src_path}/{project_name}.json' - cls._create_workspace( - workspace_file_path, - project_name, - { - project_name: project_file_rel_path - }, - {} - ) - - else: - workspace.projects[project_name] = f'src/{project_file_path}' - cls._create_workspace('cpl-workspace.json', workspace.default_project, workspace.projects, workspace.scripts) - - Console.spinner( - f'Creating {project_file_path}', - cls._create_file, - 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 - ) - - for template in templates: - divider = '' - if template.path != '' and not template.path.endswith('/'): - divider = '/' - - Console.spinner( - f'Creating {proj_name}/{template.path}{divider}{template.name}', - TemplateBuilder.build, - project_path, - template, - text_foreground_color=ForegroundColorEnum.green, - spinner_foreground_color=ForegroundColorEnum.cyan - ) diff --git a/unittests/unittests_cli/abc/command_test_case.py b/unittests/unittests_cli/abc/command_test_case.py index 3b609cab..6f216e00 100644 --- a/unittests/unittests_cli/abc/command_test_case.py +++ b/unittests/unittests_cli/abc/command_test_case.py @@ -7,6 +7,7 @@ from unittests_cli.constants import PLAYGROUND_PATH class CommandTestCase(unittest.TestCase): + _skip_tear_down = False def __init__(self, method_name: str): unittest.TestCase.__init__(self, method_name) @@ -18,7 +19,8 @@ class CommandTestCase(unittest.TestCase): if os.path.exists(PLAYGROUND_PATH): shutil.rmtree(os.path.abspath(os.path.join(PLAYGROUND_PATH))) - os.makedirs(PLAYGROUND_PATH) + if not os.path.exists(PLAYGROUND_PATH): + os.makedirs(PLAYGROUND_PATH) os.chdir(PLAYGROUND_PATH) except Exception as e: print(f'Setup of {__name__} failed: {traceback.format_exc()}') @@ -28,6 +30,8 @@ class CommandTestCase(unittest.TestCase): @classmethod def tearDownClass(cls): + if cls._skip_tear_down: + return try: if os.path.exists(PLAYGROUND_PATH): shutil.rmtree(os.path.abspath(os.path.join(PLAYGROUND_PATH))) diff --git a/unittests/unittests_cli/add_test_case.py b/unittests/unittests_cli/add_test_case.py index 18efb1bd..e78ade03 100644 --- a/unittests/unittests_cli/add_test_case.py +++ b/unittests/unittests_cli/add_test_case.py @@ -28,7 +28,7 @@ class AddTestCase(CommandTestCase): # create projects CLICommands.new('console', self._source, '--ab', '--s') os.chdir(os.path.join(os.getcwd(), self._source)) - CLICommands.new('console', self._target, '--ab', '--s') + CLICommands.new('library', self._target, '--ab', '--s') def test_add(self): CLICommands.add(self._source, self._target) diff --git a/unittests/unittests_cli/new_test_case.py b/unittests/unittests_cli/new_test_case.py index 21191333..22c830f3 100644 --- a/unittests/unittests_cli/new_test_case.py +++ b/unittests/unittests_cli/new_test_case.py @@ -1,5 +1,6 @@ import json import os +import unittest from cpl_core.utils import String from unittests_cli.abc.command_test_case import CommandTestCase @@ -32,8 +33,8 @@ class NewTestCase(CommandTestCase): project_path = os.path.abspath(os.path.join(PLAYGROUND_PATH, base, name, 'src/', String.convert_to_snake_case(name))) self.assertTrue(os.path.exists(project_path)) - self.assertTrue(os.path.join(project_path, f'{name}.json')) - self.assertTrue(os.path.join(project_path, f'main.py')) + self.assertTrue(os.path.exists(os.path.join(project_path, f'{name}.json'))) + self.assertTrue(os.path.exists(os.path.join(project_path, f'main.py'))) if '--ab' in args: self.assertTrue(os.path.isfile(os.path.join(project_path, f'application.py'))) @@ -110,23 +111,23 @@ class NewTestCase(CommandTestCase): def test_console_without_anything(self): self._test_project('console', 'test-console-without-anything', '--n') - def test_sub_console(self): + def test_console_sub(self): self._test_sub_project('console', 'test-sub-console', 'test-console', '--ab', '--s', '--sp', '--venv', test_venv=True) - def test_sub_console_with_other_base(self): + def test_console_sub_with_other_base(self): self._test_sub_project('console', 'tools/test-sub-console', 'test-console', '--ab', '--s', '--sp', '--venv', '--base', test_venv=True) def test_library(self): self._test_project('library', 'test-library', '--ab', '--s', '--sp') - def test_sub_library(self): + def test_library_sub(self): self._test_sub_project('library', 'test-sub-library', 'test-console', '--ab', '--s', '--sp') - def test_sub_directory_library(self): + def test_library_sub_directory(self): self._test_sub_directory_project('library', 'directory', 'test-sub-library', 'test-console', '--ab', '--s', '--sp') def test_unittest(self): self._test_project('unittest', 'test-unittest', '--ab') - def test_sub_unittest(self): + def test_unittest_sub(self): self._test_sub_project('unittest', 'test-unittest', 'test-console', '--ab', '--s', '--sp') diff --git a/unittests/unittests_cli/publish_test_case.py b/unittests/unittests_cli/publish_test_case.py index 9992626b..c22dfba5 100644 --- a/unittests/unittests_cli/publish_test_case.py +++ b/unittests/unittests_cli/publish_test_case.py @@ -12,6 +12,7 @@ from unittests_shared.cli_commands import CLICommands class PublishTestCase(CommandTestCase): + CommandTestCase._skip_tear_down = True def __init__(self, method_name: str): CommandTestCase.__init__(self, method_name) @@ -26,6 +27,14 @@ class PublishTestCase(CommandTestCase): return project_json + def _get_appsettings(self): + with open(os.path.join(os.getcwd(), os.path.dirname(self._project_file), 'appsettings.json'), 'r', encoding='utf-8') as cfg: + # load json + project_json = json.load(cfg) + cfg.close() + + return project_json + def _save_project_settings(self, settings: dict): with open(os.path.join(os.getcwd(), self._project_file), 'w', encoding='utf-8') as project_file: project_file.write(json.dumps(settings, indent=2)) @@ -34,7 +43,7 @@ class PublishTestCase(CommandTestCase): def setUp(self): if not os.path.exists(PLAYGROUND_PATH): os.makedirs(PLAYGROUND_PATH) - + os.chdir(PLAYGROUND_PATH) # create projects CLICommands.new('console', self._source, '--ab', '--s') @@ -86,4 +95,8 @@ class PublishTestCase(CommandTestCase): with open(f'{full_dist_path}/{self._source}.json', 'w') as file: file.write(json.dumps(self._get_project_settings(), indent=2)) file.close() + + with open(f'{full_dist_path}/appsettings.json', 'w') as file: + file.write(json.dumps(self._get_appsettings(), indent=2)) + file.close() self.assertTrue(self._are_dir_trees_equal(f'./src/{String.convert_to_snake_case(self._source)}', full_dist_path)) From 42fb88c35d9a6457b3e545b120bf111d83540bba Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Wed, 7 Dec 2022 15:45:10 +0100 Subject: [PATCH 3/5] Removed old new command #139 --- src/cpl_cli/command/new_old_service.py | 356 ------------------------- 1 file changed, 356 deletions(-) delete mode 100644 src/cpl_cli/command/new_old_service.py diff --git a/src/cpl_cli/command/new_old_service.py b/src/cpl_cli/command/new_old_service.py deleted file mode 100644 index 5715f5cd..00000000 --- a/src/cpl_cli/command/new_old_service.py +++ /dev/null @@ -1,356 +0,0 @@ -import os -import sys -import textwrap -from typing import Optional - -from packaging import version - -import cpl_cli -import cpl_core -from cpl_cli.configuration.venv_helper_service import VenvHelper -from cpl_cli.source_creator.unittest_builder import UnittestBuilder - -from cpl_core.configuration.configuration_abc import ConfigurationABC -from cpl_core.console.foreground_color_enum import ForegroundColorEnum -from cpl_core.console.console import Console -from cpl_core.utils.string import String -from cpl_cli.command_abc import CommandABC -from cpl_cli.configuration.build_settings import BuildSettings -from cpl_cli.configuration.build_settings_name_enum import BuildSettingsNameEnum -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 - - -class NewService(CommandABC): - - def __init__(self, configuration: ConfigurationABC): - """ - Service for the CLI command new - :param configuration: - """ - CommandABC.__init__(self) - - self._config = configuration - self._env = self._config.environment - - self._workspace: WorkspaceSettings = self._config.get_configuration(WorkspaceSettings) - self._project: ProjectSettings = ProjectSettings() - self._project_dict = {} - self._build: BuildSettings = BuildSettings() - self._build_dict = {} - self._project_json = {} - - self._name: str = '' - self._rel_path: str = '' - self._schematic: ProjectTypeEnum = ProjectTypeEnum.console - self._use_nothing: bool = False - self._use_application_api: bool = False - self._use_startup: bool = False - self._use_service_providing: bool = False - self._use_async: bool = False - self._use_venv: bool = False - self._use_base: bool = False - - @property - def help_message(self) -> str: - return textwrap.dedent("""\ - Generates a workspace and initial project or add a project to workspace. - Usage: cpl new - - Arguments: - type The project type of the initial project - name Name of the workspace or the project - - Types: - console (c|C) - library (l|L) - unittest (ut|UT) - """) - - def _create_project_settings(self): - self._rel_path = os.path.dirname(self._name) - self._project_dict = { - ProjectSettingsNameEnum.name.value: os.path.basename(self._name), - ProjectSettingsNameEnum.version.value: { - VersionSettingsNameEnum.major.value: '0', - VersionSettingsNameEnum.minor.value: '0', - VersionSettingsNameEnum.micro.value: '0' - }, - ProjectSettingsNameEnum.author.value: '', - ProjectSettingsNameEnum.author_email.value: '', - ProjectSettingsNameEnum.description.value: '', - ProjectSettingsNameEnum.long_description.value: '', - ProjectSettingsNameEnum.url.value: '', - ProjectSettingsNameEnum.copyright_date.value: '', - ProjectSettingsNameEnum.copyright_name.value: '', - ProjectSettingsNameEnum.license_name.value: '', - ProjectSettingsNameEnum.license_description.value: '', - ProjectSettingsNameEnum.dependencies.value: [ - f'cpl-core>={version.parse(cpl_core.__version__)}' - ], - ProjectSettingsNameEnum.dev_dependencies.value: [ - f'cpl-cli>={version.parse(cpl_cli.__version__)}' - ], - ProjectSettingsNameEnum.python_version.value: f'>={sys.version.split(" ")[0]}', - ProjectSettingsNameEnum.python_path.value: { - sys.platform: '../../venv/bin/python' if self._use_venv else '' - }, - ProjectSettingsNameEnum.classifiers.value: [] - } - - self._project.from_dict(self._project_dict) - - def _create_build_settings(self): - self._build_dict = { - BuildSettingsNameEnum.project_type.value: self._schematic, - BuildSettingsNameEnum.source_path.value: '', - BuildSettingsNameEnum.output_path.value: '../../dist', - BuildSettingsNameEnum.main.value: f'{String.convert_to_snake_case(self._project.name)}.main', - BuildSettingsNameEnum.entry_point.value: self._project.name, - BuildSettingsNameEnum.include_package_data.value: False, - BuildSettingsNameEnum.included.value: [], - BuildSettingsNameEnum.excluded.value: [ - '*/__pycache__', - '*/logs', - '*/tests' - ], - BuildSettingsNameEnum.package_data.value: {}, - BuildSettingsNameEnum.project_references.value: [] - } - self._build.from_dict(self._build_dict) - - def _create_project_json(self): - """ - Creates cpl.json content - :return: - """ - self._project_json = { - ProjectSettings.__name__: self._project_dict, - BuildSettings.__name__: self._build_dict - } - - def _get_project_path(self) -> Optional[str]: - """ - Gets project path - :return: - """ - if self._workspace is None: - project_path = os.path.join(self._env.working_directory, self._rel_path, self._project.name) - else: - base = '' if self._use_base else 'src' - project_path = os.path.join(self._env.working_directory, base, self._rel_path, String.convert_to_snake_case(self._project.name)) - - if os.path.isdir(project_path) and len(os.listdir(project_path)) > 0: - Console.write_line(project_path) - Console.error('Project path is not empty\n') - return None - - return project_path - - def _get_project_information(self, is_unittest=False): - """ - Gets project information's from user - :return: - """ - if self._use_application_api or self._use_startup or self._use_service_providing or self._use_async or self._use_nothing: - Console.set_foreground_color(ForegroundColorEnum.default) - Console.write_line('Skipping question due to given flags') - return - - if not is_unittest: - self._use_application_api = Console.read('Do you want to use application base? (y/n) ').lower() == 'y' - - if not is_unittest and self._use_application_api: - self._use_startup = Console.read('Do you want to use startup? (y/n) ').lower() == 'y' - - if not is_unittest and not self._use_application_api: - self._use_service_providing = Console.read('Do you want to use service providing? (y/n) ').lower() == 'y' - - if not self._use_async: - self._use_async = Console.read('Do you want to use async? (y/n) ').lower() == 'y' - - Console.set_foreground_color(ForegroundColorEnum.default) - - def _console(self, args: list[str]): - """ - Generates new console project - :param args: - :return: - """ - self._create_project_settings() - self._create_build_settings() - self._create_project_json() - path = self._get_project_path() - if path is None: - return - - self._get_project_information() - project_name = self._project.name - if self._rel_path != '': - project_name = f'{self._rel_path}/{project_name}' - try: - ConsoleBuilder.build( - path, - self._use_application_api, - self._use_startup, - self._use_service_providing, - self._use_async, - project_name, - self._project_json, - self._workspace - ) - except Exception as e: - Console.error('Could not create project', str(e)) - - def _unittest(self, args: list[str]): - """ - Generates new unittest project - :param args: - :return: - """ - self._create_project_settings() - self._create_build_settings() - self._create_project_json() - path = self._get_project_path() - if path is None: - return - - self._get_project_information(is_unittest=True) - project_name = self._project.name - if self._rel_path != '': - project_name = f'{self._rel_path}/{project_name}' - try: - UnittestBuilder.build( - path, - self._use_application_api, - self._use_async, - project_name, - self._project_json, - self._workspace - ) - except Exception as e: - Console.error('Could not create project', str(e)) - - def _library(self, args: list[str]): - """ - Generates new library project - :param args: - :return: - """ - self._create_project_settings() - self._create_build_settings() - self._create_project_json() - path = self._get_project_path() - if path is None: - return - - self._get_project_information() - project_name = self._project.name - if self._rel_path != '': - project_name = f'{self._rel_path}/{project_name}' - try: - LibraryBuilder.build( - path, - self._use_application_api, - self._use_startup, - self._use_service_providing, - self._use_async, - project_name, - self._project_json, - self._workspace - ) - except Exception as e: - Console.error('Could not create project', str(e)) - - def _create_venv(self): - - project = self._project.name - if self._workspace is not None: - project = self._workspace.default_project - - if self._env.working_directory.endswith(project): - project = '' - - if self._workspace is None and self._use_base: - project = f'{self._rel_path}/{project}' - - VenvHelper.init_venv( - False, - self._env, - self._project, - explicit_path=os.path.join(self._env.working_directory, project, self._project.python_executable.replace('../', '')) - ) - - def execute(self, args: list[str]): - """ - Entry point of command - :param args: - :return: - """ - if 'nothing' in args: - self._use_nothing = True - self._use_async = False - self._use_application_api = False - self._use_startup = False - self._use_service_providing = False - if 'async' in args: - args.remove('async') - if 'application-base' in args: - args.remove('application-base') - if 'startup' in args: - args.remove('startup') - if 'service-providing' in args: - args.remove('service-providing') - - if 'async' in args: - self._use_async = True - args.remove('async') - if 'application-base' in args: - self._use_application_api = True - args.remove('application-base') - if 'startup' in args: - self._use_startup = True - args.remove('startup') - if 'service-providing' in args: - self._use_service_providing = True - args.remove('service-providing') - if 'venv' in args: - self._use_venv = True - args.remove('venv') - if 'base' in args: - self._use_base = True - args.remove('base') - - console = self._config.get_configuration(ProjectTypeEnum.console.value) - library = self._config.get_configuration(ProjectTypeEnum.library.value) - unittest = self._config.get_configuration(ProjectTypeEnum.unittest.value) - if console is not None and library is None and unittest is None: - self._name = console - self._schematic = ProjectTypeEnum.console.value - self._console(args) - if self._use_venv: - self._create_venv() - - elif console is None and library is not None and unittest is None: - self._name = library - self._schematic = ProjectTypeEnum.library.value - self._library(args) - if self._use_venv: - self._create_venv() - - elif console is None and library is None and unittest is not None: - self._name = unittest - self._schematic = ProjectTypeEnum.unittest.value - self._unittest(args) - if self._use_venv: - self._create_venv() - - else: - Console.error(f'Project type not found') - Console.write_line(self.help_message) - return From fe8ffb2839fd72e0e7810b6e9d88a9b978b9d9b7 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Wed, 7 Dec 2022 15:46:32 +0100 Subject: [PATCH 4/5] Removed comments #139 --- src/cpl_cli/publish/publisher_service.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/cpl_cli/publish/publisher_service.py b/src/cpl_cli/publish/publisher_service.py index ca1a5382..b1639023 100644 --- a/src/cpl_cli/publish/publisher_service.py +++ b/src/cpl_cli/publish/publisher_service.py @@ -404,7 +404,7 @@ class PublisherService(PublisherABC): f'--bdist-dir={os.path.join(self._output_path, "bdist")}', f'--dist-dir={os.path.join(self._output_path, "setup")}' ]) - # os.remove(setup_py) + os.remove(setup_py) except Exception as e: Console.error('Executing setup.py failed', str(e)) @@ -492,10 +492,10 @@ class PublisherService(PublisherABC): Console.write_line('Running setup.py:\n') self._run_setup() - # Console.spinner( - # 'Cleaning dist path:', - # self._clean_dist_files, - # text_foreground_color=ForegroundColorEnum.green, - # spinner_foreground_color=ForegroundColorEnum.blue - # ) + Console.spinner( + 'Cleaning dist path:', + self._clean_dist_files, + text_foreground_color=ForegroundColorEnum.green, + spinner_foreground_color=ForegroundColorEnum.blue + ) Console.write_line() From 1ca459e67add989cf351ba428e97377022ee1e74 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Wed, 7 Dec 2022 15:48:37 +0100 Subject: [PATCH 5/5] Removed skip test case #139 --- unittests/unittests_cli/publish_test_case.py | 1 - 1 file changed, 1 deletion(-) diff --git a/unittests/unittests_cli/publish_test_case.py b/unittests/unittests_cli/publish_test_case.py index c22dfba5..5d6a8f75 100644 --- a/unittests/unittests_cli/publish_test_case.py +++ b/unittests/unittests_cli/publish_test_case.py @@ -12,7 +12,6 @@ from unittests_shared.cli_commands import CLICommands class PublishTestCase(CommandTestCase): - CommandTestCase._skip_tear_down = True def __init__(self, method_name: str): CommandTestCase.__init__(self, method_name)