CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/pypi-darker

Apply Black formatting only in regions changed since last commit

Pending
Overview
Eval results
Files

configuration.mddocs/

Configuration Management

Configuration classes, validation functions, and output mode management for controlling darker's behavior through config files and command-line options.

Capabilities

Configuration Classes

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)

Output Mode Management

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
    """

Configuration Validation

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.
"""

Target Version Configuration

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)

Usage Examples

Creating Configuration

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/**/*'}
)

Output Mode Validation

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")

Target Version Usage

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

Configuration File Examples

pyproject.toml Configuration

[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 = 3

Programmatic Configuration Loading

from 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.NOTHING

Handling Deprecated Options

from 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

docs

chooser.md

command-line.md

configuration.md

diff-utilities.md

file-utilities.md

formatters.md

git-integration.md

index.md

main-functions.md

preprocessors.md

verification.md

tile.json