From 794a6940474529657f847808f31788911244563d Mon Sep 17 00:00:00 2001 From: han-guangyu Date: Fri, 26 Apr 2024 15:00:29 +0800 Subject: [PATCH] Add Python 3.10 partial support patch for OpenStack Wallaby --- 0001-Python-3.10-partial-support.patch | 115 +++++++++++++++++++++++++ python-eventlet.spec | 6 +- 2 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 0001-Python-3.10-partial-support.patch diff --git a/0001-Python-3.10-partial-support.patch b/0001-Python-3.10-partial-support.patch new file mode 100644 index 0000000..dcb52d4 --- /dev/null +++ b/0001-Python-3.10-partial-support.patch @@ -0,0 +1,115 @@ +From 15d3c2477510229e1b49c60fccfde5ffe94b2a76 Mon Sep 17 00:00:00 2001 +From: Tim Burke +Date: Fri, 8 Oct 2021 03:18:04 -0700 +Subject: [PATCH] Python 3.10 partial support + +Everything below is specific to changes in Python 3.10. +https://github.com/eventlet/eventlet/pull/715 + +- Only wrap socket.timeout on Python < 3.10 + socket.timeout is TimeoutError, which our is_timeout() helper func already knows. + fixes https://github.com/eventlet/eventlet/issues/687 +- Working greenio._open + _pyio.open is now a staticmethod, so we've got to go down to + _pyio.open.__wrapped__ to get to the python function object. +- Test using eventlet.is_timeout rather than requiring an is_timeout attribute on errors. + TimeoutErrors (which are covered by is_timeout) can't necessarily have attributes added to them. +- Fix backdoor tests + Skip build info line at interpreter startup. Also, start printing the banner as we read it to aid in future debugging. +- Tolerate __builtins__ being a dict (rather than module) in is_timeout + (@tipabu) still not sure how this happens, but somehow it does in socket_test.test_error_is_timeout. +--- + eventlet/greenio/base.py | 5 ++++- + eventlet/greenio/py3.py | 5 ++++- + eventlet/timeout.py | 9 +++++++-- + tests/__init__.py | 2 +- + tests/backdoor_test.py | 5 ++++- + 5 files changed, 20 insertions(+), 6 deletions(-) + +diff --git a/eventlet/greenio/base.py b/eventlet/greenio/base.py +index 2eed86966b..51a7ae13ef 100644 +--- a/eventlet/greenio/base.py ++++ b/eventlet/greenio/base.py +@@ -29,7 +29,10 @@ + _original_socket = eventlet.patcher.original('socket').socket + + +-socket_timeout = eventlet.timeout.wrap_is_timeout(socket.timeout) ++if sys.version_info >= (3, 10): ++ socket_timeout = socket.timeout # Really, TimeoutError ++else: ++ socket_timeout = eventlet.timeout.wrap_is_timeout(socket.timeout) + + + def socket_connect(descriptor, address): +diff --git a/eventlet/greenio/py3.py b/eventlet/greenio/py3.py +index 7a75b52c03..bc3dc94999 100644 +--- a/eventlet/greenio/py3.py ++++ b/eventlet/greenio/py3.py +@@ -191,9 +191,12 @@ def __exit__(self, *args): + FileIO=GreenFileIO, + os=_original_os, + )) ++if hasattr(_original_pyio, 'text_encoding'): ++ _open_environment['text_encoding'] = _original_pyio.text_encoding + ++_pyio_open = getattr(_original_pyio.open, '__wrapped__', _original_pyio.open) + _open = FunctionType( +- six.get_function_code(_original_pyio.open), ++ six.get_function_code(_pyio_open), + _open_environment, + ) + +diff --git a/eventlet/timeout.py b/eventlet/timeout.py +index 6e1e08f63f..4ab893eef6 100644 +--- a/eventlet/timeout.py ++++ b/eventlet/timeout.py +@@ -174,6 +174,11 @@ def fun(*args, **kwargs): + return fun + + ++if isinstance(__builtins__, dict): # seen when running tests on py310, but HOW?? ++ _timeout_err = __builtins__.get('TimeoutError', Timeout) ++else: ++ _timeout_err = getattr(__builtins__, 'TimeoutError', Timeout) ++ ++ + def is_timeout(obj): +- py3err = getattr(__builtins__, 'TimeoutError', Timeout) +- return bool(getattr(obj, 'is_timeout', False)) or isinstance(obj, py3err) ++ return bool(getattr(obj, 'is_timeout', False)) or isinstance(obj, _timeout_err) +diff --git a/tests/__init__.py b/tests/__init__.py +index c0b64fd9e7..1883667748 100644 +--- a/tests/__init__.py ++++ b/tests/__init__.py +@@ -383,7 +383,7 @@ def run_isolated(path, prefix='tests/isolated/', **kwargs): + + def check_is_timeout(obj): + value_text = getattr(obj, 'is_timeout', '(missing)') +- assert obj.is_timeout, 'type={0} str={1} .is_timeout={2}'.format(type(obj), str(obj), value_text) ++ assert eventlet.is_timeout(obj), 'type={0} str={1} .is_timeout={2}'.format(type(obj), str(obj), value_text) + + + @contextlib.contextmanager +diff --git a/tests/backdoor_test.py b/tests/backdoor_test.py +index 03a569259c..1e09f09b60 100644 +--- a/tests/backdoor_test.py ++++ b/tests/backdoor_test.py +@@ -1,5 +1,6 @@ + import os + import os.path ++import sys + + import eventlet + +@@ -22,7 +23,9 @@ def test_server(self): + def _run_test_on_client_and_server(self, client, server_thread): + f = client.makefile('rw') + assert 'Python' in f.readline() +- f.readline() # build info ++ if sys.version_info < (3, 10): ++ # Starting in py310, build info is included in version line ++ f.readline() # build info + f.readline() # help info + assert 'InteractiveConsole' in f.readline() + self.assertEqual('>>> ', f.read(4)) diff --git a/python-eventlet.spec b/python-eventlet.spec index cb58129..1df6af0 100644 --- a/python-eventlet.spec +++ b/python-eventlet.spec @@ -1,11 +1,12 @@ %global _empty_manifest_terminate_build 0 Name: python-eventlet Version: 0.30.2 -Release: 1 +Release: 2 Summary: Highly concurrent networking library License: MIT License URL: http://eventlet.net Source0: https://files.pythonhosted.org/packages/23/db/8ff5a9dec5ff016d5836254b676d507c2180d8838d7e545277d938896913/eventlet-0.30.2.tar.gz +Patch0: 0001-Python-3.10-partial-support.patch BuildArch: noarch %description @@ -83,6 +84,9 @@ mv %{buildroot}/doclist.lst . %{_docdir}/* %changelog +* Fri Apr 26 2024 Han Guangyu - 0.30.2-2 +- Add Python 3.10 partial support patch + * Mon Jul 26 2021 OpenStack_SIG - 0.30.2-1 - update to 0.30.2 -- Gitee