Add CI workflow and warm-boot the slow lazy bits

GitHub Actions runs pytest on push/PR via uv. App lifespan now loads
the g2p model and builds the near-rhyme index at startup so the first
keystroke and first lookup are never slow.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-07 01:52:15 -04:00
parent f60818ef02
commit 85cf9982a2
2 changed files with 31 additions and 1 deletions
+17
View File
@@ -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
+14 -1
View File
@@ -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