Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 import traceback
00032
00033 from python_qt_binding.QtCore import qCritical
00034
00035 from .plugin_provider import PluginProvider
00036
00037
00038 class CompositePluginProvider(PluginProvider):
00039
00040 """Composite of multiple `PluginProvider`s."""
00041
00042 def __init__(self, plugin_providers=None):
00043 super(CompositePluginProvider, self).__init__()
00044 self.setObjectName('CompositePluginProvider')
00045
00046 self._plugin_providers = plugin_providers or []
00047 self._discovered_plugins = {}
00048 self._running_plugins = {}
00049
00050 def set_plugin_providers(self, plugin_providers):
00051 self._plugin_providers = plugin_providers
00052
00053 def discover(self):
00054
00055 discovered_plugins = []
00056 for plugin_provider in self._plugin_providers:
00057 try:
00058 plugin_descriptors = plugin_provider.discover()
00059 except Exception:
00060 qCritical('CompositePluginProvider.discover() could not discover plugins from provider "%s":\n%s' % (type(plugin_provider), traceback.format_exc()))
00061 else:
00062 self._discovered_plugins[plugin_provider] = plugin_descriptors
00063 discovered_plugins += plugin_descriptors
00064 return discovered_plugins
00065
00066 def load(self, plugin_id, plugin_context):
00067
00068 for plugin_provider, plugin_descriptors in self._discovered_plugins.items():
00069 for plugin_descriptor in plugin_descriptors:
00070 if plugin_descriptor.plugin_id() == plugin_id:
00071 instance = plugin_provider.load(plugin_id, plugin_context)
00072 self._running_plugins[instance] = plugin_provider
00073 return instance
00074 raise UserWarning('plugin_id "%s" not found' % plugin_id)
00075
00076 def unload(self, plugin_instance):
00077
00078 if plugin_instance in self._running_plugins:
00079 self._running_plugins[plugin_instance].unload(plugin_instance)
00080 self._running_plugins.pop(plugin_instance)
00081 return
00082 raise UserWarning('plugin_instance not found')