32 lines
951 B
Python
32 lines
951 B
Python
"""Evidence helpers."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import hashlib
|
|
import json
|
|
|
|
from .store import TaskPlaneStore
|
|
|
|
|
|
def evidence_digest(payload: dict) -> str:
|
|
body = json.dumps(payload, sort_keys=True, separators=(",", ":"))
|
|
return hashlib.sha256(body.encode("utf-8")).hexdigest()
|
|
|
|
|
|
class EvidenceService:
|
|
def __init__(self, store: TaskPlaneStore):
|
|
self.store = store
|
|
|
|
def add(self, task_id: str, kind: str, payload: dict, worker_identity: str) -> str:
|
|
return self.store.add_evidence(task_id, kind, payload, worker_identity)
|
|
|
|
def list(self, task_id: str) -> list[dict]:
|
|
return self.store.list_evidence(task_id)
|
|
|
|
def verify(self, task_id: str, required_kinds: list[str]) -> bool:
|
|
evidences = self.list(task_id)
|
|
observed = {e["kind"] for e in evidences}
|
|
return set(required_kinds).issubset(
|
|
observed
|
|
) and self.store.verify_evidence_integrity(task_id)
|