mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2025-02-11 17:10:57 +03:00
Refactor wiring module
This commit is contained in:
parent
bf259bb79c
commit
3d67c3ba23
|
@ -136,26 +136,10 @@ class ProvidersMap:
|
||||||
try:
|
try:
|
||||||
provider = getattr(provider, segment)
|
provider = getattr(provider, segment)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
return
|
return None
|
||||||
|
|
||||||
if isinstance(modifier, TypeModifier):
|
if modifier:
|
||||||
provider = provider.as_(modifier.type_)
|
provider = modifier.modify(provider, providers_map=self)
|
||||||
elif isinstance(modifier, RequiredModifier):
|
|
||||||
provider = provider.required()
|
|
||||||
if modifier.type_modifier:
|
|
||||||
provider = provider.as_(modifier.type_modifier.type_)
|
|
||||||
elif isinstance(modifier, InvariantModifier):
|
|
||||||
invariant_segment = self._resolve_string_id(modifier.id)
|
|
||||||
provider = provider[invariant_segment]
|
|
||||||
elif isinstance(modifier, ProvidedInstance):
|
|
||||||
provider = provider.provided
|
|
||||||
for type_, value in modifier.segments:
|
|
||||||
if type_ == ProvidedInstance.TYPE_ATTRIBUTE:
|
|
||||||
provider = getattr(provider, value)
|
|
||||||
elif type_ == ProvidedInstance.TYPE_ITEM:
|
|
||||||
provider = provider[value]
|
|
||||||
elif type_ == ProvidedInstance.TYPE_CALL:
|
|
||||||
provider = provider.call()
|
|
||||||
return provider
|
return provider
|
||||||
|
|
||||||
def _resolve_provided_instance(
|
def _resolve_provided_instance(
|
||||||
|
@ -230,7 +214,7 @@ class ProvidersMap:
|
||||||
try:
|
try:
|
||||||
return self._map[original]
|
return self._map[original]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
return None
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _create_providers_map(
|
def _create_providers_map(
|
||||||
|
@ -563,13 +547,19 @@ def _is_declarative_container(instance: Any) -> bool:
|
||||||
|
|
||||||
|
|
||||||
class Modifier:
|
class Modifier:
|
||||||
...
|
|
||||||
|
def modify(self, provider: providers.ConfigurationOption, providers_map: ProvidersMap) -> providers.Provider:
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
class TypeModifier(Modifier):
|
class TypeModifier(Modifier):
|
||||||
|
|
||||||
def __init__(self, type_: Type):
|
def __init__(self, type_: Type):
|
||||||
self.type_ = type_
|
self.type_ = type_
|
||||||
|
|
||||||
|
def modify(self, provider: providers.ConfigurationOption, providers_map: ProvidersMap) -> providers.Provider:
|
||||||
|
return provider.as_(self.type_)
|
||||||
|
|
||||||
|
|
||||||
def as_int() -> TypeModifier:
|
def as_int() -> TypeModifier:
|
||||||
"""Return int type modifier."""
|
"""Return int type modifier."""
|
||||||
|
@ -587,6 +577,7 @@ def as_(type_: Type) -> TypeModifier:
|
||||||
|
|
||||||
|
|
||||||
class RequiredModifier(Modifier):
|
class RequiredModifier(Modifier):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.type_modifier = None
|
self.type_modifier = None
|
||||||
|
|
||||||
|
@ -604,6 +595,12 @@ class RequiredModifier(Modifier):
|
||||||
self.type_modifier = TypeModifier(type_)
|
self.type_modifier = TypeModifier(type_)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
def modify(self, provider: providers.ConfigurationOption, providers_map: ProvidersMap) -> providers.Provider:
|
||||||
|
provider = provider.required()
|
||||||
|
if self.type_modifier:
|
||||||
|
provider = provider.as_(self.type_modifier.type_)
|
||||||
|
return provider
|
||||||
|
|
||||||
|
|
||||||
def required() -> RequiredModifier:
|
def required() -> RequiredModifier:
|
||||||
"""Return required modifier."""
|
"""Return required modifier."""
|
||||||
|
@ -611,9 +608,14 @@ def required() -> RequiredModifier:
|
||||||
|
|
||||||
|
|
||||||
class InvariantModifier(Modifier):
|
class InvariantModifier(Modifier):
|
||||||
|
|
||||||
def __init__(self, id: str) -> None:
|
def __init__(self, id: str) -> None:
|
||||||
self.id = id
|
self.id = id
|
||||||
|
|
||||||
|
def modify(self, provider: providers.ConfigurationOption, providers_map: ProvidersMap) -> providers.Provider:
|
||||||
|
invariant_segment = providers_map.resolve_provider(self.id)
|
||||||
|
return provider[invariant_segment]
|
||||||
|
|
||||||
|
|
||||||
def invariant(id: str) -> InvariantModifier:
|
def invariant(id: str) -> InvariantModifier:
|
||||||
"""Return invariant modifier."""
|
"""Return invariant modifier."""
|
||||||
|
@ -641,6 +643,17 @@ class ProvidedInstance(Modifier):
|
||||||
self.segments.append((self.TYPE_CALL, None))
|
self.segments.append((self.TYPE_CALL, None))
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
def modify(self, provider: providers.ConfigurationOption, providers_map: ProvidersMap) -> providers.Provider:
|
||||||
|
provider = provider.provided
|
||||||
|
for type_, value in self.segments:
|
||||||
|
if type_ == ProvidedInstance.TYPE_ATTRIBUTE:
|
||||||
|
provider = getattr(provider, value)
|
||||||
|
elif type_ == ProvidedInstance.TYPE_ITEM:
|
||||||
|
provider = provider[value]
|
||||||
|
elif type_ == ProvidedInstance.TYPE_CALL:
|
||||||
|
provider = provider.call()
|
||||||
|
return provider
|
||||||
|
|
||||||
|
|
||||||
def provided() -> ProvidedInstance:
|
def provided() -> ProvidedInstance:
|
||||||
"""Return provided instance modifier."""
|
"""Return provided instance modifier."""
|
||||||
|
|
Loading…
Reference in New Issue
Block a user