示例#1
0
    def import_plugins(self, module):
        """
        Import plugins from ``module``.

        :param module: Name of the module to import. This might be a wildcard
                       in the form ```package.*``` in which case all modules
                       from the given package are loaded.
        """
        if module.endswith('.*'):
            subpackage = module[:-2]
            try:
                plugins = importlib.import_module(subpackage)
            except ImportError as e:
                self.log.error("cannot import plugins sub-package %s: %s",
                               subpackage, e)
                raise
            package, dot, part = subpackage.rpartition('.')
            parent = sys.modules[package]

            parent_dir = path.dirname(path.abspath(parent.__file__))
            plugins_dir = path.dirname(path.abspath(plugins.__file__))
            if parent_dir == plugins_dir:
                raise errors.PluginsPackageError(
                    name=subpackage, file=plugins.__file__
                )

            self.log.debug("importing all plugin modules in %s...", subpackage)
            modules = find_modules_in_dir(plugins_dir)
            modules = ['.'.join((subpackage, name)) for name in modules]
        else:
            modules = [module]

        for name in modules:
            self.log.debug("importing plugin module %s", name)
            try:
                module = importlib.import_module(name)
            except errors.SkipPluginModule as e:
                self.log.debug("skipping plugin module %s: %s", name, e.reason)
            except Exception as e:
                if self.env.startup_traceback:
                    import traceback
                    self.log.error("could not load plugin module %s\n%s", name,
                                   traceback.format_exc())
                raise
            else:
                self.add_module(module)
示例#2
0
    def add_package(self, package):
        """
        Add plugin modules from the ``package``.

        :param package: A package from which to add modules.
        """
        package_name = package.__name__
        package_file = package.__file__
        package_dir = path.dirname(path.abspath(package_file))

        parent = sys.modules[package_name.rpartition('.')[0]]
        parent_dir = path.dirname(path.abspath(parent.__file__))
        if parent_dir == package_dir:
            raise errors.PluginsPackageError(
                name=package_name, file=package_file
            )

        self.log.debug("importing all plugin modules in %s...", package_name)
        modules = getattr(package, 'modules', find_modules_in_dir(package_dir))
        modules = ['.'.join((package_name, name)) for name in modules]

        for name in modules:
            self.log.debug("importing plugin module %s", name)
            try:
                module = importlib.import_module(name)
            except errors.SkipPluginModule as e:
                self.log.debug("skipping plugin module %s: %s", name, e.reason)
                continue
            except Exception as e:
                if self.env.startup_traceback:
                    import traceback
                    self.log.error("could not load plugin module %s\n%s", name,
                                   traceback.format_exc())
                raise

            try:
                self.add_module(module)
            except errors.PluginModuleError as e:
                self.log.debug("%s", e)