Coverage for src/lexigram/admin/integrations/_optional.py: 100%
12 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-21 14:56 +0800
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-21 14:56 +0800
1"""Helpers for detecting and optionally integrating extension packages."""
3from __future__ import annotations
5import importlib.util
7from lexigram.logging import get_logger
9logger = get_logger(__name__)
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
17def require_or_noop(module_name: str, noop_class: type) -> object:
18 """Return None if *module_name* is installed, else a *noop_class* instance.
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()
30__all__ = [
31 "is_installed",
32 "require_or_noop",
33]