diff --git a/src/luamb/_entrypoint.py b/src/luamb/_entrypoint.py index e97096b..a774971 100644 --- a/src/luamb/_entrypoint.py +++ b/src/luamb/_entrypoint.py @@ -1,4 +1,3 @@ -import os import sys @@ -16,21 +15,19 @@ def error(msg, exit_status=1): print(msg, file=sys.stderr) sys.exit(exit_status) + import os + from ._datadirs import ENVS_DIR from ._exceptions import LuambException from ._hererocks import import_hererocks from ._luamb import Luamb - hererocks = import_hererocks() - if not hererocks: - error("'hererocks' is not installed") - luamb = Luamb( envs_dir=ENVS_DIR, active_env=os.environ.get('LUAMB_ACTIVE_ENV'), lua_default=os.environ.get('LUAMB_LUA_DEFAULT'), luarocks_default=os.environ.get('LUAMB_LUAROCKS_DEFAULT'), - hererocks=hererocks, + hererocks=import_hererocks(), ) try: diff --git a/src/luamb/_luamb.py b/src/luamb/_luamb.py index 66b3f44..3910d40 100644 --- a/src/luamb/_luamb.py +++ b/src/luamb/_luamb.py @@ -6,16 +6,17 @@ import shutil import sys from collections import OrderedDict -from importlib import import_module from io import StringIO from typing import TYPE_CHECKING from . import __version__ from ._exceptions import LuambException +from ._hererocks import update_hererocks if TYPE_CHECKING: from pathlib import Path + from types import ModuleType class CMD(object): @@ -47,10 +48,10 @@ def render_help(self): continue cmd_str = cmd if cmd_info['aliases']: - cmd_str = '{0: <6}(aliases: {1})'.format( + cmd_str = '{0: <8}(aliases: {1})'.format( cmd_str, ', '.join(cmd_info['aliases'])) if cmd_info['desc']: - cmd_str = '{0: <38}{1}'.format(cmd_str, cmd_info['desc']) + cmd_str = '{0: <40}{1}'.format(cmd_str, cmd_info['desc']) help_list.append(cmd_str) return '\n'.join(help_list) @@ -135,21 +136,21 @@ class Luamb(object): cmd = CMD() + # {product_key: {version_alias: version}} + supported_versions: dict[str, dict[str, str]] + def __init__( - self, envs_dir: Path, active_env: str | None = None, - lua_default: str | None = None, - luarocks_default: str | None = None, - hererocks=None, + self, *, + envs_dir: Path, active_env: str | None = None, + lua_default: str | None = None, luarocks_default: str | None = None, + hererocks: ModuleType | None, ): self.envs_dir = envs_dir self.active_env = active_env self.lua_default = lua_default self.luarocks_default = luarocks_default - self.hererocks = hererocks or import_module('hererocks') - self.supported_versions = { - product_key: self._fetch_supported_versions(cls_name) - for product_key, cls_name in self.product_hererocks_classes.items() - } + self.hererocks = hererocks + self.supported_versions = {} def run(self, argv=None): if not argv: @@ -198,6 +199,8 @@ def cmd_off(self, argv): @cmd.add('mk', 'new', 'create') def cmd_mk(self, argv): """create new environment""" + if not self._check_hererocks_is_installed(): + return parser = argparse.ArgumentParser( prog='luamb mk', add_help=False, @@ -375,6 +378,8 @@ def cmd_rm(self, argv): @cmd.add('info', 'show') def cmd_info(self, argv): """show environment info""" + if not self._check_hererocks_is_installed(): + return if '-h' in argv or '--help' in argv: print("usage: luamb info [ENV_NAME]") return @@ -387,6 +392,8 @@ def cmd_info(self, argv): @cmd.add('ls', 'list') def cmd_ls(self, argv): """list available environments""" + if not self._check_hererocks_is_installed(): + return parser = argparse.ArgumentParser(prog='luamb ls') parser.add_argument( '-s', '--short', @@ -404,6 +411,19 @@ def cmd_ls(self, argv): if detail: print('\n') + @cmd.add('update', 'upgrade') + def cmd_update(self, argv): + """update hererocks""" + if '-h' in argv or '--help' in argv: + print("usage: luamb update") + return + print('updating hererocks') + updated = update_hererocks() + if updated: + print('updated') + else: + print('hererocks is already up-to-date') + @contextlib.contextmanager def _maybe_capture_output(self, capture_output): string_buffer = StringIO() @@ -470,7 +490,12 @@ def _fetch_supported_versions(self, hererocks_cls_name): return versions def _get_supported_versions(self, product_key, raise_exc=True): - versions = self.supported_versions[product_key] + supported_versions = self.supported_versions + if not supported_versions: + for prod_key, cls_name in self.product_hererocks_classes.items(): + supported_versions[prod_key] = self._fetch_supported_versions( + cls_name) + versions = supported_versions[product_key] if versions or not raise_exc: return versions raise LuambException( @@ -524,3 +549,9 @@ def _is_local_path_or_git_uri(self, version_string, skip_path_check=False): "'{}' is not a directory ".format(version_string) ) return True + + def _check_hererocks_is_installed(self) -> bool: + if self.hererocks is None: + print("'hererocks' is not installed, run 'luamb update'") + return False + return True