0002. Dual licence, Apache-2.0 OR MIT, declared with PEP 639#
Status: Accepted
Date: 2026-08-20 (release 0.0.60, PR #202)
Deciders: maintainer
Context#
The licence files, the website and the README all said “Apache-2.0 OR
MIT”, but PyPI published Apache-2.0, pyproject.toml declared a
single licence, 167 source headers said Apache alone and 27 files had
no header at all. Poetry maps a compound license = "..." string to
License :: Other/Proprietary License, which is actively misleading on
an open-source project.
Options considered#
Collapse to a single licence. Simplest metadata, but it would take away the MIT option that downstream Rust and Python ecosystems in the same family rely on.
Keep the dual grant and declare it correctly everywhere, using PEP 639’s
licenseexpression andlicense-filesso the wheel carriesLicense-Expression: Apache-2.0 OR MITand all three licence files.
Decision#
Option 2. Every Python file opens with the SPDX header
Apache-2.0 OR MIT; Markdown files carry it as a comment on line 1;
the wheel metadata comes from the PEP 639 fields in [project] while
Poetry stays authoritative for everything else through dynamic.
Consequences#
The corrected metadata only reaches PyPI on release, so 0.0.59 and earlier still advertise Apache-2.0 alone.
Contributions are dual-licensed by default (CONTRIBUTING.md and the DCO trailer make the assertion explicit).
A REUSE-style header check is part of the family standard; the conformance test verifies the licence files exist, and the SPDX header is required on every new file.