File size: 2,133 Bytes
eee346e
 
 
 
 
 
 
 
696363c
eee346e
 
 
696363c
eee346e
 
 
 
696363c
eee346e
 
 
696363c
eee346e
 
 
 
 
 
 
 
 
 
696363c
ddca844
 
 
eee346e
 
696363c
eee346e
 
696363c
eee346e
 
696363c
eee346e
 
 
 
 
 
696363c
eee346e
 
 
696363c
eee346e
 
696363c
eee346e
 
696363c
eee346e
 
696363c
eee346e
 
696363c
eee346e
 
 
 
 
 
 
 
 
696363c
eee346e
 
 
 
696363c
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
"""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"),
        )


print("AppConfig loaded from environment variables:", AppConfig.from_env())


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
    """
    # Check common configuration locations
    locations = [
        Path("config"),  # Project config directory
        Path("~/.config/template-python"),  # User config directory
        Path("/etc/template-python"),  # System config directory
    ]

    for location in locations:
        path = location.expanduser() / f"{config_name}.json"
        if path.exists():
            return path

    return locations[0].expanduser() / f"{config_name}.json"