fractal refactor

This commit is contained in:
Volobuev Andrey
2025-06-26 17:53:04 +03:00
parent 03731e2d77
commit 04fa28f086
8 changed files with 1397 additions and 768 deletions

View File

@@ -1,21 +1,98 @@
# models.py
from pydantic import BaseModel, validator
from typing import Optional
# [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):
base_url: str
"""[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
class Config:
arbitrary_types_allowed = True # Разрешаем произвольные типы
# [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):
database_config: dict
"""[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
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"
}
}
}
}