From 41e39efb56df97402d791e26a9927ee103f0b3ef Mon Sep 17 00:00:00 2001 From: Ariel Schulz Date: Wed, 21 Oct 2026 11:09:58 +0200 Subject: [PATCH 01/17] Remove Python 3.10 from dependencies --- exasol/toolbox/config.py | 2 +- poetry.lock | 254 ++------------------------------------- pyproject.toml | 7 +- 3 files changed, 16 insertions(+), 247 deletions(-) diff --git a/exasol/toolbox/config.py b/exasol/toolbox/config.py index ad1e54b9f..ce338756b 100644 --- a/exasol/toolbox/config.py +++ b/exasol/toolbox/config.py @@ -151,7 +151,7 @@ class BaseConfig(BaseModel): project_name: str = Field(description="Name of the project") root_path: Path = Field(description="Root directory of the project") python_versions: tuple[ValidVersionStr, ...] = Field( - default=("3.10", "3.11", "3.12", "3.13", "3.14"), + default=("3.11", "3.12", "3.13", "3.14"), min_length=1, description="Python versions to use in running CI workflows", ) diff --git a/poetry.lock b/poetry.lock index a2dcda289..b8d960306 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.3.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.5.1 and should not be changed by hand. [[package]] name = "accessible-pygments" @@ -207,9 +207,6 @@ files = [ {file = "astroid-4.3.3.tar.gz", hash = "sha256:d03854b09d92c08e18d8e7d9185d393961186ed0747136d8fcb2d1c008a504ec"}, ] -[package.dependencies] -typing-extensions = {version = ">=4", markers = "python_version < \"3.11\""} - [[package]] name = "attrs" version = "26.1.0" @@ -251,7 +248,6 @@ files = [ [package.dependencies] pyflakes = ">=3.0.0" -tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} [[package]] name = "autoimport" @@ -295,7 +291,7 @@ description = "Backport of CPython tarfile module" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version < \"3.12\" and platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and python_version == \"3.11\"" files = [ {file = "backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34"}, {file = "backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"}, @@ -322,7 +318,6 @@ colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} PyYAML = ">=5.3.1" rich = "*" stevedore = ">=1.20.0" -tomli = {version = ">=1.1.0", optional = true, markers = "python_version < \"3.11\" and extra == \"toml\""} [package.extras] baseline = ["GitPython (>=3.1.30)"] @@ -410,8 +405,6 @@ packaging = ">=22.0" pathspec = ">=1.0.0" platformdirs = ">=2" pytokens = ">=0.4.0,<0.5.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] @@ -1106,7 +1099,6 @@ files = [ [package.dependencies] cffi = {version = ">=2.0.0", markers = "platform_python_implementation != \"PyPy\""} -typing-extensions = {version = ">=4.13.2", markers = "python_full_version < \"3.11.0\""} [package.extras] ssh = ["bcrypt (>=3.1.5)"] @@ -1124,12 +1116,11 @@ files = [ ] [package.dependencies] -chardet = ">=5.1,<6.dev0 || ==7.*" +chardet = ">=5.1,<6 || ==7.*" cyclonedx-python-lib = {version = ">=8,<12", extras = ["validation"]} packageurl-python = ">=0.11,<2" packaging = ">=22,<27" pip-requirements-parser = ">=32,<33" -tomli = {version = ">=2.0.1,<3", markers = "python_version < \"3.11\""} [[package]] name = "cyclonedx-python-lib" @@ -1184,7 +1175,6 @@ files = [ [package.dependencies] packaging = "*" -tomli = {version = "*", markers = "python_version < \"3.11\""} [package.extras] cli = ["tomli ; python_version < \"3.11\""] @@ -1281,25 +1271,6 @@ files = [ dev = ["coverage", "flake8", "lxml", "lxml-stubs", "memray ; platform_python_implementation != \"PyPy\"", "mypy", "psutil", "sphinx", "tox (>=4.0)", "xmlschema (>=4.0.1)"] docs = ["readthedocs-sphinx-search", "sphinx"] -[[package]] -name = "exceptiongroup" -version = "1.3.1" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -groups = ["main"] -markers = "python_version == \"3.10\"" -files = [ - {file = "exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598"}, - {file = "exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219"}, -] - -[package.dependencies] -typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} - -[package.extras] -test = ["pytest (>=6)"] - [[package]] name = "fastjsonschema" version = "2.22.2" @@ -1467,7 +1438,7 @@ description = "Read metadata from Python packages" optional = false python-versions = ">=3.10" groups = ["main"] -markers = "python_version < \"3.12\" and platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and python_version == \"3.11\"" files = [ {file = "importlib_metadata-9.0.1-py3-none-any.whl", hash = "sha256:bba5600596a7e21f3eef53281cf28d6a5195634d2f2b78ff9501a3272c6eaab0"}, {file = "importlib_metadata-9.0.1.tar.gz", hash = "sha256:ab830580bc0ef3db61ce8fae716389e5462b67e033018bab6d8f80ef17172f99"}, @@ -2579,7 +2550,6 @@ ast-serialize = ">=0.11.2,<1.0.0" librt = {version = ">=0.16.0", markers = "platform_python_implementation != \"PyPy\""} mypy_extensions = ">=1.0.0" pathspec = ">=1.0.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing_extensions = [ {version = ">=4.6.0", markers = "python_version < \"3.15\""}, {version = ">=4.14.0", markers = "python_version >= \"3.15\""}, @@ -2720,7 +2690,6 @@ humanize = ">=4" packaging = ">=22" platformdirs = ">=2" python-discovery = ">=1" -tomli = {version = ">=1.1", markers = "python_version < \"3.11\""} virtualenv = [ {version = ">=20.15", markers = "python_version < \"3.15\""}, {version = ">=21", markers = "python_version >= \"3.15\""}, @@ -2850,7 +2819,6 @@ files = [ [package.dependencies] prettytable = ">=3.12.0" -tomli = {version = ">=2", markers = "python_version < \"3.11\""} [package.extras] dev = ["docutils (>=0.19)", "mypy", "pip-tools", "pypandoc", "pytest-cov", "pytest-runner", "ruff", "tomli-w", "virtualenv (>=21.1.0)", "wheel"] @@ -3181,14 +3149,12 @@ files = [ astroid = ">=4.3.3,<=4.4" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ - {version = ">=0.2", markers = "python_version < \"3.11\""}, - {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, {version = ">=0.3.6", markers = "python_version == \"3.11\""}, + {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, ] -isort = ">=5,<5.13 || >5.13,<10" +isort = ">=5,!=5.13,<10" mccabe = ">=0.6,<0.8" platformdirs = ">=2.2" -tomli = {version = ">=1.1", markers = "python_version < \"3.11\""} tomlkit = ">=0.10.1" [package.extras] @@ -3256,12 +3222,10 @@ files = [ [package.dependencies] colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1", markers = "python_version < \"3.11\""} iniconfig = ">=1.0.1" packaging = ">=22" pluggy = ">=1.5,<2" pygments = ">=2.7.2" -tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] @@ -3646,132 +3610,6 @@ files = [ {file = "roman-5.2.tar.gz", hash = "sha256:275fe9f46290f7d0ffaea1c33251b92b8e463ace23660508ceef522e7587cb6f"}, ] -[[package]] -name = "rpds-py" -version = "0.30.0" -description = "Python bindings to Rust's persistent data structures (rpds)" -optional = false -python-versions = ">=3.10" -groups = ["main"] -markers = "python_version == \"3.10\"" -files = [ - {file = "rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288"}, - {file = "rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00"}, - {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6"}, - {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7"}, - {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324"}, - {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df"}, - {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3"}, - {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221"}, - {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7"}, - {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff"}, - {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7"}, - {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139"}, - {file = "rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464"}, - {file = "rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169"}, - {file = "rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425"}, - {file = "rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d"}, - {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4"}, - {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f"}, - {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4"}, - {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97"}, - {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89"}, - {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d"}, - {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038"}, - {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7"}, - {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed"}, - {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85"}, - {file = "rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c"}, - {file = "rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825"}, - {file = "rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229"}, - {file = "rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad"}, - {file = "rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05"}, - {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28"}, - {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd"}, - {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f"}, - {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1"}, - {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23"}, - {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6"}, - {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51"}, - {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5"}, - {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e"}, - {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394"}, - {file = "rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf"}, - {file = "rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b"}, - {file = "rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e"}, - {file = "rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2"}, - {file = "rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8"}, - {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4"}, - {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136"}, - {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7"}, - {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2"}, - {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6"}, - {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e"}, - {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d"}, - {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7"}, - {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31"}, - {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95"}, - {file = "rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d"}, - {file = "rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15"}, - {file = "rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1"}, - {file = "rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a"}, - {file = "rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e"}, - {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000"}, - {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db"}, - {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2"}, - {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa"}, - {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083"}, - {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9"}, - {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0"}, - {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94"}, - {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08"}, - {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27"}, - {file = "rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6"}, - {file = "rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d"}, - {file = "rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0"}, - {file = "rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be"}, - {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f"}, - {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f"}, - {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87"}, - {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18"}, - {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad"}, - {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07"}, - {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f"}, - {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65"}, - {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f"}, - {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53"}, - {file = "rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed"}, - {file = "rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950"}, - {file = "rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6"}, - {file = "rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb"}, - {file = "rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8"}, - {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7"}, - {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898"}, - {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e"}, - {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419"}, - {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551"}, - {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8"}, - {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5"}, - {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404"}, - {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856"}, - {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40"}, - {file = "rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0"}, - {file = "rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e"}, - {file = "rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84"}, -] - [[package]] name = "rpds-py" version = "2026.9.1" @@ -3779,7 +3617,6 @@ description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.11" groups = ["main"] -markers = "python_version >= \"3.11\"" files = [ {file = "rpds_py-2026.9.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2711d29b653b3bce48a63d18b9c6b53274669e6d6c4094dddeb4d9a0e45128b2"}, {file = "rpds_py-2026.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3231c4c0e521dafa5be0c9f114ee2c2ad46650836f2d72caa86801950c3e7044"}, @@ -4195,7 +4032,6 @@ sphinxcontrib-htmlhelp = ">=2.0.0" sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" sphinxcontrib-serializinghtml = ">=1.1.9" -tomli = {version = ">=2", markers = "python_version < \"3.11\""} [package.extras] docs = ["sphinxcontrib-websupport"] @@ -4259,33 +4095,6 @@ sphinx = ">=1.8" code-style = ["pre-commit (==2.12.1)"] rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"] -[[package]] -name = "sphinx-design" -version = "0.6.1" -description = "A sphinx extension for designing beautiful, view size responsive web components." -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.10\"" -files = [ - {file = "sphinx_design-0.6.1-py3-none-any.whl", hash = "sha256:b11f37db1a802a183d61b159d9a202314d4d2fe29c163437001324fe2f19549c"}, - {file = "sphinx_design-0.6.1.tar.gz", hash = "sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632"}, -] - -[package.dependencies] -sphinx = ">=6,<9" - -[package.extras] -code-style = ["pre-commit (>=3,<4)"] -rtd = ["myst-parser (>=2,<4)"] -testing = ["defusedxml", "myst-parser (>=2,<4)", "pytest (>=8.3,<9.0)", "pytest-cov", "pytest-regressions"] -testing-no-myst = ["defusedxml", "pytest (>=8.3,<9.0)", "pytest-cov", "pytest-regressions"] -theme-furo = ["furo (>=2024.7.18,<2024.8.0)"] -theme-im = ["sphinx-immaterial (>=0.12.2,<0.13.0)"] -theme-pydata = ["pydata-sphinx-theme (>=0.15.2,<0.16.0)"] -theme-rtd = ["sphinx-rtd-theme (>=2.0,<3.0)"] -theme-sbt = ["sphinx-book-theme (>=1.1,<2.0)"] - [[package]] name = "sphinx-design" version = "0.7.0" @@ -4293,7 +4102,6 @@ description = "A sphinx extension for designing beautiful, view size responsive optional = false python-versions = ">=3.11" groups = ["main"] -markers = "python_version >= \"3.11\"" files = [ {file = "sphinx_design-0.7.0-py3-none-any.whl", hash = "sha256:f82bf179951d58f55dca78ab3706aeafa496b741a91b1911d371441127d64282"}, {file = "sphinx_design-0.7.0.tar.gz", hash = "sha256:d2a3f5b19c24b916adb52f97c5f00efab4009ca337812001109084a740ec9b7a"}, @@ -4349,24 +4157,6 @@ jinja2 = ">=2.10" markupsafe = ">=1" standard-imghdr = {version = "3.10.14", markers = "python_version >= \"3.13\""} -[[package]] -name = "sphinx-prompt" -version = "1.8.0" -description = "Sphinx directive to add unselectable prompt" -optional = false -python-versions = ">=3.9,<4.0" -groups = ["main"] -markers = "python_version == \"3.10\"" -files = [ - {file = "sphinx_prompt-1.8.0-py3-none-any.whl", hash = "sha256:369ecc633f0711886f9b3a078c83264245be1adf46abeeb9b88b5519e4b51007"}, - {file = "sphinx_prompt-1.8.0.tar.gz", hash = "sha256:47482f86fcec29662fdfd23e7c04ef03582714195d01f5d565403320084372ed"}, -] - -[package.dependencies] -docutils = "*" -pygments = "*" -Sphinx = ">=7.0.0,<8.0.0" - [[package]] name = "sphinx-prompt" version = "1.10.2" @@ -4374,7 +4164,6 @@ description = "Sphinx directive to add unselectable prompt" optional = false python-versions = ">=3.11" groups = ["main"] -markers = "python_version >= \"3.11\"" files = [ {file = "sphinx_prompt-1.10.2-py3-none-any.whl", hash = "sha256:6594337962c4b1498602e6984634bed4a0dc7955852e3cfc255eb0af766ed859"}, {file = "sphinx_prompt-1.10.2.tar.gz", hash = "sha256:47b592ba75caebd044b0eddf7a5a1b6e0aef6df587b034377cd101a999b686ba"}, @@ -4441,7 +4230,7 @@ sphinx-jinja2-compat = ">=0.1.0" sphinx-prompt = ">=1.1.0" sphinx-tabs = ">=3.4.7,<3.6.0" tabulate = ">=0.8.7" -typing-extensions = ">=3.7.4.3,<3.10.0.1 || >3.10.0.1" +typing-extensions = ">=3.7.4.3,!=3.10.0.1" [package.extras] all = ["coincidence (>=0.4.3)", "pygments (>=2.7.4,<=2.13.0)"] @@ -4580,19 +4369,6 @@ files = [ {file = "standard_imghdr-3.10.14.tar.gz", hash = "sha256:2598fe2e7c540dbda34b233295e10957ab8dc8ac6f3bd9eaa8d38be167232e52"}, ] -[[package]] -name = "stevedore" -version = "5.8.0" -description = "Manage dynamic plugins for Python applications" -optional = false -python-versions = ">=3.10" -groups = ["main"] -markers = "python_version == \"3.10\"" -files = [ - {file = "stevedore-5.8.0-py3-none-any.whl", hash = "sha256:88eede9e66ca80e34085b9174e2327da2c61ac91f24f70e41c3ad76e4bb4872b"}, - {file = "stevedore-5.8.0.tar.gz", hash = "sha256:b49867b32ca3016e94100e68dbf26e72aa7b8708d0a3f73c08aeb220370ac715"}, -] - [[package]] name = "stevedore" version = "5.9.1" @@ -4600,7 +4376,6 @@ description = "Manage dynamic plugins for Python applications" optional = false python-versions = ">=3.11" groups = ["main"] -markers = "python_version >= \"3.11\"" files = [ {file = "stevedore-5.9.1-py3-none-any.whl", hash = "sha256:5c8ff3a9f336cc1a06ac0f597bc79d11a2f950bfd32e290ca56b5a301fafafbf"}, {file = "stevedore-5.9.1.tar.gz", hash = "sha256:e97a2667923efda926e8713fde6a73616df68210a3cbc6f02b48967b676fd8bf"}, @@ -4618,9 +4393,6 @@ files = [ {file = "structlog-25.5.0.tar.gz", hash = "sha256:098522a3bebed9153d4570c6d0288abf80a031dfdb2048d59a49e9dc2190fc98"}, ] -[package.dependencies] -typing-extensions = {version = "*", markers = "python_version < \"3.11\""} - [[package]] name = "tabulate" version = "0.10.0" @@ -4697,7 +4469,7 @@ version = "2.4.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] +groups = ["main"] files = [ {file = "tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30"}, {file = "tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a"}, @@ -4747,7 +4519,6 @@ files = [ {file = "tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe"}, {file = "tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f"}, ] -markers = {dev = "python_version == \"3.10\""} [[package]] name = "tomli-w" @@ -4791,7 +4562,7 @@ keyring = {version = ">=21.2.0", markers = "platform_machine != \"ppc64le\" and packaging = ">=24.0" readme-renderer = ">=35.0" requests = ">=2.20" -requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" +requests-toolbelt = ">=0.8.0,!=0.9.0" rfc3986 = ">=1.4.0" rich = ">=12.0.0" urllib3 = ">=1.26.0" @@ -4919,7 +4690,6 @@ filelock = {version = ">=3.24.2,<5", markers = "python_version >= \"3.10\""} packaging = ">=23.1" platformdirs = ">=3.9.1,<5" python-discovery = ">=1.6" -typing-extensions = {version = ">=4.13.2", markers = "python_version < \"3.11\""} [[package]] name = "wcwidth" @@ -5027,7 +4797,7 @@ description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.10" groups = ["main"] -markers = "python_version < \"3.12\" and platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and python_version == \"3.11\"" files = [ {file = "zipp-4.1.1-py3-none-any.whl", hash = "sha256:8979f52d874162f485ff2981e3891f3a3317b7a3dd43ff1e1775b9304f307a9c"}, {file = "zipp-4.1.1.tar.gz", hash = "sha256:7ebb7a44c021b29fd8dbd7cce6812d0d7b5b454521f93cc71af6ccd155aaa70b"}, @@ -5064,5 +4834,5 @@ files = [ [metadata] lock-version = "2.1" -python-versions = ">=3.10,<4.0" -content-hash = "42ca5f32838c56167616328f7eb8e0737869702d9ae0a92222d9719447d02260" +python-versions = ">=3.11,<4.0" +content-hash = "81a7f263912537b76a41e5ce0609f9d19304349684f4a2ada26892c99e63a599" diff --git a/pyproject.toml b/pyproject.toml index c471713c6..d78f795cd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ authors = [ { name = "Nicola Coretti", email = "nicola.coretti@exasol.com" }, { name = "Ariel Schulz", email = "ariel.schulz@exasol.com" }, ] -requires-python = ">=3.10,<4.0" +requires-python = ">=3.11,<4.0" readme = "README.rst" license = "MIT" license-files = ["LICENSE"] @@ -20,7 +20,6 @@ keywords = [ ] classifiers = [ "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", @@ -30,6 +29,7 @@ dependencies = [ "bandit[toml]>=1.7.9,<2", "black>=26.3.1,<27", "coverage>=6.4.4,<8.0.0", + "cyclonedx-bom (>=7.3.0,<8.0.0)", "furo>=2022.9.15", "importlib-resources>=5.12.0", "isort>=7.0.0,<8", @@ -48,6 +48,7 @@ dependencies = [ "pyupgrade>=2.38.2,<4.0.0", "ruamel-yaml (>=0.18.0,<=0.18.16)", "ruff>=0.14.5,<0.15", + "sbomconvert (>=0.1.0,<0.2.0)", "shibuya>=2024.5.14", "sphinx>=5.3,<8", "sphinx-copybutton>=0.5.0,<0.6", @@ -59,8 +60,6 @@ dependencies = [ "typer[all]>=0.7.0", "twine>=6.1.0,<7", "zizmor (>=1.25.2,<2.0.0)", - "sbomconvert (>=0.1.0,<0.2.0)", - "cyclonedx-bom (>=7.3.0,<8.0.0)", ] [project.scripts] From 0140e4020c9680ef8217d65796dc2a9e91533ee7 Mon Sep 17 00:00:00 2001 From: Ariel Schulz Date: Wed, 21 Oct 2026 11:14:23 +0200 Subject: [PATCH 02/17] Update workflows to updated Python matrix --- .github/workflows/build-and-publish.yml | 2 +- .github/workflows/check-release-tag.yml | 2 +- .github/workflows/checks.yml | 18 +++++++++--------- .github/workflows/dependency-update.yml | 2 +- .github/workflows/fast-tests.yml | 2 +- .github/workflows/gh-pages.yml | 2 +- .github/workflows/matrix.yml | 2 +- .github/workflows/report.yml | 2 +- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml index caef3c43b..37d5b0b4e 100644 --- a/.github/workflows/build-and-publish.yml +++ b/.github/workflows/build-and-publish.yml @@ -24,7 +24,7 @@ jobs: id: set-up-python-and-poetry-environment uses: exasol/python-toolbox/.github/actions/python-environment@v11 with: - python-version: "3.10" + python-version: "3.11" poetry-version: "2.3.0" - name: Build Artifacts diff --git a/.github/workflows/check-release-tag.yml b/.github/workflows/check-release-tag.yml index 333b02c14..d3a2c258f 100644 --- a/.github/workflows/check-release-tag.yml +++ b/.github/workflows/check-release-tag.yml @@ -22,7 +22,7 @@ jobs: id: set-up-python-and-poetry-environment uses: exasol/python-toolbox/.github/actions/python-environment@v11 with: - python-version: "3.10" + python-version: "3.11" poetry-version: "2.3.0" - name: Check Release Tag diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index def9305d1..ec96e284c 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -21,7 +21,7 @@ jobs: id: set-up-python-and-poetry-environment uses: exasol/python-toolbox/.github/actions/python-environment@v11 with: - python-version: "3.10" + python-version: "3.11" poetry-version: "2.3.0" - name: Build Documentation @@ -49,7 +49,7 @@ jobs: id: set-up-python-and-poetry-environment uses: exasol/python-toolbox/.github/actions/python-environment@v11 with: - python-version: "3.10" + python-version: "3.11" poetry-version: "2.3.0" - name: Check Changelog was Updated @@ -64,7 +64,7 @@ jobs: strategy: fail-fast: false matrix: - python-versions: ["3.10", "3.11", "3.12", "3.13", "3.14"] + python-versions: ["3.11", "3.12", "3.13", "3.14"] steps: - name: Check out Repository id: check-out-repository @@ -101,7 +101,7 @@ jobs: strategy: fail-fast: false matrix: - python-versions: ["3.10", "3.11", "3.12", "3.13", "3.14"] + python-versions: ["3.11", "3.12", "3.13", "3.14"] steps: - name: Check out Repository @@ -129,7 +129,7 @@ jobs: strategy: fail-fast: false matrix: - python-versions: ["3.10", "3.11", "3.12", "3.13", "3.14"] + python-versions: ["3.11", "3.12", "3.13", "3.14"] steps: - name: Check out Repository @@ -174,7 +174,7 @@ jobs: id: set-up-python-and-poetry-environment uses: exasol/python-toolbox/.github/actions/python-environment@v11 with: - python-version: "3.10" + python-version: "3.11" poetry-version: "2.3.0" - name: Check Format @@ -197,7 +197,7 @@ jobs: id: set-up-python-and-poetry-environment uses: exasol/python-toolbox/.github/actions/python-environment@v11 with: - python-version: "3.10" + python-version: "3.11" poetry-version: "2.3.0" - name: Build Package @@ -220,7 +220,7 @@ jobs: id: set-up-python-and-poetry-environment uses: exasol/python-toolbox/.github/actions/python-environment@v11 with: - python-version: "3.10" + python-version: "3.11" poetry-version: "2.3.0" - name: Check Workflows @@ -243,7 +243,7 @@ jobs: id: set-up-python-and-poetry-environment uses: exasol/python-toolbox/.github/actions/python-environment@v11 with: - python-version: "3.10" + python-version: "3.11" poetry-version: "2.3.0" - name: Audit Workflows diff --git a/.github/workflows/dependency-update.yml b/.github/workflows/dependency-update.yml index c562139d3..54a6e3daa 100644 --- a/.github/workflows/dependency-update.yml +++ b/.github/workflows/dependency-update.yml @@ -36,7 +36,7 @@ jobs: id: set-up-python-and-poetry-environment uses: exasol/python-toolbox/.github/actions/python-environment@v11 with: - python-version: "3.10" + python-version: "3.11" poetry-version: "2.3.0" - name: Configure git diff --git a/.github/workflows/fast-tests.yml b/.github/workflows/fast-tests.yml index 7ae93ca73..e7a0e0c18 100644 --- a/.github/workflows/fast-tests.yml +++ b/.github/workflows/fast-tests.yml @@ -13,7 +13,7 @@ jobs: strategy: fail-fast: false matrix: - python-versions: ["3.10", "3.11", "3.12", "3.13", "3.14"] + python-versions: ["3.11", "3.12", "3.13", "3.14"] steps: - name: Check out Repository diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index 772c732cb..c0b94d362 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -23,7 +23,7 @@ jobs: id: set-up-python-and-poetry-environment uses: exasol/python-toolbox/.github/actions/python-environment@v11 with: - python-version: "3.10" + python-version: "3.11" poetry-version: "2.3.0" - name: Build Documentation diff --git a/.github/workflows/matrix.yml b/.github/workflows/matrix.yml index ad92bf5e8..b9326404b 100644 --- a/.github/workflows/matrix.yml +++ b/.github/workflows/matrix.yml @@ -29,7 +29,7 @@ jobs: id: set-up-python-and-poetry-environment uses: exasol/python-toolbox/.github/actions/python-environment@v11 with: - python-version: "3.10" + python-version: "3.11" poetry-version: "2.3.0" - name: Generate Matrix diff --git a/.github/workflows/report.yml b/.github/workflows/report.yml index 5221cd947..d787bf629 100644 --- a/.github/workflows/report.yml +++ b/.github/workflows/report.yml @@ -25,7 +25,7 @@ jobs: id: set-up-python-and-poetry-environment uses: exasol/python-toolbox/.github/actions/python-environment@v11 with: - python-version: "3.10" + python-version: "3.11" poetry-version: "2.3.0" - name: Download Artifacts From bd4f146310b7e5c417add720e4843129cdd9b682 Mon Sep 17 00:00:00 2001 From: Ariel Schulz Date: Wed, 21 Oct 2026 11:39:51 +0200 Subject: [PATCH 03/17] Set to minimum Python version --- exasol/toolbox/config.py | 11 ++++++++--- exasol/toolbox/nox/_format.py | 13 ++++++++++--- test/unit/config_test.py | 21 ++++++++++++++++----- test/unit/nox/_format_test.py | 9 +++++---- 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/exasol/toolbox/config.py b/exasol/toolbox/config.py index ce338756b..c840b167c 100644 --- a/exasol/toolbox/config.py +++ b/exasol/toolbox/config.py @@ -244,6 +244,13 @@ def minimum_python_version(self) -> str: """ return minimum_declared_version(self.python_versions) + @computed_field # type: ignore[misc] + @property + def minimum_python_version_compact(self) -> str: + """Minimum Python major/minor version without a dot, such as 3.10 as 310.""" + major, minor, *_ = self.minimum_python_version.split(".") + return f"{major}{minor}" + @computed_field # type: ignore[misc] @property def minimum_exasol_version(self) -> str | None: @@ -286,9 +293,7 @@ def pyupgrade_argument(self) -> tuple[str, ...]: It uses the minimum Python version to ensure compatibility with all supported versions of a project. """ - version_parts = self.minimum_python_version.split(".")[:2] - version_number = "".join(version_parts) - return (f"--py{version_number}-plus",) + return (f"--py{self.minimum_python_version_compact}-plus",) @computed_field # type: ignore[misc] @property diff --git a/exasol/toolbox/nox/_format.py b/exasol/toolbox/nox/_format.py index eb51e939e..9d665c957 100644 --- a/exasol/toolbox/nox/_format.py +++ b/exasol/toolbox/nox/_format.py @@ -16,11 +16,13 @@ def _code_format(session: Session, mode: Mode, files: Iterable[str]) -> None: + python_version = PROJECT_CONFIG.minimum_python_version_compact + def command(*args: str) -> Iterable[str]: return args if mode == Mode.Fix else list(args) + ["--check"] - session.run(*command("isort"), *files) - session.run(*command("black"), *files) + session.run(*command("isort", "--py", python_version), *files) + session.run(*command("black", "--target-version", f"py{python_version}"), *files) def _pyupgrade(session: Session, config: BaseConfig, files: Iterable[str]) -> None: @@ -33,10 +35,15 @@ def _pyupgrade(session: Session, config: BaseConfig, files: Iterable[str]) -> No def _ruff(session: Session, mode: Mode, files: Iterable[str]): + python_version = PROJECT_CONFIG.minimum_python_version_compact + def command(*args: str) -> Iterable[str]: return args if mode == Mode.Check else list(args) + ["--fix"] - session.run(*command("ruff", "check"), *files) + session.run( + *command("ruff", "check", "--target-version", f"py{python_version}"), + *files, + ) @nox.session(name="format:fix", python=False) diff --git a/test/unit/config_test.py b/test/unit/config_test.py index b4e73af92..f714ba58b 100644 --- a/test/unit/config_test.py +++ b/test/unit/config_test.py @@ -76,10 +76,9 @@ def test_works_as_defined(tmp_path, test_project_config_factory): }, "dependency_manager_version": "2.3.0", "has_documentation": True, - "minimum_python_version": "3.10", + "minimum_python_version": "3.11", "os_version": "ubuntu-24.04", "python_versions": ( - "3.10", "3.11", "3.12", "3.13", @@ -88,13 +87,14 @@ def test_works_as_defined(tmp_path, test_project_config_factory): "sonar_token_name": "SONAR_TOKEN", }, "minimum_exasol_version": "8.29.13", - "minimum_python_version": "3.10", + "minimum_python_version": "3.11", + "minimum_python_version_compact": "311", "os_version": "ubuntu-24.04", "sonar_token_name": "SONAR_TOKEN", "plugins_for_nox_sessions": (), "project_name": "test", - "python_versions": ("3.10", "3.11", "3.12", "3.13", "3.14"), - "pyupgrade_argument": ("--py310-plus",), + "python_versions": ("3.11", "3.12", "3.13", "3.14"), + "pyupgrade_argument": ("--py311-plus",), "root_path": root_path, "sonar_code_path": Path("exasol/test"), "source_code_path": root_path / "exasol" / "test", @@ -177,6 +177,17 @@ def test_minimum_python_version(test_project_config_factory): assert conf.minimum_python_version == "1.10" +@pytest.mark.parametrize( + "minimum_python_version,expected", + [("3.9", "39"), ("3.12", "312"), ("3.15", "315")], +) +def test_minimum_python_version_compact( + test_project_config_factory, minimum_python_version, expected +): + conf = test_project_config_factory(python_versions=(minimum_python_version,)) + assert conf.minimum_python_version_compact == expected + + @pytest.mark.parametrize( "declared_versions,expected", [ diff --git a/test/unit/nox/_format_test.py b/test/unit/nox/_format_test.py index 5d7965ec5..2941f4ac3 100644 --- a/test/unit/nox/_format_test.py +++ b/test/unit/nox/_format_test.py @@ -12,6 +12,7 @@ fix_format, ) from exasol.toolbox.nox._shared import Mode +from noxconfig import PROJECT_CONFIG @pytest.fixture @@ -66,7 +67,7 @@ def test_isort_mode_check(nox_session, file_with_not_ordered_import, caplog): ) assert ( caplog.messages[1] - == f"Command isort --check {file_with_not_ordered_import} failed with exit code 1" + == f"Command isort --py {PROJECT_CONFIG.minimum_python_version_compact} --check {file_with_not_ordered_import} failed with exit code 1" ) assert file_with_not_ordered_import.read_text() == "import isort\nimport black" @@ -91,7 +92,7 @@ def test_black_mode_check(nox_session, file_without_blank_line, caplog): ) assert ( caplog.messages[2] - == f"Command black --check {file_without_blank_line} failed with exit code 1" + == f"Command black --target-version py{PROJECT_CONFIG.minimum_python_version_compact} --check {file_without_blank_line} failed with exit code 1" ) assert file_without_blank_line.read_text() == "import black\nimport isort" @@ -122,7 +123,7 @@ def test_mode_check(nox_session, file_with_unneeded_import, caplog): ) assert ( caplog.messages[1] - == f"Command ruff check {file_with_unneeded_import} failed with exit code 1" + == f"Command ruff check --target-version py{PROJECT_CONFIG.minimum_python_version_compact} {file_with_unneeded_import} failed with exit code 1" ) assert file_with_unneeded_import.read_text() == "import black" @@ -182,7 +183,7 @@ def test_check_format(nox_session, config, file_with_multiple_problems, caplog, # The failed message should always relate to the checking function called first. assert ( caplog.messages[1] - == f"Command ruff check {file_with_multiple_problems} failed with exit code 1" + == f"Command ruff check --target-version py{PROJECT_CONFIG.minimum_python_version_compact} {file_with_multiple_problems} failed with exit code 1" ) # The file should not be changed. assert file_with_multiple_problems.read_text() == expected_text From a49545420d81f040d7e7541904205117067f5df8 Mon Sep 17 00:00:00 2001 From: Ariel Schulz Date: Wed, 21 Oct 2026 11:45:15 +0200 Subject: [PATCH 04/17] Bump default python in action --- .github/actions/python-environment/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/python-environment/action.yml b/.github/actions/python-environment/action.yml index b03656c32..7d4bbffd9 100644 --- a/.github/actions/python-environment/action.yml +++ b/.github/actions/python-environment/action.yml @@ -6,7 +6,7 @@ inputs: python-version: description: 'Python version to use' required: true - default: "3.10" + default: "3.11" poetry-version: description: 'Poetry version to use' From 104dd5b4a434b5bc2e7520b141e1c7eda8d228bc Mon Sep 17 00:00:00 2001 From: Ariel Schulz Date: Wed, 21 Oct 2026 11:45:51 +0200 Subject: [PATCH 05/17] fixup! Set to minimum Python version --- exasol/toolbox/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exasol/toolbox/config.py b/exasol/toolbox/config.py index c840b167c..0656ecdee 100644 --- a/exasol/toolbox/config.py +++ b/exasol/toolbox/config.py @@ -247,7 +247,7 @@ def minimum_python_version(self) -> str: @computed_field # type: ignore[misc] @property def minimum_python_version_compact(self) -> str: - """Minimum Python major/minor version without a dot, such as 3.10 as 310.""" + """Minimum Python major/minor version without a dot, such as 3.11 as 311.""" major, minor, *_ = self.minimum_python_version.split(".") return f"{major}{minor}" From daeec9e06a0b4967bb41c44074f9f74eab28ffdb Mon Sep 17 00:00:00 2001 From: Ariel Schulz Date: Wed, 21 Oct 2026 11:47:42 +0200 Subject: [PATCH 06/17] Update cookiecutter template --- project-template/cookiecutter.json | 2 +- project-template/{{cookiecutter.repo_name}}/README.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/project-template/cookiecutter.json b/project-template/cookiecutter.json index 9e5a803c6..dfa3e083a 100644 --- a/project-template/cookiecutter.json +++ b/project-template/cookiecutter.json @@ -8,7 +8,7 @@ "author_full_name": "Exasol AG", "author_email": "opensource@exasol.com", "project_short_tag": "", - "python_version_min": "3.10", + "python_version_min": "3.11", "exasol_toolbox_version_range": ">=11.0.0,<12", "license_year": "{% now 'utc', '%Y' %}", "__repo_name_slug": "{{cookiecutter.package_name}}", diff --git a/project-template/{{cookiecutter.repo_name}}/README.rst b/project-template/{{cookiecutter.repo_name}}/README.rst index fa9090948..3d42a0d8f 100644 --- a/project-template/{{cookiecutter.repo_name}}/README.rst +++ b/project-template/{{cookiecutter.repo_name}}/README.rst @@ -25,7 +25,7 @@ 🔌️ Prerequisites ----------------- -- `Python `__ >= 3.10 +- `Python `__ >= {{cookiecutter.python_version_min}} 💾 Installation --------------- From 832af58c5b55046054ce9a7895d86273a3456f5f Mon Sep 17 00:00:00 2001 From: Ariel Schulz Date: Wed, 21 Oct 2026 11:49:49 +0200 Subject: [PATCH 07/17] Update documentation --- doc/github_actions/python_environment.rst | 2 +- doc/user_guide/dependencies.rst | 2 +- .../features/github_workflows/create_and_update.rst | 4 ++-- doc/user_guide/getting_started.rst | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/github_actions/python_environment.rst b/doc/github_actions/python_environment.rst index 4decb7379..72bdc7c61 100644 --- a/doc/github_actions/python_environment.rst +++ b/doc/github_actions/python_environment.rst @@ -14,7 +14,7 @@ Parameters * - python-version - Python version to use - True - - 3.10 + - 3.11 * - poetry-version - Poetry version to use - True diff --git a/doc/user_guide/dependencies.rst b/doc/user_guide/dependencies.rst index d37f14a3e..5cc35c301 100644 --- a/doc/user_guide/dependencies.rst +++ b/doc/user_guide/dependencies.rst @@ -4,7 +4,7 @@ Dependencies Core Dependencies ----------------- -- Python >= 3.10 +- Python >= 3.11 - `Poetry `__ >= 2.3.0 - `poetry export `__ diff --git a/doc/user_guide/features/github_workflows/create_and_update.rst b/doc/user_guide/features/github_workflows/create_and_update.rst index da0edb4df..d31102e0e 100644 --- a/doc/user_guide/features/github_workflows/create_and_update.rst +++ b/doc/user_guide/features/github_workflows/create_and_update.rst @@ -43,9 +43,9 @@ The PTB has a default for these versions, but you can override it in the PROJECT_CONFIG = Config( # This tuple should never be empty. - python_versions=("3.10", "3.12), + python_versions=("3.11", "3.12), # This tuple may be empty, as not all projects will need an on-prem Exasol database. - exasol_versions=("7.1.30", "8.29.13", "2025.1.8"), + exasol_versions=("8.29.13", "2025.1.8"), ) Some workflows are expected to not depend on a specific Python version and diff --git a/doc/user_guide/getting_started.rst b/doc/user_guide/getting_started.rst index d18f04753..1f3c9c36d 100644 --- a/doc/user_guide/getting_started.rst +++ b/doc/user_guide/getting_started.rst @@ -58,7 +58,7 @@ Generate a poetry environment for the project: .. code-block:: shell - # An example python_version value is python3.10 + # An example python_version value is python3.12 poetry env use Install all necessary project and development dependencies for the project: From 98309dc1ab4691f9b0d2bd90bba6b379c1fec700 Mon Sep 17 00:00:00 2001 From: Ariel Schulz Date: Wed, 21 Oct 2026 11:50:20 +0200 Subject: [PATCH 08/17] Fix unit tests --- test/unit/util/workflows/render_yaml_test.py | 6 +++--- test/unit/util/workflows/workflow_test.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/unit/util/workflows/render_yaml_test.py b/test/unit/util/workflows/render_yaml_test.py index 12bd4fb80..d3d39240c 100644 --- a/test/unit/util/workflows/render_yaml_test.py +++ b/test/unit/util/workflows/render_yaml_test.py @@ -283,7 +283,7 @@ def test_updates_jinja_variables(test_yml, yaml_renderer): - name: Setup Python & Poetry Environment uses: exasol/python-toolbox/.github/actions/python-environment@v5 with: - python-version: "3.10" + python-version: "3.11" poetry-version: "2.3.0" """ @@ -339,7 +339,7 @@ def test_omits_block_when_extension_is_missing( strategy: fail-fast: false matrix: - python-versions: ["3.10", "3.11", "3.12", "3.13", "3.14"] + python-versions: ["3.11", "3.12", "3.13", "3.14"] steps: - name: Check out Repository @@ -389,7 +389,7 @@ def test_includes_if_block_when_extension_is_present(test_yml, project_config): strategy: fail-fast: false matrix: - python-versions: ["3.10", "3.11", "3.12", "3.13", "3.14"] + python-versions: ["3.11", "3.12", "3.13", "3.14"] steps: - name: Check out Repository diff --git a/test/unit/util/workflows/workflow_test.py b/test/unit/util/workflows/workflow_test.py index f3702d834..b0775f4b8 100644 --- a/test/unit/util/workflows/workflow_test.py +++ b/test/unit/util/workflows/workflow_test.py @@ -59,7 +59,7 @@ def test_works_as_expected(tmp_path, project_config): - name: Setup Python & Poetry Environment uses: exasol/python-toolbox/.github/actions/python-environment@v5 with: - python-version: "3.10" + python-version: "3.11" poetry-version: "2.3.0" """ input_file_path = tmp_path / "test.yml" From 2c58216403c7b8d866ac9218a03df0549602444a Mon Sep 17 00:00:00 2001 From: Ariel Schulz Date: Wed, 21 Oct 2026 11:51:16 +0200 Subject: [PATCH 09/17] Update in README --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index f578cf9c8..6ecc40abe 100644 --- a/README.rst +++ b/README.rst @@ -47,7 +47,7 @@ Your one-stop solution for managing all standard tasks and core workflows of you 🔌️ Prerequisites ----------------- -- `Python `__ >= 3.10 +- `Python `__ >= 3.11 💾 Installation --------------- From 727f42ff9eaa1c340d4ae6f1a018799f5e8094dd Mon Sep 17 00:00:00 2001 From: Ariel Schulz Date: Wed, 21 Oct 2026 11:52:49 +0200 Subject: [PATCH 10/17] Update to ubuntu-26.04 --- exasol/toolbox/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exasol/toolbox/config.py b/exasol/toolbox/config.py index 0656ecdee..cefae8f71 100644 --- a/exasol/toolbox/config.py +++ b/exasol/toolbox/config.py @@ -195,7 +195,7 @@ class BaseConfig(BaseModel): """, ) os_version: str = Field( - default="ubuntu-24.04", + default="ubuntu-26.04", pattern=r"^ubuntu-.*", description=""" This is used to set the OS-runner in the GitHub workflows that are From 8c34113f62c58c0ad8031c002751864511117b6e Mon Sep 17 00:00:00 2001 From: Ariel Schulz Date: Wed, 21 Oct 2026 11:53:08 +0200 Subject: [PATCH 11/17] Update PTB generated workflows to 26.04 --- .github/workflows/build-and-publish.yml | 2 +- .github/workflows/check-release-tag.yml | 2 +- .github/workflows/checks.yml | 18 +++++++++--------- .github/workflows/dependency-update.yml | 2 +- .github/workflows/fast-tests.yml | 2 +- .github/workflows/gh-pages.yml | 4 ++-- .github/workflows/matrix.yml | 2 +- .github/workflows/merge-gate.yml | 4 ++-- .github/workflows/periodic-validation.yml | 2 +- .github/workflows/report.yml | 2 +- 10 files changed, 20 insertions(+), 20 deletions(-) diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml index 37d5b0b4e..e4f618dbd 100644 --- a/.github/workflows/build-and-publish.yml +++ b/.github/workflows/build-and-publish.yml @@ -10,7 +10,7 @@ on: jobs: build-and-publish: name: Build & Publish - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: write steps: diff --git a/.github/workflows/check-release-tag.yml b/.github/workflows/check-release-tag.yml index d3a2c258f..840f71e87 100644 --- a/.github/workflows/check-release-tag.yml +++ b/.github/workflows/check-release-tag.yml @@ -8,7 +8,7 @@ jobs: check-release-tag: name: Check Release Tag - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read steps: diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index ec96e284c..56c2972ab 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -7,7 +7,7 @@ on: jobs: build-documentation-and-check-links: name: Docs - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read steps: @@ -34,7 +34,7 @@ jobs: check-changelog-was-updated: name: Check Changelog was Updated - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read if: github.ref != format('refs/heads/{0}', github.event.repository.default_branch) @@ -58,7 +58,7 @@ jobs: lint-code: name: Lint Code (Python-${{ matrix.python-versions }}) - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read strategy: @@ -95,7 +95,7 @@ jobs: lint-typing: name: Lint Typing (Python-${{ matrix.python-versions }}) - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read strategy: @@ -123,7 +123,7 @@ jobs: audit-security: name: Audit Security (Python-${{ matrix.python-versions }}) - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read strategy: @@ -160,7 +160,7 @@ jobs: check-format: name: Check Format - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read steps: @@ -183,7 +183,7 @@ jobs: build-package: name: Build Package - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read steps: @@ -206,7 +206,7 @@ jobs: check-workflows: name: Check Workflows - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read steps: @@ -229,7 +229,7 @@ jobs: run: poetry run -- nox -s workflow:check -- all audit-workflows: name: Audit Workflows - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read steps: diff --git a/.github/workflows/dependency-update.yml b/.github/workflows/dependency-update.yml index 54a6e3daa..b2e095fdc 100644 --- a/.github/workflows/dependency-update.yml +++ b/.github/workflows/dependency-update.yml @@ -10,7 +10,7 @@ on: jobs: dependency-update: name: Dependency Update - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: write pull-requests: write diff --git a/.github/workflows/fast-tests.yml b/.github/workflows/fast-tests.yml index e7a0e0c18..1fc01cf83 100644 --- a/.github/workflows/fast-tests.yml +++ b/.github/workflows/fast-tests.yml @@ -7,7 +7,7 @@ on: jobs: run-unit-tests: name: Unit Tests (Python-${{ matrix.python-versions }}) - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read strategy: diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index c0b94d362..6cf1c9f4b 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -8,7 +8,7 @@ on: jobs: build-documentation: - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read steps: @@ -48,7 +48,7 @@ jobs: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" steps: - name: Deploy to GitHub Pages id: deploy-to-github-pages diff --git a/.github/workflows/matrix.yml b/.github/workflows/matrix.yml index b9326404b..56bd1c3d5 100644 --- a/.github/workflows/matrix.yml +++ b/.github/workflows/matrix.yml @@ -15,7 +15,7 @@ on: jobs: set-matrix: - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read steps: diff --git a/.github/workflows/merge-gate.yml b/.github/workflows/merge-gate.yml index 778fd219f..a2da74ba3 100644 --- a/.github/workflows/merge-gate.yml +++ b/.github/workflows/merge-gate.yml @@ -33,7 +33,7 @@ jobs: approve-run-slow-tests: name: Approve Running Slow Tests? - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read # Even though the environment "manual-approval" will be created automatically, @@ -62,7 +62,7 @@ jobs: allow-merge: name: Allow Merge if: ${{ !cancelled() }} - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read # If you need additional jobs to be part of the merge gate, add them below diff --git a/.github/workflows/periodic-validation.yml b/.github/workflows/periodic-validation.yml index 863cdf3db..0234d5574 100644 --- a/.github/workflows/periodic-validation.yml +++ b/.github/workflows/periodic-validation.yml @@ -10,7 +10,7 @@ on: jobs: restrict-to-default-branch: name: Restrict to Default Branch - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read diff --git a/.github/workflows/report.yml b/.github/workflows/report.yml index d787bf629..dfd08c55c 100644 --- a/.github/workflows/report.yml +++ b/.github/workflows/report.yml @@ -10,7 +10,7 @@ on: jobs: report: - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read steps: From 8d8f6e75a859a2bde8a71b62d9abe5f4e9bb5936 Mon Sep 17 00:00:00 2001 From: Ariel Schulz Date: Wed, 21 Oct 2026 11:54:37 +0200 Subject: [PATCH 12/17] Update manual ones to 26.04 --- .github/workflows/merge-gate-extension.yml | 2 +- .github/workflows/slow-checks.yml | 2 +- .github/workflows/test-python-environment.yml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/merge-gate-extension.yml b/.github/workflows/merge-gate-extension.yml index b51f2b488..a9085a59d 100644 --- a/.github/workflows/merge-gate-extension.yml +++ b/.github/workflows/merge-gate-extension.yml @@ -6,7 +6,7 @@ on: jobs: approve-run-slow-tests: name: Approve Running Slow Tests? - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read environment: manual-approval diff --git a/.github/workflows/slow-checks.yml b/.github/workflows/slow-checks.yml index 5220eaa5c..6194742f9 100644 --- a/.github/workflows/slow-checks.yml +++ b/.github/workflows/slow-checks.yml @@ -16,7 +16,7 @@ jobs: name: Run Integration Tests (Python-${{ matrix.python_versions }}) needs: - build-matrix - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read env: diff --git a/.github/workflows/test-python-environment.yml b/.github/workflows/test-python-environment.yml index b6f5be697..b28a432ae 100644 --- a/.github/workflows/test-python-environment.yml +++ b/.github/workflows/test-python-environment.yml @@ -8,7 +8,7 @@ on: jobs: check-changes: - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" outputs: should_run: ${{ steps.diff.outputs.should_run }} steps: @@ -56,8 +56,8 @@ jobs: fail-fast: false matrix: runner: + - ubuntu-26.04 - ubuntu-24.04 - - ubuntu-22.04 - ubuntu-24.04-arm - int-linux-x64-4core-gpu-t4-ubuntu24.04-1 - int-linux-x64-4core-ubuntu24.04-1 From ac3ca0a07a66952e4d7bc875e4bfa5da5dbb63d3 Mon Sep 17 00:00:00 2001 From: Ariel Schulz Date: Wed, 21 Oct 2026 11:56:38 +0200 Subject: [PATCH 13/17] Update default database values to latest --- exasol/toolbox/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exasol/toolbox/config.py b/exasol/toolbox/config.py index cefae8f71..95f6b25ea 100644 --- a/exasol/toolbox/config.py +++ b/exasol/toolbox/config.py @@ -156,7 +156,7 @@ class BaseConfig(BaseModel): description="Python versions to use in running CI workflows", ) exasol_versions: tuple[ValidVersionStr, ...] = Field( - default=("8.29.13", "2025.1.8"), + default=("8.29.13", "2025.1.11", "2026.1.0"), description="Exasol versions to use in running CI workflows for integration tests using the DB", ) create_major_version_tags: bool = Field( From f38f497065e247512fc3b47f9e7db80091a53f78 Mon Sep 17 00:00:00 2001 From: Ariel Schulz Date: Wed, 21 Oct 2026 11:59:48 +0200 Subject: [PATCH 14/17] Update tests for new values --- .../util/dependencies/audit_integration_test.py | 7 +++++-- test/unit/config_test.py | 6 +++--- test/unit/util/workflows/render_yaml_test.py | 6 +++--- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/test/integration/util/dependencies/audit_integration_test.py b/test/integration/util/dependencies/audit_integration_test.py index 194fba7fd..7bf08e67a 100644 --- a/test/integration/util/dependencies/audit_integration_test.py +++ b/test/integration/util/dependencies/audit_integration_test.py @@ -32,6 +32,7 @@ "tomlkit", "typing-extensions", ] +OPTIONAL_EXPORT_PACKAGES = {"tomli", "typing-extensions"} def aux_subprocess(*cmd, **kwargs) -> subprocess.CompletedProcess: @@ -181,8 +182,10 @@ def test_poetry_export_versions(self, create_export_poetry_project, tmp_path): content = requirements_txt.read_text() # Poetry may emit a package more than once when it is shared by multiple - # dependency groups or extras. - assert set(self.extract_package_names(content)) == set(EXPORT_PACKAGES) + # dependency groups or extras. Marker-dependent dependencies may be omitted + # when they are not required by the project's Python version. + exported_packages = set(self.extract_package_names(content)) + assert exported_packages | OPTIONAL_EXPORT_PACKAGES == set(EXPORT_PACKAGES) assert "--hash=" in content diff --git a/test/unit/config_test.py b/test/unit/config_test.py index f714ba58b..a3979cfe7 100644 --- a/test/unit/config_test.py +++ b/test/unit/config_test.py @@ -42,7 +42,7 @@ def test_works_as_defined(tmp_path, test_project_config_factory): "documentation_path": root_path / "doc", "has_documentation": True, "agent_skills_path": root_path / ".agents" / "skills", - "exasol_versions": ("8.29.13", "2025.1.8"), + "exasol_versions": ("8.29.13", "2025.1.11", "2026.1.0"), "excluded_python_paths": expand_paths(config, DEFAULT_EXCLUDED_PATHS), "github_workflow_directory": tmp_path / ".github" / "workflows", "github_workflow_patcher_yaml": None, @@ -77,7 +77,7 @@ def test_works_as_defined(tmp_path, test_project_config_factory): "dependency_manager_version": "2.3.0", "has_documentation": True, "minimum_python_version": "3.11", - "os_version": "ubuntu-24.04", + "os_version": "ubuntu-26.04", "python_versions": ( "3.11", "3.12", @@ -89,7 +89,7 @@ def test_works_as_defined(tmp_path, test_project_config_factory): "minimum_exasol_version": "8.29.13", "minimum_python_version": "3.11", "minimum_python_version_compact": "311", - "os_version": "ubuntu-24.04", + "os_version": "ubuntu-26.04", "sonar_token_name": "SONAR_TOKEN", "plugins_for_nox_sessions": (), "project_name": "test", diff --git a/test/unit/util/workflows/render_yaml_test.py b/test/unit/util/workflows/render_yaml_test.py index d3d39240c..17e467fe9 100644 --- a/test/unit/util/workflows/render_yaml_test.py +++ b/test/unit/util/workflows/render_yaml_test.py @@ -162,7 +162,7 @@ def test_preserves_list_format(test_yml, yaml_renderer): Type-Check: name: Type Checking (Python-${{ matrix.python-versions }}) - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read strategy: @@ -333,7 +333,7 @@ def test_omits_block_when_extension_is_missing( jobs: run-unit-tests: name: Unit Tests (Python-${{ matrix.python-versions }}) - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read strategy: @@ -383,7 +383,7 @@ def test_includes_if_block_when_extension_is_present(test_yml, project_config): jobs: run-unit-tests: name: Unit Tests (Python-${{ matrix.python-versions }}) - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-26.04" permissions: contents: read strategy: From ed86637053c1df695e77ecd88c72035615d8d2ff Mon Sep 17 00:00:00 2001 From: Ariel Schulz Date: Wed, 21 Oct 2026 12:04:27 +0200 Subject: [PATCH 15/17] Add changelog entry --- doc/changes/unreleased.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/changes/unreleased.md b/doc/changes/unreleased.md index e103acb19..91e25e0a0 100644 --- a/doc/changes/unreleased.md +++ b/doc/changes/unreleased.md @@ -13,3 +13,8 @@ * #924: Removed the deprecated `lint:dependencies` Nox session and its unused implementation and tests. * #972: Switched from ravsamhq/notify-slack-action to maintained slackapi/slack-github-action & removed workflow versioned header * #967: Refactored skill installation into reusable filesystem helpers. +* #965: Removed support for Python 3.10 (reach end-of-life October 2026), updated to Ubuntu-26.04 for GitHub actions, and updated default databases + +## Bugfixes + +* #965: Added additional parameters to ``format:fix`` tools to run with the minimum Python version From b5ed7e771ca350f323efa299d59a267c8530b14c Mon Sep 17 00:00:00 2001 From: Ariel Schulz Date: Wed, 21 Oct 2026 12:16:41 +0200 Subject: [PATCH 16/17] Add test to verify no formatting needed for a maximum Python version --- .github/workflows/merge-gate-extension.yml | 48 ++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/.github/workflows/merge-gate-extension.yml b/.github/workflows/merge-gate-extension.yml index a9085a59d..0543e5751 100644 --- a/.github/workflows/merge-gate-extension.yml +++ b/.github/workflows/merge-gate-extension.yml @@ -4,6 +4,54 @@ on: workflow_call: jobs: + build-python-matrix: + name: Build Python Matrix + uses: $/.github/workflows/matrix.yml + with: + matrix_keys_json: '["python_versions"]' + permissions: + contents: read + + get-maximum-python-version: + name: Get Maximum Python Version + needs: + - build-python-matrix + runs-on: "ubuntu-26.04" + permissions: + contents: read + outputs: + maximum-python-version: ${{ steps.get-maximum-python-version.outputs.python-version }} + steps: + - name: Get Maximum Python Version + id: get-maximum-python-version + env: + PYTHON_VERSIONS_MATRIX: ${{ needs.build-python-matrix.outputs.matrix }} + run: | + maximum_python_version="$(jq -r '.python_versions | max_by(split(".") | map(tonumber))' <<< "$PYTHON_VERSIONS_MATRIX")" + echo "python-version=$maximum_python_version" >> "$GITHUB_OUTPUT" + + check-format-maximum-python: + name: Check Format (Python-${{ needs.get-maximum-python-version.outputs.maximum-python-version }}) + needs: + - get-maximum-python-version + runs-on: "ubuntu-26.04" + permissions: + contents: read + steps: + - name: Check out Repository + uses: actions/checkout@v7 + with: + persist-credentials: false + + - name: Set up Python & Poetry Environment + uses: exasol/python-toolbox/.github/actions/python-environment@v11 + with: + python-version: ${{ needs.get-maximum-python-version.outputs.maximum-python-version }} + poetry-version: "2.3.0" + + - name: Check Format + run: poetry run -- nox -s format:check + approve-run-slow-tests: name: Approve Running Slow Tests? runs-on: "ubuntu-26.04" From 3f6bcbf00ccb21eb3eefe35fba77c656c3d33076 Mon Sep 17 00:00:00 2001 From: Ariel Schulz Date: Thu, 22 Oct 2026 08:58:18 +0200 Subject: [PATCH 17/17] Add new ubuntu runners --- .github/workflows/test-python-environment.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/test-python-environment.yml b/.github/workflows/test-python-environment.yml index b28a432ae..3436cb69c 100644 --- a/.github/workflows/test-python-environment.yml +++ b/.github/workflows/test-python-environment.yml @@ -59,9 +59,16 @@ jobs: - ubuntu-26.04 - ubuntu-24.04 - ubuntu-24.04-arm + - ubuntu-22.04 - int-linux-x64-4core-gpu-t4-ubuntu24.04-1 - int-linux-x64-4core-ubuntu24.04-1 - int-linux-x64-2core-ubuntu24.04-1 + - int-linux-x64-4core-ubuntu26.04-1 + - int-linux-x64-2core-ubuntu26.04-1 + - int-linux-x64-4core-gpu-t4-ubuntu26.04-1 + - int-linux-arm-4core-ubuntu26.04-1 + - int-linux-arm-2core-ubuntu26.04-1 + - int-linux-x64-8core-ubuntu26.04-1 python-versions: ${{ fromJson(needs.build-matrix.outputs.matrix).python_versions }} name: Verify Poetry Setup for ${{ matrix.runner }} (Python-${{ matrix.python-versions }}) runs-on: