Coverage for src / taipanstack / bridges / _imports.py: 100%
15 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-12 21:18 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-12 21:18 +0000
1"""
2Lazy optional import helpers for Taipan Bridges.
4Provides a centralised mechanism to handle optional dependencies
5that may or may not be installed at runtime.
6"""
8import importlib
9import types
11from taipanstack.core.result import Err, Ok, Result
14def require_dependency(
15 module_name: str,
16 *,
17 pip_extra: str = "",
18) -> Result[types.ModuleType, ImportError]:
19 """Attempt to import *module_name* and return a ``Result``.
21 Args:
22 module_name: Dotted module path (e.g. ``"httpx"``).
23 pip_extra: Optional pip extra name for the error message.
25 Returns:
26 ``Ok(module)`` if available, ``Err(ImportError)`` otherwise.
28 Example:
29 >>> require_dependency("httpx", pip_extra="bridges-http")
30 Ok(<module 'httpx' ...>)
32 """
33 try:
34 mod = importlib.import_module(module_name) # nosem
35 return Ok(mod)
36 except ImportError:
37 install_hint = (
38 f"pip install taipanstack[{pip_extra}]"
39 if pip_extra
40 else f"pip install {module_name}"
41 )
42 return Err(
43 ImportError(
44 f"'{module_name}' is required but not installed. "
45 f"Install with: {install_hint}"
46 )
47 )
50def get_attr_or_err(
51 module: types.ModuleType,
52 name: str,
53) -> Result[object, AttributeError]:
54 """Safely access an attribute from a module.
56 Args:
57 module: The imported module.
58 name: Attribute name to retrieve.
60 Returns:
61 ``Ok(attr)`` if found, ``Err(AttributeError)`` otherwise.
63 """
64 try:
65 return Ok(getattr(module, name))
66 except AttributeError as exc:
67 return Err(exc)