import logging from typing import Dict, Any from pathlib import Path from config.environment import EnvironmentLoader # Инициализация логгера logger = logging.getLogger(__name__) class Settings: """Основные настройки приложения""" # Загрузка переменных окружения ENV = EnvironmentLoader.get_env_variable('ENV', 'development') DEBUG = EnvironmentLoader.get_env_variable('DEBUG', False) # Базовые URL API_BASE_URL = EnvironmentLoader.get_env_variable('API_BASE_URL', 'http://localhost:8080/api/v1') UI_BASE_URL = EnvironmentLoader.get_env_variable('UI_BASE_URL', 'http://localhost:5173') # Настройки логирования LOG_LEVEL = EnvironmentLoader.get_env_variable('LOG_LEVEL', 'INFO').upper() LOG_FORMAT = EnvironmentLoader.get_env_variable( 'LOG_FORMAT', '%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) LOG_FILE = EnvironmentLoader.get_env_variable('LOG_FILE', 'logs/tests.log') # Настройки тестов TEST_TIMEOUT = EnvironmentLoader.get_env_variable('TEST_TIMEOUT', 30) # секунды TEST_RETRIES = EnvironmentLoader.get_env_variable('TEST_RETRIES', 3) TEST_PARALLEL_WORKERS = EnvironmentLoader.get_env_variable('TEST_PARALLEL_WORKERS', 'auto') # Настройки Allure ALLURE_RESULTS_DIR = EnvironmentLoader.get_env_variable('ALLURE_RESULTS_DIR', 'allure-results') ALLURE_REPORT_DIR = EnvironmentLoader.get_env_variable('ALLURE_REPORT_DIR', 'allure-report') # Настройки ожиданий IMPLICIT_WAIT = EnvironmentLoader.get_env_variable('IMPLICIT_WAIT', 10) # секунды EXPLICIT_WAIT = EnvironmentLoader.get_env_variable('EXPLICIT_WAIT', 30) # секунды POLL_FREQUENCY = EnvironmentLoader.get_env_variable('POLL_FREQUENCY', 0.5) # секунды # Базовые пути PROJECT_ROOT = Path(__file__).parent.parent TESTS_DIR = PROJECT_ROOT / 'tests' DATA_DIR = TESTS_DIR / 'data' REPORTS_DIR = PROJECT_ROOT / 'reports' # Создание необходимых директорий @classmethod def create_directories(cls): """Создание необходимых директорий""" directories = [ cls.REPORTS_DIR, cls.DATA_DIR, Path(cls.LOG_FILE).parent if cls.LOG_FILE else None, Path(cls.ALLURE_RESULTS_DIR).parent if cls.ALLURE_RESULTS_DIR else None, ] for directory in directories: if directory and not directory.exists(): directory.mkdir(parents=True, exist_ok=True) logger.debug(f"Created directory: {directory}") @classmethod def get_logging_config(cls) -> Dict[str, Any]: """Конфигурация логирования""" return { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'standard': { 'format': cls.LOG_FORMAT, 'datefmt': '%Y-%m-%d %H:%M:%S', }, 'detailed': { 'format': '%(asctime)s - %(name)s - %(levelname)s - %(module)s:%(lineno)d - %(message)s', 'datefmt': '%Y-%m-%d %H:%M:%S', }, }, 'handlers': { 'console': { 'class': 'logging.StreamHandler', 'level': cls.LOG_LEVEL, 'formatter': 'standard', 'stream': 'ext://sys.stdout', }, 'file': { 'class': 'logging.FileHandler', 'level': cls.LOG_LEVEL, 'formatter': 'detailed', 'filename': cls.LOG_FILE, 'mode': 'a', }, }, 'loggers': { '': { # root logger 'handlers': ['console', 'file'], 'level': cls.LOG_LEVEL, 'propagate': True, }, 'tests': { 'handlers': ['console', 'file'], 'level': cls.LOG_LEVEL, 'propagate': False, }, 'api': { 'handlers': ['console', 'file'], 'level': cls.LOG_LEVEL, 'propagate': False, }, 'ui': { 'handlers': ['console', 'file'], 'level': cls.LOG_LEVEL, 'propagate': False, }, }, } @classmethod def setup_logging(cls): """Настройка логирования""" import logging.config logging.config.dictConfig(cls.get_logging_config()) logger.info(f"Logging configured with level: {cls.LOG_LEVEL}") @classmethod def validate(cls): """Валидация настроек""" # Проверка обязательных переменных EnvironmentLoader.validate_environment() # Проверка URL import validators if not validators.url(cls.API_BASE_URL): logger.warning(f"API_BASE_URL might be invalid: {cls.API_BASE_URL}") if not validators.url(cls.UI_BASE_URL): logger.warning(f"UI_BASE_URL might be invalid: {cls.UI_BASE_URL}") # Создание директорий cls.create_directories() logger.info(f"Settings validated for environment: {cls.ENV}") @classmethod def print_summary(cls): """Вывод сводки настроек""" summary = f""" ===== Environment Settings ===== Environment: {cls.ENV} Debug Mode: {cls.DEBUG} API Base URL: {cls.API_BASE_URL} UI Base URL: {cls.UI_BASE_URL} Log Level: {cls.LOG_LEVEL} Test Timeout: {cls.TEST_TIMEOUT}s Test Retries: {cls.TEST_RETRIES} Parallel Workers: {cls.TEST_PARALLEL_WORKERS} ================================= """ logger.info(summary) # Инициализация настроек при импорте Settings.validate() Settings.setup_logging() Settings.print_summary() # Экспорт настроек settings = Settings