Coverage for src/lexigram/web/middleware/manager.py: 45%

11 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-25 04:37 +0800

1"""Middleware manager for lexigram-web.""" 

2 

3from __future__ import annotations 

4 

5from typing import TYPE_CHECKING, Any 

6 

7if TYPE_CHECKING: 

8 from starlette.middleware import Middleware as StarletteMiddleware 

9 

10 from lexigram.web.di.provider import WebProvider 

11 

12 

13class WebMiddlewareManager: 

14 """Handles middleware adaptation and ordering for the web provider.""" 

15 

16 def __init__(self, provider: WebProvider): 

17 self.provider = provider 

18 from lexigram.web.middleware.registry import MiddlewareAdapterRegistry 

19 

20 self.registry = MiddlewareAdapterRegistry() 

21 

22 def build_native_stack(self, container: Any) -> list[StarletteMiddleware]: 

23 """Convert Lexigram middlewares to a native Starlette middleware stack. 

24 

25 Delegates to :class:`~lexigram.web.middleware.stack.DefaultMiddlewareStack` 

26 so both this manager and any user code that builds a stack directly 

27 produce an identical result (DRY). 

28 

29 Args: 

30 container: The resolved DI container, forwarded to 

31 ``DefaultMiddlewareStack`` for 

32 :class:`~lexigram.web.middleware.di_scope.DIScopeMiddleware`. 

33 

34 Returns: 

35 An ordered list of :class:`starlette.middleware.Middleware` 

36 instances ready for :class:`starlette.applications.Starlette`. 

37 """ 

38 from lexigram.web.middleware.stack import DefaultMiddlewareStack 

39 

40 stack = DefaultMiddlewareStack( 

41 container=container, 

42 extra_middlewares=list(self.provider.middleware), 

43 ) 

44 return stack.build()