A command-line tool for managing SPDX headers in Python source files
Project description
SPDX Headers
spdx-headers is a command-line tool for auditing and maintaining SPDX license headers in Python projects. It can add, verify, and update SPDX headers, extract license texts, and integrates seamlessly with pre-commit.
Table of Contents
- Features
- Installation
- Quick Start
- Core Commands
- Using As a Pre-Commit Hook
- Documentation
- Contributing
- License
Features
- Automated SPDX management – add, change, remove, or verify headers across your Python sources.
- Auto-fix missing headers – infer the repository’s SPDX identifier and repair files automatically.
- SPDX license data updates – fetches the latest license list directly from SPDX.
- Pre-commit integration – ships with a hook that can block commits or auto-fix issues.
- License extraction – generate LICENSE files by SPDX identifier.
- Dry-run support – inspect changes before applying them.
- Typed codebase – includes
py.typedfor first-class type checking. - Flexible license viewing – preview SPDX license summaries and optionally keep the generated files for reference.
- Configurable exclusions – opt specific files out of header checks via a
.spdx-headers.inifile.
Installation
pip install spdx-headers
Working from Source (with uv)
The development workflow relies on uv for dependency management. Install it first:
curl -LsSf https://astral.sh/uv/install.sh | sh
# or: pipx install uv
Then clone the repository and install dependencies:
git clone https://github.com/uglyegg/spdx-tools.git
cd spdx-tools
uv sync --dev
uv run pre-commit install
Quick Start
# Add AGPL-3.0-or-later headers to all Python files
spdx-headers --add AGPL-3.0-or-later
# Verify all files have valid SPDX headers
spdx-headers --verify
# Check (CI friendly) and auto-fix missing headers when possible
spdx-headers --check --fix
# List SPDX identifiers containing “Apache”
spdx-headers --list Apache
# Extract the MIT license into LICENSE-MIT
spdx-headers --extract --add MIT --dry-run
Core Commands
| Command | Description |
|---|---|
spdx-headers --add LICENSE |
Add the specified SPDX header to all Python files. |
spdx-headers --change LICENSE |
Replace existing headers with the specified SPDX identifier. |
spdx-headers --remove |
Remove SPDX headers from all Python files. |
spdx-headers --verify |
Print a report of files missing headers (no exit code). |
spdx-headers --check [--fix] |
Return exit code 0/1 depending on compliance; --fix attempts auto-repair and the command reports detected SPDX identifiers (listing files if multiple licenses are found). |
spdx-headers --list [KEYWORD] |
List available SPDX identifiers, optionally filtering by keyword. |
spdx-headers --show LICENSE [--keep-temp] |
Display a license summary using the system’s default viewer (optionally keep the temp file). |
spdx-headers --extract [KEYWORD] [--add LICENSE] |
Extract license text for identifiers matching KEYWORD; combine with --add/--change to write headers and license text together. |
spdx-headers --update |
Download the latest SPDX license data. |
.spdx-headers.ini |
Optional configuration file used to exclude generated/vendor files from checks. |
See docs/usage.md for a comprehensive walkthrough.
Using As a Pre-Commit Hook
spdx-headers ships with a pre-commit hook that checks for (and can auto-fix) missing headers. Add the following to your .pre-commit-config.yaml:
- repo: https://github.com/uglyegg/spdx-tools
rev: v1.0.0
hooks:
- id: spdx-header-check
The bundled configuration automatically runs spdx-headers --check --fix, so files missing a header are rewritten when the repository has a consistent SPDX identifier. See docs/pre-commit.md for advanced configuration.
Documentation
docs/usage.md– extended CLI usage guide, tips, and examples.docs/pre-commit.md– integrating the tool withpre-commit.docs/configuration.md– managing.spdx-headers.iniexclusions.docs/github-actions.md– integrating the tool with GitHub Workflows.docs/dev-workflow– workflow when working on development for this application.
Contributing
Contributions are welcome! Please open an issue or pull request. When submitting changes:
- Run
make checkto execute formatting, lint, mypy, and test suites. - Update or add documentation in
docs/if behaviour changes. - Add tests covering new functionality.
License
This project is licensed under the GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later). See the LICENSE file for details. Additional license texts can be generated via spdx-headers --extract.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file spdx_headers-1.0.3.tar.gz.
File metadata
- Download URL: spdx_headers-1.0.3.tar.gz
- Upload date:
- Size: 89.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bf78cd45e37c27ddf4349fe09c555e52219be03e3a741684840232b6eb5b4f87
|
|
| MD5 |
beae7a1be573d2264da74cabdbb176bd
|
|
| BLAKE2b-256 |
0f74924cf896ea6a6596fd9c4520b5559d14b20ae4955f1d71b7ac1e1ea617eb
|
File details
Details for the file spdx_headers-1.0.3-py3-none-any.whl.
File metadata
- Download URL: spdx_headers-1.0.3-py3-none-any.whl
- Upload date:
- Size: 60.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b72478847e02d2d2ab7ce6ed58569d7ff8d919e7d1dcc21b9b9f8a27cf33f45c
|
|
| MD5 |
d96e4424c2898c93a66bfcb61c37802f
|
|
| BLAKE2b-256 |
bc53ee5a47f78c295c3b48b6bdfa21da71eaac1404c9b422b3e5b8f0b164ee03
|