Changelog¶
All notable changes to industrialstats are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]¶
Nothing yet.
[0.2.0] - 2026-09-04¶
Added¶
- PEP 561
py.typedmarker, so the shipped type annotations are visible to type checkers in downstream projects. - Documentation site built with MkDocs Material and mkdocstrings, published to GitHub Pages.
SECURITY.md, issue forms (including a statistical-correctness report), a pull request template, andCODEOWNERS.- Test coverage measurement with an enforced floor, plus CodeQL and
pip-auditscanning in CI. - CI now runs on pushes to
mainand covers Windows and macOS in addition to Linux.
Changed¶
- Replaced black, isort, and flake8 with Ruff for both linting and formatting.
The previous flake8 configuration silenced real defect classes (unused
imports and variables, bare
except, star imports); these are now enforced. - Enabled real type checking.
mypypreviously ran withignore_errors = true, which disabled it entirely. Six numerically dense modules carry documented, shrinking debt via per-module overrides; everything else is clean. zip()calls over design matrices now passstrict=True, so a length mismatch raises instead of silently truncating.- The CLI reports a stable program name in help output rather than inheriting
it from
sys.argv[0]. - Example scripts use
numpy.random.Generatorinstead of the legacy globalnumpy.random.seedAPI.
Removed¶
- BREAKING:
industrialstats.visualizationsno longer re-exports its third-party imports. A star-import plus a computed__all__madenp,pd,plt,sns,goandstatspart of the package's public API; the module now exports onlyExperimentPlotterandResponseSurfacePlotter. Import those libraries directly instead of viaindustrialstats.visualizations.
Security¶
- Raised the
pytestdevelopment dependency past GHSA-6w46-j5rx-g56g (predictable/tmp/pytest-of-{user}handling on UNIX, allowing a local user to cause denial of service or possibly escalate privileges). The constraint was^8.0.0, which pins to a range that is affected in its entirety, and did not match the 9.x that CI already installed. It is now>=9.0.3,<10, matched byminversionand by an explicit floor in the workflow install steps.pytestis a development dependency and is never installed by users of the package.
Fixed¶
- Eight modules had
from __future__ import annotationsplaced above their module docstring, which left__doc__asNoneand would have produced empty API documentation. DesignValidator.check_confoundingno longer emits a divide-by-zeroRuntimeWarningon perfectly confounded designs, which is the case it exists to report; it returns an infinite VIF as expected.- Guarded
design_matrixaccess in the CRD, RCBD, and screening designs, which previously raisedAttributeErrorwhen called beforegenerate_design(). CompletelyRandomizedDesignvalidates response columns withpandas.api.types.is_numeric_dtype, which handles nullable extension dtypes thatnumpy.issubdtyperejects.- Mutable default arguments in
PowerAnalysis(factor_levels,powers) are no longer shared across calls. - Exceptions raised while wrapping model-fitting failures now chain the
original error with
raise ... from. ModelDiagnostics.assumption_testsno longer depends on SciPy's deprecated implicit Anderson-Darling behaviour. SciPy 1.17 requires an explicit p-value method and removes the critical-value tables in 1.19; the test now requests an interpolated p-value where that is supported and falls back to the tables on older SciPy. The reportedandersonmapping gains ap_valuekey alongsidecritical_value_5pct; whichever the installed SciPy cannot supply isNone.ModelFitting.regularized_fittingno longer passesalphas=Noneexplicitly to scikit-learn, which is deprecated and removed in 1.9. The argument is now omitted when unset, preserving the automatic grid on every supported version.DesignValidator.check_confoundingalso suppresses the singular-matrix conditioning warning newer statsmodels emits for perfectly confounded designs, which is the case the function exists to report.- The performance regression benchmark compared two adjacent timings of the same call, so a single descheduled run failed it. It now warms up and takes the minimum of several repetitions on each side.
0.1.0 (2026-09-04)¶
Features¶
- add DataExcept dependency (852723c)
- add DataExcept file boundaries (55f9156)
- add structured CSV loading boundary (df894b0)
- export structured CSV loader (3762fd6)
- route CLI file I/O through DataExcept boundaries (3576008)
- wrap export boundary failures with DataExcept (ba1948d)
Bug Fixes¶
Documentation¶
- add changelog for automated releases (7ce4c6d)
- add PyPI and Zenodo release checklist (471fdb3)
- document automated release flow (82d6890)
- install development tools in setup instructions (f148493)
- let release please own changelog entries (e36a4af)
- prepare README for package release (dc3ddcc)
- reflect active DataExcept runtime integration (81c9abe)
- refresh README and correctness-first roadmap (efbadb8)
- refresh README with current DOE capabilities (7d5d1cd)
- replace stale roadmap with correctness-first plan (7bb2a91)
- simplify release flow (feb4999)