Skip to content

chore: test Python 3.14 in CI and declare supported versions on PyPI - #67

Merged
tyler5673 merged 1 commit into
mainfrom
chore/ci-python-314-and-pypi-metadata
Sep 22, 2026
Merged

tyler5673 merged 1 commit into
mainfrom
chore/ci-python-314-and-pypi-metadata

Conversation

@tyler5673

Copy link
Copy Markdown
Contributor

Follow-up to the 3.5.0 release. Three metadata and coverage gaps surfaced while shipping it; none affect the published 3.5.0 artifacts, so they land here rather than in a re-cut.

1. CI never tested Python 3.14

requires-python = ">=3.10" has no upper bound, so 3.14 users install and run this SDK today — while the matrix stopped at 3.13. I verified 3.14 before adding it rather than adding it and hoping:

Gate 3.11 (dev) 3.14.7
Offline suite 450 passed 450 passed
Perf suite 33 passed 33 passed
mypy src/ scripts/ clean, 87 files clean, 87 files
pylint (CI errors-only) 10.00/10 10.00/10
Clean-room install of the published wheel + live API call works

actions/python-versions carries 3.14.7, so setup-python resolves it. The clean-room run is how this gap got noticed at all — it installed 3.5.0 under 3.14 and exercised the knowledge path against prod.

No upper bound on requires-python stays as-is, which is right for a library: 3.15.0rc1 exists and capping would block users for no reason unless something actually breaks.

2. The package declared zero classifiers

PyPI could not filter it by Python version and the project page showed no supported-version metadata. Requires-Python was already correct and is what pip/uv resolve against, so this is discoverability, not installability — worth being precise about, since it means nothing was broken for users.

Ten classifiers added, covering 3.10–3.14 plus Typing :: Typed (py.typed ships) and Operating System :: OS Independent (pure Python).

No License :: OSI Approved :: MIT License trove: the SPDX license = "MIT" expression already emits License-Expression, and declaring both is what newer setuptools warns about. Verified the built METADATA carries License-Expression: MIT and no conflicting classifier.

3. No project URLs

PyPI showed no Homepage, Repository, Changelog or Issues links. Added all four. Homepage points at the canonical https://you.com/docs/welcome rather than https://you.com/docs, which 301s.

Verification

  • pyproject.toml parses; uv lock --check clean — the lock does not need regenerating
  • Built wheel METADATA carries all 10 classifiers, all 4 Project-URLs, and License-Expression: MIT
  • Build emits no warnings or deprecations
  • Workflow YAML parses; matrix is ['3.10', '3.11', '3.12', '3.13', '3.14']; build-check and drift-check stay pinned at 3.12
  • 450 offline tests pass, package imports clean

Not in this PR

version stays at 3.5.0. These are metadata-only and take effect with the next release; re-cutting 3.5.0 is not possible anyway, since PyPI versions are immutable and 3.5.0 is already published with verified hashes.

Three metadata and coverage gaps found while releasing 3.5.0.

The CI matrix stopped at 3.13 while requires-python is ">=3.10" with no upper
bound, so 3.14 users were installing and running the SDK unverified. Confirmed
3.14.7 passes everything before adding it: 450 offline tests, 33 perf tests, mypy
clean over 87 files, pylint 10.00/10 on the errors-only gate, and a clean-room
install of the published 3.5.0 wheel running a documented example against the
live API. actions/python-versions carries 3.14.7, so setup-python resolves it.

The package declared no classifiers at all, so PyPI could not filter it by
Python version and the project page showed no supported-version metadata.
Requires-Python was already correct and is what pip and uv resolve against, so
this is discoverability rather than installability. No `License ::` trove
classifier: the SPDX `license` expression already emits `License-Expression`, and
declaring both is what newer setuptools warns about. Verified all ten classifiers
and the four URLs land in the built wheel's METADATA.

No project URLs were declared either, so PyPI showed no Homepage, Repository,
Changelog or Issues links. Homepage points at the canonical
https://you.com/docs/welcome rather than https://you.com/docs, which 301s.

Metadata only: uv.lock is unchanged (`uv lock --check` clean), the build emits no
warnings, and the version stays at 3.5.0 -- these take effect with the next
release rather than re-cutting one already on PyPI.
@factory-droid

factory-droid Bot commented Sep 22, 2026

Copy link
Copy Markdown
Contributor

Droid finished @tyler5673's task —— View job


Security Review

Pass 2 validation complete.

LGTM, no high-confidence issues found. This PR is low risk and limited to CI coverage (Python 3.14) plus PyPI metadata (classifiers and project URLs).

No inline review comments to post (0 candidates).

@tyler5673
tyler5673 merged commit 68ec5ea into main Sep 22, 2026
8 checks passed
@tyler5673
tyler5673 deleted the chore/ci-python-314-and-pypi-metadata branch September 22, 2026 23:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant