perf(media): хелпер путей медиа-кеша + in-memory MIME-кеш на горячем пути /media #46

Merged
agent_coder merged 2 commits from fix/26-media-hotpath into main 2026-07-10 03:30:06 +03:00

2 Commits

Author SHA1 Message Date
agent_coder f559d39e33 test(media): покрыть magic-detect cold-start путь + запатчить MEDIA_CACHE_DIR в двух chdir-тестах (ревью #46)
Docker Image CI / build (pull_request) Waiting to run
- test_stage_e_media_hotpath: добавлен тест cold-start magic-пути (dict-miss ->
  SQLite-miss -> magic_mime.from_file -> write-through в ОБА кеша). Раньше все
  тесты мокали get_mime_type_sync с возвратом (SQLite-hit), magic-ветка не
  исполнялась — мутационно подтверждено (закомментировать dict-write на magic
  пути -> тесты зелёные). Новый тест ассертит set_mime_type_sync И _mime_types[key].
- test_stage7_integration: два chdir-теста (:220, :251) не патчили MEDIA_CACHE_DIR
  -> латентная зависимость от реального data/cache репо (MEDIA_CACHE_DIR теперь
  import-time). Добавлен monkeypatch.setattr как в 4 соседних тестах.

Только тесты; прод-код не тронут.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 01:29:02 +03:00
agent_coder 7e17b6e5b8 perf(media): хелпер путей медиа-кеша + in-memory MIME-кеш на горячем пути /media
Docker Image CI / build (pull_request) Waiting to run
Задание 15: MEDIA_CACHE_DIR (резолвится один раз при импорте) + media_cache_path(
channel, post_id, fid=None) -> <root>/<channel>/<post_id>[/<fid>] как единый
источник истины формата пути. Заменены все ручные сборки os.path.abspath('./data/
cache')+join (7 мест); строки путей дословно идентичны (drop-in). remove_old_
cached_files_sync/download_new_files сохраняют параметр cache_dir (тестируемость).

Задание 16: in-memory _mime_types (bound _MIME_CACHE_MAX=50000, clear() при
переполнении) перед SQLite в prepare_file_response. Порядок: dict -> SQLite ->
python-magic; SQLite-хит и magic-детект наполняют dict. MIME по file_unique_id
иммутабелен -> повторный /media-хит не открывает SQLite-соединение (ни на чтение
MIME, ни на запись access-time — она уже в аккумуляторе). Кэшируются только
реальные типы.

closes #26

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 00:57:32 +03:00