88 lines
3.5 KiB
Python
88 lines
3.5 KiB
Python
from pythonapp.Instance.Instance import Instance
|
|
|
|
|
|
class InstanceHandler:
|
|
def __init__(self):
|
|
self._loaded_instances: dict[str, Instance] = {}
|
|
self._active_instance: Instance | None = None
|
|
pass
|
|
|
|
def _unknown_command(self, command: list[str]):
|
|
command_str = ''
|
|
for word in command: command_str += word + ' '
|
|
raise ValueError(f"Unknown INSTANCE subcommand: {command_str}")
|
|
|
|
def _create_handler(self, command: list[str]):
|
|
if len(command) < 4: raise ValueError("CREATE INSTANCE: missing arguments")
|
|
if command[1].upper() == "VENV":
|
|
Instance(path=command[3], env=command[1].lower(), python=command[2]).create()
|
|
|
|
def _activate_handler(self, command: list[str]):
|
|
if len(command) != 2: raise ValueError("ACTIVATE INSTANCE: missing arguments")
|
|
i = self._loaded_instances.get(command[1], None)
|
|
if i: self._active_instance = i
|
|
else: raise ValueError("ACTIVATE INSTANCE: instance not exists")
|
|
|
|
def _load_handler(self, command: list[str]):
|
|
if len(command) != 3: raise ValueError("LOAD INSTANCE: missing arguments")
|
|
name = command[1]
|
|
path = command[2]
|
|
i = Instance(path)
|
|
if not i.config.created: raise ValueError("ACTIVATE INSTANCE: instance not exists")
|
|
self._loaded_instances[name] = i
|
|
self._active_instance = i
|
|
print(f"instance {path} loaded and activated. identified by {name}")
|
|
|
|
def _show_handler(self, command: list[str]):
|
|
print("Environment type:", self._active_instance.config.env_type)
|
|
|
|
def _install_handler(self, command: list[str]):
|
|
if len(command) <= 2: raise ValueError("missing arguments")
|
|
verb = command[1].lower()
|
|
if verb == "package":
|
|
args = command[2:]
|
|
pkgs = []
|
|
repo = None
|
|
for arg in args:
|
|
if arg.lower().startswith("repo:"): repo = arg[5:]
|
|
else: pkgs.append(arg)
|
|
self._active_instance.install_packages(pkgs, repo)
|
|
|
|
if verb == "gitapp":
|
|
app_extensions_dir: str = None
|
|
app_models_dir: str = None
|
|
app_output_dir: str = None
|
|
app_input_dir: str = None
|
|
app_user_dir: str = None
|
|
req_file: str = 'requirements.txt'
|
|
url = command[2]
|
|
args = command[3:]
|
|
|
|
for arg in args:
|
|
if arg.lower().startswith("ext:"): app_extensions_dir = arg[4:]
|
|
elif arg.lower().startswith("mod:"): app_models_dir = arg[4:]
|
|
elif arg.lower().startswith("out:"): app_output_dir = arg[4:]
|
|
elif arg.lower().startswith("inp:"): app_input_dir = arg[4:]
|
|
elif arg.lower().startswith("usr:"): app_user_dir = arg[4:]
|
|
elif arg.lower().startswith("req:"): req_file = arg[4:]
|
|
|
|
self._active_instance.install_git_app(url, req_file, app_extensions_dir, app_models_dir, app_output_dir,
|
|
app_input_dir, app_user_dir)
|
|
|
|
|
|
def handle(self, command: list[str]):
|
|
if len(command) == 0: return
|
|
|
|
verb = command[0].upper()
|
|
|
|
if verb == "CREATE": self._create_handler(command)
|
|
elif verb == "LOAD": self._load_handler(command)
|
|
elif verb == "ACTIVATE": self._activate_handler(command)
|
|
elif verb == "SHOW": self._show_handler(command)
|
|
elif verb == "INSTALL": self._install_handler(command)
|
|
|
|
else:
|
|
self._unknown_command(command)
|
|
return
|
|
|
|
pass |