Skip to content

Release/v0.2.0 - #5

Merged
degoldschmidt merged 3 commits into
mainfrom
release/v0.2.0
Aug 21, 2026
Merged

Release/v0.2.0#5
degoldschmidt merged 3 commits into
mainfrom
release/v0.2.0

Conversation

@degoldschmidt

Copy link
Copy Markdown
Collaborator

Cuts v0.2.0 — the first tagged release the project will have had — and clears two
things that were quietly broken underneath it.

The user-facing changes themselves are already on main (faceting, QC auto-removal, arena
alignment, and the fixes for #1 and #2); see CHANGELOG.md for the full entry. This PR is
the release itself plus the packaging, docs and CI work that turned out to be prerequisites
for one.

Release

Version 0.1.00.2.0 in pyproject.toml and uv.lock, the [Unreleased] changelog
section dated and closed, README status line refreshed.

The sdist was unpublishable

uv build was producing a 124 MB source distribution: data/sample holds ~340 MB of
raw recordings and hatchling was sweeping all of it in. PyPI rejects any file over 100 MB,
so the release workflow's publish job could never have succeeded — this would have been
discovered only after tagging.

[tool.hatch.build.targets.sdist] now excludes /data (plus /dist, /site), taking the
sdist to 269 KB with all 77 source, test, config and doc files intact. The tests that
need the fixture already skipif when it is absent, so a build from sdist just skips them.

Related, not addressed here: data/sample/20240215/ and data/sample/raw/ hold
byte-identical copies of both recordings (verified by SHA-256) — ~170 MB of duplication in
the repository. Worth consolidating, but it means rewriting history, so it does not belong
in a release PR.

The GUI suite has never run on a runner

tests/test_gui.py importorskips qtpy, and CI syncs without the optional gui group, so
all 14 tests skipped on every push since M8. That is precisely the path #1 lived in: the
GUI worker dropped the provenance step and nothing caught it.

Adds a second gui job that installs the extra plus the Qt runtime libraries the runner
image lacks, then type-checks and runs the suite offscreen. It is a separate job rather
than --group gui on the existing sync, because the no-extra sync is the only thing proving
the package still imports and type-checks when Qt is absent — a property that matters
exactly because flypad.gui.* carries mypy relaxations for that case. The gui job also
re-runs mypy, which with PySide6 present checks the GUI against real Qt signatures instead
of Any.

Both jobs assert their own premise, because both fail silently otherwise: test fails if
qtpy ever appears in the default sync, and gui fails if qtpy is missing after the sync —
without which a broken install would look like a green job that skipped everything.

Docs

alignment and the QC auto-removal toggles had shipped without ever reaching the docs site,
which publishes to Pages on every push to main. docs/configuration.md gains a section
for each, including the warning that moving a dataset from matlab_compat to corrected
changes per-condition counts because the removal takes effect — with per_fly naming the
channels that went.

Verification

  • CI on this branch is green on the first run: test (3.11) ✅, test (3.12) ✅, gui ✅ —
    14 GUI tests passed on the runner, with Assert Qt is importable confirming the extra
    installed and the apt set sufficient.
  • 246 tests pass locally with the gui extra; 232 + 1 skipped in a runner-faithful
    environment.
  • uv build clean → wheel 114 KB, sdist 269 KB. The wheel installs into a fresh venv,
    flypad version reports 0.2.0, the console script runs, and py.typed plus both config
    presets ship.
  • uv sync --frozen verified at the release commit specifically (via a throwaway worktree),
    since a lockfile lagging its own version bump would break --frozen for anyone checking
    out the tag.
  • mkdocs build --strict clean.

After merging

Tag v0.2.0 at the merge commit on main, not at the release commit on this branch, so
the tagged tree includes the docs and CI work. Pushing the tag fires the release workflow
(buildsmokepublish); publish needs a PyPI trusted publisher and a pypi
environment configured for this repo, and will fail red without them. The name flypad is
currently unregistered on PyPI.

Faceting with pairwise statistics, automatic QC channel removal and arena-fill
alignment, plus the fixes for #1 and #2. Version bump, CHANGELOG heading and
README status line.

Also keeps the regression fixture out of the source distribution. `uv build` was
producing a 124 MB sdist: data/sample ships ~340 MB of raw recordings, and both
copies of it — data/sample/20240215/ and data/sample/raw/ hold byte-identical
files. PyPI rejects any file over 100 MB, so the release workflow's publish step
could never have succeeded. Excluding /data (plus /dist and /site) takes the
sdist to 269 KB with all 77 source, test, config and doc files intact; the tests
that need the fixture already skip when it is absent.

Verified the release path locally: `uv build` clean, the wheel installs into a
fresh venv, `flypad version` reports 0.2.0, the console script runs, and py.typed
and both config presets ship. CI sequence green in a runner-faithful environment.
Both shipped without ever reaching the docs site, which publishes to Pages on
every push to main. configuration.md gains a section for each: the quality-control
toggles with their per-preset defaults, and a note that switching a dataset from
matlab_compat to corrected changes per-condition counts because the removal takes
effect — with per_fly naming the channels that went; and the alignment options,
noting exported indices stay raw-file sample positions.

Also adds `alignment` to the example config and both sections to the key-sections
table. `mkdocs build --strict` clean.
tests/test_gui.py has never executed on a runner: it importorskips qtpy, and CI
syncs without the optional `gui` group, so all 14 tests skipped on every push.
That is the path issue #1 lived in — the GUI worker dropped the provenance step
and nothing caught it.

Adds a second `gui` job that installs the extra plus the Qt runtime libraries the
runner image lacks, then type-checks and runs the suite under the offscreen
platform. Deliberately a separate job rather than adding `--group gui` to the
existing sync: the no-extra sync is the only thing proving the package still
imports and type-checks when Qt is absent, which is a property worth keeping now
that flypad.gui.* has mypy relaxations for exactly that case. The gui job also
re-runs mypy, which with PySide6 present checks the GUI against real Qt
signatures instead of Any.

Both jobs assert their own premise, because both fail silently otherwise: `test`
fails if qtpy ever appears in the default sync, and `gui` fails if qtpy is
missing after the sync — without which a broken install would look like a green
job that skipped everything.

Verified locally: `uv sync --frozen --group gui` resolves from the lock unchanged,
the 14 GUI tests pass offscreen via the exact CI invocation, and mypy passes with
real Qt stubs. The four apt package names were checked against Ubuntu 24.04
(ubuntu-latest); whether that set is sufficient on the runner is the one thing
only a real run can confirm.
@degoldschmidt
degoldschmidt merged commit 3945b7f into main Aug 21, 2026
6 checks passed
@degoldschmidt
degoldschmidt deleted the release/v0.2.0 branch August 21, 2026 13:20
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