Skip to content

Commit 4fc32f2

Browse files
committed
✨ add container for dependency injection (not completed)
1 parent 374ae77 commit 4fc32f2

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

fastcrawler/utils/injection.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,20 @@
44
from typing import Any, Callable
55

66

7+
class Container:
8+
def __init__(self):
9+
self.dependencies = {}
10+
11+
def __getitem__(self, dependency: Callable):
12+
return self.dependencies[dependency]
13+
14+
def __setitem__(self, key: Callable, value: Callable):
15+
self.dependencies[key] = value
16+
17+
18+
container = Container()
19+
20+
721
class _Depends:
822
"""Dependency injection to run callable as a dependency"""
923

@@ -14,12 +28,18 @@ def __init__(
1428
*args,
1529
**kwargs,
1630
):
17-
self.dependency = dependency
31+
self._dependency = dependency
32+
container.dependencies[dependency] = dependency
1833
self.use_cache = use_cache
1934
self.result = ...
2035
self.args = args
2136
self.kwargs = kwargs
2237

38+
def get_dependency(self):
39+
return container[self._dependency]
40+
41+
dependency = property(get_dependency)
42+
2343
async def async_eval(self):
2444
"""Run async callable dependency and store it as cache entry"""
2545
if self.result is ...:

test/test_injections.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import pytest
44

55
from fastcrawler.utils import Depends, _Depends, dependency_injector
6+
from fastcrawler.utils.injection import container
67

78

89
def test_sync_dependency_injection():
@@ -194,3 +195,17 @@ def func(
194195

195196
assert result1 == "sync_dependency1"
196197
assert result2 == "sync_dependency2"
198+
199+
200+
def test_override_dependency():
201+
dependency_1 = lambda: "sync_dependency1"
202+
dependency_2 = lambda: "sync_dependency2"
203+
204+
@dependency_injector
205+
def func(
206+
dep1=Depends(dependency_1, use_cache=True),
207+
):
208+
return dep1
209+
210+
container[dependency_1] = dependency_2
211+
assert func() == "sync_dependency2"

0 commit comments

Comments
 (0)