manager.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. # -*- coding: utf-8 -*-
  2. """
  3. flaskbb.plugins.manager
  4. ~~~~~~~~~~~~~~~~~~~~~~~
  5. Plugin Manager for FlaskBB
  6. :copyright: 2017, the FlaskBB Team
  7. :license: BSD, see LICENSE for more details
  8. """
  9. from pkg_resources import (DistributionNotFound, VersionConflict,
  10. iter_entry_points)
  11. import pluggy
  12. from flaskbb.utils.helpers import parse_pkg_metadata
  13. class FlaskBBPluginManager(pluggy.PluginManager):
  14. """Overwrites :class:`pluggy.PluginManager` to add FlaskBB
  15. specific stuff.
  16. """
  17. def __init__(self, project_name, implprefix=None):
  18. super(FlaskBBPluginManager, self).__init__(
  19. project_name=project_name, implprefix=implprefix
  20. )
  21. self._plugin_metadata = {}
  22. self._disabled_plugins = []
  23. def load_setuptools_entrypoints(self, entrypoint_name):
  24. """Load modules from querying the specified setuptools entrypoint name.
  25. Return the number of loaded plugins. """
  26. for ep in iter_entry_points(entrypoint_name):
  27. if self.get_plugin(ep.name):
  28. continue
  29. if self.is_blocked(ep.name):
  30. self._disabled_plugins.append((ep.name, ep.dist))
  31. continue
  32. try:
  33. plugin = ep.load()
  34. except DistributionNotFound:
  35. continue
  36. except VersionConflict as e:
  37. raise pluggy.PluginValidationError(
  38. "Plugin %r could not be loaded: %s!" % (ep.name, e)
  39. )
  40. self.register(plugin, name=ep.name)
  41. self._plugin_distinfo.append((plugin, ep.dist))
  42. self._plugin_metadata[ep.name] = parse_pkg_metadata(ep.dist.key)
  43. return len(self._plugin_distinfo)
  44. def get_metadata(self, name):
  45. """Returns the metadata for a given name."""
  46. return self._plugin_metadata.get(name)
  47. def list_plugin_metadata(self):
  48. """Returns the metadata for all plugins"""
  49. return self._plugin_metadata
  50. def list_disabled_plugins(self):
  51. """Returns a name/distinfo tuple pairs of disabled plugins."""
  52. return self._disabled_plugins