Skip to content

chore(release): prepare 0.3.0 - #80

Merged
CameronBrooks11 merged 2 commits into
mainfrom
release/0.3.0
Oct 8, 2026
Merged

CameronBrooks11 merged 2 commits into
mainfrom
release/0.3.0

Conversation

@CameronBrooks11

@CameronBrooks11 CameronBrooks11 commented Oct 8, 2026 •

Copy link
Copy Markdown
Member

What

Prepares the 0.3.0 release. No code changes.

  • The version is 0.3.0 in pyproject.toml, in reference/rowspec/__init__.py's __version__, and in the action's default install pin (rowspec==0.3.0). uv.lock changes only rowspec's own version line.
  • The README's action example points at @v0.3.0.
  • The changelog's unreleased section becomes [0.3.0] — 2026-10-08, with compare links and an empty [Unreleased] above it.
  • The ROADMAP's "Where it is" figures are re-measured (below), and a short "Shipped in 0.3.0" section sits above "Shipped in 0.2.0".

Not tagged. The tag is the owner's call after review.

Why 0.3.0

Under SemVer's pre-1.0 convention a minor bump carries behaviour changes, and this release has three that a consumer can observe:

A patch release (0.2.1) would claim no observable behaviour changed, which is not true here.

The changelog against git log v0.2.0..origin/main

All 19 commits in git log --oneline v0.2.0..origin/main were checked against the section. The existing entries covered #52/#72, #68, #78, #77, #64, #60, #76 and #57. I added these, which consumers can see but the section did not mention:

The section's opening note says what is left out. #58 and #75 are documentation-only, and the note covers them as 0.2.0's did. #66, #67 and #73 are dev and CI changes with no effect outside this repository, and the note now names them.

I checked the new claims before writing them:

  • cd conformance && uv run python run_cases.py no_such_impl prints the HARD FAILURE: line and exits 2.
  • grep -rhn 'uses:' .github/workflows action.yml | grep -vE '@[0-9a-f]{40}' matches only local ./ refs and comments.

Re-measured figures

Run on this branch, in the order listed. Each ROADMAP figure now has the command that produced it beside it.

figure command
All checks passed! just check
410 conformance cases find conformance/cases -name expect.json | wc -l
0 failure(s) across 410 case(s) just conform
0 failure(s) across 410 case(s) (second impl) just conform-alt
73 killed, 0 survived, 2 equivalent, 0 stale, 0 broken just mutants
75 distinct mutations just mutants | grep -ciE '^ (killed|equiv|survived|stale|broken|bogus) '
73 passed, 1 skipped just test
9 passed just test-xlsx

Two ROADMAP rows changed:

  • just test went from 52 passed to 73 passed. The new tests are test_pins.py, test_licensing.py and test_tooling.py, plus additions to existing files since v0.2.0.
  • The "75 distinct mutations" row's right-hand column was prose ("the gate refuses two that mutate identically"). It now gives the command, with the refusal kept as a parenthetical.

The just test-xlsx row is new.

The count command matches case-insensitively and includes bogus, because kindkit prints the failing verdicts in uppercase (SURVIVED, STALE, BROKEN, BOGUS). It was checked against a sample of all six per-mutant line shapes and kindkit's summary lines:

new regex, 6 verdict lines:  6
new regex, 5 summary lines: 0
old regex, 6 verdict lines:  2

It still gives 75 on this tree.

Dry run of release.yml's build job

I built from git archive HEAD of this commit, unpacked into an empty directory, so the build saw only tracked files. The commands are the workflow's.

  • uv build produced rowspec-0.3.0.tar.gz and rowspec-0.3.0-py3-none-any.whl.
  • Tag check, with GITHUB_REF_NAME=v0.3.0: tag v0.3.0 matches built version 0.3.0, exit 0. With GITHUB_REF_NAME=v0.2.0 as a negative control: ::error::tag v0.2.0 does not match built version 0.3.0, exit 1.
  • Action pin check: action.yml pins rowspec==0.3.0, matching the release.
  • Wheel smoke step: I extracted its run: script from the YAML with yaml.safe_load and ran it with bash -e from the build directory.
    wheel version: __version__ and metadata agree on 0.3.0 (…/uvcache/archive-v0/…/site-packages/rowspec/__init__.py)
    wheel CLI: eval refuses a broken total and annotates it
    
    The printed rowspec.__file__ is under uv's ephemeral environment, not the checkout. The version assertion therefore ran against the wheel.
  • METADATA: Version: 0.3.0, License-Expression: Apache-2.0 OR MIT, Requires-Python: >=3.11, Provides-Extra: xlsx, Requires-Dist: openpyxl>=3.1; extra == 'xlsx'. Besides its .dist-info, the wheel contains only rowspec/ and rowspec_xlsx/.
  • A fresh venv with the wheel installed (uv venv + uv pip install <wheel>):
    • rowspec eval on a table whose total is #REF!(/0) exits 1.
    • rowspec check on the same table exits 0 (0 refused). That is the reason the action runs both commands.
    • rowspec eval docs/example exits 0 (grand = 133.5); rowspec check docs/example exits 0.
    • A CSV with a lone CR gives a warning and exits 0 under check, and is refused with exit 1 under check --strict.
  • A second fresh venv with <wheel>[xlsx]: rowspec_xlsx imports from the venv, with openpyxl 3.1.5.

After merge

Tag v0.3.0 on the squash commit. release.yml then runs the gate, builds, publishes through the trusted publisher, and runs action-published.yml against the published wheel. This is the first release in which that job runs (#52); before now it has only run on branches pushed to probe it. If it goes red, the tag and the upload are already final, and the fix is a patch release.

Set the version to 0.3.0 in pyproject.toml, rowspec.__version__ and
the action's default install pin, and point the README's action
example at v0.3.0. Date the unreleased changelog section and add the
user-facing changes it was missing. Re-measure the roadmap's figures.
The 0.3.0 changelog said #74 left the licence split unchanged. It
relicensed conformance/reserved/ and docs/ci/rowspec-check.yml to
CC0-1.0 and gave action.yml, .github/workflows/ and the justfile a
licence; say so. Say that dev and CI changes are omitted too.

The roadmap's mutant-count command matched only lowercase verdicts, so
a SURVIVED, STALE, BROKEN or BOGUS line would have been left out of the
count. Match case-insensitively and include bogus.
@CameronBrooks11
CameronBrooks11 merged commit 4b703f0 into main Oct 8, 2026
8 checks passed
@CameronBrooks11
CameronBrooks11 deleted the release/0.3.0 branch October 8, 2026 02:45
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