diff --git a/docs/cli.txt b/docs/cli.txt index f2f2291e..2c396d12 100644 --- a/docs/cli.txt +++ b/docs/cli.txt @@ -1,9 +1,19 @@ prefix: cpl commands: - new: - app - base - class - configmodel - enum - service \ No newline at end of file + build + + generate: + abc | a + class | c + configmodel | cm + enum | e + service | s + + help + new + console + + start + publish + update + version \ No newline at end of file diff --git a/docs/project_structure.txt b/docs/project_structure.txt index 851a92d9..0b77880d 100644 --- a/docs/project_structure.txt +++ b/docs/project_structure.txt @@ -1,4 +1,7 @@ +/docs/ /src/ +/src/assets +/src/tests /.gitignore /cpl.json /LICENSE diff --git a/src/cpl_cli/__main__.py b/src/cpl_cli/__main__.py deleted file mode 100644 index 71a2066f..00000000 --- a/src/cpl_cli/__main__.py +++ /dev/null @@ -1,4 +0,0 @@ -from cpl_cli.main import main - -if __name__ == '__main__': - main() diff --git a/src/cpl_cli/cli.py b/src/cpl_cli/cli.py index 8ca039b3..49be2723 100644 --- a/src/cpl_cli/cli.py +++ b/src/cpl_cli/cli.py @@ -2,6 +2,7 @@ from typing import Optional from cpl.application.application_abc import ApplicationABC from cpl_cli.command.build import Build +from cpl_cli.command.new import New from cpl_cli.command.publish import Publish from cpl_cli.command_handler import CommandHandler from cpl_cli.command_model import CommandModel @@ -22,6 +23,7 @@ class CLI(ApplicationABC): self._command_handler.add_command(CommandModel('build', ['h', 'B'], Build, True)) self._command_handler.add_command(CommandModel('help', ['h', 'H'], Help, False)) + self._command_handler.add_command(CommandModel('new', ['n', 'N'], New, False)) self._command_handler.add_command(CommandModel('publish', ['p', 'P'], Publish, True)) self._command_handler.add_command(CommandModel('version', ['v', 'V'], Version, False)) diff --git a/src/cpl_cli/command/new.py b/src/cpl_cli/command/new.py index e69de29b..7f480106 100644 --- a/src/cpl_cli/command/new.py +++ b/src/cpl_cli/command/new.py @@ -0,0 +1,109 @@ +import json +import os +import sys +from distutils.dir_util import copy_tree + +from cpl.application.application_runtime_abc import ApplicationRuntimeABC +from cpl.configuration.configuration_abc import ConfigurationABC +from cpl.console.console import Console +from cpl_cli.command_abc import CommandABC +from cpl_cli.configuration.build_settings import BuildSettings +from cpl_cli.configuration.build_settings_name import BuildSettingsName +from cpl_cli.configuration.project_settings import ProjectSettings +from cpl_cli.configuration.project_settings_name import ProjectSettingsName +from cpl_cli.configuration.version_settings_name import VersionSettingsName + + +class New(CommandABC): + + def __init__(self, configuration: ConfigurationABC, runtime: ApplicationRuntimeABC): + CommandABC.__init__(self) + + self._config = configuration + self._runtime = runtime + + self._project: ProjectSettings = ProjectSettings() + self._project_dict = {} + self._build: BuildSettings = BuildSettings() + self._build_dict = {} + self._project_json = {} + + self._command: str = '' + + def _create_project_settings(self, name: str): + self._project_dict = { + ProjectSettingsName.name.value: name, + ProjectSettingsName.version.value: { + VersionSettingsName.major.value: '0', + VersionSettingsName.minor.value: '0', + VersionSettingsName.micro.value: '0' + }, + ProjectSettingsName.author.value: '', + ProjectSettingsName.author_email.value: '', + ProjectSettingsName.description.value: '', + ProjectSettingsName.long_description.value: '', + ProjectSettingsName.url.value: '', + ProjectSettingsName.copyright_date.value: '', + ProjectSettingsName.copyright_name.value: '', + ProjectSettingsName.license_name.value: '', + ProjectSettingsName.license_description.value: '', + ProjectSettingsName.dependencies.value: [], + ProjectSettingsName.python_version.value: f'>={sys.version.split(" ")[0]}' + } + + self._project.from_dict(self._project_dict) + + def _create_build_settings(self): + self._build_dict = { + BuildSettingsName.source_path.value: 'src', + BuildSettingsName.output_path.value: 'dist', + BuildSettingsName.main.value: 'main', + BuildSettingsName.entry_point.value: self._project.name, + BuildSettingsName.include_package_data.value: 'False', + BuildSettingsName.included.value: [], + BuildSettingsName.excluded.value: [ + '*/__pycache__', + '*/logs', + '*/tests' + ], + BuildSettingsName.package_data.value: {} + } + self._build.from_dict(self._build_dict) + + def _create_project_json(self): + self._project_json = { + ProjectSettings.__name__: self._project_dict, + BuildSettings.__name__: self._build_dict + } + + def _create_project_dir(self): + project_path = os.path.join(self._runtime.working_directory, self._project.name) + if os.path.isdir(project_path) and len(os.listdir(project_path)) > 0: + Console.error('Project path is not empty\n') + exit() + + if not os.path.isdir(project_path): + os.makedirs(project_path) + + with open(os.path.join(project_path, 'cpl.json'), 'w') as project_json: + project_json.write(json.dumps(self._project_json, indent=4)) + project_json.close() + + template_path = os.path.join(self._runtime.runtime_directory, f'templates/new/{self._command}') + if not os.path.isdir(template_path): + Console.error(template_path, '\n\nTemplate path not found\n') + exit() + + copy_tree(template_path, project_path) + + def _console(self, args: list[str]): + name = self._config.get_configuration(self._command) + self._create_project_settings(name) + self._create_build_settings() + self._create_project_json() + self._create_project_dir() + + def run(self, args: list[str]): + self._command = args[0] + if self._command == 'console': + self._console(args) diff --git a/src/cpl_cli/main.py b/src/cpl_cli/main.py index 6ffc9477..5be6a86d 100644 --- a/src/cpl_cli/main.py +++ b/src/cpl_cli/main.py @@ -7,3 +7,7 @@ def main(): cli.use_startup(Startup) cli.build() cli.run() + + +if __name__ == '__main__': + main() diff --git a/src/cpl_cli/startup.py b/src/cpl_cli/startup.py index 924bf28a..b5eab567 100644 --- a/src/cpl_cli/startup.py +++ b/src/cpl_cli/startup.py @@ -3,9 +3,11 @@ from typing import Optional from cpl.application.application_host import ApplicationHost from cpl.application.application_host_abc import ApplicationHostABC from cpl.application.startup_abc import StartupABC +from cpl.configuration.console_argument import ConsoleArgument from cpl.configuration.configuration_abc import ConfigurationABC from cpl.dependency_injection.service_provider_abc import ServiceProviderABC from cpl_cli.command.build import Build +from cpl_cli.command.new import New from cpl_cli.command.publish import Publish from cpl_cli.command_handler import CommandHandler from cpl_cli.command.help import Help @@ -39,10 +41,13 @@ class Startup(StartupABC): self._configuration.add_environment_variables('PYTHON_') self._configuration.add_environment_variables('CPL_') self._configuration.add_json_file('cpl.json', optional=True, output=False) - self._configuration.add_console_argument('', 'build', ['-b', '-B'], '') - self._configuration.add_console_argument('', 'help', ['-h', '-H'], '') - self._configuration.add_console_argument('', 'publish', ['-p', '-P'], '') - self._configuration.add_console_argument('', 'version', ['-v', '-V'], '') + self._configuration.add_console_argument(ConsoleArgument('', 'build', ['b', 'B'], '')) + self._configuration.add_console_argument(ConsoleArgument('', 'help', ['h', 'H'], '')) + self._configuration.add_console_argument(ConsoleArgument('', 'new', ['n', 'N'], '', [ + ConsoleArgument('', 'console', ['c', 'C'], ' ') + ])) + self._configuration.add_console_argument(ConsoleArgument('', 'publish', ['p', 'P'], '')) + self._configuration.add_console_argument(ConsoleArgument('', 'version', ['v', 'V'], '')) self._configuration.add_console_arguments() return self._configuration @@ -54,6 +59,7 @@ class Startup(StartupABC): self._services.add_transient(Build) self._services.add_transient(Help) + self._services.add_transient(New) self._services.add_transient(Publish) self._services.add_transient(Version) diff --git a/src/cpl_cli/templates/new/console/LICENSE b/src/cpl_cli/templates/new/console/LICENSE new file mode 100644 index 00000000..e69de29b diff --git a/src/cpl_cli/templates/new/console/README.md b/src/cpl_cli/templates/new/console/README.md new file mode 100644 index 00000000..e69de29b diff --git a/src/cpl_cli/templates/new/console/src/application.py b/src/cpl_cli/templates/new/console/src/application.py new file mode 100644 index 00000000..68f52e71 --- /dev/null +++ b/src/cpl_cli/templates/new/console/src/application.py @@ -0,0 +1,14 @@ +from cpl.application.application_abc import ApplicationABC +from cpl.console.console import Console + + +class Application(ApplicationABC): + + def __init__(self): + ApplicationABC.__init__(self) + + def configure(self): + pass + + def main(self): + Console.write_line('Hello World') diff --git a/src/cpl_cli/templates/new/console/src/main.py b/src/cpl_cli/templates/new/console/src/main.py new file mode 100644 index 00000000..27456a7f --- /dev/null +++ b/src/cpl_cli/templates/new/console/src/main.py @@ -0,0 +1,13 @@ +from startup import Startup +from application import Application + + +def main(): + app = Application() + app.use_startup(Startup) + app.build() + app.run() + + +if __name__ == '__main__': + main() diff --git a/src/cpl_cli/templates/new/console/src/startup.py b/src/cpl_cli/templates/new/console/src/startup.py new file mode 100644 index 00000000..1b6eea85 --- /dev/null +++ b/src/cpl_cli/templates/new/console/src/startup.py @@ -0,0 +1,33 @@ +from typing import Optional + +from cpl.application.application_host import ApplicationHost +from cpl.application.application_host_abc import ApplicationHostABC +from cpl.application.startup_abc import StartupABC +from cpl.configuration.configuration_abc import ConfigurationABC +from cpl.dependency_injection.service_provider_abc import ServiceProviderABC + + +class Startup(StartupABC): + + def __init__(self): + StartupABC.__init__(self) + + self._app_host: Optional[ApplicationHostABC] = None + self._configuration: Optional[ConfigurationABC] = None + self._services: Optional[ServiceProviderABC] = None + + def create_application_host(self) -> ApplicationHostABC: + self._app_host = ApplicationHost() + self._configuration = self._app_host.configuration + self._services = self._app_host.services + return self._app_host + + def create_configuration(self) -> ConfigurationABC: + pass + + return self._configuration + + def create_services(self) -> ServiceProviderABC: + pass + + return self._services diff --git a/src/cpl_cli/templates/new/console/src/tests/__init__.py b/src/cpl_cli/templates/new/console/src/tests/__init__.py new file mode 100644 index 00000000..e69de29b