Fix bug where plugin load would pull in plugin imports

master
Tom Wilson 6 years ago
parent d6cc2983ea
commit 080fb20b01

@ -1,8 +1,9 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from contextlib import suppress import inspect
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
import importlib import importlib
import logging
from types import SimpleNamespace from types import SimpleNamespace
from collections import namedtuple from collections import namedtuple
@ -10,6 +11,7 @@ import sys
import os import os
import shepherd.scheduler import shepherd.scheduler
log = logging.getLogger(__name__)
class PluginLoadError(Exception): class PluginLoadError(Exception):
@ -259,15 +261,22 @@ def find_plugins(plugin_names, plugin_dir=None):
raise PluginLoadError("Could not find plugin "+plugin_name) raise PluginLoadError("Could not find plugin "+plugin_name)
# Scan imported module for Plugin subclass # Scan imported module for Plugin subclass
attrs = [getattr(mod, name) for name in dir(mod)] def is_module_plugin(member, module=mod):
for attr in attrs: return (inspect.isclass(member) and member.__module__ ==
with suppress(TypeError): module.__name__ and issubclass(member, Plugin))
if issubclass(attr, Plugin):
plugin_classes[plugin_name] = attr class_list = inspect.getmembers(mod, is_module_plugin)
break
if class_list:
if len(class_list) > 1:
log.warning(
F"Plugin module {mod.__name__} has more than one shepherd.Plugin subclass.")
_, plugin_classes[plugin_name] = class_list[0]
log.info(F"Loading plugin {plugin_classes[plugin_name].__name__}"
" from module {mod.__name__}")
else: else:
raise PluginLoadError("Imported shepherd plugin modules must contain a " raise PluginLoadError("Imported shepherd plugin modules must contain a"
"subclass of shepherd.plugin.Plugin, such as" " subclass of shepherd.plugin.Plugin, such as"
"shepherd.plugin.SimplePlugin") " shepherd.plugin.SimplePlugin")
return plugin_classes return plugin_classes

Loading…
Cancel
Save