Source code for pyzeal.plugins.pyzeal_plugin

"""
This module contains the base interface for plugins. Its methods provide the
necessary functions for plugin handling.

Authors:\n
- Philipp Schuette\n
"""

from __future__ import annotations

from abc import ABC, abstractmethod
from typing import Callable, Generic, Tuple, Type, TypeVar, Union

from pyzeal.algorithms.estimators.argument_estimator import ArgumentEstimator
from pyzeal.algorithms.finder_algorithm import FinderAlgorithm
from pyzeal.cli.parser_facade import PyZEALParserInterface
from pyzeal.settings.settings_service import SettingsService
from pyzeal.utils.containers.root_container import RootContainer

tPluggable = Union[
    FinderAlgorithm,
    ArgumentEstimator,
    RootContainer,
    SettingsService,
    PyZEALParserInterface,
]
T_co = TypeVar("T_co", bound=tPluggable, covariant=True)


[docs] class PyZEALPlugin(ABC, Generic[T_co]): """ Interface for plugins. Methods for instantiation and plugin information need to be implemented. """ def __str__(self) -> str: "Print a human-readable representation of the plugin." major, minor, patch = self.pluginVersion maxLength = 30 cutoff = min(len(self.pluginName), maxLength) return ( f"{self.pluginName[:cutoff]: <{maxLength}} " f" @ v{major}.{minor}.{patch}" )
[docs] @staticmethod @abstractmethod def initialize() -> Callable[..., T_co]: """ Returns a factory for the plugin's implementation of `T_co`. :return: Factory for plugin implementation of `T_co`. """
[docs] @staticmethod @abstractmethod def getInstance() -> PyZEALPlugin[T_co]: """ Return the singleton instance of `PyZEALPlugin` which provides a service of type `T_co`. :return: `PyZEALPlugin` instance. """
@property @abstractmethod def pluginType(self) -> Type[T_co]: """ Return the type provided by the plugin. :return: Service type of plugin. """ ... @property @abstractmethod def pluginName(self) -> str: """ Return the name of the plugin. :return: Plugin name. """ ... @property @abstractmethod def pluginVersion(self) -> Tuple[int, int, int]: """ Return the version of the plugin as (`major`, `minor`, `patch`). :return: Plugin version. """ ...