Files
medtech-hackathon/scripts/proof/extract_all.py
T
admins 69a9884db5 feat(ingest+поиск): приём ZIP через интерфейс, регистронезависимый поиск, чистка очереди
- Загрузка архива (§4.1): POST /ingest распаковывает ZIP, дораспознаёт и
  догружает прайсы в базу (append). Виджет в админке. Кэш эмбеддингов справочника
  (dict_emb.npy) — догрузка считает только новый файл, эмбеддинги best-effort с
  откатом на fuzzy при сбое Gemini.
- Поиск по name_norm (lowercase): «УЗИ» и «узи» дают одинаковый результат —
  SQLite LIKE не сворачивает регистр для кириллицы.
- Фильтр названий: код-мнемоники («МОЗО.15») больше не попадают в очередь.
- /stats считается из базы — цифры на дашборде обновляются после загрузки.
- Деплой через Dockerfile (зависимости в образе, код монтируется томом).
- ruff: ядро и весь репозиторий проходят проверку.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 11:35:12 +05:00

30 lines
1.0 KiB
Python

"""Прогон извлечения по всему архиву: сколько позиций берёт каждый формат."""
import sys
from pathlib import Path
REPO = Path(__file__).resolve().parents[2]
sys.path.insert(0, str(REPO))
from etl.extractors import extract
files = sorted((REPO / "data/raw").glob("*"))
total = 0
for path in files:
doc = extract(str(path))
total += len(doc.rows)
tiers = sorted({t for row in doc.rows for t in row.prices})
print(f"\n{'=' * 68}")
print(
f"{path.name} [{doc.file_format}] партнёр='{doc.partner_name}' дата={doc.effective_date}"
)
print(f" позиций: {len(doc.rows)} | тарифы: {tiers}")
if doc.parse_log:
print(f" лог: {doc.parse_log[:2]}")
for row in doc.rows[:3]:
print(
f" код={row.service_code_source!r} «{row.service_name_raw[:40]}» {row.prices} секц={row.section!r}"
)
print(f"\n{'=' * 68}\nИТОГО позиций по архиву: {total}")