loader.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. '''
  2. Created on 10/08/2012
  3. @author: konstaa
  4. '''
  5. import core.api
  6. import os
  7. import core.db.loader
  8. class Loader(object):
  9. def __init__(self):
  10. self.plugins = []
  11. self.hash = {}
  12. self.exit_code = 0
  13. self.db = core.db.loader.Loader()
  14. def get_database_loader(self):
  15. return self.db
  16. def get_plugin(self, name):
  17. return self.hash[name]['instance']
  18. def iterate_plugins(self, is_reversed = False):
  19. if is_reversed == False:
  20. for item in self.plugins:
  21. yield item['instance']
  22. else:
  23. for item in reversed(self.plugins):
  24. yield item['instance']
  25. def load(self, directory, optparser):
  26. import sys
  27. sys.path.append(directory)
  28. def load_recursively(manager, directory):
  29. import ConfigParser
  30. import re
  31. pattern = re.compile(r'.*[.]ini$', flags=re.IGNORECASE)
  32. dirList = os.listdir(directory)
  33. for fname in dirList:
  34. fname = os.path.join(directory, fname)
  35. if os.path.isdir(fname):
  36. load_recursively(manager, fname)
  37. elif re.match(pattern, fname):
  38. config = ConfigParser.ConfigParser()
  39. config.read(fname)
  40. item = {'package': config.get('Plugin', 'package'),
  41. 'module': config.get('Plugin', 'module'),
  42. 'class': config.get('Plugin', 'class'),
  43. 'version': config.get('Plugin', 'version'),
  44. 'depends': config.get('Plugin', 'depends'),
  45. 'enabled': config.getboolean('Plugin', 'enabled')}
  46. if item['enabled']:
  47. manager.plugins.append(item)
  48. manager.hash[item['package'] + '.' + item['module']] = item
  49. load_recursively(self, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'ext-priority'))
  50. load_recursively(self, directory)
  51. # TODO check dependencies
  52. for item in self.plugins:
  53. plugin = __import__(item['package'], globals(), locals(), [item['module']], -1)
  54. module_attr = plugin.__getattribute__(item['module'])
  55. class_attr = module_attr.__getattribute__(item['class'])
  56. item['instance'] = class_attr.__new__(class_attr)
  57. item['instance'].__init__()
  58. item['instance'].set_name(item['package'] + "." + item['module'])
  59. item['instance'].set_plugin_loader(self)
  60. for item in self.iterate_plugins():
  61. if (isinstance(item, core.api.IConfigurable)):
  62. item.declare_configuration(optparser)
  63. (options, args) = optparser.parse_args()
  64. for item in self.iterate_plugins():
  65. if (isinstance(item, core.api.IConfigurable)):
  66. item.configure(options)
  67. for item in self.iterate_plugins():
  68. item.initialize()
  69. return args
  70. def unload(self):
  71. for item in self.iterate_plugins(is_reversed = True):
  72. item.terminate()
  73. def run(self, args):
  74. for item in self.iterate_plugins():
  75. if (isinstance(item, core.api.IRunable)):
  76. item.run(args)
  77. return self.exit_code
  78. def inc_exit_code(self):
  79. self.exit_code += 1
  80. def __repr__(self):
  81. result = object.__repr__(self) + ' with loaded:'
  82. for item in self.iterate_plugins():
  83. result += '\n\t' + item.__repr__()
  84. if isinstance(item, core.api.Parent):
  85. result += ' with subscribed:'
  86. for child in item.iterate_children():
  87. result += '\n\t\t' + child.__repr__()
  88. return result