5.7 KiB
5.7 KiB
Tasks: Срез 0 — скелет tabular-parser
Репозиторий — tabular-parser; команды — из api/. Зависимости: 3.1 ждёт контракт v1.0 (docs 1.1–1.4);
интеграционные тесты 4.x — compose инфраструктуры (docs 2.1). Каждая задача ≤ половины дня. CI нет — проверки локальные.
1. Вырезать фронт и БД из шаблона
- 1.1 Удалить
web/,setup/.npmrc, npm-шаги изsetup/setup.sh,api/alembic/,api/alembic.ini,api/src/db/,api/src/models/,api/src/repositories/; из.gitignoreубратьDockerfile; проверка:git statusпоказывает только удаления и.gitignore;python -c "import src"пока падает ожидаемо (чинится в 1.2) - 1.2
src/app.py: убрать mount SPA/os.makedirs("web"), CORS, SMB-сессию, импортraisa_fastapi_protected_api;src/core/config.py: убратьDBSettings,SMBSettings, оставитьMINIO,NATS; добавитьENV_FILE,SERVICE_NAME="tabular-parser",NATS_ENABLED=true,WORKER_CONCURRENCY=1,PUBLISH_RETRIES=3,DONE_CACHE_SIZE=1000;requirements.txtбезasyncpg,SQLAlchemy,alembic,smbprotocol,argon2-cffi,raisa_fastapi_protected_api; проверка:pip install -r requirements.txtв чистом venv (python3.11),python run_server.pyстартует c.env.example,/healthcheck200 - 1.3
README.md— описание сервиса (назначение, командыmake, env, запуск против compose),CLAUDE.md— актуализировать раздел «Соглашения шаблона» по факту вырезанного; проверка: все упомянутые файлы существуют
2. Инструменты
- 2.1
api/pyproject.toml(ruff: line-length 120, E,F,I,UP,B,PL; mypy с плагином pydantic),requirements-dev.txt=-r requirements.txt+ ruff, mypy, pytest, pytest-asyncio, pytest-env, httpx, jsonschema;Makefile:venv(python3.11),lint,test,test-integration,check,check-full,up; проверка:make venv && make lintзелёные - 2.2
Dockerfile(python:3.11-slim),.env.example,.env.test; проверка:docker build -t tabular-parser .успешен
3. Контракт
- 3.1
api/contracts/— копии трёх схем +examples/из../docs/contracts;src/contract/— pydantic-модели (RecognitionRequest,RecognitionResultMessageсо статусамиprocessing | done | needs_check | error,RecognitionResult,OsvDocument,StatementDocument, деньги какDecimal↔ строка);tests/unit/test_contract.py— идентичность с docs (skip без docs), валидация примеров, round-trip модели → JSON → схема; проверка: тесты зелёные
4. Воркер и парсер-заглушка
- 4.1
src/parser/__init__.py: протоколParser,ParseOutcome,NullParser(NOT_IMPLEMENTED);api/rules/README.md;tests/unit/test_null_parser.py; проверка: заглушка возвращает код и сообщение, не трогая входные байты - 4.2
src/core/clients.py:S3Storage.get_bytes(bucket, key),put_json(bucket, key, obj);src/core/nats.py: подключение (с/без nkeys, автопереподключение),subscribe_requests(queue="tabular-parser", cb),publish(subject, payload, msg_id)с повторами; проверка: unit-тесты с фейковым соединением; интеграционный тест подключения к compose-NATS без JetStream и получения сообщения с заголовком - 4.3
src/core/worker.py:on_request(msg): валидация → множествоjob_idв работе/обработано (LRU) → ackprocessing→ очередь; рабочая корутина: S3 get →Parser→ S3 put результата → конверт → publish; таблица ошибок D-5;metrics.duration_ms; запуск/остановка в lifespan приNATS_ENABLED;/healthcheck.nats; проверка: unit-тесты с фейками — сценарии spec (ack раньше результата, повторный запрос, NOT_IMPLEMENTED, FILE_READ_ERROR, SCHEMA_MISMATCH без ack, подмена парсера →done, повтор публикации) - 4.4
tests/integration/test_roundtrip.py(маркерintegration): положить файл в MinIOuploads/…, опубликоватьrequest-tabular.json, собрать сообщенияrecognition.result: первое —processing, второе —error NOT_IMPLEMENTEDс правильнымиNats-Msg-Id; повторная публикация запроса даёт только ещё один ack; проверка: зелёный против compose
5. Проверки и завершение
- 5.1
make check-full:make check+pytest -m integration+docker build; проверка: зелёный против compose docs на веткеfeat/1-slice-0-skeleton - 5.2 Прогон DoD:
make up→make check-full→ ручная проверка изdocs/dev/README.md(«проверка окружения»);openspec validate slice-0-skeleton --strict; выводmake check-full— в описание PR