software/slapos-testing: apply PyJWT pyproject.toml patch in [eggs/scripts]
Summary
Apply the PyJWT pyproject.toml license patch in software/slapos-testing so the unit-test SR can build PyJWT 2.12.1+SlapOSPatched001.
Why CI is currently red
The fixup c43d6b400 ("fixup! stack/caucase: version up PyJWT egg, including security fixes.") added PyJWT-patches / PyJWT-patch-options to the [caucase-eggs] section in stack/caucase/buildout.cfg. This is enough for SRs that install [caucase-eggs] directly.
However, software/slapos-testing/software.cfg does NOT install [caucase-eggs] — its parts list is:
parts =
bootstrap-slapos.recipe.cmmi
eggs/scripts
template
[caucase-eggs] is not in parts, so its PyJWT-patches directive is never honored. PyJWT is pulled in as a transitive dependency of caucase (which is installed as a develop egg) through [eggs/scripts], but [eggs/scripts] has no PyJWT-patches directive. The result is that zc.buildout downloads the unpatched pyjwt-2.12.1.tar.gz, hands it to pip wheel, and setuptools 67.8.0 rejects it:
ValueError: invalid pyproject.toml config: `project.license`.
configuration error: `project.license` must be valid exactly by one definition (2 matches found):
- keys: {'file': {type: string}} required: ['file']
- keys: {'text': {type: string}} required: ['text']
The PyJWT upstream pyproject.toml declares the license twice (both as text license = "MIT" and via a file reference). This violates PEP 621 and recent setuptools refuses to build it. The patch added under component/egg-patch/PyJWT/no-license-in-pyproject.toml.patch removes the duplicate text declaration; we just need to ensure it is applied wherever PyJWT is installed.
The fix
Mirror the same PyJWT-patches and PyJWT-patch-options directives onto [eggs/scripts] so the patch is applied during the install. The directives reference [caucase-eggs] so we keep a single source of truth.
[eggs/scripts]
recipe = zc.recipe.egg
eggs =
${eggs:eggs}
supervisor
scripts =
pytest
slapos
supervisord
+# PyJWT is pulled here as a transitive dependency of caucase, ...
+PyJWT-patches = ${caucase-eggs:PyJWT-patches}
+PyJWT-patch-options = ${caucase-eggs:PyJWT-patch-options}
Impact
This unblocks SlapOS.Eggs.UnitTest-Master.Python3.CLN.* (slapos.cookbook, slapos.toolbox, slapos.core, ... unit tests) which has been failing in the SR-build step since ~2026-05-11 15:11 UTC for every branch tested on the CLN node (master itself, our cln/cookbook-cdninstancenode, rapid-cdn-instancenode, Luke's feature/rapid-cdn-request-pass-thru, ...).
erp5-mcp-hateoas-testsuite-v2 is unaffected because it uses a different SR / find-links path.
Notes
cc @kazuhiko (author of the original fixup) — could you check whether other unit-test or build SRs face the same incomplete-fix issue and might need an analogous patch wiring? cc @tomo for visibility
Test plan
-
CI: SlapOS.Eggs.UnitTest-Master.Python3.CLN for this branch should pass the SR-build step (currently fails in ~30s on PyJWT)