Skip to content

Commit 106fce6

Browse files
committed
Add support for resolving matching all tags provided (not only any of provided tags).
1 parent 38801bf commit 106fce6

File tree

2 files changed

+59
-3
lines changed

2 files changed

+59
-3
lines changed

src/dependency_injection/container.py

+21-3
Original file line numberDiff line numberDiff line change
@@ -154,12 +154,30 @@ def resolve(self, dependency: Type, scope_name: str = DEFAULT_SCOPE_NAME) -> Typ
154154

155155
raise ValueError(f"Invalid dependency scope: {scope}")
156156

157-
def resolve_all(self, tags: Optional[set] = None) -> List[Any]:
158-
tags = tags or []
157+
def resolve_all(
158+
self, tags: Optional[set] = None, match_all_tags: bool = False
159+
) -> List[Any]:
160+
tags = tags or set()
159161
resolved_dependencies = []
162+
160163
for registration in self._registrations.values():
161-
if not len(tags) or tags.intersection(registration.tags):
164+
if not tags:
165+
# If no tags are provided, resolve all dependencies
162166
resolved_dependencies.append(self.resolve(registration.dependency))
167+
else:
168+
if match_all_tags:
169+
# Match dependencies that have all the specified tags
170+
if registration.tags and tags.issubset(registration.tags):
171+
resolved_dependencies.append(
172+
self.resolve(registration.dependency)
173+
)
174+
else:
175+
# Match dependencies that have any of the specified tags
176+
if registration.tags and tags.intersection(registration.tags):
177+
resolved_dependencies.append(
178+
self.resolve(registration.dependency)
179+
)
180+
163181
return resolved_dependencies
164182

165183
def _validate_constructor_args(

tests/unit_test/container/resolve/test_resolve_all.py

+38
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,44 @@ class Innovation:
6565
)
6666
)
6767

68+
def test_returns_only_dependencies_matching_all_tags_when_match_all_tags_is_true(
69+
self,
70+
):
71+
# arrange
72+
class Driveable:
73+
pass
74+
75+
class Transporting:
76+
pass
77+
78+
class Vehicle:
79+
pass
80+
81+
class Car(Vehicle):
82+
pass
83+
84+
class Innovation:
85+
pass
86+
87+
dependency_container = DependencyContainer.get_instance()
88+
dependency_container.register_transient(Vehicle, tags={Driveable, Transporting})
89+
dependency_container.register_transient(Car, tags={Driveable, Transporting})
90+
dependency_container.register_transient(Innovation, tags={Driveable})
91+
92+
# act
93+
resolved_dependencies = dependency_container.resolve_all(
94+
tags={Driveable, Transporting}, match_all_tags=True
95+
)
96+
97+
# assert
98+
self.assertEqual(len(resolved_dependencies), 2)
99+
self.assertTrue(
100+
any(isinstance(dependency, Vehicle) for dependency in resolved_dependencies)
101+
)
102+
self.assertTrue(
103+
any(isinstance(dependency, Car) for dependency in resolved_dependencies)
104+
)
105+
68106
def test_does_not_return_dependency_without_tag(
69107
self,
70108
):

0 commit comments

Comments
 (0)