Source code for seamm.plugin_manager
# -*- coding: utf-8 -*-
import logging
import pprint
import stevedore
"""A plugin manager based on Stevedore"""
logger = logging.getLogger(__name__)
[docs]
class PluginManager(object):
def __init__(self, namespace):
logger.info("Initializing extensions for {}".format(namespace))
self.namespace = namespace
self.manager = stevedore.extension.ExtensionManager(
namespace=self.namespace,
invoke_on_load=True,
on_load_failure_callback=self.load_failure,
)
self._plugins = {}
logger.info(
"Found {:d} extensions in '{:s}': {}".format(
len(self.manager.names()), self.namespace, self.manager.names()
)
)
logger.debug("Processing extensions")
for name in self.manager.names():
logger.debug(" extension name: {}".format(name))
extension = self.manager[name].obj
logger.debug(" extension object: {}".format(extension))
data = extension.description()
logger.debug(" extension data:")
logger.debug(pprint.pformat(data))
logger.debug("")
group = data["group"]
if group in self._plugins:
self._plugins[group].append(name)
else:
self._plugins[group] = [name]
[docs]
def load_failure(self, mgr, ep, err):
"""Called when the extension manager can't load an extension"""
logger.warning("Could not load %r: %s", ep.name, err)
[docs]
def get(self, name):
return self.manager[name].obj
[docs]
def groups(self):
return sorted(list(self._plugins.keys()))
[docs]
def plugins(self, group):
return sorted(list(self._plugins[group]))