Compare commits
No commits in common. "d4b457f94e0d0ae8b9510bbb6b0c5338382b34fb" and "250452ad60e5bd6516c9cf4f75812f4bb6472ed1" have entirely different histories.
d4b457f94e
...
250452ad60
10
ISSUES.md
10
ISSUES.md
@ -39,10 +39,6 @@
|
|||||||
- [x] **`requirements.txt` без пиннинга версий** — `>=` заменён на `~=` (compatible release)
|
- [x] **`requirements.txt` без пиннинга версий** — `>=` заменён на `~=` (compatible release)
|
||||||
- [x] **Закомментированный тест `pressure_to_mmhg(0)`** — удалена устаревшая закомментированная строка
|
- [x] **Закомментированный тест `pressure_to_mmhg(0)`** — удалена устаревшая закомментированная строка
|
||||||
- [x] **`format_articles(None)` бросает `TypeError`** — добавлена валидация `None`, graceful fallback с сообщением
|
- [x] **`format_articles(None)` бросает `TypeError`** — добавлена валидация `None`, graceful fallback с сообщением
|
||||||
- [x] **`setup_logging()` создаёт дублирующиеся handlers** — добавлен `root.handlers.clear()` (`utils/logger.py`)
|
|
||||||
- [x] **Первый `logger.info()` теряется** — `setup_logging()` вызывается до первого лога (`bot.py`)
|
|
||||||
- [x] **`translate_weather()` уязвим к ложным substring-совпадениям** — точное совпадение приоритизируется (`utils/pogoda.py`)
|
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -50,9 +46,9 @@
|
|||||||
|
|
||||||
### Критические
|
### Критические
|
||||||
|
|
||||||
- [x] ~~**`setup_logging()` создаёт дублирующиеся handlers**~~ — добавлен `root.handlers.clear()` перед добавлением новых хендлеров (`utils/logger.py`)
|
- [ ] **`setup_logging()` создаёт дублирующиеся handlers** — каждый вызов добавляет новые `StreamHandler` и `RotatingFileHandler` к root-логгеру без проверки (`utils/logger.py`, строки 30-39)
|
||||||
- [x] ~~**Первый `logger.info()` теряется**~~ — `setup_logging()` перемещён до первого `logger.info()` (`bot.py`)
|
- [ ] **Первый `logger.info()` теряется** — `"=== Запуск Discord бота ==="` вызван до `setup_logging()`, у root-логгера нет handlers (`bot.py`, строка 196)
|
||||||
- [x] ~~**`translate_weather()` уязвим к ложным substring-совпадениям**~~ — добавлена проверка точного совпадения (case-insensitive) перед substring-matching (`utils/pogoda.py`)
|
- [ ] **`translate_weather()` уязвим к ложным substring-совпадениям** — `if key.lower() in en_lower` может вернуть неверный перевод (например, `"Heavy rain"` совпадёт в `"Heavy rain shower"` раньше, чем точный ключ) (`utils/pogoda.py`)
|
||||||
|
|
||||||
### Средние
|
### Средние
|
||||||
|
|
||||||
|
|||||||
2
bot.py
2
bot.py
@ -273,8 +273,8 @@ def _validate_config() -> None:
|
|||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
from utils.logger import setup_logging
|
from utils.logger import setup_logging
|
||||||
|
|
||||||
setup_logging()
|
|
||||||
logger.info("=== Запуск Discord бота ===")
|
logger.info("=== Запуск Discord бота ===")
|
||||||
|
setup_logging()
|
||||||
|
|
||||||
_validate_config()
|
_validate_config()
|
||||||
|
|
||||||
|
|||||||
@ -33,7 +33,6 @@ def setup_logging() -> logging.Logger:
|
|||||||
|
|
||||||
root = logging.getLogger()
|
root = logging.getLogger()
|
||||||
root.setLevel(level)
|
root.setLevel(level)
|
||||||
root.handlers.clear()
|
|
||||||
root.addHandler(console)
|
root.addHandler(console)
|
||||||
|
|
||||||
# File handler — logs/bot.log с ротацией по размеру (5 МБ, 5 бэкапов)
|
# File handler — logs/bot.log с ротацией по размеру (5 МБ, 5 бэкапов)
|
||||||
|
|||||||
@ -174,19 +174,10 @@ _WEATHER_MAPPING = [
|
|||||||
def translate_weather(en: Optional[str]) -> str:
|
def translate_weather(en: Optional[str]) -> str:
|
||||||
if not en or not en.strip():
|
if not en or not en.strip():
|
||||||
return "—"
|
return "—"
|
||||||
en_stripped = en.strip()
|
en_lower = en.strip().lower()
|
||||||
en_lower = en_stripped.lower()
|
|
||||||
|
|
||||||
# Сначала проверяем точное совпадение (приоритет над substring)
|
|
||||||
for key, value in _WEATHER_MAPPING:
|
|
||||||
if key.lower() == en_lower:
|
|
||||||
return value
|
|
||||||
|
|
||||||
# Fallback: substring-matching (отсортировано по убыванию длины ключа)
|
|
||||||
for key, value in _WEATHER_MAPPING:
|
for key, value in _WEATHER_MAPPING:
|
||||||
if key.lower() in en_lower:
|
if key.lower() in en_lower:
|
||||||
return value
|
return value
|
||||||
|
|
||||||
return en
|
return en
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user