#
# Copyright (c) 2017 Philippe Proulx <pproulx@efficios.com>
-from bt2 import utils
-from bt2 import component as bt2_component
import sys
+from bt2 import utils as bt2_utils
+from bt2 import component as bt2_component
# Python plugin path to `_PluginInfo` (cache)
_plugin_infos = {}
def plugin_component_class(component_class):
if not issubclass(component_class, bt2_component._UserComponent):
- raise TypeError('component class is not a subclass of a user component class')
+ raise TypeError("component class is not a subclass of a user component class")
component_class._bt_plugin_component_class = None
return component_class
"cannot find module '{}' in loaded modules".format(module_name)
)
- utils._check_str(name)
+ bt2_utils._check_str(name)
if description is not None:
- utils._check_str(description)
+ bt2_utils._check_str(description)
if author is not None:
- utils._check_str(author)
+ bt2_utils._check_str(author)
if license is not None:
- utils._check_str(license)
+ bt2_utils._check_str(license)
if version is not None:
if not _validate_version(version):
raise ValueError(
- 'wrong version: expecting a tuple: (major, minor, patch) or (major, minor, patch, extra)'
+ "wrong version: expecting a tuple: (major, minor, patch) or (major, minor, patch, extra)"
)
sys.modules[module_name]._bt_plugin_info = _PluginInfo(
# do not load module and create plugin info twice for this path
return _plugin_infos[path]
- import importlib.machinery
- import inspect
import hashlib
+ import inspect
+ import importlib.machinery
if path is None:
- raise TypeError('missing path')
+ raise TypeError("missing path")
# In order to load the module uniquely from its path, even from
# different files which have the same basename, we hash the path
# and prefix with `bt_plugin_`. This is its key in sys.modules.
h = hashlib.sha256()
h.update(path.encode())
- module_name = 'bt_plugin_{}'.format(h.hexdigest())
+ module_name = "bt_plugin_{}".format(h.hexdigest())
assert module_name not in sys.modules
- # try loading the module: any raised exception is catched by the caller
- mod = importlib.machinery.SourceFileLoader(module_name, path).load_module()
+
+ # try loading the module: any raised exception is caught by the caller
+ if sys.version_info < (3, 5):
+ mod = importlib.machinery.SourceFileLoader(module_name, path).load_module()
+ else:
+ import importlib.util
+
+ loader = importlib.machinery.SourceFileLoader(module_name, path)
+ spec = importlib.util.spec_from_file_location(module_name, path, loader=loader)
+ mod = importlib.util.module_from_spec(spec)
+ sys.modules[mod.__name__] = mod
+ loader.exec_module(mod)
# we have the module: look for its plugin info first
- if not hasattr(mod, '_bt_plugin_info'):
+ if not hasattr(mod, "_bt_plugin_info"):
raise RuntimeError("missing '_bt_plugin_info' module attribute")
plugin_info = mod._bt_plugin_info
if not inspect.isclass(obj):
return False
- if not hasattr(obj, '_bt_plugin_component_class'):
+ if not hasattr(obj, "_bt_plugin_component_class"):
return False
return True