Implement wiring for Provide[foo.provider]

This commit is contained in:
Roman Mogylatov 2020-09-26 00:31:29 -04:00
parent c20c57ae7c
commit 6d92df32aa
5 changed files with 3489 additions and 3409 deletions

File diff suppressed because it is too large Load Diff

View File

@ -391,6 +391,11 @@ cdef class Delegate(Provider):
""" """
return self.__str__() return self.__str__()
@property
def provides(self):
"""Return provider."""
return self.__provides
cpdef object _provide(self, tuple args, dict kwargs): cpdef object _provide(self, tuple args, dict kwargs):
"""Return provided instance. """Return provided instance.

View File

@ -127,6 +127,9 @@ def _resolve_injections(fn: Callable[..., Any], container: AnyContainer) -> Dict
config, config,
marker.provider.provides, marker.provider.provides,
) )
elif isinstance(marker.provider, providers.Delegate):
provider_name = container.resolve_provider_name(marker.provider.provides)
provider = container.providers[provider_name]
elif isinstance(marker.provider, providers.Provider): elif isinstance(marker.provider, providers.Provider):
provider_name = container.resolve_provider_name(marker.provider) provider_name = container.resolve_provider_name(marker.provider)
if not provider_name: if not provider_name:

View File

@ -30,3 +30,8 @@ def test_config_value(
some_value_decimal: Decimal = Provide[Container.config.a.b.c.as_(Decimal)], some_value_decimal: Decimal = Provide[Container.config.a.b.c.as_(Decimal)],
): ):
return some_value_int, some_value_str, some_value_decimal return some_value_int, some_value_str, some_value_decimal
def test_provide_provider(service_provider: Callable[..., Service] = Provider[Container.service.provider]):
service = service_provider()
return service

View File

@ -58,3 +58,7 @@ class WiringTest(unittest.TestCase):
self.assertEqual(int_value, 10) self.assertEqual(int_value, 10)
self.assertEqual(str_value, '10') self.assertEqual(str_value, '10')
self.assertEqual(decimal_value, Decimal(10)) self.assertEqual(decimal_value, Decimal(10))
def test_provide_provider(self):
service = module.test_provide_provider()
self.assertIsInstance(service, Service)