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
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 04:37 +0800
1"""Middleware manager for lexigram-web."""
3from __future__ import annotations
5from typing import TYPE_CHECKING, Any
7if TYPE_CHECKING:
8 from starlette.middleware import Middleware as StarletteMiddleware
10 from lexigram.web.di.provider import WebProvider
13class WebMiddlewareManager:
14 """Handles middleware adaptation and ordering for the web provider."""
16 def __init__(self, provider: WebProvider):
17 self.provider = provider
18 from lexigram.web.middleware.registry import MiddlewareAdapterRegistry
20 self.registry = MiddlewareAdapterRegistry()
22 def build_native_stack(self, container: Any) -> list[StarletteMiddleware]:
23 """Convert Lexigram middlewares to a native Starlette middleware stack.
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).
29 Args:
30 container: The resolved DI container, forwarded to
31 ``DefaultMiddlewareStack`` for
32 :class:`~lexigram.web.middleware.di_scope.DIScopeMiddleware`.
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
40 stack = DefaultMiddlewareStack(
41 container=container,
42 extra_middlewares=list(self.provider.middleware),
43 )
44 return stack.build()