• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

ets-labs / python-dependency-injector / 12622491794

05 Jan 2025 07:53PM UTC coverage: 93.745% (+0.03%) from 93.719%
12622491794

Pull #846

github

rmk135
Remove unused imports from the starlette extension
Pull Request #846: Fix flake8 in te starlette extension

3357 of 3581 relevant lines covered (93.74%)

0.94 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

92.98
/src/dependency_injector/_cwiring.pyx
1
"""Wiring optimizations module."""
1✔
2

3
import asyncio
1✔
4
import collections.abc
1✔
5
import functools
1✔
6
import inspect
1✔
7
import types
1✔
8

9
from . import providers
1✔
10
from .wiring import _Marker, PatchedCallable
1✔
11

12
from .providers cimport Provider
13

14

15
def _get_sync_patched(fn, patched: PatchedCallable):
1✔
16
    @functools.wraps(fn)
1✔
17
    def _patched(*args, **kwargs):
18
        cdef object result
19
        cdef dict to_inject
20
        cdef object arg_key
21
        cdef Provider provider
22

23
        to_inject = kwargs.copy()
1✔
24
        for arg_key, provider in patched.injections.items():
1✔
25
            if arg_key not in kwargs or isinstance(kwargs[arg_key], _Marker):
1✔
26
                to_inject[arg_key] = provider()
1✔
27

28
        result = fn(*args, **to_inject)
1✔
29

30
        if patched.closing:
1✔
31
            for arg_key, provider in patched.closing.items():
1✔
32
                if arg_key in kwargs and not isinstance(kwargs[arg_key], _Marker):
1✔
33
                    continue
1✔
34
                if not isinstance(provider, providers.Resource):
1✔
35
                    continue
1✔
36
                provider.shutdown()
1✔
37

38
        return result
1✔
39
    return _patched
1✔
40

41

42
async def _async_inject(object fn, tuple args, dict kwargs, dict injections, dict closings):
1✔
43
    cdef object result
44
    cdef dict to_inject
45
    cdef list to_inject_await = []
1✔
46
    cdef list to_close_await = []
1✔
47
    cdef object arg_key
48
    cdef Provider provider
49

50
    to_inject = kwargs.copy()
1✔
51
    for arg_key, provider in injections.items():
1✔
52
        if arg_key not in kwargs or isinstance(kwargs[arg_key], _Marker):
1✔
53
            provide = provider()
1✔
54
            if provider.is_async_mode_enabled():
1✔
55
                to_inject_await.append((arg_key, provide))
1✔
56
            elif _isawaitable(provide):
1✔
57
                to_inject_await.append((arg_key, provide))
×
58
            else:
59
                to_inject[arg_key] = provide
1✔
60

61
    if to_inject_await:
1✔
62
        async_to_inject = await asyncio.gather(*(provide for _, provide in to_inject_await))
1✔
63
        for provide, (injection, _) in zip(async_to_inject, to_inject_await):
1✔
64
            to_inject[injection] = provide
1✔
65

66
    result = await fn(*args, **to_inject)
1✔
67

68
    if closings:
1✔
69
        for arg_key, provider in closings.items():
1✔
70
            if arg_key in kwargs and isinstance(kwargs[arg_key], _Marker):
1✔
71
                continue
×
72
            if not isinstance(provider, providers.Resource):
1✔
73
                continue
×
74
            shutdown = provider.shutdown()
1✔
75
            if _isawaitable(shutdown):
1✔
76
                to_close_await.append(shutdown)
1✔
77

78
        await asyncio.gather(*to_close_await)
1✔
79

80
    return result
1✔
81

82

83
cdef bint _isawaitable(object instance):
1✔
84
    """Return true if object can be passed to an ``await`` expression."""
85
    return (isinstance(instance, types.CoroutineType) or
1✔
86
            isinstance(instance, types.GeneratorType) and
1✔
87
            bool(instance.gi_code.co_flags & inspect.CO_ITERABLE_COROUTINE) or
×
88
            isinstance(instance, collections.abc.Awaitable))
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc