CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/pypi-pep257

Python docstring style checker for PEP 257 compliance

72

1.04x
Overview
Eval results
Files

configuration.mddocs/

Configuration System

The configuration system provides comprehensive parsing of command-line arguments and configuration files with hierarchical inheritance. It manages error code selection, file matching patterns, runtime options, and supports multiple configuration file formats.

Capabilities

Configuration Parser

The main configuration parsing class that handles CLI arguments and configuration files with inheritance support.

class ConfigurationParser:
    """
    Responsible for parsing configuration from files and CLI.
    
    Supports two types of configurations:
    - Run configurations: UI-related options (verbosity, debug, etc.)
    - Check configurations: File and error checking options
    """
    
    # Configuration file options
    CONFIG_FILE_OPTIONS = ('convention', 'select', 'ignore', 'add-select',
                          'add-ignore', 'match', 'match-dir')
    
    # Base error selection options (mutually exclusive) 
    BASE_ERROR_SELECTION_OPTIONS = ('ignore', 'select', 'convention')
    
    # Default patterns
    DEFAULT_MATCH_RE = '(?!test_).*\.py'     # Files to check
    DEFAULT_MATCH_DIR_RE = '[^\.].*'         # Directories to search
    DEFAULT_CONVENTION = conventions.pep257   # Default error codes
    
    # Supported config files
    PROJECT_CONFIG_FILES = ('setup.cfg', 'tox.ini', '.pep257')
    
    def __init__(self):
        """Create a configuration parser."""
    
    def parse(self):
        """
        Parse the configuration from CLI and config files.
        
        If one of BASE_ERROR_SELECTION_OPTIONS was selected, overrides all
        error codes and disregards config file error code settings.
        
        Raises:
        IllegalConfiguration: If configuration is invalid
        """
    
    def get_default_run_configuration(self):
        """
        Return a RunConfiguration object set with default values.
        
        Returns:
        RunConfiguration: Default runtime configuration
        """
    
    def get_user_run_configuration(self):
        """
        Return the user's run configuration.
        
        Returns:
        RunConfiguration: User runtime configuration
        """
    
    def get_files_to_check(self):
        """
        Generate files and error codes to check on each one.
        
        Walk directory trees under arguments and yield filenames that match
        under each directory that matches match_dir pattern. Locates 
        configuration for each file and yields (filename, [error_codes]).
        
        Returns:
        generator: tuples of (filename, list of error codes)
        
        Raises:
        IllegalConfiguration: If invalid configuration file found
        """

Usage examples:

from pep257 import ConfigurationParser, IllegalConfiguration

# Basic configuration parsing
conf = ConfigurationParser()
try:
    conf.parse()
    run_config = conf.get_user_run_configuration()
    
    # Process files with their specific error codes
    for filename, error_codes in conf.get_files_to_check():
        print(f"Checking {filename} for codes: {error_codes}")
        
except IllegalConfiguration as e:
    print(f"Configuration error: {e}")

Configuration Objects

Named tuples that represent different types of configuration settings.

RunConfiguration = namedtuple('RunConfiguration',
                            ('explain', 'source', 'debug', 'verbose', 'count'))
"""
Configuration for runtime behavior.

Fields:
- explain: bool, show explanation of each error
- source: bool, show source for each error  
- debug: bool, print debug information
- verbose: bool, print status information
- count: bool, print total number of errors
"""

CheckConfiguration = namedtuple('CheckConfiguration', 
                               ('checked_codes', 'match', 'match_dir'))
"""
Configuration for error checking.

Fields:
- checked_codes: set, error codes to check for
- match: str, regex pattern for filenames to check
- match_dir: str, regex pattern for directories to search
"""

Configuration File Support

The system supports multiple configuration file formats with hierarchical inheritance:

# setup.cfg example
[pep257]
ignore = D203,D213
match = .*\.py
match-dir = [^\.].*
explain = true

# tox.ini example  
[pep257]
select = D100,D101,D102
add-ignore = D105
convention = pep257

# .pep257 example
[pep257]
inherit = false
ignore = D200,D201,D202

