Comprehensive docstring quality vetting for Python projects
Project description
docvet
ruff checks how your docstrings look. interrogate checks if they exist. docvet checks if they're right.
Existing tools cover presence and style. docvet delivers the layers they miss:
| Layer | Check | ruff | interrogate | pydoclint | docvet |
|---|---|---|---|---|---|
| 1. Presence | "Does a docstring exist?" | -- | Yes | -- | -- |
| 2. Style | "Is it formatted correctly?" | Yes | -- | -- | -- |
| 3. Completeness | "Does it have all required sections?" | -- | -- | Partial | Yes |
| 4. Accuracy | "Does it match the current code?" | -- | -- | -- | Yes |
| 5. Rendering | "Will mkdocs render it correctly?" | -- | -- | -- | Yes |
| 6. Visibility | "Will mkdocs even see the file?" | -- | -- | -- | Yes |
pydoclint checks Args/Returns/Raises alignment with function signatures (structural completeness). docvet's enrichment covers that plus Yields, Receives, Warns, Attributes, Examples, typed attributes, and cross-references -- 19 rules across 4 checks. docvet also covers freshness (git diff/blame), griffe rendering compatibility, and mkdocs coverage -- territory no other tool touches.
Quickstart | GitHub Action | Pre-commit | Configuration | Docs
What It Checks
Enrichment (completeness) -- 10 rules:
missing-raises missing-yields missing-receives missing-warns missing-other-parameters missing-attributes missing-typed-attributes missing-examples missing-cross-references prefer-fenced-code-blocks
Freshness (accuracy) -- 5 rules:
stale-signature stale-body stale-import stale-drift stale-age
Griffe (rendering) -- 3 rules:
griffe-unknown-param griffe-missing-type griffe-format-warning
Coverage (visibility) -- 1 rule:
missing-init
Quickstart
pip install docvet && docvet check --all
For optional griffe rendering checks:
pip install docvet[griffe]
Example output:
src/mypackage/utils.py:42: missing-raises Function 'parse_config' raises ValueError but has no Raises section
src/mypackage/models.py:15: stale-signature Function 'process' signature changed but docstring not updated
src/mypackage/api.py:1: missing-init Package directory missing __init__.py (invisible to mkdocs)
Configuration
Configure via [tool.docvet] in your pyproject.toml. All checks run and print findings. Checks listed in fail-on cause a non-zero exit code; unlisted checks are treated as warnings.
[tool.docvet]
exclude = ["tests", "scripts"]
fail-on = ["griffe", "coverage"]
[tool.docvet.freshness]
drift-threshold = 30
age-threshold = 90
Pre-commit
Add to your .pre-commit-config.yaml:
repos:
- repo: https://github.com/Alberto-Codes/docvet
rev: v1.0.0
hooks:
- id: docvet
For griffe rendering checks, add the optional dependency:
repos:
- repo: https://github.com/Alberto-Codes/docvet
rev: v1.0.0
hooks:
- id: docvet
additional_dependencies: [griffe]
GitHub Action
Add docvet to your GitHub Actions workflow:
- uses: Alberto-Codes/docvet@v1
With version pinning and custom arguments:
- uses: Alberto-Codes/docvet@v1
with:
version: '1.0.0'
args: 'check --all'
For griffe rendering checks, install griffe before running docvet:
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- run: pip install griffe
- uses: Alberto-Codes/docvet@v1
with:
args: 'check --all'
Better Docstrings, Better AI
AI coding agents rely on docstrings as context when generating and modifying code. Research shows stale or incorrect documentation is actively harmful -- worse than no docs at all:
- Incorrect docs degrade LLM task success by 22.6 percentage points
- Comment density improves code generation by 40-54%
- Misleading comments reduce LLM fault localization accuracy to 24.55%
- Performance drops substantially without docstrings
As the 2025 DORA report puts it: "AI doesn't fix a team; it amplifies what's already there." The only signal correlating with AI productivity is code quality.
docvet's freshness checking catches the accuracy gap that stale docs create, and its enrichment rules ensure the docstring sections that agents use as context are complete. Run docvet check in your CI, pre-commit hooks, or agent toolchain.
Badge
Add a badge to your project to show your docs are vetted:
[](https://github.com/Alberto-Codes/docvet)
Used By
Are you using docvet? Open a pull request to add your project here.
License
MIT -- see LICENSE for details.
Project details
Release history Release notifications | RSS feed
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 docvet-1.1.2.tar.gz.
File metadata
- Download URL: docvet-1.1.2.tar.gz
- Upload date:
- Size: 36.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.5 {"installer":{"name":"uv","version":"0.10.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a64f853f20ee099222b380433b42a51a0895049fcc9458bcb07556d978e439a2
|
|
| MD5 |
ed61decbb85f06ca6dbc78b1ebb8dbfa
|
|
| BLAKE2b-256 |
90dc6de0aef2d2fda3dfaa2b7fbd2897f8766af0f9d52b410ac2ffdba95b1c92
|
File details
Details for the file docvet-1.1.2-py3-none-any.whl.
File metadata
- Download URL: docvet-1.1.2-py3-none-any.whl
- Upload date:
- Size: 42.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.5 {"installer":{"name":"uv","version":"0.10.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bf1b7acb9e44089862dec9ebb63ca338a5ed6e6626fd04b7edae5c93e0323b8e
|
|
| MD5 |
7eb767758fc0e1779d0e0dcdc3abfe87
|
|
| BLAKE2b-256 |
c4fe650f0305dc82ccf4e93f44fb785770274c9f593c460345c4c74a77ff86eb
|