Errors in plugins no longer caught as if the module just didn't exist
This commit is contained in:
parent
485ebe9fb1
commit
bda946bcc9
1 changed files with 35 additions and 7 deletions
|
|
@ -35,20 +35,48 @@ def module_from_file(plugin_path):
|
||||||
|
|
||||||
return plugin_spec, plugin_module, plugin_name
|
return plugin_spec, plugin_module, plugin_name
|
||||||
|
|
||||||
|
def check_module(module_path):
|
||||||
|
"""
|
||||||
|
Used to check if a module exists, without ever importing it.
|
||||||
|
|
||||||
|
This checks each nested level separately to avoid raising exceptions.
|
||||||
|
For example, checking "mymodule.submodule.subsubmodule" will first
|
||||||
|
check if 'mymodule' exists, then if it does, it will check
|
||||||
|
'mymodule.submodule', and so on.
|
||||||
|
"""
|
||||||
|
module_split = module_path.split(".")
|
||||||
|
spec_path = ""
|
||||||
|
|
||||||
|
for module_level in module_split:
|
||||||
|
spec_path += ".{}".format(module_level)
|
||||||
|
spec_path = spec_path.strip(".")
|
||||||
|
|
||||||
|
logging.debug("Checking {}".format(spec_path))
|
||||||
|
|
||||||
|
# Try to find a module loader for the plugin path
|
||||||
|
plugin_spec = importlib.util.find_spec(spec_path)
|
||||||
|
|
||||||
|
# If plugin spec doesn't exist, return False early
|
||||||
|
if plugin_spec is None:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# If all checks pass, return True
|
||||||
|
return True
|
||||||
|
|
||||||
def load_plugin_module(plugin_path):
|
def load_plugin_module(plugin_path):
|
||||||
# First, try importing from standard modules
|
|
||||||
try:
|
|
||||||
plugin_module = importlib.import_module(plugin_path)
|
|
||||||
except ImportError:
|
|
||||||
plugin_spec, plugin_module, plugin_name = module_from_file(plugin_path)
|
|
||||||
|
|
||||||
|
# If the loader was found (i.e. plugin probably exists)
|
||||||
|
if check_module(plugin_path):
|
||||||
|
plugin_module = importlib.import_module(plugin_path)
|
||||||
|
plugin_name = plugin_path.split('.')[-1]
|
||||||
|
|
||||||
|
# If no loader was found, try finding a file from path
|
||||||
|
else:
|
||||||
|
plugin_spec, plugin_module, plugin_name = module_from_file(plugin_path)
|
||||||
# If a valid plugin was found
|
# If a valid plugin was found
|
||||||
if plugin_spec and plugin_module:
|
if plugin_spec and plugin_module:
|
||||||
# Execute the module, so we have access to it
|
# Execute the module, so we have access to it
|
||||||
plugin_spec.loader.exec_module(plugin_module)
|
plugin_spec.loader.exec_module(plugin_module)
|
||||||
else:
|
|
||||||
plugin_name = plugin_path.split('.')[-1]
|
|
||||||
|
|
||||||
return plugin_module, plugin_name
|
return plugin_module, plugin_name
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue