Source code for qarbon.plugin
# -*- coding: utf-8 -*-
# ----------------------------------------------------------------------------
# This file is part of qarbon (http://qarbon.rtfd.org/)
#
# Copyright (c) 2013 European Synchrotron Radiation Facility, Grenoble, France
#
# Distributed under the terms of the GNU Lesser General Public License,
# either version 3 of the License, or (at your option) any later version.
# See LICENSE.txt for more info.
# ----------------------------------------------------------------------------
"""Plugin extension manager."""
__all__ = ["get_plugins", "get_plugin_info", "IPlugin"]
import os
import abc
import imp
import inspect
import functools
from qarbon import config
QARBON_PLUGIN_MAGIC = "__qarbon_plugin__"
def get_plugin_candidates():
"""Get candidate plugin directories"""
plugins = []
for path in config.PLUGIN_PATH:
for elem in os.listdir(path):
if elem.startswith(".") or elem.startswith("."):
continue
full_elem = os.path.join(path, elem)
if not os.path.isdir(full_elem):
continue
if not os.path.exists(os.path.join(full_elem, "__init__.py")):
continue
plugins.append((path, elem))
return plugins
[docs]def get_plugins():
plugins = []
plugin_candidates = get_plugin_candidates()
for path, plugin in plugin_candidates:
try:
plugin_info = imp.find_module(plugin, [path])
except ImportError:
continue
plugin_module = imp.load_module(plugin, *plugin_info)
if hasattr(plugin_module, QARBON_PLUGIN_MAGIC):
plugins.append(plugin_module)
for member_name, member in inspect.getmembers(plugin_module):
if inspect.isclass(member) and hasattr(member, QARBON_PLUGIN_MAGIC):
plugins.append(member)
return plugins
[docs]def get_plugin_info(plugin):
return getattr(plugin, QARBON_PLUGIN_MAGIC)
[docs]def IPlugin(klass=None, **kwargs):
"""
Decorator that transforms the decorated class into a plugin point.
"""
if klass is None:
return functools.partial(IPlugin, **kwargs)
setattr(klass, QARBON_PLUGIN_MAGIC, kwargs)
return klass