Releases: tboy1337/battest
Releases · tboy1337/battest
Release list
v1.0.12
v1.0.11
[1.0.11] - 2026-08-23
GitHub Releases no longer attach Python wheels.
- GitHub Releases attach only the Windows zip. Wheels and sdists still publish
to PyPI.
v1.0.10
[1.0.10] - 2026-08-23
README rewrite and unused spec-exec discovery removal.
- Rewrote the README around install, fixtures, mocking, CLI, and the GitHub Action.
- Removed unused CLI
--include-spec-execandload_case(..., include_spec_exec=...).
Discovery no longer opts intovendor/batch-spec/corpus/exec.
v1.0.9
[1.0.9] - 2026-08-20
GitHub Action Marketplace listing and installer-test hygiene.
- Action
nameisbattest Actionwith branding (check-square,blue). - Installer tests assert the parsed GitHub asset-host allowlist and URI host
check. The regex timeout test builds its nested-quantifier pattern at
runtime so CodeQL does not treat those fixtures as URL sanitizers or a
shipped ReDoS expression.
v1.0.8
[1.0.8] - 2026-08-20
Production audit: Job assign fail-loud, env-dump integrity, installer host
allowlist, and packaging/CI hygiene.
AssignProcessToJobObjectfailure is a caseERROR. battest does not resume
cmd.exeoutside the job. The job handle is closed ifPopenfails. An
abandoned process skipsrmtreeof the workdir. JUnit duration includes
teardown.- After seeding, a non-file env dump path is
ERRORbefore spawn. After a
finished run, missing or non-file dumps areERRORwhenexpect.envis set.
Env dumps,equals_file, andfiles[]reads are capped at 10 MiB.
copy:refuses junctions/symlinks whose target escapes the fixture tree. - Host environment is inherited except stripped
BATTEST_*. CI secrets that
are not namedBATTEST_*can reach the SUT and JUnit.expect_callsis not
a security boundary; call logs live in the writable workdir. - Installer download URLs must be
httpson GitHub asset hosts. Package smoke
asserts packaged catalogs and schema. Non-Windows unit coverage does not use
the 90% floor (Windows jobs still do). PSGallery installs pin exact
PSScriptAnalyzer and Pester versions. - Packaged catalog YAML uses the same bounded loader as fixtures. Regex
workers getmultiprocessing.freeze_support()fromexecute_case. Invalid
regex patterns fail immediately without spawning a worker. - GitHub Action consumers should use
tboy1337/battest@v1. Release CI moves
that major tag to eachv1.x.xGitHub release.
v1.0.4
[1.0.4] - 2026-08-19
Production audit: host env isolation, destructive-path warnings, installer
release lookup, CodeQL, and PyInstaller spec cleanup.
- Inherited host
BATTEST_*variables are stripped before the script runs, so
a runner or CI job cannot leak helper names into the case. Fixtureenvcan
still setBATTEST_*values. - Destructive-internal absolute-path warnings match quoted paths with spaces
(del "C:\Program Files\x.txt") and switches with a colon
(del /a:h C:\Windows\Temp\x.txt). - Fixture YAML larger than 1 MiB is a schema error at load time.
- CodeQL Rust analysis fetches the locked
stub/crate graph before init so
rust-analyzer can expand macros. Actions stay on version tags, not commit
SHAs. - The standalone installer queries GitHub
releases/latestinstead of paging
100 releases. - PyInstaller spec no longer passes removed WinSxS/
cipherAnalysis arguments.
v1.0.3
[1.0.3] - 2026-08-15
Production audit: installer integrity, Windows device path confinement, and
fail-loud fixture loading.
- The standalone installer verifies the GitHub release-asset SHA-256 digest
(digeston the Releases API) after download and before extract. A missing
digest is a hard failure. The GitHub API request uses TLS 1.2 and a
battest-installerUser-Agent. - Fixture
script,setup,teardown,copy,equals_file, and
files[].pathvalues cannot be rooted, cannot contain.., and cannot name
reserved Windows devices (nul,con,aux,clock$, and the rest).
JSON Schema patterns match those runtime rules. - Unreadable scripts fail at load time instead of skipping tilde warnings.
Wrapper-relative script names must be ASCII so cmd.exe cannot mis-decode
the UTF-8 wrapper. - Destructive-internal absolute-path warnings also match
C:/..., quoted
targets, and/flagforms such asdel /f /q C:\Windows\Temp\x.txt. - The uninstaller kill helper is kept in parity with
scripts/installer_ps/Stop-BattestInstalledProcess.ps1. - Stub CLI tests fsync the copied helper and retry
ETXTBSYon exec as well
as copy, socargo llvm-covon Linux overlayfs does not fail with
"Text file busy". - CI and Action docs continue to pin GitHub Actions to version tags,
not commit SHAs.
v1.0.2
[1.0.2] - 2026-08-15
Production audit: confinement, mock fail-closed, installer, and release gating.
- PATH-mocking a cmd.exe internal is a
MockErrorat stub write time, not a
silent skip, so the Python API cannot run the real internal. - Fixture
script,setup,teardown,copy, andequals_filepaths reject
drive-relative and other rooted values (C:foo, UNC), not only
Path.is_absolute(). - Fixture
regexalso rejects quantified alternation such as(a|a)*. Nested
quantifiers and the 512-character cap remain. - Uninstaller uses delayed
errorlevelafterrmdir, exits1when removal
fails, kills only%LOCALAPPDATA%\Programs\battest\bin\battest.exe, and
matches PATH entries by exact segment. - CI reads
[project].versionwithtomllib, including the previous commit's
pyproject.tomlvia UTF-8git show(bytes cannot be passed to
tomllib.loads). It dogfoods examples against the committed stub before
rebuilding it, creates the GitHub Release only after wheels exist, then
publishes to PyPI withtwine --skip-existing. - JSON Schema rejects reserved device stems, caps
regexlength, and rejects
rooted file matcher paths. Editors still require lowercase command names. - CI and Action docs continue to pin GitHub Actions to version tags, not commit
SHAs.
v1.0.1
[1.0.1] - 2026-08-15
Production audit fixes for release metadata, CI, and fixture loading.
- GitHub Actions concurrency no longer cancels in-progress
mainruns, so a
version-bump release cannot be aborted mid-publish. - Release notes are taken from the changelog section that matches
[project].version. A missing or empty section fails CI instead of
publishing notes from an older version. - PyPI classifier is Production/Stable. README and Action docs describe the
published package instead of a pre-release tree. requirements-dev.txtincludes Blinter so it matchespip install -e ".[dev]".- Fixture load rejects missing or escaping
equals_filepaths as schema errors.
File matcherpathvalues cannot be absolute. - CI and Action docs continue to pin GitHub Actions to version tags, not commit
SHAs.
v1.0.0
[1.0.0] - 2026-08-14
First public release: battest run, PATH mocks, composite Action, and the
Rust stub helper.
- Fixture
PATHnow replaces inheritedPath/PATHeven when both keys exist
(POSIX-style environments and tests). - Default discovery uses
./testsonly when that directory contains battest
fixtures; otherwise it uses the current directory. - Composite Action JUnit reports use a unique
battest-junit-<guid>.xmlname
so two Action steps in one job cannot clobber each other. - JSON Schema
commandNamematches the runtime lowercase stem rules. - Nested-quantifier and over-long fixture
regexpatterns are rejected at
load time. - CodeQL Rust analysis uses
build-mode: none. - Stub crate toolchain is pinned to Rust 1.97.1; Windows PE rebuilds use
MSVC/Brepro. Stub I/O failures printbattest-stub:on stderr. - CI releases follow Blinter: bump
[project].versioninpyproject.tomlon
mainto buildbattest.exe, create a GitHub Release, and publish to PyPI.
A latermainpush still releases if that version tag is missing (retry
after a failed first attempt). Dependency Graph submission cannot block
release. Windows pytest rebuilds the PATH-mock stub but does not require a
byte-identical PE against GitHub-hosted MSVC. - CI and
scripts/verify.pylint first-party batch scripts with Blinter
(scripts/blinter.inifor installers; default rules forexamples/).