Apply Black formatting only in regions changed since last commit
—
Configuration classes, validation functions, and output mode management for controlling darker's behavior through config files and command-line options.
Core configuration classes for managing darker settings.
class DarkerConfig(BaseConfig, total=False):
"""
TypedDict representing [tool.darker] configuration section.
All fields are optional and have sensible defaults.
"""
check: bool # Exit with error if changes needed
diff: bool # Show diff instead of writing files
flynt: bool # Apply flynt f-string conversion
isort: bool # Apply isort import sorting
line_length: int # Line length for formatting
lint: list[str] # List of linting commands
skip_magic_trailing_comma: bool # Don't use trailing commas
skip_string_normalization: bool # Don't normalize string quotes
target_version: str # Python version target
formatter: str # Formatter name (black, ruff, none)
class Exclusions:
"""
File exclusion patterns for pre-processing steps.
Attributes:
- formatter: Set of glob patterns to exclude from formatting
- isort: Set of glob patterns to exclude from import sorting
- flynt: Set of glob patterns to exclude from f-string conversion
"""
formatter: Set[str] = field(default_factory=set)
isort: Set[str] = field(default_factory=set)
flynt: Set[str] = field(default_factory=set)Classes and functions for managing different output modes.
class OutputMode:
"""Output mode constants for controlling how results are displayed."""
NOTHING = "NOTHING" # No output, just modify files
DIFF = "DIFF" # Show unified diff
CONTENT = "CONTENT" # Show reformatted content
def validate_config_output_mode(diff: bool, stdout: bool) -> OutputMode:
"""
Validate and determine output mode from diff/stdout flags.
Parameters:
- diff: Whether to show diff output
- stdout: Whether to output to stdout
Returns:
OutputMode enum value
Raises:
ConfigurationError: If both diff and stdout are enabled
"""Functions for validating configuration options and handling deprecated settings.
REMOVED_CONFIG_OPTIONS: Dict[str, str]
"""
Dictionary mapping removed configuration option names to helpful error messages.
"""
DEPRECATED_CONFIG_OPTIONS: Set[str]
"""
Set of configuration option names that are deprecated but still supported.
"""Enumeration for Python version targeting.
class TargetVersion(Enum):
"""
Python version numbers for formatter targeting.
Each enum member represents a Python version as a tuple of (major, minor).
"""
PY33 = (3, 3)
PY34 = (3, 4)
PY35 = (3, 5)
PY36 = (3, 6)
PY37 = (3, 7)
PY38 = (3, 8)
PY39 = (3, 9)
PY310 = (3, 10)
PY311 = (3, 11)
PY312 = (3, 12)
PY313 = (3, 13)from darker.config import DarkerConfig, OutputMode, Exclusions
from darker.configuration.target_version import TargetVersion
# Create configuration programmatically
config: DarkerConfig = {
'src': ['src/', 'tests/'],
'check': True,
'diff': True,
'isort': True,
'flynt': False,
'formatter': 'black',
'line_length': 88,
'target_version': 'py39',
}
# Create exclusions
exclusions = Exclusions(
formatter={'migrations/**/*'},
isort={'*/migrations/*'},
flynt={'legacy_code/**/*'}
)from darker.config import validate_config_output_mode, OutputMode
# Valid configurations
mode = validate_config_output_mode(diff=True, stdout=False)
assert mode == OutputMode.DIFF
mode = validate_config_output_mode(diff=False, stdout=True)
assert mode == OutputMode.CONTENT
mode = validate_config_output_mode(diff=False, stdout=False)
assert mode == OutputMode.NOTHING
# Invalid configuration - raises ConfigurationError
try:
validate_config_output_mode(diff=True, stdout=True)
except ConfigurationError as e:
print("Cannot use both --diff and --stdout")from darker.configuration.target_version import TargetVersion
# Using target versions
target = TargetVersion.PY39
print(f"Target Python version: {target.value}") # (3, 9)
# Convert from string
target_str = "py311"
for tv in TargetVersion:
if tv.name.lower() == target_str:
target = tv
break[tool.darker]
src = ["src", "tests", "scripts"]
revision = "origin/main..."
check = true
diff = true
isort = true
flynt = false
formatter = "black"
line_length = 88
target_version = "py39"
color = true
# Black-specific settings go in [tool.black]
[tool.black]
skip-string-normalization = true
target-version = ["py39", "py310", "py311"]
# isort settings go in [tool.isort]
[tool.isort]
profile = "black"
multi_line_output = 3from darker.command_line import parse_command_line
from darker.config import DarkerConfig
# Load configuration from files and command line
args = parse_command_line(["src/", "--diff"])
# Extract configuration
config: DarkerConfig = {
'src': args.src,
'revision': args.revision,
'diff': args.diff,
'check': args.check,
'isort': args.isort,
'flynt': args.flynt,
'formatter': getattr(args, 'formatter', 'black'),
'line_length': getattr(args, 'line_length', 88),
'target_version': getattr(args, 'target_version', 'py39'),
}
# Use configuration
if config.get('diff'):
output_mode = OutputMode.DIFF
elif config.get('stdout'):
output_mode = OutputMode.CONTENT
else:
output_mode = OutputMode.NOTHINGfrom darker.config import REMOVED_CONFIG_OPTIONS, DEPRECATED_CONFIG_OPTIONS
def validate_user_config(user_config):
"""Validate user configuration and show helpful messages."""
for option in user_config:
if option in REMOVED_CONFIG_OPTIONS:
error_msg = REMOVED_CONFIG_OPTIONS[option]
raise ConfigurationError(f"Option '{option}' has been removed. {error_msg}")
if option in DEPRECATED_CONFIG_OPTIONS:
print(f"Warning: Option '{option}' is deprecated and may be removed in a future version")Install with Tessl CLI
npx tessl i tessl/pypi-darker@3.0.1