arm-tabular-parser/api/tests/statement_helpers.py
Andrey Epifancev 07d57cbd07 test(statements): манифест реальных форм, property-тест, golden форм, покрытие словарей форм
Манифест statements_manifest.yaml по 18 реальным файлам statements-xlsx (сверен
прогоном парсера, R-13, OQ-137), property-тест по манифесту, снимки форм в
golden_helpers/golden_update/test_golden, словари форм в покрытии, синтетика
st06 для вариантов заголовков. Мёртвые записи словаря удалены (name_caption,
метки okved и okud_label) либо покрыты st06.

Refs #14

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 20:50:25 +04:00

42 lines
1.3 KiB
Python

"""Манифест ожиданий по реальным формам `fixtures/statements-xlsx/**` (`statements_manifest.yaml`)."""
from functools import cache
from pathlib import Path
from typing import Literal
import yaml
from fixtures_helpers import STATEMENTS_DIR
from pydantic import BaseModel, ConfigDict
MANIFEST_PATH = Path(__file__).resolve().parent / "statements_manifest.yaml"
class DocumentExpectation(BaseModel):
model_config = ConfigDict(extra="forbid", frozen=True)
type: Literal["BALANCE", "INCOME", "DISCLOSURE"]
status: Literal["done", "needs_check"]
complete: bool
reason: str | None = None
sheets: int | None = None
class Expectation(BaseModel):
model_config = ConfigDict(extra="forbid", frozen=True)
organization: str | None = None
inn: str | None = None
inn_optional_for: tuple[str, ...] = ()
documents: list[DocumentExpectation]
@cache
def load_manifest() -> dict[str, Expectation]:
"""Ожидания по файлам; ключ — путь относительно `statements-xlsx/` (posix)."""
raw = yaml.safe_load(MANIFEST_PATH.read_text(encoding="utf-8"))
return {key: Expectation.model_validate(value) for key, value in raw["files"].items()}
def relative_key(fixtures_dir: Path, path: Path) -> str:
return path.relative_to(fixtures_dir / STATEMENTS_DIR).as_posix()