Coverage for src/app/main.py: 100%
32 statements
« prev ^ index » next coverage.py v7.14.3, created at 2026-06-24 08:34 +0000
« prev ^ index » next coverage.py v7.14.3, created at 2026-06-24 08:34 +0000
1import logging
2from contextlib import asynccontextmanager
4import uvicorn
5from fastapi import FastAPI
7from app.core.health import router as health_router
8from app.core.logging import setup_logging
10# Core
11from app.core.middleware import RequestContextMiddleware
12from app.core.settings import settings
14# Database
15from app.db.base import Base
16from app.db.engine import engine
18# from app.db.registry import * # noqa: F403, F401
19# Routers (domain-level)
20from app.modules.cards.router import router as cards_router
21from app.modules.decks.router import router as decks_router
22from app.modules.reviews.router import router as reviews_router
25# -------------------------------------------------
26# LIFESPAN (startup / shutdown hooks)
27# -------------------------------------------------
28@asynccontextmanager
29async def lifespan(app: FastAPI):
30 setup_logging()
32 Base.metadata.create_all(bind=engine)
34 yield
36 # Shutdown (placeholder for now)
37 # e.g. close pools, flush queues, etc.
40logger = logging.getLogger(__name__)
43# -------------------------------------------------
44# APP
45# -------------------------------------------------
46app = FastAPI(
47 title="Spaced Repetition Flashcards API",
48 version="0.1.0",
49 lifespan=lifespan,
50 docs_url="/docs",
51 redoc_url="/redoc",
52)
54app.add_middleware(RequestContextMiddleware)
56# -------------------------------------------------
57# ROUTER REGISTRATION
58# -------------------------------------------------
59app.include_router(cards_router, prefix="/cards", tags=["cards"])
60app.include_router(decks_router, prefix="/decks", tags=["decks"])
61app.include_router(reviews_router, prefix="/reviews", tags=["reviews"])
62app.include_router(health_router, prefix="/core", tags=["core"])
64# print("IMPORT cards_router")
65# from app.modules.cards.router import router as cards_router
67# print(cards_router.routes)
69# print("INCLUDING cards_router")
70# app.include_router(cards_router, prefix="/cards")
72# print("APP ROUTES AFTER CARDS:", app.routes)
74# print("IMPORT decks_router")
75# from app.modules.decks.router import router as decks_router
77# print(decks_router.routes)
79# print("INCLUDING decks_router")
80# app.include_router(decks_router, prefix="/decks")
82# print("APP ROUTES AFTER DECKS:", app.routes)
84# print("IMPORT reviews_router")
85# from app.modules.reviews.router import router as reviews_router
87# print(reviews_router.routes)
89# print("INCLUDING reviews_router")
90# app.include_router(reviews_router, prefix="/reviews")
92# print("APP ROUTES AFTER REVIEWS:", app.routes)
95# -------------------------------------------------
96# ROOT (API health, not UI logic)
97# -------------------------------------------------
98@app.get("/")
99def root():
100 return {
101 "service": settings.service_name,
102 "status": "running",
103 "docs": "/docs",
104 "health": "/health",
105 "env": settings.environment,
106 }
109def main():
110 uvicorn.run("app.main:app", host="0.0.0.0", port=8000, log_level="info", reload=True)
113if __name__ == "__main__":
114 main()