Source code for pymap.interfaces.backend


from __future__ import annotations

from abc import abstractmethod, ABCMeta
from argparse import Namespace, ArgumentParser
from collections.abc import Sequence
from contextlib import AsyncExitStack
from typing import Protocol, Any

from .login import LoginInterface
from ..config import IMAPConfig
from ..health import HealthStatus

__all__ = ['BackendInterface', 'ServiceInterface']


[docs] class BackendInterface(Protocol): """Defines the abstract base class that is expected for backends that register themselves on the ``pymap.backend`` entry point. """ __slots__: Sequence[str] = []
[docs] @classmethod @abstractmethod def add_subparser(cls, name: str, subparsers: Any) -> ArgumentParser: """Add a command-line argument sub-parser that will be used to choose this backend. For example:: parser = subparsers.add_parser('foo', help='foo backend') parser.add_argument(...) Args: name: The name to use for the subparser. subparsers: The special action object as returned by :meth:`~argparse.ArgumentParser.add_subparsers`. Returns: The new sub-parser object. """ ...
[docs] @classmethod @abstractmethod async def init(cls, args: Namespace, **overrides: Any) \ -> tuple[BackendInterface, IMAPConfig]: """Initialize the backend and return an instance. Args: args: The command-line arguments. overrides: Override keyword arguments to the config constructor. """ ...
[docs] @abstractmethod async def start(self, stack: AsyncExitStack) -> None: """Start the backend. Args: stack: An exit stack that should be used for cleanup. """ ...
@property @abstractmethod def login(self) -> LoginInterface: """Login interface that handles authentication credentials.""" ... @property @abstractmethod def config(self) -> IMAPConfig: """The IMAP config in use by the backend.""" ... @property @abstractmethod def status(self) -> HealthStatus: """The health status for the backend.""" ...
[docs] class ServiceInterface(metaclass=ABCMeta): """Defines the abstract base class that is expected for services that register themselves on the ``pymap.service`` entry point. """ __slots__ = ['backend', 'config'] def __init__(self, backend: BackendInterface, config: IMAPConfig) -> None: super().__init__() self.backend = backend self.config = config
[docs] @classmethod @abstractmethod def add_arguments(cls, parser: ArgumentParser) -> None: """Add the arguments or argument group used to configure the service. For example:: group = parser.add_argument_group('foo service arguments') group.add_argument(...) Args: parser: The argument parser. """ ...
[docs] @abstractmethod async def start(self, stack: AsyncExitStack) -> None: """Start the service. Args: stack: An exit stack that should be used for cleanup. """ ...