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

1from __future__ import annotations 

2 

3from typing import Any 

4 

5from starlette.responses import HTMLResponse, JSONResponse 

6 

7from lexigram.contracts.web import ResponseFactoryProtocol, ResponseProtocol 

8 

9 

10class StarletteResponseAdapter(ResponseFactoryProtocol): 

11 """Implementation of ResponseFactoryProtocol using Starlette responses. 

12 

13 This class name uses *Adapter* instead of *Factory* to comply with 

14 naming guidelines that prohibit "factory" and "facade". 

15 """ 

16 

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 ) 

29 

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 ) 

42 

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 

51 

52 return RedirectResponse( # type: ignore[return-value] 

53 url=url, 

54 status_code=status_code, 

55 headers=headers, 

56 )