chore: DBML v5.22 — версия ORM и ссылки (ревью #161, AURORA-1446)
v5.22 структуру БД не меняет (comment.object_type: убраны chess_cell и kfo_result_line из описания), миграция не нужна. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
e13cd88fea
commit
b5520696ef
@ -175,7 +175,7 @@
|
|||||||
- NATS subjects и схема ключей S3 — `../docs/context/03-architecture.md`.
|
- NATS subjects и схема ключей S3 — `../docs/context/03-architecture.md`.
|
||||||
|
|
||||||
## Правила репозитория
|
## Правила репозитория
|
||||||
- ORM 1:1 с `../docs/model/data-model-v5.21.dbml` (текущая версия; миграции `0001_dbml_v5_13` + `0002_dbml_v5_14` + `0003_dbml_v5_15` + `0004_dbml_v5_16` + `0005_dbml_v5_17` + `0006_dbml_v5_18` + `0007_dbml_v5_19` + `0008_dbml_v5_20` + `0009_dbml_v5_21`); `api/scripts/check_dbml_vs_orm.py` (`make dbml-check`, входит в `check-full`) — обязательная проверка.
|
- ORM 1:1 с `../docs/model/data-model-v5.22.dbml` (текущая версия; v5.22 структуру не меняла; миграции `0001_dbml_v5_13` + `0002_dbml_v5_14` + `0003_dbml_v5_15` + `0004_dbml_v5_16` + `0005_dbml_v5_17` + `0006_dbml_v5_18` + `0007_dbml_v5_19` + `0008_dbml_v5_20` + `0009_dbml_v5_21`); `api/scripts/check_dbml_vs_orm.py` (`make dbml-check`, входит в `check-full`) — обязательная проверка.
|
||||||
- Алгоритмы — только из `../docs/context/05-domain-rules.md`; номер § — в docstring.
|
- Алгоритмы — только из `../docs/context/05-domain-rules.md`; номер § — в docstring.
|
||||||
- Вычисляемые объекты консолидации — `api/src/domain/`, без ORM-таблиц.
|
- Вычисляемые объекты консолидации — `api/src/domain/`, без ORM-таблиц.
|
||||||
- Фронт (`web/`) разрабатывается здесь (с 21.10.2026): фронтовые задачи — worktree arm-core и PR в `main`, как и
|
- Фронт (`web/`) разрабатывается здесь (с 21.10.2026): фронтовые задачи — worktree arm-core и PR в `main`, как и
|
||||||
|
|||||||
2
Makefile
2
Makefile
@ -3,7 +3,7 @@ VENV := api/.venv
|
|||||||
BIN := $(CURDIR)/$(VENV)/bin
|
BIN := $(CURDIR)/$(VENV)/bin
|
||||||
COMPOSE_FILE ?= ../docs/dev/docker-compose.yml
|
COMPOSE_FILE ?= ../docs/dev/docker-compose.yml
|
||||||
# DBML относительно api/: и в основном workspace, и в worktree .wt/<срез>/ это соседний docs/
|
# DBML относительно api/: и в основном workspace, и в worktree .wt/<срез>/ это соседний docs/
|
||||||
DBML ?= ../../docs/model/data-model-v5.21.dbml
|
DBML ?= ../../docs/model/data-model-v5.22.dbml
|
||||||
|
|
||||||
.PHONY: venv lint test test-integration e2e dbml-check migration-cycle check check-infra docker-build web-check statements-check check-full up migrate seed seed-dev
|
.PHONY: venv lint test test-integration e2e dbml-check migration-cycle check check-infra docker-build web-check statements-check check-full up migrate seed seed-dev
|
||||||
|
|
||||||
|
|||||||
@ -1127,7 +1127,7 @@ email без учёта регистра проверяет только сер
|
|||||||
| `make test` | юнит-тесты: `pytest -m "not integration"`, Docker не нужен |
|
| `make test` | юнит-тесты: `pytest -m "not integration"`, Docker не нужен |
|
||||||
| `make test-integration` | интеграционные тесты: `pytest -m "integration and not e2e"`, нужны PostgreSQL (и NATS) |
|
| `make test-integration` | интеграционные тесты: `pytest -m "integration and not e2e"`, нужны PostgreSQL (и NATS) |
|
||||||
| `make e2e` | сквозной прогон загрузки ОСВ: `pytest -m e2e`, нужны compose и tabular-parser из профиля `services` (без него — skip) |
|
| `make e2e` | сквозной прогон загрузки ОСВ: `pytest -m e2e`, нужны compose и tabular-parser из профиля `services` (без него — skip) |
|
||||||
| `make dbml-check` | сверка ORM с `../docs/model/data-model-v5.21.dbml` |
|
| `make dbml-check` | сверка ORM с `../docs/model/data-model-v5.22.dbml` |
|
||||||
| `make migration-cycle` | миграции на временной БД: `upgrade head` → `downgrade base` → `upgrade head`, пустой autogenerate |
|
| `make migration-cycle` | миграции на временной БД: `upgrade head` → `downgrade base` → `upgrade head`, пустой autogenerate |
|
||||||
| `make check` | быстрая проверка без Docker: `lint` + `test` |
|
| `make check` | быстрая проверка без Docker: `lint` + `test` |
|
||||||
| `make docker-build` | сборка образа: `docker build -t arm-core .` |
|
| `make docker-build` | сборка образа: `docker build -t arm-core .` |
|
||||||
@ -1179,7 +1179,7 @@ queue group `arm-core`, подписчики группы получают со
|
|||||||
|
|
||||||
### Проверка ORM и DBML
|
### Проверка ORM и DBML
|
||||||
|
|
||||||
Модель данных — `../docs/model/data-model-v5.21.dbml`. ORM обязана совпадать с ней один в один:
|
Модель данных — `../docs/model/data-model-v5.22.dbml`. ORM обязана совпадать с ней один в один:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
make dbml-check # пустой вывод и код 0 — совпадение; расхождения печатаются построчно
|
make dbml-check # пустой вывод и код 0 — совпадение; расхождения печатаются построчно
|
||||||
@ -1286,7 +1286,7 @@ Dockerfile только для локального compose
|
|||||||
- [`../docs/dev/README.md`](../docs/dev/README.md) — окружение разработки (compose), порты, типичные проблемы;
|
- [`../docs/dev/README.md`](../docs/dev/README.md) — окружение разработки (compose), порты, типичные проблемы;
|
||||||
- [`../docs/context/03-architecture.md`](../docs/context/03-architecture.md) — архитектура, соглашения шаблона, NATS и S3;
|
- [`../docs/context/03-architecture.md`](../docs/context/03-architecture.md) — архитектура, соглашения шаблона, NATS и S3;
|
||||||
- [`../docs/context/04-data-model-guide.md`](../docs/context/04-data-model-guide.md) и
|
- [`../docs/context/04-data-model-guide.md`](../docs/context/04-data-model-guide.md) и
|
||||||
[`../docs/model/data-model-v5.21.dbml`](../docs/model/data-model-v5.21.dbml) — модель данных;
|
[`../docs/model/data-model-v5.22.dbml`](../docs/model/data-model-v5.22.dbml) — модель данных;
|
||||||
- [`../docs/context/05-domain-rules.md`](../docs/context/05-domain-rules.md) — алгоритмы предметной области;
|
- [`../docs/context/05-domain-rules.md`](../docs/context/05-domain-rules.md) — алгоритмы предметной области;
|
||||||
- [`../docs/context/07-open-questions.md`](../docs/context/07-open-questions.md) — открытые вопросы;
|
- [`../docs/context/07-open-questions.md`](../docs/context/07-open-questions.md) — открытые вопросы;
|
||||||
- [`../docs/context/09-delivery-plan.md`](../docs/context/09-delivery-plan.md) — план срезов;
|
- [`../docs/context/09-delivery-plan.md`](../docs/context/09-delivery-plan.md) — план срезов;
|
||||||
|
|||||||
@ -57,7 +57,7 @@ from sqlalchemy.sql.functions import FunctionElement
|
|||||||
|
|
||||||
#: Эталонная схема модели. Имя схемы в БД конфигурируемо (`DB_SCHEMA`), CLI сверяет ORM, загруженную с этим значением.
|
#: Эталонная схема модели. Имя схемы в БД конфигурируемо (`DB_SCHEMA`), CLI сверяет ORM, загруженную с этим значением.
|
||||||
SCHEMA = "dkb"
|
SCHEMA = "dkb"
|
||||||
DBML_FILE_NAME = "data-model-v5.21.dbml"
|
DBML_FILE_NAME = "data-model-v5.22.dbml"
|
||||||
ORM = "ORM"
|
ORM = "ORM"
|
||||||
DBML = "DBML"
|
DBML = "DBML"
|
||||||
ABSENT = "нет"
|
ABSENT = "нет"
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
"""ORM-модели. Источник истины — docs/model/data-model-v5.21.dbml; заполняется в Срезе 0.
|
"""ORM-модели. Источник истины — docs/model/data-model-v5.22.dbml; заполняется в Срезе 0.
|
||||||
|
|
||||||
Импорт всех модулей моделей обязателен: он регистрирует таблицы в `Base.metadata` (create_all, alembic).
|
Импорт всех модулей моделей обязателен: он регистрирует таблицы в `Base.metadata` (create_all, alembic).
|
||||||
"""
|
"""
|
||||||
@ -7,7 +7,7 @@ from . import access, accounting, audit_ex, consolidation, directories, files, k
|
|||||||
from .base import Base, UUIDPrimaryMixin
|
from .base import Base, UUIDPrimaryMixin
|
||||||
|
|
||||||
#: Версия DBML, которой соответствуют модели (сверяется с шапкой DBML в check_dbml_vs_orm).
|
#: Версия DBML, которой соответствуют модели (сверяется с шапкой DBML в check_dbml_vs_orm).
|
||||||
DBML_VERSION = "5.21"
|
DBML_VERSION = "5.22"
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"DBML_VERSION",
|
"DBML_VERSION",
|
||||||
|
|||||||
@ -140,18 +140,18 @@ def test_enum_values_and_sets_are_compared(dbml_file: Path) -> None:
|
|||||||
|
|
||||||
def test_newer_dbml_version_fails_before_comparing_tables(tmp_path: Path, dbml_file: Path) -> None:
|
def test_newer_dbml_version_fails_before_comparing_tables(tmp_path: Path, dbml_file: Path) -> None:
|
||||||
lines = dbml_file.read_text(encoding="utf-8").splitlines()
|
lines = dbml_file.read_text(encoding="utf-8").splitlines()
|
||||||
newer = tmp_path / "data-model-v5.22.dbml"
|
newer = tmp_path / "data-model-v5.23.dbml"
|
||||||
# шапка 5.21 + заведомо сломанное тело: если бы таблицы сравнивались, были бы другие строки/ошибка разбора
|
# шапка 5.22 + заведомо сломанное тело: если бы таблицы сравнивались, были бы другие строки/ошибка разбора
|
||||||
newer.write_text(lines[0].replace("v5.21", "v5.22") + "\nTable broken {{{\n", encoding="utf-8")
|
newer.write_text(lines[0].replace("v5.22", "v5.23") + "\nTable broken {{{\n", encoding="utf-8")
|
||||||
assert run_check(newer) == (1, ["версия DBML 5.22 не совпадает с версией ORM 5.21: обновите модели"])
|
assert run_check(newer) == (1, ["версия DBML 5.23 не совпадает с версией ORM 5.22: обновите модели"])
|
||||||
|
|
||||||
|
|
||||||
def test_newer_dbml_version_via_cli(tmp_path: Path, dbml_file: Path) -> None:
|
def test_newer_dbml_version_via_cli(tmp_path: Path, dbml_file: Path) -> None:
|
||||||
newer = tmp_path / "data-model-v5.22.dbml"
|
newer = tmp_path / "data-model-v5.23.dbml"
|
||||||
newer.write_text(dbml_file.read_text(encoding="utf-8").replace("v5.21", "v5.22", 1), encoding="utf-8")
|
newer.write_text(dbml_file.read_text(encoding="utf-8").replace("v5.22", "v5.23", 1), encoding="utf-8")
|
||||||
result = _run_cli(str(newer))
|
result = _run_cli(str(newer))
|
||||||
assert result.returncode == 1
|
assert result.returncode == 1
|
||||||
assert result.stdout == "версия DBML 5.22 не совпадает с версией ORM 5.21: обновите модели\n"
|
assert result.stdout == "версия DBML 5.23 не совпадает с версией ORM 5.22: обновите модели\n"
|
||||||
|
|
||||||
|
|
||||||
def test_header_without_version_is_usage_error(tmp_path: Path) -> None:
|
def test_header_without_version_is_usage_error(tmp_path: Path) -> None:
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
"""Enum'ы ORM против блоков `Enum {}` DBML v5.21: имена, значения и их порядок (без БД)."""
|
"""Enum'ы ORM против блоков `Enum {}` DBML v5.22: имена, значения и их порядок (без БД)."""
|
||||||
|
|
||||||
import enum
|
import enum
|
||||||
import re
|
import re
|
||||||
@ -15,7 +15,7 @@ EXPECTED_ENUM_COUNT = 33
|
|||||||
|
|
||||||
def test_dbml_version_format() -> None:
|
def test_dbml_version_format() -> None:
|
||||||
assert re.fullmatch(r"\d+\.\d+", DBML_VERSION)
|
assert re.fullmatch(r"\d+\.\d+", DBML_VERSION)
|
||||||
assert DBML_VERSION == "5.21"
|
assert DBML_VERSION == "5.22"
|
||||||
assert f"v{DBML_VERSION}" in dbml_path().name
|
assert f"v{DBML_VERSION}" in dbml_path().name
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user