Skip to content

Commit dfba785

Browse files
committed
Merge pull request ivankorobkov#6 from panki/master
Parameter injection, fixed ivankorobkov#3.
2 parents 06058d1 + 561516f commit dfba785

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

src/inject.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ def my_config(binder):
7676

7777
import logging
7878
import threading
79+
from functools import wraps
7980

8081
logger = logging.getLogger('inject')
8182

@@ -126,6 +127,11 @@ def attr(cls):
126127
return _AttributeInjection(cls)
127128

128129

130+
def param(name, cls=None):
131+
"""Return a parameter injection decorator"""
132+
return _ParameterInjection(name, cls)
133+
134+
129135
def get_injector():
130136
"""Return the current injector or None."""
131137
return _INJECTOR
@@ -246,3 +252,19 @@ def __init__(self, cls):
246252

247253
def __get__(self, obj, owner):
248254
return instance(self._cls)
255+
256+
257+
class _ParameterInjection(object):
258+
__slots__ = ('_name', '_cls')
259+
260+
def __init__(self, name, cls=None):
261+
self._name = name
262+
self._cls = cls
263+
264+
def __call__(self, func):
265+
@wraps(func)
266+
def injection_wrapper(*args, **kwargs):
267+
if not self._name in kwargs:
268+
kwargs[self._name] = instance(self._cls or self._name)
269+
return func(*args, **kwargs)
270+
return injection_wrapper

src/test_inject.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,26 @@ class MyClass(object):
146146
assert value0 == 123
147147
assert value1 == 123
148148

149+
def test_param_by_name(self):
150+
@inject.param('val')
151+
def test_func(val=None):
152+
return val
153+
154+
inject.configure(lambda binder: binder.bind('val', 123))
155+
156+
assert test_func() == 123
157+
assert test_func(val=321) == 321
158+
159+
def test_param_by_class(self):
160+
@inject.param('val', int)
161+
def test_func(val):
162+
return val
163+
164+
inject.configure(lambda binder: binder.bind(int, 123))
165+
166+
assert test_func() == 123
167+
168+
149169

150170
class TestFunctional(TestCase):
151171
def tearDown(self):

0 commit comments

Comments
 (0)