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.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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 Plugins(object):
  14. ## @brief Stores plugin directories paths
  15. _plugin_directories = None
  16. ## @brief Optimisation cache storage for plugin paths
  17. _plugin_paths = dict()
  18. def __init__(self):
  19. self.started()
  20. ## @brief Given a plugin name returns the plugin path
  21. # @param plugin_name str : The plugin name
  22. # @return the plugin directory path
  23. @classmethod
  24. def plugin_path(cls, plugin_name):
  25. cls.started()
  26. try:
  27. return cls._plugin_paths[plugin_name]
  28. except KeyError:
  29. pass
  30. path = None
  31. for cur_path in cls._plugin_directories:
  32. plugin_path = os.path.join(cur_path, plugin_name)+'/'
  33. print(plugin_path)
  34. if os.path.isdir(plugin_path):
  35. return plugin_path
  36. raise NameError("No plugin named '%s'" % plugin_name)
  37. ## @brief Fetch a confspec given a plugin_name
  38. # @param plugin_name str : The plugin name
  39. # @return a dict of conf spec
  40. @classmethod
  41. def get_confspec(cls, plugin_name):
  42. cls.started()
  43. plugin_path = cls.plugin_path(plugin_name)
  44. plugin_module = '%s.%s' % ( VIRTUAL_PACKAGE_NAME,
  45. plugin_name)
  46. conf_spec_module = plugin_module + '.confspec'
  47. conf_spec_source = plugin_path + CONFSPEC_NAME
  48. loader = SourceFileLoader(conf_spec_module, conf_spec_source)
  49. confspec_module = loader.load_module()
  50. return getattr(confspec_module, 'CONFSPEC')
  51. @classmethod
  52. def bootstrap(cls, plugins_directories):
  53. cls._plugin_directories = plugins_directories
  54. @classmethod
  55. def started(cls, raise_if_not = True):
  56. res = cls._plugin_directories is not None
  57. if raise_if_not and not res:
  58. raise RuntimeError("Class Plugins is not initialized")