6.0 KiB
6.0 KiB
ISSUES — Задачи и баг-трекер
Высокий приоритет
run_morningfallback может отправить дайджест в несколько каналов — при неудаче в_target_channel_idперебираетbot.get_all_channels()и шлёт в первый доступный. Пользователь получит сообщение не там, где ожидает (utils/morning_runner.py,_run_morning)!nw: последовательные вызовы API вместо параллельных —fetch_rss(RSS_URL_ARTICLES)ждёт, затемfetch_rss(RSS_URL_POSTS). В!morningиспользуетсяasyncio.gather(). Привести!nwк тому же паттерну (commands/news.py)format_weather_data_for_consoleвыводитNoneв текст — если API вернётnullдля поля (temp_C,FeelsLikeC),dict.get()вернётNoneи f-string покажет"None°C". Добавить проверку наNone(utils/pogoda.py)
Средний приоритет
_parse_dateхрупкий fallback —pub_date[:10].replace("-", ".")для невалидной строки вернёт мусор (например"invalid.da"). Добавить валидацию формата (utils/news.py)wmo_to_russianсоздаёт dict на каждый вызов — mapping из 30+ элементов пересоздаётся. Вынести в модульную константу (utils/pogoda.py)TextHelpCommandпропускает команды без cog —if cog_or_none is None: continueскроет standalone-команды из справки (bot.py)translate_weather(" ")возвращает пробелы вместо"—"— строка из пробелов не считается пустой, проходит через mapping без совпадений и возвращается как есть (utils/pogoda.py)pressure_to_mmhg(mb: Any)—Anyскрывает контракт. Заменить наfloat | int | str | None(utils/pogoda.py)
Низкий приоритет
conftest.pyиbot.pyдублируют monkey-patch — идентичныйasyncio.iscoroutinefunction = ...в двух файлах. Вынести вcompat.pyRateLimiterтесты зависят от реального времени —time.monotonic()в_refillделает тесты потенциально flaky на медленном CI. Добавитьtime.monotonicmockDockerfileне копируетconftest.py—COPYпропускаетconftest.py. Тесты в контейнере упадут без monkey-patchrequirements.txtбез пиннинга версий —>=допускает мажорные обновления. Для production использовать==или~=- Закомментированный тест
pressure_to_mmhg(0)вводит в заблуждение —(0, "\u2014"), # 0 — falsy, возвращается '\u2014' (баг)закомментирован, ноtest_pressure_zeroпроходит. Удалить закомментированную строку (tests/test_pogoda.py) format_articles(None)бросаетTypeError— нет валидацииarticlesнаNone. Вызывает краш вместо graceful fallback (utils/news.py)
Исправлено
Эмодзи в embed-сообщениях— удалены🌅,✅,❌изutils/morning_runner.pyf-string в logger— замена на%-формат вbot.py— перенесён на уровень модуля вimport timeвнутри__init__bot.pyПроверка наличия—.env.envв.gitignore, есть.env.exampleКоманда— удалена из проекта!msgв BotRunnerОтсутствует— файл существует.gitignoreОтсутствует Dockerfile— файл существуетОтсутствует— файл существует.env.example- Type hints в production-коде — добавлены аннотации ко всем 20 функциям
asyncio.iscoroutinefunctiondeprecated — monkey-patch вbot.py+conftest.py- Утечка корутины Scheduler в тестах — mock
_start_schedulerвместоasyncio.create_task - Graceful shutdown (SIGTERM) — реализован через
on_shutdownlistener +async with self.bot - Пустой
__init__в Morning — удалён - Global RateLimiter на модульном уровне — добавлены factory-функции
make_*_limiter() - Type hints в тестах — добавлены
-> Noneко всем 140 test-функциям importвнутри функций в тестах — вынесены наверх модулей (35 вхождений)- Добавить pre-commit хуки —
.pre-commit-config.yaml(ruff + ruff-format),requirements-dev.txt - Интеграционные тесты — 9 тестов загрузок когов, команд и утилит
format_weather_for_embedотсутствует в коде — заменено наformat_weather_for_messageв README.md (README.md)_WEATHER_MAPPINGне отсортирован по убыванию длины ключей — отсортирован список по убываниюlen(key), добавлен комментарий (utils/pogoda.py)- Глобальные
requests.Sessionне закрываются — добавленаclose_all_sessions()вutils/__init__.py, вызов из_on_shutdownвbot.py