Painless YAML configuration library for Python applications with validation, type checking, and multi-source data merging
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Core configuration system that manages multiple data sources, handles file reading, and provides platform-aware configuration directory discovery. The Configuration class serves as the main entry point for setting up and managing configuration data from various sources.
The main Configuration class that manages layered configuration data from multiple sources with automatic file discovery and platform-specific directory handling.
class Configuration:
def __init__(self, appname, modname=None, read=True, loader=yaml_util.Loader):
"""
Create a configuration object for an application.
Parameters:
- appname (str): Name of the application for config directory/file naming
- modname (str, optional): Module name for finding package defaults
- read (bool): Whether to automatically read config files on creation
- loader: YAML loader class for parsing configuration files
"""
def config_dir(self):
"""
Get the configuration directory path for this application.
Returns:
str: Platform-specific configuration directory path
"""
def user_config_path(self):
"""
Get the path to the user's configuration file.
Returns:
str: Path to user configuration file (config.yaml)
"""
def read(self, user=True, defaults=True):
"""
Read configuration from files.
Parameters:
- user (bool): Whether to read user configuration file
- defaults (bool): Whether to read package default configuration
"""
def set_file(self, filename, base_for_paths=False):
"""
Add a YAML configuration file as a source.
Parameters:
- filename (str): Path to YAML configuration file
- base_for_paths (bool): Use file's directory as base for relative paths
"""
def set_env(self, prefix=None, sep='__'):
"""
Add environment variables as a configuration source.
Parameters:
- prefix (str, optional): Environment variable prefix (defaults to appname)
- sep (str): Separator for nested keys in variable names
"""
def dump(self, full=True, redact=False):
"""
Generate YAML representation of current configuration.
Parameters:
- full (bool): Include all configuration sources
- redact (bool): Hide sensitive values
Returns:
str: YAML representation of configuration
"""
def reload(self):
"""
Reload configuration from all file sources.
"""Configuration class that defers file reading until first access, useful for applications that may not need configuration immediately.
class LazyConfig(Configuration):
def __init__(self, appname, modname=None):
"""
Create a lazy-loading configuration object.
Parameters:
- appname (str): Name of the application
- modname (str, optional): Module name for package defaults
"""Base view classes that manage configuration data sources and provide the foundation for configuration queries.
class RootView:
def __init__(self, sources):
"""
Create a root view managing configuration sources.
Parameters:
- sources: List of ConfigSource objects in priority order
"""
def add(self, obj):
"""
Add a configuration source as the lowest priority.
Parameters:
- obj: Configuration data (dict, ConfigSource, or convertible type)
"""
def set(self, value):
"""
Override configuration values with highest priority.
Parameters:
- value: Configuration data to overlay
"""
def clear(self):
"""
Remove all configuration sources.
"""import confuse
# Create configuration for "myapp"
config = confuse.Configuration('myapp')
# Configuration files will be looked for in:
# - ~/.config/myapp/config.yaml (Linux/Unix)
# - ~/Library/Application Support/myapp/config.yaml (macOS)
# - %APPDATA%\\myapp\\config.yaml (Windows)
print(f"Config directory: {config.config_dir()}")
print(f"User config file: {config.user_config_path()}")import confuse
# Create configuration without auto-reading
config = confuse.Configuration('myapp', read=False)
# Add specific configuration file
config.set_file('/etc/myapp/system.yaml')
# Add user configuration
config.read(user=True, defaults=False)
# Add environment variables with MYAPP_ prefix
config.set_env('MYAPP_')
# Add runtime overrides
config.set({'debug': True, 'log_level': 'DEBUG'})import confuse
# Configuration files won't be read until first access
lazy_config = confuse.LazyConfig('myapp')
# Files are read when first configuration value is accessed
debug_mode = lazy_config['debug'].get(bool)Confuse automatically searches for configuration files in platform-specific locations:
Linux/Unix:
$XDG_CONFIG_HOME/appname/config.yaml~/.config/appname/config.yaml/etc/xdg/appname/config.yaml/etc/appname/config.yamlmacOS:
~/.config/appname/config.yaml~/Library/Application Support/appname/config.yamlWindows:
~\\AppData\\Roaming\\appname\\config.yaml%APPDATA%\\appname\\config.yamlConfiguration sources are merged in priority order (highest to lowest):
config.set())config.set_args())config.set_env())~/.config/appname/config.yaml)/etc/appname/config.yaml)config_default.yaml in package)import confuse
config = confuse.Configuration('myapp')
config.set({'secret_key': 'sensitive_value'})
# Dump all configuration (including sensitive values)
full_config = config.dump(full=True, redact=False)
# Dump with sensitive values redacted
safe_config = config.dump(full=True, redact=True)
print("Full config:")
print(full_config)
print("\\nRedacted config:")
print(safe_config)Install with Tessl CLI
npx tessl i tessl/pypi-confuse