Ядро сверки перенесено из tests/dbml_parity.py в scripts/dbml_parity.py (единственная реализация, R-14); tests/dbml_parity.py и dbml_helpers.py — тонкие обёртки с пропуском теста без docs. Единый формат строк: `<объект>: ожидалось X / фактически Y`, `<объект>: отсутствует в ORM|DBML`; тип и nullability — одной строкой в нотации DBML. Версия из шапки DBML сверяется с DBML_VERSION до сравнения таблиц. Коды: 0/1/2. Без рабочего .env скрипт берёт api/.env.example. Makefile: dbml-check (в check-full), mypy проверяет scripts. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
24 lines
982 B
Python
24 lines
982 B
Python
"""Поиск и разбор DBML-модели для тестов: обёртка над `scripts.dbml_parity` с пропуском теста, если docs недоступен."""
|
||
|
||
from pathlib import Path
|
||
|
||
import pytest
|
||
from pydbml import PyDBML
|
||
|
||
from scripts.dbml_parity import DBML_FILE_NAME, default_dbml_path, parse_dbml
|
||
|
||
__all__ = ["DBML_FILE_NAME", "dbml_path", "load_dbml"]
|
||
|
||
|
||
def dbml_path() -> Path:
|
||
"""Путь к DBML: каталог docs из `ARM_KA_DOCS`, иначе соседний `../../docs` относительно `arm-core/api`."""
|
||
return default_dbml_path()
|
||
|
||
|
||
def load_dbml() -> PyDBML:
|
||
"""Разобрать DBML через pydbml; без файла — пропуск теста с явной причиной."""
|
||
path = dbml_path()
|
||
if not path.is_file():
|
||
pytest.skip(f"docs недоступен: нет {path} (задайте ARM_KA_DOCS или положите docs рядом с arm-core)")
|
||
return parse_dbml(path)
|