diff --git a/Dockerfile b/Dockerfile index 11acf59..51b98cb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # With inspiration from uv's example multistage dockerfile. -FROM python:3.13-slim-bookworm AS builder +FROM python:3.13-slim-trixie AS builder WORKDIR /app COPY --from=ghcr.io/astral-sh/uv:0.7 /uv /uvx /bin/ @@ -26,7 +26,7 @@ RUN --mount=type=cache,target=/root/.cache/uv \ #&& uv run -m nltk.downloader all -d /app/.venv/nltk_data -FROM python:3.13-slim-bookworm AS runtime +FROM python:3.13-slim-trixie AS runtime COPY --from=builder /app /app diff --git a/src/__init__.py b/src/__init__.py index 4d604b4..473f879 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -1,38 +1,31 @@ -from fastapi import FastAPI -from pydantic import BaseModel -from . import papa - +import traceback -# TODO: Flesh this out? -class Xaif(BaseModel): - AIF: dict - text: str - OVA: dict | None = None +from fastapi import FastAPI, HTTPException +from pydantic import BaseModel, ConfigDict +from . import papa class RequestBody(BaseModel): - xaif: Xaif - node_level: bool | None = None - speaker: bool | None = None - forecast: bool | None = None + model_config = ConfigDict( + extra="allow", + ) + xaif: dict -app = FastAPI() +app = FastAPI(title="papa", summary="Papa: Amazing Python Analytics") @app.post("/api/all_analytics") # Call without async so that fastapi does the work on a threadpool as # all_analytics is cpu-bound and we don't want to block the current thread. -def all_analytics(body: RequestBody | Xaif): - if isinstance(body, RequestBody): - xaif = dict(body.xaif) - kwargs = {} - for name, value in body: - if name == "xaif": - continue - - kwargs[name] = value if value is not None else False - else: - xaif = dict(body) - - return papa.all_analytics(xaif) +def all_analytics(body: RequestBody | dict) -> dict: + """Wrapper around papa's all_analytics function.""" + try: + if isinstance(body, RequestBody): + return papa.all_analytics( + body.xaif, **{k: v for k, v in body if k != "xaif"} + ) + else: + return papa.all_analytics(body) + except Exception: + raise HTTPException(status_code=500, detail=traceback.format_exc())