v8.0.0
New Features
-
Two composite actions carry logic that both testing job templates used to hold a copy of (#253):
.github/actions/ComputeRequirements— resolves a./-prefixed requirements file against a base directory
and checks that it exists. Inputsrequirements,mingw_requirements,base_directory; outputs
requirementsandmingw_requirements..github/actions/ComputePacboyPackages— holds the pip → MSYS2 rewrite table and translates a requirements
file (following nested-r) or a dependency list into pacboy packages. Inputrequirements, output
pacboy_packages.
base_directoryis a single joined path rather than the three directory inputs, so the action does not need to
know whether it is called fromUnitTesting.yml(root/tests/unit),ApplicationTesting.yml
(root/tests/app) orStaticTypeCheck.yml(root/tests/typing). -
StaticTypeCheck.ymltakesroot_directory,tests_directoryandtyping_directory— defaults'.',
'tests'and'typing'— and accepts the./requirements syntax through the same action. It had no
directory parameters at all, which is why itsrequirementsdefault had to spell the path out. All three
testing and checking templates now address their requirements files the same way. (#257)
Breaking Changes
-
⚠️ A./-prefixedmingw_requirementsaddresses a different file. It was passed topip install
unprocessed, so./requirements.txtresolved against the working directory; it now resolves against
root_directory/tests_directory/unittest_directory(orapptest_directory), exactly likerequirements.
A caller that spelled the path out (-r tests/unit/mingw.txt) is unaffected — only the./form changes.
(#253)This is limited to callers that set
mingw_requirements; its default is'', and no pipeline in this
workspace sets it —CompletePipeline.ymldoes not even expose the parameter, so the eleven repositories that
go through it cannot reach this change at all.
Changes
-
The pip → pacboy rewrite table is maintained once.
UnitTesting.ymlandApplicationTesting.ymleach
carried their own copy of the table, thesubPackagestable and the ~40-line reader — about 130 lines apiece.
Both now call the actions. The table had drifted twice, and neither drift was found by a test. (#253) -
The table is also complete now, and one entry changed meaning. Every entry was recomputed by resolving each
distribution's requirements transitively down to the distributions that need an MSYS2 package. (#253)- Added:
pyEDAA.IPXACT,pyEDAA.OSVVM,pyEDAA.OutputFilter,pyEDAA.ToolSetup,pyEDAA.UCIS,
pyEDAA.Workflow,pyVersioning, andpyTooling[sphinx]. sphinx_reportswas incomplete — it listed three of the seven packages it needs. It requires
pyEDAA.Reports,Coverageanddocstr_coverage, so it also needspython-coverage:p,python-lxml:p,
python-ruamel-yaml:pandpython-ruamel.yaml.clib:p. Reachable today:pyEDAA.OSVVMrequires
sphinx_reports.pyEDAA.ProjectModelloses its base entry and moves tosubPackagesunder anosvvmkey. Its
requirements arepyTooling,pyVHDLModel,pySVModelandpySystemRDLModel, none of which has compiled
code, so theruamel-yaml/clib/lxmlit listed is needed by nothing it pulls in. Only
pyEDAA.ProjectModel[osvvm]needs anything. This is the only entry that installs fewer packages than
before.- pyTooling's
packaging,terminalandtestingextras get no entry on purpose — setuptools, colorama and
pytest are pure Python — and a comment says so.
- Added:
-
⚠️ StaticTypeCheck.yml'srequirementsdefault changes from'-r tests/typing/requirements.txt'to
'-r ./requirements.txt'. With the directory defaults it resolves to the same file, so a caller that does not
set the parameter sees no difference, and a caller passing a path without./is unaffected too. The one case
that changes is a caller already passing a./-prefixed path: it is now rebased onto the typing directory
instead of the working directory. No consumer does — the two repositories that set the parameter both pass
-r tests/requirements.txt, andCompletePipeline.ymldoes not forward it at all. (#257) -
StaticTypeCheck.ymlruns mypy inroot_directory, mirroring howUnitTesting.ymlruns pytest. At the
default'.'this changes nothing. The documentation states whatUnitTesting.rstleaves implicit: the report
paths are written relative to that directory but uploaded relative to the repository root, so a non-default
value has to be accounted for in both. (#257) -
Both testing job templates install
ruamel.yamlwith its C library on MSYS2. They disagreed:
UnitTesting.ymlinstalledpython-ruamel-yamlalone and kept theclibvariant beside it as a comment,
ApplicationTesting.ymlinstalled both.ruamel.yamlimports_ruamel_yamlfromruamel.yaml.cliband
silently falls back to its pure-Python parser when that fails; measured on a 186-line file, the C parser is
6.7× faster (7.63 ms → 1.14 ms). MSYS2 shipspython-ruamel.yaml.clibprebuilt, so it costs a download and
no compilation. (#252) -
A missing
mingw_requirementsfile is reported before the install rather than during it. The existence
check thatrequirementshas always had applies tomingw_requirementstoo, so a typo aborts with a
FileNotFoundErrorannotation naming the resolved path. This is not a behaviour change: pip already exited 1
on a missing requirements file (ERROR: Could not open requirements file), so such a job failed before too —
just less legibly, and deeper in the log. (#253) -
The MSYS2 install step of both testing templates lost its
if.ComputeRequirementsemits the plain
requirementsas itsmingw_requirementsoutput when no override is given, so the "override or fall back"
decision is made once inside the action. (#253) -
The computed pacboy list is sorted, so the same job produces the same line on two runs and logs can be
diffed. (#253) -
InstallPackage.ymlkeeps its hand-writtenpacboy:list — it installs the package under test and has no
requirements file to translate — and carries a comment naming the single source to keep it in sync with. (#253) -
The shell variable holding a merge commit's second parent is
SECOND_PARENT_SHAinstead ofFATHER_SHA, in
PrepareJob.yml(10 uses) andPublishReleaseNotes.yml(4 uses). "Second parent" is git's own term and the one
the step is named after; "father" is not git terminology. GHDL's integrated copy of this logic already used that
name, so the two now agree.
Bug Fixes
-
A job could download an artifact its producer never uploaded. A status check function tolerates a skipped
dependency — that is what it is for — but it cannot distinguish a dependency that is unrelated from one that
produces the artifact the job is about to download. Such a job started anyway and failed at the download:Unable to download artifact(s): Artifact not found for name: documentation-HTMLObserved on GHDL's pipeline: GitHub cancelled three Windows packaging jobs, the cascade skipped the
documentation job, and the publishing job ran regardless.Three jobs in
CompletePipeline.ymlnow require the job producing each artifact to have succeeded:PDFDocumentationrequiresDocumentation, whose LaTeX sources it converts.PublishToGitHubPagesrequiresDocumentation,PublishCoverageResultsandStaticTypeCheck— the three
HTML trees it assembles.PublishOnPyPIrequiresPackage, whose wheel and source distribution it uploads.
!failure() && !cancelled()is kept alongside, so a failure anywhere in the closure still suppresses these
jobs; the new terms only close the skip. None of the producers is switchable by a caller input, so this cannot
disable a supported configuration.IntermediateCleanUpandArtifactCleanUpare unchanged on purpose — they delete artifacts and must run
whatever happened — as areTriggerTaggedReleaseandReleasePage, which download nothing. -
CompletePipeline.ymlpublishes to GitHub Pages only from branches thegithub-pagesenvironment admits —
the repository's default branch anddev. The environment's protection rules reject a deployment from any other
branch before a runner is assigned, so the job failed after one second with no step recorded:Branch "claude/dependency-updates" is not allowed to deploy to github-pages due to environment protection rules.Every feature-branch pipeline therefore showed a red job unrelated to its own changes, which is how a real
failure gets overlooked. The condition readsgithub.event.repository.default_branch, so repositories on
masterare covered too. (#249) -
A
jsonschematest dependency lost every MSYS2 job at the install step, before a single test ran.
jsonschemadepends onrpds-py, a Rust extension with no wheel formingw_x86_64_ucrt_gnu;maturinrefuses
the target outright, so installing a Rust toolchain would not have helped. MSYS2 ships
mingw-w64-<env>-python-jsonschemaprebuilt, so the rewrite table names it. (#252) -
Two rewrite-table entries in
ApplicationTesting.ymlcould never match. The lookup is
regExp.match(dependency.lower()), but that copy spelled"pyEDAA.ProjectModel"and"pyEDAA.Reports"in
camel-case. A workflow requiringpyEDAA.Reportsgot none ofpython-ruamel-yaml,python-ruamel.yaml.clibor
python-lxmlon MSYS2.pyEDAA.ReportsandpyVersioningboth use that workflow. (#252) -
A dependency list in
requirementswas silently dropped. The parameter accepts either-r <path>or a
space separated list, but only the-rbranch wrote toGITHUB_OUTPUT. The install step then ranpip install
with an empty argument, installing nothing, and on MSYS2 the pacboy step scanned the empty string and annotated
Unrecognized dependency format ''. It stayed hidden because the default is'-r ./requirements.txt'. (#253) -
PrepareJob.ymlandPublishReleaseNotes.ymlcompared a literal string. Both wrote"{FATHER_SHA}" == ""
without the$, so that half of the emptiness check never fired. It was masked by the$? -ne 0test beside
it, which catches the case that actually occurs.
Documentation
-
doc/Development.rst, Conditional Jobs → Guidelines, states the distinction between an unrelated dependency
and a producing one, with the observed failure as the worked example. The rule is not obvious from the symptom. -
doc/Deveopment.rstwas missing anland is renamed todoc/Development.rst; the toctree entry in
doc/index.rstfollows. The page's title, itsDEV/***labels and every:ref:to them are untouched, so no
cross-reference breaks — but the published URL changes from.../Deveopment.htmlto.../Development.html.
The heading ofdoc/Instantiation.rstread "Instantiantion". (#255) -
UnitTesting.rstandApplicationTesting.rstsaid thatmingw_requirements"is not resolved this way" and is
"passed topip installunchanged". Both now state that it is resolved and checked likerequirements, and
that leaving it empty installsrequirementson MSYS2 as well. (#253) -
StaticTypeCheck.rstgains the three directory inputs, and itsrequirementssection gains the same two-way
lookup description the two testing templates carry. Its Behavior list says mypy runs inroot_directory.
(#257) -
Every instantiation example and every prose mention of the release branch moves from
@r7to@r8— 163
occurrences across 26 files, including the genericsome/path/to/a/templateplaceholder. Same shape as
c054718("Changed documentation to @r6.") for the previous major.
GitHub Pipeline
-
_Checking_Parameters.ymlgains aRequirements_Checkjob. It writes a small requirements tree —
including a nested-r ./more.txtand a separate MSYS2 override — runs both new actions over it and asserts all
three outputs, twelve pacboy packages among them. It refers to the actions as./.github/actions/..., so it
exercises the branch under test rather than@dev. (#253)It is a control, not a smoke test: re-introducing the camel-case key drops
python-lxml:p, and passing
mingw_requirementsthrough unresolved leaves the./path in place. Both were tried.It also resolves
StaticTypeCheck.yml's new default against this repository's owntests/typingand asserts
it equals the old literal default, so "both defaults name the same file" is checked rather than claimed — and
the existence check runs against a file that really is there. (#257)
Known Issues
- MSYS2's
python-ruamel-yamlis 0.18.17, while pyTooling requiresruamel.yaml ~= 0.19.1: pacman satisfies
the import, then pip still sees the version unsatisfied. The same shape as the existing
aiohttp >= 3.12 # limited on MSYS2note. ruamel.yaml0.19 replacedclibwithclibz, and MSYS2 packagesclibbut notclibz. The entry is correct
today and will want revisiting when MSYS2 catches up.- Nothing keeps the rewrite table in sync with the packages it describes. It is a claim about other
repositories' dependency graphs, and it had gone stale in six places before this release without a sound. A
GitHub runner cannot check it — the sibling repositories are not there — so it wants a local tool rather than a
CI job.
Related Issues and Pull-Requests
- Follows v7.15.0 (#244).
- Merged into this release: #249, #252, #253, #255, #257.
- The same artifact-producer defect and the same fix in GHDL's pipeline:
ghdl/ghdl#3313.
Important
This is a major release, so r8 has to be created after merging — r7 is not moved. Every consumer
pinning @r7 stays on v7.15.0 until its pipeline is deliberately changed to @r8. That is twenty pipelines
across this collaboration.
The documentation published from dev already tells consumers to use @r8, so the examples name a ref that
cannot be resolved until the branch exists. The window closes when the release is tagged.
Note
Why 8.0.0 rather than 7.16.0. Two changes alter the meaning of an existing parameter rather than adding
one: a ./-prefixed mingw_requirements in the two testing templates (#253), and a ./-prefixed
requirements in StaticTypeCheck.yml (#257). Both are now resolved against a test directory instead of the
working directory.
Neither affects any pipeline in this collaboration — CompletePipeline.yml does not expose mingw_requirements
at all and does not forward requirements to StaticTypeCheck, and the handful of repositories that set either
parameter directly all spell their paths without the ./ prefix. But both change a documented contract, and an
external consumer cannot be surveyed the way this workspace can.
Published from Verification of Pipeline Templates (Simple Package) workflow triggered by Paebbels on 2026-09-08 06:54:25 UTC.
This automatic release was created by pyTooling/Actions::Release.yml