sp-repo-review provides checks based on the Scientific-Python Development
Guide at scientific-python/cookie for repo-review.
This tool can check the style of a repository. Use like this:
uvx sp-repo-review[cli] <path to repository>
This will produce a list of results - green checkmarks mean this rule is followed, red x’s mean the rule is not. A yellow warning sign means that the check was skipped because a previous required check failed. Some checks will fail, that’s okay - the goal is bring all possible issues to your attention, not to force compliance with arbitrary checks. Eventually there might be a way to mark checks as ignored.
For example, GH101 expects all your action files to have a nice name: field.
If you are happy with the file-based names you see in CI, you should feel free
to simply ignore this check (you can specify ignored checks in pyproject.toml or
by passing args to repo-review, see the repo-review
docs).
All checks are mentioned at least in some way in the Scientific-Python
Development Guide. You should read that first - if you are not attempting to
follow them, some of the checks might not work. For example, the guidelines
specify pytest configuration be placed in pyproject.toml. If you place it
somewhere else, then all the pytest checks will be skipped.
This was originally developed for Scikit-HEP before moving to Scientific Python.
Extras
cli: Dependencies to run the CLI (not needed for programmatic access, like on Web Assembly)pyproject: Include validate pyproject with schema store.all: All extras
Helper utility
There's also a script, accessible as sp-ruff-checks, that will compare your
ruff checks to the known values. It's a little more elegant on the command line
than the Ruff family description, which will only print out a basic list.
Other ways to use
You can also use GitHub Actions:
- uses: scientific-python/cookie@<version>
Or pre-commit:
- repo: https://github.com/scientific-python/cookie
rev: <version>
hooks:
- id: sp-repo-review
If you use additional_dependencies to add more plugins, like
validate-pyproject, you should also include "repo-review[cli]" to ensure the
CLI requirements are included.
List of checks
General
PY001: Has a pyproject.tomlPY002: Has a README.(md|rst) filePY003: Has a LICENSE* filePY004: Has docs folderPY005: Has tests folderPY006: Has pre-commit configPY007: Supports an easy task runner (nox, tox, pixi, etc.)PY008: Has a .gitignore file
PyProject
PP002: Has a proper build-system tablePP003: Does not list wheel as a build-depPP004: Does not upper cap Python requiresPP005: Using SPDX project.license should not use deprecated trove classifiersPP006: The dev dependency group should be definedPP301: Has pytest in pyprojectPP302: Sets a minimum pytest to at least 6 or 9PP303: Sets the test pathsPP304: Sets the log level in pytestPP305: Specifies strict xfailPP306: Specifies strict configPP307: Specifies strict markersPP308: Specifies useful pytest summaryPP309: Filter warnings specified
GitHub Actions
GH100: Has GitHub Actions configGH101: Has nice namesGH102: Auto-cancel on repeated PRsGH103: At least one workflow with manual dispatch triggerGH104: Use unique names for upload-artifactGH105: Use Trusted Publishing instead of token-based publishing on PyPIGH200: Maintained by DependabotGH210: Maintains the GitHub action versions with DependabotGH211: Do not pin core actions as major versionsGH212: Require GHA update grouping
MyPy
MY100: Uses a type checker (pyproject config)MY101: Type checker in strict modeMY102: MyPy show_error_codes deprecatedMY103: MyPy warn unreachableMY104: MyPy enables ignore-without-codeMY105: MyPy enables redundant-exprMY106: MyPy enables truthy-bool
Nox
Will not show up if no noxfile.py file is present.
NOX101: Sets minimum nox versionNOX102: Sets venv backendNOX103: Set default per session instead of session listNOX201: Set a script block with dependencies in your noxfileNOX202: Has a shebang lineNOX203: Provide a main block to run nox
Pre-commit
Will not show up if using lefthook instead of pre-commit/prek.
PC100: Has pre-commit-hooksPC110: Uses black or ruff-formatPC111: Formats code in docs (ruff-format or blacken-docs)PC140: Uses a type checkerPC160: Uses a spell checkerPC170: Uses PyGrep hooks (only needed if rST present)PC180: Uses a markdown formatterPC190: Uses a linter (Ruff/Flake8)PC191: Ruff show fixes if fixes enabledPC192: Ruff usesruff-checkinstead ofruff(legacy)PC901: Custom pre-commit CI update messagePC902: Custom pre-commit CI autofix messagePC903: Specified pre-commit CI schedule
ReadTheDocs
Will not show up if no .readthedocs.yml/.readthedocs.yaml file is present.
RTD100: Uses ReadTheDocs (pyproject config)RTD101: You have to set the RTD version number to 2RTD102: You have to set the RTD build imageRTD103: You have to set the RTD python versionRTD104: You have to specify a build configuration now for readthedocs.
Ruff
RF001: Has Ruff configRF002: Target version must be setRF003: src directory doesn't need to be specified anymore (0.6+)RF101: Bugbear must be selectedRF201: Avoid using deprecated config settingsRF202: Use (new) lint config section
Security
SEC001: Use zizmor to check the GitHub Actions
Setuptools Config
Will not show up if no setup.cfg file is present.
SCFG001: Avoid deprecated setup.cfg names
Release files for sp-repo-review 2026.8.14
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sp_repo_review-2026.8.14.tar.gz | 204.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sp_repo_review-2026.8.14-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 239.9 kB
Release files / sp_repo_review-2026.8.14.tar.gz
| Download URL | sp_repo_review-2026.8.14.tar.gz |
|---|---|
| Size | 204.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8548cf930141593c82fb869e0a80333da9651bd252efb5b0bd679c2ec409175b
|
|
BLAKE2b-256 checksum How to use checksums |
406a76076f60ff0798d0dbc614e42b9e1e8e19ef4d1781684813969b17a15889
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.
Transparency logRelease files / sp_repo_review-2026.8.14-py3-none-any.whl
| Download URL | sp_repo_review-2026.8.14-py3-none-any.whl |
|---|---|
| Size | 35.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c70f78794cf07cf5ab94480967854a1d5922760ba0f6ab2219d5c5f1ef659b9e
|
|
BLAKE2b-256 checksum How to use checksums |
9cdaf9dec1e36bacd504e1bcac373776d3ec0815fdfb8387fc9373182bc25a38
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.
Transparency log