271 Commits

Author SHA1 Message Date
Andrey Epifancev
7ea1e67f4e fix: сверка DBML — табличные UNIQUE и CHECK, действия FK, неизвестные классы типов
I-1: табличный UniqueConstraint ORM сверяется как уникальный индекс по колонкам
(флаг колонки unique=True — по-прежнему в свойствах колонки); любое CHECK в ORM —
«отсутствует в DBML».
I-2: у совпавших целей FK сравниваются ON DELETE / ON UPDATE (нет в DBML = NO ACTION),
DEFERRABLE и INITIALLY.
I-3: неизвестный класс типа отрисовывается repr с параметрами (VARCHAR(length=50),
Uuid(as_uuid=False)) и никогда не совпадает с именем типа DBML.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 20:11:25 +04:00
Andrey Epifancev
e064830702 feat: scripts/check_dbml_vs_orm.py — CLI сверки ORM с DBML (версия, таблицы, колонки, типы, FK, индексы, enum'ы)
Ядро сверки перенесено из 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>
2026-10-03 19:56:58 +04:00
Andrey Epifancev
218ce88a31 test: поведенческая проверка partial unique consolidation_lock — первая блокировка фиксируется, снятие проверяется rowcount, имя индекса в ошибке
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 19:40:11 +04:00
Andrey Epifancev
ef55485dfc test: чётность частей 07–09 с DBML, полнота 43 таблиц и 27 enum, partial unique consolidation_lock на PG16
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 19:32:48 +04:00
Andrey Epifancev
48525731ff feat: ORM-модели частей 07–09 DBML v5.13 (консолидация, КФО, аудит/ЕХ, required_document_rule)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 19:32:48 +04:00
Andrey Epifancev
856ee2129f test: чётность частей 04–06 с DBML, NULLS NOT DISTINCT в компараторе, create_all 25 таблиц на PG16
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 19:22:29 +04:00
Andrey Epifancev
4e363bd00f feat: ORM-модели частей 04–06 DBML v5.13 (файлы, ОСВ, отчётность)
files.py: s3_object, stored_file, document (NULLS NOT DISTINCT), recognition_job;
FK-цикл stored_file <-> recognition_job разорван через use_alter с явным именем.
osv.py: osv_entry. statements.py: financial_statement_meta/column/line/value.
Тест частей 01–03 не привязан к полному составу metadata.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 19:22:29 +04:00
Andrey Epifancev
24fbe74840 test: общий модуль сверки ORM с DBML (dbml_parity): типы колонок, default, partial WHERE; самопроверка компаратора
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 19:12:53 +04:00
Andrey Epifancev
8aa1b80c33 test: типизация хелпера проверки partial unique
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 19:05:56 +04:00
Andrey Epifancev
56c98a5d05 test: чётность ORM частей 01–03 с DBML, create_all на временной БД, фикстура scratch_db_url
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 19:05:04 +04:00
Andrey Epifancev
fb2b9ef9fc feat: ORM-модели частей 01–03 DBML v5.13 (справочники, доступ, учёт), naming_convention в MetaData
16 таблиц: directories, access, accounting; схема dkb, детерминированные имена ограничений.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 19:05:04 +04:00
Andrey Epifancev
8e6223a273 feat: models/enums.py — 27 enum'ов DBML v5.13, фабрика pg_enum, DBML_VERSION
Тест сверяет имена и упорядоченные значения с блоками Enum {} DBML через pydbml.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 18:47:23 +04:00
Andrey Epifancev
1c56d39b09 test: регрессионные тесты lifespan — старт при недоступных S3/NATS и закрытие созданных ресурсов
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 18:42:54 +04:00
Andrey Epifancev
545994a525 feat: app.py — NATS без nkeys при пустых учётных данных, NATS_ENABLED, nats в /healthcheck, префикс /api/v1
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 18:36:42 +04:00
Andrey Epifancev
e432c1c542 test: test_defaults проверяет умолчания Settings без env-файла
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 18:23:21 +04:00
Andrey Epifancev
dff1e050b9 feat: Settings читает ENV_FILE, поля auth/NATS/outbox, .env.example и .env.test
NATS_SEED/NATS_JWT необязательны (пусто — подключение без nkeys); в app.py
разбор seed защищён от пустого значения (подключение переедет в задаче 22).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 18:17:19 +04:00
Andrey Epifancev
72415ab891 style: ruff format и правки линтера на каркасе шаблона
Без смены поведения: форматирование, сортировка импортов, удаление неиспользуемых
импортов, __all__ в src/db, datetime.UTC, HTTPStatus.NOT_FOUND вместо 404,
аннотация lvl в logger, noqa F401 на проверке доступности raisa_fastapi_protected_api,
mypy: miniopy_async не подтягивается (follow_imports=skip).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 18:02:19 +04:00
Andrey Epifancev
bf63d3a9dc chore: mypy — явные флаги strict для models/domain (strict в overrides действует глобально)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 18:01:48 +04:00
Andrey Epifancev
bb20d323d0 chore: инструменты шаблона — pyproject (ruff, mypy), requirements-dev, Makefile
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 18:01:18 +04:00
Andrey Epifancev
8e1f423ad6 chore: вычищены остатки доменного кода, каркас проходит tsc/biome/rsbuild 2026-10-02 23:34:55 +04:00
Andrey Epifancev
ba922225ab chore: каркас из шаблона команды (DKB_ARMKA@ba172f8, доменный код удалён) 2026-10-02 23:15:37 +04:00