Improved cli
This commit is contained in:
parent
97b4f516a8
commit
88362006ef
0
src/sh_edraft/cli/command/__init__.py
Normal file
0
src/sh_edraft/cli/command/__init__.py
Normal file
0
src/sh_edraft/cli/command/base/__init__.py
Normal file
0
src/sh_edraft/cli/command/base/__init__.py
Normal file
10
src/sh_edraft/cli/command/base/command_base.py
Normal file
10
src/sh_edraft/cli/command/base/command_base.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
from abc import ABC, abstractmethod
|
||||||
|
|
||||||
|
|
||||||
|
class CommandBase(ABC):
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def __init__(self): pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def run(self, args: list[str]): pass
|
@ -1,25 +1,24 @@
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
from sh_edraft.cli.cpl_cli.cli_commands import CLICommands
|
from sh_edraft.cli.cpl_cli.commands.help import Help
|
||||||
|
from sh_edraft.cli.cpl_cli.commands.new import New
|
||||||
|
from sh_edraft.cli.interpreter.interpreter import Interpreter
|
||||||
|
|
||||||
|
|
||||||
class CLI:
|
class CLI:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._commands: dict = {}
|
self._interpreter = Interpreter()
|
||||||
|
|
||||||
def setup(self):
|
def setup(self):
|
||||||
self._commands[CLICommands.new.__name__] = CLICommands.new
|
self._interpreter.add_command(New())
|
||||||
self._commands[CLICommands.help.__name__] = CLICommands.help
|
self._interpreter.add_command(Help())
|
||||||
|
|
||||||
def main(self):
|
def main(self):
|
||||||
args = sys.argv[1:]
|
print('CPL CLI:')
|
||||||
|
string = ' '.join(sys.argv[1:])
|
||||||
try:
|
try:
|
||||||
cmd = self._commands[args[0]]
|
self._interpreter.interpret(string)
|
||||||
cmd(args[1:])
|
|
||||||
except KeyError:
|
|
||||||
CLICommands.unexpected_command(args[0])
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(e)
|
print(e)
|
||||||
|
|
||||||
|
@ -60,7 +60,11 @@ class CLICommands:
|
|||||||
if name[0].islower():
|
if name[0].islower():
|
||||||
name = f'{name[0].upper()}{name[1:]}'
|
name = f'{name[0].upper()}{name[1:]}'
|
||||||
|
|
||||||
if args[0] == 'configmodel':
|
if args[0] == 'base':
|
||||||
|
template_content = template_content.replace('$Name', f'{name}Base')
|
||||||
|
pyfile.write(template_content)
|
||||||
|
|
||||||
|
elif args[0] == 'configmodel':
|
||||||
template_content = template_content.replace('$Name', f'{name}Settings')
|
template_content = template_content.replace('$Name', f'{name}Settings')
|
||||||
pyfile.write(template_content)
|
pyfile.write(template_content)
|
||||||
|
|
||||||
|
0
src/sh_edraft/cli/cpl_cli/commands/__init__.py
Normal file
0
src/sh_edraft/cli/cpl_cli/commands/__init__.py
Normal file
10
src/sh_edraft/cli/cpl_cli/commands/help.py
Normal file
10
src/sh_edraft/cli/cpl_cli/commands/help.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
from sh_edraft.cli.command.base.command_base import CommandBase
|
||||||
|
|
||||||
|
|
||||||
|
class Help(CommandBase):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
CommandBase.__init__(self)
|
||||||
|
|
||||||
|
def run(self, args: list[str]):
|
||||||
|
print('Commands:')
|
84
src/sh_edraft/cli/cpl_cli/commands/new.py
Normal file
84
src/sh_edraft/cli/cpl_cli/commands/new.py
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
|
from sh_edraft.cli.command.base.command_base import CommandBase
|
||||||
|
|
||||||
|
|
||||||
|
class New(CommandBase):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
CommandBase.__init__(self)
|
||||||
|
|
||||||
|
def run(self, args: list[str]):
|
||||||
|
rel_path = f'{os.path.dirname(__file__)}/../'
|
||||||
|
if not os.path.isdir(f'{rel_path}/templates/{args[0]}'):
|
||||||
|
print(f'Unexpected argument {args[0]}')
|
||||||
|
|
||||||
|
sub_args = args[1:]
|
||||||
|
|
||||||
|
if len(sub_args) != 1:
|
||||||
|
print(f'Unexpected argument {sub_args[1]}')
|
||||||
|
|
||||||
|
if not (sub_args[0].startswith('.') or sub_args[0].startswith('/')):
|
||||||
|
full_path = f'./{sub_args[0]}'
|
||||||
|
else:
|
||||||
|
full_path = sub_args[0]
|
||||||
|
|
||||||
|
name = os.path.basename(full_path)
|
||||||
|
path = os.path.dirname(full_path)
|
||||||
|
|
||||||
|
if args[0] in ['base', 'class', 'configmodel', 'enum', 'service']:
|
||||||
|
if not os.path.isdir(path):
|
||||||
|
os.makedirs(path)
|
||||||
|
else:
|
||||||
|
if not os.path.isdir(full_path):
|
||||||
|
os.makedirs(full_path)
|
||||||
|
|
||||||
|
for r, d, f in os.walk(f'{rel_path}/templates/{args[0]}'):
|
||||||
|
for file in f:
|
||||||
|
template_content = ''
|
||||||
|
with open(f'{r}/{file}') as template:
|
||||||
|
template_content = template.read()
|
||||||
|
template.close()
|
||||||
|
|
||||||
|
file = file.replace('txt', 'py')
|
||||||
|
if args[0] in ['base', 'class', 'configmodel', 'enum', 'service']:
|
||||||
|
suffix = None
|
||||||
|
|
||||||
|
if args[0] == 'base':
|
||||||
|
suffix = 'base'
|
||||||
|
|
||||||
|
elif args[0] == 'configmodel':
|
||||||
|
suffix = 'settings'
|
||||||
|
|
||||||
|
elif args[0] == 'service':
|
||||||
|
suffix = 'service'
|
||||||
|
|
||||||
|
if suffix is not None:
|
||||||
|
file_path = f'{path}/{name}_{suffix}.py'
|
||||||
|
else:
|
||||||
|
file_path = f'{path}/{name}.py'
|
||||||
|
else:
|
||||||
|
file_path = f'{full_path}/{file}'
|
||||||
|
|
||||||
|
with open(file_path, 'w+') as pyfile:
|
||||||
|
if name[0].islower():
|
||||||
|
name = f'{name[0].upper()}{name[1:]}'
|
||||||
|
|
||||||
|
if args[0] == 'base':
|
||||||
|
template_content = template_content.replace('$Name', f'{name}Base')
|
||||||
|
pyfile.write(template_content)
|
||||||
|
|
||||||
|
elif args[0] == 'configmodel':
|
||||||
|
template_content = template_content.replace('$Name', f'{name}Settings')
|
||||||
|
pyfile.write(template_content)
|
||||||
|
|
||||||
|
elif args[0] == 'service':
|
||||||
|
template_content = template_content.replace('$Name', f'{name}Service')
|
||||||
|
template_content = template_content.replace('$Base', f'{name}Base')
|
||||||
|
pyfile.write(template_content)
|
||||||
|
|
||||||
|
else:
|
||||||
|
template_content = template_content.replace('$Name', name)
|
||||||
|
pyfile.write(template_content)
|
||||||
|
|
||||||
|
pyfile.close()
|
0
src/sh_edraft/cli/interpreter/__init__.py
Normal file
0
src/sh_edraft/cli/interpreter/__init__.py
Normal file
28
src/sh_edraft/cli/interpreter/interpreter.py
Normal file
28
src/sh_edraft/cli/interpreter/interpreter.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
from sh_edraft.cli.command.base.command_base import CommandBase
|
||||||
|
|
||||||
|
|
||||||
|
class Interpreter:
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self._commands: list[CommandBase] = []
|
||||||
|
|
||||||
|
def add_command(self, command: CommandBase):
|
||||||
|
self._commands.append(command)
|
||||||
|
|
||||||
|
def remove_command(self, command: CommandBase):
|
||||||
|
self._commands.remove(command)
|
||||||
|
|
||||||
|
def interpret(self, input_string: str):
|
||||||
|
input_list = input_string.split(' ')
|
||||||
|
commands = [type(cmd).__name__.lower() for cmd in self._commands]
|
||||||
|
command = input_list[0]
|
||||||
|
args = input_list[1:]
|
||||||
|
print(command)
|
||||||
|
if command in commands:
|
||||||
|
cmd = next((cmd for cmd in self._commands if type(cmd).__name__.lower() == command), None)
|
||||||
|
if cmd is not None:
|
||||||
|
cmd.run(args)
|
||||||
|
else:
|
||||||
|
print(f'Unexpected command {command}')
|
||||||
|
else:
|
||||||
|
print(f'Unexpected command {command}')
|
Loading…
Reference in New Issue
Block a user