diff --git a/CLAUDE.md b/CLAUDE.md index 115c40e..2a66a21 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -13,6 +13,8 @@ старт — запись файла во «Входящие». **Нет доступа к БД.** ## Правила +- `api/arm_statements/` — копия пакета `arm-statements`, напрямую не править: обновление — `../docs/scripts/sync-statements.sh` + (`--in-place` в PR фичи), свежесть — `make statements-check` (в `check-full`). - Нормализация по фактическим ответам `../fixtures/ocr/aep_*.json`, а не по ТЗ (OQ-13, OQ-14), по `05-domain-rules.md` §11 и §11.1: правило, которого там нет, не реализуется, а поднимается вопросом. Функции очистки (`src/normalizer/ocr/`) перенесены из старого ядра **дословно** (единственное исключение для `reference-old-arm`): diff --git a/Makefile b/Makefile index 4dc0fb2..acc15a1 100644 --- a/Makefile +++ b/Makefile @@ -6,17 +6,19 @@ BIN := $(CURDIR)/$(VENV)/bin COMPOSE_FILE ?= ../docs/dev/docker-compose.yml COMPOSE_PROJECT ?= arm-ka IMAGE ?= scan-gateway:dev +ARM_KA_DOCS ?= ../docs -.PHONY: help venv lint test test-integration check docker-build check-full up emulator golden-update +.PHONY: help venv lint test test-integration check docker-build check-full statements-check up emulator golden-update help: @echo "venv - окружение api/.venv (Python 3.11) с зависимостями без raisa_*" - @echo "lint - ruff check, ruff format --check, mypy src" + @echo "lint - ruff check, ruff format --check, mypy src arm_statements" @echo "test - pytest без интеграционных тестов" @echo "test-integration - интеграционные тесты (нужны NATS и MinIO: make up)" @echo "check - lint + test" @echo "docker-build - собрать docker-образ $(IMAGE) (контекст — корень репозитория)" @echo "check-full - check + test-integration + docker-build (по порядку, до первой ошибки)" + @echo "statements-check - свежесть копии api/arm_statements (sync-statements --check), входит в check-full" @echo "up - поднять NATS/MinIO/PostgreSQL общим compose-проектом arm-ka и создать бакет (minio-init)" @echo "emulator - запустить эмулятор ИС Сканирование (python -m src.scan_emulator)" @echo "golden-update - пересобрать эталоны нормализатора ../fixtures/ocr/expected_normalize/ (diff смотреть в fixtures)" @@ -30,7 +32,7 @@ venv: lint: cd api && $(BIN)/ruff check . cd api && $(BIN)/ruff format --check . - cd api && $(BIN)/mypy src + cd api && $(BIN)/mypy src arm_statements test: cd api && $(BIN)/pytest -m "not integration" @@ -49,6 +51,7 @@ docker-build: # так порядок check -> test-integration -> docker-build и остановка на первой ошибке гарантированы и при make -j. check-full: $(MAKE) check + $(MAKE) statements-check $(MAKE) test-integration $(MAKE) docker-build @@ -67,3 +70,11 @@ emulator: # Эталоны нормализатора на реальных ответах ИС: пишет ../fixtures/ocr/expected_normalize/.json; diff смотреть в fixtures golden-update: cd api && $(BIN)/python -m tests.golden_update + +# Свежесть копии api/arm_statements/ (../docs/dev/checks.md): 0 — синхронна; 10 — отстала или перечень кодов в docs +# новее (цель зелёная, предупреждение вписать в описание PR); 20 и 2 — красная. Читает ../docs и ../arm-statements, +# поэтому только в check-full, не в check +statements-check: + @rc=0; $(ARM_KA_DOCS)/scripts/sync-statements.sh --check --host-dir . || rc=$$?; \ + if [ $$rc -eq 10 ]; then echo "statements-check: ПРЕДУПРЕЖДЕНИЕ — впишите в описание PR"; \ + elif [ $$rc -ne 0 ]; then exit $$rc; fi diff --git a/api/pyproject.toml b/api/pyproject.toml index f9543f0..18cc69b 100644 --- a/api/pyproject.toml +++ b/api/pyproject.toml @@ -12,7 +12,7 @@ select = ["E", "F", "I", "UP", "B", "PL"] "tests/**" = ["PLR2004"] [tool.ruff.lint.isort] -known-first-party = ["src"] +known-first-party = ["src", "arm_statements"] [tool.mypy] python_version = "3.11" @@ -22,10 +22,11 @@ plugins = ["pydantic.mypy"] mypy_path = "." explicit_package_bases = true -# Строгий режим для собственного кода сервиса (`src`). `strict = true` в overrides mypy (2.x) применяется глобально, +# Строгий режим для собственного кода сервиса (`src`) и копии общего кода (arm_statements: sync-statements, не править — +# в строгом режиме, как в репозитории arm-statements). `strict = true` в overrides mypy (2.x) применяется глобально, # а не к модулю, поэтому флаги семейства strict перечислены явно. [[tool.mypy.overrides]] -module = ["src.contract.*", "src.core.clients", "src.core.health", "src.core.nats", "src.core.worker", "src.gateway.*", "src.normalizer.*", "src.scan_emulator.*"] +module = ["src.contract.*", "src.core.clients", "src.core.health", "src.core.nats", "src.core.worker", "src.gateway.*", "src.normalizer.*", "src.scan_emulator.*", "arm_statements", "arm_statements.*"] disallow_any_generics = true disallow_subclassing_any = true disallow_untyped_calls = true diff --git a/api/pytest.ini b/api/pytest.ini index 59d52bd..0f79253 100644 --- a/api/pytest.ini +++ b/api/pytest.ini @@ -2,6 +2,7 @@ pythonpath = . testpaths = tests + arm_statements/tests python_files = test_*.py tests*.py