From 754b1a89ca47f7f0eb7e89fdd7a33c1f015ebe21 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Wed, 23 Sep 2026 16:13:00 -0700 Subject: [PATCH 1/8] removed 3.15 workarounds --- .github/workflows/gapic-generator-tests.yml | 4 ---- .github/workflows/import-profiler.yml | 2 -- .github/workflows/prerelease-deps.yml | 2 -- .github/workflows/unittest.yml | 25 --------------------- ci/run_single_test.sh | 1 - 5 files changed, 34 deletions(-) diff --git a/.github/workflows/gapic-generator-tests.yml b/.github/workflows/gapic-generator-tests.yml index 6379fa492d41..e5029174f61d 100644 --- a/.github/workflows/gapic-generator-tests.yml +++ b/.github/workflows/gapic-generator-tests.yml @@ -19,10 +19,6 @@ env: PRERELEASE_PYTHON: 3.15 ALL_PYTHON: "['3.10', '3.11', '3.12', '3.13', '3.14', '3.15']" TRIMMED_PYTHON: "['3.10', '3.14', '3.15']" - # Workaround: Allows libcst to compile on Python 3.15+ while PyO3 catches up - # Can be removed once libcst releases a version with native Python 3.15 wheels - # Follow https://github.com/Instagram/LibCST/issues/1445 for updates. - PYO3_USE_ABI3_FORWARD_COMPATIBILITY: "1" jobs: # Check if the gapic-generator was changed. If so, execute specialized tests diff --git a/.github/workflows/import-profiler.yml b/.github/workflows/import-profiler.yml index 33bf120a0e05..c527c1b43fe1 100644 --- a/.github/workflows/import-profiler.yml +++ b/.github/workflows/import-profiler.yml @@ -89,8 +89,6 @@ jobs: TARGET_BRANCH: ${{ github.base_ref || github.event.merge_group.base_ref }} TEST_TYPE: import_profile PY_VERSION: "3.15" - # Workaround: Allows libcst to compile on Python 3.15+ while PyO3 catches up - PYO3_USE_ABI3_FORWARD_COMPATIBILITY: "1" PACKAGE_LIST: ${{ matrix.package_shard.packages }} run: | ci/run_conditional_tests.sh diff --git a/.github/workflows/prerelease-deps.yml b/.github/workflows/prerelease-deps.yml index ba816dddbb25..0f76752c6707 100644 --- a/.github/workflows/prerelease-deps.yml +++ b/.github/workflows/prerelease-deps.yml @@ -36,8 +36,6 @@ env: PACKAGE_DIRS: packages NOX_DEFAULT_VENV_BACKEND: "virtualenv" UV_PRERELEASE: "allow" - # Workaround: Allows libcst/Rust extensions to compile on Python 3.15+ while PyO3 catches up - PYO3_USE_ABI3_FORWARD_COMPATIBILITY: "1" jobs: prerelease: diff --git a/.github/workflows/unittest.yml b/.github/workflows/unittest.yml index 68ccc4969d7f..507aff5300b8 100644 --- a/.github/workflows/unittest.yml +++ b/.github/workflows/unittest.yml @@ -133,31 +133,6 @@ jobs: - name: Install nox and nox-uv run: | uv pip install --system nox nox-uv - # Caches local wheels for Python 3.15+ to avoid repeatedly downloading or building heavy libraries. - # Follow https://github.com/grpc/grpc/issues/41010 for updates. - - name: Cache Built Python 3.15 Wheels - if: matrix.python == '3.15' - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 - with: - path: .uv-wheel-cache - key: ${{ runner.os }}-uv-wheels-3.15-${{ hashFiles('packages/**/testing/constraints*.txt') }} - restore-keys: | - ${{ runner.os }}-uv-wheels-3.15- - # TODO: Remove this step once official Python 3.15 wheels for grpcio are published to PyPI. - # See https://github.com/grpc/grpc/issues/41010#issuecomment-4848264910 for details. - - name: Install grpcio wheel for Python 3.15 - if: matrix.python == '3.15' - run: | - mkdir -p .uv-wheel-cache - WHEEL_FILE=".uv-wheel-cache/grpcio-1.83.0.dev0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl" - if [ ! -f "$WHEEL_FILE" ]; then - curl -L "https://packages.grpc.io/archive/2026/06/5ccdab32010f762634e1082d19be53cf60458456-b37e49c7-5e62-4cbe-870a-c599bb907b04/python/grpcio/grpcio-1.83.0.dev0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl" -o "$WHEEL_FILE" - fi - echo "d7706633cd5d97a8b8d3c6ed36c5940722a9b5cbb47f0d10bc433ee27af36ff0 $WHEEL_FILE" | sha256sum -c - uv pip install --system "$WHEEL_FILE" - echo "UV_FIND_LINKS=${{ github.workspace }}/.uv-wheel-cache" >> $GITHUB_ENV - echo "UV_CACHE_DIR=${{ github.workspace }}/.uv-wheel-cache" >> $GITHUB_ENV - echo "UV_PRERELEASE=allow" >> $GITHUB_ENV - name: Run unit tests for ${{ matrix.package_shard.description }} env: BUILD_TYPE: presubmit diff --git a/ci/run_single_test.sh b/ci/run_single_test.sh index ced52a121eae..5739ffed52cb 100755 --- a/ci/run_single_test.sh +++ b/ci/run_single_test.sh @@ -141,7 +141,6 @@ case ${TEST_TYPE} in echo "Creating temporary virtualenv for import profile..." python3 -m venv .venv-profiler source .venv-profiler/bin/activate - export PYO3_USE_ABI3_FORWARD_COMPATIBILITY=1 python -m pip install --upgrade pip setuptools PROFILER_TEMP_DIR=$(mktemp -d) From e58b60ec7986f25486a2d8b4600e616549bf9b2c Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Wed, 23 Sep 2026 16:16:40 -0700 Subject: [PATCH 2/8] updated classifiers for handwrittel libraries --- packages/django-google-spanner/setup.py | 1 + packages/google-api-core/pyproject.toml | 1 + packages/google-auth-httplib2/setup.py | 1 + packages/google-auth-oauthlib/setup.py | 1 + packages/google-auth/setup.py | 1 + packages/google-cloud-bigquery/pyproject.toml | 1 + packages/google-cloud-core/setup.py | 1 + packages/google-cloud-dns/setup.py | 1 + packages/google-cloud-ndb/setup.py | 1 + packages/google-cloud-runtimeconfig/setup.py | 1 + packages/google-cloud-spanner-dbapi-driver/setup.py | 1 + packages/google-cloud-testutils/setup.py | 1 + packages/google-resumable-media/setup.py | 1 + packages/proto-plus/pyproject.toml | 1 + packages/sqlalchemy-spanner/setup.py | 1 + 15 files changed, 15 insertions(+) diff --git a/packages/django-google-spanner/setup.py b/packages/django-google-spanner/setup.py index 228cfd22bee5..e5c88ef94c02 100644 --- a/packages/django-google-spanner/setup.py +++ b/packages/django-google-spanner/setup.py @@ -71,6 +71,7 @@ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Topic :: Utilities", "Framework :: Django", "Framework :: Django :: 5.2", diff --git a/packages/google-api-core/pyproject.toml b/packages/google-api-core/pyproject.toml index 9bff8ce994cb..b281b6b5d66e 100644 --- a/packages/google-api-core/pyproject.toml +++ b/packages/google-api-core/pyproject.toml @@ -39,6 +39,7 @@ classifiers = [ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Operating System :: OS Independent", "Topic :: Internet", ] diff --git a/packages/google-auth-httplib2/setup.py b/packages/google-auth-httplib2/setup.py index c74a0f2f8012..ffda4ad44be7 100644 --- a/packages/google-auth-httplib2/setup.py +++ b/packages/google-auth-httplib2/setup.py @@ -47,6 +47,7 @@ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", diff --git a/packages/google-auth-oauthlib/setup.py b/packages/google-auth-oauthlib/setup.py index 11b9fba61512..a619e210f086 100644 --- a/packages/google-auth-oauthlib/setup.py +++ b/packages/google-auth-oauthlib/setup.py @@ -64,6 +64,7 @@ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", diff --git a/packages/google-auth/setup.py b/packages/google-auth/setup.py index 8807e7eb342b..64379d666a59 100644 --- a/packages/google-auth/setup.py +++ b/packages/google-auth/setup.py @@ -121,6 +121,7 @@ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", diff --git a/packages/google-cloud-bigquery/pyproject.toml b/packages/google-cloud-bigquery/pyproject.toml index 050b886c06bf..6e15be9903a2 100644 --- a/packages/google-cloud-bigquery/pyproject.toml +++ b/packages/google-cloud-bigquery/pyproject.toml @@ -37,6 +37,7 @@ classifiers = [ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Operating System :: OS Independent", "Topic :: Internet", ] diff --git a/packages/google-cloud-core/setup.py b/packages/google-cloud-core/setup.py index 4d28bc82c212..5b85859683d3 100644 --- a/packages/google-cloud-core/setup.py +++ b/packages/google-cloud-core/setup.py @@ -80,6 +80,7 @@ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Operating System :: OS Independent", "Topic :: Internet", ], diff --git a/packages/google-cloud-dns/setup.py b/packages/google-cloud-dns/setup.py index 21f64e31a38d..254ce81fb844 100644 --- a/packages/google-cloud-dns/setup.py +++ b/packages/google-cloud-dns/setup.py @@ -81,6 +81,7 @@ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Operating System :: OS Independent", "Topic :: Internet", ], diff --git a/packages/google-cloud-ndb/setup.py b/packages/google-cloud-ndb/setup.py index 4f886d22596b..cb442195107c 100644 --- a/packages/google-cloud-ndb/setup.py +++ b/packages/google-cloud-ndb/setup.py @@ -73,6 +73,7 @@ def main(): "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Operating System :: OS Independent", "Topic :: Internet", ], diff --git a/packages/google-cloud-runtimeconfig/setup.py b/packages/google-cloud-runtimeconfig/setup.py index 8fb17e8cd5a0..b46ef501aae0 100644 --- a/packages/google-cloud-runtimeconfig/setup.py +++ b/packages/google-cloud-runtimeconfig/setup.py @@ -78,6 +78,7 @@ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Operating System :: OS Independent", "Topic :: Internet", ], diff --git a/packages/google-cloud-spanner-dbapi-driver/setup.py b/packages/google-cloud-spanner-dbapi-driver/setup.py index cfc0b06a229b..1761fca917ba 100644 --- a/packages/google-cloud-spanner-dbapi-driver/setup.py +++ b/packages/google-cloud-spanner-dbapi-driver/setup.py @@ -70,6 +70,7 @@ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Operating System :: OS Independent", "Topic :: Database", ], diff --git a/packages/google-cloud-testutils/setup.py b/packages/google-cloud-testutils/setup.py index c11ccac6c4f2..0512da2d4a9a 100644 --- a/packages/google-cloud-testutils/setup.py +++ b/packages/google-cloud-testutils/setup.py @@ -71,6 +71,7 @@ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Topic :: Internet", "Topic :: Software Development :: Libraries :: Python Modules", ], diff --git a/packages/google-resumable-media/setup.py b/packages/google-resumable-media/setup.py index a4b25e5b90e1..d7a21f741401 100644 --- a/packages/google-resumable-media/setup.py +++ b/packages/google-resumable-media/setup.py @@ -63,6 +63,7 @@ 'Programming Language :: Python :: 3.12', 'Programming Language :: Python :: 3.13', 'Programming Language :: Python :: 3.14', + 'Programming Language :: Python :: 3.15', 'Topic :: Internet', ], ) diff --git a/packages/proto-plus/pyproject.toml b/packages/proto-plus/pyproject.toml index 4f0c30439ba1..553962d09191 100644 --- a/packages/proto-plus/pyproject.toml +++ b/packages/proto-plus/pyproject.toml @@ -34,6 +34,7 @@ classifiers = [ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Operating System :: OS Independent", "Topic :: Software Development :: Code Generators", "Topic :: Software Development :: Libraries :: Python Modules", diff --git a/packages/sqlalchemy-spanner/setup.py b/packages/sqlalchemy-spanner/setup.py index b01fd1d74301..ff4793c3c4c2 100644 --- a/packages/sqlalchemy-spanner/setup.py +++ b/packages/sqlalchemy-spanner/setup.py @@ -67,6 +67,7 @@ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", ], description=description, long_description=readme, From a57553b5303e207a6f18a775dd1197e843ef1932 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Wed, 23 Sep 2026 16:17:16 -0700 Subject: [PATCH 3/8] dont trigger prerelease issues on PRs --- .github/workflows/prerelease-deps.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/prerelease-deps.yml b/.github/workflows/prerelease-deps.yml index 0f76752c6707..a7098fbce4c2 100644 --- a/.github/workflows/prerelease-deps.yml +++ b/.github/workflows/prerelease-deps.yml @@ -176,7 +176,11 @@ jobs: } >> "$GITHUB_OUTPUT" - name: Create issue on failure - if: ${{ steps.run-tests.outcome == 'failure' && github.repository == 'googleapis/google-cloud-python' }} + # Only file an issue from the nightly schedule or a manual dispatch, never from a + # pull request. PRs that touch `ci/**` or this workflow trigger the check for + # validation purposes only; filing a `priority: p1` issue from them would duplicate + # the nightly report. The job summary written above still surfaces PR failures. + if: ${{ steps.run-tests.outcome == 'failure' && github.event_name != 'pull_request' && github.repository == 'googleapis/google-cloud-python' }} uses: googleapis/librarian/.github/actions/create-issue-on-failure@bb2ee61752bd0f5387195b54c509e4d01a52b41d with: title: "prerelease_deps check failed" From 4f37a9cfd987fdca323c45835c3a022bf7b4af8f Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Wed, 23 Sep 2026 16:23:23 -0700 Subject: [PATCH 4/8] removed bigtable todo --- .../client-post-processing/bigtable-integration.yaml | 5 ----- packages/google-cloud-bigtable/noxfile.py | 5 ----- 2 files changed, 10 deletions(-) diff --git a/.librarian/generator-input/client-post-processing/bigtable-integration.yaml b/.librarian/generator-input/client-post-processing/bigtable-integration.yaml index 16fdf18b574f..2ff18605f256 100644 --- a/.librarian/generator-input/client-post-processing/bigtable-integration.yaml +++ b/.librarian/generator-input/client-post-processing/bigtable-integration.yaml @@ -609,11 +609,6 @@ replacements: def unit(session, protobuf_implementation): # Install all test dependencies, then install this package in-place. - # TODO(https://github.com/googleapis/google-cloud-python/issues/17741): - # Remove once `google-crc32c` wheels are published for 3.15 - if session.python == "3.15": - session.skip("Skipping 3.15 until wheels are available for google-crc32c.") - constraints_path = str( CURRENT_DIRECTORY / "testing" / f"constraints-{session.python}.txt" ) diff --git a/packages/google-cloud-bigtable/noxfile.py b/packages/google-cloud-bigtable/noxfile.py index fb5a3cab9c4b..07d5f5bc4c15 100644 --- a/packages/google-cloud-bigtable/noxfile.py +++ b/packages/google-cloud-bigtable/noxfile.py @@ -249,11 +249,6 @@ def install_unittest_dependencies(session, *constraints): def unit(session, protobuf_implementation): # Install all test dependencies, then install this package in-place. - # TODO(https://github.com/googleapis/google-cloud-python/issues/17741): - # Remove once `google-crc32c` wheels are published for 3.15 - if session.python == "3.15": - session.skip("Skipping 3.15 until wheels are available for google-crc32c.") - constraints_path = str( CURRENT_DIRECTORY / "testing" / f"constraints-{session.python}.txt" ) From 424f6e0b9a2116a430f029b0a2554f976d3fd857 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Wed, 23 Sep 2026 16:24:37 -0700 Subject: [PATCH 5/8] changed bigquery to test 3.15 without pyarrow --- packages/google-cloud-bigquery/noxfile.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/google-cloud-bigquery/noxfile.py b/packages/google-cloud-bigquery/noxfile.py index c366a50e293f..ab6e15f15ff8 100644 --- a/packages/google-cloud-bigquery/noxfile.py +++ b/packages/google-cloud-bigquery/noxfile.py @@ -180,9 +180,13 @@ def default(session, install_extras=True): @_calculate_duration def unit(session, test_type): """Run the unit test suite.""" - if session.python == "3.15": + # TODO(https://github.com/googleapis/google-cloud-python/issues/17741): + # remove this skip once the optional extras resolve on 3.15. + # `unit_noextras` can be tested on 3.15 + if session.python == "3.15" and test_type == "unit": session.skip( - "Skipping 3.15 until wheels are available for pyarrow. Also pyproj wheels are needed for dependency geopandas." + "Optional extras do not yet resolve on 3.15; " + "unit_noextras covers the core install." ) install_extras = True From f5598a9e01c1f2cdf6532b43c70d9715691ffc65 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Wed, 23 Sep 2026 16:26:17 -0700 Subject: [PATCH 6/8] allow higher pyarrow versions for documentai_toolbox --- packages/google-cloud-documentai-toolbox/setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/google-cloud-documentai-toolbox/setup.py b/packages/google-cloud-documentai-toolbox/setup.py index 8765caa5b94a..5842ac56fbcf 100644 --- a/packages/google-cloud-documentai-toolbox/setup.py +++ b/packages/google-cloud-documentai-toolbox/setup.py @@ -58,7 +58,8 @@ "pandas[performance,gcp]>=2.0.0, <3.0.0; python_version < '3.15'", # pandas[performance] requires numba which does not have 3.15 support yet "pandas[gcp]>=2.0.0, <3.0.0;python_version>='3.15'", - "pyarrow>=15.0.0, <23.0.0", + # pyarrow is transitive dependency; not accessed by the library directly + "pyarrow>=15.0.0", "tabulate>=0.9.0, <1.0.0", "proto-plus>=1.26.1, <2.0.0", "grpc-google-iam-v1>=0.14.2, <1.0.0", From ffde280cfe0114a2023c9ddc0bde5983584b7424 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Thu, 24 Sep 2026 15:18:17 -0700 Subject: [PATCH 7/8] keep abi3 forward compatibility Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- ci/run_single_test.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/run_single_test.sh b/ci/run_single_test.sh index 5739ffed52cb..ced52a121eae 100755 --- a/ci/run_single_test.sh +++ b/ci/run_single_test.sh @@ -141,6 +141,7 @@ case ${TEST_TYPE} in echo "Creating temporary virtualenv for import profile..." python3 -m venv .venv-profiler source .venv-profiler/bin/activate + export PYO3_USE_ABI3_FORWARD_COMPATIBILITY=1 python -m pip install --upgrade pip setuptools PROFILER_TEMP_DIR=$(mktemp -d) From 8f1c33ab758cff579cfa7ac805f5071438fbe042 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Thu, 24 Sep 2026 15:37:46 -0700 Subject: [PATCH 8/8] reverted incompatible packages --- packages/google-cloud-bigquery/noxfile.py | 8 ++------ packages/google-cloud-bigquery/pyproject.toml | 1 - packages/sqlalchemy-spanner/setup.py | 1 - 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/packages/google-cloud-bigquery/noxfile.py b/packages/google-cloud-bigquery/noxfile.py index ab6e15f15ff8..c366a50e293f 100644 --- a/packages/google-cloud-bigquery/noxfile.py +++ b/packages/google-cloud-bigquery/noxfile.py @@ -180,13 +180,9 @@ def default(session, install_extras=True): @_calculate_duration def unit(session, test_type): """Run the unit test suite.""" - # TODO(https://github.com/googleapis/google-cloud-python/issues/17741): - # remove this skip once the optional extras resolve on 3.15. - # `unit_noextras` can be tested on 3.15 - if session.python == "3.15" and test_type == "unit": + if session.python == "3.15": session.skip( - "Optional extras do not yet resolve on 3.15; " - "unit_noextras covers the core install." + "Skipping 3.15 until wheels are available for pyarrow. Also pyproj wheels are needed for dependency geopandas." ) install_extras = True diff --git a/packages/google-cloud-bigquery/pyproject.toml b/packages/google-cloud-bigquery/pyproject.toml index 6e15be9903a2..050b886c06bf 100644 --- a/packages/google-cloud-bigquery/pyproject.toml +++ b/packages/google-cloud-bigquery/pyproject.toml @@ -37,7 +37,6 @@ classifiers = [ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", - "Programming Language :: Python :: 3.15", "Operating System :: OS Independent", "Topic :: Internet", ] diff --git a/packages/sqlalchemy-spanner/setup.py b/packages/sqlalchemy-spanner/setup.py index ff4793c3c4c2..b01fd1d74301 100644 --- a/packages/sqlalchemy-spanner/setup.py +++ b/packages/sqlalchemy-spanner/setup.py @@ -67,7 +67,6 @@ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", - "Programming Language :: Python :: 3.15", ], description=description, long_description=readme,