Initial commit
This commit is contained in:
commit
9795660e1f
43 changed files with 2757 additions and 0 deletions
168
config/settings.py
Normal file
168
config/settings.py
Normal file
|
|
@ -0,0 +1,168 @@
|
|||
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
|
||||
Loading…
Add table
Add a link
Reference in a new issue