Skip to content

refactor: разделить снапшот, поллинг и escape-проверку в _download_current_view #48

Description

@axisrow

Часть эпика #40.

Что сделать

_download_current_view (collector.py:1247, 99 строк) совмещает три механизма:

  1. снапшот-диффинг каталога загрузок (_resolved_file_snapshot, дедуп /tmp vs /private/tmp);
  2. поллинг появления нового файла с шагом 0.25 s до таймаута;
  3. проверка «файл не убежал за пределы каталога» (DownloadEscapedError, история Скачанный CSV уходит в ~/Downloads мимо каталога прогона; сбой на одном виде обнуляет весь результат #27).

Разделить на три различимые части. Особое внимание — п. 3: сейчас логика «escape замечен в том же тике, что и успешная загрузка» встроена в общий поток и снабжена длинным пояснением, почему её нельзя проверять только при отсутствии CSV.

Файлы

  • src/wordstat/collector.py
  • tests/test_collector_batch.py

Требования

  • Чистый рефакторинг, поведение не меняется.
  • Инварианты:
    • DownloadNoNewPathError (подтип DownloadTimeoutError) отличается от «скачалось больше одного CSV» — на этом различии держится восстановление после перезаписи файла тем же именем (PR fix: keep collecting after empty top retry timeout #39);
    • session.downloaded_files — лог за всё время сессии, а не за текущий вызов; фильтрация по каталогу обязательна;
    • escape, замеченный в одном тике с успешной загрузкой, не теряется: он больше нигде не всплывёт.
  • ruff check . чист; мутации по границам.

Оценка

LOC ~150–250 (код ~90, тесты ~110)
Размер M
Код 35–55 мин
Review 25–40 мин
Итого 60–95 мин

Множитель +20%: файловые гонки и escape-логика требуют аккуратных тестов; область уже была источником двух багов (#27, #38).

Приоритет: low — функция сложная, но стабильная; трогать её стоит последней, когда остальной рефакторинг устоится.

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