diff --git a/.github/workflows/ci-linux-incremental.yml b/.github/workflows/ci-linux-incremental.yml index 82b14472c55..4b2ac0900b0 100644 --- a/.github/workflows/ci-linux-incremental.yml +++ b/.github/workflows/ci-linux-incremental.yml @@ -92,6 +92,7 @@ jobs: "debian-bookworm", "fedora-30", "fedora-38", + "fedora-39", "gentoo-python3.11", "debian-bullseye-i386"] tox_packages_factors: >- diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index ccc2b07a02f..96a410253e0 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -29,6 +29,7 @@ on: "debian-bullseye", "debian-bookworm", "debian-trixie", + "debian-trixie-python3.12", "debian-sid", "linuxmint-20.1", "linuxmint-20.2", @@ -46,6 +47,7 @@ on: "fedora-36", "fedora-37", "fedora-38", + "fedora-38-python3.12", "fedora-39", "fedora-40", "centos-7-devtoolset-gcc_11", @@ -59,8 +61,10 @@ on: "archlinux-latest", "opensuse-15.5-gcc_11-python3.11", "opensuse-tumbleweed-python3.10", - "opensuse-tumbleweed", + "opensuse-tumbleweed-python3.11", + "opensuse-tumbleweed-python3.12", "conda-forge-python3.11", + "conda-forge", "ubuntu-bionic-gcc_8-i386", "debian-bullseye-i386", ] diff --git a/.gitignore b/.gitignore index 43f58abcafe..0f180bb1bcb 100644 --- a/.gitignore +++ b/.gitignore @@ -193,6 +193,7 @@ build/bin/sage-build-env-config /pkgs/*/*.egg-info /pkgs/*/.tox +/pkgs/sage-conf/pyproject.toml /pkgs/sage-conf_pypi/sage_root/config.log /pkgs/sage-conf_pypi/sage_root/config.status /pkgs/sage-conf_pypi/sage_root/local/ diff --git a/build/pkgs/python3/SPKG.rst b/build/pkgs/python3/SPKG.rst index 55757b972e6..b102c79fbbb 100644 --- a/build/pkgs/python3/SPKG.rst +++ b/build/pkgs/python3/SPKG.rst @@ -15,6 +15,9 @@ You can also use ``--with-python=/path/to/python3_binary`` to tell Sage to use a number of Python modules to be available within the Python in question. Currently, as of Sage 10.3, these modules are as follows: ``sqlite3``, ``ctypes``, ``math``, ``hashlib``, ``socket``, ``zlib``, ``ssl``, ``ensurepip``. +For Python >= 3.12, also ``setuptools`` is required; for older Python versions, +``distutils.core`` is required. These modules will be checked for by the ``configure`` +script. Use the ``configure`` option ``--without-system-python3`` if you want Python 3 built from scratch. diff --git a/build/pkgs/python3/checksums.ini b/build/pkgs/python3/checksums.ini index f2727eaf401..8cf886464c1 100644 --- a/build/pkgs/python3/checksums.ini +++ b/build/pkgs/python3/checksums.ini @@ -1,5 +1,5 @@ tarball=Python-VERSION.tar.xz -sha1=89ee31611b73dc0c32c178d15aa208734b462c5a -md5=4efe92adf28875c77d3b9b2e8d3bc44a -cksum=2916176597 +sha1=040eac171c17062253042f7faafea830b03bf07b +md5=e7c178b97bf8f7ccd677b94d614f7b3c +cksum=271323389 upstream_url=https://www.python.org/ftp/python/VERSION/Python-VERSION.tar.xz diff --git a/build/pkgs/python3/distros/fedora.txt b/build/pkgs/python3/distros/fedora.txt index ba7b5ea9b21..ab50f2d9b07 100644 --- a/build/pkgs/python3/distros/fedora.txt +++ b/build/pkgs/python3/distros/fedora.txt @@ -1,2 +1,2 @@ python3-devel -python-setuptools +python3-setuptools diff --git a/build/pkgs/python3/package-version.txt b/build/pkgs/python3/package-version.txt index 371cfe355dd..8531a3b7ee7 100644 --- a/build/pkgs/python3/package-version.txt +++ b/build/pkgs/python3/package-version.txt @@ -1 +1 @@ -3.11.1 +3.12.2 diff --git a/build/pkgs/python3/patches/0001-bpo-22699-Allow-compiling-on-debian-ubuntu-with-a-di.patch b/build/pkgs/python3/patches/0001-bpo-22699-Allow-compiling-on-debian-ubuntu-with-a-di.patch deleted file mode 100644 index ec3d84c8499..00000000000 --- a/build/pkgs/python3/patches/0001-bpo-22699-Allow-compiling-on-debian-ubuntu-with-a-di.patch +++ /dev/null @@ -1,64 +0,0 @@ -From aef4a7749dec9ecf942647af39d7a1303c758131 Mon Sep 17 00:00:00 2001 -From: Isuru Fernando -Date: Thu, 16 Sep 2021 15:46:09 -0500 -Subject: [PATCH 08/24] bpo-22699: Allow compiling on debian/ubuntu with a - different compiler - -This PR fixes one issue mentioned in the bpo -https://bugs.python.org/issue22699#msg364685 with a slightly better -patch than given ---- - setup.py | 19 ++++++++++++++++++- - 1 file changed, 18 insertions(+), 1 deletion(-) - -diff --git a/setup.py b/setup.py -index 554699608d..d5bbeb90d5 100644 ---- a/setup.py -+++ b/setup.py -@@ -667,9 +667,30 @@ def check_extension_import(self, ext): - def add_multiarch_paths(self): - # Debian/Ubuntu multiarch support. - # https://wiki.ubuntu.com/MultiarchSpec -- tmpfile = os.path.join(self.build_temp, 'multiarch') - if not os.path.exists(self.build_temp): - os.makedirs(self.build_temp) -+ -+ tmpfile_sysroot = os.path.join(self.build_temp, 'sysroot') -+ ret_sysroot = run_command( -+ '%s -print-sysroot > %s 2> /dev/null' % (CC, tmpfile_sysroot)) -+ -+ try: -+ if ret_sysroot == 0: -+ with open(tmpfile_sysroot) as fp: -+ sysroot = fp.readline().strip() -+ # if the sysroot is not /, then we are not using -+ # the compiler from debian/ubuntu -+ if sysroot not in ['', '/']: -+ add_dir_to_list(self.compiler.library_dirs, -+ sysroot + '/usr/lib/') -+ add_dir_to_list(self.compiler.include_dirs, -+ sysroot + '/usr/include/') -+ return -+ finally: -+ os.unlink(tmpfile_sysroot) -+ -+ tmpfile = os.path.join(self.build_temp, 'multiarch') -+ - ret = run_command( - '%s -print-multiarch > %s 2> /dev/null' % (CC, tmpfile)) - multiarch_path_component = '' ---- a/setup.py 2021-09-28 23:49:53.193868987 -0700 -+++ b/setup.py 2021-09-28 23:50:13.554098642 -0700 -@@ -738,7 +738,8 @@ - for env_var, arg_name, dir_list in ( - ('LDFLAGS', '-R', self.compiler.runtime_library_dirs), - ('LDFLAGS', '-L', self.compiler.library_dirs), -- ('CPPFLAGS', '-I', self.compiler.include_dirs)): -+ ('CPPFLAGS', '-I', self.compiler.include_dirs), -+ ('CPPFLAGS', '-isystem', self.compiler.include_dirs)): - env_val = sysconfig.get_config_var(env_var) - if env_val: - parser = argparse.ArgumentParser() --- -2.30.2 - diff --git a/build/pkgs/python3/patches/2.7.3-dylib.patch b/build/pkgs/python3/patches/2.7.3-dylib.patch deleted file mode 100644 index be0de05d388..00000000000 --- a/build/pkgs/python3/patches/2.7.3-dylib.patch +++ /dev/null @@ -1,15 +0,0 @@ -This patch provides a workaround to one long-standing problem with building -extension modules on Cygwin; see https://bugs.python.org/issue2445 for more -background. -diff --git a/Lib/distutils/unixccompiler.py.orig b/Lib/distutils/unixccompiler.py -index 3f321c2..fb5a8fc 100644 ---- a/Lib/distutils/unixccompiler.py -+++ b/Lib/distutils/unixccompiler.py -@@ -81,6 +81,7 @@ class UnixCCompiler(CCompiler): - xcode_stub_lib_format = dylib_lib_format - if sys.platform == "cygwin": - exe_extension = ".exe" -+ dylib_lib_extension = ".dll.a" - - def preprocess(self, source, output_file=None, macros=None, - include_dirs=None, extra_preargs=None, extra_postargs=None): diff --git a/build/pkgs/python3/patches/3.2.6-no-enable-new-dtags.patch b/build/pkgs/python3/patches/3.2.6-no-enable-new-dtags.patch deleted file mode 100644 index ea9b7cecd03..00000000000 --- a/build/pkgs/python3/patches/3.2.6-no-enable-new-dtags.patch +++ /dev/null @@ -1,22 +0,0 @@ -The --enable-new-dtags linker flag should not be used when building non-ELF -binaries. This is related to http://bugs.python.org/issue17362 -diff --git a/Lib/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py -index 69045f8..7ed0a5f 100644 ---- a/Lib/distutils/unixccompiler.py -+++ b/Lib/distutils/unixccompiler.py -@@ -243,9 +243,13 @@ class UnixCCompiler(CCompiler): - # -Wl whenever gcc was used in the past it is probably - # safest to keep doing so. - if sysconfig.get_config_var("GNULD") == "yes": -- # GNU ld needs an extra option to get a RUNPATH -+ # GNU ELF ld needs an extra option to get a RUNPATH - # instead of just an RPATH. -- return "-Wl,--enable-new-dtags,-R" + dir -+ if sys.platform in ["win32", "cygwin"] or \ -+ "mingw" in compiler: -+ return [] -+ else: -+ return "-Wl,--enable-new-dtags,-R" + dir - else: - return "-Wl,-R" + dir - else: diff --git a/build/pkgs/python3/patches/linux_linking_issue_25229.patch b/build/pkgs/python3/patches/linux_linking_issue_25229.patch deleted file mode 100644 index 43131a27913..00000000000 --- a/build/pkgs/python3/patches/linux_linking_issue_25229.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -ru a/Lib/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py ---- a/Lib/distutils/unixccompiler.py 2018-06-27 05:07:35.000000000 +0200 -+++ b/Lib/distutils/unixccompiler.py 2018-06-28 09:32:52.719006731 +0200 -@@ -234,7 +234,7 @@ - return ["-Wl,+s", "-L" + dir] - return ["+s", "-L" + dir] - else: -- if self._is_gcc(compiler): -+ if sys.platform[:5] == "linux" or self._is_gcc(compiler): - # gcc on non-GNU systems does not need -Wl, but can - # use it anyway. Since distutils has always passed in - # -Wl whenever gcc was used in the past it is probably diff --git a/build/pkgs/python3/spkg-configure.m4 b/build/pkgs/python3/spkg-configure.m4 index d67601a98ae..a51e2394e51 100644 --- a/build/pkgs/python3/spkg-configure.m4 +++ b/build/pkgs/python3/spkg-configure.m4 @@ -1,7 +1,7 @@ SAGE_SPKG_CONFIGURE([python3], [ m4_pushdef([MIN_VERSION], [3.9.0]) m4_pushdef([MIN_NONDEPRECATED_VERSION], [3.9.0]) - m4_pushdef([LT_STABLE_VERSION], [3.12.0]) + m4_pushdef([LT_STABLE_VERSION], [3.13.0]) m4_pushdef([LT_VERSION], [3.13.0]) AC_ARG_WITH([python], [AS_HELP_STRING([--with-python=PYTHON3], diff --git a/build/pkgs/sage_conf/bootstrap b/build/pkgs/sage_conf/bootstrap new file mode 120000 index 00000000000..40542346a4e --- /dev/null +++ b/build/pkgs/sage_conf/bootstrap @@ -0,0 +1 @@ +../sagelib/bootstrap \ No newline at end of file diff --git a/build/pkgs/sage_conf/dependencies b/build/pkgs/sage_conf/dependencies index f2bd00aaf0d..a202ce81bba 100644 --- a/build/pkgs/sage_conf/dependencies +++ b/build/pkgs/sage_conf/dependencies @@ -1 +1 @@ - $(SAGE_ROOT)/pkgs/sage-conf/_sage_conf/_conf.py $(SAGE_ROOT)/pkgs/sage-conf/setup.cfg $(SAGE_ROOT)/pkgs/sage-conf/bin/sage-env-config | $(PYTHON_TOOLCHAIN) $(PYTHON) + $(SAGE_ROOT)/pkgs/sage-conf/_sage_conf/_conf.py $(SAGE_ROOT)/pkgs/sage-conf/pyproject.toml $(SAGE_ROOT)/pkgs/sage-conf/bin/sage-env-config | $(PYTHON_TOOLCHAIN) $(PYTHON) diff --git a/build/pkgs/sage_docbuild/bootstrap b/build/pkgs/sage_docbuild/bootstrap new file mode 120000 index 00000000000..40542346a4e --- /dev/null +++ b/build/pkgs/sage_docbuild/bootstrap @@ -0,0 +1 @@ +../sagelib/bootstrap \ No newline at end of file diff --git a/build/pkgs/sage_setup/bootstrap b/build/pkgs/sage_setup/bootstrap new file mode 120000 index 00000000000..40542346a4e --- /dev/null +++ b/build/pkgs/sage_setup/bootstrap @@ -0,0 +1 @@ +../sagelib/bootstrap \ No newline at end of file diff --git a/build/pkgs/sage_sws2rst/bootstrap b/build/pkgs/sage_sws2rst/bootstrap new file mode 120000 index 00000000000..40542346a4e --- /dev/null +++ b/build/pkgs/sage_sws2rst/bootstrap @@ -0,0 +1 @@ +../sagelib/bootstrap \ No newline at end of file diff --git a/build/pkgs/setuptools/distros/fedora.txt b/build/pkgs/setuptools/distros/fedora.txt index e1ad17860cd..1c0901c0374 100644 --- a/build/pkgs/setuptools/distros/fedora.txt +++ b/build/pkgs/setuptools/distros/fedora.txt @@ -1 +1 @@ -python-setuptools +python3-setuptools diff --git a/m4/pyproject_toml_metadata.m4 b/m4/pyproject_toml_metadata.m4 index 139af7e43e4..0d9824b1f2e 100644 --- a/m4/pyproject_toml_metadata.m4 +++ b/m4/pyproject_toml_metadata.m4 @@ -13,6 +13,7 @@ classifiers = [ "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Scientific/Engineering :: Mathematics", ] diff --git a/pkgs/sage-conf/.gitignore b/pkgs/sage-conf/.gitignore index 2fff1627b9f..a495951e529 100644 --- a/pkgs/sage-conf/.gitignore +++ b/pkgs/sage-conf/.gitignore @@ -1,4 +1,6 @@ /_sage_conf/_conf.py +/setup.cfg +/pyproject.toml /build /dist /*.egg-info diff --git a/pkgs/sage-conf/pyproject.toml b/pkgs/sage-conf/pyproject.toml deleted file mode 100644 index 9787c3bdf00..00000000000 --- a/pkgs/sage-conf/pyproject.toml +++ /dev/null @@ -1,3 +0,0 @@ -[build-system] -requires = ["setuptools", "wheel"] -build-backend = "setuptools.build_meta" diff --git a/pkgs/sage-setup/pyproject.toml b/pkgs/sage-conf/pyproject.toml.m4 similarity index 61% rename from pkgs/sage-setup/pyproject.toml rename to pkgs/sage-conf/pyproject.toml.m4 index 4a558643864..a53fec79b0b 100644 --- a/pkgs/sage-setup/pyproject.toml +++ b/pkgs/sage-conf/pyproject.toml.m4 @@ -1,11 +1,17 @@ +include(`sage_spkg_versions_toml.m4')dnl' -*- conf-toml -*- [build-system] -requires = ["setuptools>=61.2"] +requires = [ + SPKG_INSTALL_REQUIRES_setuptools +] build-backend = "setuptools.build_meta" [project] -name = "sage-setup" -description = "Sage: Open Source Mathematics Software: Build system of the Sage library" -license = {text = "GNU General Public License (GPL) v2 or later"} +name = "sage-conf" +description = "Sage: Open Source Mathematics Software: Configuration module for the SageMath library" +readme = "README.rst" +dnl Not including the standard metadata from pyproject_toml_metadata.m4 +dnl because sage-conf is GPL v3+. +license = {text = "GNU General Public License (GPL) v3 or later"} authors = [{name = "The Sage Developers", email = "sage-support@googlegroups.com"}] classifiers = [ "Development Status :: 6 - Mature", @@ -18,29 +24,21 @@ classifiers = [ "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Scientific/Engineering :: Mathematics", ] urls = {Homepage = "https://www.sagemath.org"} requires-python = ">=3.9, <3.13" -dependencies = [] dynamic = ["version"] -[project.readme] -file = "README.rst" -content-type = "text/x-rst" - -[project.optional-dependencies] -autogen = ["jinja2"] +[project.scripts] +sage-config = "sage_conf:_main" [tool.setuptools] -packages = [ - "sage_setup", - "sage_setup.autogen", - "sage_setup.autogen.interpreters", - "sage_setup.autogen.interpreters.specs", - "sage_setup.command", -] +packages = ["_sage_conf"] +py-modules = ["sage_conf"] +script-files = ["bin/sage-env-config"] include-package-data = false [tool.setuptools.dynamic] diff --git a/pkgs/sage-conf/setup.cfg b/pkgs/sage-conf/setup.cfg deleted file mode 100644 index dac401c303d..00000000000 --- a/pkgs/sage-conf/setup.cfg +++ /dev/null @@ -1,23 +0,0 @@ -[metadata] -name = sage-conf -version = file: VERSION.txt -description = Sage: Open Source Mathematics Software: Configuration module for the SageMath library -long_description = file: README.rst -license = GNU General Public License (GPL) v3 or later -author = The Sage Developers -author_email = sage-support@googlegroups.com -url = https://www.sagemath.org - -[options] -packages = - _sage_conf - -py_modules = - sage_conf - -scripts = - bin/sage-env-config - -[options.entry_points] -console_scripts = - sage-config = sage_conf:_main diff --git a/pkgs/sage-conf_conda/setup.cfg b/pkgs/sage-conf_conda/setup.cfg deleted file mode 120000 index 93df2c80a4b..00000000000 --- a/pkgs/sage-conf_conda/setup.cfg +++ /dev/null @@ -1 +0,0 @@ -../sage-conf/setup.cfg \ No newline at end of file diff --git a/pkgs/sage-conf_pypi/setup.cfg b/pkgs/sage-conf_pypi/setup.cfg deleted file mode 120000 index 93df2c80a4b..00000000000 --- a/pkgs/sage-conf_pypi/setup.cfg +++ /dev/null @@ -1 +0,0 @@ -../sage-conf/setup.cfg \ No newline at end of file diff --git a/pkgs/sage-docbuild/pyproject.toml b/pkgs/sage-docbuild/pyproject.toml deleted file mode 100644 index 77840653af0..00000000000 --- a/pkgs/sage-docbuild/pyproject.toml +++ /dev/null @@ -1,40 +0,0 @@ -[build-system] -requires = ["setuptools>=61.2"] -build-backend = "setuptools.build_meta" - -[project] -name = "sage-docbuild" -description = "Sage: Open Source Mathematics Software: Build system of the Sage documentation" -license = {text = "GNU General Public License (GPL) v2 or later"} -authors = [{name = "The Sage Developers", email = "sage-support@googlegroups.com"}] -classifiers = [ - "Development Status :: 6 - Mature", - "Intended Audience :: Education", - "Intended Audience :: Science/Research", - "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)", - "Operating System :: POSIX", - "Operating System :: MacOS :: MacOS X", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: Implementation :: CPython", - "Topic :: Scientific/Engineering :: Mathematics", -] -urls = {Homepage = "https://www.sagemath.org"} -dependencies = ["sphinx"] -dynamic = ["version"] - -[project.readme] -file = "README.rst" -content-type = "text/x-rst" - -[tool.setuptools] -packages = [ - "sage_docbuild", - "sage_docbuild.ext", -] -include-package-data = false - -[tool.setuptools.dynamic] -version = {file = ["VERSION.txt"]} diff --git a/pkgs/sage-docbuild/pyproject.toml.m4 b/pkgs/sage-docbuild/pyproject.toml.m4 new file mode 100644 index 00000000000..1d031de5440 --- /dev/null +++ b/pkgs/sage-docbuild/pyproject.toml.m4 @@ -0,0 +1,29 @@ +include(`sage_spkg_versions_toml.m4')dnl' -*- conf-toml -*- +[build-system] +requires = [ + SPKG_INSTALL_REQUIRES_setuptools +] +build-backend = "setuptools.build_meta" + +[project] +name = "sage-docbuild" +description = "Sage: Open Source Mathematics Software: Build system of the Sage documentation" +dependencies = [ + SPKG_INSTALL_REQUIRES_sphinx +] +dynamic = ["version"] +include(`pyproject_toml_metadata.m4')dnl' + +[project.readme] +file = "README.rst" +content-type = "text/x-rst" + +[tool.setuptools] +packages = [ + "sage_docbuild", + "sage_docbuild.ext", +] +include-package-data = false + +[tool.setuptools.dynamic] +version = {file = ["VERSION.txt"]} diff --git a/pkgs/sage-setup/pyproject.toml.m4 b/pkgs/sage-setup/pyproject.toml.m4 new file mode 100644 index 00000000000..dfeeb598690 --- /dev/null +++ b/pkgs/sage-setup/pyproject.toml.m4 @@ -0,0 +1,35 @@ +include(`sage_spkg_versions_toml.m4')dnl' -*- conf-toml -*- +[build-system] +requires = [ + SPKG_INSTALL_REQUIRES_setuptools +] +build-backend = "setuptools.build_meta" + +[project] +name = "sage-setup" +description = "Sage: Open Source Mathematics Software: Build system of the Sage library" +dependencies = [] +dynamic = ["version"] +include(`pyproject_toml_metadata.m4')dnl' + +[project.readme] +file = "README.rst" +content-type = "text/x-rst" + +[project.optional-dependencies] +autogen = [ + SPKG_INSTALL_REQUIRES_jinja2 +] + +[tool.setuptools] +packages = [ + "sage_setup", + "sage_setup.autogen", + "sage_setup.autogen.interpreters", + "sage_setup.autogen.interpreters.specs", + "sage_setup.command", +] +include-package-data = false + +[tool.setuptools.dynamic] +version = {file = ["VERSION.txt"]} diff --git a/pkgs/sage-sws2rst/pyproject.toml b/pkgs/sage-sws2rst/pyproject.toml.m4 similarity index 85% rename from pkgs/sage-sws2rst/pyproject.toml rename to pkgs/sage-sws2rst/pyproject.toml.m4 index 1232437fb1e..6a7f65da5a2 100644 --- a/pkgs/sage-sws2rst/pyproject.toml +++ b/pkgs/sage-sws2rst/pyproject.toml.m4 @@ -1,5 +1,8 @@ +include(`sage_spkg_versions_toml.m4')dnl' -*- conf-toml -*- [build-system] -requires = ["setuptools>=61.2"] +requires = [ + SPKG_INSTALL_REQUIRES_setuptools +] build-backend = "setuptools.build_meta" [project] diff --git a/src/doc/en/developer/coding_in_python.rst b/src/doc/en/developer/coding_in_python.rst index 9a325f01e52..192642fc69f 100644 --- a/src/doc/en/developer/coding_in_python.rst +++ b/src/doc/en/developer/coding_in_python.rst @@ -45,7 +45,7 @@ using one of two mechanisms: (to be used in place of ``typing``). The Sage library declares these packages as dependencies and ensures that - versions that provide features of Python 3.11 are available. + versions that provide features of Python 3.12 are available. Meta :issue:`29756` keeps track of newer Python features and serves as a starting point for discussions on how to make use of them in the