Release/v0.2.0 - #5
Merged
Merged
Conversation
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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, arenaalignment, and the fixes for #1 and #2); see
CHANGELOG.mdfor the full entry. This PR isthe release itself plus the packaging, docs and CI work that turned out to be prerequisites
for one.
Release
Version
0.1.0→0.2.0inpyproject.tomlanduv.lock, the[Unreleased]changelogsection dated and closed, README status line refreshed.
The sdist was unpublishable
uv buildwas producing a 124 MB source distribution:data/sampleholds ~340 MB ofraw recordings and hatchling was sweeping all of it in. PyPI rejects any file over 100 MB,
so the release workflow's
publishjob could never have succeeded — this would have beendiscovered only after tagging.
[tool.hatch.build.targets.sdist]now excludes/data(plus/dist,/site), taking thesdist to 269 KB with all 77 source, test, config and doc files intact. The tests that
need the fixture already
skipifwhen it is absent, so a build from sdist just skips them.Related, not addressed here:
data/sample/20240215/anddata/sample/raw/holdbyte-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.pyimportorskips qtpy, and CI syncs without the optionalguigroup, soall 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
guijob that installs the extra plus the Qt runtime libraries the runnerimage lacks, then type-checks and runs the suite offscreen. It is a separate job rather
than
--group guion the existing sync, because the no-extra sync is the only thing provingthe package still imports and type-checks when Qt is absent — a property that matters
exactly because
flypad.gui.*carries mypy relaxations for that case. Theguijob alsore-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:
testfails ifqtpy ever appears in the default sync, and
guifails if qtpy is missing after the sync —without which a broken install would look like a green job that skipped everything.
Docs
alignmentand the QC auto-removal toggles had shipped without ever reaching the docs site,which publishes to Pages on every push to
main.docs/configuration.mdgains a sectionfor each, including the warning that moving a dataset from
matlab_compattocorrectedchanges per-condition counts because the removal takes effect — with
per_flynaming thechannels that went.
Verification
test (3.11)✅,test (3.12)✅,gui✅ —14 GUI tests passed on the runner, with
Assert Qt is importableconfirming the extrainstalled and the apt set sufficient.
guiextra; 232 + 1 skipped in a runner-faithfulenvironment.
uv buildclean → wheel 114 KB, sdist 269 KB. The wheel installs into a fresh venv,flypad versionreports0.2.0, the console script runs, andpy.typedplus both configpresets ship.
uv sync --frozenverified at the release commit specifically (via a throwaway worktree),since a lockfile lagging its own version bump would break
--frozenfor anyone checkingout the tag.
mkdocs build --strictclean.After merging
Tag
v0.2.0at the merge commit onmain, not at the release commit on this branch, sothe tagged tree includes the docs and CI work. Pushing the tag fires the release workflow
(
build→smoke→publish);publishneeds a PyPI trusted publisher and apypienvironment configured for this repo, and will fail red without them. The name
flypadiscurrently unregistered on PyPI.