Improving licence metadata

Table of Contents
What? #
PEP 639 defines a spec on how to document licences used in Python projects.
Instead of using a Trove classifier such as “License :: OSI Approved :: BSD License”, which is imprecise (for example, which BSD licence?), the SPDX licence expression syntax is used.
How? #
pypproject.toml
#
Change pyproject.toml
as follows.
I usually use Hatchling as a build backend, and support was added in 1.27:
[build-system]
build-backend = "hatchling.build"
requires = [
"hatch-vcs",
- "hatchling",
+ "hatchling>=1.27",
]
Replace the freeform license
field with a valid SPDX license expression, and add
license-files
which points to the licence files in the repo. There’s often only one,
but if you have more than one, list them all:
[project]
...
-license = { text = "MIT" }
+license = "MIT"
+license-files = [ "LICENSE" ]
Optionally delete the deprecated licence classifier:
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
For example, see humanize#236 and prettytable#350.
Upload #
Then make sure to use a PyPI uploader that supports this.
I recommend using Trusted Publishing which I use with pypa/gh-action-pypi-publish to deploy from GitHub Actions. I didn’t need to make any changes here, just make a release as usual.
Result #
PyPI #
PyPI shows the new metadata:
pip #
pip can also show you the metadata:
❯ pip install prettytable==3.13.0
❯ pip show prettytable
Name: prettytable
Version: 3.13.0
...
License-Expression: BSD-3-Clause
Location: /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages
Requires: wcwidth
Required-by: norwegianblue, pypistats
Thank you! #
A lot of work went into this. Thank you to PEP authors Philippe Ombredanne for creating the first draft in 2019, to C.A.M. Gerlach for the second draft in 2021, and especially to Karolina Surma for getting the third draft finish line and helping with the implementation.
And many projects were updated to support this, thanks to the maintainers and contributors of at least:
- PyPI/Warehouse
- packaging 24.2
- Hatchling 1.27
- Twine 6.1.0
- PyPI publish GitHub Action v1.12.4
- build-and-inspect-python-package v2.12.0
- pip 25.0
Header photo: Amelia Earhart’s 1932 pilot licence in the San Diego Air and Space Museum Archive, with no known copyright restrictions.