Coverage for src / lexigram / admin / integrations / _optional.py: 67%

12 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-08-13 22:14 +0800

1"""Helpers for detecting and optionally integrating extension packages.""" 

2 

3from __future__ import annotations 

4 

5import importlib.util 

6 

7from lexigram.logging import get_logger 

8 

9logger = get_logger(__name__) 

10 

11 

12def is_installed(module_name: str) -> bool: 

13 """Return True when *module_name* can be imported (not necessarily loaded).""" 

14 return importlib.util.find_spec(module_name) is not None 

15 

16 

17def require_or_noop(module_name: str, noop_class: type) -> object: 

18 """Return None if *module_name* is installed, else a *noop_class* instance. 

19 

20 Callers that receive ``None`` should resolve the real implementation via 

21 the container. Callers that receive a no-op instance should use it as a 

22 drop-in replacement. 

23 """ 

24 if is_installed(module_name): 

25 return None 

26 logger.warning("optional integration %s not installed; using no-op", module_name) 

27 return noop_class() 

28 

29 

30__all__ = [ 

31 "is_installed", 

32 "require_or_noop", 

33]