22from abc import ABC
33from dataclasses import dataclass
44from typing import (
5+ Any ,
56 ClassVar ,
67 Dict ,
78 Generic ,
@@ -2474,6 +2475,62 @@ class B:
24742475 assert isinstance (value , DynamicResolver )
24752476
24762477
2478+ def test_provide_protocol_with_attribute_dependency () -> None :
2479+ class P (Protocol ):
2480+ def foo (self ) -> Any :
2481+ ...
2482+
2483+ class Dependency :
2484+ pass
2485+
2486+ class Impl (P ):
2487+ # attribute dependency
2488+ dependency : Dependency
2489+
2490+ def foo (self ) -> Any :
2491+ pass
2492+
2493+ container = Container ()
2494+ container .register (Dependency )
2495+ container .register (Impl )
2496+
2497+ try :
2498+ resolved = container .resolve (Impl )
2499+ except CannotResolveParameterException as e :
2500+ pytest .fail (str (e ))
2501+
2502+ assert isinstance (resolved , Impl )
2503+ assert isinstance (resolved .dependency , Dependency )
2504+
2505+
2506+ def test_provide_protocol_with_init_dependency () -> None :
2507+ class P (Protocol ):
2508+ def foo (self ) -> Any :
2509+ ...
2510+
2511+ class Dependency :
2512+ pass
2513+
2514+ class Impl (P ):
2515+ def __init__ (self , dependency : Dependency ) -> None :
2516+ self .dependency = dependency
2517+
2518+ def foo (self ) -> Any :
2519+ pass
2520+
2521+ container = Container ()
2522+ container .register (Dependency )
2523+ container .register (Impl )
2524+
2525+ try :
2526+ resolved = container .resolve (Impl )
2527+ except CannotResolveParameterException as e :
2528+ pytest .fail (str (e ))
2529+
2530+ assert isinstance (resolved , Impl )
2531+ assert isinstance (resolved .dependency , Dependency )
2532+
2533+
24772534def test_provide_protocol_generic () -> None :
24782535 T = TypeVar ("T" )
24792536
@@ -2500,6 +2557,39 @@ def foo(self, t: A) -> A:
25002557 assert isinstance (resolved , Impl )
25012558
25022559
2560+ def test_provide_protocol_generic_with_inner_dependency () -> None :
2561+ T = TypeVar ("T" )
2562+
2563+ class P (Protocol [T ]):
2564+ def foo (self , t : T ) -> T :
2565+ ...
2566+
2567+ class A :
2568+ ...
2569+
2570+ class Dependency :
2571+ pass
2572+
2573+ class Impl (P [A ]):
2574+ dependency : Dependency
2575+
2576+ def foo (self , t : A ) -> A :
2577+ return t
2578+
2579+ container = Container ()
2580+
2581+ container .register (Impl )
2582+ container .register (Dependency )
2583+
2584+ try :
2585+ resolved = container .resolve (Impl )
2586+ except CannotResolveParameterException as e :
2587+ pytest .fail (str (e ))
2588+
2589+ assert isinstance (resolved , Impl )
2590+ assert isinstance (resolved .dependency , Dependency )
2591+
2592+
25032593def test_ignore_class_var ():
25042594 """
25052595 ClassVar attributes must be ignored, because they are not instance attributes.
0 commit comments