Тест не найден в проекте и в git-истории — вероятно не был реализован. Закрыто как неактуальное.
9.0 KiB
9.0 KiB
ISSUES — Задачи и баг-трекер
Открытые задачи
Средний приоритет
-
Отсутствует— созданpyproject.tomlpyproject.toml,Dockerfileобновлён (81a99aa) -
— добавленScheduler._taskбезadd_done_callback_on_task_donecallback (8b59ddb) -
Тест— тест не найден в проекте, вероятно не был реализован. Закрыто как неактуальное.test_fetch_weather_http_error_no_fallback
Низкий приоритет
-
— заменено наcommands/stats.py— list comprehension вместо generatorsum(1 for ...)(4f2e3ec) -
— объединено в один цикл (TextHelpCommand.send_bot_help()— дублирование логики0f944ea) -
— добавлен try/except + сообщение пользователю (commands/morning.pyне ловит исключенияrun_morning78106e7) -
Файл— удалён (уже был в .gitignore, коммит не нужен)nulв корне проекта
Завершено
Эмодзи в embed-сообщениях— удалены🌅,✅,❌изutils/morning_runner.pyf-string в logger— замена на%-формат вbot.py— перенесён на уровень модуля вimport timeвнутри__init__bot.pyПроверка наличия—.env.envв.gitignore, есть.env.exampleКоманда— удалена из проекта!msgв BotRunnerОтсутствует— файл существует.gitignoreОтсутствует Dockerfile— файл существуетОтсутствует— файл существует.env.exampleType hints в production-коде— добавлены аннотации ко всем 20 функциям— monkey-patch вasyncio.iscoroutinefunctiondeprecatedbot.py+conftest.pyУтечка корутины Scheduler в тестах— mock_start_schedulerвместоasyncio.create_taskGraceful shutdown (SIGTERM)— реализован черезon_shutdownlistener +async with self.botПустой— удалён__init__в MorningGlobal RateLimiter на модульном уровне— добавлены factory-функцииmake_*_limiter()Type hints в тестах— добавлены-> Noneко всем 140 test-функциям— вынесены наверх модулей (35 вхождений)importвнутри функций в тестахДобавить pre-commit хуки—.pre-commit-config.yaml(ruff + ruff-format),requirements-dev.txtИнтеграционные тесты— 9 тестов загрузок когов, команд и утилит— заменено наformat_weather_for_embedотсутствует в кодеformat_weather_for_messageв README.md— отсортирован список по убыванию_WEATHER_MAPPINGне отсортирован по убыванию длины ключейlen(key), добавлен комментарий (utils/pogoda.py)Глобальные— добавленаrequests.Sessionне закрываютсяclose_all_sessions()вutils/__init__.py, вызов из_on_shutdownвbot.py— fallback перебирает каналы целевого сервера вместоrun_morningfallback может отправить дайджест в несколько каналовbot.get_all_channels()(utils/morning_runner.py)— заменено на!nw: последовательные вызовы API вместо параллельныхasyncio.gather()(commands/news.py)— добавлена явная проверкаformat_weather_data_for_consoleвыводитNoneв текстis Noneдля всех полей (utils/pogoda.py), обновлён тест (tests/test_commands_pg.py)— валидация формата через regex, ISO даты конвертируются в DD.MM.YYYY (_parse_dateхрупкий fallbackutils/news.py)— вынесен в константуwmo_to_russianсоздаёт dict на каждый вызов_WMO_MAPPING(utils/pogoda.py)— standalone-команды показываются если не hidden (TextHelpCommandпропускает команды без cogbot.py)— добавленtranslate_weather(" ")возвращает пробелы.strip()перед проверкой (utils/pogoda.py)— заменён наpressure_to_mmhg(mb: Any)float | int | str | None(utils/pogoda.py)— вынесен вconftest.pyиbot.pyдублируют monkey-patchutils/compat.py, оба файла импортируют оттуда— добавленRateLimiterтесты зависят от реального времени_time_funcпараметр, все тесты используют контролируемую функцию времени—Dockerfileне копируетconftest.pyconftest.pyубран из Dockerfile (тестовый файл не нужен в production)—requirements.txtбез пиннинга версий>=заменён на~=(compatible release)Закомментированный тест— удалена устаревшая закомментированная строкаpressure_to_mmhg(0)— добавлена валидацияformat_articles(None)бросаетTypeErrorNone, graceful fallback с сообщением— добавленsetup_logging()создаёт дублирующиеся handlersroot.handlers.clear()(utils/logger.py)Первый—logger.info()теряетсяsetup_logging()вызывается до первого лога (bot.py)— точное совпадение приоритизируется (translate_weather()уязвим к ложным substring-совпадениямutils/pogoda.py)— вынесен на уровень модуля (fromstringимпортирован внутри функцииfetch_rssutils/news.py)—Scheduler._start_scheduler()создаёт task синхронно__init__больше не создаёт task;start()стал async-методом (utils/morning_runner.py,bot.py)— удалёнPg.__init__хранитself.api_urlкак инстанс-переменную__init__, используетсяAPI_URL_WEATHERнапрямую (commands/pg.py)— добавлена поддержкаfetch_cat()не передаётx-api-keyCAT_API_KEYиз окружения, заголовокx-api-keyпередаётся при наличии ключа (utils/cat.py)Глобальные экземпляры RateLimiter + factory-функции— дизайн подтверждён: глобальные синглтоны для production, factory-функции для тестов. Добавлен поясняющий комментарий (utils/rate_limiter.py)— удалены 5 декораторов из@pytest.mark.asyncioизбыточенtests/test_integration.py(pytest.iniимеетasyncio_mode = auto)— отклонено: Docker — production-окружение, тесты туда не нужныDockerfileне копируетtests/Приватные атрибуты на объекте бота—START_TIMEвынесен на уровень модуляbot.py,self.bot._schedulerудалён (не использовался). Обновленыcommands/status.pyи тестыИзбыточная проверка— удалены проверкиctxвon_command_errorctx and, так какctxгарантированно передан discord.py (bot.py)— применёнruff format --checkпадает на 5 файлахruff formatк 7 файлам— вынесено вcommands/news.py— дублирование кода для статей и постов_format_feed_section()(commands/news.py)Город захардкожен в— вынесен вAPI_URL_WEATHERWEATHER_CITYenv-переменную, шаблон"Погода: {city}:"(utils/pogoda.py,.env.example)