from __future__ import annotations from abc import ABC, abstractmethod from typing import Any, Dict, List from .context import LogErrorLevel, PluginContext class Plugin(ABC): """ base class for all plugins the instance of the plugin is a callable object, which is the entry point for the execution of the plugin function. The execution context and the configuration of the plugin are passed to the plugin instance when it is created. """ def __init__(self, name: str, ctx: PluginContext, config: Dict[str, Any]) -> None: """ create a plugin instance, this method will be called by the runtime :param name: the name of the plugin :param ctx: the execution context of the plugin :param config: the configuration of the plugin """ super().__init__() self.name: str = name self.ctx: PluginContext = ctx self.config: Dict[str, Any] = config @abstractmethod def __call__(self, *args: List[Any], **kwargs: Dict[str, Any]) -> Any: """ entry point for the execution of the plugin function """ def log(self, level: LogErrorLevel, message: str) -> None: """log a message from the plugin""" self.ctx.log(level, "Plugin-" + self.name, message) def get_env(self, variable_name: str) -> str: """get an environment variable from the context""" return self.ctx.get_env(self.name, variable_name)