Skip to content

Commit

Permalink
Injector improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
mariotaddeucci committed Nov 12, 2024
1 parent de3700b commit 675ed83
Show file tree
Hide file tree
Showing 6 changed files with 130 additions and 4 deletions.
23 changes: 19 additions & 4 deletions src/gyjd/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,25 @@
from gyjd.core.config_loader import load_config_file
from gyjd.core.gyjd_callable import GYJDCallable
from gyjd.core.logger import GYJDLogger, get_default_logger
from gyjd.core.simple_injector import inject_dependencies, register_dependency
from gyjd.core.simple_injector import clear_registered_dependencies, inject_dependencies, register_dependency

register_dependency(get_default_logger, cls=GYJDLogger, reuse_times=-1, if_exists="skip")
register_dependency(get_default_logger, cls=logging.Logger, reuse_times=-1, if_exists="skip")
register_dependency(LoggerConfig, reuse_times=-1, if_exists="skip")

def setup_defaults(clear_dependencies: bool = False):
"""
Register default dependencies:
- GYJDLogger
- logging.Logger
- LoggerConfig
If clear_dependencies is True, clear all registered dependencies before registering the default ones.
"""

if clear_dependencies:
clear_registered_dependencies()

register_dependency(get_default_logger, cls=GYJDLogger, reuse_times=-1, if_exists="skip")
register_dependency(get_default_logger, cls=logging.Logger, reuse_times=-1, if_exists="skip")
register_dependency(LoggerConfig, reuse_times=-1, if_exists="skip")


class gyjd:
Expand Down Expand Up @@ -98,4 +112,5 @@ def register_config_file(
)


setup_defaults()
__all__ = ["gyjd"]
4 changes: 4 additions & 0 deletions src/gyjd/core/simple_injector.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,3 +86,7 @@ def register_dependency(

def get_registered_dependencies() -> set[Type]:
return set(_DEPENDENCIES_REGISTER)


def clear_registered_dependencies():
_DEPENDENCIES_REGISTER.clear()
7 changes: 7 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import pytest
from gyjd import setup_defaults


@pytest.fixture(scope="function")
def reset_injector():
setup_defaults(clear_dependencies=True)
40 changes: 40 additions & 0 deletions tests/core/injector/reuse_n_time_injection_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
from dataclasses import dataclass, field
from uuid import uuid4

from gyjd import gyjd


@dataclass
class MockConfig:
mock_id: str = field(default_factory=lambda: str(uuid4()))


def gen_mock() -> MockConfig:
return MockConfig()


@gyjd
def get_mock(mock: MockConfig = None) -> str:
for _ in range(10):
# Ensure that instance is reused on each attribute access
mock.mock_id

return mock.mock_id


def test_reuse_25_times_injection():
gyjd.register_dependency(gen_mock, reuse_times=25)

assert len(set([get_mock() for _ in range(100)])) == 4


def test_reuse_10_times_injection():
gyjd.register_dependency(gen_mock, reuse_times=10)

assert len(set([get_mock() for _ in range(100)])) == 10


def test_reuse_05_times_injection():
gyjd.register_dependency(gen_mock, reuse_times=5)

assert len(set([get_mock() for _ in range(100)])) == 20
31 changes: 31 additions & 0 deletions tests/core/injector/singleton_injection_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
from dataclasses import dataclass, field
from uuid import uuid4

from gyjd import gyjd


@dataclass
class MockConfig:
mock_id: str = field(default_factory=lambda: str(uuid4()))


def gen_mock() -> MockConfig:
return MockConfig()


@gyjd
def get_mock(mock: MockConfig = None) -> str:
for _ in range(10):
# Ensure that instance is reused on each attribute access
mock.mock_id

return mock.mock_id


def test_singleton_injection():
gyjd.register_dependency(gen_mock)

first_mock_id = get_mock()

for _ in range(10):
assert get_mock() == first_mock_id
29 changes: 29 additions & 0 deletions tests/core/injector/transient_injection_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from dataclasses import dataclass, field
from uuid import uuid4

from gyjd import gyjd


@dataclass
class MockConfig:
mock_id: str = field(default_factory=lambda: str(uuid4()))


def gen_mock() -> MockConfig:
return MockConfig()


@gyjd
def get_mock(mock: MockConfig = None) -> str:
for _ in range(10):
# Ensure that instance is reused on each attribute access
mock.mock_id

return mock.mock_id


def test_transient_injection():
gyjd.register_dependency(gen_mock, reuse_times=0)

# Ensure that each instance is unique
assert len(set([get_mock() for _ in range(100)])) == 100

0 comments on commit 675ed83

Please sign in to comment.