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

27 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 Stat, StatContent 

7from lexigram.logging import get_logger 

8from lexigram.web.routing.controller_registry import ControllerRegistry 

9from lexigram.web.routing.registry import RouteRegistry 

10 

11logger = get_logger(__name__) 

12 

13 

14class WebOverviewPage: 

15 """Dashboard overview for /admin/web.""" 

16 

17 def __init__( 

18 self, 

19 route_registry: RouteRegistry | None = None, 

20 controller_registry: ControllerRegistry | None = None, 

21 ) -> None: 

22 self._route_registry = route_registry 

23 self._controller_registry = controller_registry 

24 

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

26 total_routes = 0 

27 total_controllers = 0 

28 

29 try: 

30 if self._route_registry is not None: 

31 routes = self._route_registry.get_all_routes() 

32 total_routes = sum(len(methods) for methods in routes.values()) 

33 except Exception as exc: 

34 logger.warning("web_overview.routes_unavailable", error=str(exc)) 

35 

36 try: 

37 if self._controller_registry is not None: 

38 total_controllers = len(self._controller_registry.get_all_controllers()) 

39 except Exception as exc: 

40 logger.warning("web_overview.controllers_unavailable", error=str(exc)) 

41 

42 return PageContent( 

43 title="Web", 

44 body=StatContent( 

45 stats=( 

46 Stat( 

47 label="Total Routes", 

48 value=str(total_routes), 

49 icon="map", 

50 ), 

51 Stat( 

52 label="Total Controllers", 

53 value=str(total_controllers), 

54 icon="layers", 

55 ), 

56 ) 

57 ), 

58 )