No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

plugins.py 2.7KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #-*- coding: utf-8 -*-
  2. import os.path
  3. from importlib.machinery import SourceFileLoader, SourcelessFileLoader
  4. ## @package lodel.plugins Lodel2 plugins management
  5. #
  6. # Lodel2 plugins are stored in directories
  7. # A typicall lodel2 plugin directory structure looks like :
  8. # - {{__init__.py}}} containing informations like full_name, authors, licence etc.
  9. # - main.py containing hooks registration etc
  10. # - confspec.py containing a configuration specification dictionary named CONFSPEC
  11. VIRTUAL_PACKAGE_NAME = 'lodel.plugins_pkg'
  12. CONFSPEC_NAME = 'confspec.py'
  13. class PluginError(Exception):
  14. pass
  15. class Plugins(object):
  16. ## @brief Stores plugin directories paths
  17. _plugin_directories = None
  18. ## @brief Optimisation cache storage for plugin paths
  19. _plugin_paths = dict()
  20. def __init__(self):
  21. self.started()
  22. ## @brief Given a plugin name returns the plugin path
  23. # @param plugin_name str : The plugin name
  24. # @return the plugin directory path
  25. @classmethod
  26. def plugin_path(cls, plugin_name):
  27. cls.started()
  28. try:
  29. return cls._plugin_paths[plugin_name]
  30. except KeyError:
  31. pass
  32. path = None
  33. for cur_path in cls._plugin_directories:
  34. plugin_path = os.path.join(cur_path, plugin_name)+'/'
  35. print(plugin_path)
  36. if os.path.isdir(plugin_path):
  37. return plugin_path
  38. raise NameError("No plugin named '%s'" % plugin_name)
  39. ## @brief Fetch a confspec given a plugin_name
  40. # @param plugin_name str : The plugin name
  41. # @return a dict of conf spec
  42. # @throw PluginError if plugin_name is not valid
  43. @classmethod
  44. def get_confspec(cls, plugin_name):
  45. cls.started()
  46. plugin_path = cls.plugin_path(plugin_name)
  47. plugin_module = '%s.%s' % ( VIRTUAL_PACKAGE_NAME,
  48. plugin_name)
  49. conf_spec_module = plugin_module + '.confspec'
  50. conf_spec_source = plugin_path + CONFSPEC_NAME
  51. try:
  52. loader = SourceFileLoader(conf_spec_module, conf_spec_source)
  53. confspec_module = loader.load_module()
  54. except ImportError:
  55. raise PluginError("Failed to load plugin '%s'. It seems that the plugin name is not valid" % plugin_name)
  56. return getattr(confspec_module, 'CONFSPEC')
  57. ## @brief Bootstrap the Plugins class
  58. @classmethod
  59. def bootstrap(cls, plugins_directories):
  60. cls._plugin_directories = plugins_directories
  61. @classmethod
  62. def started(cls, raise_if_not = True):
  63. res = cls._plugin_directories is not None
  64. if raise_if_not and not res:
  65. raise RuntimeError("Class Plugins is not initialized")