Coverage for src/lexigram/admin/lib/di.py: 75%

12 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-21 14:56 +0800

1"""Dependency Injection utilities for lexigram-admin.""" 

2 

3from __future__ import annotations 

4 

5from typing import TYPE_CHECKING, Any, TypeVar 

6 

7if TYPE_CHECKING: 

8 from lexigram.contracts.core.di import ContainerResolverProtocol 

9 

10T = TypeVar("T") 

11 

12 

13def get_admin_resolver(context: Any | None = None) -> ContainerResolverProtocol: 

14 """Resolve the current DI resolver for the admin session. 

15 

16 Prefers the provided context, then falls back to internal contextvars 

17 if available via contracts. 

18 """ 

19 from lexigram.di.resolution.context import get_resolver 

20 

21 # 1. Check provided context 

22 resolver = get_resolver(context) 

23 if resolver: 

24 return resolver 

25 

26 # 2. Last resort - trigger an error if we can't find anything 

27 # Ensure the resolver is passed explicitly or available in the request state. 

28 raise RuntimeError( 

29 "Could not find a DI resolver in the current admin context. " 

30 "Ensure the resolver is passed explicitly or available in the request state.", 

31 ) 

32 

33 

34async def resolve_admin_service( 

35 service_type: type[T] | str, context: Any | None = None 

36) -> T: 

37 """Resolve a service from the admin resolver.""" 

38 resolver = get_admin_resolver(context) 

39 return await resolver.resolve(service_type)