Implement container API

This commit is contained in:
Roman Mogylatov 2021-10-23 15:17:40 -04:00
parent 8a31384b18
commit ab13daa3a5
5 changed files with 1875 additions and 1546 deletions

File diff suppressed because it is too large Load Diff

View File

@ -41,6 +41,7 @@ class Container:
dependencies: Dict[str, Provider]
overridden: Tuple[Provider]
wiring_config: WiringConfiguration
auto_load_config: bool = True
__self__: Self
def __init__(self) -> None: ...
def __deepcopy__(self, memo: Optional[Dict[str, Any]]) -> Provider: ...
@ -58,6 +59,7 @@ class Container:
def unwire(self) -> None: ...
def init_resources(self) -> Optional[Awaitable]: ...
def shutdown_resources(self) -> Optional[Awaitable]: ...
def load_config(self) -> None: ...
def apply_container_providers_overridings(self) -> None: ...
def reset_singletons(self) -> SingletonResetContext[C_Base]: ...
def check_dependencies(self) -> None: ...

View File

@ -377,6 +377,12 @@ class DynamicContainer(Container):
else:
return _sync_ordered_shutdown(resources)
def load_config(self):
"""Load configuration."""
config: providers.Configuration
for config in self.traverse(types=[providers.Configuration]):
config.load()
def apply_container_providers_overridings(self):
"""Apply container providers' overridings."""
for provider in self.traverse(types=[providers.Container]):
@ -671,6 +677,12 @@ class DeclarativeContainer(Container):
:type: WiringConfiguration
"""
auto_load_config = True
"""Automatically load configuration when the container is created.
:type: bool
"""
cls_providers = dict()
"""Read-only dictionary of current container providers.
@ -720,6 +732,9 @@ class DeclarativeContainer(Container):
container.override_providers(**overriding_providers)
container.apply_container_providers_overridings()
if cls.auto_load_config:
container.load_config()
if container.is_auto_wiring_enabled():
container.wire()

View File

@ -0,0 +1,44 @@
"""Tests for container config loading."""
from dependency_injector import containers, providers
from pytest import fixture
@fixture
def yaml_config_file(tmp_path):
yaml_config_file = str(tmp_path / "config.yml")
with open(yaml_config_file, "w") as file:
file.write(
"section1:\n"
" value1: yaml-loaded\n"
)
return yaml_config_file
def test_auto_load_config(yaml_config_file):
class ContainerWithConfig(containers.DeclarativeContainer):
config = providers.Configuration(yaml_files=[yaml_config_file])
container = ContainerWithConfig()
assert container.config.section1.value1() == "yaml-loaded"
def test_manual_load_config(yaml_config_file):
class ContainerWithConfig(containers.DeclarativeContainer):
auto_load_config = False
config = providers.Configuration(yaml_files=[yaml_config_file])
container = ContainerWithConfig()
assert container.config.section1.value1() is None
container.load_config()
assert container.config.section1.value1() == "yaml-loaded"
def test_load_config_does_not_affect_class(yaml_config_file):
class ContainerWithConfig(containers.DeclarativeContainer):
config = providers.Configuration(yaml_files=[yaml_config_file])
assert ContainerWithConfig.config.section1.value1() is None
_ = ContainerWithConfig()
assert ContainerWithConfig.config.section1.value1() is None

View File

@ -1,4 +1,4 @@
"""Tests for container self provier."""
"""Tests for container self provider."""
from dependency_injector import containers, providers, errors
from pytest import raises