"""BewertungRepository — Port für die Versionshistorie einer Bewertung. Eine „Bewertung" ist die vollständige Assessment-Instanz; der `BewertungRepository` greift auf die Snapshot-Tabelle ``assessment_versions`` zu. Für die aktuellste Bewertung siehe ``AntragRepository``. """ from __future__ import annotations from typing import Protocol, runtime_checkable from .. import database @runtime_checkable class BewertungRepository(Protocol): async def versions(self, drucksache: str) -> list[dict]: ... class SqliteBewertungRepository: """Produktions-Implementation. Delegiert an ``database.py``.""" async def versions(self, drucksache: str) -> list[dict]: return await database.get_assessment_history(drucksache) class InMemoryBewertungRepository: """Test-Fake. Erlaubt per ``add_version`` händisches Bestücken. Die produktive Versionierung passiert implizit in ``upsert_assessment`` (siehe database.py:580-598). Im Fake trennen wir das bewusst, weil Tests oft explizit Versionshistorie befüllen wollen. """ def __init__(self) -> None: self._versions: dict[str, list[dict]] = {} def add_version( self, drucksache: str, version: int, gwoe_score: float, model: str, created_at: str = "", ) -> None: self._versions.setdefault(drucksache, []).append({ "version": version, "gwoe_score": gwoe_score, "model": model, "created_at": created_at, }) async def versions(self, drucksache: str) -> list[dict]: rows = list(self._versions.get(drucksache, [])) rows.sort(key=lambda r: r["version"], reverse=True) return rows _default_bewertung_repo: BewertungRepository = SqliteBewertungRepository() def get_bewertung_repository() -> BewertungRepository: return _default_bewertung_repo