From 19f9400b1152d6cada8aa15b111c896de66223fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Mon, 26 Jan 2015 17:27:34 +0100 Subject: [PATCH] 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 --- requirements.txt | 1 + src/octoprint/plugin/core.py | 44 ++++++++++++++++++++++++------------ 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/requirements.txt b/requirements.txt index 2a9f5c54..3b88143d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,3 +13,4 @@ sarge netifaces pylru rsa +pkginfo diff --git a/src/octoprint/plugin/core.py b/src/octoprint/plugin/core.py index 770da190..f6cfbf40 100644 --- a/src/octoprint/plugin/core.py +++ b/src/octoprint/plugin/core.py @@ -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