diff --git a/5188.patch b/5188.patch new file mode 100644 index 0000000..53d9927 --- /dev/null +++ b/5188.patch @@ -0,0 +1,217 @@ +From cafb5394bcca2772383437c6adfe1cbf40fbcca0 Mon Sep 17 00:00:00 2001 +From: da-woods +Date: Sat, 31 Dec 2022 11:24:01 +0000 +Subject: [PATCH 1/2] Avoid using asyncio.get_event_loop + +The behaviour of creating a new event loop if one doesn't +already exist was removed in Python 3.12 alpha and was allegedly +deprecated before then. + +Fixes #5183 +--- + tests/run/asyncio_generators.srctree | 37 ++++++++++++++---------- + tests/run/py35_asyncio_async_def.srctree | 2 +- + 2 files changed, 22 insertions(+), 17 deletions(-) + +diff --git a/tests/run/asyncio_generators.srctree b/tests/run/asyncio_generators.srctree +index d49b777f41..da8c39fa7d 100644 +--- a/tests/run/asyncio_generators.srctree ++++ b/tests/run/asyncio_generators.srctree +@@ -24,11 +24,12 @@ setup( + + import from_asyncio_import + import asyncio ++from contextlib import closing + + def runloop(task): +- loop = asyncio.get_event_loop() +- result = loop.run_until_complete(task()) +- assert 3 == result, result ++ with closing(asyncio.new_event_loop()) as loop: ++ result = loop.run_until_complete(task()) ++ assert 3 == result, result + + import sys + if sys.version_info < (3, 7): +@@ -39,11 +40,12 @@ if sys.version_info < (3, 7): + + import import_asyncio + import asyncio ++from contextlib import closing + + def runloop(task): +- loop = asyncio.get_event_loop() +- result = loop.run_until_complete(task()) +- assert 3 == result, result ++ with closing(asyncio.new_event_loop()) as loop: ++ result = loop.run_until_complete(task()) ++ assert 3 == result, result + + import sys + if sys.version_info < (3, 7): +@@ -59,11 +61,12 @@ ASYNCIO_SUPPORTS_COROUTINE = sys.version_info[:2] >= (3, 5) + if ASYNCIO_SUPPORTS_COROUTINE: + import async_def + import asyncio ++ from contextlib import closing + + def runloop(task): +- loop = asyncio.get_event_loop() +- result = loop.run_until_complete(task()) +- assert 3 == result, result ++ with closing(asyncio.new_event_loop()) as loop: ++ result = loop.run_until_complete(task()) ++ assert 3 == result, result + + runloop(async_def.wait3) + +@@ -77,12 +80,13 @@ ASYNCIO_SUPPORTS_COROUTINE = sys.version_info[:2] >= (3, 5) + if ASYNCIO_SUPPORTS_COROUTINE: + from async_def_future import await_future + import asyncio ++ from contextlib import closing + + def runloop(): +- loop = asyncio.get_event_loop() +- task, events, expected = await_future(loop) +- result = loop.run_until_complete(task()) +- assert events == expected, 'expected %s, got %s' % (expected, events) ++ with closing(asyncio.new_event_loop()) as loop: ++ task, events, expected = await_future(loop) ++ result = loop.run_until_complete(task()) ++ assert events == expected, 'expected %s, got %s' % (expected, events) + + runloop() + +@@ -91,14 +95,15 @@ if ASYNCIO_SUPPORTS_COROUTINE: + + import sys + import asyncio ++from contextlib import closing + + ASYNCIO_SUPPORTS_COROUTINE = sys.version_info[:2] >= (3, 5) + ASYNCIO_SUPPORTS_YIELD_FROM = sys.version_info[:2] < (3, 7) + + def runloop(task): +- loop = asyncio.get_event_loop() +- result = loop.run_until_complete(task()) +- assert 3 == result, result ++ with closing(asyncio.new_event_loop()) as loop: ++ result = loop.run_until_complete(task()) ++ assert 3 == result, result + + import import_asyncio + if ASYNCIO_SUPPORTS_YIELD_FROM: +diff --git a/tests/run/py35_asyncio_async_def.srctree b/tests/run/py35_asyncio_async_def.srctree +index 9da5560b30..457ef9dae6 100644 +--- a/tests/run/py35_asyncio_async_def.srctree ++++ b/tests/run/py35_asyncio_async_def.srctree +@@ -24,7 +24,7 @@ from contextlib import closing + async def main(): + await cy_test.say() + +-with closing(asyncio.get_event_loop()) as loop: ++with closing(asyncio.new_event_loop()) as loop: + print("Running Python coroutine ...") + loop.run_until_complete(main()) + + +From 8afcb52df651b26f3f95ab0ad5330d396e3c402f Mon Sep 17 00:00:00 2001 +From: da-woods +Date: Sun, 1 Jan 2023 09:51:34 +0000 +Subject: [PATCH 2/2] Fix on Py 3.4 + +--- + tests/run/asyncio_generators.srctree | 27 ++++++++++++++++++--------- + 1 file changed, 18 insertions(+), 9 deletions(-) + +diff --git a/tests/run/asyncio_generators.srctree b/tests/run/asyncio_generators.srctree +index da8c39fa7d..2a01a065bc 100644 +--- a/tests/run/asyncio_generators.srctree ++++ b/tests/run/asyncio_generators.srctree +@@ -24,14 +24,15 @@ setup( + + import from_asyncio_import + import asyncio ++import sys + from contextlib import closing ++new_event_loop = asyncio.new_event_loop if sys.version_info >= (3, 5) else asyncio.get_event_loop + + def runloop(task): +- with closing(asyncio.new_event_loop()) as loop: ++ with closing(new_event_loop()) as loop: + result = loop.run_until_complete(task()) + assert 3 == result, result + +-import sys + if sys.version_info < (3, 7): + runloop(from_asyncio_import.wait3) + +@@ -40,14 +41,15 @@ if sys.version_info < (3, 7): + + import import_asyncio + import asyncio ++import sys + from contextlib import closing ++new_event_loop = asyncio.new_event_loop if sys.version_info >= (3, 5) else asyncio.get_event_loop + + def runloop(task): +- with closing(asyncio.new_event_loop()) as loop: ++ with closing(new_event_loop()) as loop: + result = loop.run_until_complete(task()) + assert 3 == result, result + +-import sys + if sys.version_info < (3, 7): + runloop(import_asyncio.wait3) + +@@ -95,13 +97,20 @@ if ASYNCIO_SUPPORTS_COROUTINE: + + import sys + import asyncio +-from contextlib import closing ++from contextlib import closing, contextmanager ++new_event_loop = asyncio.new_event_loop if sys.version_info >= (3, 5) else asyncio.get_event_loop ++if sys.version_info < (3, 5): ++ # don't close loop on Py 3.4 ++ @contextmanager ++ def closing(o): ++ yield o ++ + + ASYNCIO_SUPPORTS_COROUTINE = sys.version_info[:2] >= (3, 5) + ASYNCIO_SUPPORTS_YIELD_FROM = sys.version_info[:2] < (3, 7) + + def runloop(task): +- with closing(asyncio.new_event_loop()) as loop: ++ with closing(new_event_loop()) as loop: + result = loop.run_until_complete(task()) + assert 3 == result, result + +@@ -135,7 +144,7 @@ except ImportError: + try: + from collections import Generator + except ImportError: +- assert sys.version_info < (3,5), "Python 3.5+ should have collections.abc.Generator" ++ assert sys.version_info < (3, 5), "Python 3.5+ should have collections.abc.Generator" + Generator = object # easy win :) + + assert isinstance(from_asyncio_import.wait3(), Generator) +@@ -148,7 +157,7 @@ except ImportError: + try: + from collections import Awaitable + except ImportError: +- assert sys.version_info < (3,5), "Python 3.5+ should have collections.abc.Awaitable" ++ assert sys.version_info < (3, 5), "Python 3.5+ should have collections.abc.Awaitable" + Awaitable = object # easy win :) + + assert isinstance(async_def.wait3(), Awaitable) +@@ -159,7 +168,7 @@ except ImportError: + try: + from collections import Coroutine + except ImportError: +- assert sys.version_info < (3,5), "Python 3.5+ should have collections.abc.Coroutine" ++ assert sys.version_info < (3, 5), "Python 3.5+ should have collections.abc.Coroutine" + Coroutine = object # easy win :) + + assert isinstance(async_def.wait3(), Coroutine) diff --git a/Adapt-PEP-623-support-to-latest-Py3.12-which-removes.patch b/Adapt-PEP-623-support-to-latest-Py3.12-which-removes.patch new file mode 100644 index 0000000..7ec9fa7 --- /dev/null +++ b/Adapt-PEP-623-support-to-latest-Py3.12-which-removes.patch @@ -0,0 +1,61 @@ +From 6911945f2284a84e6021651df716474f97bfe100 Mon Sep 17 00:00:00 2001 +From: Stefan Behnel +Date: Wed, 18 Jan 2023 16:03:09 +0100 +Subject: [PATCH] Adapt PEP-623 support to latest Py3.12 which removes the + wstr field in PyUnicode but kept the PyUnicode_*() macros around. + +--- + Cython/Utility/ModuleSetupCode.c | 28 ++++++++++++++-------------- + 1 file changed, 14 insertions(+), 14 deletions(-) + +diff --git a/Cython/Utility/ModuleSetupCode.c b/Cython/Utility/ModuleSetupCode.c +index f8bf885..ca9c00f 100644 +--- a/Cython/Utility/ModuleSetupCode.c ++++ b/Cython/Utility/ModuleSetupCode.c +@@ -664,12 +664,12 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + +- #if defined(PyUnicode_IS_READY) +- #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ? \ +- 0 : _PyUnicode_Ready((PyObject *)(op))) ++ #if PY_VERSION_HEX >= 0x030C0000 ++ // Py3.12 / PEP-623 removed wstr type unicode strings and all of the PyUnicode_READY() machinery. ++ #define __Pyx_PyUnicode_READY(op) (0) + #else +- // Py3.12 / PEP-623 will remove wstr type unicode strings and all of the PyUnicode_READY() machinery. +- #define __Pyx_PyUnicode_READY(op) (0) ++ #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ? \ ++ 0 : _PyUnicode_Ready((PyObject *)(op))) + #endif + + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) +@@ -679,16 +679,16 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) +- #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE) +- #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 +- // Avoid calling deprecated C-API functions in Py3.9+ that PEP-623 schedules for removal in Py3.12. +- // https://www.python.org/dev/peps/pep-0623/ +- #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) +- #else +- #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) +- #endif ++ #if PY_VERSION_HEX >= 0x030C0000 ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) + #else +- #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) ++ #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 ++ // Avoid calling deprecated C-API functions in Py3.9+ that PEP-623 schedules for removal in Py3.12. ++ // https://www.python.org/dev/peps/pep-0623/ ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) ++ #else ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) ++ #endif + #endif + #else + #define CYTHON_PEP393_ENABLED 0 +-- +2.38.1 + diff --git a/Cython.spec b/Cython.spec index 7af3349..efa4ef0 100644 --- a/Cython.spec +++ b/Cython.spec @@ -6,7 +6,7 @@ Name: Cython Version: 0.29.33 -Release: 1%{?dist} +Release: 2%{?dist} Summary: Language for writing Python extension modules License: Apache-2.0 @@ -18,6 +18,16 @@ Source: https://github.com/cython/cython/archive/%{version}/Cython-%{ver # Fixes https://bugzilla.redhat.com/2155090 Patch: emacs-docstring-wrap.patch +# Adapt PEP-623 support to latest Py3.12 which removes the wstr +# field in PyUnicode but kept the PyUnicode_*() macros around. +# https://github.com/cython/cython/commit/b4595a04a78b79dc59276a9f64aab7b884e945e8 +Patch: Adapt-PEP-623-support-to-latest-Py3.12-which-removes.patch + +# Avoid using asyncio.get_event_loop. +# The behaviour of creating a new event loop if one doesn't +# already exist was removed in Python 3.12 +Patch: https://github.com/cython/cython/pull/5188.patch + BuildRequires: python3-devel BuildRequires: python3-setuptools @@ -133,6 +143,12 @@ cp -p cython-mode-init.el cython-mode-init.elc %{buildroot}%{_emacs_sitestartdir %changelog +* Wed Jan 18 2023 Tomáš Hrnčiar - 0.29.33-2 +- Adapt Cython for removed wstr type unicode strings in Python 3.12 +- Avoid using asyncio.get_event_loop. +- Fixes: rhbz#2155702 +- Fixes: rhbz#2155496 + * Fri Feb 17 2023 Miro Hrončok - 0.29.33-1 - Update to 0.29.33 - Fix test failures with NumPy 1.24