Skip to content

Rollout hygiene: run package doctests in CI, modernize packaging metadata, add .editorconfig - #1

Merged
thorwhalen merged 3 commits into
masterfrom
claude/rollout-polish
Aug 4, 2026
Merged

Rollout hygiene: run package doctests in CI, modernize packaging metadata, add .editorconfig#1
thorwhalen merged 3 commits into
masterfrom
claude/rollout-polish

Conversation

@thorwhalen

Copy link
Copy Markdown
Member

Hygiene pass from the fleet-wide wads repo-improvement rollout. This repo was
already on the modern uv-stub CI and green, so nothing here migrates or
restructures anything — it closes the metadata/config gaps that
python -m wads.repo_audit flagged, one dimension per commit.

What changed

1. testpaths — the real fix in this PR

wads CI runs pytest --doctest-modules with no path argument, so what gets
collected is decided entirely by testpaths. With testpaths = ["tests"], the
package's own doctests were never collected — CI reported green while doctesting
nothing in flaskstream2py/. That failure mode never announces itself.

testpaths now includes the package directory as well.

Doctest collection, before → after:

package doctests collected total items
before 0 1
after 1 2

The newly-collected item is
flaskstream2py/flask_request_reader.py::flaskstream2py.flask_request_reader.FlaskRequestReader
(the class docstring's Flask-route example). It passes — verified locally and
confirmed in this branch's CI log:

collected 2 items
tests/test_smoke.py::test_import PASSED                                  [ 50%]
flaskstream2py/flask_request_reader.py::...::FlaskRequestReader PASSED   [100%]
2 passed in 0.38s

No latent bug was surfaced by turning it on.

2. Packaging metadata ([project])

  • licence: the deprecated [project.license] text = "Apache-2.0" table
    became the PEP 639 SPDX string license = "Apache-2.0", matching the repo's
    actual Apache License 2.0 LICENSE file, plus license-files = ["LICENSE"]
    so the licence ships inside the wheel. Deliberately no
    License :: OSI Approved :: ... classifier: hatchling ≥ 1.27 rejects a licence
    classifier that coexists with an SPDX expression.
  • classifiers (11, all validated against trove-classifiers): Development
    Status 3 - Alpha — the README calls this a WIP library and the version is
    0.1.6, so maturity is not overstated. Python 3.10/3.11/3.12 only:
    requires-python is >=3.10 and the CI matrix tops out at 3.12, so 3.13 is
    not claimed as supported. Framework :: Flask,
    Topic :: Internet :: WWW/HTTP and
    Topic :: Software Development :: Libraries :: Python Modules describe what
    the package actually is; Operating System :: OS Independent is backed by CI
    running the Windows job too.
  • keywords (7): derived from the README and the public API — a stream2py
    SourceReader that reads an incoming Flask request body in chunks.
  • project.urls: added Documentation (the live GitHub Pages site, verified
    reachable), Repository and Issues next to the existing Homepage.
  • description, readme and requires-python were already present and
    accurate; left as-is. authors is still empty and was left alone on purpose —
    the repo has more than one contributor, so populating it is the maintainer's
    call, not a mechanical fix.

Verified locally: uv build produces a clean sdist + wheel and twine check
passes both. The resulting wheel metadata carries
License-Expression: Apache-2.0 and License-File: LICENSE.

3. .editorconfig

Added the standard fleet file (copied verbatim from a healthy sibling repo).
No existing file was reformatted.

Untouched on purpose

[tool.ruff] was already configured and is unchanged. No new tests, no
py.typed, no CHANGELOG, no code restructuring, no wholesale reformatting —
all out of scope for this pass.

Verification

  • Local dependents gate (priv test-dependents flaskstream2py):
    baseline 1 suites: 1 pass, 0 fail → final 1 suites: 1 pass, 0 fail.
    No regression, and the final run is strictly stronger since it now includes
    the package doctest.
  • Branch CI: https://github.com/i2mint/flaskstream2py/actions/runs/30860580517
    success. Read Configuration ✅, Validation 3.10 ✅, Validation 3.12 ✅,
    Windows Tests ✅. Publish and Publish GitHub Pages correctly skipped
    (branch build, not the default branch).
  • ruff check flaskstream2py and ruff format --check . are both clean.

Left undone

  • The repo ships no agent skills (skills/, .claude/skills/,
    flaskstream2py/data/skills/) — that is the wads-skillify dimension and was
    out of scope here.
  • docsrc/conf.py trips ruff D100 when linting the repo root. Harmless: CI
    scopes ruff check to the package directory, so it never sees that file.
  • authors = [], as noted above — needs a maintainer decision.

⚠️ Merging this publishes a release

[tool.wads.ci.publish] is enabled for this repo, so merging to master will
run the publish job and push a new version of flaskstream2py to PyPI (current
published version: 0.1.6). Nothing in this PR changes the package's behaviour or
its dependencies — the only functional difference is that CI now executes one
more (passing) doctest. Merge when you are happy to ship a metadata-only release.

Opened by the rollout agent and deliberately left open for maintainer review.

wads CI runs `pytest --doctest-modules` with no path argument, so
collection is driven entirely by `testpaths`. With `testpaths = ["tests"]`
the package's own doctests were never collected — CI reported green while
doctesting nothing in `flaskstream2py/`.

Adding the package dir takes collection from 1 item to 2: the
`FlaskRequestReader` class doctest is now actually executed (verified
locally, passes).

Claude-Session: https://claude.ai/code/session_01VipiLaG4xy7WctqY9w2475
- license: deprecated `[project.license] text = ...` table -> PEP 639 SPDX
  string `license = "Apache-2.0"` (matches the Apache 2.0 LICENSE file),
  plus `license-files = ["LICENSE"]` so the licence ships in the wheel.
  No `License :: OSI Approved :: ...` classifier is added: hatchling >= 1.27
  rejects a licence classifier coexisting with an SPDX expression.
- classifiers: added an accurate set. Development Status 3 - Alpha
  (README calls this a WIP library, version 0.1.6); Python 3.10-3.12 to
  match `requires-python` and the CI matrix (3.13 is not tested, so it is
  not claimed); Framework :: Flask and Topic :: Internet :: WWW/HTTP reflect
  what the package actually is.
- keywords: derived from the README and the public API (FlaskRequestReader,
  a stream2py SourceReader over an incoming Flask request body).
- project.urls: added Documentation (the live GitHub Pages site), Repository
  and Issues alongside the existing Homepage.

description, requires-python and readme were already present and accurate.
Validated: all 11 classifiers checked against trove-classifiers, sdist+wheel
build clean, `twine check` passes both.

Claude-Session: https://claude.ai/code/session_01VipiLaG4xy7WctqY9w2475
Same file the wads templates ship and the rest of the fleet uses (copied
verbatim from a healthy sibling repo). No existing files are reformatted.

Claude-Session: https://claude.ai/code/session_01VipiLaG4xy7WctqY9w2475
@thorwhalen
thorwhalen merged commit c293939 into master Aug 4, 2026
12 checks passed
@thorwhalen
thorwhalen deleted the claude/rollout-polish branch August 4, 2026 13:40
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