Coverage for src/lexigram/features/decorators/_utils.py: 45%

20 statements  

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

1"""Shared internal utilities for feature-flag decorators. 

2 

3Not part of the public API — import from :mod:`lexigram.features.decorators` 

4instead. 

5""" 

6 

7from __future__ import annotations 

8 

9from typing import TYPE_CHECKING, Any 

10 

11if TYPE_CHECKING: 

12 from collections.abc import Callable 

13 

14 from lexigram.features.manager.flag_manager import FlagManager 

15 

16 

17def _resolve_manager(manager: FlagManager | None) -> FlagManager: 

18 """Resolve FlagManager from provided instance, context var, or fallback. 

19 

20 Resolution order: 

21 

22 1. Explicit *manager* instance. 

23 2. Synchronous DI resolution from the ambient container. 

24 3. New local manager (uses ``LocalProvider`` by default). 

25 

26 Args: 

27 manager: Explicit manager instance or ``None``. 

28 

29 Returns: 

30 A resolved :class:`~lexigram.features.manager.FlagManager`. 

31 """ 

32 if manager is not None: 

33 return manager 

34 

35 from lexigram.di.resolution.context import current_resolver_var, get_resolver 

36 

37 resolver = get_resolver(None) or current_resolver_var.get() 

38 if resolver is not None: 

39 from contextlib import suppress 

40 

41 with suppress(Exception): 

42 if hasattr(resolver, "resolve_sync"): 

43 from lexigram.features.manager.flag_manager import FlagManager 

44 

45 resolved: FlagManager = resolver.resolve_sync(FlagManager) 

46 return resolved 

47 

48 from lexigram.features.manager.flag_manager import FlagManager 

49 

50 return FlagManager() 

51 

52 

53def _is_coroutinefunction(fn: Callable[..., Any]) -> bool: 

54 """Return True if *fn* is an async function or coroutine function. 

55 

56 Args: 

57 fn: Any callable. 

58 

59 Returns: 

60 True when *fn* is a coroutine function. 

61 """ 

62 import asyncio 

63 import inspect 

64 

65 return asyncio.iscoroutinefunction(fn) or inspect.iscoroutinefunction(fn)