From 480253037afe4c12e38a0f98cadd3019a3724254 Mon Sep 17 00:00:00 2001 From: Thiago Bellini Ribeiro Date: Mon, 27 Mar 2023 18:32:44 -0300 Subject: [PATCH] fix: do not use asyncio's timeout lib before 3.11.2 (#2659) There's an issue in asyncio's timeout lib before 3.11.3 that causes async calls to raise `CancelledError`. This is a cpython issue that was fixed in this commit [1] and cherry-picked to previous versions, meaning 3.11.3 will work correctly. Check [2] for more info. [1] https://github.com/python/cpython/commit/04adf2df395ded81922c71360a5d66b597471e49 [2] https://github.com/redis/redis-py/issues/2633 --- redis/asyncio/connection.py | 4 +++- setup.py | 2 +- tests/test_asyncio/test_pubsub.py | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/redis/asyncio/connection.py b/redis/asyncio/connection.py index 057067a83e..58dcd66efb 100644 --- a/redis/asyncio/connection.py +++ b/redis/asyncio/connection.py @@ -25,7 +25,9 @@ ) from urllib.parse import ParseResult, parse_qs, unquote, urlparse -if sys.version_info.major >= 3 and sys.version_info.minor >= 11: +# the functionality is available in 3.11.x but has a major issue before +# 3.11.3. See https://github.com/redis/redis-py/issues/2633 +if sys.version_info >= (3, 11, 3): from asyncio import timeout as async_timeout else: from async_timeout import timeout as async_timeout diff --git a/setup.py b/setup.py index 3003c59420..3b7347da03 100644 --- a/setup.py +++ b/setup.py @@ -34,7 +34,7 @@ install_requires=[ 'importlib-metadata >= 1.0; python_version < "3.8"', 'typing-extensions; python_version<"3.8"', - 'async-timeout>=4.0.2; python_version<"3.11"', + 'async-timeout>=4.0.2; python_version<="3.11.2"', ], classifiers=[ "Development Status :: 5 - Production/Stable", diff --git a/tests/test_asyncio/test_pubsub.py b/tests/test_asyncio/test_pubsub.py index 0df7847e66..8f3817a569 100644 --- a/tests/test_asyncio/test_pubsub.py +++ b/tests/test_asyncio/test_pubsub.py @@ -5,7 +5,9 @@ from typing import Optional from unittest.mock import patch -if sys.version_info.major >= 3 and sys.version_info.minor >= 11: +# the functionality is available in 3.11.x but has a major issue before +# 3.11.3. See https://github.com/redis/redis-py/issues/2633 +if sys.version_info >= (3, 11, 3): from asyncio import timeout as async_timeout else: from async_timeout import timeout as async_timeout