From 5561069d50aa1ad41d36d98f96e973073fbd5acb Mon Sep 17 00:00:00 2001 From: Roman Mogilatov Date: Mon, 27 Jul 2015 01:44:20 +0300 Subject: [PATCH] Refactoring of kwargs injecting --- objects/decorators.py | 9 +++++---- objects/providers.py | 10 ++++------ objects/utils.py | 8 ++++++++ 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/objects/decorators.py b/objects/decorators.py index fea9d86d..3884b86c 100644 --- a/objects/decorators.py +++ b/objects/decorators.py @@ -3,6 +3,7 @@ from six import wraps from .utils import ensure_is_injection +from .utils import get_injectable_kwargs def override(catalog): @@ -30,10 +31,10 @@ def inject(injection): @wraps(callback) def decorated(*args, **kwargs): """Decorated with dependency injection callback.""" - for injection in getattr(decorated, '_injections'): - if injection.name not in kwargs: - kwargs[injection.name] = injection.value - return callback(*args, **kwargs) + return callback(*args, + **get_injectable_kwargs(kwargs, + getattr(decorated, + '_injections'))) setattr(decorated, '_injections', (injection,)) diff --git a/objects/providers.py b/objects/providers.py index 7857cd4c..d5076fb2 100644 --- a/objects/providers.py +++ b/objects/providers.py @@ -6,6 +6,7 @@ from .utils import ensure_is_provider from .utils import is_kwarg_injection from .utils import is_attribute_injection from .utils import is_method_injection +from .utils import get_injectable_kwargs from .errors import Error @@ -118,12 +119,9 @@ class Factory(Provider): def _provide(self, *args, **kwargs): """Return provided instance.""" - init_kwargs = dict(((injection.name, injection.value) - for injection in self._kwargs)) - init_kwargs.update(kwargs) - - instance = self._provides(*args, **init_kwargs) - + instance = self._provides(*args, + **get_injectable_kwargs(kwargs, + self._kwargs)) for attribute in self._attributes: setattr(instance, attribute.name, attribute.value) for method in self._methods: diff --git a/objects/utils.py b/objects/utils.py index 392fad96..0c0f35c4 100644 --- a/objects/utils.py +++ b/objects/utils.py @@ -49,3 +49,11 @@ def is_method_injection(instance): """Check if instance is method injection instance.""" return (not isinstance(instance, class_types) and getattr(instance, '__IS_METHOD_INJECTION__', False) is True) + + +def get_injectable_kwargs(kwargs, injections): + """Return dictionary of kwargs, patched with injections.""" + init_kwargs = dict(((injection.name, injection.value) + for injection in injections)) + init_kwargs.update(kwargs) + return init_kwargs