From ab6d03204fd503b55a086a8adc2e6c0d5b79692a Mon Sep 17 00:00:00 2001 From: Artur Shiriev Date: Tue, 3 Nov 2026 08:05:09 +0300 Subject: [PATCH] Find validation scope owners without building chains --- modern_di/dependency_graph.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/modern_di/dependency_graph.py b/modern_di/dependency_graph.py index 3afdf6f6..2a6723c2 100644 --- a/modern_di/dependency_graph.py +++ b/modern_di/dependency_graph.py @@ -212,6 +212,25 @@ def find_cycle_from( return None +def _find_scope_owner( + provider: AbstractProvider[typing.Any], registry: "ProvidersRegistry" +) -> AbstractProvider[typing.Any]: + """Follow aliases and derived sources to the scope owner.""" + seen: set[int] = set() + while True: + if type(provider) is _Derived: + provider = provider._source # noqa: SLF001 + seen.clear() + elif type(provider) is Alias: + target = redirect_target(provider, registry) + if target is None or provider.provider_id in seen: + return provider + seen.add(provider.provider_id) + provider = target + else: + return provider + + def _scope_owner( provider: AbstractProvider[typing.Any], registry: "ProvidersRegistry", @@ -223,7 +242,7 @@ def _scope_owner( provider_id = provider.provider_id owner = scope_owners.get(provider_id) if owner is None: - owner = scope_chain(provider, registry)[-1] + owner = _find_scope_owner(provider, registry) scope_owners[provider_id] = owner return owner