Coverage for src/lexigram/web/responses/adapter.py: 0%
12 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
1from __future__ import annotations
3from typing import Any
5from starlette.responses import HTMLResponse, JSONResponse
7from lexigram.contracts.web import ResponseFactoryProtocol, ResponseProtocol
10class StarletteResponseAdapter(ResponseFactoryProtocol):
11 """Implementation of ResponseFactoryProtocol using Starlette responses.
13 This class name uses *Adapter* instead of *Factory* to comply with
14 naming guidelines that prohibit "factory" and "facade".
15 """
17 def json(
18 self,
19 content: Any,
20 status_code: int = 200,
21 headers: dict[str, str] | None = None,
22 ) -> ResponseProtocol:
23 """Create a JSON response."""
24 return JSONResponse( # type: ignore[return-value]
25 content=content,
26 status_code=status_code,
27 headers=headers,
28 )
30 def html(
31 self,
32 content: str,
33 status_code: int = 200,
34 headers: dict[str, str] | None = None,
35 ) -> ResponseProtocol:
36 """Create an HTML response."""
37 return HTMLResponse( # type: ignore[return-value]
38 content=content,
39 status_code=status_code,
40 headers=headers,
41 )
43 def redirect(
44 self,
45 url: str,
46 status_code: int = 302,
47 headers: dict[str, str] | None = None,
48 ) -> ResponseProtocol:
49 """Create a redirect response."""
50 from starlette.responses import RedirectResponse
52 return RedirectResponse( # type: ignore[return-value]
53 url=url,
54 status_code=status_code,
55 headers=headers,
56 )