Exemplo n.º 1
0
 def _discover_from_file(self, filepath):
     try:
         modname = os.path.splitext(filepath[1:])[0].translate(MODNAME_TRANS)
         module = imp.load_source(modname, filepath)
         self._discover_in_module(module)
     except (SystemExit, ImportError) as e:
         if self.keep_going:
             self.logger.warning('Failed to load {}'.format(filepath))
             self.logger.warning('Got: {}'.format(e))
         else:
             msg = 'Failed to load {}'
             raise PluginLoaderError(msg.format(filepath), sys.exc_info())
     except Exception as e:
         message = 'Problem loading plugins from {}: {}'
         raise PluginLoaderError(message.format(filepath, e))
Exemplo n.º 2
0
 def _discover_from_packages(self, packages):
     self.logger.debug('Discovering plugins in packages')
     try:
         for package in packages:
             for module in walk_modules(package):
                 self._discover_in_module(module)
     except HostError as e:
         message = 'Problem loading plugins from {}: {}'
         raise PluginLoaderError(message.format(e.module, str(e.orig_exc)),
                                 e.exc_info)
Exemplo n.º 3
0
def list_target_descriptions(loader=pluginloader):
    targets = {}
    for cls in loader.list_target_descriptors():
        descriptor = cls()
        for desc in descriptor.get_descriptions():
            if desc.name in targets:
                msg = 'Duplicate target "{}" returned by {} and {}'
                prev_dtor = targets[desc.name].source
                raise PluginLoaderError(
                    msg.format(desc.name, prev_dtor.name, descriptor.name))
            targets[desc.name] = desc
    return list(targets.values())
Exemplo n.º 4
0
    def _add_found_plugin(self, obj):
        """
            :obj: Found plugin class
            :ext: matching plugin item.
        """
        self.logger.debug('Adding %s %s', obj.kind, obj.name)
        key = identifier(obj.name.lower())
        if key in self.plugins or key in self.aliases:
            msg = '{} "{}" already exists.'
            raise PluginLoaderError(msg.format(obj.kind, obj.name))
        # plugins are tracked both, in a common plugins
        # dict, and in per-plugin kind dict (as retrieving
        # plugins by kind is a common use case.
        self.plugins[key] = obj
        self.kind_map[obj.kind][key] = obj

        for alias in obj.aliases:
            alias_id = identifier(alias.name.lower())
            if alias_id in self.plugins or alias_id in self.aliases:
                msg = '{} "{}" already exists.'
                raise PluginLoaderError(msg.format(obj.kind, obj.name))
            self.aliases[alias_id] = alias