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'
diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml
index caef3c43b..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:
@@ -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..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:
@@ -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..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:
@@ -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
@@ -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)
@@ -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
@@ -58,13 +58,13 @@ jobs:
lint-code:
name: Lint Code (Python-${{ matrix.python-versions }})
- runs-on: "ubuntu-24.04"
+ runs-on: "ubuntu-26.04"
permissions:
contents: read
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
@@ -95,13 +95,13 @@ jobs:
lint-typing:
name: Lint Typing (Python-${{ matrix.python-versions }})
- runs-on: "ubuntu-24.04"
+ runs-on: "ubuntu-26.04"
permissions:
contents: read
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
@@ -123,13 +123,13 @@ jobs:
audit-security:
name: Audit Security (Python-${{ matrix.python-versions }})
- runs-on: "ubuntu-24.04"
+ runs-on: "ubuntu-26.04"
permissions:
contents: read
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
@@ -160,7 +160,7 @@ jobs:
check-format:
name: Check Format
- runs-on: "ubuntu-24.04"
+ runs-on: "ubuntu-26.04"
permissions:
contents: read
steps:
@@ -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
@@ -183,7 +183,7 @@ jobs:
build-package:
name: Build Package
- runs-on: "ubuntu-24.04"
+ runs-on: "ubuntu-26.04"
permissions:
contents: read
steps:
@@ -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
@@ -206,7 +206,7 @@ jobs:
check-workflows:
name: Check Workflows
- runs-on: "ubuntu-24.04"
+ runs-on: "ubuntu-26.04"
permissions:
contents: read
steps:
@@ -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
@@ -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:
@@ -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..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
@@ -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..1fc01cf83 100644
--- a/.github/workflows/fast-tests.yml
+++ b/.github/workflows/fast-tests.yml
@@ -7,13 +7,13 @@ 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:
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..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:
@@ -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
@@ -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 ad92bf5e8..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:
@@ -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/merge-gate-extension.yml b/.github/workflows/merge-gate-extension.yml
index b51f2b488..0543e5751 100644
--- a/.github/workflows/merge-gate-extension.yml
+++ b/.github/workflows/merge-gate-extension.yml
@@ -4,9 +4,57 @@ 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-24.04"
+ runs-on: "ubuntu-26.04"
permissions:
contents: read
environment: manual-approval
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 5221cd947..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:
@@ -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
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..3436cb69c 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,12 +56,19 @@ jobs:
fail-fast: false
matrix:
runner:
+ - ubuntu-26.04
- ubuntu-24.04
- - ubuntu-22.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:
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
---------------
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
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:
diff --git a/exasol/toolbox/config.py b/exasol/toolbox/config.py
index ad1e54b9f..95f6b25ea 100644
--- a/exasol/toolbox/config.py
+++ b/exasol/toolbox/config.py
@@ -151,12 +151,12 @@ 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",
)
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(
@@ -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
@@ -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.11 as 311."""
+ 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/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/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
---------------
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]
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 b4e73af92..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,
@@ -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",
- "os_version": "ubuntu-24.04",
+ "minimum_python_version": "3.11",
+ "os_version": "ubuntu-26.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",
- "os_version": "ubuntu-24.04",
+ "minimum_python_version": "3.11",
+ "minimum_python_version_compact": "311",
+ "os_version": "ubuntu-26.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
diff --git a/test/unit/util/workflows/render_yaml_test.py b/test/unit/util/workflows/render_yaml_test.py
index 12bd4fb80..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:
@@ -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"
"""
@@ -333,13 +333,13 @@ 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:
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
@@ -383,13 +383,13 @@ 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:
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"