sh_cpl/src/cpl_cli/command/new.py

110 lines
4.2 KiB
Python
Raw Normal View History

2021-03-09 22:29:14 +01:00
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)