From 23acf01c15d8f69b155693687e059f9161cbf816 Mon Sep 17 00:00:00 2001 From: ZipFile Date: Sun, 23 Feb 2025 18:20:38 +0200 Subject: [PATCH] Add support for inspect.iscoroutinefunction() in Coroutine provider (#830) --- src/dependency_injector/providers.pyx | 22 +++++++++++-------- .../coroutines/test_coroutine_py35.py | 15 +++++++++++++ 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/dependency_injector/providers.pyx b/src/dependency_injector/providers.pyx index 39716ea0..71b048a1 100644 --- a/src/dependency_injector/providers.pyx +++ b/src/dependency_injector/providers.pyx @@ -2,6 +2,7 @@ from __future__ import absolute_import +import asyncio import copy import errno import functools @@ -27,17 +28,19 @@ except ImportError: import __builtin__ as builtins try: - import asyncio + from inspect import _is_coroutine_mark as _is_coroutine_marker except ImportError: - asyncio = None - _is_coroutine_marker = None -else: - if sys.version_info >= (3, 5, 3): - import asyncio.coroutines - _is_coroutine_marker = asyncio.coroutines._is_coroutine - else: + try: + # Python >=3.12.0,<3.12.5 + from inspect import _is_coroutine_marker + except ImportError: _is_coroutine_marker = True +try: + from asyncio.coroutines import _is_coroutine +except ImportError: + _is_coroutine = True + try: import ConfigParser as iniconfigparser except ImportError: @@ -1475,7 +1478,8 @@ cdef class Coroutine(Callable): some_coroutine.add_kwargs(keyword_argument1=3, keyword_argument=4) """ - _is_coroutine = _is_coroutine_marker + _is_coroutine_marker = _is_coroutine_marker # Python >=3.12 + _is_coroutine = _is_coroutine # Python <3.16 def set_provides(self, provides): """Set provider provides.""" diff --git a/tests/unit/providers/coroutines/test_coroutine_py35.py b/tests/unit/providers/coroutines/test_coroutine_py35.py index 22e794b1..de0e9c67 100644 --- a/tests/unit/providers/coroutines/test_coroutine_py35.py +++ b/tests/unit/providers/coroutines/test_coroutine_py35.py @@ -1,4 +1,5 @@ """Coroutine provider tests.""" +import sys from dependency_injector import providers, errors from pytest import mark, raises @@ -208,3 +209,17 @@ def test_repr(): "".format(repr(example), hex(id(provider))) ) + + +@mark.skipif(sys.version_info > (3, 15), reason="requires Python<3.16") +def test_asyncio_iscoroutinefunction() -> None: + from asyncio.coroutines import iscoroutinefunction + + assert iscoroutinefunction(providers.Coroutine(example)) + + +@mark.skipif(sys.version_info < (3, 12), reason="requires Python>=3.12") +def test_inspect_iscoroutinefunction() -> None: + from inspect import iscoroutinefunction + + assert iscoroutinefunction(providers.Coroutine(example))