zooui.config module

Configuration management for ZooUI.

exception zooui.config.ValidationError[source]

Bases: Exception

Raised when configuration validation fails.

class zooui.config.ConfigManager(config_file=None)[source]

Bases: object

Manages ZooUI configuration following the XDG Base Directory specification.

Features: - Creates default config file if missing - Validates configuration against schema - Rejects invalid values with clear errors - Supports temporary overrides via –config

Initialize ConfigManager.

Parameters:

config_file – Optional custom config file path (for testing)

DEFAULT_CONFIG = {'autosave': {'backup_dir': '/home/asd/.local/share/zooui/backups', 'enabled': True, 'expire_days': 7, 'interval': 300, 'max_backups': 20}, 'logging': {'colored_output': True, 'debug': False, 'log_dir': '/home/asd/.local/state/zooui/logs', 'log_to_console': True, 'log_to_file': True, 'verbose': False}, 'parallel_rendering': {'batch_size': 10, 'batch_timeout_ms': 1000, 'cache_max_age_ms': 1000, 'enable_profiling': False, 'enabled': True, 'max_batches': 10, 'max_workers': 4, 'priority_thresholds': {'high': 100.0, 'low': 2000.0, 'medium': 500.0}, 'viewport_update_threshold': 10.0}, 'render': {'order': 'smaller_on_top'}, 'tilestore': {'auto_cleanup': True, 'cleanup_on_startup': True, 'collect_cleanup_stats': True, 'max_age_days': 3}, 'zoom': {'clamp_enabled': True, 'default_zoomlevel': -4.0, 'max_zoomlevel': 10.0, 'min_zoomlevel': -12.0}}
VALIDATION_SCHEMA = {('autosave', 'backup_dir'): {'message': 'backup_dir must be a string', 'type': <class 'str'>}, ('autosave', 'enabled'): {'message': 'enabled must be true or false', 'type': <class 'bool'>}, ('autosave', 'expire_days'): {'message': 'expire_days must be at least 1 day', 'min': 1, 'type': <class 'int'>}, ('autosave', 'interval'): {'message': 'Autosave interval must be at least 60 seconds (1 minute)', 'min': 60, 'type': <class 'int'>}, ('autosave', 'max_backups'): {'message': 'max_backups must be at least 1', 'min': 1, 'type': <class 'int'>}, ('logging', 'colored_output'): {'message': 'colored_output must be true or false', 'type': <class 'bool'>}, ('logging', 'debug'): {'message': 'debug must be true or false', 'type': <class 'bool'>}, ('logging', 'log_dir'): {'message': 'log_dir must be a string', 'type': <class 'str'>}, ('logging', 'log_to_console'): {'message': 'log_to_console must be true or false', 'type': <class 'bool'>}, ('logging', 'log_to_file'): {'message': 'log_to_file must be true or false', 'type': <class 'bool'>}, ('logging', 'verbose'): {'message': 'verbose must be true or false', 'type': <class 'bool'>}, ('parallel_rendering', 'batch_size'): {'message': 'batch_size must be at least 1', 'min': 1, 'type': <class 'int'>}, ('parallel_rendering', 'batch_timeout_ms'): {'message': 'batch_timeout_ms must be positive', 'min': 1, 'type': (<class 'int'>, <class 'float'>)}, ('parallel_rendering', 'cache_max_age_ms'): {'message': 'cache_max_age_ms must be positive', 'min': 1, 'type': (<class 'int'>, <class 'float'>)}, ('parallel_rendering', 'enable_profiling'): {'message': 'enable_profiling must be true or false', 'type': <class 'bool'>}, ('parallel_rendering', 'enabled'): {'message': 'enabled must be true or false', 'type': <class 'bool'>}, ('parallel_rendering', 'max_batches'): {'message': 'max_batches must be at least 1', 'min': 1, 'type': <class 'int'>}, ('parallel_rendering', 'max_workers'): {'message': 'max_workers must be at least 1', 'min': 1, 'type': <class 'int'>}, ('parallel_rendering', 'priority_thresholds'): {'message': 'priority_thresholds must contain high, medium, and low keys', 'required_keys': ['high', 'medium', 'low'], 'type': <class 'dict'>}, ('parallel_rendering', 'viewport_update_threshold'): {'message': 'viewport_update_threshold must be non-negative', 'min': 0, 'type': (<class 'int'>, <class 'float'>)}, ('render', 'order'): {'message': 'render.order must be a string', 'type': <class 'str'>}, ('tilestore', 'auto_cleanup'): {'message': 'auto_cleanup must be true or false', 'type': <class 'bool'>}, ('tilestore', 'cleanup_on_startup'): {'message': 'cleanup_on_startup must be true or false', 'type': <class 'bool'>}, ('tilestore', 'collect_cleanup_stats'): {'message': 'collect_cleanup_stats must be true or false', 'type': <class 'bool'>}, ('tilestore', 'max_age_days'): {'message': 'max_age_days must be at least 1', 'min': 1, 'type': <class 'int'>}, ('zoom', 'clamp_enabled'): {'message': 'clamp_enabled must be true or false', 'type': <class 'bool'>}, ('zoom', 'default_zoomlevel'): {'message': 'default_zoomlevel must be a number', 'type': (<class 'int'>, <class 'float'>)}, ('zoom', 'max_zoomlevel'): {'message': 'max_zoomlevel must be a number', 'type': (<class 'int'>, <class 'float'>)}, ('zoom', 'min_zoomlevel'): {'message': 'min_zoomlevel must be a number', 'type': (<class 'int'>, <class 'float'>)}}
_expand_paths(config)[source]

Recursively expand tilde (~) in all string values.

Parameters:

config – Configuration dictionary

Returns:

Configuration with tilde paths expanded

load()[source]

Load configuration from the XDG config dir.

Returns:

Validated configuration dictionary

Raises:
  • ValidationError – If configuration is invalid

  • IOError – If file cannot be read (except when creating default)

  • json.JSONDecodeError – If file contains invalid JSON

save(config=None)[source]

Save configuration to the XDG config dir.

Parameters:

config – Configuration to save (uses current config if None)

Returns:

True if successful

Raises:

ValidationError – If configuration is invalid

merge_override(override_config)[source]

Merge temporary override configuration (from –config file).

Parameters:

override_config – Configuration to merge

Returns:

Merged configuration

Raises:

ValidationError – If override config is invalid

_merge_with_defaults(user_config)[source]

Merge user config with defaults, adding missing sections.

_validate_config(config)[source]

Validate configuration against schema.

Raises:

ValidationError – With clear error message

_validate_override_config(config)[source]

Validate override config has correct structure.

_deep_merge(base, override)[source]

Deep merge two dictionaries.

get_config_path()[source]

Get the path to the configuration file.

get_config_dir()[source]

Get the path to the configuration directory.

See Also