dodil/erp-brick-purchasing

DODIL ERP brick: purchasing

src/brick_purchasing/domain/readiness.py

"""Readiness (shared.yaml conventions.readiness): {gate, met, reason, fix}, computed at read time."""
from dataclasses import asdict, dataclass

from brick_purchasing.domain.errors import GateUnmet


@dataclass(frozen=True)
class Gate:
    gate: str
    met: bool
    reason: str = ""
    fix: str = ""

    def view(self) -> dict:
        return asdict(self)


def ok(gate: str) -> Gate:
    return Gate(gate, True)


def no(gate: str, reason: str, fix: str) -> Gate:
    return Gate(gate, False, reason, fix)


def require(gates) -> None:
    """Raise GateUnmet naming every gate that is not met; do nothing when all are."""
    bad = [g for g in gates if not g.met]
    if bad:
        raise GateUnmet(bad)


def views(gates) -> list:
    return [g.view() for g in gates]