diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..56e817d --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,17 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + - run: uv sync --frozen + - run: uv run pytest diff --git a/app.py b/app.py index 318c9db..99723a3 100644 --- a/app.py +++ b/app.py @@ -9,6 +9,7 @@ Run it: uv run uvicorn app:app --reload import re from collections import defaultdict +from contextlib import asynccontextmanager from functools import lru_cache from pathlib import Path @@ -18,7 +19,19 @@ from fastapi.staticfiles import StaticFiles from pydantic import BaseModel from wordfreq import zipf_frequency -app = FastAPI(title="RhymePad") + +@asynccontextmanager +async def lifespan(app: FastAPI): + # warm the slow lazy bits at boot, not on the first keystroke + try: + g2p_phones("warmup") + except Exception: + pass # model unavailable; spelling fallbacks still work + get_slant_index() + yield + + +app = FastAPI(title="RhymePad", lifespan=lifespan) _g2p = None