- копия схем и примеров контракта v2.0 (запрос остаётся v1.0), модели result/common/message/request; ResultWarning/FileWarning, статус и предупреждения у документов, строки forms v2.0, service.statements_version - statements/pipeline.py: кандидаты адаптера -> normalize_candidate -> to_contract / warning_to_contract - BookParser: статус книги через envelope_status, SHEET_OTHER / FILE_TYPE_MISMATCH / XLS_NO_CODEPAGE как предупреждения файла, OSV_* и OSV_XLSB_NO_OUTLINE в документах ОСВ, тексты иерархии по спеке - воркер, app и CLI получают statements_version из require_statements_version() - старые модели документа формы вынесены в statements/legacy_models.py до удаления старого конвейера (задача 9) - OpenSpec: MODIFIED «Парсер — заменяемый интерфейс» в дельте tabular-recognition-service Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
50 lines
2.0 KiB
Python
50 lines
2.0 KiB
Python
"""Читатели на реальных ОСВ из ../fixtures: все 66 файлов читаются быстро, outline и merged на месте."""
|
||
|
||
import time
|
||
from pathlib import Path
|
||
from typing import cast
|
||
|
||
import pytest
|
||
|
||
from src.contract import FileType
|
||
from src.parser.readers import read_book, read_book_detected
|
||
|
||
READ_SECONDS_LIMIT = 5.0
|
||
NAMED_XLS = "osv/schastl/2024-Q3/Оборотносальдовая ведомость по счету 62 за 3 квартал 2024 г..xls"
|
||
# Строка 15 (1-based) — контрагент «МАЛЕЧКИНСКАЯ ПТИЦЕФАБРИКА ООО» под 62 → 62.01 → «БП Аренда»
|
||
NAMED_XLS_ROW = 15
|
||
NAMED_XLS_OUTLINE = 3
|
||
|
||
|
||
@pytest.mark.fixtures
|
||
def test_real_file_is_read_quickly_with_outline_and_merged(osv_file: Path) -> None:
|
||
data = osv_file.read_bytes()
|
||
started = time.perf_counter()
|
||
|
||
sheets, warnings = read_book(data, cast(FileType, osv_file.suffix.lstrip(".").upper()))
|
||
|
||
assert time.perf_counter() - started < READ_SECONDS_LIMIT
|
||
assert warnings == []
|
||
assert sheets
|
||
assert any(sheet.row_outline for sheet in sheets)
|
||
assert all(level >= 1 for sheet in sheets for level in sheet.row_outline.values())
|
||
assert any(sheet.merged for sheet in sheets)
|
||
assert any(sheet.cells for sheet in sheets)
|
||
|
||
|
||
@pytest.mark.fixtures
|
||
def test_named_xls_outline_level(fixtures_dir: Path) -> None:
|
||
sheets, _ = read_book((fixtures_dir / NAMED_XLS).read_bytes(), "XLS")
|
||
|
||
sheet = sheets[0]
|
||
assert sheet.cell(NAMED_XLS_ROW, 1).text == "МАЛЕЧКИНСКАЯ ПТИЦЕФАБРИКА ООО"
|
||
assert sheet.outline(NAMED_XLS_ROW) == NAMED_XLS_OUTLINE
|
||
|
||
|
||
@pytest.mark.fixtures
|
||
def test_biff8_content_with_xlsx_file_type_is_read_as_xls(fixtures_dir: Path) -> None:
|
||
read = read_book_detected((fixtures_dir / NAMED_XLS).read_bytes(), "XLSX")
|
||
|
||
assert read.mismatch == "file_type=XLSX, но содержимое BIFF8: прочитано как XLS"
|
||
assert read.sheets[0].outline(NAMED_XLS_ROW) == NAMED_XLS_OUTLINE
|