|
| 1 | +from __future__ import annotations |
| 2 | + |
| 3 | +__all__ = ("ContractAware", "ContractCheck", "ContractManagerAware",) |
| 4 | + |
| 5 | +import abc |
| 6 | +import typing |
| 7 | +import dataclasses |
| 8 | + |
| 9 | +from .. import utils |
| 10 | + |
| 11 | + |
| 12 | +@dataclasses.dataclass |
| 13 | +class ContractCheck: |
| 14 | + kept: bool |
| 15 | + metadata: dict[str, typing.Any] = dataclasses.field(default_factory=dict) |
| 16 | + warnings: list[str] = dataclasses.field(default_factory=list) |
| 17 | + errors: list[str] = dataclasses.field(default_factory=list) |
| 18 | + |
| 19 | + @classmethod |
| 20 | + def done( |
| 21 | + cls, |
| 22 | + metadata: typing.Optional[dict[str, typing.Any]] = None, |
| 23 | + ) -> ContractCheck: |
| 24 | + return cls(kept=True, metadata=utils.none_or({}, metadata)) |
| 25 | + |
| 26 | + @classmethod |
| 27 | + def terminated( |
| 28 | + cls, |
| 29 | + metadata: typing.Optional[dict[str, typing.Any]] = None, |
| 30 | + warnings: typing.Optional[list[str]] = None, |
| 31 | + errors: typing.Optional[list[str]] = None, |
| 32 | + ) -> ContractCheck: |
| 33 | + return cls( |
| 34 | + kept=False, |
| 35 | + metadata=utils.none_or({}, metadata), |
| 36 | + warnings=utils.none_or([], warnings), |
| 37 | + errors=utils.none_or([], errors), |
| 38 | + ) |
| 39 | + |
| 40 | + |
| 41 | +class ContractAware(abc.ABC): |
| 42 | + __slots__ = () |
| 43 | + |
| 44 | + @abc.abstractmethod |
| 45 | + def check(self, *args: typing.Any, **kwargs: typing.Any) -> ContractCheck: |
| 46 | + ... |
| 47 | + |
| 48 | + @abc.abstractmethod |
| 49 | + def render_terminated_contract(self, check: ContractCheck, /, *, raise_errors: bool) -> None: |
| 50 | + ... |
| 51 | + |
| 52 | + |
| 53 | +class ContractManagerAware(abc.ABC): |
| 54 | + __slots__ = () |
| 55 | + |
| 56 | + @abc.abstractmethod |
| 57 | + def trigger_contract( |
| 58 | + self, |
| 59 | + contract: ContractAware, |
| 60 | + *args: typing.Any, |
| 61 | + **kwargs: typing.Any, |
| 62 | + ) -> None: |
| 63 | + ... |
| 64 | + |
| 65 | + @abc.abstractmethod |
| 66 | + def trigger_contracts(self, *args: typing.Any, **kwargs: typing.Any) -> None: |
| 67 | + ... |
| 68 | + |
| 69 | + @abc.abstractmethod |
| 70 | + def subscribe(self, contract: ContractAware, /) -> None: |
| 71 | + ... |
| 72 | + |
| 73 | + @abc.abstractmethod |
| 74 | + def terminate(self, contract: ContractAware, /) -> None: |
| 75 | + ... |
| 76 | + |
| 77 | + @abc.abstractmethod |
| 78 | + def set_raise_errors(self, value: bool, /) -> None: |
| 79 | + ... |
| 80 | + |
| 81 | + @property |
| 82 | + @abc.abstractmethod |
| 83 | + def contracts(self) -> list[ContractAware]: |
| 84 | + ... |
0 commit comments