diff --git a/fastcrawler/utils/injection.py b/fastcrawler/utils/injection.py index a1814f9..1fe211b 100644 --- a/fastcrawler/utils/injection.py +++ b/fastcrawler/utils/injection.py @@ -4,6 +4,20 @@ from typing import Any, Callable +class Container: + def __init__(self): + self.dependencies = {} + + def __getitem__(self, dependency: Callable): + return self.dependencies[dependency] + + def __setitem__(self, key: Callable, value: Callable): + self.dependencies[key] = value + + +container = Container() + + class _Depends: """Dependency injection to run callable as a dependency""" @@ -14,12 +28,18 @@ def __init__( *args, **kwargs, ): - self.dependency = dependency + self._dependency = dependency + container.dependencies[dependency] = dependency self.use_cache = use_cache self.result = ... self.args = args self.kwargs = kwargs + def get_dependency(self): + return container[self._dependency] + + dependency = property(get_dependency) + async def async_eval(self): """Run async callable dependency and store it as cache entry""" if self.result is ...: diff --git a/test/test_injections.py b/test/test_injections.py index 1f9d446..58d9193 100644 --- a/test/test_injections.py +++ b/test/test_injections.py @@ -3,6 +3,7 @@ import pytest from fastcrawler.utils import Depends, _Depends, dependency_injector +from fastcrawler.utils.injection import container def test_sync_dependency_injection(): @@ -194,3 +195,20 @@ def func( assert result1 == "sync_dependency1" assert result2 == "sync_dependency2" + + +def test_override_dependency(): + def dependency_1(): + return "sync_dependency1" + + def dependency_2(): + return "sync_dependency2" + + @dependency_injector + def func( + dep1=Depends(dependency_1, use_cache=True), + ): + return dep1 + + container[dependency_1] = dependency_2 + assert func() == "sync_dependency2"