Skip to content

Commit 6685c5a

Browse files
committed
Fix infinite loop with Closing+ConfigurationOption
1 parent 57123ce commit 6685c5a

File tree

2 files changed

+6
-21
lines changed

2 files changed

+6
-21
lines changed

src/dependency_injector/wiring.py

+3-19
Original file line numberDiff line numberDiff line change
@@ -628,21 +628,6 @@ def _fetch_reference_injections( # noqa: C901
628628
return injections, closing
629629

630630

631-
def _locate_dependent_closing_args(
632-
provider: providers.Provider, closing_deps: Dict[str, providers.Provider]
633-
) -> Dict[str, providers.Provider]:
634-
for arg in [
635-
*getattr(provider, "args", []),
636-
*getattr(provider, "kwargs", {}).values(),
637-
]:
638-
if not isinstance(arg, providers.Provider):
639-
continue
640-
if isinstance(arg, providers.Resource):
641-
closing_deps[str(id(arg))] = arg
642-
643-
_locate_dependent_closing_args(arg, closing_deps)
644-
645-
646631
def _bind_injections(fn: Callable[..., Any], providers_map: ProvidersMap) -> None:
647632
patched_callable = _patched_registry.get_callable(fn)
648633
if patched_callable is None:
@@ -664,10 +649,9 @@ def _bind_injections(fn: Callable[..., Any], providers_map: ProvidersMap) -> Non
664649

665650
if injection in patched_callable.reference_closing:
666651
patched_callable.add_closing(injection, provider)
667-
deps = {}
668-
_locate_dependent_closing_args(provider, deps)
669-
for key, dep in deps.items():
670-
patched_callable.add_closing(key, dep)
652+
653+
for resource in provider.traverse(types=[providers.Resource]):
654+
patched_callable.add_closing(str(id(resource)), resource)
671655

672656

673657
def _unbind_injections(fn: Callable[..., Any]) -> None:

tests/unit/samples/wiringstringids/resourceclosing.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,13 @@ def init_service(counter: Counter, _list: List[int], _dict: Dict[str, int]):
5959

6060

6161
class Container(containers.DeclarativeContainer):
62+
config = providers.Configuration(default={"a": 1, "b": 4})
6263
counter = providers.Singleton(Counter)
6364
_list = providers.List(
64-
providers.Callable(lambda a: a, a=1), providers.Callable(lambda b: b, 2)
65+
providers.Callable(lambda a: a, a=config.a), providers.Callable(lambda b: b, 2)
6566
)
6667
_dict = providers.Dict(
67-
a=providers.Callable(lambda a: a, a=3), b=providers.Callable(lambda b: b, 4)
68+
a=providers.Callable(lambda a: a, a=3), b=providers.Callable(lambda b: b, config.b)
6869
)
6970
service = providers.Resource(init_service, counter, _list, _dict=_dict)
7071
service2 = providers.Resource(init_service, counter, _list, _dict=_dict)

0 commit comments

Comments
 (0)