Coverage for src/lexigram/web/admin/pages/middleware.py: 0%

26 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 lexigram.contracts.admin import PageContent 

6from lexigram.contracts.admin.widget_content import ( 

7 EmptyContent, 

8 TableCell, 

9 TableContent, 

10) 

11from lexigram.logging import get_logger 

12from lexigram.web.middleware.base import MiddlewareRegistry 

13from lexigram.web.middleware.registry import MiddlewareAdapterRegistry 

14 

15logger = get_logger(__name__) 

16 

17 

18class WebMiddlewarePage: 

19 """Middleware overview page for /admin/web/middleware.""" 

20 

21 def __init__( 

22 self, 

23 middleware_registry: MiddlewareRegistry | None = None, 

24 adapter_registry: MiddlewareAdapterRegistry | None = None, 

25 ) -> None: 

26 self._middleware_registry = middleware_registry 

27 self._adapter_registry = adapter_registry 

28 

29 async def handle(self, request: Any) -> PageContent: 

30 if self._middleware_registry is None: 

31 return PageContent( 

32 title="Middleware", 

33 body=EmptyContent( 

34 title="Middleware Registry Unavailable", 

35 message="The middleware registry could not be resolved.", 

36 icon="layers", 

37 ), 

38 ) 

39 

40 try: 

41 names = self._middleware_registry.get_middleware_order() 

42 stack = getattr(self._middleware_registry, "_middleware_stack", []) 

43 except Exception as exc: 

44 logger.warning("web_middleware.list_failed", error=str(exc)) 

45 names = [] 

46 stack = [] 

47 

48 if not names: 

49 return PageContent( 

50 title="Middleware", 

51 body=EmptyContent( 

52 title="No Middleware Registered", 

53 message="No middleware has been registered yet.", 

54 icon="layers", 

55 ), 

56 ) 

57 

58 rows = tuple( 

59 (TableCell(name), TableCell(cls.__name__), TableCell(cls.__module__)) 

60 for (_, cls, _), name in zip(stack, names, strict=True) 

61 ) 

62 

63 return PageContent( 

64 title="Middleware", 

65 body=TableContent( 

66 columns=("Name", "Class", "Module"), 

67 rows=rows, 

68 ), 

69 )