Skip to content

refactor: разбить цикл видов в _collect_one (293 -> <=80 строк) #45

Description

@axisrow

Часть эпика #40. Делать после подзадачи про подготовку прогона.

Что сделать

Ядро _collect_one — цикл for view_index, view in enumerate(pending_views): на 112 строк с двумя вложенными try и логикой пяти разных обязанностей:

  1. переключение вида и скачивание;
  2. проверка принадлежности экспорта (после bug: скачанный CSV может принадлежать не тому виду — top_popular.csv с related-заголовком #41 — ещё и сверка фразы);
  3. ретрай пустого экспорта (уже вынесен в _retry_empty_export, PR fix: keep collecting after empty top retry timeout #39);
  4. запись parquet и финализация raw;
  5. обработка сбоя одного вида (view_errors, спасение CSV, пропуск остальных).

Выделить п. 1–2 и п. 4 в отдельные функции; п. 5 — в собственный обработчик. Цель: тело цикла читается как последовательность именованных шагов, каждый вложенный try живёт внутри своей маленькой функции.

Целевой размер _collect_one — ≤ 80 строк (сейчас 293).

Файлы

  • src/wordstat/collector.py — _collect_one, новые helper'ы
  • tests/test_collector_batch.py

Требования

  • Чистый рефакторинг, поведение не меняется; существующие тесты зелёными без правок (кроме переехавших приватных имён — перечислить).
  • Инварианты, которые нельзя растерять (каждый документирует реальный баг):
    • порядок «скачать → распарсить → записать parquet → убрать raw» — при CsvFormatError CSV обязан остаться на диске;
    • fail-closed для dynamics (_is_untrustworthy_empty_export);
    • изоляция сбоя вида: одна упавшая вкладка не роняет фразу, остальные виды собираются;
    • спасение source в run-каталог при любом сбое после скачивания.
  • ruff check . чист.
  • Мутации по границам try/finally обязательны.

Оценка

LOC ~250–400 (код ~160, тесты ~190)
Размер L
Код 60–90 мин
Review 40–60 мин
Итого 100–150 мин

Множитель +20%: горячий путь с обработкой ошибок, тесты на изоляцию сбоев требуют отдельных сценариев на каждый вид. Лимит 1000 строк не достигается.

Приоритет: high — это и есть главная цель эпика.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions