gwoe-antragspruefer/app/repositories/bewertung_repository.py

65 lines
1.9 KiB
Python
Raw Permalink Normal View History

"""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