Configuration inheritance algorithm:

  1. Check current directory for config file
  2. If not found, inherit from parent directory
  3. If found, optionally merge with parent (inherit = true)
  4. CLI options always override config file settings

Configuration Validation

class IllegalConfiguration(Exception):
    """An exception for illegal configurations."""
    pass

def check_initialized(method):
    """
    Decorator to check that configuration object was initialized.
    
    Parameters:
    - method: function, method to wrap
    
    Returns:
    function: Wrapped method that checks initialization
    """

Internal Configuration Methods

class ConfigurationParser:
    """Additional internal methods for configuration processing."""
    
    def _get_config(self, node):
        """
        Get and cache the run configuration for node.
        
        Parameters:
        - node: str, file or directory path
        
        Returns:
        CheckConfiguration: Configuration for the node
        """
    
    def _read_configuration_file(self, path):
        """
        Try to read and parse path as a pep257 configuration file.
        
        Parameters:
        - path: str, configuration file path
        
        Returns:
        tuple: (options, should_inherit)
        
        Raises:
        IllegalConfiguration: If configuration is invalid
        """
    
    def _merge_configuration(self, parent_config, child_options):
        """
        Merge parent config into child options.
        
        Parameters:
        - parent_config: CheckConfiguration, parent configuration
        - child_options: options object, child configuration
        
        Returns:
        CheckConfiguration: Merged configuration
        """
    
    def _validate_options(self, options):
        """
        Validate mutually exclusive options.
        
        Parameters:
        - options: options object to validate
        
        Returns:
        bool: True if options are valid
        """
    
    def _has_exclusive_option(self, options):
        """
        Return True if one or more exclusive options were selected.
        
        Parameters:
        - options: options object to check
        
        Returns:
        bool: True if exclusive options present
        """
    
    def _get_exclusive_error_codes(self, options):
        """
        Extract error codes from selected exclusive option.
        
        Parameters:
        - options: options object
        
        Returns:
        set: Error codes to check
        """
    
    def _set_add_options(self, checked_codes, options):
        """
        Set checked_codes by add_ignore or add_select options.
        
        Parameters:
        - checked_codes: set, error codes to modify in place
        - options: options object with add selections
        """
    
    def _create_run_config(self, options):
        """
        Create a RunConfiguration object from options.
        
        Parameters:
        - options: options object
        
        Returns:
        RunConfiguration: Runtime configuration
        """
    
    def _create_check_config(self, options, use_defaults=True):
        """
        Create a CheckConfiguration object from options.
        
        Parameters:
        - options: options object
        - use_defaults: bool, whether to use default values
        
        Returns:
        CheckConfiguration: Check configuration
        """

Option Parser Creation

class ConfigurationParser:
    """Command-line option parser creation."""
    
    def _create_option_parser(self):
        """
        Return an option parser to parse command line arguments.
        
        Returns:
        OptionParser: Configured option parser
        """

The option parser supports these command-line options:

Run Configuration Options:

  • -e, --explain: Show explanation of each error
  • -s, --source: Show source for each error
  • -d, --debug: Print debug information
  • -v, --verbose: Print status information
  • --count: Print total number of errors

Error Check Options:

  • --select <codes>: Choose error codes to check for
  • --ignore <codes>: Choose error codes to ignore
  • --convention <name>: Choose error convention (pep257)
  • --add-select <codes>: Add more error codes to check
  • --add-ignore <codes>: Add more error codes to ignore

Match Options:

  • --match <pattern>: Check only files matching pattern
  • --match-dir <pattern>: Search only directories matching pattern

Utility Dictionary

class AttrDict(dict):
    """Dictionary subclass with attribute access."""
    
    def __getattr__(self, item):
        """
        Get dictionary item as attribute.
        
        Parameters:
        - item: str, key name
        
        Returns:
        Any: Dictionary value
        """

Available Conventions

conventions = AttrDict({
    'pep257': set  # Set of all error codes except D203
})

The pep257 convention includes all available error codes except D203, which conflicts with D211 in the whitespace rules.

Install with Tessl CLI

npx tessl i tessl/pypi-pep257

docs

configuration.md

error-checking.md

index.md

parsing.md

tile.json