From 334087aaa67bbd922e6b7b9898285ea346d994af Mon Sep 17 00:00:00 2001 From: htw-hackathon-2025 Date: Tue, 20 Oct 2026 23:06:48 -0700 Subject: [PATCH] Replace existing keyword injections in add_kwargs --- src/dependency_injector/providers.pyx | 6 ++--- .../unit/providers/async/test_factory_py36.py | 27 +++++++++++++++++++ .../callables/test_callable_py2_py3.py | 10 +++++++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/dependency_injector/providers.pyx b/src/dependency_injector/providers.pyx index 1935c012..0a20d40f 100644 --- a/src/dependency_injector/providers.pyx +++ b/src/dependency_injector/providers.pyx @@ -1311,9 +1311,9 @@ cdef class Callable(Provider): :return: Reference ``self`` """ - self._kwargs += parse_named_injections(kwargs) - self._kwargs_len = len(self._kwargs) - return self + existing_kwargs = self.kwargs + existing_kwargs.update(kwargs) + return self.set_kwargs(**existing_kwargs) def set_kwargs(self, **kwargs): """Set keyword argument injections. diff --git a/tests/unit/providers/async/test_factory_py36.py b/tests/unit/providers/async/test_factory_py36.py index 98ba2c83..e7fa8897 100644 --- a/tests/unit/providers/async/test_factory_py36.py +++ b/tests/unit/providers/async/test_factory_py36.py @@ -421,3 +421,30 @@ class ContainerWithAttributes(BaseContainer): assert service2.client.resource2 is RESOURCE2 assert service1.client is not service2.client + + +@mark.asyncio +@mark.parametrize("provider_type", [providers.Callable, providers.Factory, providers.Singleton]) +@mark.parametrize("call_kwargs, expected", [({}, 20), ({"extra": 3}, 20), ({"value": 30}, 30)]) +async def test_add_kwargs_replaces_async_dependency(provider_type, call_kwargs, expected): + calls = [] + + async def original(): + calls.append("original") + return 1 + + async def other(): + return 2 + + provider = provider_type( + dict, value=providers.Callable(original), other=providers.Callable(other) + ) + provider.add_kwargs(value=20) + + result = await provider(**call_kwargs) + + assert result["value"] == expected + assert result["other"] == 2 + if "extra" in call_kwargs: + assert result["extra"] == 3 + assert calls == [] diff --git a/tests/unit/providers/callables/test_callable_py2_py3.py b/tests/unit/providers/callables/test_callable_py2_py3.py index fa186799..d4df1288 100644 --- a/tests/unit/providers/callables/test_callable_py2_py3.py +++ b/tests/unit/providers/callables/test_callable_py2_py3.py @@ -223,3 +223,13 @@ def test_repr(): "".format(repr(example), hex(id(provider))) ) + + +def test_add_kwargs_replaces_dependency(): + calls = [] + original = providers.Callable(lambda: calls.append("original")) + provider = providers.Callable(dict, value=original, other=2) + provider.add_kwargs(value=20) + + assert provider() == {"value": 20, "other": 2} + assert calls == []