A powerful Python CLI tool that validates docstring formatting and completeness using AST parsing. Ensure consistent, high-quality documentation across your entire codebase with configurable validation rules and rich terminal output.
Key Features:
- π AST-based parsing - Robust code analysis without regex fragility
- βοΈ Configurable validation - Four section types with TOML-based configuration
- π Flexible section ordering - Support for unordered "floating" sections
- π Hierarchical config discovery - Automatic
pyproject.tomldetection - π¨ Rich terminal output - Beautiful colored output and error tables
- π Dual CLI entry points - Use
docstring-format-checkerordfc - π‘οΈ 100% test coverage - Thoroughly tested and reliable
# Install
uv add docstring-format-checker
# Check a single file
dfc --check my_module.py
# Check entire directory
dfc --check src/
# Generate example configuration
dfc --example=configFor reference, these URLs are used:
| Type | Source | URL |
|---|---|---|
| Git Repo | GitHub | https://github.com/data-science-extensions/docstring-format-checker |
| Python Package | PyPI | https://pypi.org/project/docstring-format-checker |
| Package Docs | Pages | https://data-science-extensions.com/toolboxes/docstring-format-checker |
Configure validation for four types of docstring sections:
| Type | Description | Example Use |
|---|---|---|
free_text |
Admonition-style sections | Summary, details, examples |
list_name |
Simple name lists | Simple parameter lists |
list_type |
Type-only lists | Raises, yields sections |
list_name_and_type |
Name and type lists | Parameters, returns with types |
Create a pyproject.toml with your validation rules. The order attribute is optional; sections without an order (like "deprecation warning") can appear anywhere in the docstring.
You can utilise a layout in separate blocks like this:
[tool.dfc]
[[tool.dfc.sections]]
order = 1
name = "summary"
type = "free_text"
admonition = "note"
prefix = "!!!"
required = true
[[tool.dfc.sections]]
order = 2
name = "params"
type = "list_name_and_type"
required = true
# Unordered section - can appear anywhere
[[tool.dfc.sections]]
name = "deprecation warning"
type = "free_text"
admonition = "deprecation"
prefix = "!!!"
required = false
[[tool.dfc.sections]]
order = 3
name = "returns"
type = "list_name_and_type"
required = falseOr like this in a single block:
[tool.dfc]
# or [tool.docstring-format-checker]
allow_undefined_sections = false
require_docstrings = true
check_private = true
validate_param_types = true
optional_style = "validate" # "silent", "validate", or "strict"
sections = [
{ order = 1, name = "summary", type = "free_text", required = true, admonition = "note", prefix = "!!!" },
{ order = 2, name = "details", type = "free_text", required = false, admonition = "abstract", prefix = "???+" },
{ order = 3, name = "params", type = "list_name_and_type", required = false },
{ order = 4, name = "raises", type = "list_type", required = false },
{ order = 5, name = "returns", type = "list_name_and_type", required = false },
{ order = 6, name = "yields", type = "list_type", required = false },
{ order = 7, name = "examples", type = "free_text", required = false, admonition = "example", prefix = "???+" },
{ order = 8, name = "notes", type = "free_text", required = false, admonition = "note", prefix = "???" },
]You can install and use this package multiple ways by using any of your preferred methods: pip, pipenv, poetry, or uv.
Using pip:
-
In your terminal, run:
python3 -m pip install --upgrade pip python3 -m pip install docstring-format-checker
-
Or, in your
requirements.txtfile, add:docstring-format-checker
Then run:
python3 -m pip install --upgrade pip python3 -m pip install --requirement=requirements.txt
Using pipenv:
-
Install using environment variables:
In your
Pipfilefile, add:[[source]] url = "https://pypi.org/simple" verify_ssl = false name = "pypi" [packages] docstring-format-checker = "*"
Then run:
python3 -m pip install pipenv python3 -m pipenv install --verbose --skip-lock --categories=root index=pypi docstring-format-checker
-
Or, in your
requirements.txtfile, add:docstring-format-checker
Then run:
python3 -m pipenv install --verbose --skip-lock --requirements=requirements.txt
-
Or just run this:
python3 -m pipenv install --verbose --skip-lock docstring-format-checker
Using poetry:
-
In your
pyproject.tomlfile, add:[project] dependencies = [ "docstring-format-checker==1.*", ]
Then run:
poetry sync poetry install
-
Or just run this:
poetry add "docstring-format-checker==1.*" poetry sync poetry install
Using uv:
-
In your
pyproject.tomlfile, add:[project] dependencies = [ "docstring-format-checker==1.*", ]
Then run:
uv sync
-
Or run this:
uv add "docstring-format-checker==1.*" uv sync -
Or just run this:
uv pip install "docstring-format-checker==1.*"
# Check a single Python file
dfc --check src/my_module.py
# Check multiple Python files
dfc file1.py file2.py
# Check entire directory recursively
dfc --check src/
# Check with table output format
dfc --output=table src/
# Generate example configuration file
dfc --example=config > pyproject.toml# Use custom config file location
dfc --config=custom_config.toml src/
# Exclude specific files using glob patterns
dfc src/ --exclude "**/test_*.py"
# Stop on first failure (CI environments)
dfc --check src/
# Suppress non-error output
dfc --quiet src/# .github/workflows/docs.yml
name: Documentation Quality
on: [push, pull_request]
jobs:
docstring-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v3
- run: uv pip install docstring-format-checker
- run: dfc --check src/# .pre-commit-config.yaml
repos:
- repo: https://github.com/data-science-extensions/docstring-format-checker
rev: "v1.11.3"
hooks:
- id: docstring-format-checker
name: Docstring Format Checker
entry: dfc --checkThe option output=list is the default:
dfc --check src/models/user.pyOr you can declare it explicitly:
dfc --check --output=list src/models/user.pyWhich returns:
src/models/user.py
Line 12 - function 'create_user':
- Missing required section: 'params'
Line 45 - function 'delete_user':
- Missing required section: 'returns'
Found 2 error(s) in 2 functions over 1 file
dfc --check --output=table src/models/user.pyββββββββββββββββββββββ³βββββββ³ββββββββββββββ³βββββββββββ³βββββββββββββββββββββββββββββββββββ
β File β Line β Item β Type β Error β
β‘ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ©
β src/models/user.py β 12 β create_user β function β - Missing required section: β
β β β β β 'params'. β
β β 45 β delete_user β function β - Missing required section: β
β β β β β 'returns'. β
ββββββββββββββββββββββ΄βββββββ΄ββββββββββββββ΄βββββββββββ΄βββββββββββββββββββββββββββββββββββ
Found 2 error(s) in 2 functions over 1 file
The tool follows a clean, modular architecture:
core.py-DocstringChecker()class with AST parsing and validation logicconfig.py- Configuration loading andSectionConfig()managementcli.py- Typer-based CLI with dual entry pointsutils/exceptions.py- Custom exception classes for structured error handling
Check the CONTRIBUTING.md file or Contributing page.
-
Clone the repository:
git clone https://github.com/data-science-extensions/docstring-format-checker.git cd docstring-format-checker -
Set up development environment:
uv sync --all-groups
-
Run tests:
uv run pytest --config-file=pyproject.toml --cov-report=term-missing
-
Run CLI locally:
uv run dfc --check examples/example_code.py
To ensure that the package works as expected, ensure that:
- Write code in accordance with PEP8 requirements.
- Write a UnitTest for each function or feature included.
- Maintain CodeCoverage at 100%.
- Ensure all UnitTests pass.
- Ensure MyPy passes 100%.
-
Run them all together:
uv run pytest --config-file=pyproject.toml
-
Or run them individually:
-
Tests with Coverage:
uv run pytest --config-file=pyproject.toml --cov-report=term-missing
-
Type Checking:
uv run mypy src/
-
Code Formatting:
uv run black --check src/
-
Linting:
uv run ruff check src/
-
This project is licensed under the MIT License - see the LICENSE file for details.