Срез 2a: парсер ОСВ из XLS/XLSX/XLSB — динамическое обнаружение структуры (§1), контракт v1.1, golden на 66 реальных файлах #6
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/5-slice-2a-osv-parser"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #5. Спека и реализация подсреза 2a (решение владельца 05.10.2026: только парсер ОСВ). 45 коммитов: 14 задач плана + финальное ревью (opus) и волны правок.
Что в PR
api/src/parser/: модель листаSheetи читатели xlsx (openpyxl), xls (xlrd), xlsb (pyxlsb); детекторы листов/заголовка/колонок по содержимому; шапка иgroup_schema(варианты 1 и 2); каскад иерархии outline → indent → account_pattern → sums (+trivialдля пустой ОСВ); классификация строк поgroup_schema, буквенные субсчета (76.АВ), ИНН из колонки ИНН; Decimal из числовых и текстовых ячеек; контрольные суммы §1.4 →done/needs_check; карта статусов и кодов; лимитыPARSE_MAX_BYTES50 МиБ,PARSE_TIMEOUT_SECONDS120 (кооперативный дедлайн), предсканирование xlsx (несжатый размер, площадь merged, expat по всем частям архива) и потолок крупных merged в xls.api/rules/*.yaml(заголовки, группировки, периоды, типы данных и валюты) с pydantic-валидацией и тестом покрытия; AST-линтер «нет координат вsrc/parser/».rows[].extra),CONTRACT_VERSION = "1.1", копия схемы и примеров.get_parser()→OsvParser, CLIpython -m src.parser.cli <файл>, интеграционный сценарий «реальная ОСВ через воркер».make golden-check/golden-update), fixtures 808, integration 9. Ledger —docs/superpowers/plans/2026-10-05-slice-2a-osv-parser-ledger.md.Проверки (HEAD
1eb57da)make check: ruff/format/mypy чисто, 1818 passed;make golden-check: 82/82 без изменений;pytest -m fixtures: 808 passed;make test-integration: 9 passed;openspec validate --strict: valid. Самый долгий реальный файл ≈ 0,6 с (лимит 5 с).Финальное ревью (opus): Critical — нет; Important I-1 (лимиты чтения xlsx) закрыт в три волны, I-2 закрыт; Minor M-1, M-3 закрыты, M-2, M-4…M-7 отложены (OQ-106…109).
Rulings I made (design.md №11–39, ключевые)
hierarchy=trivial); R-14: «Итого» всегда уровень 0; R-20: без «Итого» →needs_check.OTHERсdata_typeCURRENCY/QUANTITY, без наследования контрагента.defusedxmlне добавлен (решение платформы).Deferred (в follow-up issue при закрытии)
defusedxml, версия expat в образе (OQ-108); размер объекта S3 до скачивания (M-7, OQ-109); реальный xlsb из Excel (OQ-102).hierarchy=sums).sums.Порядок merge: RSHB/arm-ka-fixtures#5 и RSHB/arm-ka-docs#10 — до этого PR (golden и тест идентичности контракта). После merge — bounded-PR копии контракта v1.1 в arm-core и правка Purpose в
openspec/specs/tabular-recognition-serviceпри архивировании.🤖 Generated with Claude Code
https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Срез 2a: парсер ОСВ (§1) — спека OpenSpecto Срез 2a: парсер ОСВ из XLS/XLSX/XLSB — динамическое обнаружение структуры (§1), контракт v1.1, golden на 66 реальных файлахСловари api/rules/{osv_headers,osv_groups,periods,data_types}.yaml и src/parser/rules.py (normalize_text, Pattern, load_rules, pydantic-валидация с RuntimeError по файлу и ключу, currency_aliases по R-6). AST-линтер координат tests/unit/parser/test_no_coordinates.py перенесён из Task 12 (R-7, правила R-4/R-5). Тест формулировок реальных ОСВ. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2