From a3dc5473842dcc6f86f807b600e2a7e477b3ad28 Mon Sep 17 00:00:00 2001 From: ckunki Date: Thu, 26 Feb 2026 17:37:29 +0100 Subject: [PATCH 01/33] #270: Enabled `build_path` without verifying the list of available buckets --- doc/changes/unreleased.md | 5 +- exasol/bucketfs/_path.py | 118 ++++++++++++++++++++---------------- exasol/bucketfs/_service.py | 10 +++ test/unit/test_path.py | 94 ++++++++++++++++++++-------- 4 files changed, 148 insertions(+), 79 deletions(-) diff --git a/doc/changes/unreleased.md b/doc/changes/unreleased.md index 13f3ca32..e8b6d80f 100644 --- a/doc/changes/unreleased.md +++ b/doc/changes/unreleased.md @@ -3,6 +3,7 @@ ## Features * #271: Added method `relative_to` to interface `PathLike` +* #270: Enabled to call `build_path()` without verifying the list of available buckets ## Bug Fixing @@ -11,6 +12,4 @@ ## Refactoring * #260: Re-locked transitive dependencies urllib3, filelock, and Werkzeug and update to exasol-toolbox 4.0.0 -* #274: Re-locked transitive dependencies filelock, pip, pyasn1, PyNaCl, urllib3, virtualenv, Werkzeug -and added the poetry export plugin, so that the nox session dependency:audit works independent of -the local setup \ No newline at end of file +* #274: Re-locked transitive dependencies filelock, pip, pyasn1, PyNaCl, urllib3, virtualenv, Werkzeug and added the poetry export plugin, so that the nox session dependency:audit works independent of the local setup diff --git a/exasol/bucketfs/_path.py b/exasol/bucketfs/_path.py index 9f27e6ec..c2b5a1c6 100644 --- a/exasol/bucketfs/_path.py +++ b/exasol/bucketfs/_path.py @@ -509,16 +509,20 @@ def _create_onprem_bucket( bucket_name: str = "default", verify: bool | str = True, service_name: str | None = None, + verify_bucket: bool = True, ) -> BucketLike: """ Creates an on-prem bucket. """ credentials = {bucket_name: {"username": username, "password": password}} service = Service(url, credentials, verify, service_name) - buckets = service.buckets - if bucket_name not in buckets: - raise BucketFsError(f"Bucket {bucket_name} does not exist.") - return buckets[bucket_name] + if verify_bucket: + buckets = service.buckets + if bucket_name not in buckets: + raise BucketFsError(f"Bucket {bucket_name} does not exist.") + return buckets[bucket_name] + + return service.unverified_bucket(bucket_name) def _create_saas_bucket( @@ -554,56 +558,66 @@ def build_path(**kwargs) -> PathLike: - SaaS - BucketFS files mounted as read-only directory in a UDF. - Arguments: - backend: - This is a mandatory parameter that indicates the BucketFS storage backend. - The available backends are defined in the StorageBackend enumeration, - Currently, these are "onprem", "saas" and "mounted". The parameter value - can be provided either as a string, e.g. "onprem", or as an enum, e.g. - StorageBackend.onprem. - path: - Optional parameter that selects a path within the bucket. If not provided - the returned PathLike objects corresponds to the root of the bucket. Hence, - an alternative way of creating a PathLike pointing to a particular file or - directory is as in the code below. - path = build_path(...) / "the_desired_path" - - The rest of the arguments are backend specific. - - On-prem arguments: - url: - Url of the BucketFS service, e.g. `http(s)://127.0.0.1:2580`. - username: - BucketFS username (generally, different from the DB username). - password: - BucketFS user password. - bucket_name: - Name of the bucket. Currently, a PathLike cannot span multiple buckets. - verify: - Either a boolean, in which case it controls whether we verify the server's - TLS certificate, or a string, in which case it must be a path to a CA bundle - to use. Defaults to ``True``. - service_name: - Optional name of the BucketFS service. - - SaaS arguments: - url: - Url of the Exasol SaaS. Defaults to 'https://cloud.exasol.com'. - account_id: - SaaS user account ID, e.g. 'org_LVeOj4pwXhPatNz5' - (given example is not a valid ID of an existing account). - database_id: - Database ID, e.g. 'msduZKlMR8QCP_MsLsVRwy' - (given example is not a valid ID of an existing database). - pat: - Personal Access Token, e.g. 'exa_pat_aj39AsM3bYR9bQ4qk2wiG8SWHXbRUGNCThnep5YV73az6A' + General Arguments: + + backend: This is a mandatory parameter that indicates the BucketFS + storage backend. The available backends are defined in the + StorageBackend enumeration, Currently, these are "onprem", "saas" + and "mounted". The parameter value can be provided either as a + string, e.g. "onprem", or as an enum, e.g. StorageBackend.onprem. + + path: Optional parameter that selects a path within the bucket. If not + provided the returned PathLike objects corresponds to the root of + the bucket. Hence, an alternative way of creating a PathLike + pointing to a particular file or directory is as in the code + below. path = build_path(...) / "the_desired_path" + + The rest of the arguments are backend specific. + + Additional On-prem arguments: + + url: Url of the BucketFS service, e.g. `http(s)://127.0.0.1:2580`. + + username: BucketFS username (generally, different from the DB + username). + + password: BucketFS user password. + + bucket_name: Name of the bucket. Currently, a PathLike cannot span + multiple buckets. + + verify: Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must + be a path to a CA bundle to use. Defaults to ``True``. + + service_name: Optional name of the BucketFS service. + + verify_bucket: Optional flag to skip verifying the bucket to exist. + This is acceptable in case of planning only access via + `as_udf_path()`. + + Additional SaaS arguments: + + url: Url of the Exasol SaaS. Defaults to 'https://cloud.exasol.com'. + + account_id: SaaS user account ID, e.g. 'org_LVeOj4pwXhPatNz5' (given + example is not a valid ID of an existing account). + + database_id: Database ID, e.g. 'msduZKlMR8QCP_MsLsVRwy' (given example + is not a valid ID of an existing database). + + pat: Personal Access Token, + e.g. 'exa_pat_aj39AsM3bYR9bQ4qk2wiG8SWHXbRUGNCThnep5YV73az6A' (given example is not a valid PAT). - Mounted BucketFS directory arguments: - service_name: - Name of the BucketFS service (not a service url). Defaults to 'bfsdefault'. - bucket_name: - Name of the bucket. Currently, a PathLike cannot span multiple buckets. + Additional Mounted BucketFS directory arguments: + + service_name: Name of the BucketFS service (not a service + url). Defaults to 'bfsdefault'. + + bucket_name: Name of the bucket. Currently, a PathLike cannot span + multiple buckets. + base_path: Explicitly specified root path in a file system. This is an alternative to providing the service_name and the bucket_name. diff --git a/exasol/bucketfs/_service.py b/exasol/bucketfs/_service.py index 5fa53c47..33eb5c41 100644 --- a/exasol/bucketfs/_service.py +++ b/exasol/bucketfs/_service.py @@ -57,6 +57,16 @@ def __init__( self._verify = verify self._service_name = service_name + def unverified_bucket(self, name: str) -> Bucket: + return Bucket( + name=name, + service=self._url, + username=self._authenticator[name]["username"], + password=self._authenticator[name]["password"], + service_name=self._service_name, + verify=self._verify, + ) + @property def buckets(self) -> MutableMapping[str, Bucket]: """List all available buckets.""" diff --git a/test/unit/test_path.py b/test/unit/test_path.py index 1cdfa186..4787b43c 100644 --- a/test/unit/test_path.py +++ b/test/unit/test_path.py @@ -1,18 +1,20 @@ +from typing import ( + Any, + Callable, +) from unittest.mock import ( Mock, + PropertyMock, call, ) import pytest +from _pytest.monkeypatch import MonkeyPatch -import exasol.bucketfs._path +import exasol.bucketfs +from exasol.bucketfs import path as api from exasol.bucketfs._error import InferBfsPathError -from exasol.bucketfs._path import ( - StorageBackend, - get_database_id_by_name, - infer_backend, - infer_path, -) +from exasol.bucketfs._path import StorageBackend def build_path(*args, **kwargs): @@ -20,7 +22,7 @@ def build_path(*args, **kwargs): def test_infer_backend_onprem(): - result = infer_backend( + result = api.infer_backend( bucketfs_host="host", bucketfs_port=123, bucketfs_name="bfs", @@ -32,7 +34,7 @@ def test_infer_backend_onprem(): def test_infer_backend_saas_with_id(): - result = infer_backend( + result = api.infer_backend( saas_url="https://api", saas_account_id="acct", saas_database_id="dbid", @@ -42,7 +44,7 @@ def test_infer_backend_saas_with_id(): def test_infer_backend_saas_with_name(): - result = infer_backend( + result = api.infer_backend( saas_url="https://api", saas_account_id="acct", saas_database_name="dbname", @@ -53,16 +55,16 @@ def test_infer_backend_saas_with_name(): def test_infer_backend_missing_fields(): with pytest.raises(InferBfsPathError, match="Insufficient parameters"): - infer_backend(bucketfs_host="host") + api.infer_backend(bucketfs_host="host") def test_infer_backend_no_fields(): with pytest.raises(InferBfsPathError): - infer_backend() + api.infer_backend() def test_infer_path_onprem_with_ssl_ca(build_path_mock): - infer_path( + api.infer_path( bucketfs_host="host", bucketfs_port=123, bucketfs_name="bfs", @@ -86,12 +88,12 @@ def test_infer_path_onprem_with_ssl_ca(build_path_mock): @pytest.fixture def build_path_mock(monkeypatch): mock = Mock(side_effect=build_path) - monkeypatch.setattr(exasol.bucketfs._path, "build_path", mock) + monkeypatch.setattr(api, "build_path", mock) return mock def test_infer_path_saas(build_path_mock): - infer_path( + api.infer_path( saas_url="https://api", saas_account_id="acct", saas_database_id="dbid", @@ -108,10 +110,8 @@ def test_infer_path_saas(build_path_mock): def test_infer_path_saas_without_id(build_path_mock, monkeypatch): - monkeypatch.setattr( - exasol.bucketfs._path, "get_database_id_by_name", Mock(return_value="dbid") - ) - infer_path( + monkeypatch.setattr(api, "get_database_id_by_name", Mock(return_value="dbid")) + api.infer_path( saas_url="https://api", saas_account_id="acct", saas_database_name="dbname", @@ -128,7 +128,7 @@ def test_infer_path_saas_without_id(build_path_mock, monkeypatch): def test_infer_path_mounted(build_path_mock): - infer_path(bucketfs_name="bfsdefault", bucket="default") + api.infer_path(bucketfs_name="bfsdefault", bucket="default") assert build_path_mock.call_args == call( backend=StorageBackend.mounted, service_name="bfsdefault", @@ -137,18 +137,64 @@ def test_infer_path_mounted(build_path_mock): ) -def test_infer_path_unspported_backend_exception(build_path_mock): +def test_infer_path_unsupported_backend_exception(build_path_mock): with pytest.raises(InferBfsPathError, match="Insufficient parameters"): - infer_path(saas_url="https://api", saas_account_id="acct", saas_token="token") + api.infer_path( + saas_url="https://api", saas_account_id="acct", saas_token="token" + ) def test_get_database_id_by_name(monkeypatch): mocked_db_id = Mock(return_value="dbid") - monkeypatch.setattr(exasol.bucketfs._path, "get_database_id", mocked_db_id) - result = get_database_id_by_name( + monkeypatch.setattr(api, "get_database_id", mocked_db_id) + result = api.get_database_id_by_name( host="https://api", account_id="acct", database_name="dbname", pat="token", ) assert result == "dbid" + + +OTHER_ARGS = { + "url": "http://host:123", + "username": "user", + "password": "password", +} + + +@pytest.fixture +def mock_bfs_service(monkeypatch: MonkeyPatch) -> Callable[[dict[str, Any]], None]: + def mock(buckets: dict[str, Any]): + buckets_property = PropertyMock(return_value=buckets) + monkeypatch.setattr(api.Service, "buckets", buckets_property) + return buckets_property + + return mock + + +def test_verify_bucket_success(mock_bfs_service): + bucket_like = Mock() + mock_bfs_service({"my-bucket": bucket_like}) + actual = api.build_path(bucket_name="my-bucket", **OTHER_ARGS) + assert actual.bucket_api == bucket_like + + +def test_verify_bucket_failure(mock_bfs_service): + bucket_like = Mock() + mock_bfs_service(buckets={"name": bucket_like}) + with pytest.raises(api.BucketFsError, match="Bucket non-existing does not exist."): + api.build_path(bucket_name="non-existing", **OTHER_ARGS) + + +def test_no_verify(mock_bfs_service) -> None: + buckets_property = mock_bfs_service({}) + actual = api.build_path( + bucket_name="any-name", + verify_bucket=False, + **OTHER_ARGS, + ) + bucket = actual.bucket_api + assert not buckets_property.called + assert bucket.name == "any-name" + assert isinstance(bucket, exasol.bucketfs.Bucket) From aedff8475c42cd294b12f447e2611e778b287981 Mon Sep 17 00:00:00 2001 From: ckunki Date: Thu, 26 Feb 2026 18:30:02 +0100 Subject: [PATCH 02/33] added unit tests --- test/unit/test_path.py | 40 ++++++++++++++++------------------------ 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/test/unit/test_path.py b/test/unit/test_path.py index 4787b43c..4861a76c 100644 --- a/test/unit/test_path.py +++ b/test/unit/test_path.py @@ -156,6 +156,7 @@ def test_get_database_id_by_name(monkeypatch): assert result == "dbid" +BUCKET_NAME = "some-bucket" OTHER_ARGS = { "url": "http://host:123", "username": "user", @@ -164,37 +165,28 @@ def test_get_database_id_by_name(monkeypatch): @pytest.fixture -def mock_bfs_service(monkeypatch: MonkeyPatch) -> Callable[[dict[str, Any]], None]: - def mock(buckets: dict[str, Any]): - buckets_property = PropertyMock(return_value=buckets) - monkeypatch.setattr(api.Service, "buckets", buckets_property) - return buckets_property - - return mock +def mock_buckets(monkeypatch: MonkeyPatch) -> PropertyMock: + """Mock property `Service.buckets` and return the mock.""" + bucket_like = Mock(exasol.bucketfs.Bucket) + buckets_property = PropertyMock(return_value={BUCKET_NAME: bucket_like}) + monkeypatch.setattr(api.Service, "buckets", buckets_property) + return buckets_property -def test_verify_bucket_success(mock_bfs_service): - bucket_like = Mock() - mock_bfs_service({"my-bucket": bucket_like}) - actual = api.build_path(bucket_name="my-bucket", **OTHER_ARGS) - assert actual.bucket_api == bucket_like +def test_verify_bucket_success(mock_buckets): + actual = api.build_path(bucket_name=BUCKET_NAME, **OTHER_ARGS) + assert mock_buckets.called + assert isinstance(actual.bucket_api, exasol.bucketfs.Bucket) -def test_verify_bucket_failure(mock_bfs_service): - bucket_like = Mock() - mock_bfs_service(buckets={"name": bucket_like}) +def test_verify_bucket_failure(mock_buckets): with pytest.raises(api.BucketFsError, match="Bucket non-existing does not exist."): api.build_path(bucket_name="non-existing", **OTHER_ARGS) -def test_no_verify(mock_bfs_service) -> None: - buckets_property = mock_bfs_service({}) - actual = api.build_path( - bucket_name="any-name", - verify_bucket=False, - **OTHER_ARGS, - ) +def test_no_verify(mock_buckets) -> None: + actual = api.build_path(bucket_name="any-name", verify_bucket=False, **OTHER_ARGS) bucket = actual.bucket_api - assert not buckets_property.called - assert bucket.name == "any-name" + assert not mock_buckets.called assert isinstance(bucket, exasol.bucketfs.Bucket) + assert bucket.name == "any-name" From 8797627a8581d73c4cc0ff4a7d764ec4c9e6d60e Mon Sep 17 00:00:00 2001 From: ckunki Date: Thu, 26 Feb 2026 18:33:25 +0100 Subject: [PATCH 03/33] Updated changelog --- doc/changes/unreleased.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/changes/unreleased.md b/doc/changes/unreleased.md index e8b6d80f..a4980415 100644 --- a/doc/changes/unreleased.md +++ b/doc/changes/unreleased.md @@ -1,9 +1,13 @@ # Unreleased +## Summary + +This release adds method `relative_to` to interface `PathLike` and enables calling `build_path()` without verifying the list of available buckets. + ## Features * #271: Added method `relative_to` to interface `PathLike` -* #270: Enabled to call `build_path()` without verifying the list of available buckets +* #270: Enabled calling `build_path()` without verifying the list of available buckets ## Bug Fixing From 002a1fc159235e496de58a4d437d425123805c5a Mon Sep 17 00:00:00 2001 From: ckunki Date: Thu, 26 Feb 2026 18:34:25 +0100 Subject: [PATCH 04/33] updated docstring --- exasol/bucketfs/_path.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exasol/bucketfs/_path.py b/exasol/bucketfs/_path.py index c2b5a1c6..ce81219d 100644 --- a/exasol/bucketfs/_path.py +++ b/exasol/bucketfs/_path.py @@ -592,7 +592,7 @@ def build_path(**kwargs) -> PathLike: service_name: Optional name of the BucketFS service. - verify_bucket: Optional flag to skip verifying the bucket to exist. + verify_bucket: Optional flag to skip verifying if the bucket exists. This is acceptable in case of planning only access via `as_udf_path()`. From 460f097929f97e9dbfe397422fd2185596b877f0 Mon Sep 17 00:00:00 2001 From: ckunki Date: Fri, 27 Feb 2026 07:32:43 +0100 Subject: [PATCH 05/33] updated User Guide --- doc/user_guide/user_guide.rst | 10 +++--- exasol/bucketfs/_path.py | 64 +++++++++++++++++++++-------------- 2 files changed, 43 insertions(+), 31 deletions(-) diff --git a/doc/user_guide/user_guide.rst b/doc/user_guide/user_guide.rst index 76760ff8..b11a9b12 100644 --- a/doc/user_guide/user_guide.rst +++ b/doc/user_guide/user_guide.rst @@ -6,14 +6,14 @@ Bucketfs Depending on the database configuration, the bucketfs setup can range from straight forward to fairly complex. This is due to the fact that: -* Each database can have one or more BucketFS services (in the On-Prem database) -* Each BucketFS service is available on all worker cluster of a database +* Each database can have one or more BucketFS services (applies to On-Prem database instances) +* Each BucketFS service is available on all worker clusters of a database * Each BucketFS service runs on all data nodes of a database -* Each BucketFS service can have one or more Buckets (in the On-Prem database) +* Each BucketFS service can have one or more Buckets (applies to On-Prem database instances) * Each Bucket can hold one or more files -The overview bellow tries to illustrate this in a more tangible manner. -For more details on bucketfs, please also have a look in the `bucketfs section`_ of the `database documentation`_. +The following overview illustrate this. For more details on bucketfs, please +also have a look in the `bucketfs section`_ of the `database documentation`_. .. image:: ../_static/bucketfs.png :alt: BucketFS Overview diff --git a/exasol/bucketfs/_path.py b/exasol/bucketfs/_path.py index ce81219d..454d54d6 100644 --- a/exasol/bucketfs/_path.py +++ b/exasol/bucketfs/_path.py @@ -560,13 +560,15 @@ def build_path(**kwargs) -> PathLike: General Arguments: - backend: This is a mandatory parameter that indicates the BucketFS - storage backend. The available backends are defined in the - StorageBackend enumeration, Currently, these are "onprem", "saas" - and "mounted". The parameter value can be provided either as a - string, e.g. "onprem", or as an enum, e.g. StorageBackend.onprem. - - path: Optional parameter that selects a path within the bucket. If not + backend: + This is a mandatory parameter that indicates the BucketFS storage + backend. The available backends are defined in the StorageBackend + enumeration, Currently, these are "onprem", "saas" and + "mounted". The parameter value can be provided either as a string, + e.g. "onprem", or as an enum, e.g. StorageBackend.onprem. + + path: + Optional parameter that selects a path within the bucket. If not provided the returned PathLike objects corresponds to the root of the bucket. Hence, an alternative way of creating a PathLike pointing to a particular file or directory is as in the code @@ -576,47 +578,57 @@ def build_path(**kwargs) -> PathLike: Additional On-prem arguments: - url: Url of the BucketFS service, e.g. `http(s)://127.0.0.1:2580`. + url: + Url of the BucketFS service, e.g. `http(s)://127.0.0.1:2580`. - username: BucketFS username (generally, different from the DB - username). + username: + BucketFS username (generally, different from the DB username). - password: BucketFS user password. + password: + BucketFS user password. - bucket_name: Name of the bucket. Currently, a PathLike cannot span - multiple buckets. + bucket_name: + Name of the bucket. Currently, a PathLike cannot span multiple buckets. - verify: Either a boolean, in which case it controls whether we verify + verify: + Either a boolean, in which case it controls whether we verify the server's TLS certificate, or a string, in which case it must be a path to a CA bundle to use. Defaults to ``True``. - service_name: Optional name of the BucketFS service. + service_name: + Optional name of the BucketFS service. - verify_bucket: Optional flag to skip verifying if the bucket exists. - This is acceptable in case of planning only access via - `as_udf_path()`. + verify_bucket: + Optional flag to skip verifying if the bucket exists. This is + acceptable in case of planning only access via `as_udf_path()`. Additional SaaS arguments: - url: Url of the Exasol SaaS. Defaults to 'https://cloud.exasol.com'. + url: + Url of the Exasol SaaS. Defaults to 'https://cloud.exasol.com'. - account_id: SaaS user account ID, e.g. 'org_LVeOj4pwXhPatNz5' (given + account_id: + SaaS user account ID, e.g. 'org_LVeOj4pwXhPatNz5' (given example is not a valid ID of an existing account). - database_id: Database ID, e.g. 'msduZKlMR8QCP_MsLsVRwy' (given example + database_id: + Database ID, e.g. 'msduZKlMR8QCP_MsLsVRwy' (given example is not a valid ID of an existing database). - pat: Personal Access Token, + pat: + Personal Access Token, e.g. 'exa_pat_aj39AsM3bYR9bQ4qk2wiG8SWHXbRUGNCThnep5YV73az6A' (given example is not a valid PAT). Additional Mounted BucketFS directory arguments: - service_name: Name of the BucketFS service (not a service - url). Defaults to 'bfsdefault'. + service_name: + Name of the BucketFS service (not a service url). Defaults to + 'bfsdefault'. - bucket_name: Name of the bucket. Currently, a PathLike cannot span - multiple buckets. + bucket_name: + Name of the bucket. Currently, a PathLike cannot span multiple + buckets. base_path: Explicitly specified root path in a file system. This is an alternative to From 5784684188330f7a22abce4a59c953c4077d770a Mon Sep 17 00:00:00 2001 From: ckunki Date: Fri, 27 Feb 2026 07:42:41 +0100 Subject: [PATCH 06/33] Redefined matrix for matrix build --- .github/workflows/slow-checks.yml | 41 ++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/.github/workflows/slow-checks.yml b/.github/workflows/slow-checks.yml index d3bc8fca..612e8027 100644 --- a/.github/workflows/slow-checks.yml +++ b/.github/workflows/slow-checks.yml @@ -4,23 +4,30 @@ on: workflow_call: jobs: - build-matrix: - name: Generate Build Matrix - uses: ./.github/workflows/matrix-all.yml - permissions: - contents: read + # build-matrix: + # name: Generate Build Matrix + # uses: ./.github/workflows/matrix-all.yml + # permissions: + # contents: read tests: - name: Integration-Tests (Python-${{ matrix.python-version }}, Exasol-${{ matrix.exasol-version}}) - needs: [ build-matrix ] - runs-on: ubuntu-24.04 + name: Integration-Tests (${{ matrix.backend }}, ${{ matrix.exasol-version}}) + # needs: [ build-matrix ] + runs-on: "ubuntu-24.04" permissions: contents: read - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} strategy: fail-fast: false - matrix: ${{ fromJson(needs.build-matrix.outputs.matrix) }} + matrix: # ${{ fromJson(needs.build-matrix.outputs.matrix) }} + include: + - backend: saas + version: provided + - backend: onprem + version: "7.1.30" + - backend: onprem + version: "8.29.13" + - backend: onprem + version: "2025.1.8" steps: - name: SCM Checkout @@ -29,17 +36,23 @@ jobs: - name: Setup Python & Poetry Environment uses: exasol/python-toolbox/.github/actions/python-environment@v4 with: - python-version: ${{ matrix.python-version }} + # python-version: ${{ matrix.python-version }} + python-version: "3.10" + # Required for test/integration/test_udf_path.py - name: Allow unprivileged user namespaces run: sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 - name: Run Tests and Collect Coverage - run: poetry run -- nox -s test:integration -- -s --coverage --db-version ${{ matrix.exasol-version }} --backend=onprem + run: > + echo poetry run -- nox -s test:integration -- -s --coverage + --backend=${{ matrix.backend }} + --db-version ${{ matrix.version }}; + poetry run -- nox -s test:unit -- -s --coverage - name: Upload Artifacts uses: actions/upload-artifact@v5 with: - name: coverage-python${{ matrix.python-version }}-exasol${{ matrix.exasol-version }}-slow + name: coverage-slow-${{ matrix.backend }}-${{ matrix.version }} path: .coverage include-hidden-files: true From c5b0666d8f166af7539acb575e0043897e54494c Mon Sep 17 00:00:00 2001 From: ckunki Date: Fri, 27 Feb 2026 07:44:57 +0100 Subject: [PATCH 07/33] Removed manual approval for executing slow checks --- .github/workflows/merge-gate.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/merge-gate.yml b/.github/workflows/merge-gate.yml index 9caa3cee..2068b8ee 100644 --- a/.github/workflows/merge-gate.yml +++ b/.github/workflows/merge-gate.yml @@ -12,7 +12,7 @@ jobs: contents: read run-slow-tests: - name: Run Slow Tests + name: Run Slow Tests? runs-on: ubuntu-24.04 permissions: contents: read @@ -27,7 +27,7 @@ jobs: slow-checks: name: Slow - needs: [ run-slow-tests ] + # needs: [ run-slow-tests ] uses: ./.github/workflows/slow-checks.yml secrets: inherit permissions: From 0c11ec4f86c0d1139844a40ceafc90c75d9bf5b9 Mon Sep 17 00:00:00 2001 From: ckunki Date: Fri, 27 Feb 2026 07:48:30 +0100 Subject: [PATCH 08/33] format:fix --- exasol/bucketfs/_path.py | 30 +-- test/unit/test_path.py | 384 +++++++++++++++++++-------------------- 2 files changed, 207 insertions(+), 207 deletions(-) diff --git a/exasol/bucketfs/_path.py b/exasol/bucketfs/_path.py index 454d54d6..d21d953e 100644 --- a/exasol/bucketfs/_path.py +++ b/exasol/bucketfs/_path.py @@ -560,14 +560,14 @@ def build_path(**kwargs) -> PathLike: General Arguments: - backend: + backend: This is a mandatory parameter that indicates the BucketFS storage backend. The available backends are defined in the StorageBackend enumeration, Currently, these are "onprem", "saas" and "mounted". The parameter value can be provided either as a string, e.g. "onprem", or as an enum, e.g. StorageBackend.onprem. - path: + path: Optional parameter that selects a path within the bucket. If not provided the returned PathLike objects corresponds to the root of the bucket. Hence, an alternative way of creating a PathLike @@ -578,55 +578,55 @@ def build_path(**kwargs) -> PathLike: Additional On-prem arguments: - url: + url: Url of the BucketFS service, e.g. `http(s)://127.0.0.1:2580`. - username: + username: BucketFS username (generally, different from the DB username). - password: + password: BucketFS user password. - bucket_name: + bucket_name: Name of the bucket. Currently, a PathLike cannot span multiple buckets. - verify: + verify: Either a boolean, in which case it controls whether we verify the server's TLS certificate, or a string, in which case it must be a path to a CA bundle to use. Defaults to ``True``. - service_name: + service_name: Optional name of the BucketFS service. - verify_bucket: + verify_bucket: Optional flag to skip verifying if the bucket exists. This is acceptable in case of planning only access via `as_udf_path()`. Additional SaaS arguments: - url: + url: Url of the Exasol SaaS. Defaults to 'https://cloud.exasol.com'. - account_id: + account_id: SaaS user account ID, e.g. 'org_LVeOj4pwXhPatNz5' (given example is not a valid ID of an existing account). - database_id: + database_id: Database ID, e.g. 'msduZKlMR8QCP_MsLsVRwy' (given example is not a valid ID of an existing database). - pat: + pat: Personal Access Token, e.g. 'exa_pat_aj39AsM3bYR9bQ4qk2wiG8SWHXbRUGNCThnep5YV73az6A' (given example is not a valid PAT). Additional Mounted BucketFS directory arguments: - service_name: + service_name: Name of the BucketFS service (not a service url). Defaults to 'bfsdefault'. - bucket_name: + bucket_name: Name of the bucket. Currently, a PathLike cannot span multiple buckets. diff --git a/test/unit/test_path.py b/test/unit/test_path.py index 4861a76c..3c9913d4 100644 --- a/test/unit/test_path.py +++ b/test/unit/test_path.py @@ -1,192 +1,192 @@ -from typing import ( - Any, - Callable, -) -from unittest.mock import ( - Mock, - PropertyMock, - call, -) - -import pytest -from _pytest.monkeypatch import MonkeyPatch - -import exasol.bucketfs -from exasol.bucketfs import path as api -from exasol.bucketfs._error import InferBfsPathError -from exasol.bucketfs._path import StorageBackend - - -def build_path(*args, **kwargs): - return f"mocked_path_{args}_{kwargs}" - - -def test_infer_backend_onprem(): - result = api.infer_backend( - bucketfs_host="host", - bucketfs_port=123, - bucketfs_name="bfs", - bucket="mybucket", - bucketfs_user="user", - bucketfs_password="pw", - ) - assert result == StorageBackend.onprem - - -def test_infer_backend_saas_with_id(): - result = api.infer_backend( - saas_url="https://api", - saas_account_id="acct", - saas_database_id="dbid", - saas_token="token", - ) - assert result == StorageBackend.saas - - -def test_infer_backend_saas_with_name(): - result = api.infer_backend( - saas_url="https://api", - saas_account_id="acct", - saas_database_name="dbname", - saas_token="token", - ) - assert result == StorageBackend.saas - - -def test_infer_backend_missing_fields(): - with pytest.raises(InferBfsPathError, match="Insufficient parameters"): - api.infer_backend(bucketfs_host="host") - - -def test_infer_backend_no_fields(): - with pytest.raises(InferBfsPathError): - api.infer_backend() - - -def test_infer_path_onprem_with_ssl_ca(build_path_mock): - api.infer_path( - bucketfs_host="host", - bucketfs_port=123, - bucketfs_name="bfs", - bucket="mybucket", - bucketfs_user="user", - bucketfs_password="pw", - ssl_trusted_ca="ca_cert", - ) - assert build_path_mock.call_args == call( - backend=StorageBackend.onprem, - url="https://host:123", - username="user", - password="pw", - service_name="bfs", - bucket_name="mybucket", - verify="ca_cert", - path="", - ) - - -@pytest.fixture -def build_path_mock(monkeypatch): - mock = Mock(side_effect=build_path) - monkeypatch.setattr(api, "build_path", mock) - return mock - - -def test_infer_path_saas(build_path_mock): - api.infer_path( - saas_url="https://api", - saas_account_id="acct", - saas_database_id="dbid", - saas_token="token", - ) - assert build_path_mock.call_args == call( - backend=StorageBackend.saas, - url="https://api", - account_id="acct", - database_id="dbid", - pat="token", - path="", - ) - - -def test_infer_path_saas_without_id(build_path_mock, monkeypatch): - monkeypatch.setattr(api, "get_database_id_by_name", Mock(return_value="dbid")) - api.infer_path( - saas_url="https://api", - saas_account_id="acct", - saas_database_name="dbname", - saas_token="token", - ) - assert build_path_mock.call_args == call( - backend=StorageBackend.saas, - url="https://api", - account_id="acct", - database_id="dbid", - pat="token", - path="", - ) - - -def test_infer_path_mounted(build_path_mock): - api.infer_path(bucketfs_name="bfsdefault", bucket="default") - assert build_path_mock.call_args == call( - backend=StorageBackend.mounted, - service_name="bfsdefault", - bucket_name="default", - base_path=None, - ) - - -def test_infer_path_unsupported_backend_exception(build_path_mock): - with pytest.raises(InferBfsPathError, match="Insufficient parameters"): - api.infer_path( - saas_url="https://api", saas_account_id="acct", saas_token="token" - ) - - -def test_get_database_id_by_name(monkeypatch): - mocked_db_id = Mock(return_value="dbid") - monkeypatch.setattr(api, "get_database_id", mocked_db_id) - result = api.get_database_id_by_name( - host="https://api", - account_id="acct", - database_name="dbname", - pat="token", - ) - assert result == "dbid" - - -BUCKET_NAME = "some-bucket" -OTHER_ARGS = { - "url": "http://host:123", - "username": "user", - "password": "password", -} - - -@pytest.fixture -def mock_buckets(monkeypatch: MonkeyPatch) -> PropertyMock: - """Mock property `Service.buckets` and return the mock.""" - bucket_like = Mock(exasol.bucketfs.Bucket) - buckets_property = PropertyMock(return_value={BUCKET_NAME: bucket_like}) - monkeypatch.setattr(api.Service, "buckets", buckets_property) - return buckets_property - - -def test_verify_bucket_success(mock_buckets): - actual = api.build_path(bucket_name=BUCKET_NAME, **OTHER_ARGS) - assert mock_buckets.called - assert isinstance(actual.bucket_api, exasol.bucketfs.Bucket) - - -def test_verify_bucket_failure(mock_buckets): - with pytest.raises(api.BucketFsError, match="Bucket non-existing does not exist."): - api.build_path(bucket_name="non-existing", **OTHER_ARGS) - - -def test_no_verify(mock_buckets) -> None: - actual = api.build_path(bucket_name="any-name", verify_bucket=False, **OTHER_ARGS) - bucket = actual.bucket_api - assert not mock_buckets.called - assert isinstance(bucket, exasol.bucketfs.Bucket) - assert bucket.name == "any-name" +from typing import ( + Any, + Callable, +) +from unittest.mock import ( + Mock, + PropertyMock, + call, +) + +import pytest +from _pytest.monkeypatch import MonkeyPatch + +import exasol.bucketfs +from exasol.bucketfs import path as api +from exasol.bucketfs._error import InferBfsPathError +from exasol.bucketfs._path import StorageBackend + + +def build_path(*args, **kwargs): + return f"mocked_path_{args}_{kwargs}" + + +def test_infer_backend_onprem(): + result = api.infer_backend( + bucketfs_host="host", + bucketfs_port=123, + bucketfs_name="bfs", + bucket="mybucket", + bucketfs_user="user", + bucketfs_password="pw", + ) + assert result == StorageBackend.onprem + + +def test_infer_backend_saas_with_id(): + result = api.infer_backend( + saas_url="https://api", + saas_account_id="acct", + saas_database_id="dbid", + saas_token="token", + ) + assert result == StorageBackend.saas + + +def test_infer_backend_saas_with_name(): + result = api.infer_backend( + saas_url="https://api", + saas_account_id="acct", + saas_database_name="dbname", + saas_token="token", + ) + assert result == StorageBackend.saas + + +def test_infer_backend_missing_fields(): + with pytest.raises(InferBfsPathError, match="Insufficient parameters"): + api.infer_backend(bucketfs_host="host") + + +def test_infer_backend_no_fields(): + with pytest.raises(InferBfsPathError): + api.infer_backend() + + +def test_infer_path_onprem_with_ssl_ca(build_path_mock): + api.infer_path( + bucketfs_host="host", + bucketfs_port=123, + bucketfs_name="bfs", + bucket="mybucket", + bucketfs_user="user", + bucketfs_password="pw", + ssl_trusted_ca="ca_cert", + ) + assert build_path_mock.call_args == call( + backend=StorageBackend.onprem, + url="https://host:123", + username="user", + password="pw", + service_name="bfs", + bucket_name="mybucket", + verify="ca_cert", + path="", + ) + + +@pytest.fixture +def build_path_mock(monkeypatch): + mock = Mock(side_effect=build_path) + monkeypatch.setattr(api, "build_path", mock) + return mock + + +def test_infer_path_saas(build_path_mock): + api.infer_path( + saas_url="https://api", + saas_account_id="acct", + saas_database_id="dbid", + saas_token="token", + ) + assert build_path_mock.call_args == call( + backend=StorageBackend.saas, + url="https://api", + account_id="acct", + database_id="dbid", + pat="token", + path="", + ) + + +def test_infer_path_saas_without_id(build_path_mock, monkeypatch): + monkeypatch.setattr(api, "get_database_id_by_name", Mock(return_value="dbid")) + api.infer_path( + saas_url="https://api", + saas_account_id="acct", + saas_database_name="dbname", + saas_token="token", + ) + assert build_path_mock.call_args == call( + backend=StorageBackend.saas, + url="https://api", + account_id="acct", + database_id="dbid", + pat="token", + path="", + ) + + +def test_infer_path_mounted(build_path_mock): + api.infer_path(bucketfs_name="bfsdefault", bucket="default") + assert build_path_mock.call_args == call( + backend=StorageBackend.mounted, + service_name="bfsdefault", + bucket_name="default", + base_path=None, + ) + + +def test_infer_path_unsupported_backend_exception(build_path_mock): + with pytest.raises(InferBfsPathError, match="Insufficient parameters"): + api.infer_path( + saas_url="https://api", saas_account_id="acct", saas_token="token" + ) + + +def test_get_database_id_by_name(monkeypatch): + mocked_db_id = Mock(return_value="dbid") + monkeypatch.setattr(api, "get_database_id", mocked_db_id) + result = api.get_database_id_by_name( + host="https://api", + account_id="acct", + database_name="dbname", + pat="token", + ) + assert result == "dbid" + + +BUCKET_NAME = "some-bucket" +OTHER_ARGS = { + "url": "http://host:123", + "username": "user", + "password": "password", +} + + +@pytest.fixture +def mock_buckets(monkeypatch: MonkeyPatch) -> PropertyMock: + """Mock property `Service.buckets` and return the mock.""" + bucket_like = Mock(exasol.bucketfs.Bucket) + buckets_property = PropertyMock(return_value={BUCKET_NAME: bucket_like}) + monkeypatch.setattr(api.Service, "buckets", buckets_property) + return buckets_property + + +def test_verify_bucket_success(mock_buckets): + actual = api.build_path(bucket_name=BUCKET_NAME, **OTHER_ARGS) + assert mock_buckets.called + assert isinstance(actual.bucket_api, exasol.bucketfs.Bucket) + + +def test_verify_bucket_failure(mock_buckets): + with pytest.raises(api.BucketFsError, match="Bucket non-existing does not exist."): + api.build_path(bucket_name="non-existing", **OTHER_ARGS) + + +def test_no_verify(mock_buckets) -> None: + actual = api.build_path(bucket_name="any-name", verify_bucket=False, **OTHER_ARGS) + bucket = actual.bucket_api + assert not mock_buckets.called + assert isinstance(bucket, exasol.bucketfs.Bucket) + assert bucket.name == "any-name" From 07409ec589a497a16ece17bb6cb7bcbb53cfc011 Mon Sep 17 00:00:00 2001 From: ckunki Date: Fri, 27 Feb 2026 07:48:51 +0100 Subject: [PATCH 09/33] format:fix --- test/unit/test_path.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/test/unit/test_path.py b/test/unit/test_path.py index 3c9913d4..57517c7b 100644 --- a/test/unit/test_path.py +++ b/test/unit/test_path.py @@ -1,7 +1,3 @@ -from typing import ( - Any, - Callable, -) from unittest.mock import ( Mock, PropertyMock, From 3ef4d9a8caee2ada0f38a3f4acfda59d9aaa5974 Mon Sep 17 00:00:00 2001 From: ckunki Date: Fri, 27 Feb 2026 07:50:16 +0100 Subject: [PATCH 10/33] updated GH workflow --- .github/workflows/slow-checks.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/slow-checks.yml b/.github/workflows/slow-checks.yml index 612e8027..c72843a7 100644 --- a/.github/workflows/slow-checks.yml +++ b/.github/workflows/slow-checks.yml @@ -21,13 +21,13 @@ jobs: matrix: # ${{ fromJson(needs.build-matrix.outputs.matrix) }} include: - backend: saas - version: provided + exasol-version: provided - backend: onprem - version: "7.1.30" + exasol-version: "7.1.30" - backend: onprem - version: "8.29.13" + exasol-version: "8.29.13" - backend: onprem - version: "2025.1.8" + exasol-version: "2025.1.8" steps: - name: SCM Checkout @@ -47,12 +47,12 @@ jobs: run: > echo poetry run -- nox -s test:integration -- -s --coverage --backend=${{ matrix.backend }} - --db-version ${{ matrix.version }}; + --db-version ${{ matrix.exasol-version }}; poetry run -- nox -s test:unit -- -s --coverage - name: Upload Artifacts uses: actions/upload-artifact@v5 with: - name: coverage-slow-${{ matrix.backend }}-${{ matrix.version }} + name: coverage-slow-${{ matrix.backend }}-${{ matrix.exasol-version }} path: .coverage include-hidden-files: true From bfedb4cb36177c4010eaa32334d86a299ca41e92 Mon Sep 17 00:00:00 2001 From: ckunki Date: Fri, 27 Feb 2026 07:52:50 +0100 Subject: [PATCH 11/33] Re-established manual approval for executing slow checks --- .github/workflows/merge-gate.yml | 2 +- .github/workflows/slow-checks.yml | 15 +++------------ 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/.github/workflows/merge-gate.yml b/.github/workflows/merge-gate.yml index 2068b8ee..c39b8a96 100644 --- a/.github/workflows/merge-gate.yml +++ b/.github/workflows/merge-gate.yml @@ -27,7 +27,7 @@ jobs: slow-checks: name: Slow - # needs: [ run-slow-tests ] + needs: [ run-slow-tests ] uses: ./.github/workflows/slow-checks.yml secrets: inherit permissions: diff --git a/.github/workflows/slow-checks.yml b/.github/workflows/slow-checks.yml index c72843a7..19cce427 100644 --- a/.github/workflows/slow-checks.yml +++ b/.github/workflows/slow-checks.yml @@ -4,21 +4,14 @@ on: workflow_call: jobs: - # build-matrix: - # name: Generate Build Matrix - # uses: ./.github/workflows/matrix-all.yml - # permissions: - # contents: read - tests: name: Integration-Tests (${{ matrix.backend }}, ${{ matrix.exasol-version}}) - # needs: [ build-matrix ] runs-on: "ubuntu-24.04" permissions: contents: read strategy: fail-fast: false - matrix: # ${{ fromJson(needs.build-matrix.outputs.matrix) }} + matrix: include: - backend: saas exasol-version: provided @@ -36,7 +29,6 @@ jobs: - name: Setup Python & Poetry Environment uses: exasol/python-toolbox/.github/actions/python-environment@v4 with: - # python-version: ${{ matrix.python-version }} python-version: "3.10" # Required for test/integration/test_udf_path.py @@ -45,10 +37,9 @@ jobs: - name: Run Tests and Collect Coverage run: > - echo poetry run -- nox -s test:integration -- -s --coverage + poetry run -- nox -s test:integration -- -s --coverage --backend=${{ matrix.backend }} - --db-version ${{ matrix.exasol-version }}; - poetry run -- nox -s test:unit -- -s --coverage + --db-version ${{ matrix.exasol-version }} - name: Upload Artifacts uses: actions/upload-artifact@v5 From 208879556a77f18c721a734b0167cf4842cef7ec Mon Sep 17 00:00:00 2001 From: ckunki Date: Fri, 27 Feb 2026 08:05:28 +0100 Subject: [PATCH 12/33] Updated PTB to version >=6 and re-generated GH workflows --- .github/workflows/build-and-publish.yml | 31 +-- .github/workflows/cd.yml | 13 +- .github/workflows/check-release-tag.yml | 22 ++- .github/workflows/checks.yml | 245 ++++++++++++++---------- .github/workflows/ci.yml | 10 +- .github/workflows/gh-pages.yml | 32 ++-- .github/workflows/matrix-all.yml | 25 ++- .github/workflows/matrix-exasol.yml | 37 ++++ .github/workflows/matrix-python.yml | 25 ++- .github/workflows/merge-gate.yml | 31 ++- .github/workflows/pr-merge.yml | 11 +- .github/workflows/report.yml | 31 ++- .github/workflows/slow-checks.yml | 25 ++- noxfile.py | 25 +-- poetry.lock | 88 ++++++--- pyproject.toml | 2 +- 16 files changed, 397 insertions(+), 256 deletions(-) create mode 100644 .github/workflows/matrix-exasol.yml diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml index 62a678e6..9ba56f8d 100644 --- a/.github/workflows/build-and-publish.yml +++ b/.github/workflows/build-and-publish.yml @@ -4,35 +4,42 @@ on: workflow_call: secrets: PYPI_TOKEN: - required: true + required: true jobs: - - cd-job: - name: Continuous Delivery - runs-on: ubuntu-24.04 + build-and-publish: + name: Build & Publish + runs-on: "ubuntu-24.04" permissions: contents: write steps: - - name: SCM Checkout - uses: actions/checkout@v5 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v4 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" - name: Build Artifacts + id: build-artifacts run: poetry build - - name: PyPi Release + - name: Publish Release to PyPi + id: publish-release-to-pypi env: POETRY_HTTP_BASIC_PYPI_USERNAME: "__token__" POETRY_HTTP_BASIC_PYPI_PASSWORD: "${{ secrets.PYPI_TOKEN }}" run: poetry publish - - name: GitHub Release + - name: Publish Release to GitHub + id: publish-release-to-github env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: > + run: >- gh release create ${GITHUB_REF_NAME} --title ${GITHUB_REF_NAME} --notes-file ./doc/changes/changes_${GITHUB_REF_NAME}.md diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 1fb0e2e0..23176904 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -7,16 +7,16 @@ on: - '!v*' jobs: - - check-tag-version-job: + check-release-tag: name: Check Release Tag uses: ./.github/workflows/check-release-tag.yml permissions: contents: read - cd-job: - needs: [ check-tag-version-job ] - name: Continuous Delivery + build-and-publish: + needs: + - check-release-tag + name: Build & Publish uses: ./.github/workflows/build-and-publish.yml permissions: contents: write @@ -24,7 +24,8 @@ jobs: PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} publish-docs: - needs: [ cd-job ] + needs: + - build-and-publish name: Publish Documentation uses: ./.github/workflows/gh-pages.yml permissions: diff --git a/.github/workflows/check-release-tag.yml b/.github/workflows/check-release-tag.yml index cb6585ad..5423c11a 100644 --- a/.github/workflows/check-release-tag.yml +++ b/.github/workflows/check-release-tag.yml @@ -5,18 +5,24 @@ on: jobs: - check-tag-version-job: - name: Check Tag Version - runs-on: ubuntu-24.04 + check-release-tag: + name: Check Release Tag + runs-on: "ubuntu-24.04" permissions: contents: read steps: - - name: SCM Checkout - uses: actions/checkout@v5 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v4 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" - - name: Check Tag Version + - name: Check Release Tag + id: check-release-tag # make sure the pushed/created tag matched the project version run: "[[ `poetry version --short` == ${{ github.ref_name }} ]]" diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 0f767614..2941275a 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -4,203 +4,242 @@ on: workflow_call: jobs: - Version-Check: - name: Version - runs-on: ubuntu-24.04 + check-version: + name: Check Version + runs-on: "ubuntu-24.04" permissions: contents: read steps: - - name: SCM Checkout - uses: actions/checkout@v5 - with: - fetch-depth: 0 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v4 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" - - name: Check Version(s) + - name: Check Version + id: check-version run: poetry run -- nox -s version:check - Documentation: + build-documentation-and-check-links: name: Docs - needs: [ Version-Check ] - runs-on: ubuntu-24.04 + runs-on: "ubuntu-24.04" permissions: contents: read steps: - - name: SCM Checkout - uses: actions/checkout@v5 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v4 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" - name: Build Documentation - run: | - poetry run -- nox -s docs:build + id: build-documentation + run: poetry run -- nox -s docs:build - - name: Link Check - run: | - poetry run -- nox -s links:check - - build-matrix: - name: Generate Build Matrix - uses: ./.github/workflows/matrix-python.yml - permissions: - contents: read + - name: Check Links + id: check-links + run: poetry run -- nox -s links:check - Changelog: - name: Changelog Update Check - runs-on: ubuntu-24.04 + check-changelog-was-updated: + name: Check Changelog was Updated + runs-on: "ubuntu-24.04" permissions: contents: read if: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/master' }} steps: - - name: SCM Checkout - uses: actions/checkout@v5 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v4 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" - - name: Run changelog update check + - name: Check Changelog was Updated + id: check-changelog-was-updated run: poetry run -- nox -s changelog:updated - Lint: - name: Linting (Python-${{ matrix.python-version }}) - needs: [ Version-Check, build-matrix ] - runs-on: ubuntu-24.04 + lint-code: + name: Lint Code (Python-${{ matrix.python-versions }}) + runs-on: "ubuntu-24.04" permissions: contents: read strategy: fail-fast: false - matrix: ${{ fromJson(needs.build-matrix.outputs.matrix) }} + matrix: + python-versions: ["3.10", "3.11", "3.12", "3.13"] steps: - - name: SCM Checkout - uses: actions/checkout@v5 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v4 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 with: - python-version: ${{ matrix.python-version }} + python-version: ${{ matrix.python-versions }} + poetry-version: "2.3.0" - - name: Run lint + - name: Lint Code + id: lint-code run: poetry run -- nox -s lint:code - name: Upload Artifacts - uses: actions/upload-artifact@v5 + id: upload-artifacts + uses: actions/upload-artifact@v6 with: - name: lint-python${{ matrix.python-version }} + name: lint-python${{ matrix.python-versions }} path: | .lint.txt .lint.json include-hidden-files: true - Type-Check: - name: Type Checking (Python-${{ matrix.python-version }}) - needs: [ Version-Check, build-matrix ] - runs-on: ubuntu-24.04 + lint-typing: + name: Lint Typing (Python-${{ matrix.python-versions }}) + runs-on: "ubuntu-24.04" permissions: contents: read strategy: fail-fast: false - matrix: ${{ fromJson(needs.build-matrix.outputs.matrix) }} + matrix: + python-versions: ["3.10", "3.11", "3.12", "3.13"] steps: - - name: SCM Checkout - uses: actions/checkout@v5 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v4 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 with: - python-version: ${{ matrix.python-version }} + python-version: ${{ matrix.python-versions }} + poetry-version: "2.3.0" - - name: Run type-check + - name: Lint Typing + id: lint-typing run: poetry run -- nox -s lint:typing - Security: - name: Security Checks (Python-${{ matrix.python-version }}) - needs: [ Version-Check, build-matrix ] - runs-on: ubuntu-24.04 + audit-security: + name: Audit Security (Python-${{ matrix.python-versions }}) + runs-on: "ubuntu-24.04" permissions: contents: read strategy: fail-fast: false - matrix: ${{ fromJson(needs.build-matrix.outputs.matrix) }} + matrix: + python-versions: ["3.10", "3.11", "3.12", "3.13"] steps: - - name: SCM Checkout - uses: actions/checkout@v5 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v4 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 with: - python-version: ${{ matrix.python-version }} + python-version: ${{ matrix.python-versions }} + poetry-version: "2.3.0" - - name: Run security linter + - name: Audit Security + id: audit-security run: poetry run -- nox -s lint:security - name: Upload Artifacts - uses: actions/upload-artifact@v5 + id: upload-artifacts + uses: actions/upload-artifact@v6 with: - name: security-python${{ matrix.python-version }} + name: security-python${{ matrix.python-versions }} path: .security.json include-hidden-files: true - Format: - name: Format Check - runs-on: ubuntu-24.04 + check-format: + name: Check Format + runs-on: "ubuntu-24.04" permissions: contents: read steps: - - name: SCM Checkout - uses: actions/checkout@v5 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v4 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" - - name: Run format check + - name: Check Format + id: check-format run: poetry run -- nox -s format:check - Build-Packages: - name: Build Package Check - needs: [ Documentation, Lint, Type-Check, Security, Format ] - runs-on: ubuntu-24.04 + + build-package: + name: Build Package + runs-on: "ubuntu-24.04" permissions: contents: read steps: - - name: SCM Checkout - uses: actions/checkout@v5 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v4 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" - - name: Run Distribution Check + - name: Build Package + id: build-package run: poetry run -- nox -s package:check - Tests: - name: Unit-Tests (Python-${{ matrix.python-version }}) - needs: [ Build-Packages, build-matrix ] - runs-on: ubuntu-24.04 + run-unit-tests: + name: Run Unit Tests (Python-${{ matrix.python-versions }}) + runs-on: "ubuntu-24.04" permissions: contents: read strategy: fail-fast: false - matrix: ${{ fromJson(needs.build-matrix.outputs.matrix) }} + matrix: + python-versions: ["3.10", "3.11", "3.12", "3.13"] steps: - - name: SCM Checkout - uses: actions/checkout@v5 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v4 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 with: - python-version: ${{ matrix.python-version }} + python-version: ${{ matrix.python-versions }} + poetry-version: "2.3.0" - - name: Run Tests and Collect Coverage + - name: Run Unit Tests + id: run-unit-tests run: poetry run -- nox -s test:unit -- --coverage - name: Upload Artifacts - uses: actions/upload-artifact@v5 + id: upload-artifacts + uses: actions/upload-artifact@v6 with: - name: coverage-python${{ matrix.python-version }}-fast + name: coverage-python${{ matrix.python-versions }}-fast path: .coverage include-hidden-files: true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d7f0a0f3..b529c2b0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,21 +2,21 @@ name: CI on: pull_request: - types: [opened, synchronize, reopened] + types: [opened, synchronize, reopened] schedule: # At 00:00 on every 7th day-of-month from 1 through 31. (https://crontab.guru) - cron: "0 0 1/7 * *" jobs: - - CI: + merge-gate: uses: ./.github/workflows/merge-gate.yml secrets: inherit permissions: contents: read - Metrics: - needs: [ CI ] + report: + needs: + - merge-gate uses: ./.github/workflows/report.yml secrets: inherit permissions: diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index 99788b3e..5616ebd5 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -7,30 +7,38 @@ on: jobs: build-documentation: - runs-on: ubuntu-24.04 + runs-on: "ubuntu-24.04" permissions: contents: read steps: - - name: SCM Checkout - uses: actions/checkout@v5 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 with: fetch-depth: 0 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v4 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" - name: Build Documentation + id: build-documentation run: | poetry run -- nox -s docs:multiversion - rm -r .html-documentation/*/.doctrees + mv .html-documentation html-documentation - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 + - name: Upload Artifact + id: upload-artifact + uses: actions/upload-pages-artifact@v4 with: - path: .html-documentation + path: html-documentation deploy-documentation: - needs: [ build-documentation ] + needs: + - build-documentation permissions: contents: read pages: write @@ -38,8 +46,8 @@ jobs: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-24.04 + runs-on: "ubuntu-24.04" steps: - name: Deploy to GitHub Pages - id: deployment + id: deploy-to-github-pages uses: actions/deploy-pages@v4 diff --git a/.github/workflows/matrix-all.yml b/.github/workflows/matrix-all.yml index bfd34e60..69a5aa4b 100644 --- a/.github/workflows/matrix-all.yml +++ b/.github/workflows/matrix-all.yml @@ -5,24 +5,31 @@ on: outputs: matrix: description: "Generates the all versions build matrix" - value: ${{ jobs.all_versions.outputs.matrix }} + value: ${{ jobs.set-matrix-all.outputs.matrix }} jobs: - all_versions: - runs-on: ubuntu-24.04 + set-matrix-all: + runs-on: "ubuntu-24.04" permissions: contents: read steps: - - name: SCM Checkout - uses: actions/checkout@v5 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v4 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" - - name: Generate matrix + - name: Generate Matrix + id: generate-matrix run: poetry run -- nox -s matrix:all - - id: set-matrix + - name: Set Matrix + id: set-matrix run: | echo "matrix=$(poetry run -- nox -s matrix:all)" >> $GITHUB_OUTPUT diff --git a/.github/workflows/matrix-exasol.yml b/.github/workflows/matrix-exasol.yml new file mode 100644 index 00000000..44b5cfd9 --- /dev/null +++ b/.github/workflows/matrix-exasol.yml @@ -0,0 +1,37 @@ +name: Build Matrix (Exasol) + +on: + workflow_call: + outputs: + matrix: + description: "Generates the exasol version build matrix" + value: ${{ jobs.set-matrix-exasol.outputs.matrix }} + +jobs: + set-matrix-exasol: + runs-on: "ubuntu-24.04" + permissions: + contents: read + steps: + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 + + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" + + - name: Generate Matrix + id: generate-matrix + run: poetry run -- nox -s matrix:exasol + + - name: Set Matrix + id: set-matrix + run: | + echo "matrix=$(poetry run -- nox -s matrix:exasol)" >> $GITHUB_OUTPUT + + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} diff --git a/.github/workflows/matrix-python.yml b/.github/workflows/matrix-python.yml index 8d4fe663..328799b6 100644 --- a/.github/workflows/matrix-python.yml +++ b/.github/workflows/matrix-python.yml @@ -5,24 +5,31 @@ on: outputs: matrix: description: "Generates the python version build matrix" - value: ${{ jobs.python_versions.outputs.matrix }} + value: ${{ jobs.set-matrix-python.outputs.matrix }} jobs: - python_versions: - runs-on: ubuntu-24.04 + set-matrix-python: + runs-on: "ubuntu-24.04" permissions: contents: read steps: - - name: SCM Checkout - uses: actions/checkout@v5 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v4 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" - - name: Generate matrix + - name: Generate Matrix + id: generate-matrix run: poetry run -- nox -s matrix:python - - id: set-matrix + - name: Set Matrix + id: set-matrix run: | echo "matrix=$(poetry run -- nox -s matrix:python)" >> $GITHUB_OUTPUT diff --git a/.github/workflows/merge-gate.yml b/.github/workflows/merge-gate.yml index c39b8a96..46753e3e 100644 --- a/.github/workflows/merge-gate.yml +++ b/.github/workflows/merge-gate.yml @@ -4,19 +4,17 @@ on: workflow_call: jobs: - - fast-checks: - name: Fast + run-fast-checks: + name: Run Fast Checks uses: ./.github/workflows/checks.yml permissions: contents: read - run-slow-tests: - name: Run Slow Tests? - runs-on: ubuntu-24.04 + approve-run-slow-tests: + name: Approve Running Slow Tests? + runs-on: "ubuntu-24.04" permissions: contents: read - # Even though the environment "manual-approval" will be created automatically, # it still needs to be configured to require interactive review. # See project settings on GitHub (Settings / Environments / manual-approval). @@ -25,25 +23,26 @@ jobs: - name: Tests run: echo "Slow tests approved" - slow-checks: - name: Slow - needs: [ run-slow-tests ] + run-slow-checks: + name: Run Slow Checks + needs: + - approve-run-slow-tests uses: ./.github/workflows/slow-checks.yml secrets: inherit permissions: contents: read # This job ensures inputs have been executed successfully. - approve-merge: + allow-merge: name: Allow Merge - runs-on: ubuntu-24.04 + runs-on: "ubuntu-24.04" permissions: contents: read # If you need additional jobs to be part of the merge gate, add them below - needs: [ fast-checks, slow-checks ] - + needs: + - run-fast-checks + - run-slow-checks # Each job requires a step, so we added this dummy step. steps: - name: Approve - run: | - echo "Merge Approved" + run: echo "Merge Approved" diff --git a/.github/workflows/pr-merge.yml b/.github/workflows/pr-merge.yml index a95cee5c..482647ee 100644 --- a/.github/workflows/pr-merge.yml +++ b/.github/workflows/pr-merge.yml @@ -7,12 +7,10 @@ on: - 'master' jobs: - # This job can be removed if certain preconditions are met. See # https://exasol.github.io/python-toolbox/user_guide/workflows.html#pr-merge-workflow - - ci-job: - name: Checks + run-fast-checks: + name: Run Fast Checks uses: ./.github/workflows/checks.yml permissions: contents: read @@ -25,8 +23,9 @@ jobs: pages: write id-token: write - metrics: - needs: [ ci-job ] + report: + needs: + - run-fast-checks uses: ./.github/workflows/report.yml secrets: inherit permissions: diff --git a/.github/workflows/report.yml b/.github/workflows/report.yml index 8e2828ad..7748487f 100644 --- a/.github/workflows/report.yml +++ b/.github/workflows/report.yml @@ -6,48 +6,59 @@ on: jobs: report: - runs-on: ubuntu-24.04 + runs-on: "ubuntu-24.04" permissions: contents: read env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - steps: - - name: SCM Checkout - uses: actions/checkout@v5 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 with: fetch-depth: 0 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v4 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" - name: Download Artifacts - uses: actions/download-artifact@v6 + id: download-artifacts + uses: actions/download-artifact@v7 with: path: ./artifacts - name: Copy Artifacts into Root Folder + id: copy-artifacts-into-root-folder run: poetry run -- nox -s artifacts:copy -- artifacts - name: Validate Artifacts + id: validate-artifacts run: poetry run -- nox -s artifacts:validate - - name: Upload to sonar + - name: Upload to Sonar + id: upload-to-sonar env: SONAR_TOKEN: "${{ secrets.SONAR_TOKEN }}" run: poetry run -- nox -s sonar:check - name: Generate Report + id: generate-report run: poetry run -- nox -s project:report -- --format json | tee metrics.json - name: Upload Artifacts - uses: actions/upload-artifact@v5 + id: upload-artifacts + uses: actions/upload-artifact@v6 with: name: metrics.json path: metrics.json - name: Generate GitHub Summary - run: | + id: generate-github-summary + run: |- echo -e "# Summary\n" >> $GITHUB_STEP_SUMMARY poetry run -- nox -s project:report -- --format markdown >> $GITHUB_STEP_SUMMARY poetry run -- nox -s dependency:licenses >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/slow-checks.yml b/.github/workflows/slow-checks.yml index 19cce427..21aa11dc 100644 --- a/.github/workflows/slow-checks.yml +++ b/.github/workflows/slow-checks.yml @@ -23,26 +23,31 @@ jobs: exasol-version: "2025.1.8" steps: - - name: SCM Checkout - uses: actions/checkout@v5 - - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v4 - with: - python-version: "3.10" - # Required for test/integration/test_udf_path.py - name: Allow unprivileged user namespaces run: sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 - - name: Run Tests and Collect Coverage + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 + + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: ${{ matrix.python-version }} + poetry-version: "2.3.0" + + - name: Run Integration Tests + id: run-integration-tests run: > poetry run -- nox -s test:integration -- -s --coverage --backend=${{ matrix.backend }} --db-version ${{ matrix.exasol-version }} - name: Upload Artifacts - uses: actions/upload-artifact@v5 + id: upload-artifacts + uses: actions/upload-artifact@v6 with: name: coverage-slow-${{ matrix.backend }}-${{ matrix.exasol-version }} path: .coverage diff --git a/noxfile.py b/noxfile.py index ef9fb2d7..381eb193 100644 --- a/noxfile.py +++ b/noxfile.py @@ -1,30 +1,7 @@ import nox # imports all nox task provided by the toolbox -from exasol.toolbox.nox.tasks import * - -from noxconfig import PROJECT_CONFIG +from exasol.toolbox.nox.tasks import * # noqa: F403 # default actions to be run if nothing is explicitly specified with the -s option nox.options.sessions = ["format:fix"] - - -def _coverage(session, config, context) -> None: - # Overrides default implementation of PTB - # in order to only run unit tests for coverage - from exasol.toolbox.nox._test import _unit_tests - - command = ["poetry", "run", "coverage", "report", "-m"] - coverage_file = config.root / ".coverage" - coverage_file.unlink(missing_ok=True) - _unit_tests(session, config, context) - session.run(*command) - - -@nox.session(name="test:coverage", python=False) -def coverage(session) -> None: - from exasol.toolbox.nox._shared import _context - - """Runs all tests (unit + integration) and reports the code coverage""" - context = _context(session, coverage=True) - _coverage(session, PROJECT_CONFIG, context) diff --git a/poetry.lock b/poetry.lock index dd2e2570..8c6a3bde 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.3.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.3.0 and should not be changed by hand. [[package]] name = "accessible-pygments" @@ -1182,45 +1182,48 @@ types-requests = ">=2.31.0.6,<3.0.0.0" [[package]] name = "exasol-toolbox" -version = "4.0.0" +version = "6.0.0" description = "Your one-stop solution for managing all standard tasks and core workflows of your Python project." optional = false python-versions = "<4.0,>=3.10" groups = ["dev"] files = [ - {file = "exasol_toolbox-4.0.0-py3-none-any.whl", hash = "sha256:5411bff719327dde894e64dc545c2d27131f8592d5f6cbc2642a0474cceec856"}, - {file = "exasol_toolbox-4.0.0.tar.gz", hash = "sha256:742743bf4a88e1be7240b2eec98bc7c65a7630b2c4cb59d39d68d42a85bae675"}, + {file = "exasol_toolbox-6.0.0-py3-none-any.whl", hash = "sha256:327a743938fb4fd78701068480ed5bda9f466b434de769a251f6294647e3ec92"}, + {file = "exasol_toolbox-6.0.0.tar.gz", hash = "sha256:cac9f5b847feaf53a3808f14ba2ebc03a533865aa3c1ea7754c14c001e8945e5"}, ] [package.dependencies] -bandit = {version = ">=1.7.9,<2.0.0", extras = ["toml"]} +bandit = {version = ">=1.7.9,<2", extras = ["toml"]} black = ">=24.1.0,<26" coverage = ">=6.4.4,<8.0.0" furo = ">=2022.9.15" -import-linter = ">=2.0,<3.0" +import-linter = ">=2.0,<3" importlib-resources = ">=5.12.0" -isort = ">=7.0.0,<8.0.0" -jinja2 = ">=3.1.6,<4.0.0" +isort = ">=7.0.0,<8" +jinja2 = ">=3.1.6,<4" mypy = ">=0.971" myst-parser = ">=2.0.0,<4" nox = ">=2022.8.7" -pip-audit = ">=2.7.3,<3.0.0" -pip-licenses = ">=5.0.0,<6.0.0" -pluggy = ">=1.5.0,<2.0.0" +pip-audit = ">=2.7.3,<3" +pip-licenses = ">=5.0.0,<6" +pluggy = ">=1.5.0,<2" pre-commit = ">=4,<5" -pydantic = ">=2.11.5,<3.0.0" +pydantic = ">=2.11.5,<3" pylint = ">=2.15.4" -pysonar = ">=1.0.1.1548,<2.0.0.0" +pysonar = ">=1.0.1.1548,<2" pytest = ">=7.2.2,<10" pyupgrade = ">=2.38.2,<4.0.0" -ruff = ">=0.14.5,<0.15.0" +ruamel-yaml = ">=0.18.0,<=0.18.16" +ruff = ">=0.14.5,<0.15" shibuya = ">=2024.5.14" sphinx = ">=5.3,<8" -sphinx-copybutton = ">=0.5.0,<0.6.0" +sphinx-copybutton = ">=0.5.0,<0.6" sphinx-design = ">=0.5.0,<1" -sphinx-inline-tabs = ">=2023.4.21,<2024.0.0" -sphinx-toolbox = ">=4.0.0,<5.0.0" -twine = ">=6.1.0,<7.0.0" +sphinx-inline-tabs = ">=2023.4.21,<2024" +sphinx-toolbox = ">=4.0.0,<5" +sphinxcontrib-mermaid = ">=2.0.0,<3.0.0" +structlog = ">=25.5.0,<26.0.0" +twine = ">=6.1.0,<7" typer = {version = ">=0.7.0", extras = ["all"]} [[package]] @@ -3915,18 +3918,18 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruamel-yaml" -version = "0.18.17" +version = "0.18.16" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "ruamel_yaml-0.18.17-py3-none-any.whl", hash = "sha256:9c8ba9eb3e793efdf924b60d521820869d5bf0cb9c6f1b82d82de8295e290b9d"}, - {file = "ruamel_yaml-0.18.17.tar.gz", hash = "sha256:9091cd6e2d93a3a4b157ddb8fabf348c3de7f1fb1381346d985b6b247dcd8d3c"}, + {file = "ruamel.yaml-0.18.16-py3-none-any.whl", hash = "sha256:048f26d64245bae57a4f9ef6feb5b552a386830ef7a826f235ffb804c59efbba"}, + {file = "ruamel.yaml-0.18.16.tar.gz", hash = "sha256:a6e587512f3c998b2225d68aa1f35111c29fad14aed561a26e73fab729ec5e5a"}, ] [package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.2.15", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.15\""} +"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.14\""} [package.extras] docs = ["mercurial (>5.7)", "ryd"] @@ -3939,7 +3942,7 @@ description = "C version of reader, parser and emitter for ruamel.yaml derived f optional = false python-versions = ">=3.9" groups = ["dev"] -markers = "python_version < \"3.15\" and platform_python_implementation == \"CPython\"" +markers = "python_version < \"3.14\" and platform_python_implementation == \"CPython\"" files = [ {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88eea8baf72f0ccf232c22124d122a7f26e8a24110a0273d9bcddcb0f7e1fa03"}, {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b6f7d74d094d1f3a4e157278da97752f16ee230080ae331fcc219056ca54f77"}, @@ -4577,6 +4580,26 @@ files = [ [package.extras] test = ["flake8", "mypy", "pytest"] +[[package]] +name = "sphinxcontrib-mermaid" +version = "2.0.0" +description = "Mermaid diagrams in your Sphinx-powered docs" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "sphinxcontrib_mermaid-2.0.0-py3-none-any.whl", hash = "sha256:59a73249bbee2c74b1a4db036f8e8899ade65982bdda6712cf22b4f4e9874bb5"}, + {file = "sphinxcontrib_mermaid-2.0.0.tar.gz", hash = "sha256:cf4f7d453d001132eaba5d1fdf53d42049f02e913213cf8337427483bfca26f4"}, +] + +[package.dependencies] +jinja2 = "*" +pyyaml = "*" +sphinx = "*" + +[package.extras] +test = ["defusedxml", "myst-parser", "pytest", "ruff", "sphinx"] + [[package]] name = "sphinxcontrib-qthelp" version = "2.0.0" @@ -4648,6 +4671,21 @@ files = [ {file = "stopwatch.py-2.0.1.tar.gz", hash = "sha256:8cc94ba0f6469d434eabd8b227166e595fd42350e7f66dbf1a1a80697f60cc79"}, ] +[[package]] +name = "structlog" +version = "25.5.0" +description = "Structured Logging for Python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "structlog-25.5.0-py3-none-any.whl", hash = "sha256:a8453e9b9e636ec59bd9e79bbd4a72f025981b3ba0f5837aebf48f02f37a7f9f"}, + {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.9.0" @@ -5133,4 +5171,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<4.0" -content-hash = "70ab1447805da4412f4198f444beab7d430985983232596f00f988788f806496" +content-hash = "e97bbafecac5157e577b812e4efe1fa32149aa9d1c7baf395d24e30c5bbcf8a7" diff --git a/pyproject.toml b/pyproject.toml index 7551e2ef..9071badd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,7 +42,7 @@ dill = "^0.3.4" exasol-udf-mock-python = ">=0.2.0" toml = ">=0.10.2" sphinx-copybutton = "^0.5.0" -exasol-toolbox = "^4.0.0" +exasol-toolbox = ">=6, <7" pytest-localserver = "^0.8.1" pytest-exasol-backend = ">=1.0.0,<2" From 802c52292ece58d0b56f8073f81d84ec246abd0c Mon Sep 17 00:00:00 2001 From: ckunki Date: Fri, 27 Feb 2026 08:32:30 +0100 Subject: [PATCH 13/33] poetry update pytest-exasol-backend --- poetry.lock | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8c6a3bde..3504f78a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1166,6 +1166,7 @@ description = "API enabling Python applications connecting to Exasol database Sa optional = false python-versions = "<4.0,>=3.10.0" groups = ["main", "dev"] +markers = "python_version >= \"3.12\"" files = [ {file = "exasol_saas_api-2.6.0-py3-none-any.whl", hash = "sha256:6518cf571fed74044cd67972cf24c36cf108170315f731950e59db0e2d4f3307"}, {file = "exasol_saas_api-2.6.0.tar.gz", hash = "sha256:43ae4eb076f4f402610daee024473bfcb631fc5f31a233b6f54173b750fb2ee1"}, @@ -1180,6 +1181,28 @@ requests = ">=2.32.4,<3.0.0" tenacity = ">=8.2.3,<9.0.0" types-requests = ">=2.31.0.6,<3.0.0.0" +[[package]] +name = "exasol-saas-api" +version = "2.8.0" +description = "API enabling Python applications connecting to Exasol database SaaS instances and using their SaaS services" +optional = false +python-versions = "<4.0,>=3.10.0" +groups = ["main", "dev"] +markers = "python_version < \"3.12\"" +files = [ + {file = "exasol_saas_api-2.8.0-py3-none-any.whl", hash = "sha256:fa2628e7d058f0a378d880c55ec36155507c326daa013ee33ec2d75773290998"}, + {file = "exasol_saas_api-2.8.0.tar.gz", hash = "sha256:7cc31f01737749f464b9032d14631a5e4189f006021197a201b1786740ead238"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +httpx = ">=0.23.0" +ifaddr = ">=0.2.0,<0.3.0" +python-dateutil = ">=2.8.0,<3.0.0" +requests = ">=2.32.4,<3.0.0" +tenacity = ">=8.2.3,<9.0.0" +types-requests = ">=2.31.0.6,<3.0.0.0" + [[package]] name = "exasol-toolbox" version = "6.0.0" @@ -3538,20 +3561,20 @@ pytest = ">=7,<9" [[package]] name = "pytest-exasol-backend" -version = "1.2.4" +version = "1.3.0" description = "" optional = false python-versions = "<3.14,>=3.10" groups = ["dev"] markers = "python_version < \"3.12\"" files = [ - {file = "pytest_exasol_backend-1.2.4-py3-none-any.whl", hash = "sha256:f7fde35be9cea11369a2c249a431f697ecae64276e3ad4764f4140fe5bb2e6e4"}, - {file = "pytest_exasol_backend-1.2.4.tar.gz", hash = "sha256:ea8680a0fe7cc45626159a451da386ef7c6b90b19ad8c707e86cb7102b08de23"}, + {file = "pytest_exasol_backend-1.3.0-py3-none-any.whl", hash = "sha256:cd38f3061cb101d22376c64ba712058b0171d954999bc546a59767c38be760d0"}, + {file = "pytest_exasol_backend-1.3.0.tar.gz", hash = "sha256:d24544c6a9e25c2e3e4ca45bba412654a0a012e43bf6f4e93edd96d05b493e91"}, ] [package.dependencies] -exasol-integration-test-docker-environment = ">=4.3,<6" -exasol-saas-api = ">=2.3,<3" +exasol-integration-test-docker-environment = ">=4.3,<7" +exasol-saas-api = ">=2.8,<3" pytest = ">=7,<9" [[package]] From 24572bebcc503119d93ea2c36ace5d846aa829e5 Mon Sep 17 00:00:00 2001 From: ckunki Date: Fri, 27 Feb 2026 08:39:18 +0100 Subject: [PATCH 14/33] poetry update --- poetry.lock | 1406 ++++++++++++++++++++++++++---------------------- pyproject.toml | 2 +- 2 files changed, 770 insertions(+), 638 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3504f78a..be930cd4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -31,6 +31,18 @@ files = [ {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, ] +[[package]] +name = "annotated-doc" +version = "0.0.4" +description = "Document parameters, class attributes, return types, and variables inline, with Annotated." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320"}, + {file = "annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4"}, +] + [[package]] name = "annotated-types" version = "0.7.0" @@ -45,14 +57,14 @@ files = [ [[package]] name = "anyio" -version = "4.12.0" +version = "4.12.1" description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "anyio-4.12.0-py3-none-any.whl", hash = "sha256:dad2376a628f98eeca4881fc56cd06affd18f659b17a747d3ff0307ced94b1bb"}, - {file = "anyio-4.12.0.tar.gz", hash = "sha256:73c693b567b0c55130c104d0b43a9baf3aa6a31fc6110116509f27bf75e21ec0"}, + {file = "anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c"}, + {file = "anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703"}, ] [package.dependencies] @@ -118,14 +130,14 @@ test = ["coverage", "mypy", "pexpect", "ruff", "wheel"] [[package]] name = "astroid" -version = "4.0.2" +version = "4.0.4" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.10.0" groups = ["dev"] files = [ - {file = "astroid-4.0.2-py3-none-any.whl", hash = "sha256:d7546c00a12efc32650b19a2bb66a153883185d3179ab0d4868086f807338b9b"}, - {file = "astroid-4.0.2.tar.gz", hash = "sha256:ac8fb7ca1c08eb9afec91ccc23edbd8ac73bb22cbdd7da1d488d9fb8d6579070"}, + {file = "astroid-4.0.4-py3-none-any.whl", hash = "sha256:52f39653876c7dec3e3afd4c2696920e05c83832b9737afc21928f2d2eb7a753"}, + {file = "astroid-4.0.4.tar.gz", hash = "sha256:986fed8bcf79fb82c78b18a53352a0b287a73817d6dbcfba3162da36667c49a0"}, ] [package.dependencies] @@ -160,14 +172,14 @@ Sphinx = ">=4.0,<9.0" [[package]] name = "babel" -version = "2.17.0" +version = "2.18.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"}, - {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"}, + {file = "babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35"}, + {file = "babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d"}, ] [package.extras] @@ -192,14 +204,14 @@ testing = ["jaraco.test", "pytest (!=8.0.*)", "pytest (>=6,!=8.1.*)", "pytest-ch [[package]] name = "bandit" -version = "1.9.2" +version = "1.9.4" description = "Security oriented static analyser for python code." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "bandit-1.9.2-py3-none-any.whl", hash = "sha256:bda8d68610fc33a6e10b7a8f1d61d92c8f6c004051d5e946406be1fb1b16a868"}, - {file = "bandit-1.9.2.tar.gz", hash = "sha256:32410415cd93bf9c8b91972159d5cf1e7f063a9146d70345641cd3877de348ce"}, + {file = "bandit-1.9.4-py3-none-any.whl", hash = "sha256:f89ffa663767f5a0585ea075f01020207e966a9c0f2b9ef56a57c7963a3f6f8e"}, + {file = "bandit-1.9.4.tar.gz", hash = "sha256:b589e5de2afe70bd4d53fa0c1da6199f4085af666fde00e8a034f152a52cd628"}, ] [package.dependencies] @@ -411,14 +423,14 @@ redis = ["redis (>=2.10.5)"] [[package]] name = "certifi" -version = "2025.11.12" +version = "2026.2.25" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" groups = ["main", "dev"] files = [ - {file = "certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b"}, - {file = "certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316"}, + {file = "certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa"}, + {file = "certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7"}, ] [[package]] @@ -702,104 +714,118 @@ development = ["black", "flake8", "mypy", "pytest", "types-colorama"] [[package]] name = "coverage" -version = "7.13.0" +version = "7.13.4" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "coverage-7.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:02d9fb9eccd48f6843c98a37bd6817462f130b86da8660461e8f5e54d4c06070"}, - {file = "coverage-7.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:367449cf07d33dc216c083f2036bb7d976c6e4903ab31be400ad74ad9f85ce98"}, - {file = "coverage-7.13.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cdb3c9f8fef0a954c632f64328a3935988d33a6604ce4bf67ec3e39670f12ae5"}, - {file = "coverage-7.13.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d10fd186aac2316f9bbb46ef91977f9d394ded67050ad6d84d94ed6ea2e8e54e"}, - {file = "coverage-7.13.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f88ae3e69df2ab62fb0bc5219a597cb890ba5c438190ffa87490b315190bb33"}, - {file = "coverage-7.13.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c4be718e51e86f553bcf515305a158a1cd180d23b72f07ae76d6017c3cc5d791"}, - {file = "coverage-7.13.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a00d3a393207ae12f7c49bb1c113190883b500f48979abb118d8b72b8c95c032"}, - {file = "coverage-7.13.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a7b1cd820e1b6116f92c6128f1188e7afe421c7e1b35fa9836b11444e53ebd9"}, - {file = "coverage-7.13.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:37eee4e552a65866f15dedd917d5e5f3d59805994260720821e2c1b51ac3248f"}, - {file = "coverage-7.13.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:62d7c4f13102148c78d7353c6052af6d899a7f6df66a32bddcc0c0eb7c5326f8"}, - {file = "coverage-7.13.0-cp310-cp310-win32.whl", hash = "sha256:24e4e56304fdb56f96f80eabf840eab043b3afea9348b88be680ec5986780a0f"}, - {file = "coverage-7.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:74c136e4093627cf04b26a35dab8cbfc9b37c647f0502fc313376e11726ba303"}, - {file = "coverage-7.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0dfa3855031070058add1a59fdfda0192fd3e8f97e7c81de0596c145dea51820"}, - {file = "coverage-7.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4fdb6f54f38e334db97f72fa0c701e66d8479af0bc3f9bfb5b90f1c30f54500f"}, - {file = "coverage-7.13.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7e442c013447d1d8d195be62852270b78b6e255b79b8675bad8479641e21fd96"}, - {file = "coverage-7.13.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ed5630d946859de835a85e9a43b721123a8a44ec26e2830b296d478c7fd4259"}, - {file = "coverage-7.13.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f15a931a668e58087bc39d05d2b4bf4b14ff2875b49c994bbdb1c2217a8daeb"}, - {file = "coverage-7.13.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:30a3a201a127ea57f7e14ba43c93c9c4be8b7d17a26e03bb49e6966d019eede9"}, - {file = "coverage-7.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a485ff48fbd231efa32d58f479befce52dcb6bfb2a88bb7bf9a0b89b1bc8030"}, - {file = "coverage-7.13.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:22486cdafba4f9e471c816a2a5745337742a617fef68e890d8baf9f3036d7833"}, - {file = "coverage-7.13.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:263c3dbccc78e2e331e59e90115941b5f53e85cfcc6b3b2fbff1fd4e3d2c6ea8"}, - {file = "coverage-7.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e5330fa0cc1f5c3c4c3bb8e101b742025933e7848989370a1d4c8c5e401ea753"}, - {file = "coverage-7.13.0-cp311-cp311-win32.whl", hash = "sha256:0f4872f5d6c54419c94c25dd6ae1d015deeb337d06e448cd890a1e89a8ee7f3b"}, - {file = "coverage-7.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51a202e0f80f241ccb68e3e26e19ab5b3bf0f813314f2c967642f13ebcf1ddfe"}, - {file = "coverage-7.13.0-cp311-cp311-win_arm64.whl", hash = "sha256:d2a9d7f1c11487b1c69367ab3ac2d81b9b3721f097aa409a3191c3e90f8f3dd7"}, - {file = "coverage-7.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0b3d67d31383c4c68e19a88e28fc4c2e29517580f1b0ebec4a069d502ce1e0bf"}, - {file = "coverage-7.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:581f086833d24a22c89ae0fe2142cfaa1c92c930adf637ddf122d55083fb5a0f"}, - {file = "coverage-7.13.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0a3a30f0e257df382f5f9534d4ce3d4cf06eafaf5192beb1a7bd066cb10e78fb"}, - {file = "coverage-7.13.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:583221913fbc8f53b88c42e8dbb8fca1d0f2e597cb190ce45916662b8b9d9621"}, - {file = "coverage-7.13.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f5d9bd30756fff3e7216491a0d6d520c448d5124d3d8e8f56446d6412499e74"}, - {file = "coverage-7.13.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a23e5a1f8b982d56fa64f8e442e037f6ce29322f1f9e6c2344cd9e9f4407ee57"}, - {file = "coverage-7.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9b01c22bc74a7fb44066aaf765224c0d933ddf1f5047d6cdfe4795504a4493f8"}, - {file = "coverage-7.13.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:898cce66d0836973f48dda4e3514d863d70142bdf6dfab932b9b6a90ea5b222d"}, - {file = "coverage-7.13.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:3ab483ea0e251b5790c2aac03acde31bff0c736bf8a86829b89382b407cd1c3b"}, - {file = "coverage-7.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d84e91521c5e4cb6602fe11ece3e1de03b2760e14ae4fcf1a4b56fa3c801fcd"}, - {file = "coverage-7.13.0-cp312-cp312-win32.whl", hash = "sha256:193c3887285eec1dbdb3f2bd7fbc351d570ca9c02ca756c3afbc71b3c98af6ef"}, - {file = "coverage-7.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:4f3e223b2b2db5e0db0c2b97286aba0036ca000f06aca9b12112eaa9af3d92ae"}, - {file = "coverage-7.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:086cede306d96202e15a4b77ace8472e39d9f4e5f9fd92dd4fecdfb2313b2080"}, - {file = "coverage-7.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:28ee1c96109974af104028a8ef57cec21447d42d0e937c0275329272e370ebcf"}, - {file = "coverage-7.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d1e97353dcc5587b85986cda4ff3ec98081d7e84dd95e8b2a6d59820f0545f8a"}, - {file = "coverage-7.13.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:99acd4dfdfeb58e1937629eb1ab6ab0899b131f183ee5f23e0b5da5cba2fec74"}, - {file = "coverage-7.13.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ff45e0cd8451e293b63ced93161e189780baf444119391b3e7d25315060368a6"}, - {file = "coverage-7.13.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f4f72a85316d8e13234cafe0a9f81b40418ad7a082792fa4165bd7d45d96066b"}, - {file = "coverage-7.13.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:11c21557d0e0a5a38632cbbaca5f008723b26a89d70db6315523df6df77d6232"}, - {file = "coverage-7.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76541dc8d53715fb4f7a3a06b34b0dc6846e3c69bc6204c55653a85dd6220971"}, - {file = "coverage-7.13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6e9e451dee940a86789134b6b0ffbe31c454ade3b849bb8a9d2cca2541a8e91d"}, - {file = "coverage-7.13.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:5c67dace46f361125e6b9cace8fe0b729ed8479f47e70c89b838d319375c8137"}, - {file = "coverage-7.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f59883c643cb19630500f57016f76cfdcd6845ca8c5b5ea1f6e17f74c8e5f511"}, - {file = "coverage-7.13.0-cp313-cp313-win32.whl", hash = "sha256:58632b187be6f0be500f553be41e277712baa278147ecb7559983c6d9faf7ae1"}, - {file = "coverage-7.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:73419b89f812f498aca53f757dd834919b48ce4799f9d5cad33ca0ae442bdb1a"}, - {file = "coverage-7.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:eb76670874fdd6091eedcc856128ee48c41a9bbbb9c3f1c7c3cf169290e3ffd6"}, - {file = "coverage-7.13.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6e63ccc6e0ad8986386461c3c4b737540f20426e7ec932f42e030320896c311a"}, - {file = "coverage-7.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:494f5459ffa1bd45e18558cd98710c36c0b8fbfa82a5eabcbe671d80ecffbfe8"}, - {file = "coverage-7.13.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:06cac81bf10f74034e055e903f5f946e3e26fc51c09fc9f584e4a1605d977053"}, - {file = "coverage-7.13.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f2ffc92b46ed6e6760f1d47a71e56b5664781bc68986dbd1836b2b70c0ce2071"}, - {file = "coverage-7.13.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0602f701057c6823e5db1b74530ce85f17c3c5be5c85fc042ac939cbd909426e"}, - {file = "coverage-7.13.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:25dc33618d45456ccb1d37bce44bc78cf269909aa14c4db2e03d63146a8a1493"}, - {file = "coverage-7.13.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:71936a8b3b977ddd0b694c28c6a34f4fff2e9dd201969a4ff5d5fc7742d614b0"}, - {file = "coverage-7.13.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:936bc20503ce24770c71938d1369461f0c5320830800933bc3956e2a4ded930e"}, - {file = "coverage-7.13.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:af0a583efaacc52ae2521f8d7910aff65cdb093091d76291ac5820d5e947fc1c"}, - {file = "coverage-7.13.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f1c23e24a7000da892a312fb17e33c5f94f8b001de44b7cf8ba2e36fbd15859e"}, - {file = "coverage-7.13.0-cp313-cp313t-win32.whl", hash = "sha256:5f8a0297355e652001015e93be345ee54393e45dc3050af4a0475c5a2b767d46"}, - {file = "coverage-7.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6abb3a4c52f05e08460bd9acf04fec027f8718ecaa0d09c40ffbc3fbd70ecc39"}, - {file = "coverage-7.13.0-cp313-cp313t-win_arm64.whl", hash = "sha256:3ad968d1e3aa6ce5be295ab5fe3ae1bf5bb4769d0f98a80a0252d543a2ef2e9e"}, - {file = "coverage-7.13.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:453b7ec753cf5e4356e14fe858064e5520c460d3bbbcb9c35e55c0d21155c256"}, - {file = "coverage-7.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:af827b7cbb303e1befa6c4f94fd2bf72f108089cfa0f8abab8f4ca553cf5ca5a"}, - {file = "coverage-7.13.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9987a9e4f8197a1000280f7cc089e3ea2c8b3c0a64d750537809879a7b4ceaf9"}, - {file = "coverage-7.13.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3188936845cd0cb114fa6a51842a304cdbac2958145d03be2377ec41eb285d19"}, - {file = "coverage-7.13.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2bdb3babb74079f021696cb46b8bb5f5661165c385d3a238712b031a12355be"}, - {file = "coverage-7.13.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7464663eaca6adba4175f6c19354feea61ebbdd735563a03d1e472c7072d27bb"}, - {file = "coverage-7.13.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8069e831f205d2ff1f3d355e82f511eb7c5522d7d413f5db5756b772ec8697f8"}, - {file = "coverage-7.13.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:6fb2d5d272341565f08e962cce14cdf843a08ac43bd621783527adb06b089c4b"}, - {file = "coverage-7.13.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5e70f92ef89bac1ac8a99b3324923b4749f008fdbd7aa9cb35e01d7a284a04f9"}, - {file = "coverage-7.13.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4b5de7d4583e60d5fd246dd57fcd3a8aa23c6e118a8c72b38adf666ba8e7e927"}, - {file = "coverage-7.13.0-cp314-cp314-win32.whl", hash = "sha256:a6c6e16b663be828a8f0b6c5027d36471d4a9f90d28444aa4ced4d48d7d6ae8f"}, - {file = "coverage-7.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:0900872f2fdb3ee5646b557918d02279dc3af3dfb39029ac4e945458b13f73bc"}, - {file = "coverage-7.13.0-cp314-cp314-win_arm64.whl", hash = "sha256:3a10260e6a152e5f03f26db4a407c4c62d3830b9af9b7c0450b183615f05d43b"}, - {file = "coverage-7.13.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9097818b6cc1cfb5f174e3263eba4a62a17683bcfe5c4b5d07f4c97fa51fbf28"}, - {file = "coverage-7.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0018f73dfb4301a89292c73be6ba5f58722ff79f51593352759c1790ded1cabe"}, - {file = "coverage-7.13.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:166ad2a22ee770f5656e1257703139d3533b4a0b6909af67c6b4a3adc1c98657"}, - {file = "coverage-7.13.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f6aaef16d65d1787280943f1c8718dc32e9cf141014e4634d64446702d26e0ff"}, - {file = "coverage-7.13.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e999e2dcc094002d6e2c7bbc1fb85b58ba4f465a760a8014d97619330cdbbbf3"}, - {file = "coverage-7.13.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:00c3d22cf6fb1cf3bf662aaaa4e563be8243a5ed2630339069799835a9cc7f9b"}, - {file = "coverage-7.13.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22ccfe8d9bb0d6134892cbe1262493a8c70d736b9df930f3f3afae0fe3ac924d"}, - {file = "coverage-7.13.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:9372dff5ea15930fea0445eaf37bbbafbc771a49e70c0aeed8b4e2c2614cc00e"}, - {file = "coverage-7.13.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:69ac2c492918c2461bc6ace42d0479638e60719f2a4ef3f0815fa2df88e9f940"}, - {file = "coverage-7.13.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:739c6c051a7540608d097b8e13c76cfa85263ced467168dc6b477bae3df7d0e2"}, - {file = "coverage-7.13.0-cp314-cp314t-win32.whl", hash = "sha256:fe81055d8c6c9de76d60c94ddea73c290b416e061d40d542b24a5871bad498b7"}, - {file = "coverage-7.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:445badb539005283825959ac9fa4a28f712c214b65af3a2c464f1adc90f5fcbc"}, - {file = "coverage-7.13.0-cp314-cp314t-win_arm64.whl", hash = "sha256:de7f6748b890708578fc4b7bb967d810aeb6fcc9bff4bb77dbca77dab2f9df6a"}, - {file = "coverage-7.13.0-py3-none-any.whl", hash = "sha256:850d2998f380b1e266459ca5b47bc9e7daf9af1d070f66317972f382d46f1904"}, - {file = "coverage-7.13.0.tar.gz", hash = "sha256:a394aa27f2d7ff9bc04cf703817773a59ad6dfbd577032e690f961d2460ee936"}, + {file = "coverage-7.13.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fc31c787a84f8cd6027eba44010517020e0d18487064cd3d8968941856d1415"}, + {file = "coverage-7.13.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a32ebc02a1805adf637fc8dec324b5cdacd2e493515424f70ee33799573d661b"}, + {file = "coverage-7.13.4-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e24f9156097ff9dc286f2f913df3a7f63c0e333dcafa3c196f2c18b4175ca09a"}, + {file = "coverage-7.13.4-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8041b6c5bfdc03257666e9881d33b1abc88daccaf73f7b6340fb7946655cd10f"}, + {file = "coverage-7.13.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a09cfa6a5862bc2fc6ca7c3def5b2926194a56b8ab78ffcf617d28911123012"}, + {file = "coverage-7.13.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:296f8b0af861d3970c2a4d8c91d48eb4dd4771bcef9baedec6a9b515d7de3def"}, + {file = "coverage-7.13.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e101609bcbbfb04605ea1027b10dc3735c094d12d40826a60f897b98b1c30256"}, + {file = "coverage-7.13.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:aa3feb8db2e87ff5e6d00d7e1480ae241876286691265657b500886c98f38bda"}, + {file = "coverage-7.13.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4fc7fa81bbaf5a02801b65346c8b3e657f1d93763e58c0abdf7c992addd81a92"}, + {file = "coverage-7.13.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:33901f604424145c6e9c2398684b92e176c0b12df77d52db81c20abd48c3794c"}, + {file = "coverage-7.13.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:bb28c0f2cf2782508a40cec377935829d5fcc3ad9a3681375af4e84eb34b6b58"}, + {file = "coverage-7.13.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d107aff57a83222ddbd8d9ee705ede2af2cc926608b57abed8ef96b50b7e8f9"}, + {file = "coverage-7.13.4-cp310-cp310-win32.whl", hash = "sha256:a6f94a7d00eb18f1b6d403c91a88fd58cfc92d4b16080dfdb774afc8294469bf"}, + {file = "coverage-7.13.4-cp310-cp310-win_amd64.whl", hash = "sha256:2cb0f1e000ebc419632bbe04366a8990b6e32c4e0b51543a6484ffe15eaeda95"}, + {file = "coverage-7.13.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d490ba50c3f35dd7c17953c68f3270e7ccd1c6642e2d2afe2d8e720b98f5a053"}, + {file = "coverage-7.13.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:19bc3c88078789f8ef36acb014d7241961dbf883fd2533d18cb1e7a5b4e28b11"}, + {file = "coverage-7.13.4-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3998e5a32e62fdf410c0dbd3115df86297995d6e3429af80b8798aad894ca7aa"}, + {file = "coverage-7.13.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e264226ec98e01a8e1054314af91ee6cde0eacac4f465cc93b03dbe0bce2fd7"}, + {file = "coverage-7.13.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a3aa4e7b9e416774b21797365b358a6e827ffadaaca81b69ee02946852449f00"}, + {file = "coverage-7.13.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:71ca20079dd8f27fcf808817e281e90220475cd75115162218d0e27549f95fef"}, + {file = "coverage-7.13.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e2f25215f1a359ab17320b47bcdaca3e6e6356652e8256f2441e4ef972052903"}, + {file = "coverage-7.13.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d65b2d373032411e86960604dc4edac91fdfb5dca539461cf2cbe78327d1e64f"}, + {file = "coverage-7.13.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94eb63f9b363180aff17de3e7c8760c3ba94664ea2695c52f10111244d16a299"}, + {file = "coverage-7.13.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e856bf6616714c3a9fbc270ab54103f4e685ba236fa98c054e8f87f266c93505"}, + {file = "coverage-7.13.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:65dfcbe305c3dfe658492df2d85259e0d79ead4177f9ae724b6fb245198f55d6"}, + {file = "coverage-7.13.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b507778ae8a4c915436ed5c2e05b4a6cecfa70f734e19c22a005152a11c7b6a9"}, + {file = "coverage-7.13.4-cp311-cp311-win32.whl", hash = "sha256:784fc3cf8be001197b652d51d3fd259b1e2262888693a4636e18879f613a62a9"}, + {file = "coverage-7.13.4-cp311-cp311-win_amd64.whl", hash = "sha256:2421d591f8ca05b308cf0092807308b2facbefe54af7c02ac22548b88b95c98f"}, + {file = "coverage-7.13.4-cp311-cp311-win_arm64.whl", hash = "sha256:79e73a76b854d9c6088fe5d8b2ebe745f8681c55f7397c3c0a016192d681045f"}, + {file = "coverage-7.13.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02231499b08dabbe2b96612993e5fc34217cdae907a51b906ac7fca8027a4459"}, + {file = "coverage-7.13.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40aa8808140e55dc022b15d8aa7f651b6b3d68b365ea0398f1441e0b04d859c3"}, + {file = "coverage-7.13.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5b856a8ccf749480024ff3bd7310adaef57bf31fd17e1bfc404b7940b6986634"}, + {file = "coverage-7.13.4-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c048ea43875fbf8b45d476ad79f179809c590ec7b79e2035c662e7afa3192e3"}, + {file = "coverage-7.13.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b7b38448866e83176e28086674fe7368ab8590e4610fb662b44e345b86d63ffa"}, + {file = "coverage-7.13.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:de6defc1c9badbf8b9e67ae90fd00519186d6ab64e5cc5f3d21359c2a9b2c1d3"}, + {file = "coverage-7.13.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7eda778067ad7ffccd23ecffce537dface96212576a07924cbf0d8799d2ded5a"}, + {file = "coverage-7.13.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e87f6c587c3f34356c3759f0420693e35e7eb0e2e41e4c011cb6ec6ecbbf1db7"}, + {file = "coverage-7.13.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8248977c2e33aecb2ced42fef99f2d319e9904a36e55a8a68b69207fb7e43edc"}, + {file = "coverage-7.13.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:25381386e80ae727608e662474db537d4df1ecd42379b5ba33c84633a2b36d47"}, + {file = "coverage-7.13.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:ee756f00726693e5ba94d6df2bdfd64d4852d23b09bb0bc700e3b30e6f333985"}, + {file = "coverage-7.13.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fdfc1e28e7c7cdce44985b3043bc13bbd9c747520f94a4d7164af8260b3d91f0"}, + {file = "coverage-7.13.4-cp312-cp312-win32.whl", hash = "sha256:01d4cbc3c283a17fc1e42d614a119f7f438eabb593391283adca8dc86eff1246"}, + {file = "coverage-7.13.4-cp312-cp312-win_amd64.whl", hash = "sha256:9401ebc7ef522f01d01d45532c68c5ac40fb27113019b6b7d8b208f6e9baa126"}, + {file = "coverage-7.13.4-cp312-cp312-win_arm64.whl", hash = "sha256:b1ec7b6b6e93255f952e27ab58fbc68dcc468844b16ecbee881aeb29b6ab4d8d"}, + {file = "coverage-7.13.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b66a2da594b6068b48b2692f043f35d4d3693fb639d5ea8b39533c2ad9ac3ab9"}, + {file = "coverage-7.13.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3599eb3992d814d23b35c536c28df1a882caa950f8f507cef23d1cbf334995ac"}, + {file = "coverage-7.13.4-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:93550784d9281e374fb5a12bf1324cc8a963fd63b2d2f223503ef0fd4aa339ea"}, + {file = "coverage-7.13.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b720ce6a88a2755f7c697c23268ddc47a571b88052e6b155224347389fdf6a3b"}, + {file = "coverage-7.13.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b322db1284a2ed3aa28ffd8ebe3db91c929b7a333c0820abec3d838ef5b3525"}, + {file = "coverage-7.13.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f4594c67d8a7c89cf922d9df0438c7c7bb022ad506eddb0fdb2863359ff78242"}, + {file = "coverage-7.13.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:53d133df809c743eb8bce33b24bcababb371f4441340578cd406e084d94a6148"}, + {file = "coverage-7.13.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76451d1978b95ba6507a039090ba076105c87cc76fc3efd5d35d72093964d49a"}, + {file = "coverage-7.13.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7f57b33491e281e962021de110b451ab8a24182589be17e12a22c79047935e23"}, + {file = "coverage-7.13.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1731dc33dc276dafc410a885cbf5992f1ff171393e48a21453b78727d090de80"}, + {file = "coverage-7.13.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:bd60d4fe2f6fa7dff9223ca1bbc9f05d2b6697bc5961072e5d3b952d46e1b1ea"}, + {file = "coverage-7.13.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9181a3ccead280b828fae232df12b16652702b49d41e99d657f46cc7b1f6ec7a"}, + {file = "coverage-7.13.4-cp313-cp313-win32.whl", hash = "sha256:f53d492307962561ac7de4cd1de3e363589b000ab69617c6156a16ba7237998d"}, + {file = "coverage-7.13.4-cp313-cp313-win_amd64.whl", hash = "sha256:e6f70dec1cc557e52df5306d051ef56003f74d56e9c4dd7ddb07e07ef32a84dd"}, + {file = "coverage-7.13.4-cp313-cp313-win_arm64.whl", hash = "sha256:fb07dc5da7e849e2ad31a5d74e9bece81f30ecf5a42909d0a695f8bd1874d6af"}, + {file = "coverage-7.13.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:40d74da8e6c4b9ac18b15331c4b5ebc35a17069410cad462ad4f40dcd2d50c0d"}, + {file = "coverage-7.13.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4223b4230a376138939a9173f1bdd6521994f2aff8047fae100d6d94d50c5a12"}, + {file = "coverage-7.13.4-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1d4be36a5114c499f9f1f9195e95ebf979460dbe2d88e6816ea202010ba1c34b"}, + {file = "coverage-7.13.4-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:200dea7d1e8095cc6e98cdabe3fd1d21ab17d3cee6dab00cadbb2fe35d9c15b9"}, + {file = "coverage-7.13.4-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8eb931ee8e6d8243e253e5ed7336deea6904369d2fd8ae6e43f68abbf167092"}, + {file = "coverage-7.13.4-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:75eab1ebe4f2f64d9509b984f9314d4aa788540368218b858dad56dc8f3e5eb9"}, + {file = "coverage-7.13.4-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c35eb28c1d085eb7d8c9b3296567a1bebe03ce72962e932431b9a61f28facf26"}, + {file = "coverage-7.13.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb88b316ec33760714a4720feb2816a3a59180fd58c1985012054fa7aebee4c2"}, + {file = "coverage-7.13.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7d41eead3cc673cbd38a4417deb7fd0b4ca26954ff7dc6078e33f6ff97bed940"}, + {file = "coverage-7.13.4-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:fb26a934946a6afe0e326aebe0730cdff393a8bc0bbb65a2f41e30feddca399c"}, + {file = "coverage-7.13.4-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:dae88bc0fc77edaa65c14be099bd57ee140cf507e6bfdeea7938457ab387efb0"}, + {file = "coverage-7.13.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:845f352911777a8e722bfce168958214951e07e47e5d5d9744109fa5fe77f79b"}, + {file = "coverage-7.13.4-cp313-cp313t-win32.whl", hash = "sha256:2fa8d5f8de70688a28240de9e139fa16b153cc3cbb01c5f16d88d6505ebdadf9"}, + {file = "coverage-7.13.4-cp313-cp313t-win_amd64.whl", hash = "sha256:9351229c8c8407645840edcc277f4a2d44814d1bc34a2128c11c2a031d45a5dd"}, + {file = "coverage-7.13.4-cp313-cp313t-win_arm64.whl", hash = "sha256:30b8d0512f2dc8c8747557e8fb459d6176a2c9e5731e2b74d311c03b78451997"}, + {file = "coverage-7.13.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:300deaee342f90696ed186e3a00c71b5b3d27bffe9e827677954f4ee56969601"}, + {file = "coverage-7.13.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29e3220258d682b6226a9b0925bc563ed9a1ebcff3cad30f043eceea7eaf2689"}, + {file = "coverage-7.13.4-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:391ee8f19bef69210978363ca930f7328081c6a0152f1166c91f0b5fdd2a773c"}, + {file = "coverage-7.13.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0dd7ab8278f0d58a0128ba2fca25824321f05d059c1441800e934ff2efa52129"}, + {file = "coverage-7.13.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78cdf0d578b15148b009ccf18c686aa4f719d887e76e6b40c38ffb61d264a552"}, + {file = "coverage-7.13.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:48685fee12c2eb3b27c62f2658e7ea21e9c3239cba5a8a242801a0a3f6a8c62a"}, + {file = "coverage-7.13.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4e83efc079eb39480e6346a15a1bcb3e9b04759c5202d157e1dd4303cd619356"}, + {file = "coverage-7.13.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ecae9737b72408d6a950f7e525f30aca12d4bd8dd95e37342e5beb3a2a8c4f71"}, + {file = "coverage-7.13.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ae4578f8528569d3cf303fef2ea569c7f4c4059a38c8667ccef15c6e1f118aa5"}, + {file = "coverage-7.13.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:6fdef321fdfbb30a197efa02d48fcd9981f0d8ad2ae8903ac318adc653f5df98"}, + {file = "coverage-7.13.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b0f6ccf3dbe577170bebfce1318707d0e8c3650003cb4b3a9dd744575daa8b5"}, + {file = "coverage-7.13.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75fcd519f2a5765db3f0e391eb3b7d150cce1a771bf4c9f861aeab86c767a3c0"}, + {file = "coverage-7.13.4-cp314-cp314-win32.whl", hash = "sha256:8e798c266c378da2bd819b0677df41ab46d78065fb2a399558f3f6cae78b2fbb"}, + {file = "coverage-7.13.4-cp314-cp314-win_amd64.whl", hash = "sha256:245e37f664d89861cf2329c9afa2c1fe9e6d4e1a09d872c947e70718aeeac505"}, + {file = "coverage-7.13.4-cp314-cp314-win_arm64.whl", hash = "sha256:ad27098a189e5838900ce4c2a99f2fe42a0bf0c2093c17c69b45a71579e8d4a2"}, + {file = "coverage-7.13.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:85480adfb35ffc32d40918aad81b89c69c9cc5661a9b8a81476d3e645321a056"}, + {file = "coverage-7.13.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:79be69cf7f3bf9b0deeeb062eab7ac7f36cd4cc4c4dd694bd28921ba4d8596cc"}, + {file = "coverage-7.13.4-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:caa421e2684e382c5d8973ac55e4f36bed6821a9bad5c953494de960c74595c9"}, + {file = "coverage-7.13.4-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:14375934243ee05f56c45393fe2ce81fe5cc503c07cee2bdf1725fb8bef3ffaf"}, + {file = "coverage-7.13.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:25a41c3104d08edb094d9db0d905ca54d0cd41c928bb6be3c4c799a54753af55"}, + {file = "coverage-7.13.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6f01afcff62bf9a08fb32b2c1d6e924236c0383c02c790732b6537269e466a72"}, + {file = "coverage-7.13.4-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eb9078108fbf0bcdde37c3f4779303673c2fa1fe8f7956e68d447d0dd426d38a"}, + {file = "coverage-7.13.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e086334e8537ddd17e5f16a344777c1ab8194986ec533711cbe6c41cde841b6"}, + {file = "coverage-7.13.4-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:725d985c5ab621268b2edb8e50dfe57633dc69bda071abc470fed55a14935fd3"}, + {file = "coverage-7.13.4-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3c06f0f1337c667b971ca2f975523347e63ec5e500b9aa5882d91931cd3ef750"}, + {file = "coverage-7.13.4-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:590c0ed4bf8e85f745e6b805b2e1c457b2e33d5255dd9729743165253bc9ad39"}, + {file = "coverage-7.13.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:eb30bf180de3f632cd043322dad5751390e5385108b2807368997d1a92a509d0"}, + {file = "coverage-7.13.4-cp314-cp314t-win32.whl", hash = "sha256:c4240e7eded42d131a2d2c4dec70374b781b043ddc79a9de4d55ca71f8e98aea"}, + {file = "coverage-7.13.4-cp314-cp314t-win_amd64.whl", hash = "sha256:4c7d3cc01e7350f2f0f6f7036caaf5673fb56b6998889ccfe9e1c1fe75a9c932"}, + {file = "coverage-7.13.4-cp314-cp314t-win_arm64.whl", hash = "sha256:23e3f687cf945070d1c90f85db66d11e3025665d8dafa831301a0e0038f3db9b"}, + {file = "coverage-7.13.4-py3-none-any.whl", hash = "sha256:1af1641e57cf7ba1bd67d677c9abdbcd6cc2ab7da3bca7fa1e2b7e50e65f2ad0"}, + {file = "coverage-7.13.4.tar.gz", hash = "sha256:e5c8f6ed1e61a8b2dcdf31eb0b9bbf0130750ca79c1c49eb898e2ad86f5ccc91"}, ] [package.extras] @@ -1083,104 +1109,47 @@ dates = ["pytz (>=2019.1)"] [[package]] name = "exasol-error-reporting" -version = "1.0.0" +version = "1.1.0" description = "Exasol Python Error Reporting" optional = false -python-versions = "<4.0,>=3.9" +python-versions = "<4.0,>=3.10" groups = ["dev"] files = [ - {file = "exasol_error_reporting-1.0.0-py3-none-any.whl", hash = "sha256:62370f0925bbcbc847a6ee7d6bff8c82f76bdd1fe833de670af310b6b04ee5d5"}, - {file = "exasol_error_reporting-1.0.0.tar.gz", hash = "sha256:0b81cbb208cd74ca47643532568e467053a29905808e9f29b7b0e4ec5e4e0302"}, + {file = "exasol_error_reporting-1.1.0-py3-none-any.whl", hash = "sha256:1534d30aaf0fe9c66a5d5b49f28bb8ece909e660b616ba6df41384404fd936ad"}, + {file = "exasol_error_reporting-1.1.0.tar.gz", hash = "sha256:a1e3273fddfac11b91beb75be7c79aaa5143f0ceb522b489aac426fc207ee6a5"}, ] [[package]] name = "exasol-integration-test-docker-environment" -version = "4.3.0" -description = "Integration Test Docker Environment for Exasol" -optional = false -python-versions = "<4,>=3.9.2" -groups = ["dev"] -markers = "python_version >= \"3.12\"" -files = [ - {file = "exasol_integration_test_docker_environment-4.3.0-py3-none-any.whl", hash = "sha256:0f694a2c723617c189b84c145a18154e2a40f2fb58f98c73b39277af740de7c6"}, - {file = "exasol_integration_test_docker_environment-4.3.0.tar.gz", hash = "sha256:2c82bd667be4b654d48ea5c43617c31608f3ec73312c8b6b51b2bb324a75ced6"}, -] - -[package.dependencies] -click = ">=7.0" -docker = {version = ">=4.0.0,<7.0.0 || >7.0.0", markers = "sys_platform != \"win32\""} -docutils = ">=0.21.2" -exasol-error-reporting = ">=1.0.0,<2.0.0" -fabric = ">=3.0.1,<4.0.0" -gitpython = ">=2.1.0" -humanfriendly = ">=4.18" -importlib_resources = ">=5.4.0" -jinja2 = ">=2.10.1" -jsonpickle = ">=1.1" -luigi = ">=2.8.4" -netaddr = ">=0.7.19" -networkx = ">=2.3" -portalocker = ">=2.7.0,<3.0.0" -pydot = ">=1.4.0" -requests = ">=2.32.4" -simplejson = ">=3.16.0" -"stopwatch.py" = ">=1.0.0" - -[[package]] -name = "exasol-integration-test-docker-environment" -version = "5.0.0" +version = "6.0.0" description = "Integration Test Docker Environment for Exasol" optional = false python-versions = "<3.15,>=3.10" groups = ["dev"] -markers = "python_version < \"3.12\"" files = [ - {file = "exasol_integration_test_docker_environment-5.0.0-py3-none-any.whl", hash = "sha256:b5d35ad409155f7705ec8c3f261f519295061c82b7ccd56cab39bb5097863b7c"}, - {file = "exasol_integration_test_docker_environment-5.0.0.tar.gz", hash = "sha256:66dc7cbe628bdaabdd6924a428e56bfdd817ea226eed7663fb33c378427282c4"}, + {file = "exasol_integration_test_docker_environment-6.0.0-py3-none-any.whl", hash = "sha256:fbc15f6d986493023c8a666eb3c1dcfbab0aa755f7453467706172b2d564d45a"}, + {file = "exasol_integration_test_docker_environment-6.0.0.tar.gz", hash = "sha256:8b5ad7c2c7461906714c31731b7526ef3833beb6facfa75948bf730d67430be6"}, ] [package.dependencies] click = ">=7.0" docker = {version = ">=4.0.0,<7.0.0 || >7.0.0", markers = "sys_platform != \"win32\""} docutils = ">=0.21.2" -exasol-error-reporting = ">=1.0.0,<2.0.0" -fabric = ">=3.0.1,<4.0.0" +exasol-error-reporting = ">=1.0.0,<2" +fabric = ">=3.0.1,<4" gitpython = ">=2.1.0" humanfriendly = ">=4.18" -importlib_resources = ">=5.4.0" jinja2 = ">=2.10.1" jsonpickle = ">=1.1" luigi = ">=2.8.4" netaddr = ">=0.7.19" networkx = ">=2.3" -portalocker = ">=2.7.0,<3.0.0" +portalocker = ">=2.7.0,<3" pydot = ">=1.4.0" requests = ">=2.32.4" simplejson = ">=3.16.0" "stopwatch.py" = ">=1.0.0" -[[package]] -name = "exasol-saas-api" -version = "2.6.0" -description = "API enabling Python applications connecting to Exasol database SaaS instances and using their SaaS services" -optional = false -python-versions = "<4.0,>=3.10.0" -groups = ["main", "dev"] -markers = "python_version >= \"3.12\"" -files = [ - {file = "exasol_saas_api-2.6.0-py3-none-any.whl", hash = "sha256:6518cf571fed74044cd67972cf24c36cf108170315f731950e59db0e2d4f3307"}, - {file = "exasol_saas_api-2.6.0.tar.gz", hash = "sha256:43ae4eb076f4f402610daee024473bfcb631fc5f31a233b6f54173b750fb2ee1"}, -] - -[package.dependencies] -attrs = ">=22.2.0" -httpx = ">=0.23.0" -ifaddr = ">=0.2.0,<0.3.0" -python-dateutil = ">=2.8.0,<3.0.0" -requests = ">=2.32.4,<3.0.0" -tenacity = ">=8.2.3,<9.0.0" -types-requests = ">=2.31.0.6,<3.0.0.0" - [[package]] name = "exasol-saas-api" version = "2.8.0" @@ -1188,7 +1157,6 @@ description = "API enabling Python applications connecting to Exasol database Sa optional = false python-versions = "<4.0,>=3.10.0" groups = ["main", "dev"] -markers = "python_version < \"3.12\"" files = [ {file = "exasol_saas_api-2.8.0-py3-none-any.whl", hash = "sha256:fa2628e7d058f0a378d880c55ec36155507c326daa013ee33ec2d75773290998"}, {file = "exasol_saas_api-2.8.0.tar.gz", hash = "sha256:7cc31f01737749f464b9032d14631a5e4189f006021197a201b1786740ead238"}, @@ -1305,16 +1273,40 @@ paramiko = ">=2.4" [package.extras] pytest = ["pytest (>=7)"] +[[package]] +name = "fastapi" +version = "0.133.1" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "fastapi-0.133.1-py3-none-any.whl", hash = "sha256:658f34ba334605b1617a65adf2ea6461901bdb9af3a3080d63ff791ecf7dc2e2"}, + {file = "fastapi-0.133.1.tar.gz", hash = "sha256:ed152a45912f102592976fde6cbce7dae1a8a1053da94202e51dd35d184fadd6"}, +] + +[package.dependencies] +annotated-doc = ">=0.0.2" +pydantic = ">=2.7.0" +starlette = ">=0.40.0" +typing-extensions = ">=4.8.0" +typing-inspection = ">=0.4.2" + +[package.extras] +all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "uvicorn[standard] (>=0.12.0)"] +standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "jinja2 (>=3.1.5)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] +standard-no-fastapi-cloud-cli = ["email-validator (>=2.0.0)", "fastapi-cli[standard-no-fastapi-cloud-cli] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "jinja2 (>=3.1.5)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] + [[package]] name = "filelock" -version = "3.20.3" +version = "3.24.3" description = "A platform independent file lock." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1"}, - {file = "filelock-3.20.3.tar.gz", hash = "sha256:18c57ee915c7ec61cff0ecf7f0f869936c7c30191bb0cf406f1341778d0834e1"}, + {file = "filelock-3.24.3-py3-none-any.whl", hash = "sha256:426e9a4660391f7f8a810d71b0555bce9008b0a1cc342ab1f6947d37639e002d"}, + {file = "filelock-3.24.3.tar.gz", hash = "sha256:011a5644dc937c22699943ebbfc46e969cdde3e171470a6e40b9533e5a72affa"}, ] [[package]] @@ -1353,14 +1345,14 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.45" +version = "3.1.46" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" groups = ["dev"] files = [ - {file = "gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77"}, - {file = "gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c"}, + {file = "gitpython-3.1.46-py3-none-any.whl", hash = "sha256:79812ed143d9d25b6d176a10bb511de0f9c67b1fa641d82097b0ab90398a2058"}, + {file = "gitpython-3.1.46.tar.gz", hash = "sha256:400124c7d0ef4ea03f7310ac2fbf7151e09ff97f2a3288d64a440c584a29c37f"}, ] [package.dependencies] @@ -1368,7 +1360,7 @@ gitdb = ">=4.0.1,<5" [package.extras] doc = ["sphinx (>=7.1.2,<7.2)", "sphinx-autodoc-typehints", "sphinx_rtd_theme"] -test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3.8\"", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions ; python_version < \"3.11\""] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3.8\"", "mypy (==1.18.2) ; python_version >= \"3.9\"", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions ; python_version < \"3.11\""] [[package]] name = "grimp" @@ -1601,34 +1593,34 @@ tests = ["freezegun", "pytest", "pytest-cov"] [[package]] name = "id" -version = "1.5.0" +version = "1.6.1" description = "A tool for generating OIDC identities" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "id-1.5.0-py3-none-any.whl", hash = "sha256:f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658"}, - {file = "id-1.5.0.tar.gz", hash = "sha256:292cb8a49eacbbdbce97244f47a97b4c62540169c976552e497fd57df0734c1d"}, + {file = "id-1.6.1-py3-none-any.whl", hash = "sha256:f5ec41ed2629a508f5d0988eda142e190c9c6da971100612c4de9ad9f9b237ca"}, + {file = "id-1.6.1.tar.gz", hash = "sha256:d0732d624fb46fd4e7bc4e5152f00214450953b9e772c182c1c22964def1a069"}, ] [package.dependencies] -requests = "*" +urllib3 = ">=2,<3" [package.extras] dev = ["build", "bump (>=1.3.2)", "id[lint,test]"] -lint = ["bandit", "interrogate", "mypy", "ruff (<0.8.2)", "types-requests"] +lint = ["bandit", "interrogate", "mypy", "ruff (<0.14.15)"] test = ["coverage[toml]", "pretend", "pytest", "pytest-cov"] [[package]] name = "identify" -version = "2.6.15" +version = "2.6.16" description = "File identification library for Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "identify-2.6.15-py2.py3-none-any.whl", hash = "sha256:1181ef7608e00704db228516541eb83a88a9f94433a8c80bb9b5bd54b1d81757"}, - {file = "identify-2.6.15.tar.gz", hash = "sha256:e4f4864b96c6557ef2a1e1c951771838f4edc9df3a72ec7118b338801b11c7bf"}, + {file = "identify-2.6.16-py2.py3-none-any.whl", hash = "sha256:391ee4d77741d994189522896270b787aed8670389bfd60f326d677d64a6dfb0"}, + {file = "identify-2.6.16.tar.gz", hash = "sha256:846857203b5511bbe94d5a352a48ef2359532bc8f6727b5544077a0dcfb24980"}, ] [package.extras] @@ -1675,22 +1667,24 @@ files = [ [[package]] name = "import-linter" -version = "2.9" -description = "Enforces rules for the imports within and between Python packages." +version = "2.10" +description = "Lint your Python architecture" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "import_linter-2.9-py3-none-any.whl", hash = "sha256:06403ede04c975cda2ea9050498c16b2021c0261b5cedf47c6c5d8725894b1a2"}, - {file = "import_linter-2.9.tar.gz", hash = "sha256:0d7da2a9bb0a534171a592795bd46c8cca86bd6dc6e6e665fa95ba4ed5024215"}, + {file = "import_linter-2.10-py3-none-any.whl", hash = "sha256:cc2ddd7ec0145cbf83f3b25391d2a5dbbf138382aaf80708612497fa6ebc8f60"}, + {file = "import_linter-2.10.tar.gz", hash = "sha256:c6a5057d2dbd32e1854c4d6b60e90dfad459b7ab5356230486d8521f25872963"}, ] [package.dependencies] click = ">=6" +fastapi = "*" grimp = ">=3.14" rich = ">=14.2.0" tomli = {version = ">=1.2.1", markers = "python_version < \"3.11\""} typing-extensions = ">=3.10.0.0" +uvicorn = "*" [[package]] name = "importlib-metadata" @@ -1799,23 +1793,27 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-ena [[package]] name = "jaraco-context" -version = "6.0.1" +version = "6.1.0" description = "Useful decorators and context managers" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" files = [ - {file = "jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"}, - {file = "jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3"}, + {file = "jaraco_context-6.1.0-py3-none-any.whl", hash = "sha256:a43b5ed85815223d0d3cfdb6d7ca0d2bc8946f28f30b6f3216bda070f68badda"}, + {file = "jaraco_context-6.1.0.tar.gz", hash = "sha256:129a341b0a85a7db7879e22acd66902fda67882db771754574338898b2d5d86f"}, ] [package.dependencies] "backports.tarfile" = {version = "*", markers = "python_version < \"3.12\""} [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +enabler = ["pytest-enabler (>=3.4)"] +test = ["jaraco.test (>=5.6.0)", "portend", "pytest (>=6,!=8.1.*)"] +type = ["mypy (<1.19) ; platform_python_implementation == \"PyPy\"", "pytest-mypy (>=1.0.1)"] [[package]] name = "jaraco-functools" @@ -1943,89 +1941,103 @@ type = ["pygobject-stubs", "pytest-mypy (>=1.0.1)", "shtab", "types-pywin32"] [[package]] name = "librt" -version = "0.7.4" +version = "0.8.1" description = "Mypyc runtime library" optional = false python-versions = ">=3.9" groups = ["dev"] markers = "platform_python_implementation != \"PyPy\"" files = [ - {file = "librt-0.7.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dc300cb5a5a01947b1ee8099233156fdccd5001739e5f596ecfbc0dab07b5a3b"}, - {file = "librt-0.7.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee8d3323d921e0f6919918a97f9b5445a7dfe647270b2629ec1008aa676c0bc0"}, - {file = "librt-0.7.4-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:95cb80854a355b284c55f79674f6187cc9574df4dc362524e0cce98c89ee8331"}, - {file = "librt-0.7.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ca1caedf8331d8ad6027f93b52d68ed8f8009f5c420c246a46fe9d3be06be0f"}, - {file = "librt-0.7.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c2a6f1236151e6fe1da289351b5b5bce49651c91554ecc7b70a947bced6fe212"}, - {file = "librt-0.7.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7766b57aeebaf3f1dac14fdd4a75c9a61f2ed56d8ebeefe4189db1cb9d2a3783"}, - {file = "librt-0.7.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1c4c89fb01157dd0a3bfe9e75cd6253b0a1678922befcd664eca0772a4c6c979"}, - {file = "librt-0.7.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f7fa8beef580091c02b4fd26542de046b2abfe0aaefa02e8bcf68acb7618f2b3"}, - {file = "librt-0.7.4-cp310-cp310-win32.whl", hash = "sha256:543c42fa242faae0466fe72d297976f3c710a357a219b1efde3a0539a68a6997"}, - {file = "librt-0.7.4-cp310-cp310-win_amd64.whl", hash = "sha256:25cc40d8eb63f0a7ea4c8f49f524989b9df901969cb860a2bc0e4bad4b8cb8a8"}, - {file = "librt-0.7.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3485b9bb7dfa66167d5500ffdafdc35415b45f0da06c75eb7df131f3357b174a"}, - {file = "librt-0.7.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:188b4b1a770f7f95ea035d5bbb9d7367248fc9d12321deef78a269ebf46a5729"}, - {file = "librt-0.7.4-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1b668b1c840183e4e38ed5a99f62fac44c3a3eef16870f7f17cfdfb8b47550ed"}, - {file = "librt-0.7.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0e8f864b521f6cfedb314d171630f827efee08f5c3462bcbc2244ab8e1768cd6"}, - {file = "librt-0.7.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4df7c9def4fc619a9c2ab402d73a0c5b53899abe090e0100323b13ccb5a3dd82"}, - {file = "librt-0.7.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f79bc3595b6ed159a1bf0cdc70ed6ebec393a874565cab7088a219cca14da727"}, - {file = "librt-0.7.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:77772a4b8b5f77d47d883846928c36d730b6e612a6388c74cba33ad9eb149c11"}, - {file = "librt-0.7.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:064a286e6ab0b4c900e228ab4fa9cb3811b4b83d3e0cc5cd816b2d0f548cb61c"}, - {file = "librt-0.7.4-cp311-cp311-win32.whl", hash = "sha256:42da201c47c77b6cc91fc17e0e2b330154428d35d6024f3278aa2683e7e2daf2"}, - {file = "librt-0.7.4-cp311-cp311-win_amd64.whl", hash = "sha256:d31acb5886c16ae1711741f22504195af46edec8315fe69b77e477682a87a83e"}, - {file = "librt-0.7.4-cp311-cp311-win_arm64.whl", hash = "sha256:114722f35093da080a333b3834fff04ef43147577ed99dd4db574b03a5f7d170"}, - {file = "librt-0.7.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7dd3b5c37e0fb6666c27cf4e2c88ae43da904f2155c4cfc1e5a2fdce3b9fcf92"}, - {file = "librt-0.7.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9c5de1928c486201b23ed0cc4ac92e6e07be5cd7f3abc57c88a9cf4f0f32108"}, - {file = "librt-0.7.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:078ae52ffb3f036396cc4aed558e5b61faedd504a3c1f62b8ae34bf95ae39d94"}, - {file = "librt-0.7.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce58420e25097b2fc201aef9b9f6d65df1eb8438e51154e1a7feb8847e4a55ab"}, - {file = "librt-0.7.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b719c8730c02a606dc0e8413287e8e94ac2d32a51153b300baf1f62347858fba"}, - {file = "librt-0.7.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3749ef74c170809e6dee68addec9d2458700a8de703de081c888e92a8b015cf9"}, - {file = "librt-0.7.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b35c63f557653c05b5b1b6559a074dbabe0afee28ee2a05b6c9ba21ad0d16a74"}, - {file = "librt-0.7.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1ef704e01cb6ad39ad7af668d51677557ca7e5d377663286f0ee1b6b27c28e5f"}, - {file = "librt-0.7.4-cp312-cp312-win32.whl", hash = "sha256:c66c2b245926ec15188aead25d395091cb5c9df008d3b3207268cd65557d6286"}, - {file = "librt-0.7.4-cp312-cp312-win_amd64.whl", hash = "sha256:71a56f4671f7ff723451f26a6131754d7c1809e04e22ebfbac1db8c9e6767a20"}, - {file = "librt-0.7.4-cp312-cp312-win_arm64.whl", hash = "sha256:419eea245e7ec0fe664eb7e85e7ff97dcdb2513ca4f6b45a8ec4a3346904f95a"}, - {file = "librt-0.7.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d44a1b1ba44cbd2fc3cb77992bef6d6fdb1028849824e1dd5e4d746e1f7f7f0b"}, - {file = "librt-0.7.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c9cab4b3de1f55e6c30a84c8cee20e4d3b2476f4d547256694a1b0163da4fe32"}, - {file = "librt-0.7.4-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2857c875f1edd1feef3c371fbf830a61b632fb4d1e57160bb1e6a3206e6abe67"}, - {file = "librt-0.7.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b370a77be0a16e1ad0270822c12c21462dc40496e891d3b0caf1617c8cc57e20"}, - {file = "librt-0.7.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d05acd46b9a52087bfc50c59dfdf96a2c480a601e8898a44821c7fd676598f74"}, - {file = "librt-0.7.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:70969229cb23d9c1a80e14225838d56e464dc71fa34c8342c954fc50e7516dee"}, - {file = "librt-0.7.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4450c354b89dbb266730893862dbff06006c9ed5b06b6016d529b2bf644fc681"}, - {file = "librt-0.7.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:adefe0d48ad35b90b6f361f6ff5a1bd95af80c17d18619c093c60a20e7a5b60c"}, - {file = "librt-0.7.4-cp313-cp313-win32.whl", hash = "sha256:21ea710e96c1e050635700695095962a22ea420d4b3755a25e4909f2172b4ff2"}, - {file = "librt-0.7.4-cp313-cp313-win_amd64.whl", hash = "sha256:772e18696cf5a64afee908662fbcb1f907460ddc851336ee3a848ef7684c8e1e"}, - {file = "librt-0.7.4-cp313-cp313-win_arm64.whl", hash = "sha256:52e34c6af84e12921748c8354aa6acf1912ca98ba60cdaa6920e34793f1a0788"}, - {file = "librt-0.7.4-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4f1ee004942eaaed6e06c087d93ebc1c67e9a293e5f6b9b5da558df6bf23dc5d"}, - {file = "librt-0.7.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d854c6dc0f689bad7ed452d2a3ecff58029d80612d336a45b62c35e917f42d23"}, - {file = "librt-0.7.4-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a4f7339d9e445280f23d63dea842c0c77379c4a47471c538fc8feedab9d8d063"}, - {file = "librt-0.7.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39003fc73f925e684f8521b2dbf34f61a5deb8a20a15dcf53e0d823190ce8848"}, - {file = "librt-0.7.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6bb15ee29d95875ad697d449fe6071b67f730f15a6961913a2b0205015ca0843"}, - {file = "librt-0.7.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:02a69369862099e37d00765583052a99d6a68af7e19b887e1b78fee0146b755a"}, - {file = "librt-0.7.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ec72342cc4d62f38b25a94e28b9efefce41839aecdecf5e9627473ed04b7be16"}, - {file = "librt-0.7.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:776dbb9bfa0fc5ce64234b446995d8d9f04badf64f544ca036bd6cff6f0732ce"}, - {file = "librt-0.7.4-cp314-cp314-win32.whl", hash = "sha256:0f8cac84196d0ffcadf8469d9ded4d4e3a8b1c666095c2a291e22bf58e1e8a9f"}, - {file = "librt-0.7.4-cp314-cp314-win_amd64.whl", hash = "sha256:037f5cb6fe5abe23f1dc058054d50e9699fcc90d0677eee4e4f74a8677636a1a"}, - {file = "librt-0.7.4-cp314-cp314-win_arm64.whl", hash = "sha256:a5deebb53d7a4d7e2e758a96befcd8edaaca0633ae71857995a0f16033289e44"}, - {file = "librt-0.7.4-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b4c25312c7f4e6ab35ab16211bdf819e6e4eddcba3b2ea632fb51c9a2a97e105"}, - {file = "librt-0.7.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:618b7459bb392bdf373f2327e477597fff8f9e6a1878fffc1b711c013d1b0da4"}, - {file = "librt-0.7.4-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1437c3f72a30c7047f16fd3e972ea58b90172c3c6ca309645c1c68984f05526a"}, - {file = "librt-0.7.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c96cb76f055b33308f6858b9b594618f1b46e147a4d03a4d7f0c449e304b9b95"}, - {file = "librt-0.7.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:28f990e6821204f516d09dc39966ef8b84556ffd648d5926c9a3f681e8de8906"}, - {file = "librt-0.7.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bc4aebecc79781a1b77d7d4e7d9fe080385a439e198d993b557b60f9117addaf"}, - {file = "librt-0.7.4-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:022cc673e69283a42621dd453e2407cf1647e77f8bd857d7ad7499901e62376f"}, - {file = "librt-0.7.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2b3ca211ae8ea540569e9c513da052699b7b06928dcda61247cb4f318122bdb5"}, - {file = "librt-0.7.4-cp314-cp314t-win32.whl", hash = "sha256:8a461f6456981d8c8e971ff5a55f2e34f4e60871e665d2f5fde23ee74dea4eeb"}, - {file = "librt-0.7.4-cp314-cp314t-win_amd64.whl", hash = "sha256:721a7b125a817d60bf4924e1eec2a7867bfcf64cfc333045de1df7a0629e4481"}, - {file = "librt-0.7.4-cp314-cp314t-win_arm64.whl", hash = "sha256:76b2ba71265c0102d11458879b4d53ccd0b32b0164d14deb8d2b598a018e502f"}, - {file = "librt-0.7.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6fc4aa67fedd827a601f97f0e61cc72711d0a9165f2c518e9a7c38fc1568b9ad"}, - {file = "librt-0.7.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e710c983d29d9cc4da29113b323647db286eaf384746344f4a233708cca1a82c"}, - {file = "librt-0.7.4-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:43a2515a33f2bc17b15f7fb49ff6426e49cb1d5b2539bc7f8126b9c5c7f37164"}, - {file = "librt-0.7.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0fd766bb9ace3498f6b93d32f30c0e7c8ce6b727fecbc84d28160e217bb66254"}, - {file = "librt-0.7.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce1b44091355b68cffd16e2abac07c1cafa953fa935852d3a4dd8975044ca3bf"}, - {file = "librt-0.7.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5a72b905420c4bb2c10c87b5c09fe6faf4a76d64730e3802feef255e43dfbf5a"}, - {file = "librt-0.7.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:07c4d7c9305e75a0edd3427b79c7bd1d019cd7eddaa7c89dbb10e0c7946bffbb"}, - {file = "librt-0.7.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2e734c2c54423c6dcc77f58a8585ba83b9f72e422f9edf09cab1096d4a4bdc82"}, - {file = "librt-0.7.4-cp39-cp39-win32.whl", hash = "sha256:a34ae11315d4e26326aaf04e21ccd8d9b7de983635fba38d73e203a9c8e3fe3d"}, - {file = "librt-0.7.4-cp39-cp39-win_amd64.whl", hash = "sha256:7e4b5ffa1614ad4f32237d739699be444be28de95071bfa4e66a8da9fa777798"}, - {file = "librt-0.7.4.tar.gz", hash = "sha256:3871af56c59864d5fd21d1ac001eb2fb3b140d52ba0454720f2e4a19812404ba"}, + {file = "librt-0.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:81fd938344fecb9373ba1b155968c8a329491d2ce38e7ddb76f30ffb938f12dc"}, + {file = "librt-0.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5db05697c82b3a2ec53f6e72b2ed373132b0c2e05135f0696784e97d7f5d48e7"}, + {file = "librt-0.8.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d56bc4011975f7460bea7b33e1ff425d2f1adf419935ff6707273c77f8a4ada6"}, + {file = "librt-0.8.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdc0f588ff4b663ea96c26d2a230c525c6fc62b28314edaaaca8ed5af931ad0"}, + {file = "librt-0.8.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:97c2b54ff6717a7a563b72627990bec60d8029df17df423f0ed37d56a17a176b"}, + {file = "librt-0.8.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8f1125e6bbf2f1657d9a2f3ccc4a2c9b0c8b176965bb565dd4d86be67eddb4b6"}, + {file = "librt-0.8.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8f4bb453f408137d7581be309b2fbc6868a80e7ef60c88e689078ee3a296ae71"}, + {file = "librt-0.8.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c336d61d2fe74a3195edc1646d53ff1cddd3a9600b09fa6ab75e5514ba4862a7"}, + {file = "librt-0.8.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:eb5656019db7c4deacf0c1a55a898c5bb8f989be904597fcb5232a2f4828fa05"}, + {file = "librt-0.8.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c25d9e338d5bed46c1632f851babf3d13c78f49a225462017cf5e11e845c5891"}, + {file = "librt-0.8.1-cp310-cp310-win32.whl", hash = "sha256:aaab0e307e344cb28d800957ef3ec16605146ef0e59e059a60a176d19543d1b7"}, + {file = "librt-0.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:56e04c14b696300d47b3bc5f1d10a00e86ae978886d0cee14e5714fafb5df5d2"}, + {file = "librt-0.8.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:681dc2451d6d846794a828c16c22dc452d924e9f700a485b7ecb887a30aad1fd"}, + {file = "librt-0.8.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3b4350b13cc0e6f5bec8fa7caf29a8fb8cdc051a3bae45cfbfd7ce64f009965"}, + {file = "librt-0.8.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ac1e7817fd0ed3d14fd7c5df91daed84c48e4c2a11ee99c0547f9f62fdae13da"}, + {file = "librt-0.8.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:747328be0c5b7075cde86a0e09d7a9196029800ba75a1689332348e998fb85c0"}, + {file = "librt-0.8.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0af2bd2bc204fa27f3d6711d0f360e6b8c684a035206257a81673ab924aa11e"}, + {file = "librt-0.8.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d480de377f5b687b6b1bc0c0407426da556e2a757633cc7e4d2e1a057aa688f3"}, + {file = "librt-0.8.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d0ee06b5b5291f609ddb37b9750985b27bc567791bc87c76a569b3feed8481ac"}, + {file = "librt-0.8.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9e2c6f77b9ad48ce5603b83b7da9ee3e36b3ab425353f695cba13200c5d96596"}, + {file = "librt-0.8.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:439352ba9373f11cb8e1933da194dcc6206daf779ff8df0ed69c5e39113e6a99"}, + {file = "librt-0.8.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:82210adabbc331dbb65d7868b105185464ef13f56f7f76688565ad79f648b0fe"}, + {file = "librt-0.8.1-cp311-cp311-win32.whl", hash = "sha256:52c224e14614b750c0a6d97368e16804a98c684657c7518752c356834fff83bb"}, + {file = "librt-0.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:c00e5c884f528c9932d278d5c9cbbea38a6b81eb62c02e06ae53751a83a4d52b"}, + {file = "librt-0.8.1-cp311-cp311-win_arm64.whl", hash = "sha256:f7cdf7f26c2286ffb02e46d7bac56c94655540b26347673bea15fa52a6af17e9"}, + {file = "librt-0.8.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a28f2612ab566b17f3698b0da021ff9960610301607c9a5e8eaca62f5e1c350a"}, + {file = "librt-0.8.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:60a78b694c9aee2a0f1aaeaa7d101cf713e92e8423a941d2897f4fa37908dab9"}, + {file = "librt-0.8.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:758509ea3f1eba2a57558e7e98f4659d0ea7670bff49673b0dde18a3c7e6c0eb"}, + {file = "librt-0.8.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:039b9f2c506bd0ab0f8725aa5ba339c6f0cd19d3b514b50d134789809c24285d"}, + {file = "librt-0.8.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bb54f1205a3a6ab41a6fd71dfcdcbd278670d3a90ca502a30d9da583105b6f7"}, + {file = "librt-0.8.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:05bd41cdee35b0c59c259f870f6da532a2c5ca57db95b5f23689fcb5c9e42440"}, + {file = "librt-0.8.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adfab487facf03f0d0857b8710cf82d0704a309d8ffc33b03d9302b4c64e91a9"}, + {file = "librt-0.8.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:153188fe98a72f206042be10a2c6026139852805215ed9539186312d50a8e972"}, + {file = "librt-0.8.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:dd3c41254ee98604b08bd5b3af5bf0a89740d4ee0711de95b65166bf44091921"}, + {file = "librt-0.8.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e0d138c7ae532908cbb342162b2611dbd4d90c941cd25ab82084aaf71d2c0bd0"}, + {file = "librt-0.8.1-cp312-cp312-win32.whl", hash = "sha256:43353b943613c5d9c49a25aaffdba46f888ec354e71e3529a00cca3f04d66a7a"}, + {file = "librt-0.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:ff8baf1f8d3f4b6b7257fcb75a501f2a5499d0dda57645baa09d4d0d34b19444"}, + {file = "librt-0.8.1-cp312-cp312-win_arm64.whl", hash = "sha256:0f2ae3725904f7377e11cc37722d5d401e8b3d5851fb9273d7f4fe04f6b3d37d"}, + {file = "librt-0.8.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7e6bad1cd94f6764e1e21950542f818a09316645337fd5ab9a7acc45d99a8f35"}, + {file = "librt-0.8.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cf450f498c30af55551ba4f66b9123b7185362ec8b625a773b3d39aa1a717583"}, + {file = "librt-0.8.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:eca45e982fa074090057132e30585a7e8674e9e885d402eae85633e9f449ce6c"}, + {file = "librt-0.8.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c3811485fccfda840861905b8c70bba5ec094e02825598bb9d4ca3936857a04"}, + {file = "librt-0.8.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e4af413908f77294605e28cfd98063f54b2c790561383971d2f52d113d9c363"}, + {file = "librt-0.8.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5212a5bd7fae98dae95710032902edcd2ec4dc994e883294f75c857b83f9aba0"}, + {file = "librt-0.8.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e692aa2d1d604e6ca12d35e51fdc36f4cda6345e28e36374579f7ef3611b3012"}, + {file = "librt-0.8.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4be2a5c926b9770c9e08e717f05737a269b9d0ebc5d2f0060f0fe3fe9ce47acb"}, + {file = "librt-0.8.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fd1a720332ea335ceb544cf0a03f81df92abd4bb887679fd1e460976b0e6214b"}, + {file = "librt-0.8.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2af9e01e0ef80d95ae3c720be101227edae5f2fe7e3dc63d8857fadfc5a1d"}, + {file = "librt-0.8.1-cp313-cp313-win32.whl", hash = "sha256:086a32dbb71336627e78cc1d6ee305a68d038ef7d4c39aaff41ae8c9aa46e91a"}, + {file = "librt-0.8.1-cp313-cp313-win_amd64.whl", hash = "sha256:e11769a1dbda4da7b00a76cfffa67aa47cfa66921d2724539eee4b9ede780b79"}, + {file = "librt-0.8.1-cp313-cp313-win_arm64.whl", hash = "sha256:924817ab3141aca17893386ee13261f1d100d1ef410d70afe4389f2359fea4f0"}, + {file = "librt-0.8.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6cfa7fe54fd4d1f47130017351a959fe5804bda7a0bc7e07a2cdbc3fdd28d34f"}, + {file = "librt-0.8.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:228c2409c079f8c11fb2e5d7b277077f694cb93443eb760e00b3b83cb8b3176c"}, + {file = "librt-0.8.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7aae78ab5e3206181780e56912d1b9bb9f90a7249ce12f0e8bf531d0462dd0fc"}, + {file = "librt-0.8.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:172d57ec04346b047ca6af181e1ea4858086c80bdf455f61994c4aa6fc3f866c"}, + {file = "librt-0.8.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b1977c4ea97ce5eb7755a78fae68d87e4102e4aaf54985e8b56806849cc06a3"}, + {file = "librt-0.8.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:10c42e1f6fd06733ef65ae7bebce2872bcafd8d6e6b0a08fe0a05a23b044fb14"}, + {file = "librt-0.8.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4c8dfa264b9193c4ee19113c985c95f876fae5e51f731494fc4e0cf594990ba7"}, + {file = "librt-0.8.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:01170b6729a438f0dedc4a26ed342e3dc4f02d1000b4b19f980e1877f0c297e6"}, + {file = "librt-0.8.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:7b02679a0d783bdae30d443025b94465d8c3dc512f32f5b5031f93f57ac32071"}, + {file = "librt-0.8.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:190b109bb69592a3401fe1ffdea41a2e73370ace2ffdc4a0e8e2b39cdea81b78"}, + {file = "librt-0.8.1-cp314-cp314-win32.whl", hash = "sha256:e70a57ecf89a0f64c24e37f38d3fe217a58169d2fe6ed6d70554964042474023"}, + {file = "librt-0.8.1-cp314-cp314-win_amd64.whl", hash = "sha256:7e2f3edca35664499fbb36e4770650c4bd4a08abc1f4458eab9df4ec56389730"}, + {file = "librt-0.8.1-cp314-cp314-win_arm64.whl", hash = "sha256:0d2f82168e55ddefd27c01c654ce52379c0750ddc31ee86b4b266bcf4d65f2a3"}, + {file = "librt-0.8.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2c74a2da57a094bd48d03fa5d196da83d2815678385d2978657499063709abe1"}, + {file = "librt-0.8.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a355d99c4c0d8e5b770313b8b247411ed40949ca44e33e46a4789b9293a907ee"}, + {file = "librt-0.8.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2eb345e8b33fb748227409c9f1233d4df354d6e54091f0e8fc53acdb2ffedeb7"}, + {file = "librt-0.8.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9be2f15e53ce4e83cc08adc29b26fb5978db62ef2a366fbdf716c8a6c8901040"}, + {file = "librt-0.8.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:785ae29c1f5c6e7c2cde2c7c0e148147f4503da3abc5d44d482068da5322fd9e"}, + {file = "librt-0.8.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1d3a7da44baf692f0c6aeb5b2a09c5e6fc7a703bca9ffa337ddd2e2da53f7732"}, + {file = "librt-0.8.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5fc48998000cbc39ec0d5311312dda93ecf92b39aaf184c5e817d5d440b29624"}, + {file = "librt-0.8.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e96baa6820280077a78244b2e06e416480ed859bbd8e5d641cf5742919d8beb4"}, + {file = "librt-0.8.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:31362dbfe297b23590530007062c32c6f6176f6099646bb2c95ab1b00a57c382"}, + {file = "librt-0.8.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cc3656283d11540ab0ea01978378e73e10002145117055e03722417aeab30994"}, + {file = "librt-0.8.1-cp314-cp314t-win32.whl", hash = "sha256:738f08021b3142c2918c03692608baed43bc51144c29e35807682f8070ee2a3a"}, + {file = "librt-0.8.1-cp314-cp314t-win_amd64.whl", hash = "sha256:89815a22daf9c51884fb5dbe4f1ef65ee6a146e0b6a8df05f753e2e4a9359bf4"}, + {file = "librt-0.8.1-cp314-cp314t-win_arm64.whl", hash = "sha256:bf512a71a23504ed08103a13c941f763db13fb11177beb3d9244c98c29fb4a61"}, + {file = "librt-0.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3dff3d3ca8db20e783b1bc7de49c0a2ab0b8387f31236d6a026597d07fcd68ac"}, + {file = "librt-0.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:08eec3a1fc435f0d09c87b6bf1ec798986a3544f446b864e4099633a56fcd9ed"}, + {file = "librt-0.8.1-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e3f0a41487fd5fad7e760b9e8a90e251e27c2816fbc2cff36a22a0e6bcbbd9dd"}, + {file = "librt-0.8.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bacdb58d9939d95cc557b4dbaa86527c9db2ac1ed76a18bc8d26f6dc8647d851"}, + {file = "librt-0.8.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6d7ab1f01aa753188605b09a51faa44a3327400b00b8cce424c71910fc0a128"}, + {file = "librt-0.8.1-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4998009e7cb9e896569f4be7004f09d0ed70d386fa99d42b6d363f6d200501ac"}, + {file = "librt-0.8.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2cc68eeeef5e906839c7bb0815748b5b0a974ec27125beefc0f942715785b551"}, + {file = "librt-0.8.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0bf69d79a23f4f40b8673a947a234baeeb133b5078b483b7297c5916539cf5d5"}, + {file = "librt-0.8.1-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:22b46eabd76c1986ee7d231b0765ad387d7673bbd996aa0d0d054b38ac65d8f6"}, + {file = "librt-0.8.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:237796479f4d0637d6b9cbcb926ff424a97735e68ade6facf402df4ec93375ed"}, + {file = "librt-0.8.1-cp39-cp39-win32.whl", hash = "sha256:4beb04b8c66c6ae62f8c1e0b2f097c1ebad9295c929a8d5286c05eae7c2fc7dc"}, + {file = "librt-0.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:64548cde61b692dc0dc379f4b5f59a2f582c2ebe7890d09c1ae3b9e66fa015b7"}, + {file = "librt-0.8.1.tar.gz", hash = "sha256:be46a14693955b3bd96014ccbdb8339ee8c9346fbe11c1b78901b55125f14c73"}, ] [[package]] @@ -2065,6 +2077,7 @@ description = "Workflow mgmgt + task scheduling + dependency resolution." optional = false python-versions = "*" groups = ["dev"] +markers = "python_version >= \"3.12\"" files = [ {file = "luigi-3.6.0.tar.gz", hash = "sha256:41b14850223c619d9006b30acda733e756b883fc7e60814205576647190c96e3"}, ] @@ -2080,6 +2093,34 @@ jsonschema = ["jsonschema"] prometheus = ["prometheus-client (>=0.5,<0.15)"] toml = ["toml (<2.0.0)"] +[[package]] +name = "luigi" +version = "3.7.3" +description = "Workflow mgmgt + task scheduling + dependency resolution." +optional = false +python-versions = "<3.13,>=3.8.0" +groups = ["dev"] +markers = "python_version < \"3.12\"" +files = [ + {file = "luigi-3.7.3-py3-none-any.whl", hash = "sha256:f6aaac2417e28a833d30e6b1cd03fe53b2254024dd861fa104ab342cc4f3b843"}, + {file = "luigi-3.7.3.tar.gz", hash = "sha256:82e3a5d482e9738f4dcae5acb631ee7ffa748896cb1a1d5d4922c2cac61903fe"}, +] + +[package.dependencies] +python-daemon = [ + {version = "*", markers = "sys_platform != \"win32\""}, + {version = "<2.2.0", markers = "sys_platform == \"win32\""}, +] +python-dateutil = ">=2.7.5,<3" +tenacity = ">=8,<9" +tornado = ">=5.0,<7" +typing-extensions = ">=4.12.2" + +[package.extras] +jsonschema = ["jsonschema"] +prometheus = ["prometheus-client (>=0.5,<0.15)"] +toml = ["toml (<2.0.0)"] + [[package]] name = "markdown-it-py" version = "3.0.0" @@ -2485,30 +2526,6 @@ example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "momepy extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"] test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] -[[package]] -name = "networkx" -version = "3.6" -description = "Python package for creating and manipulating graphs and networks" -optional = false -python-versions = ">=3.11" -groups = ["dev"] -markers = "python_version >= \"3.12\"" -files = [ - {file = "networkx-3.6-py3-none-any.whl", hash = "sha256:cdb395b105806062473d3be36458d8f1459a4e4b98e236a66c3a48996e07684f"}, - {file = "networkx-3.6.tar.gz", hash = "sha256:285276002ad1f7f7da0f7b42f004bcba70d381e936559166363707fdad3d72ad"}, -] - -[package.extras] -benchmarking = ["asv", "virtualenv"] -default = ["matplotlib (>=3.8)", "numpy (>=1.25)", "pandas (>=2.0)", "scipy (>=1.11.2)"] -developer = ["mypy (>=1.15)", "pre-commit (>=4.1)"] -doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=10)", "pydata-sphinx-theme (>=0.16)", "sphinx (>=8.0)", "sphinx-gallery (>=0.18)", "texext (>=0.6.7)"] -example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "iplotx (>=0.9.0)", "momepy (>=0.7.2)", "osmnx (>=2.0.0)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"] -extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"] -release = ["build (>=0.10)", "changelist (==0.5)", "twine (>=4.0)", "wheel (>=0.40)"] -test = ["pytest (>=7.2)", "pytest-cov (>=4.0)", "pytest-xdist (>=3.0)"] -test-extras = ["pytest-mpl", "pytest-randomly"] - [[package]] name = "networkx" version = "3.6.1" @@ -2516,7 +2533,7 @@ description = "Python package for creating and manipulating graphs and networks" optional = false python-versions = "!=3.14.1,>=3.11" groups = ["dev"] -markers = "python_version == \"3.11\"" +markers = "python_version >= \"3.11\"" files = [ {file = "networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762"}, {file = "networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509"}, @@ -2535,38 +2552,39 @@ test-extras = ["pytest-mpl", "pytest-randomly"] [[package]] name = "nh3" -version = "0.3.2" +version = "0.3.3" description = "Python binding to Ammonia HTML sanitizer Rust crate" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "nh3-0.3.2-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:d18957a90806d943d141cc5e4a0fefa1d77cf0d7a156878bf9a66eed52c9cc7d"}, - {file = "nh3-0.3.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45c953e57028c31d473d6b648552d9cab1efe20a42ad139d78e11d8f42a36130"}, - {file = "nh3-0.3.2-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c9850041b77a9147d6bbd6dbbf13eeec7009eb60b44e83f07fcb2910075bf9b"}, - {file = "nh3-0.3.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:403c11563e50b915d0efdb622866d1d9e4506bce590ef7da57789bf71dd148b5"}, - {file = "nh3-0.3.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:0dca4365db62b2d71ff1620ee4f800c4729849906c5dd504ee1a7b2389558e31"}, - {file = "nh3-0.3.2-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0fe7ee035dd7b2290715baf29cb27167dddd2ff70ea7d052c958dbd80d323c99"}, - {file = "nh3-0.3.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a40202fd58e49129764f025bbaae77028e420f1d5b3c8e6f6fd3a6490d513868"}, - {file = "nh3-0.3.2-cp314-cp314t-win32.whl", hash = "sha256:1f9ba555a797dbdcd844b89523f29cdc90973d8bd2e836ea6b962cf567cadd93"}, - {file = "nh3-0.3.2-cp314-cp314t-win_amd64.whl", hash = "sha256:dce4248edc427c9b79261f3e6e2b3ecbdd9b88c267012168b4a7b3fc6fd41d13"}, - {file = "nh3-0.3.2-cp314-cp314t-win_arm64.whl", hash = "sha256:019ecbd007536b67fdf76fab411b648fb64e2257ca3262ec80c3425c24028c80"}, - {file = "nh3-0.3.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7064ccf5ace75825bd7bf57859daaaf16ed28660c1c6b306b649a9eda4b54b1e"}, - {file = "nh3-0.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8745454cdd28bbbc90861b80a0111a195b0e3961b9fa2e672be89eb199fa5d8"}, - {file = "nh3-0.3.2-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72d67c25a84579f4a432c065e8b4274e53b7cf1df8f792cf846abfe2c3090866"}, - {file = "nh3-0.3.2-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:13398e676a14d6233f372c75f52d5ae74f98210172991f7a3142a736bd92b131"}, - {file = "nh3-0.3.2-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03d617e5c8aa7331bd2659c654e021caf9bba704b109e7b2b28b039a00949fe5"}, - {file = "nh3-0.3.2-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2f55c4d2d5a207e74eefe4d828067bbb01300e06e2a7436142f915c5928de07"}, - {file = "nh3-0.3.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bb18403f02b655a1bbe4e3a4696c2ae1d6ae8f5991f7cacb684b1ae27e6c9f7"}, - {file = "nh3-0.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6d66f41672eb4060cf87c037f760bdbc6847852ca9ef8e9c5a5da18f090abf87"}, - {file = "nh3-0.3.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f97f8b25cb2681d25e2338148159447e4d689aafdccfcf19e61ff7db3905768a"}, - {file = "nh3-0.3.2-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:2ab70e8c6c7d2ce953d2a58102eefa90c2d0a5ed7aa40c7e29a487bc5e613131"}, - {file = "nh3-0.3.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:1710f3901cd6440ca92494ba2eb6dc260f829fa8d9196b659fa10de825610ce0"}, - {file = "nh3-0.3.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:91e9b001101fb4500a2aafe3e7c92928d85242d38bf5ac0aba0b7480da0a4cd6"}, - {file = "nh3-0.3.2-cp38-abi3-win32.whl", hash = "sha256:169db03df90da63286e0560ea0efa9b6f3b59844a9735514a1d47e6bb2c8c61b"}, - {file = "nh3-0.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:562da3dca7a17f9077593214a9781a94b8d76de4f158f8c895e62f09573945fe"}, - {file = "nh3-0.3.2-cp38-abi3-win_arm64.whl", hash = "sha256:cf5964d54edd405e68583114a7cba929468bcd7db5e676ae38ee954de1cfc104"}, - {file = "nh3-0.3.2.tar.gz", hash = "sha256:f394759a06df8b685a4ebfb1874fb67a9cbfd58c64fc5ed587a663c0e63ec376"}, + {file = "nh3-0.3.3-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:21b058cd20d9f0919421a820a2843fdb5e1749c0bf57a6247ab8f4ba6723c9fc"}, + {file = "nh3-0.3.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4400a73c2a62859e769f9d36d1b5a7a5c65c4179d1dddd2f6f3095b2db0cbfc"}, + {file = "nh3-0.3.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1ef87f8e916321a88b45f2d597f29bd56e560ed4568a50f0f1305afab86b7189"}, + {file = "nh3-0.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a446eae598987f49ee97ac2f18eafcce4e62e7574bd1eb23782e4702e54e217d"}, + {file = "nh3-0.3.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:0d5eb734a78ac364af1797fef718340a373f626a9ff6b4fb0b4badf7927e7b81"}, + {file = "nh3-0.3.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:92a958e6f6d0100e025a5686aafd67e3c98eac67495728f8bb64fbeb3e474493"}, + {file = "nh3-0.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9ed40cf8449a59a03aa465114fedce1ff7ac52561688811d047917cc878b19ca"}, + {file = "nh3-0.3.3-cp314-cp314t-win32.whl", hash = "sha256:b50c3770299fb2a7c1113751501e8878d525d15160a4c05194d7fe62b758aad8"}, + {file = "nh3-0.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:21a63ccb18ddad3f784bb775955839b8b80e347e597726f01e43ca1abcc5c808"}, + {file = "nh3-0.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:f508ddd4e2433fdcb78c790fc2d24e3a349ba775e5fa904af89891321d4844a3"}, + {file = "nh3-0.3.3-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e8ee96156f7dfc6e30ecda650e480c5ae0a7d38f0c6fafc3c1c655e2500421d9"}, + {file = "nh3-0.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45fe0d6a607264910daec30360c8a3b5b1500fd832d21b2da608256287bcb92d"}, + {file = "nh3-0.3.3-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5bc1d4b30ba1ba896669d944b6003630592665974bd11a3dc2f661bde92798a7"}, + {file = "nh3-0.3.3-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f433a2dd66545aad4a720ad1b2150edcdca75bfff6f4e6f378ade1ec138d5e77"}, + {file = "nh3-0.3.3-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52e973cb742e95b9ae1b35822ce23992428750f4b46b619fe86eba4205255b30"}, + {file = "nh3-0.3.3-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c730617bdc15d7092dcc0469dc2826b914c8f874996d105b4bc3842a41c1cd9"}, + {file = "nh3-0.3.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e98fa3dbfd54e25487e36ba500bc29bca3a4cab4ffba18cfb1a35a2d02624297"}, + {file = "nh3-0.3.3-cp38-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:3a62b8ae7c235481715055222e54c682422d0495a5c73326807d4e44c5d14691"}, + {file = "nh3-0.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc305a2264868ec8fa16548296f803d8fd9c1fa66cd28b88b605b1bd06667c0b"}, + {file = "nh3-0.3.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:90126a834c18af03bfd6ff9a027bfa6bbf0e238527bc780a24de6bd7cc1041e2"}, + {file = "nh3-0.3.3-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:24769a428e9e971e4ccfb24628f83aaa7dc3c8b41b130c8ddc1835fa1c924489"}, + {file = "nh3-0.3.3-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:b7a18ee057761e455d58b9d31445c3e4b2594cff4ddb84d2e331c011ef46f462"}, + {file = "nh3-0.3.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5a4b2c1f3e6f3cbe7048e17f4fefad3f8d3e14cc0fd08fb8599e0d5653f6b181"}, + {file = "nh3-0.3.3-cp38-abi3-win32.whl", hash = "sha256:e974850b131fdffa75e7ad8e0d9c7a855b96227b093417fdf1bd61656e530f37"}, + {file = "nh3-0.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:2efd17c0355d04d39e6d79122b42662277ac10a17ea48831d90b46e5ef7e4fc0"}, + {file = "nh3-0.3.3-cp38-abi3-win_arm64.whl", hash = "sha256:b838e619f483531483d26d889438e53a880510e832d2aafe73f93b7b1ac2bce2"}, + {file = "nh3-0.3.3.tar.gz", hash = "sha256:185ed41b88c910b9ca8edc89ca3b4be688a12cb9de129d84befa2f74a0039fee"}, ] [[package]] @@ -2583,14 +2601,14 @@ files = [ [[package]] name = "nox" -version = "2025.11.12" +version = "2026.2.9" description = "Flexible test automation." optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "nox-2025.11.12-py3-none-any.whl", hash = "sha256:707171f9f63bc685da9d00edd8c2ceec8405b8e38b5fb4e46114a860070ef0ff"}, - {file = "nox-2025.11.12.tar.gz", hash = "sha256:3d317f9e61f49d6bde39cf2f59695bb4e1722960457eee3ae19dacfe03c07259"}, + {file = "nox-2026.2.9-py3-none-any.whl", hash = "sha256:1b7143bc8ecdf25f2353201326152c5303ae4ae56ca097b1fb6179ad75164c47"}, + {file = "nox-2026.2.9.tar.gz", hash = "sha256:1bc8a202ee8cd69be7aaada63b2a7019126899a06fc930a7aee75585bf8ee41b"}, ] [package.dependencies] @@ -2599,7 +2617,7 @@ attrs = ">=24.1" colorlog = ">=2.6.1,<7" dependency-groups = ">=1.1" humanize = ">=4" -packaging = {version = ">=21", markers = "python_version >= \"3.10\""} +packaging = ">=22" tomli = {version = ">=1.1", markers = "python_version < \"3.11\""} virtualenv = {version = ">=20.15", markers = "python_version >= \"3.10\""} @@ -2676,85 +2694,85 @@ files = [ [[package]] name = "numpy" -version = "2.4.0" +version = "2.4.2" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.11" groups = ["dev"] markers = "python_version >= \"3.11\"" files = [ - {file = "numpy-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:316b2f2584682318539f0bcaca5a496ce9ca78c88066579ebd11fd06f8e4741e"}, - {file = "numpy-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2718c1de8504121714234b6f8241d0019450353276c88b9453c9c3d92e101db"}, - {file = "numpy-2.4.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:21555da4ec4a0c942520ead42c3b0dc9477441e085c42b0fbdd6a084869a6f6b"}, - {file = "numpy-2.4.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:413aa561266a4be2d06cd2b9665e89d9f54c543f418773076a76adcf2af08bc7"}, - {file = "numpy-2.4.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0feafc9e03128074689183031181fac0897ff169692d8492066e949041096548"}, - {file = "numpy-2.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8fdfed3deaf1928fb7667d96e0567cdf58c2b370ea2ee7e586aa383ec2cb346"}, - {file = "numpy-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e06a922a469cae9a57100864caf4f8a97a1026513793969f8ba5b63137a35d25"}, - {file = "numpy-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:927ccf5cd17c48f801f4ed43a7e5673a2724bd2171460be3e3894e6e332ef83a"}, - {file = "numpy-2.4.0-cp311-cp311-win32.whl", hash = "sha256:882567b7ae57c1b1a0250208cc21a7976d8cbcc49d5a322e607e6f09c9e0bd53"}, - {file = "numpy-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:8b986403023c8f3bf8f487c2e6186afda156174d31c175f747d8934dfddf3479"}, - {file = "numpy-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:3f3096405acc48887458bbf9f6814d43785ac7ba2a57ea6442b581dedbc60ce6"}, - {file = "numpy-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2a8b6bb8369abefb8bd1801b054ad50e02b3275c8614dc6e5b0373c305291037"}, - {file = "numpy-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e284ca13d5a8367e43734148622caf0b261b275673823593e3e3634a6490f83"}, - {file = "numpy-2.4.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:49ff32b09f5aa0cd30a20c2b39db3e669c845589f2b7fc910365210887e39344"}, - {file = "numpy-2.4.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:36cbfb13c152b1c7c184ddac43765db8ad672567e7bafff2cc755a09917ed2e6"}, - {file = "numpy-2.4.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:35ddc8f4914466e6fc954c76527aa91aa763682a4f6d73249ef20b418fe6effb"}, - {file = "numpy-2.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc578891de1db95b2a35001b695451767b580bb45753717498213c5ff3c41d63"}, - {file = "numpy-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98e81648e0b36e325ab67e46b5400a7a6d4a22b8a7c8e8bbfe20e7db7906bf95"}, - {file = "numpy-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d57b5046c120561ba8fa8e4030fbb8b822f3063910fa901ffadf16e2b7128ad6"}, - {file = "numpy-2.4.0-cp312-cp312-win32.whl", hash = "sha256:92190db305a6f48734d3982f2c60fa30d6b5ee9bff10f2887b930d7b40119f4c"}, - {file = "numpy-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:680060061adb2d74ce352628cb798cfdec399068aa7f07ba9fb818b2b3305f98"}, - {file = "numpy-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:39699233bc72dd482da1415dcb06076e32f60eddc796a796c5fb6c5efce94667"}, - {file = "numpy-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a152d86a3ae00ba5f47b3acf3b827509fd0b6cb7d3259665e63dafbad22a75ea"}, - {file = "numpy-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39b19251dec4de8ff8496cd0806cbe27bf0684f765abb1f4809554de93785f2d"}, - {file = "numpy-2.4.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:009bd0ea12d3c784b6639a8457537016ce5172109e585338e11334f6a7bb88ee"}, - {file = "numpy-2.4.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5fe44e277225fd3dff6882d86d3d447205d43532c3627313d17e754fb3905a0e"}, - {file = "numpy-2.4.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f935c4493eda9069851058fa0d9e39dbf6286be690066509305e52912714dbb2"}, - {file = "numpy-2.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cfa5f29a695cb7438965e6c3e8d06e0416060cf0d709c1b1c1653a939bf5c2a"}, - {file = "numpy-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ba0cb30acd3ef11c94dc27fbfba68940652492bc107075e7ffe23057f9425681"}, - {file = "numpy-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:60e8c196cd82cbbd4f130b5290007e13e6de3eca79f0d4d38014769d96a7c475"}, - {file = "numpy-2.4.0-cp313-cp313-win32.whl", hash = "sha256:5f48cb3e88fbc294dc90e215d86fbaf1c852c63dbdb6c3a3e63f45c4b57f7344"}, - {file = "numpy-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:a899699294f28f7be8992853c0c60741f16ff199205e2e6cdca155762cbaa59d"}, - {file = "numpy-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:9198f447e1dc5647d07c9a6bbe2063cc0132728cc7175b39dbc796da5b54920d"}, - {file = "numpy-2.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74623f2ab5cc3f7c886add4f735d1031a1d2be4a4ae63c0546cfd74e7a31ddf6"}, - {file = "numpy-2.4.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:0804a8e4ab070d1d35496e65ffd3cf8114c136a2b81f61dfab0de4b218aacfd5"}, - {file = "numpy-2.4.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:02a2038eb27f9443a8b266a66911e926566b5a6ffd1a689b588f7f35b81e7dc3"}, - {file = "numpy-2.4.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1889b3a3f47a7b5bee16bc25a2145bd7cb91897f815ce3499db64c7458b6d91d"}, - {file = "numpy-2.4.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85eef4cb5625c47ee6425c58a3502555e10f45ee973da878ac8248ad58c136f3"}, - {file = "numpy-2.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6dc8b7e2f4eb184b37655195f421836cfae6f58197b67e3ffc501f1333d993fa"}, - {file = "numpy-2.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:44aba2f0cafd287871a495fb3163408b0bd25bbce135c6f621534a07f4f7875c"}, - {file = "numpy-2.4.0-cp313-cp313t-win32.whl", hash = "sha256:20c115517513831860c573996e395707aa9fb691eb179200125c250e895fcd93"}, - {file = "numpy-2.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b48e35f4ab6f6a7597c46e301126ceba4c44cd3280e3750f85db48b082624fa4"}, - {file = "numpy-2.4.0-cp313-cp313t-win_arm64.whl", hash = "sha256:4d1cfce39e511069b11e67cd0bd78ceff31443b7c9e5c04db73c7a19f572967c"}, - {file = "numpy-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c95eb6db2884917d86cde0b4d4cf31adf485c8ec36bf8696dd66fa70de96f36b"}, - {file = "numpy-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:65167da969cd1ec3a1df31cb221ca3a19a8aaa25370ecb17d428415e93c1935e"}, - {file = "numpy-2.4.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3de19cfecd1465d0dcf8a5b5ea8b3155b42ed0b639dba4b71e323d74f2a3be5e"}, - {file = "numpy-2.4.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:6c05483c3136ac4c91b4e81903cb53a8707d316f488124d0398499a4f8e8ef51"}, - {file = "numpy-2.4.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36667db4d6c1cea79c8930ab72fadfb4060feb4bfe724141cd4bd064d2e5f8ce"}, - {file = "numpy-2.4.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9a818668b674047fd88c4cddada7ab8f1c298812783e8328e956b78dc4807f9f"}, - {file = "numpy-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1ee32359fb7543b7b7bd0b2f46294db27e29e7bbdf70541e81b190836cd83ded"}, - {file = "numpy-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e493962256a38f58283de033d8af176c5c91c084ea30f15834f7545451c42059"}, - {file = "numpy-2.4.0-cp314-cp314-win32.whl", hash = "sha256:6bbaebf0d11567fa8926215ae731e1d58e6ec28a8a25235b8a47405d301332db"}, - {file = "numpy-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:3d857f55e7fdf7c38ab96c4558c95b97d1c685be6b05c249f5fdafcbd6f9899e"}, - {file = "numpy-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:bb50ce5fb202a26fd5404620e7ef820ad1ab3558b444cb0b55beb7ef66cd2d63"}, - {file = "numpy-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:355354388cba60f2132df297e2d53053d4063f79077b67b481d21276d61fc4df"}, - {file = "numpy-2.4.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:1d8f9fde5f6dc1b6fc34df8162f3b3079365468703fee7f31d4e0cc8c63baed9"}, - {file = "numpy-2.4.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e0434aa22c821f44eeb4c650b81c7fbdd8c0122c6c4b5a576a76d5a35625ecd9"}, - {file = "numpy-2.4.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40483b2f2d3ba7aad426443767ff5632ec3156ef09742b96913787d13c336471"}, - {file = "numpy-2.4.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6a7664ddd9746e20b7325351fe1a8408d0a2bf9c63b5e898290ddc8f09544"}, - {file = "numpy-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ecb0019d44f4cdb50b676c5d0cb4b1eae8e15d1ed3d3e6639f986fc92b2ec52c"}, - {file = "numpy-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d0ffd9e2e4441c96a9c91ec1783285d80bf835b677853fc2770a89d50c1e48ac"}, - {file = "numpy-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:77f0d13fa87036d7553bf81f0e1fe3ce68d14c9976c9851744e4d3e91127e95f"}, - {file = "numpy-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b1f5b45829ac1848893f0ddf5cb326110604d6df96cdc255b0bf9edd154104d4"}, - {file = "numpy-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:23a3e9d1a6f360267e8fbb38ba5db355a6a7e9be71d7fce7ab3125e88bb646c8"}, - {file = "numpy-2.4.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b54c83f1c0c0f1d748dca0af516062b8829d53d1f0c402be24b4257a9c48ada6"}, - {file = "numpy-2.4.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:aabb081ca0ec5d39591fc33018cd4b3f96e1a2dd6756282029986d00a785fba4"}, - {file = "numpy-2.4.0-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:8eafe7c36c8430b7794edeab3087dec7bf31d634d92f2af9949434b9d1964cba"}, - {file = "numpy-2.4.0-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2f585f52b2baf07ff3356158d9268ea095e221371f1074fadea2f42544d58b4d"}, - {file = "numpy-2.4.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32ed06d0fe9cae27d8fb5f400c63ccee72370599c75e683a6358dd3a4fb50aaf"}, - {file = "numpy-2.4.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:57c540ed8fb1f05cb997c6761cd56db72395b0d6985e90571ff660452ade4f98"}, - {file = "numpy-2.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a39fb973a726e63223287adc6dafe444ce75af952d711e400f3bf2b36ef55a7b"}, - {file = "numpy-2.4.0.tar.gz", hash = "sha256:6e504f7b16118198f138ef31ba24d985b124c2c469fe8467007cf30fd992f934"}, + {file = "numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7e88598032542bd49af7c4747541422884219056c268823ef6e5e89851c8825"}, + {file = "numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7edc794af8b36ca37ef5fcb5e0d128c7e0595c7b96a2318d1badb6fcd8ee86b1"}, + {file = "numpy-2.4.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6e9f61981ace1360e42737e2bae58b27bf28a1b27e781721047d84bd754d32e7"}, + {file = "numpy-2.4.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cb7bbb88aa74908950d979eeaa24dbdf1a865e3c7e45ff0121d8f70387b55f73"}, + {file = "numpy-2.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f069069931240b3fc703f1e23df63443dbd6390614c8c44a87d96cd0ec81eb1"}, + {file = "numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c02ef4401a506fb60b411467ad501e1429a3487abca4664871d9ae0b46c8ba32"}, + {file = "numpy-2.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2653de5c24910e49c2b106499803124dde62a5a1fe0eedeaecf4309a5f639390"}, + {file = "numpy-2.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1ae241bbfc6ae276f94a170b14785e561cb5e7f626b6688cf076af4110887413"}, + {file = "numpy-2.4.2-cp311-cp311-win32.whl", hash = "sha256:df1b10187212b198dd45fa943d8985a3c8cf854aed4923796e0e019e113a1bda"}, + {file = "numpy-2.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:b9c618d56a29c9cb1c4da979e9899be7578d2e0b3c24d52079c166324c9e8695"}, + {file = "numpy-2.4.2-cp311-cp311-win_arm64.whl", hash = "sha256:47c5a6ed21d9452b10227e5e8a0e1c22979811cad7dcc19d8e3e2fb8fa03f1a3"}, + {file = "numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21982668592194c609de53ba4933a7471880ccbaadcc52352694a59ecc860b3a"}, + {file = "numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40397bda92382fcec844066efb11f13e1c9a3e2a8e8f318fb72ed8b6db9f60f1"}, + {file = "numpy-2.4.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b3a24467af63c67829bfaa61eecf18d5432d4f11992688537be59ecd6ad32f5e"}, + {file = "numpy-2.4.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:805cc8de9fd6e7a22da5aed858e0ab16be5a4db6c873dde1d7451c541553aa27"}, + {file = "numpy-2.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d82351358ffbcdcd7b686b90742a9b86632d6c1c051016484fa0b326a0a1548"}, + {file = "numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e35d3e0144137d9fdae62912e869136164534d64a169f86438bc9561b6ad49f"}, + {file = "numpy-2.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adb6ed2ad29b9e15321d167d152ee909ec73395901b70936f029c3bc6d7f4460"}, + {file = "numpy-2.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8906e71fd8afcb76580404e2a950caef2685df3d2a57fe82a86ac8d33cc007ba"}, + {file = "numpy-2.4.2-cp312-cp312-win32.whl", hash = "sha256:ec055f6dae239a6299cace477b479cca2fc125c5675482daf1dd886933a1076f"}, + {file = "numpy-2.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:209fae046e62d0ce6435fcfe3b1a10537e858249b3d9b05829e2a05218296a85"}, + {file = "numpy-2.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:fbde1b0c6e81d56f5dccd95dd4a711d9b95df1ae4009a60887e56b27e8d903fa"}, + {file = "numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25f2059807faea4b077a2b6837391b5d830864b3543627f381821c646f31a63c"}, + {file = "numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bd3a7a9f5847d2fb8c2c6d1c862fa109c31a9abeca1a3c2bd5a64572955b2979"}, + {file = "numpy-2.4.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8e4549f8a3c6d13d55041925e912bfd834285ef1dd64d6bc7d542583355e2e98"}, + {file = "numpy-2.4.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:aea4f66ff44dfddf8c2cffd66ba6538c5ec67d389285292fe428cb2c738c8aef"}, + {file = "numpy-2.4.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3cd545784805de05aafe1dde61752ea49a359ccba9760c1e5d1c88a93bbf2b7"}, + {file = "numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0d9b7c93578baafcbc5f0b83eaf17b79d345c6f36917ba0c67f45226911d499"}, + {file = "numpy-2.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f74f0f7779cc7ae07d1810aab8ac6b1464c3eafb9e283a40da7309d5e6e48fbb"}, + {file = "numpy-2.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7ac672d699bf36275c035e16b65539931347d68b70667d28984c9fb34e07fa7"}, + {file = "numpy-2.4.2-cp313-cp313-win32.whl", hash = "sha256:8e9afaeb0beff068b4d9cd20d322ba0ee1cecfb0b08db145e4ab4dd44a6b5110"}, + {file = "numpy-2.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622"}, + {file = "numpy-2.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:0fece1d1f0a89c16b03442eae5c56dc0be0c7883b5d388e0c03f53019a4bfd71"}, + {file = "numpy-2.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5633c0da313330fd20c484c78cdd3f9b175b55e1a766c4a174230c6b70ad8262"}, + {file = "numpy-2.4.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d9f64d786b3b1dd742c946c42d15b07497ed14af1a1f3ce840cce27daa0ce913"}, + {file = "numpy-2.4.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:b21041e8cb6a1eb5312dd1d2f80a94d91efffb7a06b70597d44f1bd2dfc315ab"}, + {file = "numpy-2.4.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:00ab83c56211a1d7c07c25e3217ea6695e50a3e2f255053686b081dc0b091a82"}, + {file = "numpy-2.4.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fb882da679409066b4603579619341c6d6898fc83a8995199d5249f986e8e8f"}, + {file = "numpy-2.4.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66cb9422236317f9d44b67b4d18f44efe6e9c7f8794ac0462978513359461554"}, + {file = "numpy-2.4.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0f01dcf33e73d80bd8dc0f20a71303abbafa26a19e23f6b68d1aa9990af90257"}, + {file = "numpy-2.4.2-cp313-cp313t-win32.whl", hash = "sha256:52b913ec40ff7ae845687b0b34d8d93b60cb66dcee06996dd5c99f2fc9328657"}, + {file = "numpy-2.4.2-cp313-cp313t-win_amd64.whl", hash = "sha256:5eea80d908b2c1f91486eb95b3fb6fab187e569ec9752ab7d9333d2e66bf2d6b"}, + {file = "numpy-2.4.2-cp313-cp313t-win_arm64.whl", hash = "sha256:fd49860271d52127d61197bb50b64f58454e9f578cb4b2c001a6de8b1f50b0b1"}, + {file = "numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:444be170853f1f9d528428eceb55f12918e4fda5d8805480f36a002f1415e09b"}, + {file = "numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d1240d50adff70c2a88217698ca844723068533f3f5c5fa6ee2e3220e3bdb000"}, + {file = "numpy-2.4.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:7cdde6de52fb6664b00b056341265441192d1291c130e99183ec0d4b110ff8b1"}, + {file = "numpy-2.4.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:cda077c2e5b780200b6b3e09d0b42205a3d1c68f30c6dceb90401c13bff8fe74"}, + {file = "numpy-2.4.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d30291931c915b2ab5717c2974bb95ee891a1cf22ebc16a8006bd59cd210d40a"}, + {file = "numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bba37bc29d4d85761deed3954a1bc62be7cf462b9510b51d367b769a8c8df325"}, + {file = "numpy-2.4.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b2f0073ed0868db1dcd86e052d37279eef185b9c8db5bf61f30f46adac63c909"}, + {file = "numpy-2.4.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7f54844851cdb630ceb623dcec4db3240d1ac13d4990532446761baede94996a"}, + {file = "numpy-2.4.2-cp314-cp314-win32.whl", hash = "sha256:12e26134a0331d8dbd9351620f037ec470b7c75929cb8a1537f6bfe411152a1a"}, + {file = "numpy-2.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:068cdb2d0d644cdb45670810894f6a0600797a69c05f1ac478e8d31670b8ee75"}, + {file = "numpy-2.4.2-cp314-cp314-win_arm64.whl", hash = "sha256:6ed0be1ee58eef41231a5c943d7d1375f093142702d5723ca2eb07db9b934b05"}, + {file = "numpy-2.4.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:98f16a80e917003a12c0580f97b5f875853ebc33e2eaa4bccfc8201ac6869308"}, + {file = "numpy-2.4.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:20abd069b9cda45874498b245c8015b18ace6de8546bf50dfa8cea1696ed06ef"}, + {file = "numpy-2.4.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e98c97502435b53741540a5717a6749ac2ada901056c7db951d33e11c885cc7d"}, + {file = "numpy-2.4.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da6cad4e82cb893db4b69105c604d805e0c3ce11501a55b5e9f9083b47d2ffe8"}, + {file = "numpy-2.4.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e4424677ce4b47fe73c8b5556d876571f7c6945d264201180db2dc34f676ab5"}, + {file = "numpy-2.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2b8f157c8a6f20eb657e240f8985cc135598b2b46985c5bccbde7616dc9c6b1e"}, + {file = "numpy-2.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5daf6f3914a733336dab21a05cdec343144600e964d2fcdabaac0c0269874b2a"}, + {file = "numpy-2.4.2-cp314-cp314t-win32.whl", hash = "sha256:8c50dd1fc8826f5b26a5ee4d77ca55d88a895f4e4819c7ecc2a9f5905047a443"}, + {file = "numpy-2.4.2-cp314-cp314t-win_amd64.whl", hash = "sha256:fcf92bee92742edd401ba41135185866f7026c502617f422eb432cfeca4fe236"}, + {file = "numpy-2.4.2-cp314-cp314t-win_arm64.whl", hash = "sha256:1f92f53998a17265194018d1cc321b2e96e900ca52d54c7c77837b71b9465181"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:89f7268c009bc492f506abd6f5265defa7cb3f7487dc21d357c3d290add45082"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6dee3bb76aa4009d5a912180bf5b2de012532998d094acee25d9cb8dee3e44a"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:cd2bd2bbed13e213d6b55dc1d035a4f91748a7d3edc9480c13898b0353708920"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:cf28c0c1d4c4bf00f509fa7eb02c58d7caf221b50b467bcb0d9bbf1584d5c821"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e04ae107ac591763a47398bb45b568fc38f02dbc4aa44c063f67a131f99346cb"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:602f65afdef699cda27ec0b9224ae5dc43e328f4c24c689deaf77133dbee74d0"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be71bf1edb48ebbbf7f6337b5bfd2f895d1902f6335a5830b20141fc126ffba0"}, + {file = "numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae"}, ] [[package]] @@ -2777,14 +2795,14 @@ test = ["pytest"] [[package]] name = "packaging" -version = "25.0" +version = "26.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, - {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, + {file = "packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529"}, + {file = "packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4"}, ] [[package]] @@ -2910,16 +2928,22 @@ gssapi = ["gssapi (>=1.4.1) ; platform_system != \"Windows\"", "pyasn1 (>=0.1.7) [[package]] name = "pathspec" -version = "0.12.1" +version = "1.0.4" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, + {file = "pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723"}, + {file = "pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645"}, ] +[package.extras] +hyperscan = ["hyperscan (>=0.7)"] +optional = ["typing-extensions (>=4)"] +re2 = ["google-re2 (>=1.1)"] +tests = ["pytest (>=9)", "typing-extensions (>=4.15)"] + [[package]] name = "pip" version = "26.0.1" @@ -2980,14 +3004,14 @@ test = ["pip-audit[cov]", "pretend", "pytest"] [[package]] name = "pip-licenses" -version = "5.5.0" +version = "5.5.1" description = "Dump the software license list of Python packages installed with pip." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pip_licenses-5.5.0-py3-none-any.whl", hash = "sha256:ae1869436d13ee487088d29e71fc5821950062ad25ec28b6a1a443e0add6d8e8"}, - {file = "pip_licenses-5.5.0.tar.gz", hash = "sha256:2473e7afd02a0c21460758f70fd2bb3b3c080c5150713dd33baa9493dc1563a5"}, + {file = "pip_licenses-5.5.1-py3-none-any.whl", hash = "sha256:ed5e229a93760e529cfa7edaec6630b5a2cd3874c1bddb8019e5f18a723fdead"}, + {file = "pip_licenses-5.5.1.tar.gz", hash = "sha256:7df370e6e5024a3f7449abf8e4321ef868ba9a795698ad24ab6851f3e7fc65a7"}, ] [package.dependencies] @@ -3019,21 +3043,16 @@ testing = ["aboutcode-toolkit (>=6.0.0)", "black", "pytest (>=6,!=7.0.0)", "pyte [[package]] name = "platformdirs" -version = "4.5.1" +version = "4.9.2" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31"}, - {file = "platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda"}, + {file = "platformdirs-4.9.2-py3-none-any.whl", hash = "sha256:9170634f126f8efdae22fb58ae8a0eaa86f38365bc57897a6c4f781d1f5875bd"}, + {file = "platformdirs-4.9.2.tar.gz", hash = "sha256:9a33809944b9db043ad67ca0db94b14bf452cc6aeaac46a88ea55b26e2e9d291"}, ] -[package.extras] -docs = ["furo (>=2025.9.25)", "proselint (>=0.14)", "sphinx (>=8.2.3)", "sphinx-autodoc-typehints (>=3.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.4.2)", "pytest-cov (>=7)", "pytest-mock (>=3.15.1)"] -type = ["mypy (>=1.18.2)"] - [[package]] name = "pluggy" version = "1.6.0" @@ -3136,15 +3155,15 @@ files = [ [[package]] name = "pycparser" -version = "2.23" +version = "3.0" description = "C parser in Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["dev"] markers = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\"" files = [ - {file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"}, - {file = "pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2"}, + {file = "pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992"}, + {file = "pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29"}, ] [[package]] @@ -3397,14 +3416,14 @@ pygments = "*" [[package]] name = "pylint" -version = "4.0.4" +version = "4.0.5" description = "python code static checker" optional = false python-versions = ">=3.10.0" groups = ["dev"] files = [ - {file = "pylint-4.0.4-py3-none-any.whl", hash = "sha256:63e06a37d5922555ee2c20963eb42559918c20bd2b21244e4ef426e7c43b92e0"}, - {file = "pylint-4.0.4.tar.gz", hash = "sha256:d9b71674e19b1c36d79265b5887bf8e55278cbe236c9e95d22dc82cf044fdbd2"}, + {file = "pylint-4.0.5-py3-none-any.whl", hash = "sha256:00f51c9b14a3b3ae08cff6b2cdd43f28165c78b165b628692e428fb1f8dc2cf2"}, + {file = "pylint-4.0.5.tar.gz", hash = "sha256:8cd6a618df75deb013bd7eb98327a95f02a6fb839205a6bbf5456ef96afb317c"}, ] [package.dependencies] @@ -3415,7 +3434,7 @@ dill = [ {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, {version = ">=0.3.6", markers = "python_version == \"3.11\""}, ] -isort = ">=5,<5.13 || >5.13,<8" +isort = ">=5,<5.13 || >5.13,<9" mccabe = ">=0.6,<0.8" platformdirs = ">=2.2" tomli = {version = ">=1.1", markers = "python_version < \"3.11\""} @@ -3469,14 +3488,14 @@ tests = ["hypothesis (>=3.27.0)", "pytest (>=7.4.0)", "pytest-cov (>=2.10.1)", " [[package]] name = "pyparsing" -version = "3.3.1" +version = "3.3.2" description = "pyparsing - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pyparsing-3.3.1-py3-none-any.whl", hash = "sha256:023b5e7e5520ad96642e2c6db4cb683d3970bd640cdf7115049a6e9c3682df82"}, - {file = "pyparsing-3.3.1.tar.gz", hash = "sha256:47fad0f17ac1e2cad3de3b458570fbc9b03560aa029ed5e16ee5554da9a2251c"}, + {file = "pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d"}, + {file = "pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc"}, ] [package.extras] @@ -3541,24 +3560,6 @@ tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] -[[package]] -name = "pytest-exasol-backend" -version = "1.2.2" -description = "" -optional = false -python-versions = "<4.0,>=3.10" -groups = ["dev"] -markers = "python_version >= \"3.12\"" -files = [ - {file = "pytest_exasol_backend-1.2.2-py3-none-any.whl", hash = "sha256:5dc3e75422dbb0e4f7b38998a9604e80f06b4b853c266ab65e6e22452f77bd6c"}, - {file = "pytest_exasol_backend-1.2.2.tar.gz", hash = "sha256:1b9154059bb985339a5cae2d7292f0adc979a0d9ef6bed37040a9c4aebca220a"}, -] - -[package.dependencies] -exasol-integration-test-docker-environment = ">=4.3,<5" -exasol-saas-api = ">=2.3,<3" -pytest = ">=7,<9" - [[package]] name = "pytest-exasol-backend" version = "1.3.0" @@ -3566,7 +3567,6 @@ description = "" optional = false python-versions = "<3.14,>=3.10" groups = ["dev"] -markers = "python_version < \"3.12\"" files = [ {file = "pytest_exasol_backend-1.3.0-py3-none-any.whl", hash = "sha256:cd38f3061cb101d22376c64ba712058b0171d954999bc546a59767c38be760d0"}, {file = "pytest_exasol_backend-1.3.0.tar.gz", hash = "sha256:d24544c6a9e25c2e3e4ca45bba412654a0a012e43bf6f4e93edd96d05b493e91"}, @@ -3595,6 +3595,24 @@ werkzeug = ">=0.10" [package.extras] smtp = ["aiosmtpd"] +[[package]] +name = "python-daemon" +version = "2.1.2" +description = "Library to implement a well-behaved Unix daemon process." +optional = false +python-versions = "*" +groups = ["dev"] +markers = "python_version < \"3.12\" and sys_platform == \"win32\"" +files = [ + {file = "python-daemon-2.1.2.tar.gz", hash = "sha256:261c859be5c12ae7d4286dc6951e87e9e1a70a882a8b41fd926efc1ec4214f73"}, + {file = "python_daemon-2.1.2-py2.py3-none-any.whl", hash = "sha256:53da55aec3bb67b576e13a8091a2181f99b395c2eec32a5a0d91d347a5c420a7"}, +] + +[package.dependencies] +docutils = "*" +lockfile = ">=0.10" +setuptools = "*" + [[package]] name = "python-daemon" version = "3.1.2" @@ -3602,6 +3620,7 @@ description = "Library to implement a well-behaved Unix daemon process." optional = false python-versions = ">=3.7" groups = ["dev"] +markers = "sys_platform != \"win32\" or python_version >= \"3.12\"" files = [ {file = "python_daemon-3.1.2-py3-none-any.whl", hash = "sha256:b906833cef63502994ad48e2eab213259ed9bb18d54fa8774dcba2ff7864cec6"}, {file = "python_daemon-3.1.2.tar.gz", hash = "sha256:f7b04335adc473de877f5117e26d5f1142f4c9f7cd765408f0877757be5afbf4"}, @@ -3632,16 +3651,76 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "python-discovery" +version = "1.1.0" +description = "Python interpreter discovery" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "python_discovery-1.1.0-py3-none-any.whl", hash = "sha256:a162893b8809727f54594a99ad2179d2ede4bf953e12d4c7abc3cc9cdbd1437b"}, + {file = "python_discovery-1.1.0.tar.gz", hash = "sha256:447941ba1aed8cc2ab7ee3cb91be5fc137c5bdbb05b7e6ea62fbdcb66e50b268"}, +] + +[package.dependencies] +filelock = ">=3.15.4" +platformdirs = ">=4.3.6,<5" + +[package.extras] +docs = ["furo (>=2025.12.19)", "sphinx (>=9.1)", "sphinx-autodoc-typehints (>=3.6.3)", "sphinxcontrib-mermaid (>=2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.5.4)", "pytest (>=8.3.5)", "pytest-mock (>=3.14)", "setuptools (>=75.1)"] + [[package]] name = "pytokens" -version = "0.3.0" +version = "0.4.1" description = "A Fast, spec compliant Python 3.14+ tokenizer that runs on older Pythons." optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "pytokens-0.3.0-py3-none-any.whl", hash = "sha256:95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3"}, - {file = "pytokens-0.3.0.tar.gz", hash = "sha256:2f932b14ed08de5fcf0b391ace2642f858f1394c0857202959000b68ed7a458a"}, + {file = "pytokens-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a44ed93ea23415c54f3face3b65ef2b844d96aeb3455b8a69b3df6beab6acc5"}, + {file = "pytokens-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:add8bf86b71a5d9fb5b89f023a80b791e04fba57960aa790cc6125f7f1d39dfe"}, + {file = "pytokens-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:670d286910b531c7b7e3c0b453fd8156f250adb140146d234a82219459b9640c"}, + {file = "pytokens-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4e691d7f5186bd2842c14813f79f8884bb03f5995f0575272009982c5ac6c0f7"}, + {file = "pytokens-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:27b83ad28825978742beef057bfe406ad6ed524b2d28c252c5de7b4a6dd48fa2"}, + {file = "pytokens-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d70e77c55ae8380c91c0c18dea05951482e263982911fc7410b1ffd1dadd3440"}, + {file = "pytokens-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a58d057208cb9075c144950d789511220b07636dd2e4708d5645d24de666bdc"}, + {file = "pytokens-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b49750419d300e2b5a3813cf229d4e5a4c728dae470bcc89867a9ad6f25a722d"}, + {file = "pytokens-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9907d61f15bf7261d7e775bd5d7ee4d2930e04424bab1972591918497623a16"}, + {file = "pytokens-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:ee44d0f85b803321710f9239f335aafe16553b39106384cef8e6de40cb4ef2f6"}, + {file = "pytokens-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:140709331e846b728475786df8aeb27d24f48cbcf7bcd449f8de75cae7a45083"}, + {file = "pytokens-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d6c4268598f762bc8e91f5dbf2ab2f61f7b95bdc07953b602db879b3c8c18e1"}, + {file = "pytokens-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24afde1f53d95348b5a0eb19488661147285ca4dd7ed752bbc3e1c6242a304d1"}, + {file = "pytokens-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5ad948d085ed6c16413eb5fec6b3e02fa00dc29a2534f088d3302c47eb59adf9"}, + {file = "pytokens-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:3f901fe783e06e48e8cbdc82d631fca8f118333798193e026a50ce1b3757ea68"}, + {file = "pytokens-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b"}, + {file = "pytokens-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f"}, + {file = "pytokens-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1"}, + {file = "pytokens-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4"}, + {file = "pytokens-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78"}, + {file = "pytokens-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321"}, + {file = "pytokens-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa"}, + {file = "pytokens-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d"}, + {file = "pytokens-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324"}, + {file = "pytokens-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9"}, + {file = "pytokens-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb"}, + {file = "pytokens-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3"}, + {file = "pytokens-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975"}, + {file = "pytokens-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a"}, + {file = "pytokens-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918"}, + {file = "pytokens-0.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:da5baeaf7116dced9c6bb76dc31ba04a2dc3695f3d9f74741d7910122b456edc"}, + {file = "pytokens-0.4.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11edda0942da80ff58c4408407616a310adecae1ddd22eef8c692fe266fa5009"}, + {file = "pytokens-0.4.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0fc71786e629cef478cbf29d7ea1923299181d0699dbe7c3c0f4a583811d9fc1"}, + {file = "pytokens-0.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dcafc12c30dbaf1e2af0490978352e0c4041a7cde31f4f81435c2a5e8b9cabb6"}, + {file = "pytokens-0.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:42f144f3aafa5d92bad964d471a581651e28b24434d184871bd02e3a0d956037"}, + {file = "pytokens-0.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:34bcc734bd2f2d5fe3b34e7b3c0116bfb2397f2d9666139988e7a3eb5f7400e3"}, + {file = "pytokens-0.4.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:941d4343bf27b605e9213b26bfa1c4bf197c9c599a9627eb7305b0defcfe40c1"}, + {file = "pytokens-0.4.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3ad72b851e781478366288743198101e5eb34a414f1d5627cdd585ca3b25f1db"}, + {file = "pytokens-0.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:682fa37ff4d8e95f7df6fe6fe6a431e8ed8e788023c6bcc0f0880a12eab80ad1"}, + {file = "pytokens-0.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:30f51edd9bb7f85c748979384165601d028b84f7bd13fe14d3e065304093916a"}, + {file = "pytokens-0.4.1-py3-none-any.whl", hash = "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de"}, + {file = "pytokens-0.4.1.tar.gz", hash = "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a"}, ] [package.extras] @@ -3895,14 +3974,14 @@ idna2008 = ["idna"] [[package]] name = "rich" -version = "14.2.0" +version = "14.3.3" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.8.0" groups = ["dev"] files = [ - {file = "rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd"}, - {file = "rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4"}, + {file = "rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d"}, + {file = "rich-14.3.3.tar.gz", hash = "sha256:b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b"}, ] [package.dependencies] @@ -3965,7 +4044,7 @@ description = "C version of reader, parser and emitter for ruamel.yaml derived f optional = false python-versions = ">=3.9" groups = ["dev"] -markers = "python_version < \"3.14\" and platform_python_implementation == \"CPython\"" +markers = "platform_python_implementation == \"CPython\"" files = [ {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88eea8baf72f0ccf232c22124d122a7f26e8a24110a0273d9bcddcb0f7e1fa03"}, {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b6f7d74d094d1f3a4e157278da97752f16ee230080ae331fcc219056ca54f77"}, @@ -4032,31 +4111,31 @@ files = [ [[package]] name = "ruff" -version = "0.14.10" +version = "0.14.14" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" groups = ["dev"] files = [ - {file = "ruff-0.14.10-py3-none-linux_armv6l.whl", hash = "sha256:7a3ce585f2ade3e1f29ec1b92df13e3da262178df8c8bdf876f48fa0e8316c49"}, - {file = "ruff-0.14.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:674f9be9372907f7257c51f1d4fc902cb7cf014b9980152b802794317941f08f"}, - {file = "ruff-0.14.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d85713d522348837ef9df8efca33ccb8bd6fcfc86a2cde3ccb4bc9d28a18003d"}, - {file = "ruff-0.14.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6987ebe0501ae4f4308d7d24e2d0fe3d7a98430f5adfd0f1fead050a740a3a77"}, - {file = "ruff-0.14.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:16a01dfb7b9e4eee556fbfd5392806b1b8550c9b4a9f6acd3dbe6812b193c70a"}, - {file = "ruff-0.14.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7165d31a925b7a294465fa81be8c12a0e9b60fb02bf177e79067c867e71f8b1f"}, - {file = "ruff-0.14.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c561695675b972effb0c0a45db233f2c816ff3da8dcfbe7dfc7eed625f218935"}, - {file = "ruff-0.14.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bb98fcbbc61725968893682fd4df8966a34611239c9fd07a1f6a07e7103d08e"}, - {file = "ruff-0.14.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f24b47993a9d8cb858429e97bdf8544c78029f09b520af615c1d261bf827001d"}, - {file = "ruff-0.14.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59aabd2e2c4fd614d2862e7939c34a532c04f1084476d6833dddef4afab87e9f"}, - {file = "ruff-0.14.10-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:213db2b2e44be8625002dbea33bb9c60c66ea2c07c084a00d55732689d697a7f"}, - {file = "ruff-0.14.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b914c40ab64865a17a9a5b67911d14df72346a634527240039eb3bd650e5979d"}, - {file = "ruff-0.14.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1484983559f026788e3a5c07c81ef7d1e97c1c78ed03041a18f75df104c45405"}, - {file = "ruff-0.14.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c70427132db492d25f982fffc8d6c7535cc2fd2c83fc8888f05caaa248521e60"}, - {file = "ruff-0.14.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5bcf45b681e9f1ee6445d317ce1fa9d6cba9a6049542d1c3d5b5958986be8830"}, - {file = "ruff-0.14.10-py3-none-win32.whl", hash = "sha256:104c49fc7ab73f3f3a758039adea978869a918f31b73280db175b43a2d9b51d6"}, - {file = "ruff-0.14.10-py3-none-win_amd64.whl", hash = "sha256:466297bd73638c6bdf06485683e812db1c00c7ac96d4ddd0294a338c62fdc154"}, - {file = "ruff-0.14.10-py3-none-win_arm64.whl", hash = "sha256:e51d046cf6dda98a4633b8a8a771451107413b0f07183b2bef03f075599e44e6"}, - {file = "ruff-0.14.10.tar.gz", hash = "sha256:9a2e830f075d1a42cd28420d7809ace390832a490ed0966fe373ba288e77aaf4"}, + {file = "ruff-0.14.14-py3-none-linux_armv6l.whl", hash = "sha256:7cfe36b56e8489dee8fbc777c61959f60ec0f1f11817e8f2415f429552846aed"}, + {file = "ruff-0.14.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6006a0082336e7920b9573ef8a7f52eec837add1265cc74e04ea8a4368cd704c"}, + {file = "ruff-0.14.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:026c1d25996818f0bf498636686199d9bd0d9d6341c9c2c3b62e2a0198b758de"}, + {file = "ruff-0.14.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f666445819d31210b71e0a6d1c01e24447a20b85458eea25a25fe8142210ae0e"}, + {file = "ruff-0.14.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c0f18b922c6d2ff9a5e6c3ee16259adc513ca775bcf82c67ebab7cbd9da5bc8"}, + {file = "ruff-0.14.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1629e67489c2dea43e8658c3dba659edbfd87361624b4040d1df04c9740ae906"}, + {file = "ruff-0.14.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:27493a2131ea0f899057d49d303e4292b2cae2bb57253c1ed1f256fbcd1da480"}, + {file = "ruff-0.14.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ff589aab3f5b539e35db38425da31a57521efd1e4ad1ae08fc34dbe30bd7df"}, + {file = "ruff-0.14.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc12d74eef0f29f51775f5b755913eb523546b88e2d733e1d701fe65144e89b"}, + {file = "ruff-0.14.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb8481604b7a9e75eff53772496201690ce2687067e038b3cc31aaf16aa0b974"}, + {file = "ruff-0.14.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:14649acb1cf7b5d2d283ebd2f58d56b75836ed8c6f329664fa91cdea19e76e66"}, + {file = "ruff-0.14.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8058d2145566510790eab4e2fad186002e288dec5e0d343a92fe7b0bc1b3e13"}, + {file = "ruff-0.14.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e651e977a79e4c758eb807f0481d673a67ffe53cfa92209781dfa3a996cf8412"}, + {file = "ruff-0.14.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cc8b22da8d9d6fdd844a68ae937e2a0adf9b16514e9a97cc60355e2d4b219fc3"}, + {file = "ruff-0.14.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:16bc890fb4cc9781bb05beb5ab4cd51be9e7cb376bf1dd3580512b24eb3fda2b"}, + {file = "ruff-0.14.14-py3-none-win32.whl", hash = "sha256:b530c191970b143375b6a68e6f743800b2b786bbcf03a7965b06c4bf04568167"}, + {file = "ruff-0.14.14-py3-none-win_amd64.whl", hash = "sha256:3dde1435e6b6fe5b66506c1dff67a421d0b7f6488d466f651c07f4cab3bf20fd"}, + {file = "ruff-0.14.14-py3-none-win_arm64.whl", hash = "sha256:56e6981a98b13a32236a72a8da421d7839221fa308b223b9283312312e5ac76c"}, + {file = "ruff-0.14.14.tar.gz", hash = "sha256:2d0f819c9a90205f3a867dbbd0be083bee9912e170fd7d9704cc8ae45824896b"}, ] [[package]] @@ -4076,6 +4155,28 @@ files = [ cryptography = ">=2.0" jeepney = ">=0.6" +[[package]] +name = "setuptools" +version = "82.0.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +markers = "python_version < \"3.12\" and sys_platform == \"win32\"" +files = [ + {file = "setuptools-82.0.0-py3-none-any.whl", hash = "sha256:70b18734b607bd1da571d097d236cfcfacaf01de45717d59e6e04b96877532e0"}, + {file = "setuptools-82.0.0.tar.gz", hash = "sha256:22e0a2d69474c6ae4feb01951cb69d515ed23728cf96d05513d36e42b62b37cb"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.13.0) ; sys_platform != \"cygwin\""] +core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.18.*)", "pytest-mypy"] + [[package]] name = "shellingham" version = "1.5.4" @@ -4090,14 +4191,14 @@ files = [ [[package]] name = "shibuya" -version = "2025.12.19" +version = "2026.1.9" description = "A clean, responsive, and customizable Sphinx documentation theme with light/dark mode." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "shibuya-2025.12.19-py3-none-any.whl", hash = "sha256:f6262059311322d352bb28f844892f5b72518f2760196a9eb3e58f4f475c7908"}, - {file = "shibuya-2025.12.19.tar.gz", hash = "sha256:8ff6d87a4aad301170dae94cf790f179da9e04e3b32fc6138b46263b74d76564"}, + {file = "shibuya-2026.1.9-py3-none-any.whl", hash = "sha256:b58a3cc6e5619c71d00fcf0be4a3060c87040c2a62a1b3f1a93a6a41ca8eaf45"}, + {file = "shibuya-2026.1.9.tar.gz", hash = "sha256:b389f10fd9c07b048e940f32d1e1ac096a2d49736389173ac771b37a10b51fdf"}, ] [package.dependencies] @@ -4274,14 +4375,14 @@ files = [ [[package]] name = "soupsieve" -version = "2.8.1" +version = "2.8.3" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "soupsieve-2.8.1-py3-none-any.whl", hash = "sha256:a11fe2a6f3d76ab3cf2de04eb339c1be5b506a8a47f2ceb6d139803177f85434"}, - {file = "soupsieve-2.8.1.tar.gz", hash = "sha256:4cf733bc50fa805f5df4b8ef4740fc0e0fa6218cf3006269afd3f9d6d80fd350"}, + {file = "soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95"}, + {file = "soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349"}, ] [[package]] @@ -4384,6 +4485,7 @@ description = "A sphinx extension for designing beautiful, view size responsive optional = false python-versions = ">=3.9" groups = ["dev"] +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"}, @@ -4403,6 +4505,33 @@ 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" +description = "A sphinx extension for designing beautiful, view size responsive web components." +optional = false +python-versions = ">=3.11" +groups = ["dev"] +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"}, +] + +[package.dependencies] +sphinx = ">=7,<10" + +[package.extras] +code-style = ["pre-commit (>=3,<4)"] +rtd = ["myst-parser (>=4,<6)"] +testing = ["defusedxml", "myst-parser (>=4,<6)", "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-inline-tabs" version = "2023.4.21" @@ -4503,14 +4632,14 @@ testing = ["bs4", "coverage", "pygments", "pytest (>=7.1,<8)", "pytest-cov", "py [[package]] name = "sphinx-toolbox" -version = "4.1.0" +version = "4.1.2" description = "Box of handy tools for Sphinx 🧰 📔" optional = false python-versions = ">=3.7" groups = ["dev"] files = [ - {file = "sphinx_toolbox-4.1.0-py3-none-any.whl", hash = "sha256:9024a7482b92ecf4572f83940c87ae26c2eca3ca49ff3df5f59806e88da958f6"}, - {file = "sphinx_toolbox-4.1.0.tar.gz", hash = "sha256:5da890f4bb0cacea4f1cf6cef182c5be480340d0ead43c905f51f7e5aacfc19c"}, + {file = "sphinx_toolbox-4.1.2-py3-none-any.whl", hash = "sha256:0438f8342ba1c6c0d6e47207f4eac167adba61742e8c2b1dc9624ff955b7bc89"}, + {file = "sphinx_toolbox-4.1.2.tar.gz", hash = "sha256:c30a4f86c4c29e97adb0eb9337d35f5093cb96a44f49caffcf7d5bc58a88b781"}, ] [package.dependencies] @@ -4524,7 +4653,7 @@ domdf-python-tools = ">=2.9.0" filelock = ">=3.8.0" html5lib = ">=1.1" roman = ">4.0" -"ruamel.yaml" = ">=0.16.12" +"ruamel.yaml" = ">=0.16.12,<=0.18.16" sphinx = ">=3.2.0" sphinx-autodoc-typehints = ">=1.11.1" sphinx-jinja2-compat = ">=0.1.0" @@ -4664,22 +4793,41 @@ description = "Standard library imghdr redistribution. \"dead battery\"." optional = false python-versions = "*" groups = ["dev"] -markers = "python_version >= \"3.13\"" +markers = "python_version == \"3.13\"" files = [ {file = "standard_imghdr-3.10.14-py3-none-any.whl", hash = "sha256:cdf6883163349624dee9a81d2853a20260337c4cd41c04e99c082e01833a08e2"}, {file = "standard_imghdr-3.10.14.tar.gz", hash = "sha256:2598fe2e7c540dbda34b233295e10957ab8dc8ac6f3bd9eaa8d38be167232e52"}, ] +[[package]] +name = "starlette" +version = "0.52.1" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "starlette-0.52.1-py3-none-any.whl", hash = "sha256:0029d43eb3d273bc4f83a08720b4912ea4b071087a3b48db01b7c839f7954d74"}, + {file = "starlette-0.52.1.tar.gz", hash = "sha256:834edd1b0a23167694292e94f597773bc3f89f362be6effee198165a35d62933"}, +] + +[package.dependencies] +anyio = ">=3.6.2,<5" +typing-extensions = {version = ">=4.10.0", markers = "python_version < \"3.13\""} + +[package.extras] +full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"] + [[package]] name = "stevedore" -version = "5.6.0" +version = "5.7.0" description = "Manage dynamic plugins for Python applications" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "stevedore-5.6.0-py3-none-any.whl", hash = "sha256:4a36dccefd7aeea0c70135526cecb7766c4c84c473b1af68db23d541b6dc1820"}, - {file = "stevedore-5.6.0.tar.gz", hash = "sha256:f22d15c6ead40c5bbfa9ca54aa7e7b4a07d59b36ae03ed12ced1a54cf0b51945"}, + {file = "stevedore-5.7.0-py3-none-any.whl", hash = "sha256:fd25efbb32f1abb4c9e502f385f0018632baac11f9ee5d1b70f88cc5e22ad4ed"}, + {file = "stevedore-5.7.0.tar.gz", hash = "sha256:31dd6fe6b3cbe921e21dcefabc9a5f1cf848cf538a1f27543721b8ca09948aa3"}, ] [[package]] @@ -4820,14 +4968,14 @@ files = [ [[package]] name = "tomlkit" -version = "0.13.3" +version = "0.14.0" description = "Style preserving TOML library" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0"}, - {file = "tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1"}, + {file = "tomlkit-0.14.0-py3-none-any.whl", hash = "sha256:592064ed85b40fa213469f81ac584f67a4f2992509a7c3ea2d632208623a3680"}, + {file = "tomlkit-0.14.0.tar.gz", hash = "sha256:cf00efca415dbd57575befb1f6634c4f42d2d87dbba376128adb42c121b87064"}, ] [[package]] @@ -4880,32 +5028,32 @@ keyring = ["keyring (>=21.2.0)"] [[package]] name = "typer" -version = "0.20.1" +version = "0.24.1" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "typer-0.20.1-py3-none-any.whl", hash = "sha256:4b3bde918a67c8e03d861aa02deca90a95bbac572e71b1b9be56ff49affdb5a8"}, - {file = "typer-0.20.1.tar.gz", hash = "sha256:68585eb1b01203689c4199bc440d6be616f0851e9f0eb41e4a778845c5a0fd5b"}, + {file = "typer-0.24.1-py3-none-any.whl", hash = "sha256:112c1f0ce578bfb4cab9ffdabc68f031416ebcc216536611ba21f04e9aa84c9e"}, + {file = "typer-0.24.1.tar.gz", hash = "sha256:e39b4732d65fbdcde189ae76cf7cd48aeae72919dea1fdfc16593be016256b45"}, ] [package.dependencies] -click = ">=8.0.0" -rich = ">=10.11.0" +annotated-doc = ">=0.0.2" +click = ">=8.2.1" +rich = ">=12.3.0" shellingham = ">=1.3.0" -typing-extensions = ">=3.7.4.3" [[package]] name = "types-requests" -version = "2.32.4.20250913" +version = "2.32.4.20260107" description = "Typing stubs for requests" optional = false python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "types_requests-2.32.4.20250913-py3-none-any.whl", hash = "sha256:78c9c1fffebbe0fa487a418e0fa5252017e9c60d1a2da394077f1780f655d7e1"}, - {file = "types_requests-2.32.4.20250913.tar.gz", hash = "sha256:abd6d4f9ce3a9383f269775a9835a4c24e5cd6b9f647d64f88aa4613c33def5d"}, + {file = "types_requests-2.32.4.20260107-py3-none-any.whl", hash = "sha256:b703fe72f8ce5b31ef031264fe9395cac8f46a04661a79f7ed31a80fb308730d"}, + {file = "types_requests-2.32.4.20260107.tar.gz", hash = "sha256:018a11ac158f801bfa84857ddec1650750e393df8a004a8a9ae2a9bec6fcb24f"}, ] [package.dependencies] @@ -4969,38 +5117,55 @@ h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] +[[package]] +name = "uvicorn" +version = "0.41.0" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "uvicorn-0.41.0-py3-none-any.whl", hash = "sha256:29e35b1d2c36a04b9e180d4007ede3bcb32a85fbdfd6c6aeb3f26839de088187"}, + {file = "uvicorn-0.41.0.tar.gz", hash = "sha256:09d11cf7008da33113824ee5a1c6422d89fbc2ff476540d69a34c87fab8b571a"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" +typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} + +[package.extras] +standard = ["colorama (>=0.4) ; sys_platform == \"win32\"", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.15.1) ; sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"", "watchfiles (>=0.20)", "websockets (>=10.4)"] + [[package]] name = "virtualenv" -version = "20.36.1" +version = "21.0.0" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "virtualenv-20.36.1-py3-none-any.whl", hash = "sha256:575a8d6b124ef88f6f51d56d656132389f961062a9177016a50e4f507bbcc19f"}, - {file = "virtualenv-20.36.1.tar.gz", hash = "sha256:8befb5c81842c641f8ee658481e42641c68b5eab3521d8e092d18320902466ba"}, + {file = "virtualenv-21.0.0-py3-none-any.whl", hash = "sha256:d44e70637402c7f4b10f48491c02a6397a3a187152a70cba0b6bc7642d69fb05"}, + {file = "virtualenv-21.0.0.tar.gz", hash = "sha256:e8efe4271b4a5efe7a4dce9d60a05fd11859406c0d6aa8464f4cf451bc132889"}, ] [package.dependencies] distlib = ">=0.3.7,<1" -filelock = {version = ">=3.20.1,<4", markers = "python_version >= \"3.10\""} +filelock = {version = ">=3.24.2,<4", markers = "python_version >= \"3.10\""} platformdirs = ">=3.9.1,<5" +python-discovery = ">=1" typing-extensions = {version = ">=4.13.2", markers = "python_version < \"3.11\""} -[package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"GraalVM\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] - [[package]] name = "wcwidth" -version = "0.2.14" +version = "0.6.0" description = "Measures the displayed width of unicode strings in a terminal" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1"}, - {file = "wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605"}, + {file = "wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad"}, + {file = "wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159"}, ] [[package]] @@ -5034,14 +5199,14 @@ test = ["websockets"] [[package]] name = "werkzeug" -version = "3.1.5" +version = "3.1.6" description = "The comprehensive WSGI web application library." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "werkzeug-3.1.5-py3-none-any.whl", hash = "sha256:5111e36e91086ece91f93268bb39b4a35c1e6f1feac762c9c822ded0a4e322dc"}, - {file = "werkzeug-3.1.5.tar.gz", hash = "sha256:6a548b0e88955dd07ccb25539d7d0cc97417ee9e179677d22c7041c8f078ce67"}, + {file = "werkzeug-3.1.6-py3-none-any.whl", hash = "sha256:7ddf3357bb9564e407607f988f683d72038551200c704012bb9a4c523d42f131"}, + {file = "werkzeug-3.1.6.tar.gz", hash = "sha256:210c6bede5a420a913956b4791a7f4d6843a43b6fcee4dfa08a65e93007d0d25"}, ] [package.dependencies] @@ -5052,119 +5217,86 @@ watchdog = ["watchdog (>=2.3)"] [[package]] name = "wrapt" -version = "2.0.1" +version = "2.1.1" description = "Module for decorators, wrappers and monkey patching." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "wrapt-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:64b103acdaa53b7caf409e8d45d39a8442fe6dcfec6ba3f3d141e0cc2b5b4dbd"}, - {file = "wrapt-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91bcc576260a274b169c3098e9a3519fb01f2989f6d3d386ef9cbf8653de1374"}, - {file = "wrapt-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab594f346517010050126fcd822697b25a7031d815bb4fbc238ccbe568216489"}, - {file = "wrapt-2.0.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:36982b26f190f4d737f04a492a68accbfc6fa042c3f42326fdfbb6c5b7a20a31"}, - {file = "wrapt-2.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23097ed8bc4c93b7bf36fa2113c6c733c976316ce0ee2c816f64ca06102034ef"}, - {file = "wrapt-2.0.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8bacfe6e001749a3b64db47bcf0341da757c95959f592823a93931a422395013"}, - {file = "wrapt-2.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8ec3303e8a81932171f455f792f8df500fc1a09f20069e5c16bd7049ab4e8e38"}, - {file = "wrapt-2.0.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:3f373a4ab5dbc528a94334f9fe444395b23c2f5332adab9ff4ea82f5a9e33bc1"}, - {file = "wrapt-2.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f49027b0b9503bf6c8cdc297ca55006b80c2f5dd36cecc72c6835ab6e10e8a25"}, - {file = "wrapt-2.0.1-cp310-cp310-win32.whl", hash = "sha256:8330b42d769965e96e01fa14034b28a2a7600fbf7e8f0cc90ebb36d492c993e4"}, - {file = "wrapt-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:1218573502a8235bb8a7ecaed12736213b22dcde9feab115fa2989d42b5ded45"}, - {file = "wrapt-2.0.1-cp310-cp310-win_arm64.whl", hash = "sha256:eda8e4ecd662d48c28bb86be9e837c13e45c58b8300e43ba3c9b4fa9900302f7"}, - {file = "wrapt-2.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0e17283f533a0d24d6e5429a7d11f250a58d28b4ae5186f8f47853e3e70d2590"}, - {file = "wrapt-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85df8d92158cb8f3965aecc27cf821461bb5f40b450b03facc5d9f0d4d6ddec6"}, - {file = "wrapt-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1be685ac7700c966b8610ccc63c3187a72e33cab53526a27b2a285a662cd4f7"}, - {file = "wrapt-2.0.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:df0b6d3b95932809c5b3fecc18fda0f1e07452d05e2662a0b35548985f256e28"}, - {file = "wrapt-2.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4da7384b0e5d4cae05c97cd6f94faaf78cc8b0f791fc63af43436d98c4ab37bb"}, - {file = "wrapt-2.0.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ec65a78fbd9d6f083a15d7613b2800d5663dbb6bb96003899c834beaa68b242c"}, - {file = "wrapt-2.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7de3cc939be0e1174969f943f3b44e0d79b6f9a82198133a5b7fc6cc92882f16"}, - {file = "wrapt-2.0.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:fb1a5b72cbd751813adc02ef01ada0b0d05d3dcbc32976ce189a1279d80ad4a2"}, - {file = "wrapt-2.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3fa272ca34332581e00bf7773e993d4f632594eb2d1b0b162a9038df0fd971dd"}, - {file = "wrapt-2.0.1-cp311-cp311-win32.whl", hash = "sha256:fc007fdf480c77301ab1afdbb6ab22a5deee8885f3b1ed7afcb7e5e84a0e27be"}, - {file = "wrapt-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:47434236c396d04875180171ee1f3815ca1eada05e24a1ee99546320d54d1d1b"}, - {file = "wrapt-2.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:837e31620e06b16030b1d126ed78e9383815cbac914693f54926d816d35d8edf"}, - {file = "wrapt-2.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1fdbb34da15450f2b1d735a0e969c24bdb8d8924892380126e2a293d9902078c"}, - {file = "wrapt-2.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3d32794fe940b7000f0519904e247f902f0149edbe6316c710a8562fb6738841"}, - {file = "wrapt-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:386fb54d9cd903ee0012c09291336469eb7b244f7183d40dc3e86a16a4bace62"}, - {file = "wrapt-2.0.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7b219cb2182f230676308cdcacd428fa837987b89e4b7c5c9025088b8a6c9faf"}, - {file = "wrapt-2.0.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:641e94e789b5f6b4822bb8d8ebbdfc10f4e4eae7756d648b717d980f657a9eb9"}, - {file = "wrapt-2.0.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fe21b118b9f58859b5ebaa4b130dee18669df4bd111daad082b7beb8799ad16b"}, - {file = "wrapt-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:17fb85fa4abc26a5184d93b3efd2dcc14deb4b09edcdb3535a536ad34f0b4dba"}, - {file = "wrapt-2.0.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:b89ef9223d665ab255ae42cc282d27d69704d94be0deffc8b9d919179a609684"}, - {file = "wrapt-2.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a453257f19c31b31ba593c30d997d6e5be39e3b5ad9148c2af5a7314061c63eb"}, - {file = "wrapt-2.0.1-cp312-cp312-win32.whl", hash = "sha256:3e271346f01e9c8b1130a6a3b0e11908049fe5be2d365a5f402778049147e7e9"}, - {file = "wrapt-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:2da620b31a90cdefa9cd0c2b661882329e2e19d1d7b9b920189956b76c564d75"}, - {file = "wrapt-2.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:aea9c7224c302bc8bfc892b908537f56c430802560e827b75ecbde81b604598b"}, - {file = "wrapt-2.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:47b0f8bafe90f7736151f61482c583c86b0693d80f075a58701dd1549b0010a9"}, - {file = "wrapt-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cbeb0971e13b4bd81d34169ed57a6dda017328d1a22b62fda45e1d21dd06148f"}, - {file = "wrapt-2.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb7cffe572ad0a141a7886a1d2efa5bef0bf7fe021deeea76b3ab334d2c38218"}, - {file = "wrapt-2.0.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c8d60527d1ecfc131426b10d93ab5d53e08a09c5fa0175f6b21b3252080c70a9"}, - {file = "wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c654eafb01afac55246053d67a4b9a984a3567c3808bb7df2f8de1c1caba2e1c"}, - {file = "wrapt-2.0.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:98d873ed6c8b4ee2418f7afce666751854d6d03e3c0ec2a399bb039cd2ae89db"}, - {file = "wrapt-2.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9e850f5b7fc67af856ff054c71690d54fa940c3ef74209ad9f935b4f66a0233"}, - {file = "wrapt-2.0.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e505629359cb5f751e16e30cf3f91a1d3ddb4552480c205947da415d597f7ac2"}, - {file = "wrapt-2.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2879af909312d0baf35f08edeea918ee3af7ab57c37fe47cb6a373c9f2749c7b"}, - {file = "wrapt-2.0.1-cp313-cp313-win32.whl", hash = "sha256:d67956c676be5a24102c7407a71f4126d30de2a569a1c7871c9f3cabc94225d7"}, - {file = "wrapt-2.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:9ca66b38dd642bf90c59b6738af8070747b610115a39af2498535f62b5cdc1c3"}, - {file = "wrapt-2.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:5a4939eae35db6b6cec8e7aa0e833dcca0acad8231672c26c2a9ab7a0f8ac9c8"}, - {file = "wrapt-2.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a52f93d95c8d38fed0669da2ebdb0b0376e895d84596a976c15a9eb45e3eccb3"}, - {file = "wrapt-2.0.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4e54bbf554ee29fcceee24fa41c4d091398b911da6e7f5d7bffda963c9aed2e1"}, - {file = "wrapt-2.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:908f8c6c71557f4deaa280f55d0728c3bca0960e8c3dd5ceeeafb3c19942719d"}, - {file = "wrapt-2.0.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e2f84e9af2060e3904a32cea9bb6db23ce3f91cfd90c6b426757cf7cc01c45c7"}, - {file = "wrapt-2.0.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e3612dc06b436968dfb9142c62e5dfa9eb5924f91120b3c8ff501ad878f90eb3"}, - {file = "wrapt-2.0.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d2d947d266d99a1477cd005b23cbd09465276e302515e122df56bb9511aca1b"}, - {file = "wrapt-2.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:7d539241e87b650cbc4c3ac9f32c8d1ac8a54e510f6dca3f6ab60dcfd48c9b10"}, - {file = "wrapt-2.0.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:4811e15d88ee62dbf5c77f2c3ff3932b1e3ac92323ba3912f51fc4016ce81ecf"}, - {file = "wrapt-2.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c1c91405fcf1d501fa5d55df21e58ea49e6b879ae829f1039faaf7e5e509b41e"}, - {file = "wrapt-2.0.1-cp313-cp313t-win32.whl", hash = "sha256:e76e3f91f864e89db8b8d2a8311d57df93f01ad6bb1e9b9976d1f2e83e18315c"}, - {file = "wrapt-2.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:83ce30937f0ba0d28818807b303a412440c4b63e39d3d8fc036a94764b728c92"}, - {file = "wrapt-2.0.1-cp313-cp313t-win_arm64.whl", hash = "sha256:4b55cacc57e1dc2d0991dbe74c6419ffd415fb66474a02335cb10efd1aa3f84f"}, - {file = "wrapt-2.0.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:5e53b428f65ece6d9dad23cb87e64506392b720a0b45076c05354d27a13351a1"}, - {file = "wrapt-2.0.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ad3ee9d0f254851c71780966eb417ef8e72117155cff04821ab9b60549694a55"}, - {file = "wrapt-2.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7b822c61ed04ee6ad64bc90d13368ad6eb094db54883b5dde2182f67a7f22c0"}, - {file = "wrapt-2.0.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7164a55f5e83a9a0b031d3ffab4d4e36bbec42e7025db560f225489fa929e509"}, - {file = "wrapt-2.0.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e60690ba71a57424c8d9ff28f8d006b7ad7772c22a4af432188572cd7fa004a1"}, - {file = "wrapt-2.0.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3cd1a4bd9a7a619922a8557e1318232e7269b5fb69d4ba97b04d20450a6bf970"}, - {file = "wrapt-2.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b4c2e3d777e38e913b8ce3a6257af72fb608f86a1df471cb1d4339755d0a807c"}, - {file = "wrapt-2.0.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3d366aa598d69416b5afedf1faa539fac40c1d80a42f6b236c88c73a3c8f2d41"}, - {file = "wrapt-2.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c235095d6d090aa903f1db61f892fffb779c1eaeb2a50e566b52001f7a0f66ed"}, - {file = "wrapt-2.0.1-cp314-cp314-win32.whl", hash = "sha256:bfb5539005259f8127ea9c885bdc231978c06b7a980e63a8a61c8c4c979719d0"}, - {file = "wrapt-2.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:4ae879acc449caa9ed43fc36ba08392b9412ee67941748d31d94e3cedb36628c"}, - {file = "wrapt-2.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:8639b843c9efd84675f1e100ed9e99538ebea7297b62c4b45a7042edb84db03e"}, - {file = "wrapt-2.0.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:9219a1d946a9b32bb23ccae66bdb61e35c62773ce7ca6509ceea70f344656b7b"}, - {file = "wrapt-2.0.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:fa4184e74197af3adad3c889a1af95b53bb0466bced92ea99a0c014e48323eec"}, - {file = "wrapt-2.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c5ef2f2b8a53b7caee2f797ef166a390fef73979b15778a4a153e4b5fedce8fa"}, - {file = "wrapt-2.0.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e042d653a4745be832d5aa190ff80ee4f02c34b21f4b785745eceacd0907b815"}, - {file = "wrapt-2.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2afa23318136709c4b23d87d543b425c399887b4057936cd20386d5b1422b6fa"}, - {file = "wrapt-2.0.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6c72328f668cf4c503ffcf9434c2b71fdd624345ced7941bc6693e61bbe36bef"}, - {file = "wrapt-2.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3793ac154afb0e5b45d1233cb94d354ef7a983708cc3bb12563853b1d8d53747"}, - {file = "wrapt-2.0.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fec0d993ecba3991645b4857837277469c8cc4c554a7e24d064d1ca291cfb81f"}, - {file = "wrapt-2.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:949520bccc1fa227274da7d03bf238be15389cd94e32e4297b92337df9b7a349"}, - {file = "wrapt-2.0.1-cp314-cp314t-win32.whl", hash = "sha256:be9e84e91d6497ba62594158d3d31ec0486c60055c49179edc51ee43d095f79c"}, - {file = "wrapt-2.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:61c4956171c7434634401db448371277d07032a81cc21c599c22953374781395"}, - {file = "wrapt-2.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:35cdbd478607036fee40273be8ed54a451f5f23121bd9d4be515158f9498f7ad"}, - {file = "wrapt-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:90897ea1cf0679763b62e79657958cd54eae5659f6360fc7d2ccc6f906342183"}, - {file = "wrapt-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:50844efc8cdf63b2d90cd3d62d4947a28311e6266ce5235a219d21b195b4ec2c"}, - {file = "wrapt-2.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49989061a9977a8cbd6d20f2efa813f24bf657c6990a42967019ce779a878dbf"}, - {file = "wrapt-2.0.1-cp38-cp38-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:09c7476ab884b74dce081ad9bfd07fe5822d8600abade571cb1f66d5fc915af6"}, - {file = "wrapt-2.0.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1a8a09a004ef100e614beec82862d11fc17d601092c3599afd22b1f36e4137e"}, - {file = "wrapt-2.0.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:89a82053b193837bf93c0f8a57ded6e4b6d88033a499dadff5067e912c2a41e9"}, - {file = "wrapt-2.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f26f8e2ca19564e2e1fdbb6a0e47f36e0efbab1acc31e15471fad88f828c75f6"}, - {file = "wrapt-2.0.1-cp38-cp38-win32.whl", hash = "sha256:115cae4beed3542e37866469a8a1f2b9ec549b4463572b000611e9946b86e6f6"}, - {file = "wrapt-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:c4012a2bd37059d04f8209916aa771dfb564cccb86079072bdcd48a308b6a5c5"}, - {file = "wrapt-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:68424221a2dc00d634b54f92441914929c5ffb1c30b3b837343978343a3512a3"}, - {file = "wrapt-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6bd1a18f5a797fe740cb3d7a0e853a8ce6461cc62023b630caec80171a6b8097"}, - {file = "wrapt-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fb3a86e703868561c5cad155a15c36c716e1ab513b7065bd2ac8ed353c503333"}, - {file = "wrapt-2.0.1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5dc1b852337c6792aa111ca8becff5bacf576bf4a0255b0f05eb749da6a1643e"}, - {file = "wrapt-2.0.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c046781d422f0830de6329fa4b16796096f28a92c8aef3850674442cdcb87b7f"}, - {file = "wrapt-2.0.1-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f73f9f7a0ebd0db139253d27e5fc8d2866ceaeef19c30ab5d69dcbe35e1a6981"}, - {file = "wrapt-2.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b667189cf8efe008f55bbda321890bef628a67ab4147ebf90d182f2dadc78790"}, - {file = "wrapt-2.0.1-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:a9a83618c4f0757557c077ef71d708ddd9847ed66b7cc63416632af70d3e2308"}, - {file = "wrapt-2.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e9b121e9aeb15df416c2c960b8255a49d44b4038016ee17af03975992d03931"}, - {file = "wrapt-2.0.1-cp39-cp39-win32.whl", hash = "sha256:1f186e26ea0a55f809f232e92cc8556a0977e00183c3ebda039a807a42be1494"}, - {file = "wrapt-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:bf4cb76f36be5de950ce13e22e7fdf462b35b04665a12b64f3ac5c1bbbcf3728"}, - {file = "wrapt-2.0.1-cp39-cp39-win_arm64.whl", hash = "sha256:d6cc985b9c8b235bd933990cdbf0f891f8e010b65a3911f7a55179cd7b0fc57b"}, - {file = "wrapt-2.0.1-py3-none-any.whl", hash = "sha256:4d2ce1bf1a48c5277d7969259232b57645aae5686dba1eaeade39442277afbca"}, - {file = "wrapt-2.0.1.tar.gz", hash = "sha256:9c9c635e78497cacb81e84f8b11b23e0aacac7a136e73b8e5b2109a1d9fc468f"}, + {file = "wrapt-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7e927375e43fd5a985b27a8992327c22541b6dede1362fc79df337d26e23604f"}, + {file = "wrapt-2.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c99544b6a7d40ca22195563b6d8bc3986ee8bb82f272f31f0670fe9440c869"}, + {file = "wrapt-2.1.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b2be3fa5f4efaf16ee7c77d0556abca35f5a18ad4ac06f0ef3904c3399010ce9"}, + {file = "wrapt-2.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67c90c1ae6489a6cb1a82058902caa8006706f7b4e8ff766f943e9d2c8e608d0"}, + {file = "wrapt-2.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:05c0db35ccffd7480143e62df1e829d101c7b86944ae3be7e4869a7efa621f53"}, + {file = "wrapt-2.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0c2ec9f616755b2e1e0bf4d0961f59bb5c2e7a77407e7e2c38ef4f7d2fdde12c"}, + {file = "wrapt-2.1.1-cp310-cp310-win32.whl", hash = "sha256:203ba6b3f89e410e27dbd30ff7dccaf54dcf30fda0b22aa1b82d560c7f9fe9a1"}, + {file = "wrapt-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:6f9426d9cfc2f8732922fc96198052e55c09bb9db3ddaa4323a18e055807410e"}, + {file = "wrapt-2.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:69c26f51b67076b40714cff81bdd5826c0b10c077fb6b0678393a6a2f952a5fc"}, + {file = "wrapt-2.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6c366434a7fb914c7a5de508ed735ef9c133367114e1a7cb91dfb5cd806a1549"}, + {file = "wrapt-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d6a2068bd2e1e19e5a317c8c0b288267eec4e7347c36bc68a6e378a39f19ee7"}, + {file = "wrapt-2.1.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:891ab4713419217b2aed7dd106c9200f64e6a82226775a0d2ebd6bef2ebd1747"}, + {file = "wrapt-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8ef36a0df38d2dc9d907f6617f89e113c5892e0a35f58f45f75901af0ce7d81"}, + {file = "wrapt-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76e9af3ebd86f19973143d4d592cbf3e970cf3f66ddee30b16278c26ae34b8ab"}, + {file = "wrapt-2.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ff562067485ebdeaef2fa3fe9b1876bc4e7b73762e0a01406ad81e2076edcebf"}, + {file = "wrapt-2.1.1-cp311-cp311-win32.whl", hash = "sha256:9e60a30aa0909435ec4ea2a3c53e8e1b50ac9f640c0e9fe3f21fd248a22f06c5"}, + {file = "wrapt-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:7d79954f51fcf84e5ec4878ab4aea32610d70145c5bbc84b3370eabfb1e096c2"}, + {file = "wrapt-2.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:d3ffc6b0efe79e08fd947605fd598515aebefe45e50432dc3b5cd437df8b1ada"}, + {file = "wrapt-2.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab8e3793b239db021a18782a5823fcdea63b9fe75d0e340957f5828ef55fcc02"}, + {file = "wrapt-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7c0300007836373d1c2df105b40777986accb738053a92fe09b615a7a4547e9f"}, + {file = "wrapt-2.1.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2b27c070fd1132ab23957bcd4ee3ba707a91e653a9268dc1afbd39b77b2799f7"}, + {file = "wrapt-2.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b0e36d845e8b6f50949b6b65fc6cd279f47a1944582ed4ec8258cd136d89a64"}, + {file = "wrapt-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4aeea04a9889370fcfb1ef828c4cc583f36a875061505cd6cd9ba24d8b43cc36"}, + {file = "wrapt-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d88b46bb0dce9f74b6817bc1758ff2125e1ca9e1377d62ea35b6896142ab6825"}, + {file = "wrapt-2.1.1-cp312-cp312-win32.whl", hash = "sha256:63decff76ca685b5c557082dfbea865f3f5f6d45766a89bff8dc61d336348833"}, + {file = "wrapt-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:b828235d26c1e35aca4107039802ae4b1411be0fe0367dd5b7e4d90e562fcbcd"}, + {file = "wrapt-2.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:75128507413a9f1bcbe2db88fd18fbdbf80f264b82fa33a6996cdeaf01c52352"}, + {file = "wrapt-2.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ce9646e17fa7c3e2e7a87e696c7de66512c2b4f789a8db95c613588985a2e139"}, + {file = "wrapt-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:428cfc801925454395aa468ba7ddb3ed63dc0d881df7b81626cdd433b4e2b11b"}, + {file = "wrapt-2.1.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5797f65e4d58065a49088c3b32af5410751cd485e83ba89e5a45e2aa8905af98"}, + {file = "wrapt-2.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a2db44a71202c5ae4bb5f27c6d3afbc5b23053f2e7e78aa29704541b5dad789"}, + {file = "wrapt-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8d5350c3590af09c1703dd60ec78a7370c0186e11eaafb9dda025a30eee6492d"}, + {file = "wrapt-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2d9b076411bed964e752c01b49fd224cc385f3a96f520c797d38412d70d08359"}, + {file = "wrapt-2.1.1-cp313-cp313-win32.whl", hash = "sha256:0bb7207130ce6486727baa85373503bf3334cc28016f6928a0fa7e19d7ecdc06"}, + {file = "wrapt-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:cbfee35c711046b15147b0ae7db9b976f01c9520e6636d992cd9e69e5e2b03b1"}, + {file = "wrapt-2.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:7d2756061022aebbf57ba14af9c16e8044e055c22d38de7bf40d92b565ecd2b0"}, + {file = "wrapt-2.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4814a3e58bc6971e46baa910ecee69699110a2bf06c201e24277c65115a20c20"}, + {file = "wrapt-2.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:106c5123232ab9b9f4903692e1fa0bdc231510098f04c13c3081f8ad71c3d612"}, + {file = "wrapt-2.1.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1a40b83ff2535e6e56f190aff123821eea89a24c589f7af33413b9c19eb2c738"}, + {file = "wrapt-2.1.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:789cea26e740d71cf1882e3a42bb29052bc4ada15770c90072cb47bf73fb3dbf"}, + {file = "wrapt-2.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ba49c14222d5e5c0ee394495a8655e991dc06cbca5398153aefa5ac08cd6ccd7"}, + {file = "wrapt-2.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ac8cda531fe55be838a17c62c806824472bb962b3afa47ecbd59b27b78496f4e"}, + {file = "wrapt-2.1.1-cp313-cp313t-win32.whl", hash = "sha256:b8af75fe20d381dd5bcc9db2e86a86d7fcfbf615383a7147b85da97c1182225b"}, + {file = "wrapt-2.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:45c5631c9b6c792b78be2d7352129f776dd72c605be2c3a4e9be346be8376d83"}, + {file = "wrapt-2.1.1-cp313-cp313t-win_arm64.whl", hash = "sha256:da815b9263947ac98d088b6414ac83507809a1d385e4632d9489867228d6d81c"}, + {file = "wrapt-2.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9aa1765054245bb01a37f615503290d4e207e3fd59226e78341afb587e9c1236"}, + {file = "wrapt-2.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:feff14b63a6d86c1eee33a57f77573649f2550935981625be7ff3cb7342efe05"}, + {file = "wrapt-2.1.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:81fc5f22d5fcfdbabde96bb3f5379b9f4476d05c6d524d7259dc5dfb501d3281"}, + {file = "wrapt-2.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:951b228ecf66def855d22e006ab9a1fc12535111ae7db2ec576c728f8ddb39e8"}, + {file = "wrapt-2.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ddf582a95641b9a8c8bd643e83f34ecbbfe1b68bc3850093605e469ab680ae3"}, + {file = "wrapt-2.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:fc5c500966bf48913f795f1984704e6d452ba2414207b15e1f8c339a059d5b16"}, + {file = "wrapt-2.1.1-cp314-cp314-win32.whl", hash = "sha256:4aa4baadb1f94b71151b8e44a0c044f6af37396c3b8bcd474b78b49e2130a23b"}, + {file = "wrapt-2.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:860e9d3fd81816a9f4e40812f28be4439ab01f260603c749d14be3c0a1170d19"}, + {file = "wrapt-2.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:3c59e103017a2c1ea0ddf589cbefd63f91081d7ce9d491d69ff2512bb1157e23"}, + {file = "wrapt-2.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9fa7c7e1bee9278fc4f5dd8275bc8d25493281a8ec6c61959e37cc46acf02007"}, + {file = "wrapt-2.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:39c35e12e8215628984248bd9c8897ce0a474be2a773db207eb93414219d8469"}, + {file = "wrapt-2.1.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:94ded4540cac9125eaa8ddf5f651a7ec0da6f5b9f248fe0347b597098f8ec14c"}, + {file = "wrapt-2.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da0af328373f97ed9bdfea24549ac1b944096a5a71b30e41c9b8b53ab3eec04a"}, + {file = "wrapt-2.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4ad839b55f0bf235f8e337ce060572d7a06592592f600f3a3029168e838469d3"}, + {file = "wrapt-2.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0d89c49356e5e2a50fa86b40e0510082abcd0530f926cbd71cf25bee6b9d82d7"}, + {file = "wrapt-2.1.1-cp314-cp314t-win32.whl", hash = "sha256:f4c7dd22cf7f36aafe772f3d88656559205c3af1b7900adfccb70edeb0d2abc4"}, + {file = "wrapt-2.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:f76bc12c583ab01e73ba0ea585465a41e48d968f6d1311b4daec4f8654e356e3"}, + {file = "wrapt-2.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7ea74fc0bec172f1ae5f3505b6655c541786a5cabe4bbc0d9723a56ac32eb9b9"}, + {file = "wrapt-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e03b3d486eb39f5d3f562839f59094dcee30c4039359ea15768dc2214d9e07c"}, + {file = "wrapt-2.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0fdf3073f488ce4d929929b7799e3b8c52b220c9eb3f4a5a51e2dc0e8ff07881"}, + {file = "wrapt-2.1.1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0cb4f59238c6625fae2eeb72278da31c9cfba0ff4d9cbe37446b73caa0e9bcf7"}, + {file = "wrapt-2.1.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f794a1c148871b714cb566f5466ec8288e0148a1c417550983864b3981737cd"}, + {file = "wrapt-2.1.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:95ef3866631c6da9ce1fc0f1e17b90c4c0aa6d041fc70a11bc90733aee122e1a"}, + {file = "wrapt-2.1.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:66bc1b2446f01cbbd3c56b79a3a8435bcd4178ac4e06b091913f7751a7f528b8"}, + {file = "wrapt-2.1.1-cp39-cp39-win32.whl", hash = "sha256:1b9e08e57cabc32972f7c956d10e85093c5da9019faa24faf411e7dd258e528c"}, + {file = "wrapt-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:e75ad48c3cca739f580b5e14c052993eb644c7fa5b4c90aa51193280b30875ae"}, + {file = "wrapt-2.1.1-cp39-cp39-win_arm64.whl", hash = "sha256:9ccd657873b7f964711447d004563a2bc08d1476d7a1afcad310f3713e6f50f4"}, + {file = "wrapt-2.1.1-py3-none-any.whl", hash = "sha256:3b0f4629eb954394a3d7c7a1c8cca25f0b07cefe6aa8545e862e9778152de5b7"}, + {file = "wrapt-2.1.1.tar.gz", hash = "sha256:5fdcb09bf6db023d88f312bd0767594b414655d58090fc1c46b3414415f67fac"}, ] [package.extras] @@ -5193,5 +5325,5 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" -python-versions = ">=3.10,<4.0" -content-hash = "e97bbafecac5157e577b812e4efe1fa32149aa9d1c7baf395d24e30c5bbcf8a7" +python-versions = ">=3.10,<3.14" +content-hash = "1bf196e64a38804cb46fd10e8223528309ec5044a62f0be57d91fbb664cad238" diff --git a/pyproject.toml b/pyproject.toml index 9071badd..a18e7744 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "exasol-bucketfs" version = "2.1.0" -requires-python = ">=3.10,<4.0" +requires-python = ">=3.10,<3.14" description = "BucketFS utilities for the Python programming language" authors = [ {name="Torsten Kilias", email="torsten.kilias@exasol.com"}, From 69c86e345d9a05a891afb39a118bf12650d0c2c4 Mon Sep 17 00:00:00 2001 From: ckunki Date: Fri, 27 Feb 2026 08:50:55 +0100 Subject: [PATCH 15/33] Added environment variables for SaaS secrets --- .github/workflows/slow-checks.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/slow-checks.yml b/.github/workflows/slow-checks.yml index 21aa11dc..4aeb914e 100644 --- a/.github/workflows/slow-checks.yml +++ b/.github/workflows/slow-checks.yml @@ -44,6 +44,10 @@ jobs: poetry run -- nox -s test:integration -- -s --coverage --backend=${{ matrix.backend }} --db-version ${{ matrix.exasol-version }} + env: + SAAS_HOST: ${{ secrets.INTEGRATION_TEAM_SAAS_STAGING_HOST }} + SAAS_ACCOUNT_ID: ${{ secrets.INTEGRATION_TEAM_SAAS_STAGING_ACCOUNT_ID }} + SAAS_PAT: ${{ secrets.INTEGRATION_TEAM_SAAS_STAGING_PAT }} - name: Upload Artifacts id: upload-artifacts From e97225265fb857e9b35d1e9d83dbd1078ba17ff1 Mon Sep 17 00:00:00 2001 From: ckunki Date: Fri, 27 Feb 2026 09:03:37 +0100 Subject: [PATCH 16/33] incread max column for docstrings --- exasol/bucketfs/_path.py | 54 ++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/exasol/bucketfs/_path.py b/exasol/bucketfs/_path.py index d21d953e..e9a31f23 100644 --- a/exasol/bucketfs/_path.py +++ b/exasol/bucketfs/_path.py @@ -552,8 +552,10 @@ def _create_mounted_bucket( def build_path(**kwargs) -> PathLike: """ - Creates a PathLike object based on a bucket in one of the BucketFS storage backends. - It provides the same interface for the following BucketFS implementations: + Creates a PathLike object based on a bucket in one of the BucketFS storage + backends. It provides the same interface for the following BucketFS + implementations: + - On-Premises - SaaS - BucketFS files mounted as read-only directory in a UDF. @@ -561,18 +563,18 @@ def build_path(**kwargs) -> PathLike: General Arguments: backend: - This is a mandatory parameter that indicates the BucketFS storage - backend. The available backends are defined in the StorageBackend - enumeration, Currently, these are "onprem", "saas" and - "mounted". The parameter value can be provided either as a string, - e.g. "onprem", or as an enum, e.g. StorageBackend.onprem. + This is a mandatory parameter that indicates the BucketFS storage backend. + The available backends are defined in the StorageBackend enumeration, + Currently, these are "onprem", "saas" and "mounted". The parameter value can + be provided either as a string, e.g. "onprem", or as an enum, e.g. + StorageBackend.onprem. path: - Optional parameter that selects a path within the bucket. If not - provided the returned PathLike objects corresponds to the root of - the bucket. Hence, an alternative way of creating a PathLike - pointing to a particular file or directory is as in the code - below. path = build_path(...) / "the_desired_path" + Optional parameter that selects a path within the bucket. If not provided + the returned PathLike objects corresponds to the root of the bucket. Hence, + an alternative way of creating a PathLike pointing to a particular file or + directory is as in the code below. path = build_path(...) / + "the_desired_path" The rest of the arguments are backend specific. @@ -591,16 +593,16 @@ def build_path(**kwargs) -> PathLike: Name of the bucket. Currently, a PathLike cannot span multiple buckets. verify: - Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must - be a path to a CA bundle to use. Defaults to ``True``. + Either a boolean, in which case it controls whether we verify the server's + TLS certificate, or a string, in which case it must be a path to a CA bundle + to use. Defaults to ``True``. service_name: Optional name of the BucketFS service. verify_bucket: - Optional flag to skip verifying if the bucket exists. This is - acceptable in case of planning only access via `as_udf_path()`. + Optional flag to skip verifying if the bucket exists. This is acceptable in + case of planning only access via `as_udf_path()`. Additional SaaS arguments: @@ -608,27 +610,25 @@ def build_path(**kwargs) -> PathLike: Url of the Exasol SaaS. Defaults to 'https://cloud.exasol.com'. account_id: - SaaS user account ID, e.g. 'org_LVeOj4pwXhPatNz5' (given - example is not a valid ID of an existing account). + SaaS user account ID, e.g. 'org_LVeOj4pwXhPatNz5' (given example is not a + valid ID of an existing account). database_id: - Database ID, e.g. 'msduZKlMR8QCP_MsLsVRwy' (given example - is not a valid ID of an existing database). + Database ID, e.g. 'msduZKlMR8QCP_MsLsVRwy' (given example is not a valid ID + of an existing database). pat: Personal Access Token, - e.g. 'exa_pat_aj39AsM3bYR9bQ4qk2wiG8SWHXbRUGNCThnep5YV73az6A' - (given example is not a valid PAT). + e.g. 'exa_pat_aj39AsM3bYR9bQ4qk2wiG8SWHXbRUGNCThnep5YV73az6A' (given example + is not a valid PAT). Additional Mounted BucketFS directory arguments: service_name: - Name of the BucketFS service (not a service url). Defaults to - 'bfsdefault'. + Name of the BucketFS service (not a service url). Defaults to 'bfsdefault'. bucket_name: - Name of the bucket. Currently, a PathLike cannot span multiple - buckets. + Name of the bucket. Currently, a PathLike cannot span multiple buckets. base_path: Explicitly specified root path in a file system. This is an alternative to From 119694bdbb4f7fe09a298b683c8c6ab7b650fee7 Mon Sep 17 00:00:00 2001 From: ckunki Date: Fri, 27 Feb 2026 09:07:04 +0100 Subject: [PATCH 17/33] rephrased docstrings --- exasol/bucketfs/_path.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/exasol/bucketfs/_path.py b/exasol/bucketfs/_path.py index e9a31f23..424364c0 100644 --- a/exasol/bucketfs/_path.py +++ b/exasol/bucketfs/_path.py @@ -573,8 +573,9 @@ def build_path(**kwargs) -> PathLike: Optional parameter that selects a path within the bucket. If not provided the returned PathLike objects corresponds to the root of the bucket. Hence, an alternative way of creating a PathLike pointing to a particular file or - directory is as in the code below. path = build_path(...) / - "the_desired_path" + directory is as in the code below. + + path = build_path(...) / "the_desired_path" The rest of the arguments are backend specific. @@ -610,17 +611,15 @@ def build_path(**kwargs) -> PathLike: Url of the Exasol SaaS. Defaults to 'https://cloud.exasol.com'. account_id: - SaaS user account ID, e.g. 'org_LVeOj4pwXhPatNz5' (given example is not a - valid ID of an existing account). + SaaS user account ID, e.g. 'org_LVeOj4pwXhPatNz5' (fictional ID). database_id: - Database ID, e.g. 'msduZKlMR8QCP_MsLsVRwy' (given example is not a valid ID - of an existing database). + Database ID, e.g. 'msduZKlMR8QCP_MsLsVRwy' (fictional ID). pat: Personal Access Token, - e.g. 'exa_pat_aj39AsM3bYR9bQ4qk2wiG8SWHXbRUGNCThnep5YV73az6A' (given example - is not a valid PAT). + e.g. 'exa_pat_aj39AsM3bYR9bQ4qk2wiG8SWHXbRUGNCThnep5YV73az6A' (fictional + PAT). Additional Mounted BucketFS directory arguments: From 857f0b04a4bdcd4bfdea9d719ca8cc1bceb0b69a Mon Sep 17 00:00:00 2001 From: ckunki Date: Fri, 27 Feb 2026 10:04:28 +0100 Subject: [PATCH 18/33] Marked generated workflows as "generated" --- .gitattributes | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/.gitattributes b/.gitattributes index 36d53092..bcbf7044 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,15 @@ -poetry.lock linguist-generated=true -setup.py linguist-generated=true -/exasol/bucketfs/version.py linguist-generated=True +poetry.lock linguist-generated=true +setup.py linguist-generated=true +/exasol/bucketfs/version.py linguist-generated=True +/.github/workflows/build-and-publish.yml linguist-generated=True +/.github/workflows/cd.yml linguist-generated=True +/.github/workflows/check-release-tag.yml linguist-generated=True +/.github/workflows/checks.yml linguist-generated=True +/.github/workflows/ci.yml linguist-generated=True +/.github/workflows/gh-pages.yml linguist-generated=True +/.github/workflows/matrix-all.yml linguist-generated=True +/.github/workflows/matrix-exasol.yml linguist-generated=True +/.github/workflows/matrix-python.yml linguist-generated=True +/.github/workflows/merge-gate.yml linguist-generated=True +/.github/workflows/pr-merge.yml linguist-generated=True +/.github/workflows/report.yml linguist-generated=True From 0429e423d70a70d6fe1f1d32b263ddba4481a7d8 Mon Sep 17 00:00:00 2001 From: ckunki Date: Fri, 27 Feb 2026 10:12:37 +0100 Subject: [PATCH 19/33] Fixed slow-checks.yml --- .github/workflows/slow-checks.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/slow-checks.yml b/.github/workflows/slow-checks.yml index 4aeb914e..5fcb36e6 100644 --- a/.github/workflows/slow-checks.yml +++ b/.github/workflows/slow-checks.yml @@ -35,7 +35,7 @@ jobs: id: set-up-python-and-poetry-environment uses: exasol/python-toolbox/.github/actions/python-environment@v6 with: - python-version: ${{ matrix.python-version }} + python-version: "3.10" poetry-version: "2.3.0" - name: Run Integration Tests @@ -53,6 +53,6 @@ jobs: id: upload-artifacts uses: actions/upload-artifact@v6 with: - name: coverage-slow-${{ matrix.backend }}-${{ matrix.exasol-version }} + name: coverage-python3.10-${{ matrix.backend }}-${{ matrix.exasol-version }} path: .coverage include-hidden-files: true From 650c44c96f944146c7ad30a9fd625ab240c47821 Mon Sep 17 00:00:00 2001 From: ckunki Date: Fri, 27 Feb 2026 11:44:35 +0100 Subject: [PATCH 20/33] Added file .workflow-patcher.yml --- .workflow-patcher.yml | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 .workflow-patcher.yml diff --git a/.workflow-patcher.yml b/.workflow-patcher.yml new file mode 100644 index 00000000..6269a9d3 --- /dev/null +++ b/.workflow-patcher.yml @@ -0,0 +1,40 @@ +# Please note: This file is work-in-progress. + +# Currently project BFSPY needs to manually maintain workflow slow-checks.yaml +# as some crucial changes cannot be automated, yet. + +workflows: + - name: slow-checks + step_customizations: + - action: REPLACE + job: run-integration-tests + step_id: run-integration-tests + content: + - name: Run Integration Tests + id: run-integration-tests + run: > + poetry run -- nox -s test:integration -- -s --coverage + --backend=${{ matrix.backend }} + --db-version ${{ matrix.exasol-version }} + env: + SAAS_HOST: ${{ secrets.INTEGRATION_TEAM_SAAS_STAGING_HOST }} + SAAS_ACCOUNT_ID: ${{ secrets.INTEGRATION_TEAM_SAAS_STAGING_ACCOUNT_ID }} + SAAS_PAT: ${{ secrets.INTEGRATION_TEAM_SAAS_STAGING_PAT }} + - action: REPLACE + job: run-integration-tests + step_id: upload-artifacts + content: + - name: Upload Artifacts + id: upload-artifacts + uses: actions/upload-artifact@v6 + with: + name: coverage-python3.10-${{ matrix.backend }}-${{ matrix.exasol-version }} + path: .coverage + include-hidden-files: true + - action: INSERT_AFTER + job: run-integration-tests + step_id: check-out-repository + content: + - name: Allow unprivileged user namespaces + id: allow-unprivileged-user-namespaces + run: sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 From 65c884f44a6007c064df3d83462e8546925b66d1 Mon Sep 17 00:00:00 2001 From: ckunki Date: Fri, 27 Feb 2026 14:17:52 +0100 Subject: [PATCH 21/33] Changed create an unverified bucket without instantiating a Service --- exasol/bucketfs/_path.py | 24 ++++++++++++++++-------- exasol/bucketfs/_service.py | 10 ---------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/exasol/bucketfs/_path.py b/exasol/bucketfs/_path.py index 424364c0..060385f4 100644 --- a/exasol/bucketfs/_path.py +++ b/exasol/bucketfs/_path.py @@ -25,6 +25,7 @@ from exasol.saas.client.api_access import get_database_id from exasol.bucketfs._buckets import ( + Bucket, BucketLike, MountedBucket, SaaSBucket, @@ -507,22 +508,29 @@ def _create_onprem_bucket( username: str, password: str, bucket_name: str = "default", - verify: bool | str = True, + verify: bool | str = True, # verify SSL certificates service_name: str | None = None, verify_bucket: bool = True, ) -> BucketLike: """ Creates an on-prem bucket. """ + if not verify_bucket: + return Bucket( + name=bucket_name, + service=url, + username=username, + password=password, + service_name=service_name, + verify=verify, + ) + credentials = {bucket_name: {"username": username, "password": password}} service = Service(url, credentials, verify, service_name) - if verify_bucket: - buckets = service.buckets - if bucket_name not in buckets: - raise BucketFsError(f"Bucket {bucket_name} does not exist.") - return buckets[bucket_name] - - return service.unverified_bucket(bucket_name) + buckets = service.buckets + if bucket_name not in buckets: + raise BucketFsError(f"Bucket {bucket_name} does not exist.") + return buckets[bucket_name] def _create_saas_bucket( diff --git a/exasol/bucketfs/_service.py b/exasol/bucketfs/_service.py index 33eb5c41..5fa53c47 100644 --- a/exasol/bucketfs/_service.py +++ b/exasol/bucketfs/_service.py @@ -57,16 +57,6 @@ def __init__( self._verify = verify self._service_name = service_name - def unverified_bucket(self, name: str) -> Bucket: - return Bucket( - name=name, - service=self._url, - username=self._authenticator[name]["username"], - password=self._authenticator[name]["password"], - service_name=self._service_name, - verify=self._verify, - ) - @property def buckets(self) -> MutableMapping[str, Bucket]: """List all available buckets.""" From 061f5ce24e43b4fc02b8869e824419f1025f63f4 Mon Sep 17 00:00:00 2001 From: ckunki Date: Fri, 27 Feb 2026 14:26:37 +0100 Subject: [PATCH 22/33] Prepare release 2.2.0 --- doc/changes/changelog.md | 2 ++ doc/changes/changes_2.2.0.md | 31 +++++++++++++++++++++++++++++++ doc/changes/unreleased.md | 16 ---------------- exasol/bucketfs/version.py | 2 +- pyproject.toml | 2 +- 5 files changed, 35 insertions(+), 18 deletions(-) create mode 100644 doc/changes/changes_2.2.0.md diff --git a/doc/changes/changelog.md b/doc/changes/changelog.md index 7341086b..b70d2d87 100644 --- a/doc/changes/changelog.md +++ b/doc/changes/changelog.md @@ -1,6 +1,7 @@ # 📝 Changes * [unreleased](unreleased.md) +* [2.2.0](changes_2.2.0.md) * [2.1.0](changes_2.1.0.md) * [2.0.0](changes_2.0.0.md) * [1.1.0](changes_1.1.0.md) @@ -26,6 +27,7 @@ hidden: --- unreleased +changes_2.2.0 changes_2.1.0 changes_2.0.0 changes_1.1.0 diff --git a/doc/changes/changes_2.2.0.md b/doc/changes/changes_2.2.0.md new file mode 100644 index 00000000..2fc064dd --- /dev/null +++ b/doc/changes/changes_2.2.0.md @@ -0,0 +1,31 @@ +# 2.2.0 - 2026-02-27 + +## Summary + +This release adds method `relative_to` to interface `PathLike` and enables calling `build_path()` without verifying the list of available buckets. + +## Features + +* #271: Added method `relative_to` to interface `PathLike` +* #270: Enabled calling `build_path()` without verifying the list of available buckets + +## Bug Fixing + +* #262: Fixed a wrong type interpretation in `path.write`. The chunks are now passed as a Sequence, not Iterable. + +## Refactoring + +* #260: Re-locked transitive dependencies urllib3, filelock, and Werkzeug and update to exasol-toolbox 4.0.0 +* #274: Re-locked transitive dependencies filelock, pip, pyasn1, PyNaCl, urllib3, virtualenv, Werkzeug and added the poetry export plugin, so that the nox session dependency:audit works independent of the local setup + +## Dependency Updates + +### `main` + +* Updated dependency `exasol-saas-api:2.3.0` to `2.8.0` + +### `dev` + +* Updated dependency `exasol-toolbox:1.10.0` to `6.0.0` +* Updated dependency `pyexasol:1.2.0` to `1.3.0` +* Updated dependency `pytest-exasol-backend:1.2.1` to `1.3.0` diff --git a/doc/changes/unreleased.md b/doc/changes/unreleased.md index a4980415..fb473705 100644 --- a/doc/changes/unreleased.md +++ b/doc/changes/unreleased.md @@ -1,19 +1,3 @@ # Unreleased ## Summary - -This release adds method `relative_to` to interface `PathLike` and enables calling `build_path()` without verifying the list of available buckets. - -## Features - -* #271: Added method `relative_to` to interface `PathLike` -* #270: Enabled calling `build_path()` without verifying the list of available buckets - -## Bug Fixing - -* #262: Fixed a wrong type interpretation in `path.write`. The chunks are now passed as a Sequence, not Iterable. - -## Refactoring - -* #260: Re-locked transitive dependencies urllib3, filelock, and Werkzeug and update to exasol-toolbox 4.0.0 -* #274: Re-locked transitive dependencies filelock, pip, pyasn1, PyNaCl, urllib3, virtualenv, Werkzeug and added the poetry export plugin, so that the nox session dependency:audit works independent of the local setup diff --git a/exasol/bucketfs/version.py b/exasol/bucketfs/version.py index be1e2812..31ab840e 100644 --- a/exasol/bucketfs/version.py +++ b/exasol/bucketfs/version.py @@ -9,7 +9,7 @@ """ MAJOR = 2 -MINOR = 1 +MINOR = 2 PATCH = 0 VERSION = f"{MAJOR}.{MINOR}.{PATCH}" __version__ = VERSION diff --git a/pyproject.toml b/pyproject.toml index a18e7744..b35b7a21 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "exasol-bucketfs" -version = "2.1.0" +version = "2.2.0" requires-python = ">=3.10,<3.14" description = "BucketFS utilities for the Python programming language" authors = [ From 8ea2a3c4a26b14ff25c00ab53d9fcf736e60fe3d Mon Sep 17 00:00:00 2001 From: ckunki Date: Mon, 2 Mar 2026 09:55:30 +0100 Subject: [PATCH 23/33] relaxed pyexasol version to allow version 2 Also removed temp. fix additin dependencies to httpx and attrs as these should come with saas-api-python anyway. --- poetry.lock | 2 +- pyproject.toml | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index be930cd4..1fda57b0 100644 --- a/poetry.lock +++ b/poetry.lock @@ -5326,4 +5326,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<3.14" -content-hash = "1bf196e64a38804cb46fd10e8223528309ec5044a62f0be57d91fbb664cad238" +content-hash = "bf8f5c5cdc7aa0914563fb22c4d0277276febefa1613752b76a06e1fa9c85b94" diff --git a/pyproject.toml b/pyproject.toml index b35b7a21..470f2d07 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,19 +32,16 @@ packages = [ [tool.poetry.dependencies] requests = ">=2.32.4" exasol-saas-api=">2.0.0,<3.0" -# Temp.fix -httpx=">=0.27.0" -attrs=">=23.2.0" [tool.poetry.group.dev.dependencies] -pyexasol = ">=1.0, <2.0" +pyexasol = ">=1.0, <3.0" dill = "^0.3.4" exasol-udf-mock-python = ">=0.2.0" toml = ">=0.10.2" sphinx-copybutton = "^0.5.0" exasol-toolbox = ">=6, <7" pytest-localserver = "^0.8.1" -pytest-exasol-backend = ">=1.0.0,<2" +pytest-exasol-backend = ">=1.0.0, <2" [tool.coverage.run] source = [ From f6ee2453b082af9b6d0bf5a77fb805e8c0792734 Mon Sep 17 00:00:00 2001 From: ckunki Date: Mon, 2 Mar 2026 11:03:18 +0100 Subject: [PATCH 24/33] Poetry update --- poetry.lock | 84 ++++++++++++++++++----------------------------------- 1 file changed, 28 insertions(+), 56 deletions(-) diff --git a/poetry.lock b/poetry.lock index 1fda57b0..4192c11b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1275,20 +1275,20 @@ pytest = ["pytest (>=7)"] [[package]] name = "fastapi" -version = "0.133.1" +version = "0.135.1" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "fastapi-0.133.1-py3-none-any.whl", hash = "sha256:658f34ba334605b1617a65adf2ea6461901bdb9af3a3080d63ff791ecf7dc2e2"}, - {file = "fastapi-0.133.1.tar.gz", hash = "sha256:ed152a45912f102592976fde6cbce7dae1a8a1053da94202e51dd35d184fadd6"}, + {file = "fastapi-0.135.1-py3-none-any.whl", hash = "sha256:46e2fc5745924b7c840f71ddd277382af29ce1cdb7d5eab5bf697e3fb9999c9e"}, + {file = "fastapi-0.135.1.tar.gz", hash = "sha256:d04115b508d936d254cea545b7312ecaa58a7b3a0f84952535b4c9afae7668cd"}, ] [package.dependencies] annotated-doc = ">=0.0.2" pydantic = ">=2.7.0" -starlette = ">=0.40.0" +starlette = ">=0.46.0" typing-extensions = ">=4.8.0" typing-inspection = ">=0.4.2" @@ -1299,14 +1299,14 @@ standard-no-fastapi-cloud-cli = ["email-validator (>=2.0.0)", "fastapi-cli[stand [[package]] name = "filelock" -version = "3.24.3" +version = "3.25.0" description = "A platform independent file lock." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "filelock-3.24.3-py3-none-any.whl", hash = "sha256:426e9a4660391f7f8a810d71b0555bce9008b0a1cc342ab1f6947d37639e002d"}, - {file = "filelock-3.24.3.tar.gz", hash = "sha256:011a5644dc937c22699943ebbfc46e969cdde3e171470a6e40b9533e5a72affa"}, + {file = "filelock-3.25.0-py3-none-any.whl", hash = "sha256:5ccf8069f7948f494968fc0713c10e5c182a9c9d9eef3a636307a20c2490f047"}, + {file = "filelock-3.25.0.tar.gz", hash = "sha256:8f00faf3abf9dc730a1ffe9c354ae5c04e079ab7d3a683b7c32da5dd05f26af3"}, ] [[package]] @@ -1613,14 +1613,14 @@ test = ["coverage[toml]", "pretend", "pytest", "pytest-cov"] [[package]] name = "identify" -version = "2.6.16" +version = "2.6.17" description = "File identification library for Python" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "identify-2.6.16-py2.py3-none-any.whl", hash = "sha256:391ee4d77741d994189522896270b787aed8670389bfd60f326d677d64a6dfb0"}, - {file = "identify-2.6.16.tar.gz", hash = "sha256:846857203b5511bbe94d5a352a48ef2359532bc8f6727b5544077a0dcfb24980"}, + {file = "identify-2.6.17-py2.py3-none-any.whl", hash = "sha256:be5f8412d5ed4b20f2bd41a65f920990bdccaa6a4a18a08f1eefdcd0bdd885f0"}, + {file = "identify-2.6.17.tar.gz", hash = "sha256:f816b0b596b204c9fdf076ded172322f2723cf958d02f9c3587504834c8ff04d"}, ] [package.extras] @@ -2795,14 +2795,14 @@ test = ["pytest"] [[package]] name = "packaging" -version = "26.0" +version = "25.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529"}, - {file = "packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4"}, + {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, + {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, ] [[package]] @@ -3141,18 +3141,6 @@ files = [ [package.dependencies] defusedxml = ">=0.7.1,<0.8.0" -[[package]] -name = "pyasn1" -version = "0.6.2" -description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "pyasn1-0.6.2-py3-none-any.whl", hash = "sha256:1eb26d860996a18e9b6ed05e7aae0e9fc21619fcee6af91cca9bad4fbea224bf"}, - {file = "pyasn1-0.6.2.tar.gz", hash = "sha256:9b59a2b25ba7e4f8197db7686c09fb33e658b98339fadb826e9512629017833b"}, -] - [[package]] name = "pycparser" version = "3.0" @@ -3346,31 +3334,30 @@ types = ["mypy"] [[package]] name = "pyexasol" -version = "1.3.0" +version = "2.0.0" description = "Exasol python driver with extra features" optional = false -python-versions = "<4,>=3.9.2" +python-versions = "<3.15,>=3.10" groups = ["dev"] files = [ - {file = "pyexasol-1.3.0-py3-none-any.whl", hash = "sha256:0bb076346dcb33b36031a2633d6e7b9982f8411b95e770ad8017801ee438a689"}, - {file = "pyexasol-1.3.0.tar.gz", hash = "sha256:44e5be7245b92343634b0b66a81b62be2fb4b1ca485d4e0f86c0583d5a2cf6b5"}, + {file = "pyexasol-2.0.0-py3-none-any.whl", hash = "sha256:348dacb2df8286ca13676d933f63c714e792369b967c603bb04d08ba641c3526"}, + {file = "pyexasol-2.0.0.tar.gz", hash = "sha256:fdb0b98a246dbdc3746b9ad8f5012bd3166daad76c136e9839a841e0abe24bac"}, ] [package.dependencies] cryptography = ">=45.0.7" -packaging = "*" -rsa = "*" +packaging = ">=24.1.0,<26.0.0" websocket-client = ">=1.0.1,<1.9.0" [package.extras] -all = ["orjson (>=3.6)", "pandas (>=2,<3)", "polars (>=1.10,<2.0)", "pproxy", "pyarrow (>=21.0.0,<22.0.0)", "python-rapidjson", "ujson"] +all = ["orjson (>=3.6,<4.0)", "pandas (>=2.0.0,<3.0.0)", "polars (>=1.10.0,<2.0.0)", "pproxy", "pyarrow (>=21.0.0)", "python-rapidjson (>=1.21.0,<2.0.0)", "ujson (>=5.10.0,<6.0.0)"] examples = ["pproxy"] -orjson = ["orjson (>=3.6)"] -pandas = ["pandas (>=2,<3)"] -polars = ["polars (>=1.10,<2.0)"] -pyarrow = ["pyarrow (>=21.0.0,<22.0.0)"] -rapidjson = ["python-rapidjson"] -ujson = ["ujson"] +orjson = ["orjson (>=3.6,<4.0)"] +pandas = ["pandas (>=2.0.0,<3.0.0)"] +polars = ["polars (>=1.10.0,<2.0.0)"] +pyarrow = ["pyarrow (>=21.0.0)"] +rapidjson = ["python-rapidjson (>=1.21.0,<2.0.0)"] +ujson = ["ujson (>=5.10.0,<6.0.0)"] [[package]] name = "pyfakefs" @@ -4003,21 +3990,6 @@ files = [ {file = "roman-5.2.tar.gz", hash = "sha256:275fe9f46290f7d0ffaea1c33251b92b8e463ace23660508ceef522e7587cb6f"}, ] -[[package]] -name = "rsa" -version = "4.9.1" -description = "Pure-Python RSA implementation" -optional = false -python-versions = "<4,>=3.6" -groups = ["dev"] -files = [ - {file = "rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762"}, - {file = "rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75"}, -] - -[package.dependencies] -pyasn1 = ">=0.1.3" - [[package]] name = "ruamel-yaml" version = "0.18.16" @@ -5139,14 +5111,14 @@ standard = ["colorama (>=0.4) ; sys_platform == \"win32\"", "httptools (>=0.6.3) [[package]] name = "virtualenv" -version = "21.0.0" +version = "21.1.0" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "virtualenv-21.0.0-py3-none-any.whl", hash = "sha256:d44e70637402c7f4b10f48491c02a6397a3a187152a70cba0b6bc7642d69fb05"}, - {file = "virtualenv-21.0.0.tar.gz", hash = "sha256:e8efe4271b4a5efe7a4dce9d60a05fd11859406c0d6aa8464f4cf451bc132889"}, + {file = "virtualenv-21.1.0-py3-none-any.whl", hash = "sha256:164f5e14c5587d170cf98e60378eb91ea35bf037be313811905d3a24ea33cc07"}, + {file = "virtualenv-21.1.0.tar.gz", hash = "sha256:1990a0188c8f16b6b9cf65c9183049007375b26aad415514d377ccacf1e4fb44"}, ] [package.dependencies] From 799f54859d70726e622b3f39246bcc2159c82781 Mon Sep 17 00:00:00 2001 From: ckunki Date: Mon, 2 Mar 2026 12:06:36 +0100 Subject: [PATCH 25/33] Fixed test --- test/integration/test_udf_path.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/integration/test_udf_path.py b/test/integration/test_udf_path.py index bef0527b..cf8446d6 100644 --- a/test/integration/test_udf_path.py +++ b/test/integration/test_udf_path.py @@ -10,6 +10,7 @@ import exasol.bucketfs as bfs from exasol.bucketfs import ( Bucket, + SaaSBucket, ) @@ -97,8 +98,8 @@ def setup_schema_and_udfs(backend_aware_database_params): create_check_udf_sql = dedent( """ --/ - CREATE OR REPLACE PYTHON3 SCALAR - SCRIPT CHECK_FILE_EXISTS_UDF(file_path VARCHAR(200000)) + CREATE OR REPLACE PYTHON3 SCALAR + SCRIPT CHECK_FILE_EXISTS_UDF(file_path VARCHAR(200000)) RETURNS BOOLEAN AS import os def run(ctx): @@ -111,8 +112,8 @@ def run(ctx): create_read_udf_sql = dedent( """ --/ - CREATE OR REPLACE PYTHON3 SCALAR - SCRIPT READ_FILE_CONTENT_UDF(file_path VARCHAR(200000)) + CREATE OR REPLACE PYTHON3 SCALAR + SCRIPT READ_FILE_CONTENT_UDF(file_path VARCHAR(200000)) RETURNS VARCHAR(200000) AS def run(ctx): with open(ctx.file_path, 'rb') as f: From bfa326fc37089ca235781bd1d82e23cc6927b1ce Mon Sep 17 00:00:00 2001 From: ckunki Date: Mon, 2 Mar 2026 13:54:52 +0100 Subject: [PATCH 26/33] Instrumented on prem tests to only be executed on prem --- test/integration/test_service_onprem.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/integration/test_service_onprem.py b/test/integration/test_service_onprem.py index 1b890b04..e01f301d 100644 --- a/test/integration/test_service_onprem.py +++ b/test/integration/test_service_onprem.py @@ -67,10 +67,13 @@ def test_list_buckets(bucketfs_config, expected): ], ) def test_upload_to_bucket( + use_onprem: bool, bucketfs_config, name: str, data: ByteString | Iterable[ByteString] | Iterable[int], ): + if not use_onprem: + pytest.skip("The test runs only with onprem database instances") file_name = "Uploaded-File-{random_string}.bin".format( random_string="".join(random.choice(string.hexdigits) for _ in range(0, 10)) ) @@ -109,9 +112,12 @@ def test_upload_to_bucket( indirect=True, ) def test_download_file_from_bucket( + use_onprem: bool, temporary_bucket_files: tuple[str, File | Iterable[File]], bucketfs_config, ): + if not use_onprem: + pytest.skip("The test runs only with onprem database instances") name, files = temporary_bucket_files bucket = Bucket( name, bucketfs_config.url, bucketfs_config.username, bucketfs_config.password @@ -137,9 +143,12 @@ def test_download_file_from_bucket( indirect=True, ) def test_list_files_in_bucket( + use_onprem: bool, temporary_bucket_files: tuple[str, File | Iterable[File]], bucketfs_config, ): + if not use_onprem: + pytest.skip("The test runs only with onprem database instances") name, files = temporary_bucket_files bucket = Bucket( name, bucketfs_config.url, bucketfs_config.username, bucketfs_config.password From 2f7adbf7ee88fec3968a745946ce8ef23af815f5 Mon Sep 17 00:00:00 2001 From: ckunki Date: Mon, 2 Mar 2026 15:29:41 +0100 Subject: [PATCH 27/33] Fixed test/integration/test_service_onprem.py --- test/integration/test_service_onprem.py | 58 +++++++++++-------------- 1 file changed, 26 insertions(+), 32 deletions(-) diff --git a/test/integration/test_service_onprem.py b/test/integration/test_service_onprem.py index e01f301d..7fee2875 100644 --- a/test/integration/test_service_onprem.py +++ b/test/integration/test_service_onprem.py @@ -1,3 +1,4 @@ +import contextlib import logging import random import string @@ -5,9 +6,6 @@ ByteString, Iterable, ) -from contextlib import ( - contextmanager, -) from inspect import cleandoc from test.integration.conftest import ( File, @@ -25,7 +23,7 @@ ) -@contextmanager +@contextlib.contextmanager def does_not_raise(exception_type: Exception = Exception): try: yield @@ -49,6 +47,21 @@ def test_list_buckets(bucketfs_config, expected): assert expected.issubset(actual) +@pytest.fixture(scope="session") +def onprem_bfs(use_onprem: bool, backend_aware_onprem_bucketfs_params): + """ """ + if not use_onprem: + pytest.skip( + """The tests annotated with this fixture can only be + executed for onprem database instances.""" + ) + return backend_aware_onprem_bucketfs_params + + +def _bucket(name: str, config: dict[str, str]) -> Bucket: + return Bucket(name, config["url"], config["username"], config["password"]) + + @pytest.mark.parametrize( "name,data", [ @@ -67,32 +80,24 @@ def test_list_buckets(bucketfs_config, expected): ], ) def test_upload_to_bucket( - use_onprem: bool, - bucketfs_config, + onprem_bfs: bool, name: str, data: ByteString | Iterable[ByteString] | Iterable[int], ): - if not use_onprem: - pytest.skip("The test runs only with onprem database instances") file_name = "Uploaded-File-{random_string}.bin".format( random_string="".join(random.choice(string.hexdigits) for _ in range(0, 10)) ) - bucket = Bucket( - name, bucketfs_config.url, bucketfs_config.username, bucketfs_config.password - ) + bucket = _bucket(name, onprem_bfs) - # run test scenario try: bucket.upload(file_name, data) - # assert expectations assert file_name in bucket.files finally: - # cleanup _, _ = delete_file( - bucketfs_config.url, + onprem_bfs["url"], bucket.name, - bucketfs_config.username, - bucketfs_config.password, + onprem_bfs["username"], + onprem_bfs["password"], file_name, ) @@ -112,17 +117,11 @@ def test_upload_to_bucket( indirect=True, ) def test_download_file_from_bucket( - use_onprem: bool, + onprem_bfs, temporary_bucket_files: tuple[str, File | Iterable[File]], - bucketfs_config, ): - if not use_onprem: - pytest.skip("The test runs only with onprem database instances") name, files = temporary_bucket_files - bucket = Bucket( - name, bucketfs_config.url, bucketfs_config.username, bucketfs_config.password - ) - + bucket = _bucket(name, onprem_bfs) for file in files: expected = file.content actual = as_bytes(bucket.download(file.name)) @@ -143,16 +142,11 @@ def test_download_file_from_bucket( indirect=True, ) def test_list_files_in_bucket( - use_onprem: bool, + onprem_bfs, temporary_bucket_files: tuple[str, File | Iterable[File]], - bucketfs_config, ): - if not use_onprem: - pytest.skip("The test runs only with onprem database instances") name, files = temporary_bucket_files - bucket = Bucket( - name, bucketfs_config.url, bucketfs_config.username, bucketfs_config.password - ) + bucket = _bucket(name, onprem_bfs) expected = {file.name for file in files} actual = {file for file in bucket} assert expected.issubset(actual) From e48f32d87ecae78e738d97d9cc4f38c4a615cfca Mon Sep 17 00:00:00 2001 From: ckunki Date: Mon, 2 Mar 2026 15:32:28 +0100 Subject: [PATCH 28/33] MArked changelog as generated --- .gitattributes | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitattributes b/.gitattributes index bcbf7044..b5a7dc38 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,4 @@ +/doc/changes/changelog.md linguist-generated=true poetry.lock linguist-generated=true setup.py linguist-generated=true /exasol/bucketfs/version.py linguist-generated=True From 63e05571bba3d531b58e784b5f3ad8320eb2a35b Mon Sep 17 00:00:00 2001 From: ckunki Date: Mon, 2 Mar 2026 15:40:31 +0100 Subject: [PATCH 29/33] Prepare release 2.2.0 --- doc/changes/changes_2.2.0.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/doc/changes/changes_2.2.0.md b/doc/changes/changes_2.2.0.md index 2fc064dd..62530b18 100644 --- a/doc/changes/changes_2.2.0.md +++ b/doc/changes/changes_2.2.0.md @@ -1,4 +1,4 @@ -# 2.2.0 - 2026-02-27 +# 2.2.0 - 2026-03-02 ## Summary @@ -29,3 +29,17 @@ This release adds method `relative_to` to interface `PathLike` and enables calli * Updated dependency `exasol-toolbox:1.10.0` to `6.0.0` * Updated dependency `pyexasol:1.2.0` to `1.3.0` * Updated dependency `pytest-exasol-backend:1.2.1` to `1.3.0` + +## Dependency Updates + +### `main` + +* Removed dependency `attrs:25.4.0` +* Updated dependency `exasol-saas-api:2.3.0` to `2.8.0` +* Removed dependency `httpx:0.28.1` + +### `dev` + +* Updated dependency `exasol-toolbox:1.10.0` to `6.0.0` +* Updated dependency `pyexasol:1.2.0` to `2.0.0` +* Updated dependency `pytest-exasol-backend:1.2.1` to `1.3.0` From 33053834575c2215c9abb001d83a479a4d2f85b6 Mon Sep 17 00:00:00 2001 From: ckunki Date: Mon, 2 Mar 2026 15:40:48 +0100 Subject: [PATCH 30/33] updated changelog --- doc/changes/changes_2.2.0.md | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/doc/changes/changes_2.2.0.md b/doc/changes/changes_2.2.0.md index 62530b18..3494f48d 100644 --- a/doc/changes/changes_2.2.0.md +++ b/doc/changes/changes_2.2.0.md @@ -22,18 +22,6 @@ This release adds method `relative_to` to interface `PathLike` and enables calli ### `main` -* Updated dependency `exasol-saas-api:2.3.0` to `2.8.0` - -### `dev` - -* Updated dependency `exasol-toolbox:1.10.0` to `6.0.0` -* Updated dependency `pyexasol:1.2.0` to `1.3.0` -* Updated dependency `pytest-exasol-backend:1.2.1` to `1.3.0` - -## Dependency Updates - -### `main` - * Removed dependency `attrs:25.4.0` * Updated dependency `exasol-saas-api:2.3.0` to `2.8.0` * Removed dependency `httpx:0.28.1` From ae5379dbe641d906fe93c67959ab561ceba54412 Mon Sep 17 00:00:00 2001 From: ckunki Date: Mon, 2 Mar 2026 16:47:35 +0100 Subject: [PATCH 31/33] Fixed (hopefully) last integration test --- test/integration/test_service_onprem.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/integration/test_service_onprem.py b/test/integration/test_service_onprem.py index 7fee2875..0bca577d 100644 --- a/test/integration/test_service_onprem.py +++ b/test/integration/test_service_onprem.py @@ -41,8 +41,8 @@ def does_not_raise(exception_type: Exception = Exception): {"default"}, ], ) -def test_list_buckets(bucketfs_config, expected): - service = Service(bucketfs_config.url) +def test_list_buckets(onprem_bfs, expected): + service = Service(onprem_bfs.url) actual = {bucket for bucket in service} assert expected.issubset(actual) From f3d2840542b16bde499e089844a247da7ea5046d Mon Sep 17 00:00:00 2001 From: ckunki Date: Mon, 2 Mar 2026 16:53:20 +0100 Subject: [PATCH 32/33] Fixed integration test (2) --- test/integration/test_service_onprem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/test_service_onprem.py b/test/integration/test_service_onprem.py index 0bca577d..ca121a8a 100644 --- a/test/integration/test_service_onprem.py +++ b/test/integration/test_service_onprem.py @@ -42,7 +42,7 @@ def does_not_raise(exception_type: Exception = Exception): ], ) def test_list_buckets(onprem_bfs, expected): - service = Service(onprem_bfs.url) + service = Service(onprem_bfs["url"]) actual = {bucket for bucket in service} assert expected.issubset(actual) From 77bd05c22eb68244175b820bec6d4d8354f89766 Mon Sep 17 00:00:00 2001 From: ckunki Date: Tue, 3 Mar 2026 08:31:54 +0100 Subject: [PATCH 33/33] Renamed workflows and excluded file version.py from Sonar --- .github/workflows/checks.yml | 4 ++-- .github/workflows/ci.yml | 1 + .github/workflows/merge-gate.yml | 4 ++-- .github/workflows/slow-checks.yml | 6 +++--- pyproject.toml | 3 ++- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 2941275a..05a46622 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -211,7 +211,7 @@ jobs: run: poetry run -- nox -s package:check run-unit-tests: - name: Run Unit Tests (Python-${{ matrix.python-versions }}) + name: Unit Tests (Python-${{ matrix.python-versions }}) runs-on: "ubuntu-24.04" permissions: contents: read @@ -232,7 +232,7 @@ jobs: python-version: ${{ matrix.python-versions }} poetry-version: "2.3.0" - - name: Run Unit Tests + - name: Unit Tests id: run-unit-tests run: poetry run -- nox -s test:unit -- --coverage diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b529c2b0..1b9af7e2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,6 +9,7 @@ on: jobs: merge-gate: + name: Merge Gate uses: ./.github/workflows/merge-gate.yml secrets: inherit permissions: diff --git a/.github/workflows/merge-gate.yml b/.github/workflows/merge-gate.yml index 46753e3e..d6c0d0e9 100644 --- a/.github/workflows/merge-gate.yml +++ b/.github/workflows/merge-gate.yml @@ -5,7 +5,7 @@ on: jobs: run-fast-checks: - name: Run Fast Checks + name: Fast Checks uses: ./.github/workflows/checks.yml permissions: contents: read @@ -24,7 +24,7 @@ jobs: run: echo "Slow tests approved" run-slow-checks: - name: Run Slow Checks + name: Slow Checks needs: - approve-run-slow-tests uses: ./.github/workflows/slow-checks.yml diff --git a/.github/workflows/slow-checks.yml b/.github/workflows/slow-checks.yml index 5fcb36e6..f544bb8e 100644 --- a/.github/workflows/slow-checks.yml +++ b/.github/workflows/slow-checks.yml @@ -1,11 +1,11 @@ -name: Slow-Checks +name: Slow Checks on: workflow_call: jobs: tests: - name: Integration-Tests (${{ matrix.backend }}, ${{ matrix.exasol-version}}) + name: Integration Tests (${{ matrix.backend }}, ${{ matrix.exasol-version}}) runs-on: "ubuntu-24.04" permissions: contents: read @@ -38,7 +38,7 @@ jobs: python-version: "3.10" poetry-version: "2.3.0" - - name: Run Integration Tests + - name: Integration Tests id: run-integration-tests run: > poetry run -- nox -s test:integration -- -s --coverage diff --git a/pyproject.toml b/pyproject.toml index 470f2d07..6fda36d8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -96,4 +96,5 @@ unfixable = [] [tool.sonar] projectKey = "com.exasol:bucketfs-python" host.url = "https://sonarcloud.io" -organization = "exasol" \ No newline at end of file +organization = "exasol" +exclusions = "exasol/bucketfs/version.py"