docs: README с описанием сервиса и актуализация CLAUDE.md после выреза шаблона
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
1b87cd2fdf
commit
ffaa982fb1
36
CLAUDE.md
36
CLAUDE.md
@ -20,21 +20,29 @@ Stateless-сервис разбора XLS/XLSX/XLSB: ОСВ по счетам (
|
|||||||
|
|
||||||
## Соглашения шаблона
|
## Соглашения шаблона
|
||||||
Тот же шаблон команды, что у `arm-core` («Шаблон FastAPI», `RSHB/DKB_ARMKA@ba172f8`); общие соглашения —
|
Тот же шаблон команды, что у `arm-core` («Шаблон FastAPI», `RSHB/DKB_ARMKA@ba172f8`); общие соглашения —
|
||||||
`../docs/context/03-architecture.md`, «Соглашения шаблона команды». Сейчас репозиторий — полная копия каркаса `arm-core`;
|
`../docs/context/03-architecture.md`, «Соглашения шаблона команды». Репозиторий приведён к сервису **без фронта и без БД**
|
||||||
change `slice-0-skeleton` приводит его к сервису **без фронта и без БД**. Все команды — из `api/`.
|
(change `slice-0-skeleton`, задачи 1.1–1.2 выполнены). Все команды — из `api/`.
|
||||||
|
|
||||||
**Оставлено от шаблона:** `api/run_server.py` (точка входа платформы, `SERVER__HOST/PORT`), `api/src/app.py` (lifespan,
|
**Оставлено от шаблона:** `api/run_server.py` (точка входа платформы, `SERVER__HOST/PORT`), `api/src/app.py` (lifespan:
|
||||||
`GET /healthcheck`, gzip/proxy middleware, обработчики ошибок), `core/config.py` (pydantic-settings, `OPENBAO__MINIO__*`,
|
подключение к MinIO и NATS, ошибка подключения логируется и не мешает старту; `GET /healthcheck`, gzip/proxy middleware),
|
||||||
`OPENBAO__NATS__*`, `DEBUG`), `core/clients.py` (S3), `core/nats_callback.py`, `core/logger.py`, `core/exception_handlers.py`,
|
`core/config.py` (pydantic-settings, `OPENBAO__MINIO__*` включая `MINIO_SECURE`, `OPENBAO__NATS__*`, `DEBUG`, `ENV_FILE`,
|
||||||
`common/exceptions.py`, `pytest.ini`, `requirements*.txt`, `raisa_config.yml`, `setup/setup.sh` + `pip.conf` (без npm-шага).
|
`NATS_ENABLED`, `WORKER_CONCURRENCY`, `PUBLISH_RETRIES`, `DONE_CACHE_SIZE`), `core/clients.py` (S3), `core/logger.py`,
|
||||||
|
`core/exception_handlers.py` (без SQLAlchemy), `common/exceptions.py`, `pytest.ini`, `requirements*.txt`, `raisa_config.yml`,
|
||||||
|
`setup/setup.sh` + `pip.conf` (без npm-шага). Шаблонный `core/nats_callback.py` пока на месте, удаляется задачей 4.3 —
|
||||||
|
его заменит воркер.
|
||||||
|
|
||||||
**Вырезано (Срез 0):** `web/` целиком и `setup/.npmrc`; из `app.py` — mount SPA (`SPAStaticFiles`, `os.makedirs("web")`),
|
**Вырезано (Срез 0):** `web/` целиком и `setup/.npmrc`; из `app.py` — mount SPA (`SPAStaticFiles`, `os.makedirs("web")`),
|
||||||
CORS, регистрация SMB-сессии, импорт `raisa_fastapi_protected_api`; `db/`, `models/`, `repositories/`, `alembic/`,
|
CORS, регистрация SMB-сессии, импорт `raisa_fastapi_protected_api`, зависимость от SQLAlchemy в обработчиках ошибок;
|
||||||
`alembic.ini`; из настроек — `OPENBAO.DATABASE`, `OPENBAO.SMB`; из `requirements.txt` — `asyncpg`, `SQLAlchemy`, `alembic`,
|
`db/`, `models/`, `repositories/`, `alembic/`, `alembic.ini`; из настроек — `OPENBAO.DATABASE`, `OPENBAO.SMB`; из
|
||||||
`smbprotocol`, `argon2-cffi`, `raisa_fastapi_protected_api`; шаблонный `README.md` заменён описанием сервиса.
|
`requirements.txt` — `asyncpg`, `SQLAlchemy`, `alembic`, `smbprotocol`, `argon2-cffi`, `greenlet`, `Mako`,
|
||||||
|
`raisa_fastapi_protected_api`; шаблонный `README.md` заменён описанием сервиса.
|
||||||
|
|
||||||
**Добавлено:** `api/src/parser/` (ОСВ §1 и формы §12 — чистые функции над книгой Excel; Срез 2), `api/src/contract/`
|
**Добавлено** (целевое состояние среза; каждый пункт появляется своей задачей `openspec/changes/slice-0-skeleton/tasks.md`,
|
||||||
(pydantic-модели `recognition-result` v1.0; идентичность с `../docs/contracts` проверяется в `make check`), `api/rules/*.yaml`
|
до этого файла нет): `api/src/parser/` (интерфейс `Parser` и заглушка `NullParser`; разбор ОСВ §1 и форм §12 — чистые
|
||||||
(словари синонимов — в документах это `rules/*.yaml` относительно `api/`), `api/src/core/worker.py` (подписка queue group
|
функции над книгой Excel, Срезы 2+), `api/src/contract/` (pydantic-модели `recognition-result` v1.0) и `api/contracts/`
|
||||||
`recognition.tabular.request` → S3 `uploads/` → парсер → S3 `results/` → `recognition.result`), `Dockerfile`,
|
(копии схем; идентичность с `../docs/contracts` проверяется в `make check`) — задача 3.1, `api/rules/*.yaml` (словари
|
||||||
`api/pyproject.toml` (ruff, mypy). Проверки: `pytest`, `ruff check . && ruff format --check .`, `mypy src`.
|
синонимов — в документах это `rules/*.yaml` относительно `api/`) — 4.1, `api/src/core/nats.py` и `api/src/core/worker.py`
|
||||||
|
(подписка queue group `tabular-parser` на `recognition.tabular.request` → ack → S3 `uploads/` → парсер → S3 `results/` →
|
||||||
|
`recognition.result`) — 4.2–4.3, `api/pyproject.toml` (ruff, mypy) и `Makefile` — 2.1, `Dockerfile`, `.env.example`,
|
||||||
|
`.env.test` — 2.2. Проверки: `make check` (`pytest`, `ruff check . && ruff format --check .`, `mypy src`),
|
||||||
|
`make check-full` перед PR.
|
||||||
|
|||||||
270
README.md
270
README.md
@ -1,163 +1,141 @@
|
|||||||
[](https://github.com/psf/black) [](https://pycqa.github.io/isort/) [](https://github.com/pylint-dev/pylint)
|
# tabular-parser — разбор XLS/XLSX/XLSB для АРМ КА
|
||||||
__________________________________________________________________________________________________________
|
|
||||||
# dkb_armka, v 0.0.1
|
|
||||||
____
|
|
||||||
|
|
||||||
| | Исполнитель | Заказчик |
|
Stateless-сервис распознавания табличных файлов (ОСВ по счетам, ББ, ОФР из Excel) для автоматизированного рабочего
|
||||||
|-----------|:----------------------------------------:|:----------------------------------------------:|
|
места кредитного аналитика ДКБ (АО «Россельхозбанк»). Сервис **не имеет доступа к БД и фронта** и видит только две
|
||||||
| Сотрудник | raykov-mse | raykov-mse |
|
внешние системы: NATS (core, без JetStream) и S3 (MinIO, один бакет). Он получает задание, читает исходный файл,
|
||||||
| Отдел | aurora | aurora |
|
возвращает структуру файла и ничего не знает про организации, периметры и план счетов — нормализацией занимается
|
||||||
| Контакты | raykovmse@rshb.ru | raykovmse@rshb.ru |
|
`arm-core`.
|
||||||
-----
|
|
||||||
# Шаблон FastAPI
|
|
||||||
|
|
||||||
## Описание
|
Обмен с `arm-core` идёт по контракту **v1.0**: схемы — [`../docs/contracts/`](../docs/contracts/), копия — в
|
||||||
|
`api/contracts/` (добавляется задачей 3.1 среза и проверяется на идентичность в `make check`).
|
||||||
|
|
||||||
Данное шаблон предоставляет проект, в котором приложение состоит из API и UI. При использовании данного типа проекта, Вы можете разрабатывать, как отдельные API сервисы, так и WEB приложения с интерфейсом. Для построения WEB интерфейса используется React. Далее описаны основные иснтрументы предустановленные данным шаблоном:
|
**Срез 0 — скелет.** Транспорт работает полностью (подписка, ack, чтение S3, публикация результата, ошибки транспорта),
|
||||||
|
а сам разбор заменён заглушкой: на любой корректный запрос сервис отвечает конвертом `status = error` с
|
||||||
|
`error.code = NOT_IMPLEMENTED`. Настоящий парсер (ОСВ — Срез 2, формы ББ/ОФР — позже) подключается через интерфейс
|
||||||
|
`Parser` без изменений воркера.
|
||||||
|
|
||||||
### Подготовка к разработке
|
Репозиторий — часть workspace АРМ КА. Общий контекст, модель, правила предметной области и контракты — в соседних
|
||||||
|
репозиториях:
|
||||||
|
|
||||||
Для удобной настройки проекта под разработку. Перейдите в каталог setup и выполните слудеющие команды:
|
- [`../CLAUDE.md`](../CLAUDE.md) — инварианты и процесс работы всего workspace;
|
||||||
|
- [`../docs/`](../docs/) — контекст (`context/`), контракты (`contracts/`), окружение разработки (`dev/`);
|
||||||
|
- [`CLAUDE.md`](CLAUDE.md) — соглашения этого репозитория.
|
||||||
|
|
||||||
|
Репозитории должны лежать рядом: `tabular-parser/` и `docs/` — соседние каталоги (так же устроено зеркало `.wt/<срез>/`).
|
||||||
|
Пути `../docs/...` ниже и в `Makefile` рассчитаны на это.
|
||||||
|
|
||||||
|
## Как обрабатывается запрос
|
||||||
|
|
||||||
|
1. `arm-core` публикует запрос в NATS, subject `recognition.tabular.request` (схема `recognition-request`), исходный
|
||||||
|
файл лежит в S3 под ключом `uploads/{file_id}/{job_id}/<имя>`.
|
||||||
|
2. Сервис подписан на этот subject в queue group `tabular-parser` — несколько экземпляров делят нагрузку между собой.
|
||||||
|
3. Запрос валидируется по схеме. Если `job_id` ещё не обработан этим процессом (process-local LRU), сервис **до чтения
|
||||||
|
файла** публикует в `recognition.result` конверт `status = processing` (ack) с заголовком
|
||||||
|
`Nats-Msg-Id = ack:<job_id>:<attempt>`. Повторный запрос с тем же `job_id` получает повторный ack и второй раз не
|
||||||
|
обрабатывается.
|
||||||
|
4. Файл читается из S3 (`s3.bucket` / `s3.key`) и передаётся парсеру («байты + тип файла → документы, метрики или ошибка»).
|
||||||
|
5. Результат (схема `recognition-result`) записывается в S3 под ключом `results/{file_id}/{job_id}/result.json`.
|
||||||
|
6. В `recognition.result` публикуется конверт результата (схема `recognition-result-message`; статусы
|
||||||
|
`processing | done | needs_check | error`) с заголовком `Nats-Msg-Id = result:<job_id>:<attempt>`. Публикация
|
||||||
|
повторяется до `PUBLISH_RETRIES` раз.
|
||||||
|
|
||||||
|
Ошибки транспорта процесс не роняют, а превращаются в конверт `status = error`: нечитаемый или несовместимый запрос —
|
||||||
|
`SCHEMA_MISMATCH` (ack при этом не публикуется), объект S3 не читается — `FILE_READ_ERROR`, исключение парсера —
|
||||||
|
`UNKNOWN_ERROR`, заглушка парсера в Срезе 0 — `NOT_IMPLEMENTED`.
|
||||||
|
|
||||||
|
## Состав репозитория
|
||||||
|
|
||||||
|
```
|
||||||
|
api/ бэкенд (все команды разработки — отсюда или через make из корня)
|
||||||
|
run_server.py точка входа платформы (uvicorn; SERVER__HOST, SERVER__PORT)
|
||||||
|
src/app.py FastAPI: lifespan (подключение к MinIO и NATS), GET /healthcheck, middleware, обработчики ошибок
|
||||||
|
src/core/ config.py (настройки), clients.py (S3), logger.py, exception_handlers.py
|
||||||
|
src/parser/ интерфейс Parser и реализации (добавляется задачей 4.1)
|
||||||
|
src/contract/ pydantic-модели контракта v1.0 (добавляется задачей 3.1)
|
||||||
|
contracts/ копии JSON-схем контракта (добавляется задачей 3.1)
|
||||||
|
rules/ словари синонимов *.yaml для парсера (добавляется задачей 4.1)
|
||||||
|
tests/ pytest: unit и integration (маркер `integration`)
|
||||||
|
setup/ pip.conf и setup.sh (создание venv без uv)
|
||||||
|
raisa_config.yml конфигурация платформы РАИСА
|
||||||
|
Makefile команды разработки (добавляется задачей 2.1)
|
||||||
|
Dockerfile образ сервиса, python:3.11-slim (добавляется задачей 2.2)
|
||||||
|
openspec/ требования и дельта текущего среза (openspec/changes/slice-0-skeleton/)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Предварительные требования
|
||||||
|
|
||||||
|
- **Python 3.11** (версия платформы) и **[`uv`](https://docs.astral.sh/uv/)** — `make venv` создаёт окружение и ставит
|
||||||
|
зависимости через `uv`; `uv` сам подберёт интерпретатор 3.11, системный `python3` другой версии не подойдёт.
|
||||||
|
- **Docker** и compose v2 — для NATS и MinIO (compose лежит в `../docs/dev/`; он же поднимает PostgreSQL для
|
||||||
|
`arm-core`, этому сервису БД не нужна).
|
||||||
|
- `make`.
|
||||||
|
|
||||||
|
Пакеты `raisa_*` из Nexus банка вне банка недоступны: `make venv` пропускает строки `raisa_*` в `requirements.txt`.
|
||||||
|
|
||||||
|
## Команды `make`
|
||||||
|
|
||||||
|
Выполняются из корня репозитория; инструменты берутся из `api/.venv`.
|
||||||
|
|
||||||
|
| Команда | Что делает |
|
||||||
|
|---|---|
|
||||||
|
| `make venv` | создаёт `api/.venv` (Python 3.11) и ставит `requirements.txt` и `requirements-dev.txt` через `uv` |
|
||||||
|
| `make lint` | `ruff check .`, `ruff format --check .`, `mypy src` |
|
||||||
|
| `make test` | `pytest -m "not integration"` — без Docker |
|
||||||
|
| `make test-integration` | `pytest -m integration` — против NATS и MinIO из compose |
|
||||||
|
| `make check` | `make lint` + `make test` (включая идентичность копии контракта с `../docs/contracts`) |
|
||||||
|
| `make check-full` | `make check` + `make test-integration` + `docker build`; запускать перед PR |
|
||||||
|
| `make up` | `docker compose -f ../docs/dev/docker-compose.yml up -d --wait postgres nats minio` |
|
||||||
|
|
||||||
|
Цели `Makefile` появляются в задачах 2.1 (`venv`, `lint`, `test`, `test-integration`, `check`, `up`) и 5.1 (`check-full`).
|
||||||
|
|
||||||
|
## Запуск локально против compose
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd setup
|
make venv
|
||||||
chmod +x setup.sh
|
cp ../docs/dev/.env.example ../docs/dev/.env # один раз: учётные данные и порты compose (в git не попадает)
|
||||||
./setup.sh
|
make up # NATS (4222), MinIO (9000, консоль 9001), бакет arm-ka
|
||||||
|
cp api/.env.example api/.env # один раз: настройки сервиса (в git не попадает)
|
||||||
|
cd api && .venv/bin/python run_server.py
|
||||||
```
|
```
|
||||||
По итогу успешного выполнения Вы получите сообщение следующего
|
|
||||||
|
Значения из `api/.env.example` уже совпадают с `../docs/dev/.env` (стандартные порты и учётные данные compose); править
|
||||||
|
`api/.env` нужно, только если вы меняли порты или пароли compose. Файл `api/.env.example` создаётся задачей 2.2.
|
||||||
|
Подробности про compose, смену портов и сброс — [`../docs/dev/README.md`](../docs/dev/README.md).
|
||||||
|
|
||||||
|
Сервис слушает `0.0.0.0:8000` (`SERVER__HOST`, `SERVER__PORT`). Проверка:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
complete setup web application
|
curl -s localhost:8000/healthcheck
|
||||||
To start api, cd to api directory, and use venv, start run_server.py
|
|
||||||
To start api, cd to web directory, and use command npm run start!
|
|
||||||
Happy Hacking! :)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Далее просто запускайте проекты и приступайте к разработке
|
В ответе — `uptime`, `version` и (после добавления воркера, задача 4.3) `nats`: `ok` — подключён, `down` — включён
|
||||||
|
(`NATS_ENABLED=true`), но связи нет, `off` — выключен.
|
||||||
|
|
||||||
### Backend
|
Если NATS или MinIO недоступны при старте, приложение всё равно поднимается: ошибка логируется, соединение с NATS
|
||||||
|
восстанавливается автоматически (бесконечное автопереподключение).
|
||||||
|
|
||||||
Исходный код API находится в каталоге api. После клонирования репозитория требуется создать виртуальное окружение и установить зависимости, это достигается следующими командами:
|
## Переменные окружения
|
||||||
|
|
||||||
```bash
|
Настройки читает `pydantic-settings` (`api/src/core/config.py`). Вложенные поля задаются через двойное подчёркивание.
|
||||||
cd api
|
Файл окружения выбирается переменной `ENV_FILE` (по умолчанию `.env` в каталоге `api/`, тесты используют `.env.test`).
|
||||||
python -m venv ./.venv
|
|
||||||
cp ./../setup/pip.conf ./.venv/pip.conf
|
|
||||||
source ./.venv/bin/python
|
|
||||||
pip install -r requirements.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
Запуск приложения осуществляется через файл: run_server.py
|
| Переменная | По умолчанию | Назначение |
|
||||||
|
|---|---|---|
|
||||||
В качестве фреймворка ля api используется FastAPI. (Как понятно из названия шаблона) Подробнее ознакомится с возможностями Fast API вы можете в официальной документации: [Fast API документация](https://fastapi.tiangolo.com/)
|
| `OPENBAO__MINIO__MINIO_URL` | — (обязательна) | адрес MinIO без схемы, `host:port` |
|
||||||
|
| `OPENBAO__MINIO__MINIO_ADMIN_LOGIN` | — (обязательна) | логин S3 |
|
||||||
Вы можете дополнительно устанавливать библиотеки необходимые для разработки. Настоятельно не рекомендуется изменять базовые предустановки из файла requirements.txt
|
| `OPENBAO__MINIO__MINIO_ADMIN_PASSWORD` | — (обязательна) | пароль S3 |
|
||||||
|
| `OPENBAO__MINIO__MINIO_BUCKET` | — (обязательна) | бакет (`arm-ka`) |
|
||||||
Базовый шаблон предоставляет минимальный функционал по работе с данными. Далее описаны основные моменты влияющие на работу приложения.
|
| `OPENBAO__MINIO__MINIO_SECURE` | `true` | `true` — https (платформа), `false` — http (MinIO из compose) |
|
||||||
|
| `OPENBAO__NATS__NATS_URL` | — (обязательна) | адрес NATS, `nats://host:4222` |
|
||||||
#### Основная структура проекта
|
| `OPENBAO__NATS__NATS_SEED` | пусто | nkeys seed; пусто вместе с JWT — подключение без аутентификации (dev) |
|
||||||
|
| `OPENBAO__NATS__NATS_JWT` | пусто | JWT пользователя NATS |
|
||||||
```bash
|
| `DEBUG` | `false` | уровень логов DEBUG |
|
||||||
api
|
| `ENV_FILE` | `.env` | путь к файлу окружения (от `api/`) |
|
||||||
├── requirements.txt
|
| `NATS_ENABLED` | `true` | `false` — не подключаться к NATS, воркер не стартует |
|
||||||
├── run_server.py
|
| `WORKER_CONCURRENCY` | `1` | сколько заданий обрабатывается одновременно |
|
||||||
├── src
|
| `PUBLISH_RETRIES` | `3` | попытки публикации ack и результата в NATS |
|
||||||
│ ├── app.py
|
| `DONE_CACHE_SIZE` | `1000` | размер LRU обработанных `job_id` (дедупликация внутри процесса) |
|
||||||
│ ├── __init__.py
|
| `SERVER__HOST` | `0.0.0.0` | адрес привязки HTTP-сервера |
|
||||||
│ ├── settings
|
| `SERVER__PORT` | `8000` | порт HTTP-сервера |
|
||||||
│ │ ├── __init__.py
|
|
||||||
│ │ ├── models.py
|
|
||||||
│ │ └── settings.py
|
|
||||||
└── web
|
|
||||||
```
|
|
||||||
|
|
||||||
Вы можете придерживатся любой структуры проекта, главное, чтобы у Вас присутствовал файл run_server.py. Который запускает web сервер uvicorn или gunicorn. Также обязательно Ваш сервер должен подниматся на определенном хосте и порте. Требуемый хост и порт передаются внутрь через переменные окружения SERVER_HOST, SERVER_PORT
|
|
||||||
|
|
||||||
```python
|
|
||||||
uvicorn.run(
|
|
||||||
app,
|
|
||||||
host=settings.server.HOST,
|
|
||||||
port=settings.server.PORT,
|
|
||||||
lifespan="on"
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Отказ от ui (react)
|
|
||||||
|
|
||||||
Если внутри вашего приложения не требуется добавлять визуальный интерфейс, а Вам требуется исключительно разработать API, то в таком случае не стоит удалять директорию web находящуюся на уровне с директорией api. ТРебуется внести небольшие правки в конфигурацию приложения, в частности в файл: /api/src/app.py, удалив следующее содержимое. В таком случае Fast API сервис не будет обрабатывать статические файлы, от web приложения.
|
|
||||||
|
|
||||||
```python
|
|
||||||
#Подключение собранного web приложения
|
|
||||||
app.mount("/", StaticFiles(directory="web", html=True), name="web")
|
|
||||||
```
|
|
||||||
|
|
||||||
### Frontend
|
|
||||||
|
|
||||||
Исходный код UI находится в каталоге web. После клонирования репозитория требуется установить зависимости, это достигается следующими командами:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd web
|
|
||||||
npm install
|
|
||||||
```
|
|
||||||
|
|
||||||
Запуск приложения осуществляется через файл команду:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm run start
|
|
||||||
```
|
|
||||||
|
|
||||||
В качестве фреймворка для ui используется React. Подробнее ознакомится с возможностями React вы можете в официальной документации: [React документация](https://react.dev/reference/react)
|
|
||||||
|
|
||||||
Вы можете дополнительно устанавливать библиотеки необходимые для разработки. Настоятельно не рекомендуется изменять базовые предустановки из файла package.json
|
|
||||||
|
|
||||||
Базовый шаблон предоставляет минимальный интерфейс по работе с данными. Далее описаны основные моменты влияющие на работу web приложения.
|
|
||||||
|
|
||||||
#### Основная структура проекта
|
|
||||||
|
|
||||||
```bash
|
|
||||||
web
|
|
||||||
├── biome.json
|
|
||||||
├── .npmrc
|
|
||||||
├── dist
|
|
||||||
├── package.json
|
|
||||||
├── postcss.config.cjs
|
|
||||||
├── public
|
|
||||||
│ └── index.html
|
|
||||||
├── README.md
|
|
||||||
├── rsbuild.config.ts
|
|
||||||
├── src
|
|
||||||
│ ├── App.tsx
|
|
||||||
│ ├── config.ts
|
|
||||||
│ ├── env.d.ts
|
|
||||||
│ ├── index.css
|
|
||||||
│ └── index.tsx
|
|
||||||
├── tailwind.config.js
|
|
||||||
└── tsconfig.json
|
|
||||||
```
|
|
||||||
|
|
||||||
Вы можете придерживатся любой структуры проекта, внутри src. Но на верхнем уровне находятся файлы конфигурации и сборки их требуется изменять только в крайнем случае. Для сборки приложения используется [RSBuild](https://rsbuild.dev/)
|
|
||||||
|
|
||||||
Для создания UI настоятельно рекомендуется использовать предустановленную библиотеку компонентови стилей:
|
|
||||||
|
|
||||||
- tailwindcss
|
|
||||||
- daisy-ui
|
|
||||||
- react-daisy-ui
|
|
||||||
- raisa-ui
|
|
||||||
|
|
||||||
!!! Важно, если внутри web приложения Вы хотите обращатся к API данного проекта, используйте следующую конструкцию:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
|
|
||||||
fetch(`${Config.API_URL}/api`, {
|
|
||||||
headers: {
|
|
||||||
'Accept': 'application/json',
|
|
||||||
'Content-Type': 'application/json'
|
|
||||||
},
|
|
||||||
method: 'GET'
|
|
||||||
})
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
Речь идет об вызываемом эндпоинте ${Config.API_URL}/api, Обязательно используйте конструкцию данного вида т.к. при сборке приложения статический сайт обращается относительно api и вместо
|
|
||||||
запросов вида http://localhost:8000/api должно быть так: /api
|
|
||||||
|
|
||||||
|
Имя сервиса в конвертах контракта (`service.name`) и имя queue group — `tabular-parser` (`SERVICE_NAME`, менять не нужно).
|
||||||
|
|||||||
@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
### Task 3: [1.3] `README.md` — описание сервиса (назначение, команды `make`, env, запуск против c
|
### Task 3: [1.3] `README.md` — описание сервиса (назначение, команды `make`, env, запуск против c
|
||||||
|
|
||||||
- [ ] `README.md` — описание сервиса (назначение, команды `make`, env, запуск против compose), `CLAUDE.md` — актуализировать раздел «Соглашения шаблона» по факту вырезанного; проверка: все упомянутые файлы существуют
|
- [x] `README.md` — описание сервиса (назначение, команды `make`, env, запуск против compose), `CLAUDE.md` — актуализировать раздел «Соглашения шаблона» по факту вырезанного; проверка: все упомянутые файлы существуют
|
||||||
|
|
||||||
### Task 4: [2.1] `api/pyproject.toml` (ruff
|
### Task 4: [2.1] `api/pyproject.toml` (ruff
|
||||||
|
|
||||||
|
|||||||
@ -13,7 +13,7 @@
|
|||||||
`SERVICE_NAME="tabular-parser"`, `NATS_ENABLED=true`, `WORKER_CONCURRENCY=1`, `PUBLISH_RETRIES=3`, `DONE_CACHE_SIZE=1000`;
|
`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`;
|
`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`, `/healthcheck` 200
|
проверка: `pip install -r requirements.txt` в чистом venv (python3.11), `python run_server.py` стартует c `.env.example`, `/healthcheck` 200
|
||||||
- [ ] 1.3 `README.md` — описание сервиса (назначение, команды `make`, env, запуск против compose), `CLAUDE.md` — актуализировать
|
- [x] 1.3 `README.md` — описание сервиса (назначение, команды `make`, env, запуск против compose), `CLAUDE.md` — актуализировать
|
||||||
раздел «Соглашения шаблона» по факту вырезанного; проверка: все упомянутые файлы существуют
|
раздел «Соглашения шаблона» по факту вырезанного; проверка: все упомянутые файлы существуют
|
||||||
|
|
||||||
## 2. Инструменты
|
## 2. Инструменты
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user