From 55212f31171d0d0d832159da43e752c231715628 Mon Sep 17 00:00:00 2001 From: Julio Faerman <356476+faermanj@users.noreply.github.com> Date: Tue, 14 Nov 2023 19:20:09 +0000 Subject: [PATCH] loading of config files from modules --- uplib/uplib/__init__.py | 2 ++ uplib/uplib/config.py | 17 ++++++++++----- uplib/uplib/plugins.py | 47 +++++++++++++++++++++-------------------- 3 files changed, 38 insertions(+), 28 deletions(-) diff --git a/uplib/uplib/__init__.py b/uplib/uplib/__init__.py index 366eb60..e4a081c 100644 --- a/uplib/uplib/__init__.py +++ b/uplib/uplib/__init__.py @@ -6,9 +6,11 @@ Prompt: TypeAlias = list[str] +# TODO: Consider moving all globals to a single object hookspec = pluggy.HookspecMarker("up") hookimpl = pluggy.HookimplMarker("up") pm = pluggy.PluginManager("up") +settings_files = [] from .match import does_match, if_prompt_matches from .containers import ContainerRun, ContainerRuns diff --git a/uplib/uplib/config.py b/uplib/uplib/config.py index 5ed45cb..2c29875 100644 --- a/uplib/uplib/config.py +++ b/uplib/uplib/config.py @@ -1,13 +1,20 @@ from dynaconf import Dynaconf import logging +from . import settings_files -settings = Dynaconf( - envvar_prefix="UP", - settings_files=['settings.toml', '.secrets.toml'] -) +_settings = None +def settings(): + global _settings + if not _settings: + _settings = Dynaconf( + environments=True, + envvar_prefix="UP", + settings_files=settings_files + ) + return _settings def get_log_level(): - level_name = settings.get("log_level", "INFO") + level_name = settings().get("log_level", "INFO") level = logging.getLevelName(level_name) return level diff --git a/uplib/uplib/plugins.py b/uplib/uplib/plugins.py index 0cf3a6f..abc9156 100644 --- a/uplib/uplib/plugins.py +++ b/uplib/uplib/plugins.py @@ -1,8 +1,9 @@ import importlib import pkgutil +import os import pluggy -from . import hookspec +from . import settings_files from .containers import Containers from .hookspecs import containers_for_prompt from .logging import log @@ -10,29 +11,29 @@ def load_plugins(context): log.info("Loading plugins") - discovered_plugins = { - name: importlib.import_module(name) - for finder, name, ispkg - in pkgutil.iter_modules() - if name.startswith('up_') - } - # for each plugin, seach its contents for all configuration files named up.yaml - plugin_names = discovered_plugins.keys() - for plugin_name in plugin_names: - load_plugin(plugin_name) + plugin_names = [] + for finder, name, ispkg in pkgutil.iter_modules(): + if name.startswith('up_'): + plugin_name = importlib.import_module(name) + plugin_names.append(name) + plugin_path = os.path.dirname(plugin_name.__file__) + load_plugin(plugin_name, plugin_path) log.info("Discovered %s plugins: %s", len(plugin_names), str(plugin_names)) + log.info("Discovered %s config files: %s", len(settings_files), str(settings_files)) # create a manager and add the spec - # pm.load_setuptools_entrypoints("up") - # pm.add_hookspecs(hookspec) - # log.debug("Plugins loaded.") - # log.debug(str(pm.get_plugins())) + # TODO: Check if this is needed pm.load_setuptools_entrypoints("up") + # TODO: Check if this is needed pm.add_hookspecs(hookspec) + -def load_plugin(plugin_name): - log.info("Loading plugin %s", plugin_name) +def load_plugin(plugin_name, plugin_path): + log.info("Loading plugin %s from %s", plugin_name, plugin_path) try: - cfg = pkgutil.get_data(plugin_name, "up.yaml") - except FileNotFoundError: - log.info("No up.yaml found in plugin %s", plugin_name) - cfg = None - if cfg: - print(str(cfg)) + plugin_file = plugin_path + "/up.yaml" + file_exists = os.path.isfile(plugin_file) + if file_exists: + settings_files.append(plugin_file) + log.info("Found up.yaml in plugin %s: %s", plugin_name, plugin_file) + else: + log.info("No up.yaml found in plugin %s: %s", plugin_name, plugin_file) + except Exception as e: + log.error("Error loading plugin %s: %s", plugin_name, str(e))