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
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 04:37 +0800
1"""OpenAPI route registration for lexigram-web."""
3from __future__ import annotations
5from typing import TYPE_CHECKING, Any, cast
7from starlette.responses import HTMLResponse, JSONResponse
9if TYPE_CHECKING:
10 from lexigram.web.di.provider import WebProvider
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
20 async def openapi_json(_request: Any) -> JSONResponse:
21 spec = provider.router_manager.generate_openapi_spec()
22 return JSONResponse(spec)
24 async def swagger_ui(_request: Any) -> HTMLResponse:
25 from lexigram.web.routing.openapi_templates import (
26 get_swagger_ui_html,
27 )
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 )
38 async def redoc_ui(_request: Any) -> HTMLResponse:
39 from lexigram.web.routing.openapi_templates import (
40 get_redoc_html,
41 )
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 )
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 )