Skip to content

Commit 0d6fdb5

Browse files
martlafMartin LafranceZipFile
authored
Fix broken wiring of sync inject-decorated methods (#673)
Co-authored-by: Martin Lafrance <[email protected]> Co-authored-by: ZipFile <[email protected]>
1 parent 2330122 commit 0d6fdb5

File tree

3 files changed

+44
-29
lines changed

3 files changed

+44
-29
lines changed

src/dependency_injector/_cwiring.pyx

+22-27
Original file line numberDiff line numberDiff line change
@@ -2,44 +2,39 @@
22

33
import asyncio
44
import collections.abc
5-
import functools
65
import inspect
76
import types
87

9-
from . import providers
10-
from .wiring import _Marker, PatchedCallable
8+
from .wiring import _Marker
119

12-
from .providers cimport Provider
10+
from .providers cimport Provider, Resource
1311

1412

15-
def _get_sync_patched(fn, patched: PatchedCallable):
16-
@functools.wraps(fn)
17-
def _patched(*args, **kwargs):
18-
cdef object result
19-
cdef dict to_inject
20-
cdef object arg_key
21-
cdef Provider provider
13+
def _sync_inject(object fn, tuple args, dict kwargs, dict injections, dict closings, /):
14+
cdef object result
15+
cdef dict to_inject
16+
cdef object arg_key
17+
cdef Provider provider
2218

23-
to_inject = kwargs.copy()
24-
for arg_key, provider in patched.injections.items():
25-
if arg_key not in kwargs or isinstance(kwargs[arg_key], _Marker):
26-
to_inject[arg_key] = provider()
19+
to_inject = kwargs.copy()
20+
for arg_key, provider in injections.items():
21+
if arg_key not in kwargs or isinstance(kwargs[arg_key], _Marker):
22+
to_inject[arg_key] = provider()
2723

28-
result = fn(*args, **to_inject)
24+
result = fn(*args, **to_inject)
2925

30-
if patched.closing:
31-
for arg_key, provider in patched.closing.items():
32-
if arg_key in kwargs and not isinstance(kwargs[arg_key], _Marker):
33-
continue
34-
if not isinstance(provider, providers.Resource):
35-
continue
36-
provider.shutdown()
26+
if closings:
27+
for arg_key, provider in closings.items():
28+
if arg_key in kwargs and not isinstance(kwargs[arg_key], _Marker):
29+
continue
30+
if not isinstance(provider, Resource):
31+
continue
32+
provider.shutdown()
3733

38-
return result
39-
return _patched
34+
return result
4035

4136

42-
async def _async_inject(object fn, tuple args, dict kwargs, dict injections, dict closings):
37+
async def _async_inject(object fn, tuple args, dict kwargs, dict injections, dict closings, /):
4338
cdef object result
4439
cdef dict to_inject
4540
cdef list to_inject_await = []
@@ -69,7 +64,7 @@ async def _async_inject(object fn, tuple args, dict kwargs, dict injections, dic
6964
for arg_key, provider in closings.items():
7065
if arg_key in kwargs and isinstance(kwargs[arg_key], _Marker):
7166
continue
72-
if not isinstance(provider, providers.Resource):
67+
if not isinstance(provider, Resource):
7368
continue
7469
shutdown = provider.shutdown()
7570
if _isawaitable(shutdown):

src/dependency_injector/wiring.py

+15-2
Original file line numberDiff line numberDiff line change
@@ -1030,7 +1030,7 @@ def is_loader_installed() -> bool:
10301030
_loader = AutoLoader()
10311031

10321032
# Optimizations
1033-
from ._cwiring import _get_sync_patched # noqa
1033+
from ._cwiring import _sync_inject # noqa
10341034
from ._cwiring import _async_inject # noqa
10351035

10361036

@@ -1047,4 +1047,17 @@ async def _patched(*args, **kwargs):
10471047
patched.closing,
10481048
)
10491049

1050-
return _patched
1050+
return cast(F, _patched)
1051+
1052+
1053+
def _get_sync_patched(fn: F, patched: PatchedCallable) -> F:
1054+
@functools.wraps(fn)
1055+
def _patched(*args, **kwargs):
1056+
return _sync_inject(
1057+
fn,
1058+
args,
1059+
kwargs,
1060+
patched.injections,
1061+
patched.closing,
1062+
)
1063+
return cast(F, _patched)

tests/unit/wiring/test_introspection_py36.py

+7
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@
66
from dependency_injector.wiring import inject
77

88

9+
def test_isfunction():
10+
@inject
11+
def foo(): ...
12+
13+
assert inspect.isfunction(foo)
14+
15+
916
def test_asyncio_iscoroutinefunction():
1017
@inject
1118
async def foo():

0 commit comments

Comments
 (0)