- Добавлена FixtureIndex с индексированием по sha256 содержимого файлов (не-JSON)
- build_index() строит индекс один раз, refresh() обновляет только при изменении списка файлов
- resolve_stem() находит основу имени по хешу, при промахе возвращает default или (None, "none")
- process_once() принимает параметр index и default, работает с файлами <uuid>.<ext>
- Пропускаются dot-файлы, *.part, *.tmp, *.done (Review Focus 5)
- Сообщение об ошибке: "{sha256[:12]}: нет пары по содержимому в фикстурах"
- EmulatorSettings.default = "" для SCAN_EMULATOR_DEFAULT
- Логирование источника пары: hash / default / none
- Все 909 тестов зелёные, включая 54 новых и переписанных тестов эмулятора
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
69 lines
5.3 KiB
Plaintext
69 lines
5.3 KiB
Plaintext
# Локальное окружение scan-gateway. Скопируйте в .env: cp .env.example .env (.env в git не попадает)
|
||
# Значения совпадают с ../docs/dev/docker-compose.yml и ../docs/dev/.env (compose: NATS 4222, MinIO 9000, бакет arm-ka);
|
||
# это только dev-умолчания. Файл окружения можно выбрать переменной ENV_FILE (по умолчанию .env, путь от каталога api/);
|
||
# переменные окружения приоритетнее файла. Тестовый набор — .env.test (его подключает pytest.ini).
|
||
|
||
DEBUG=true
|
||
|
||
# --- MinIO (S3): единственный бакет, в нём лежат входные файлы, raw/{job_id}.json и results/ ---
|
||
# Адрес без схемы (host:port) — так ждёт miniopy-async; MinIO из compose работает по http, поэтому MINIO_SECURE=false.
|
||
# На платформе MINIO_SECURE не задаётся (по умолчанию true — https).
|
||
OPENBAO__MINIO__MINIO_URL=localhost:9000
|
||
OPENBAO__MINIO__MINIO_ADMIN_LOGIN=minioadmin
|
||
OPENBAO__MINIO__MINIO_ADMIN_PASSWORD=minioadmin
|
||
OPENBAO__MINIO__MINIO_BUCKET=arm-ka
|
||
OPENBAO__MINIO__MINIO_SECURE=false
|
||
|
||
# --- NATS (core, без JetStream) ---
|
||
# NATS_SEED / NATS_JWT пустые: подключение без nkeys (локальная разработка, тесты). На платформе их выдаёт OpenBAO.
|
||
OPENBAO__NATS__NATS_URL=nats://localhost:4222
|
||
OPENBAO__NATS__NATS_SEED=
|
||
OPENBAO__NATS__NATS_JWT=
|
||
|
||
# Включает подписку на recognition.image.request. false — воркер не запускается (сервис поднимется без NATS).
|
||
NATS_ENABLED=true
|
||
# PUBLISH_RETRIES — число повторов публикации ack/результата в NATS после первой попытки (при 3 — до 4 попыток всего);
|
||
# DONE_CACHE_SIZE — размер LRU обработанных job_id (защита от повторной доставки запроса)
|
||
PUBLISH_RETRIES=3
|
||
DONE_CACHE_SIZE=1000
|
||
|
||
# --- Горячие папки ИС Сканирование ---
|
||
# local — обычный каталог (dev, тесты, эмулятор); smb — SMB-шара платформы (нужен блок OPENBAO__SMB__* ниже).
|
||
SCAN_HOTFOLDER_MODE=local
|
||
# Корень горячей папки в режиме local: каталог должен существовать (mkdir -p .hotfolder).
|
||
# Путь считается от каталога api/; его же читает эмулятор.
|
||
SCAN_HOTFOLDER_PATH=./.hotfolder
|
||
# Подкаталоги корня: «Входящие» (сюда кладётся UUID_имя) и «Исходящие» (оттуда забираются все *.json из <UUID>/)
|
||
SCAN_INPUT_DIR=Input
|
||
SCAN_OUTPUT_DIR=Output
|
||
# Служебный каталог корня: временный .part пишется сюда и переименовывается во «Входящие» (та же ФС/шара — rename
|
||
# атомарен, во «Входящих» не бывает недописанных файлов); создаётся при первой записи
|
||
SCAN_TMP_DIR=Tmp
|
||
# Период опроса «Исходящих», секунды
|
||
SCAN_POLL_SECONDS=5
|
||
# Набор *.json в <UUID>/ считается готовым, когда имена и размеры файлов не менялись столько секунд (>= 0)
|
||
SCAN_SETTLE_SECONDS=2
|
||
# Потолок ожидания ответа ИС, секунды (дополнительно ограничен reply_deadline запроса); повторной отправки нет
|
||
SCAN_TIMEOUT_SECONDS=300
|
||
# Сколько заданий обрабатывается одновременно
|
||
SCAN_MAX_INFLIGHT=4
|
||
|
||
# --- SMB (только при SCAN_HOTFOLDER_MODE=smb; в режиме local весь блок не нужен) ---
|
||
# OPENBAO__SMB__SMB_HOST=smb.example.local
|
||
# OPENBAO__SMB__SMB_PATH=share/scan
|
||
# OPENBAO__SMB__SMB_LOGIN=user
|
||
# OPENBAO__SMB__SMB_PASSWORD=password
|
||
|
||
# --- Эмулятор ИС Сканирование (python -m src.scan_emulator, make emulator; только dev) ---
|
||
# Эти параметры читает сам эмулятор, сервис шлюза их не использует. Корень горячей папки и подкаталоги
|
||
# эмулятор берёт из SCAN_HOTFOLDER_PATH / SCAN_INPUT_DIR / SCAN_OUTPUT_DIR выше; набор ответа на задание он собирает
|
||
# во временном каталоге SCAN_TMP_DIR (выше) и переименовывает в <Output>/<uuid>/ целиком.
|
||
# Каталог с фикстурами ответов ИС (aep_N.json); путь от api/ (репозиторий fixtures лежит рядом с workspace)
|
||
SCAN_FIXTURES_DIR=../../fixtures/ocr
|
||
# Задержка перед выдачей ответа, секунды (имитация работы ИС)
|
||
SCAN_EMULATOR_DELAY=2
|
||
# Период опроса входящего каталога эмулятором, секунды (> 0)
|
||
SCAN_EMULATOR_POLL_SECONDS=1
|
||
# набор ответа по умолчанию при промахе по содержимому (основа имени фикстуры, например aep_6); пусто — INVALID_DOCUMENT
|
||
SCAN_EMULATOR_DEFAULT=
|