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