diff options
author | Anton Khirnov <wyskas@gmail.com> | 2009-02-20 11:15:51 +0100 |
---|---|---|
committer | Anton Khirnov <wyskas@gmail.com> | 2009-02-20 11:15:51 +0100 |
commit | cca3aa06f58d5ad1b1abedc5d789bb626909da70 (patch) | |
tree | b633b3b53cd12815f96112d5aa3f0f114a982971 /nephilim/plugins/__init__.py | |
parent | 80a77640d4a0d91c8df41c9a7b7cc1fe3ff02818 (diff) |
Wrap plugins interface into a class.
Diffstat (limited to 'nephilim/plugins/__init__.py')
-rw-r--r-- | nephilim/plugins/__init__.py | 131 |
1 files changed, 59 insertions, 72 deletions
diff --git a/nephilim/plugins/__init__.py b/nephilim/plugins/__init__.py index affbf45..7ecca22 100644 --- a/nephilim/plugins/__init__.py +++ b/nephilim/plugins/__init__.py @@ -9,89 +9,76 @@ PLUGIN_CLASS=1 PLUGIN_INSTANCE=2 PLUGIN_MSG=3 +class Plugins: -class IPlaylist: - def ensureVisible(self, song_id): - raise Exception("TODO implement") + def __init__(self): + """(Re)load all modules in the plugins directory.""" + global _plugins + _plugins={} + for file in os.listdir('nephilim/plugins'): + if file[-3:]=='.py' and file!='__init__.py': + name=file[:-3] # name without ext + mod='nephilim.plugins.%s'%(name) # mod name + className='plugin%s'%(name) # classname -def loadPlugins(): - """(Re)load all modules in the plugins directory.""" - global _plugins - _plugins={} - for file in os.listdir('nephilim/plugins'): - if file[-3:]=='.py' and file!='__init__.py': - name=file[:-3] # name without ext - mod='nephilim.plugins.%s'%(name) # mod name - className='plugin%s'%(name) # classname - - _plugins[className.lower()]=[mod, className, None, None] - loadPlugin(className, None) + _plugins[className.lower()]=[mod, className, None, None] + self.loadPlugin(className, None) -def setPluginMessage(name, msg): - global _plugins - try: - _plugins[name.lower()][PLUGIN_MSG]=msg - except: + def setPluginMessage(self, name, msg): + global _plugins try: - _plugins["plugin%s"%(name.lower())][PLUGIN_MODULE]=msg + _plugins[name.lower()][PLUGIN_MSG]=msg except: - pass + try: + _plugins["plugin%s"%(name.lower())][PLUGIN_MODULE]=msg + except: + pass -def getPlugin(name): - global _plugins - try: - return _plugins[name.lower()][PLUGIN_INSTANCE] - except: + def getPlugin(self, name): + global _plugins try: - return _plugins["plugin%s"%(name.lower())][PLUGIN_INSTANCE] + return _plugins[name.lower()][PLUGIN_INSTANCE] except: - return None + try: + return _plugins["plugin%s"%(name.lower())][PLUGIN_INSTANCE] + except: + return None -def loadPlugin(className, parent): - """Constructs a plugin.""" - global _plugins - entry=_plugins[className.lower()] - mod=entry[PLUGIN_MODULE] - # ensure we get the latest version - try: + def loadPlugin(self, className, parent): + """Constructs a plugin.""" + global _plugins + entry=_plugins[className.lower()] + mod=entry[PLUGIN_MODULE] + # ensure we get the latest version try: - sys.modules[mod] - reimport=True - except: - reimport=False - - if reimport: - reload(sys.modules[mod]) - else: - module=__import__(mod, globals(), locals(), className, -1) - - except Exception, e: - _plugins[className.lower()][PLUGIN_MSG]=str(e) - _plugins[className.lower()][PLUGIN_INSTANCE]=None - logging.warning("Failed to load plugin %s: %s %s"%(className, str(type(e)), str(e))) - return None - - module=sys.modules[mod] - _plugins[className.lower()][PLUGIN_MSG]=None - - if parent: - # instantiate the plugin - _plugins[className.lower()][PLUGIN_INSTANCE]=module.__dict__[className](parent) - else: - _plugins[className.lower()][PLUGIN_INSTANCE]=None - return _plugins[className.lower()][PLUGIN_INSTANCE] + try: + sys.modules[mod] + reimport=True + except: + reimport=False -def listImplementors(interface, loaded = True): - """Return a list of plugin-instances that implement an interface""" - global _plugins - return map(lambda plugin: plugin[PLUGIN_INSTANCE] - , filter(lambda plugin: isinstance(plugin[PLUGIN_INSTANCE], interface) - and ((loaded != None and plugin[PLUGIN_INSTANCE].loaded == loaded) or (loaded == None)), _plugins.values())) + if reimport: + reload(sys.modules[mod]) + else: + module=__import__(mod, globals(), locals(), className, -1) -def listPlugins(): - """Get the list of plugins available as { className => [mod, className, instance, msg] }.""" - global _plugins - return _plugins + except Exception, e: + _plugins[className.lower()][PLUGIN_MSG]=str(e) + _plugins[className.lower()][PLUGIN_INSTANCE]=None + logging.warning("Failed to load plugin %s: %s %s"%(className, str(type(e)), str(e))) + return None + + module=sys.modules[mod] + _plugins[className.lower()][PLUGIN_MSG]=None + if parent: + # instantiate the plugin + _plugins[className.lower()][PLUGIN_INSTANCE]=module.__dict__[className](parent) + else: + _plugins[className.lower()][PLUGIN_INSTANCE]=None + return _plugins[className.lower()][PLUGIN_INSTANCE] -loadPlugins() + def listPlugins(self): + """Get the list of plugins available as { className => [mod, className, instance, msg] }.""" + global _plugins + return _plugins |