Added better error handling.

This commit is contained in:
Anton Hvornum 2021-05-24 14:12:23 +02:00
parent c7426067dd
commit 250eb93f10
2 changed files with 16 additions and 5 deletions

View File

@ -60,7 +60,7 @@ def initialize_arguments():
arguments = initialize_arguments()
from .lib.plugins import plugins # This initiates the plugin loading ceremony
from .lib.plugins import plugins, load_plugin # This initiates the plugin loading ceremony
# TODO: Learn the dark arts of argparse... (I summon thee dark spawn of cPython)

View File

@ -3,6 +3,7 @@ import importlib
import logging
import os
import sys
import pathlib
import urllib.parse
import urllib.request
from importlib import metadata
@ -37,17 +38,21 @@ def import_via_path(path :str, namespace=None): # -> module (not sure how to wri
if not namespace:
namespace = os.path.basename(path)
if namespace == '__init__.py':
path = pathlib.PurePath(path)
namespace = path.parent.name
try:
spec = importlib.util.spec_from_file_location(namespace, path)
imported = importlib.util.module_from_spec(spec)
sys.modules[namespace] = imported
spec.loader.exec_module(sys.modules[namespace])
return namespace
except Exception as err:
log(err, level=logging.ERROR)
log(f"The above error was detected when loading the plugin: {path}", fg="red", level=logging.ERROR)
return sys.modules[namespace]
def load_plugin(path :str): # -> module (not sure how to write that in type definitions)
parsed_url = urllib.parse.urlparse(path)
@ -55,6 +60,12 @@ def load_plugin(path :str): # -> module (not sure how to write that in type defi
if not parsed_url.scheme:
# Path was not found in any known examples, check if it's an absolute path
if os.path.isfile(path):
return import_via_path(path)
namespace = import_via_path(path)
elif parsed_url.scheme in ('https', 'http'):
return import_via_path(localize_path(path))
namespace = import_via_path(localize_path(path))
try:
plugins[namespace] = sys.modules[namespace].Plugin()
except Exception as err:
log(err, level=logging.ERROR)
log(f"The above error was detected when loading the plugin: {path}", fg="red", level=logging.ERROR)