#!/usr/bin/env python3
"""
Модуль конфигурации проекта.
Загружает и валидирует переменные окружения.
"""
import os
import sys
import logging
from dotenv import load_dotenv
# Загружаем переменные окружения из файла .env
load_dotenv()
# Настраиваем логирование
logging.basicConfig(
level=os.getenv("LOG_LEVEL", "INFO").upper(),
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.StreamHandler()
]
)
logger = logging.getLogger("Config")
class Config:
"""
Класс для управления конфигурацией приложения.
Загружает и валидирует все необходимые переменные окружения.
"""
# OpenWeatherMap API
OPENWEATHER_API_KEY = os.getenv("OPENWEATHER_API_KEY")
OPENWEATHER_BASE_URL = os.getenv(
"OPENWEATHER_BASE_URL",
"https://api.openweathermap.org/data/2.5"
)
# Deepseek API
DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY")
DEEPSEEK_BASE_URL = "https://api.deepseek.com/chat/completions"
# Database
DATABASE_URL = os.getenv("DATABASE_URL", "postgresql://localhost/mydb")
# API для работы с начислениями
ACCRUALS_API_URL = os.getenv("ACCRUALS_API_URL", "http://localhost:8000")
# Параметры приложения
LOG_LEVEL = os.getenv("LOG_LEVEL", "INFO").upper()
MAX_FORECAST_DAYS = 5
MIN_FORECAST_DAYS = 1
DEFAULT_FORECAST_DAYS = 3
API_TIMEOUT = 30.0 # Таймаут для API запросов в секундах
API_TIMEOUT = 30.0 # Таймаут для API запросов в секундах
@classmethod
def validate(cls) -> bool:
"""
Валидирует наличие критических переменных окружения.
Returns:
bool: True если все критические переменные установлены, False иначе
"""
errors = []
if not cls.OPENWEATHER_API_KEY:
errors.append("OPENWEATHER_API_KEY не найден в переменных окружения")
if not cls.DEEPSEEK_API_KEY:
errors.append("DEEPSEEK_API_KEY не найден в переменных окружения")
if errors:
for error in errors:
logger.error(error)
return False
logger.info("✅ Конфигурация успешно валидирована")
return True
@classmethod
def get_config_summary(cls) -> str:
"""
Возвращает сводку конфигурации для логирования.
Returns:
str: Строка с информацией о конфигурации
"""
return f"""
Конфигурация приложения:
- OpenWeatherMap URL: {cls.OPENWEATHER_BASE_URL}
- Deepseek API: {cls.DEEPSEEK_BASE_URL}
- Уровень логирования: {cls.LOG_LEVEL}
- Максимум дней прогноза: {cls.MAX_FORECAST_DAYS}
- Таймаут API: {cls.API_TIMEOUT} сек
""".strip()