Files
ss-tools/superset_tool/models.py
Volobuev Andrey 04fa28f086 fractal refactor
2025-06-26 17:53:04 +03:00

98 lines
3.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# [MODULE] Сущности данных конфигурации
# @desc: Определяет структуры данных для работы с Superset API
# @contracts:
# - Проверка валидности URL
# - Валидация параметров аутентификации
# @coherence:
# - Все модели согласованы с API Superset v1
# - Совместимы с клиентскими методами
# [IMPORTS] Models
from typing import Optional, Dict, Any
from pydantic import BaseModel, validator,Field
from .utils.logger import SupersetLogger
class SupersetConfig(BaseModel):
"""[CONFIG] Конфигурация подключения к Superset
@semantic: Основные параметры подключения к API
@invariant:
- base_url должен содержать версию API (/v1/)
- auth должен содержать все обязательные поля
"""
base_url: str = Field(..., regex=r'.*/api/v1.*')
auth: dict
verify_ssl: bool = True
timeout: int = 30
logger: Optional[SupersetLogger] = None
# [VALIDATOR] Проверка параметров аутентификации
@validator('auth')
def validate_auth(cls, v):
required = {'provider', 'username', 'password', 'refresh'}
if not required.issubset(v.keys()):
raise ValueError(
f"[CONTRACT_VIOLATION] Auth must contain {required}"
)
return v
class Config:
arbitrary_types_allowed = True
json_schema_extra = {
"example": {
"base_url": "https://host/api/v1/",
"auth": {
"provider": "db",
"username": "user",
"password": "pass",
"refresh": True
}
}
}
# [SEMANTIC-TYPE] Конфигурация БД для миграций
class DatabaseConfig(BaseModel):
"""[CONFIG] Параметры трансформации БД при миграции
@semantic: Содержит old/new состояние для преобразования
@invariant:
- Должны быть указаны оба состояния (old/new)
- UUID должен соответствовать формату
"""
database_config: Dict[str, Dict[str, Any]]
logger: Optional[SupersetLogger] = None
@validator('database_config')
def validate_config(cls, v):
if not {'old', 'new'}.issubset(v.keys()):
raise ValueError(
"[COHERENCE_ERROR] Config must contain both old/new states"
)
return v
class Config:
arbitrary_types_allowed = True
json_schema_extra = {
"example": {
"database_config": {
"old":
{
"database_name": "Prod Clickhouse",
"sqlalchemy_uri": "clickhousedb+connect://clicketl:XXXXXXXXXX@rgm-s-khclk.hq.root.ad:443/dm",
"uuid": "b9b67cb5-9874-4dc6-87bd-354fc33be6f9",
"database_uuid": "b9b67cb5-9874-4dc6-87bd-354fc33be6f9",
"allow_ctas": "false",
"allow_cvas": "false",
"allow_dml": "false"
},
"new": {
"database_name": "Dev Clickhouse",
"sqlalchemy_uri": "clickhousedb+connect://dwhuser:XXXXXXXXXX@10.66.229.179:8123/dm",
"uuid": "e9fd8feb-cb77-4e82-bc1d-44768b8d2fc2",
"database_uuid": "e9fd8feb-cb77-4e82-bc1d-44768b8d2fc2",
"allow_ctas": "true",
"allow_cvas": "true",
"allow_dml": "true"
}
}
}
}