| """Common configuration utilities.""" |
|
|
| import json |
| import os |
| from dataclasses import dataclass |
| from pathlib import Path |
| from typing import Any, Optional |
|
|
|
|
| @dataclass |
| class AppConfig: |
| """Application configuration.""" |
|
|
| app_name: str |
| environment: str |
| debug: bool |
| log_level: str |
|
|
| @classmethod |
| def from_env(cls) -> "AppConfig": |
| """Create configuration from environment variables. |
| |
| Returns: |
| AppConfig: Application configuration instance |
| """ |
| return cls( |
| app_name=os.getenv("APP_NAME", "template-python"), |
| environment=os.getenv("ENV", "development"), |
| debug=os.getenv("DEBUG", "false").lower() == "true", |
| log_level=os.getenv("LOG_LEVEL", "INFO"), |
| ) |
|
|
|
|
| def load_json_config(path: Path) -> dict[str, Any]: |
| """Load configuration from JSON file. |
| |
| Args: |
| path: Path to JSON configuration file |
| |
| Returns: |
| dict[str, Any]: Configuration dictionary |
| |
| Raises: |
| FileNotFoundError: If configuration file doesn't exist |
| json.JSONDecodeError: If configuration file is invalid JSON |
| """ |
| if not path.exists(): |
| raise FileNotFoundError(f"Configuration file not found: {path}") |
|
|
| with path.open() as f: |
| return json.load(f) |
|
|
|
|
| class ConfigurationError(Exception): |
| """Base class for configuration errors.""" |
|
|
| pass |
|
|
|
|
| def get_config_path(config_name: str) -> Path: |
| """Get configuration file path. |
| |
| Args: |
| config_name: Name of the configuration file |
| |
| Returns: |
| Path: Path to configuration file |
| """ |
| |
| locations = [ |
| Path("config"), |
| Path("~/.config/template-python"), |
| Path("/etc/template-python"), |
| ] |
|
|
| for location in locations: |
| path = location.expanduser() / f"{config_name}.json" |
| if path.exists(): |
| return path |
|
|
| return locations[0].expanduser() / f"{config_name}.json" |
|
|