Browse Source

Subclass PluginManager to add some flaskbb specific stuff

Peter Justin 7 years ago
parent
commit
37bb1fb70e
3 changed files with 53 additions and 6 deletions
  1. 2 3
      flaskbb/app.py
  2. 48 0
      flaskbb/plugins/manager.py
  3. 3 3
      flaskbb/utils/helpers.py

+ 2 - 3
flaskbb/app.py

@@ -53,10 +53,9 @@ from flaskbb.utils.search import (PostWhoosheer, TopicWhoosheer,
 from flaskbb.utils.settings import flaskbb_config
 
 from flaskbb.plugins.models import PluginRegistry
+from flaskbb.plugins.manager import FlaskBBPluginManager
 from flaskbb.plugins import spec
 
-from pluggy import PluginManager
-
 
 def create_app(config=None):
     """Creates the app.
@@ -104,7 +103,7 @@ def configure_app(app, config):
     # Parse the env for FLASKBB_ prefixed env variables and set
     # them on the config object
     app_config_from_env(app, prefix="FLASKBB_")
-    app.pluggy = PluginManager('flaskbb', implprefix='flaskbb_')
+    app.pluggy = FlaskBBPluginManager('flaskbb', implprefix='flaskbb_')
 
 
 def configure_celery_app(app, celery):

+ 48 - 0
flaskbb/plugins/manager.py

@@ -0,0 +1,48 @@
+import pluggy
+from flaskbb.utils.helpers import parse_pkg_metadata
+
+
+class FlaskBBPluginManager(pluggy.PluginManager):
+    """Overwrites :class:`pluggy.PluginManager` to add FlaskBB
+    specific stuff.
+    """
+
+    def __init__(self, project_name, implprefix=None):
+        super(FlaskBBPluginManager, self).__init__(project_name=project_name,
+                                                   implprefix=implprefix)
+        self._plugin_metadata = {}
+        self._disabled_plugins = []
+
+    def load_setuptools_entrypoints(self, entrypoint_name):
+        """Load modules from querying the specified setuptools entrypoint name.
+        Return the number of loaded plugins. """
+        from pkg_resources import (iter_entry_points, DistributionNotFound,
+                                   VersionConflict)
+        for ep in iter_entry_points(entrypoint_name):
+            # is the plugin registered or blocked?
+            if self.get_plugin(ep.name) or self.is_blocked(ep.name):
+                self._disabled_plugins.append(ep.name, ep.dist)
+                continue
+            try:
+                plugin = ep.load()
+            except DistributionNotFound:
+                continue
+            except VersionConflict as e:
+                raise pluggy.PluginValidationError(
+                    "Plugin %r could not be loaded: %s!" % (ep.name, e))
+            self.register(plugin, name=ep.name)
+            self._plugin_distinfo.append((plugin, ep.dist))
+            self._plugin_metadata[ep.name] = parse_pkg_metadata(ep.dist.key)
+        return len(self._plugin_distinfo)
+
+    def get_metadata(self, name):
+        """Returns the metadata for a given name."""
+        return self._plugin_metadata.get(name)
+
+    def list_plugin_metadata(self):
+        """Returns the metadata for all plugins"""
+        return self._plugin_metadata
+
+    def list_disabled_plugins(self):
+        """Returns a name/distinfo tuple pairs of disabled plugins."""
+        return self._disabled_plugins

+ 3 - 3
flaskbb/utils/helpers.py

@@ -629,12 +629,12 @@ def real(obj):
     return obj
 
 
-def parse_pkginfo(plugin_dist_name):
-    raw_metadata = get_distribution(plugin_dist_name).get_metadata('PKG-INFO')
+def parse_pkg_metadata(dist_name):
+    raw_metadata = get_distribution(dist_name).get_metadata('PKG-INFO')
     metadata = {}
 
     # lets use the Parser from email to parse our metadata :)
     for key, value in message_from_string(raw_metadata).items():
-        metadata[key] = value
+        metadata[key.replace('-', '_').lower()] = value
 
     return metadata