From 250452ad60e5bd6516c9cf4f75812f4bb6472ed1 Mon Sep 17 00:00:00 2001 From: deadzilla Date: Sun, 12 Jul 2026 23:39:56 +0500 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BE=D1=82=D0=BA=D1=80=D1=8B=D1=82=D1=8B=D0=B5?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8=20=D0=BF=D0=BE=D1=81?= =?UTF-8?q?=D0=BB=D0=B5=20=D0=BA=D0=BE=D0=B4=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= =?UTF-8?q?=20(12=20issue)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ISSUES.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/ISSUES.md b/ISSUES.md index 28a78b0..404510a 100644 --- a/ISSUES.md +++ b/ISSUES.md @@ -39,3 +39,28 @@ - [x] **`requirements.txt` без пиннинга версий** — `>=` заменён на `~=` (compatible release) - [x] **Закомментированный тест `pressure_to_mmhg(0)`** — удалена устаревшая закомментированная строка - [x] **`format_articles(None)` бросает `TypeError`** — добавлена валидация `None`, graceful fallback с сообщением + +--- + +## Открытые задачи + +### Критические + +- [ ] **`setup_logging()` создаёт дублирующиеся handlers** — каждый вызов добавляет новые `StreamHandler` и `RotatingFileHandler` к root-логгеру без проверки (`utils/logger.py`, строки 30-39) +- [ ] **Первый `logger.info()` теряется** — `"=== Запуск Discord бота ==="` вызван до `setup_logging()`, у root-логгера нет handlers (`bot.py`, строка 196) +- [ ] **`translate_weather()` уязвим к ложным substring-совпадениям** — `if key.lower() in en_lower` может вернуть неверный перевод (например, `"Heavy rain"` совпадёт в `"Heavy rain shower"` раньше, чем точный ключ) (`utils/pogoda.py`) + +### Средние + +- [ ] **`fromstring` импортирован внутри функции `fetch_rss`** — `from defusedxml.ElementTree import fromstring` на строке 24, скрывает зависимость от линтеров и добавляет оверхед (`utils/news.py`) +- [ ] **`Scheduler._start_scheduler()` создаёт task синхронно** — `asyncio.create_task()` в `__init__` зависит от активного event loop неявно (`utils/morning_runner.py`, строка 119) +- [ ] **`Pg.__init__` хранит `self.api_url` как инстанс-переменную** — копия константы `API_URL_WEATHER` без необходимости (`commands/pg.py`, строки 13-14) +- [ ] **`fetch_cat()` не передаёт `x-api-key`** — TheCatAPI требует/рекомендует заголовок `x-api-key`, без него запросы могут быть ограничены (`utils/cat.py`, строка 15) + +### Низкие + +- [ ] **Глобальные экземпляры RateLimiter + factory-функции** — factory-функции `make_*_limiter()` существуют, но production-код импортирует глобальные переменные напрямую (`utils/rate_limiter.py`, строки 94-97) +- [ ] **`@pytest.mark.asyncio` избыточен** — `pytest.ini` уже содержит `asyncio_mode = auto` (`tests/test_integration.py`) +- [ ] **`Dockerfile` не копирует `tests/`** — нельзя запустить `pytest` внутри контейнера, затрудняет отладку в Docker +- [ ] **Приватные атрибуты на объекте бота** — `self.bot._start_time` и `self.bot._scheduler` нарушают инкапсуляцию (`bot.py`, строки 116, 148) +- [ ] **Избыточная проверка `ctx` в `on_command_error`** — `ctx` всегда передан и не может быть `None` (`bot.py`, строки 138-143)