2021-03-10 22:29:42 +01:00
|
|
|
import os
|
2021-03-12 15:32:37 +01:00
|
|
|
from collections import Callable
|
2021-03-10 22:29:42 +01:00
|
|
|
|
|
|
|
from cpl.configuration.configuration_abc import ConfigurationABC
|
2021-03-12 16:06:30 +01:00
|
|
|
from cpl.console.foreground_color_enum import ForegroundColorEnum
|
2021-03-10 22:29:42 +01:00
|
|
|
from cpl.console.console import Console
|
2021-03-12 15:35:54 +01:00
|
|
|
from cpl.utils.string import String
|
2021-03-10 22:29:42 +01:00
|
|
|
from cpl_cli.command_abc import CommandABC
|
|
|
|
from cpl_cli.templates.generate.abc_template import ABCTemplate
|
2021-03-12 15:32:37 +01:00
|
|
|
from cpl_cli.templates.generate.class_template import ClassTemplate
|
|
|
|
from cpl_cli.templates.generate.configmodel_template import ConfigModelTemplate
|
|
|
|
from cpl_cli.templates.generate.enum_template import EnumTemplate
|
|
|
|
from cpl_cli.templates.generate.service_template import ServiceTemplate
|
2021-03-12 16:01:44 +01:00
|
|
|
from cpl_cli.templates.generate.thread_template import ThreadTemplate
|
2021-03-12 15:32:37 +01:00
|
|
|
from cpl_cli.templates.template_file_abc import TemplateFileABC
|
2021-03-10 22:29:42 +01:00
|
|
|
|
|
|
|
|
2021-03-12 16:06:30 +01:00
|
|
|
class GenerateService(CommandABC):
|
2021-03-10 22:29:42 +01:00
|
|
|
|
2021-03-29 09:21:58 +02:00
|
|
|
def __init__(self, configuration: ConfigurationABC):
|
2021-03-14 16:01:15 +01:00
|
|
|
"""
|
|
|
|
Service for the CLI command generate
|
|
|
|
:param configuration:
|
|
|
|
"""
|
2021-03-10 22:29:42 +01:00
|
|
|
CommandABC.__init__(self)
|
|
|
|
|
2021-03-12 15:32:37 +01:00
|
|
|
self._schematics = {
|
|
|
|
"abc": {
|
|
|
|
"Upper": "ABC",
|
|
|
|
"Template": ABCTemplate
|
|
|
|
},
|
|
|
|
"class": {
|
2021-03-12 15:58:30 +01:00
|
|
|
"Upper": "",
|
2021-03-12 15:32:37 +01:00
|
|
|
"Template": ClassTemplate
|
|
|
|
},
|
|
|
|
"enum": {
|
|
|
|
"Upper": "Enum",
|
|
|
|
"Template": EnumTemplate
|
|
|
|
},
|
|
|
|
"service": {
|
|
|
|
"Upper": "Service",
|
|
|
|
"Template": ServiceTemplate
|
2021-03-12 15:44:55 +01:00
|
|
|
},
|
|
|
|
"settings": {
|
|
|
|
"Upper": "Settings",
|
|
|
|
"Template": ConfigModelTemplate
|
2021-03-12 16:01:44 +01:00
|
|
|
},
|
|
|
|
"thread": {
|
|
|
|
"Upper": "Thread",
|
|
|
|
"Template": ThreadTemplate
|
2021-03-12 15:32:37 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-03-10 22:29:42 +01:00
|
|
|
self._config = configuration
|
2021-03-29 09:21:58 +02:00
|
|
|
self._env = self._config.environment
|
2021-03-10 22:29:42 +01:00
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def _help(message: str):
|
2021-03-14 16:01:15 +01:00
|
|
|
"""
|
|
|
|
Internal help output
|
|
|
|
:param message:
|
|
|
|
:return:
|
|
|
|
"""
|
2021-03-10 22:29:42 +01:00
|
|
|
Console.error(message)
|
|
|
|
|
|
|
|
schematics = [
|
2021-03-12 15:44:55 +01:00
|
|
|
'abc (a|A)',
|
|
|
|
'class (c|C)',
|
|
|
|
'enum (e|E)',
|
|
|
|
'service (s|S)',
|
|
|
|
'settings (st|ST)'
|
2021-03-10 22:29:42 +01:00
|
|
|
]
|
|
|
|
Console.write_line('Available Schematics:')
|
|
|
|
for name in schematics:
|
|
|
|
Console.write(f'\n\t{name} ')
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def _create_file(file_path: str, value: str):
|
2021-03-14 16:01:15 +01:00
|
|
|
"""
|
|
|
|
Creates the given file with content
|
|
|
|
:param file_path:
|
|
|
|
:param value:
|
|
|
|
:return:
|
|
|
|
"""
|
2021-03-10 22:29:42 +01:00
|
|
|
with open(file_path, 'w') as template:
|
|
|
|
template.write(value)
|
|
|
|
template.close()
|
|
|
|
|
2021-03-12 15:32:37 +01:00
|
|
|
def _generate(self, schematic: str, name: str, template: Callable[TemplateFileABC]):
|
2021-03-14 16:01:15 +01:00
|
|
|
"""
|
|
|
|
Generates files by given schematic, name and template
|
|
|
|
:param schematic:
|
|
|
|
:param name:
|
|
|
|
:param template:
|
|
|
|
:return:
|
|
|
|
"""
|
2021-03-12 15:32:37 +01:00
|
|
|
class_name = name
|
2021-03-10 22:29:42 +01:00
|
|
|
rel_path = ''
|
|
|
|
if '/' in name:
|
|
|
|
parts = name.split('/')
|
|
|
|
rel_path = '/'.join(parts[:-1])
|
2021-03-12 15:32:37 +01:00
|
|
|
class_name = parts[len(parts) - 1]
|
|
|
|
|
|
|
|
template = template(class_name, schematic, self._schematics[schematic]["Upper"], rel_path)
|
2021-03-10 22:29:42 +01:00
|
|
|
|
2021-03-29 09:21:58 +02:00
|
|
|
file_path = os.path.join(self._env.working_directory, template.path, template.name)
|
2021-03-10 22:29:42 +01:00
|
|
|
if not os.path.isdir(os.path.dirname(file_path)):
|
|
|
|
os.makedirs(os.path.dirname(file_path))
|
|
|
|
|
|
|
|
if os.path.isfile(file_path):
|
2021-03-12 15:32:37 +01:00
|
|
|
Console.error(f'{String.first_to_upper(schematic)} already exists!')
|
2021-03-10 22:29:42 +01:00
|
|
|
exit()
|
|
|
|
|
2021-03-29 09:21:58 +02:00
|
|
|
message = f'Creating {self._env.working_directory}/{template.path}/{template.name}'
|
2021-03-12 15:32:37 +01:00
|
|
|
if template.path == '':
|
2021-03-29 09:21:58 +02:00
|
|
|
message = f'Creating {self._env.working_directory}/{template.name}'
|
2021-03-10 22:29:42 +01:00
|
|
|
|
|
|
|
Console.spinner(
|
|
|
|
message,
|
|
|
|
self._create_file,
|
|
|
|
file_path,
|
2021-03-12 15:32:37 +01:00
|
|
|
template.value,
|
2021-03-12 16:06:30 +01:00
|
|
|
text_foreground_color=ForegroundColorEnum.green,
|
|
|
|
spinner_foreground_color=ForegroundColorEnum.cyan
|
2021-03-10 22:29:42 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
def run(self, args: list[str]):
|
2021-03-14 16:01:15 +01:00
|
|
|
"""
|
|
|
|
Entry point of command
|
|
|
|
:param args:
|
|
|
|
:return:
|
|
|
|
"""
|
2021-03-10 22:29:42 +01:00
|
|
|
if len(args) == 0:
|
|
|
|
self._help('Usage: cpl generate <schematic> [options]')
|
|
|
|
exit()
|
|
|
|
|
|
|
|
schematic = args[0]
|
|
|
|
name = self._config.get_configuration(schematic)
|
|
|
|
if name is None:
|
|
|
|
name = Console.read(f'Name for the {args[0]}: ')
|
|
|
|
|
2021-03-12 15:32:37 +01:00
|
|
|
if schematic in self._schematics:
|
|
|
|
s = self._schematics[schematic]
|
|
|
|
self._generate(schematic, name, s["Template"])
|
2021-03-10 22:29:42 +01:00
|
|
|
|
|
|
|
else:
|
2021-03-11 09:43:45 +01:00
|
|
|
self._help('Usage: cpl generate <schematic> [options]')
|
2021-03-10 22:29:42 +01:00
|
|
|
exit()
|