Formats docstrings to follow PEP 257 conventions with support for various docstring styles and Black formatter compatibility
—
Configuration handling for command-line arguments and configuration files, supporting multiple configuration sources including pyproject.toml, setup.cfg, and tox.ini files.
The main configuration management class that handles command-line argument parsing and configuration file reading.
class Configurater:
"""Read and store all docformatter configuration information."""
# Class attributes
parser: argparse.ArgumentParser # Argument parser instance
flargs_dct: Dict[str, Union[bool, float, int, str]] # Configuration file arguments
configuration_file_lst: List[str] # Supported configuration files
args: argparse.Namespace # Parsed arguments
def __init__(self, args: List[Union[bool, int, str]]) -> None:
"""
Initialize configuration manager.
Args:
args: List of command-line arguments to parse
"""
def do_parse_arguments(self) -> None:
"""
Parse command-line arguments and read configuration files.
Combines arguments from command-line and configuration files,
with command-line arguments taking precedence.
"""# Supported configuration files (in order of precedence)
configuration_file_lst = [
"pyproject.toml", # Primary configuration file (TOML format)
"setup.cfg", # Legacy setuptools configuration
"tox.ini", # Tox configuration file
]def _do_read_configuration_file(self) -> None:
"""
Read configuration from supported configuration files.
Searches for configuration files in current directory and reads
docformatter section from the first found file.
"""
def _do_read_toml_configuration(self) -> None:
"""
Read TOML configuration from pyproject.toml.
Uses tomllib (Python >=3.11) or tomli (Python <3.11) to parse
[tool.docformatter] section.
"""
def _do_read_parser_configuration(self) -> None:
"""
Read parser-style configuration from setup.cfg or tox.ini.
Parses [docformatter] section using ConfigParser.
"""# File input/output control
--in-place, -i # Modify files in place instead of printing diffs
--check, -c # Only check formatting, don't modify files
--diff, -d # Show diffs when used with --check or --in-place
--recursive, -r # Process directories recursively
--exclude PATTERNS # Exclude files/directories by name patterns
files # Files to format or '-' for standard input# Docstring formatting control
--black # Black formatter compatibility mode
--wrap-summaries LENGTH # Wrap summary lines at LENGTH (default: 79, 88 with --black)
--wrap-descriptions LENGTH # Wrap description lines at LENGTH (default: 72, 88 with --black)
--force-wrap # Force wrapping even if messy
--tab-width WIDTH # Tab width for indentation (default: 1)
--make-summary-multi-line # Convert single-line to multi-line docstrings
--close-quotes-on-newline # Place closing quotes on new line when wrapping# Docstring content control
--blank # Add blank line after description
--pre-summary-newline # Add newline before summary in multi-line docstrings
--pre-summary-space # Add space after opening triple quotes
--non-cap WORDS # Words not to capitalize when first in summary
--style STYLE # Docstring style: 'sphinx' (default) or 'epytext'
--non-strict # Don't strictly follow reST syntax for lists# Processing range and filtering
--range START END # Process docstrings between line numbers
--docstring-length MIN MAX # Process docstrings within length range
--rest-section-adorns REGEX # Regex for reST section adornments
--config CONFIG # Path to configuration file--help, -h # Show help message
--version # Show version number[tool.docformatter]
black = true
wrap-summaries = 88
wrap-descriptions = 88
make-summary-multi-line = false
close-quotes-on-newline = false
force-wrap = false
tab-width = 4
blank = false
pre-summary-newline = false
pre-summary-space = false
non-strict = false
style = "sphinx"
non-cap = ["docformatter", "API"]
exclude = ["tests/", "build/"][docformatter]
black = True
wrap-summaries = 88
wrap-descriptions = 88
make-summary-multi-line = False
force-wrap = False
tab-width = 4
blank = False
pre-summary-newline = False
pre-summary-space = False
non-strict = False
style = sphinx
non-cap = docformatter,API
exclude = tests/,build/[docformatter]
black = True
wrap-summaries = 88
wrap-descriptions = 88
make-summary-multi-line = False
force-wrap = False
tab-width = 4
blank = False
pre-summary-newline = False
pre-summary-space = False
non-strict = False
style = sphinx
non-cap = docformatter,API
exclude = tests/,build/from docformatter import Configurater
# Simple file formatting
args = ['--in-place', 'example.py']
configurator = Configurater(args)
configurator.do_parse_arguments()
# Access parsed arguments
print(f"In-place mode: {configurator.args.in_place}")
print(f"Files to format: {configurator.args.files}")from docformatter import Configurater
# Complex configuration
args = [
'--black',
'--recursive',
'--wrap-summaries', '88',
'--wrap-descriptions', '88',
'--exclude', 'tests/', 'build/',
'--non-cap', 'API', 'JSON',
'--in-place',
'src/'
]
configurator = Configurater(args)
configurator.do_parse_arguments()
# Check configuration values
print(f"Black mode: {configurator.args.black}")
print(f"Summary wrap: {configurator.args.wrap_summaries}")
print(f"Excluded patterns: {configurator.args.exclude}")
print(f"Non-capitalized words: {configurator.args.non_cap}")import os
from docformatter import Configurater
# Change to directory with pyproject.toml
os.chdir('project_root')
# Configuration will be read from pyproject.toml
args = ['--in-place', 'src/']
configurator = Configurater(args)
configurator.do_parse_arguments()
# Configuration combines file settings with command-line args
# Command-line arguments override file settingsfrom docformatter import Configurater
# CI/CD check configuration
args = [
'--check',
'--diff',
'--recursive',
'.'
]
configurator = Configurater(args)
configurator.do_parse_arguments()
# Verify check mode settings
assert configurator.args.check is True
assert configurator.args.diff is True
assert configurator.args.in_place is FalseConfiguration values are resolved in the following order (highest to lowest precedence):
# If pyproject.toml contains:
# [tool.docformatter]
# wrap-summaries = 72
# black = false
# And command-line is:
args = ['--black', '--wrap-descriptions', '88', 'file.py']
# Final configuration will be:
# wrap-summaries = 72 (from config file)
# wrap-descriptions = 88 (from command-line)
# black = True (from command-line, overrides file)The Configurater handles various configuration errors:
from docformatter import Configurater
# Invalid wrap length
args = ['--wrap-summaries', '-1', 'file.py']
try:
configurator = Configurater(args)
configurator.do_parse_arguments()
except SystemExit:
print("Invalid wrap length detected")
# Missing required file argument
args = ['--in-place']
try:
configurator = Configurater(args)
configurator.do_parse_arguments()
except SystemExit:
print("Missing file argument")Install with Tessl CLI
npx tessl i tessl/pypi-docformatter