fractal refactor
This commit is contained in:
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user