Optional deps
provide.foundation.utils.optional_deps
¶
TODO: Add module docstring.
Classes¶
OptionalDependency
¶
Handles loading of optional dependencies with automatic stub generation.
This centralizes the try/except ImportError pattern and provides automatic stub creation when dependencies are missing.
Examples:
>>> # Simple package import
>>> click_dep = OptionalDependency("click", "cli")
>>> click = click_dep.import_package()
>>> has_click = click_dep.is_available()
>>> # Import specific symbols from a module
>>> crypto_dep = OptionalDependency("cryptography", "crypto")
>>> Certificate, create_self_signed = crypto_dep.import_symbols(
... "provide.foundation.crypto.certificates",
... ["Certificate", "create_self_signed"]
... )
Initialize optional dependency handler.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
package_name
|
str
|
Name of the optional package (e.g., "click", "cryptography") |
required |
feature_name
|
str
|
Foundation feature name (e.g., "cli", "crypto") |
required |
Source code in provide/foundation/utils/optional_deps.py
Functions¶
import_package
¶
Import the package or return a stub module.
Returns:
| Type | Description |
|---|---|
Any
|
The actual package if available, otherwise a stub that raises DependencyError |
Example
dep = OptionalDependency("click", "cli") click = dep.import_package() # Real click module or stub
Source code in provide/foundation/utils/optional_deps.py
import_symbols
¶
Import specific symbols from a module or create stubs.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
module_path
|
str
|
Full module path (e.g., "provide.foundation.crypto.certificates") |
required |
symbols
|
list[str]
|
List of symbol names to import |
required |
create_stubs
|
bool
|
Whether to create stubs for missing symbols (default: True) |
True
|
Returns:
| Type | Description |
|---|---|
list[Any]
|
List of imported symbols or stubs in the same order as requested |
Example
dep = OptionalDependency("cryptography", "crypto") Certificate, CertificateConfig = dep.import_symbols( ... "provide.foundation.crypto.certificates", ... ["Certificate", "CertificateConfig"] ... )
Source code in provide/foundation/utils/optional_deps.py
Functions¶
load_optional_dependency
¶
load_optional_dependency(
package_name: str,
feature_name: str,
*,
module_path: str | None = None,
symbols: list[str] | None = None
) -> tuple[bool, Any | list[Any]]
Convenience function to load an optional dependency.
This is a one-shot function that combines availability checking and import/stub creation.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
package_name
|
str
|
Name of the optional package |
required |
feature_name
|
str
|
Foundation feature name |
required |
module_path
|
str | None
|
Optional module path for importing specific symbols |
None
|
symbols
|
list[str] | None
|
Optional list of symbols to import from module |
None
|
Returns:
| Type | Description |
|---|---|
bool
|
Tuple of (is_available, imported_content) |
Any | list[Any]
|
|
tuple[bool, Any | list[Any]]
|
|
Examples:
>>> # Import specific symbols
>>> has_crypto, (Certificate, CertificateConfig) = load_optional_dependency(
... "cryptography",
... "crypto",
... module_path="provide.foundation.crypto.certificates",
... symbols=["Certificate", "CertificateConfig"]
... )