python-dependency-injector/dependency_injector/injections.py

80 lines
1.8 KiB
Python
Raw Normal View History

2015-03-09 01:01:39 +03:00
"""Injections module."""
2015-01-10 12:24:25 +03:00
import six
from .utils import is_provider
from .utils import ensure_is_injection
from .utils import get_injectable_kwargs
2015-01-10 12:24:25 +03:00
class Injection(object):
2015-03-09 01:01:39 +03:00
"""Base injection class."""
2015-01-10 12:24:25 +03:00
2015-07-22 10:53:16 +03:00
__IS_INJECTION__ = True
__slots__ = ('name', 'injectable')
def __init__(self, name, injectable):
2015-03-09 01:01:39 +03:00
"""Initializer."""
2015-01-10 12:24:25 +03:00
self.name = name
self.injectable = injectable
2015-01-11 16:03:45 +03:00
@property
def value(self):
2015-03-09 01:01:39 +03:00
"""Return injectable value."""
if is_provider(self.injectable):
2015-01-11 16:03:45 +03:00
return self.injectable()
return self.injectable
2015-01-10 12:24:25 +03:00
class KwArg(Injection):
2015-03-09 01:01:39 +03:00
"""Keyword argument injection."""
2015-01-10 12:24:25 +03:00
2015-07-22 10:53:16 +03:00
__IS_KWARG_INJECTION__ = True
2015-01-10 12:24:25 +03:00
class Attribute(Injection):
2015-03-09 01:01:39 +03:00
"""Attribute injection."""
2015-01-10 12:24:25 +03:00
2015-07-22 10:53:16 +03:00
__IS_ATTRIBUTE_INJECTION__ = True
2015-01-10 12:24:25 +03:00
class Method(Injection):
2015-03-09 01:01:39 +03:00
"""Method injection."""
2015-07-22 10:53:16 +03:00
__IS_METHOD_INJECTION__ = True
def inject(*args, **kwargs):
"""Dependency injection decorator.
:type injection: Injection
:return: (callable) -> (callable)
"""
injections = tuple((KwArg(name, value)
for name, value in six.iteritems(kwargs)))
if args:
injections += tuple((ensure_is_injection(injection)
for injection in args))
def decorator(callback):
"""Dependency injection decorator."""
if hasattr(callback, '_injections'):
callback._injections += injections
return callback
@six.wraps(callback)
def decorated(*args, **kwargs):
"""Decorated with dependency injection callback."""
return callback(*args,
**get_injectable_kwargs(kwargs,
decorated._injections))
decorated._injections = injections
return decorated
return decorator