Coverage for src/lexigram/web/routing/openapi.py: 0%

23 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-25 04:37 +0800

1"""OpenAPI route registration for lexigram-web.""" 

2 

3from __future__ import annotations 

4 

5from typing import TYPE_CHECKING, Any, cast 

6 

7from starlette.responses import HTMLResponse, JSONResponse 

8 

9if TYPE_CHECKING: 

10 from lexigram.web.di.provider import WebProvider 

11 

12 

13def register_openapi_routes(provider: WebProvider) -> None: 

14 """Register OpenAPI documentation routes.""" 

15 starlette = provider.starlette 

16 if starlette is None: 

17 raise RuntimeError("Starlette application not initialized") 

18 cfg = provider.web_config 

19 

20 async def openapi_json(_request: Any) -> JSONResponse: 

21 spec = provider.router_manager.generate_openapi_spec() 

22 return JSONResponse(spec) 

23 

24 async def swagger_ui(_request: Any) -> HTMLResponse: 

25 from lexigram.web.routing.openapi_templates import ( 

26 get_swagger_ui_html, 

27 ) 

28 

29 return HTMLResponse( 

30 get_swagger_ui_html( 

31 title=cfg.openapi_title, 

32 openapi_url=cast("str", cfg.openapi_url), 

33 swagger_js_url=cfg.swagger_js_url, 

34 swagger_css_url=cfg.swagger_css_url, 

35 ), 

36 ) 

37 

38 async def redoc_ui(_request: Any) -> HTMLResponse: 

39 from lexigram.web.routing.openapi_templates import ( 

40 get_redoc_html, 

41 ) 

42 

43 return HTMLResponse( 

44 get_redoc_html( 

45 title=cfg.openapi_title, 

46 openapi_url=cast("str", cfg.openapi_url), 

47 redoc_js_url=cfg.redoc_js_url, 

48 ), 

49 ) 

50 

51 if cfg.openapi_url: 

52 starlette.add_route( 

53 cfg.openapi_url, 

54 openapi_json, 

55 methods=["GET"], 

56 name="openapi", 

57 ) 

58 if cfg.swagger_ui_url: 

59 starlette.add_route( 

60 cfg.swagger_ui_url, 

61 swagger_ui, 

62 methods=["GET"], 

63 name="swagger_ui", 

64 ) 

65 if cfg.redoc_url: 

66 starlette.add_route( 

67 cfg.redoc_url, 

68 redoc_ui, 

69 methods=["GET"], 

70 name="redoc_ui", 

71 )