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

1import logging 

2from contextlib import asynccontextmanager 

3 

4import uvicorn 

5from fastapi import FastAPI 

6 

7from app.core.health import router as health_router 

8from app.core.logging import setup_logging 

9 

10# Core 

11from app.core.middleware import RequestContextMiddleware 

12from app.core.settings import settings 

13 

14# Database 

15from app.db.base import Base 

16from app.db.engine import engine 

17 

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 

23 

24 

25# ------------------------------------------------- 

26# LIFESPAN (startup / shutdown hooks) 

27# ------------------------------------------------- 

28@asynccontextmanager 

29async def lifespan(app: FastAPI): 

30 setup_logging() 

31 

32 Base.metadata.create_all(bind=engine) 

33 

34 yield 

35 

36 # Shutdown (placeholder for now) 

37 # e.g. close pools, flush queues, etc. 

38 

39 

40logger = logging.getLogger(__name__) 

41 

42 

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) 

53 

54app.add_middleware(RequestContextMiddleware) 

55 

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

63 

64# print("IMPORT cards_router") 

65# from app.modules.cards.router import router as cards_router 

66 

67# print(cards_router.routes) 

68 

69# print("INCLUDING cards_router") 

70# app.include_router(cards_router, prefix="/cards") 

71 

72# print("APP ROUTES AFTER CARDS:", app.routes) 

73 

74# print("IMPORT decks_router") 

75# from app.modules.decks.router import router as decks_router 

76 

77# print(decks_router.routes) 

78 

79# print("INCLUDING decks_router") 

80# app.include_router(decks_router, prefix="/decks") 

81 

82# print("APP ROUTES AFTER DECKS:", app.routes) 

83 

84# print("IMPORT reviews_router") 

85# from app.modules.reviews.router import router as reviews_router 

86 

87# print(reviews_router.routes) 

88 

89# print("INCLUDING reviews_router") 

90# app.include_router(reviews_router, prefix="/reviews") 

91 

92# print("APP ROUTES AFTER REVIEWS:", app.routes) 

93 

94 

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 } 

107 

108 

109def main(): 

110 uvicorn.run("app.main:app", host="0.0.0.0", port=8000, log_level="info", reload=True) 

111 

112 

113if __name__ == "__main__": 

114 main()