Remove py2-isms and avoid sys.path hacks

This commit is contained in:
Deniz Turgut 2019-12-01 18:33:11 +03:00
commit ed1eca160e

View file

@ -1,9 +1,8 @@
import importlib import importlib
import importlib.machinery
import importlib.util
import logging import logging
import pkgutil import pkgutil
import sys
import six
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -39,6 +38,20 @@ def list_plugins(ns_pkg=None):
logger.info('No plugins are installed') logger.info('No plugins are installed')
def load_legacy_plugin(plugin, plugin_paths):
# Try to find plugin in PLUGIN_PATHS
spec = importlib.machinery.PathFinder.find_spec(plugin, plugin_paths)
if spec is None:
# If failed, try to find it in normal importable locations
spec = importlib.util.find_spec(plugin)
if spec is None:
raise ImportError('Cannot import plugin `{}`'.format(plugin))
else:
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)
return mod
def load_plugins(settings): def load_plugins(settings):
logger.debug('Finding namespace plugins') logger.debug('Finding namespace plugins')
namespace_plugins = get_namespace_plugins() namespace_plugins = get_namespace_plugins()
@ -47,13 +60,8 @@ def load_plugins(settings):
'\n'.join(namespace_plugins)) '\n'.join(namespace_plugins))
plugins = [] plugins = []
if settings.get('PLUGINS') is not None: if settings.get('PLUGINS') is not None:
_sys_path = sys.path[:]
for path in settings.get('PLUGIN_PATHS', []):
sys.path.insert(0, path)
for plugin in settings['PLUGINS']: for plugin in settings['PLUGINS']:
if isinstance(plugin, six.string_types): if isinstance(plugin, str):
logger.debug('Loading plugin `%s`', plugin) logger.debug('Loading plugin `%s`', plugin)
# try to find in namespace plugins # try to find in namespace plugins
if plugin in namespace_plugins: if plugin in namespace_plugins:
@ -64,13 +72,13 @@ def load_plugins(settings):
# try to import it # try to import it
else: else:
try: try:
plugin = __import__(plugin, globals(), locals(), plugin = load_legacy_plugin(
str('module')) plugin,
settings.get('PLUGIN_PATHS', []))
except ImportError as e: except ImportError as e:
logger.error('Cannot load plugin `%s`\n%s', plugin, e) logger.error('Cannot load plugin `%s`\n%s', plugin, e)
continue continue
plugins.append(plugin) plugins.append(plugin)
sys.path = _sys_path
else: else:
plugins = list(namespace_plugins.values()) plugins = list(namespace_plugins.values())