Problem
PyPI advertises Python 3.10–3.14 support, but nothing in CI proves the built
wheel/sdist actually installs and imports on a clean environment. The test
matrix runs against the source tree (editable/dev install), so a missing
package-data file, a bad build-backend include, or a broken __init__
re-export would only surface after a user pip installs the release — exactly
when it is most expensive. A standalone py.typed-in-wheel guard exists, but
there is no general build → install-from-wheel → public-API-import gate. With
v1.1 still unreleased (pyproject is at 1.0.3), this is the missing safety net
before the next publish.
Goal
Add a CI job that builds the wheel and sdist, installs the wheel into a fresh
venv with base dependencies only, and asserts every public symbol in
aaanalysis.__all__ imports and that bundled _data resources load — across the
min+max supported Python versions, with no new required runtime dependency.
Requirements
KPIs / Acceptance criteria
Scope / non-goals
- Out: publishing to PyPI / release automation (a separate release step).
- Out: multi-OS beyond the existing Windows bracket — this gate is Linux;
Windows min+max is already bracketed in the unit matrix.
- Out: docs-build-in-CI and downstream-typing-smoke gates (possible
follow-ups; one issue = one deliverable).
- Reuses the existing
py.typed-in-wheel guard rather than duplicating it.
Dependencies
Standards checklist
Problem
PyPI advertises Python 3.10–3.14 support, but nothing in CI proves the built
wheel/sdist actually installs and imports on a clean environment. The test
matrix runs against the source tree (editable/dev install), so a missing
package-data file, a bad build-backend include, or a broken
__init__re-export would only surface after a user
pip installs the release — exactlywhen it is most expensive. A standalone
py.typed-in-wheel guard exists, butthere is no general build → install-from-wheel → public-API-import gate. With
v1.1 still unreleased (
pyprojectis at1.0.3), this is the missing safety netbefore the next publish.
Goal
Add a CI job that builds the wheel and sdist, installs the wheel into a fresh
venv with base dependencies only, and asserts every public symbol in
aaanalysis.__all__imports and that bundled_dataresources load — across themin+max supported Python versions, with no new required runtime dependency.
Requirements
python -m build; assert exactly one of each isproduced.
clean venv with base deps only (no
[dev]/[pro]) — this is whatcatches missing package data / bad includes.
import aaanalysis; assert every name inaaanalysis.__all__is importable, and thatpro-gated symbols degrade tomissing_feature_stubgracefully when theproextra is absent.load_dataset(...)/load_scales()call succeeds on the clean wheel install (proves
_data/*.xlsx/*.tsvpackage-data inclusion).
reusing existing matrix conventions in
.github/workflows/.KPIs / Acceptance criteria
aaanalysis.__all__symbol is unimportable from theinstalled wheel (binary pass/fail).
_dataresource is missing from the wheel(asserted via a
load_*call on the clean install).succeeds with base deps only (no
[dev]/[pro]resolved).Scope / non-goals
Windows min+max is already bracketed in the unit matrix.
follow-ups; one issue = one deliverable).
py.typed-in-wheel guard rather than duplicating it.Dependencies
public API" half of the ecosystem story)
Standards checklist
.github/workflows/*(new job) — flagfor approval; no
pyproject.tomlruntime-dep changeagainst the installed wheel
print(); bareValueError/RuntimeError; coverage measured on thepackage only (
--cov=aaanalysis), gate unchanged