Source code for xpublish.plugins.included.plugin_info

"""Plugin information router."""

import importlib
from collections.abc import Sequence

from fastapi import APIRouter, Depends
from pydantic import BaseModel

from .. import Dependencies, Plugin, hookimpl


class PluginInfo(BaseModel):
    """Pydantic schema for plugin info."""

    path: str
    version: str | None = None


[docs] class PluginInfoPlugin(Plugin): """Expose the currently loaded plugins and their versions.""" name: str = 'plugin_info' app_router_prefix: str = '' app_router_tags: Sequence[str] = ['plugin_info']
[docs] @hookimpl def app_router(self, deps: Dependencies) -> APIRouter: """Returns the router for plugin info metadata.""" router = APIRouter( prefix=self.app_router_prefix, tags=list(self.app_router_tags), ) @router.get('/plugins') def get_plugins( plugins: dict[str, Plugin] = Depends(deps.plugins), ) -> dict[str, PluginInfo]: """Return the source and version of the currently loaded plugins.""" plugin_info = {} for name, plugin in plugins.items(): plugin_type = type(plugin) module_name = plugin_type.__module__.split('.')[0] try: mod = importlib.import_module(module_name) version = getattr(mod, '__version__', None) except ImportError: # pragma: no cover version = None # pragma: no cover plugin_info[name] = PluginInfo( path=f'{plugin_type.__module__}.{plugin.__repr_name__()}', version=version, ) return plugin_info return router