Introduce typed config objects, optional adapter injection, and .env loading to simplify testing while preserving env-based defaults for production usage. Co-authored-by: Cursor <[email protected]>
44 lines
1.3 KiB
Python
44 lines
1.3 KiB
Python
"""python_repositories: Unified repository interfaces and adapters."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING
|
|
|
|
# Interfaces are always available; they have no optional backend dependencies.
|
|
from . import adapters
|
|
from .config import MinioConfig, RedisConfig, load_dotenv
|
|
from .interfaces import (
|
|
ConnectionAwareInterface,
|
|
ContextAwareInterface,
|
|
JsonRepositoryInterface,
|
|
ObjectRepositoryInterface,
|
|
)
|
|
|
|
# Adapters are imported only for static type checkers; runtime loading is delegated below.
|
|
if TYPE_CHECKING:
|
|
from .adapters.minio_adapter import MinioAdapter as MinioAdapter
|
|
from .adapters.redis_adapter import RedisAdapter as RedisAdapter
|
|
|
|
__all__ = [
|
|
"ConnectionAwareInterface",
|
|
"ContextAwareInterface",
|
|
"JsonRepositoryInterface",
|
|
"MinioConfig",
|
|
"ObjectRepositoryInterface",
|
|
"RedisConfig",
|
|
"load_dotenv",
|
|
*adapters.__all__,
|
|
]
|
|
|
|
|
|
def __getattr__(name: str) -> object:
|
|
"""Delegate adapter lookups to adapters; lazy loading is defined there."""
|
|
if name in adapters.__all__:
|
|
return getattr(adapters, name)
|
|
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
|
|
|
|
def __dir__() -> list[str]:
|
|
"""Expose lazy adapter names in tab completion and dir()."""
|
|
return sorted(__all__)
|