Commit 5f11994b authored by Joel Collins's avatar Joel Collins
Browse files

Handle exceptions when loading extensions

parent fc6bea33
Loading
Loading
Loading
Loading
+14 −6
Original line number Diff line number Diff line
import logging
import collections
import copy
import traceback

from importlib import util
import sys
@@ -20,6 +21,7 @@ class BaseExtension:

    Handles binding route views and forms.
    """

    # TODO: Allow adding components to extensions

    def __init__(self, name: str, description="", version="0.0.0"):
@@ -113,15 +115,21 @@ def find_instances_in_module(module, class_to_find):
    return objs


def find_extensions_in_file(extension_path: str, module_name="extensions"):
def find_extensions_in_file(extension_path: str, module_name="extensions") -> list:
    logging.debug(f"Loading extensions from {extension_path}")

    spec = util.spec_from_file_location(module_name, extension_path)
    mod = util.module_from_spec(spec)
    sys.modules[spec.name] = mod

    try:
        spec.loader.exec_module(mod)

    except Exception as e:
        logging.error(
            f"Exception in extension path {extension_path}: \n{traceback.format_exc()}"
        )
        return []
    else:
        if hasattr(mod, "__extensions__"):
            return [getattr(mod, ext_name) for ext_name in mod.__extensions__]
        else: