docs: докстринги контракта с точки зрения tabular-parser, паритет subjects с arm-core (T6.1-T6.3)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
6491fdd538
commit
67a4311150
@ -1,8 +1,9 @@
|
|||||||
"""Запрос распознавания файла (arm-core → tabular-parser / scan-gateway): `recognition-request.schema.json` v1.0.
|
"""Запрос распознавания файла: `recognition-request.schema.json` v1.0.
|
||||||
|
|
||||||
Формируется из `recognition_job ⋈ stored_file ⋈ s3_object` (spec recognition-job-exchange); один файл — один job.
|
tabular-parser принимает этот запрос из `recognition.tabular.request` (производитель — arm-core); один файл — один job.
|
||||||
Subject — по `pipeline` (`request_subject`); заголовок `Nats-Msg-Id = <job_id>:<attempt>`
|
Модель намеренно совпадает с копией в arm-core (контракт — `../docs/contracts`, обзор —
|
||||||
(`request_msg_id`) — не поле тела.
|
`docs/context/03-architecture.md`). Subject — по `pipeline` (`request_subject`); заголовок
|
||||||
|
`Nats-Msg-Id = <job_id>:<attempt>` (`request_msg_id`) — не поле тела.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from typing import Annotated, Literal
|
from typing import Annotated, Literal
|
||||||
|
|||||||
@ -1,7 +1,9 @@
|
|||||||
"""Файл результата в S3 (`results/{file_id}/{job_id}/result.json`): `recognition-result.schema.json` v1.0.
|
"""Файл результата в S3 (`results/{file_id}/{job_id}/result.json`): `recognition-result.schema.json` v1.0.
|
||||||
|
|
||||||
Один файл → один job → N документов (ОСВ по счёту / ББ / ОФР / прочее). В Срезе 0 — модели и валидация примеров;
|
tabular-parser формирует этот файл по запросу; один файл → один job → N документов (ОСВ по счёту / ББ / ОФР / прочее).
|
||||||
маппинг в таблицы — Срез 2. Суммы — `Decimal` в модели и строка в JSON (`"106311116.46"`, без `float`).
|
Модель намеренно совпадает с копией в arm-core (контракт — `../docs/contracts`, обзор —
|
||||||
|
`docs/context/03-architecture.md`).
|
||||||
|
Суммы — `Decimal` в модели и строка в JSON (`"106311116.46"`, без `float`).
|
||||||
Нормализация счетов, резолв контрагентов и проверки — в arm-core, не здесь.
|
Нормализация счетов, резолв контрагентов и проверки — в arm-core, не здесь.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,10 @@
|
|||||||
Источник: `docs/context/03-architecture.md`, «Контракт обмена через NATS»; схема recognition-request
|
Источник: `docs/context/03-architecture.md`, «Контракт обмена через NATS»; схема recognition-request
|
||||||
(`Nats-Msg-Id = <job_id>:<attempt>`) и recognition-result-message
|
(`Nats-Msg-Id = <job_id>:<attempt>`) и recognition-result-message
|
||||||
(`ack:<job_id>:<attempt>` / `result:<job_id>:<attempt>`).
|
(`ack:<job_id>:<attempt>` / `result:<job_id>:<attempt>`).
|
||||||
|
|
||||||
|
Модуль намеренно совпадает с копией в arm-core. `request_subject`, `REQUEST_SUBJECTS`, `IMAGE_REQUEST_SUBJECT` и
|
||||||
|
значение `"image"` в `Pipeline` tabular-parser не использует (он слушает только `tabular`) — это сознательный паритет
|
||||||
|
с arm-core, а не мёртвый код.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import uuid
|
import uuid
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
"""Контракт обмена с сервисами распознавания v1.0 (spec recognition-contract, design D-7).
|
"""Контракт обмена с сервисами распознавания v1.0.
|
||||||
|
|
||||||
|
Спека сервиса — `tabular-recognition-service`; change `recognition-contract` лежит в `../docs`.
|
||||||
Быстрые тесты без БД: вендоренные схемы `api/contracts/` идентичны `../docs/contracts/`; каждый пример проходит и
|
Быстрые тесты без БД: вендоренные схемы `api/contracts/` идентичны `../docs/contracts/`; каждый пример проходит и
|
||||||
JSON Schema, и pydantic-модель (с round-trip); модели и схемы выносят один и тот же вердикт на негативных кейсах.
|
JSON Schema, и pydantic-модель (с round-trip); модели и схемы выносят один и тот же вердикт на негативных кейсах.
|
||||||
"""
|
"""
|
||||||
@ -598,7 +599,7 @@ def test_python_float_amount_is_rejected_with_clear_error() -> None:
|
|||||||
|
|
||||||
|
|
||||||
def test_decimal_object_input_is_accepted_and_dumped_as_string() -> None:
|
def test_decimal_object_input_is_accepted_and_dumped_as_string() -> None:
|
||||||
"""Для кода, собирающего результат из `Decimal` (тесты, будущие производители): объект `Decimal` принимается."""
|
"""Для кода, собирающего результат из `Decimal` (тесты, парсер при сборке результата): `Decimal` принимается."""
|
||||||
payload = _example("result-statement-minimal.json")
|
payload = _example("result-statement-minimal.json")
|
||||||
payload["documents"][0]["lines"][0]["values"][0]["amount"] = Decimal("1234.50")
|
payload["documents"][0]["lines"][0]["values"][0]["amount"] = Decimal("1234.50")
|
||||||
result = RecognitionResult.model_validate(payload)
|
result = RecognitionResult.model_validate(payload)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user