Read pkginfo data for plugins retrieved via entry_point and use that to populate author, version, name, description and url data in PluginInfo object

This data can still be overwritten from within the Plugin itself by setting the correponding __plugin_xyz__ variables, however it allows getting rid of some repetition if that data has already been specified in setup.py
This commit is contained in:
Gina Häußge 2015-01-26 17:27:34 +01:00
parent 922ee39109
commit 19f9400b11
2 changed files with 31 additions and 14 deletions

View file

@ -13,3 +13,4 @@ sarge
netifaces
pylru
rsa
pkginfo

View file

@ -34,16 +34,18 @@ class PluginInfo(object):
attr_init = '__plugin_init__'
def __init__(self, key, location, instance, version=None):
def __init__(self, key, location, instance, name=None, version=None, description=None, author=None, url=None):
self.key = key
self.location = location
self.instance = instance
self.origin = None
self.bundled = False
self._name = name
self._version = version
if self.name is None:
raise ValueError("Plugin {key} doesn't have a name".format(key=key))
self._description = description
self._author = author
self._url = url
def __str__(self):
return "{name} ({version})".format(name=self.name, version=self.version if self.version else "unknown")
@ -66,23 +68,23 @@ class PluginInfo(object):
@property
def name(self):
return self._get_instance_attribute(self.__class__.attr_name, default=None)
return self._get_instance_attribute(self.__class__.attr_name, default=self._name)
@property
def description(self):
return self._get_instance_attribute(self.__class__.attr_description, default=None)
return self._get_instance_attribute(self.__class__.attr_description, default=self._description)
@property
def version(self):
return self._version if self._version is not None else self._get_instance_attribute(self.__class__.attr_version, default=None)
return self._version if self._version is not None else self._get_instance_attribute(self.__class__.attr_version, default=self._version)
@property
def author(self):
return self._get_instance_attribute(self.__class__.attr_author, default=None)
return self._get_instance_attribute(self.__class__.attr_author, default=self._author)
@property
def url(self):
return self._get_instance_attribute(self.__class__.attr_url, default=None)
return self._get_instance_attribute(self.__class__.attr_url, default=self._url)
@property
def hooks(self):
@ -173,6 +175,7 @@ class PluginManager(object):
def _add_plugins_from_entry_points(self, groups, plugins):
import pkg_resources
import pkginfo
if not isinstance(groups, (list, tuple)):
groups = [groups]
@ -191,14 +194,27 @@ class PluginManager(object):
# plugin is already defined, ignore it
continue
plugin = self._load_plugin_from_module(key, module_name=module_name, version=version)
kwargs = dict(module_name=module_name, version=version)
try:
module_pkginfo = pkginfo.Installed(module_name)
except:
self.logger.exception("Something went wrong while retrieving package info data for module %s" % module_name)
else:
kwargs.update(dict(
name=module_pkginfo.name,
summary=module_pkginfo.summary,
author=module_pkginfo.author,
url=module_pkginfo.home_page
))
plugin = self._load_plugin_from_module(key, **kwargs)
if plugin:
plugin.origin = ("entry_point", group)
plugins[key] = plugin
return plugins
def _load_plugin_from_module(self, key, folder=None, module_name=None, version=None):
def _load_plugin_from_module(self, key, folder=None, module_name=None, name=None, version=None, summary=None, author=None, url=None):
# TODO error handling
if folder:
module = imp.find_module(key, [folder])
@ -207,7 +223,7 @@ class PluginManager(object):
else:
return None
plugin = self._load_plugin(key, *module, version=version)
plugin = self._load_plugin(key, *module, name=name, version=version, summary=summary, author=author, url=url)
if plugin:
if plugin.check():
return plugin
@ -216,10 +232,10 @@ class PluginManager(object):
return None
def _load_plugin(self, key, f, filename, description, version=None):
def _load_plugin(self, key, f, filename, description, name=None, version=None, summary=None, author=None, url=None):
try:
instance = imp.load_module(key, f, filename, description)
return PluginInfo(key, filename, instance, version=version)
return PluginInfo(key, filename, instance, name=name, version=version, description=summary, author=author, url=url)
except:
self.logger.exception("Error loading plugin {key}, disabling it".format(key=key))
return None