Skip to content

Say the licence once, so anything can be built at all - #9

Merged
MAXAWER merged 1 commit into
mainfrom
fix/license-classifier
Aug 26, 2026
Merged

MAXAWER merged 1 commit into
mainfrom
fix/license-classifier

Conversation

@MAXAWER

@MAXAWER MAXAWER commented Aug 26, 2026

Copy link
Copy Markdown
Owner

Every CI job on main is failing, and every release job would fail the same
way
, on a repository nobody had changed. This is a two-line fix and it blocks
the v1.1.0 release.

What happened

setuptools 77 implemented PEP 639: a
project may state its licence as an SPDX expression or as a trove
classifier, and stating it both ways is now an error rather than a redundancy.
pyproject.toml did both:

license = "AGPL-3.0-only"
classifiers = [ ..., "License :: OSI Approved :: GNU Affero General Public License v3", ... ]
setuptools.errors.InvalidConfigError: License classifiers have been superseded
by license expressions (see https://peps.python.org/pep-0639/). Please remove:

Nothing in the repository changed to cause it — the runners' setuptools did. The
failure is in pip install -e, so it takes out every test job on every platform
and both packaging jobs with it.

The fix

The classifier goes and the expression stays, that being the one which is not
deprecated.

The build-system floor moves from setuptools>=68 to >=77 at the same time,
for the other half of the same problem: below 77 that same license line is
read as the legacy licence field, which wants a table rather than a string,
and the build fails from the other direction. Pinning the floor makes which of
the two happens a decision rather than a property of whichever setuptools a
runner happened to cache.

Checked

  • pip install -e . succeeds locally against setuptools 80.
  • 166 tests pass.
  • The v1.1.0 tag has been withdrawn and its release run cancelled, since it
    would only have produced a red build. Once this merges the tag goes back on
    and the release builds for real.

🤖 Generated with Claude Code

Every CI job on main is failing, and so would every release job, on a repository
nobody had changed. setuptools 77 implemented PEP 639: a project may state its
licence as an SPDX expression or as a classifier, and stating it both ways is now
an error rather than a redundancy. pyproject.toml did both.

The classifier goes; the expression stays, because it is the one that is not
deprecated.

The build-system floor moves from setuptools 68 to 77 at the same time, for the
other half of the same problem: below 77 that same line is read as the legacy
licence field, which wants a table and not a string, and the build fails from
the other direction. Pinning the floor makes which of the two happens a
decision rather than a property of whichever setuptools a runner happened to
cache.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@MAXAWER
MAXAWER merged commit 67ebc1c into main Aug 26, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant