Задачи Sprint 1 (Critical Fixes): - [1.1] Fallback в пустом embed (!morning) — добавлена проверка has_real_data и fallback сообщение при отключении внешних API - [1.2] Обработка ошибок токена/сети в bot.run() — raise_exception=True + логирование LoginFailure, HTTPException, Exception - [1.3] Рефакторинг парсинга погоды — вынесено в format_weather_data_for_console(), убран дублирующий код из 2 файлов Изменения: • utils/morning_runner.py — добавлена проверка has_real_data после формирования description_lines • bot.py — обработчики исключений для запуска бота с детализированным логированием и пользовательскими сообщениями • utils/pogoda.py — новая функция format_weather_data_for_console() для центрального форматирования погодных данных • console_commands/pogoda.py — замена 15 строк дублирующейся логики на вызов единой функции (24→8 строк) • console_commands/morning.py — аналогичные изменения для команды morning (19→13 строк с погодой) • tests/test_morning_runner.py — +2 теста для fallback сценариев empty embed и only weather data • tests/test_bot.py — новый файл с 2 тестами на проверку кода обработки ошибок • tests/test_pogoda.py — +6 тестов для format_weather_data_for_console() Статистика тестирования: • Общее количество тестов: 200 (было 190) • Новые тесты: 10 • Все тесты проходят успешно Примечания: - Сообщения без восклицательных знаков согласно preferencem
67 lines
2.5 KiB
Python
67 lines
2.5 KiB
Python
import asyncio
|
||
|
||
from utils.pogoda import fetch_weather, format_weather_data_for_console
|
||
from utils.news import fetch_rss, format_articles, RSS_URL_ARTICLES, RSS_URL_POSTS
|
||
from utils.cat import fetch_cat
|
||
|
||
|
||
async def morning(stop_event, bot):
|
||
"""Вывести погоду, лучшие статьи за сутки и котика"""
|
||
api_url = "https://wttr.in/Magnitogorsk?format=j1&lang=ru"
|
||
|
||
# Параллельный запрос погоды, новостей и котика
|
||
weather_data, articles, posts, cat_url = await asyncio.gather(
|
||
fetch_weather(api_url),
|
||
fetch_rss(RSS_URL_ARTICLES),
|
||
fetch_rss(RSS_URL_POSTS),
|
||
fetch_cat(),
|
||
)
|
||
|
||
print("Доброе утро!\n")
|
||
|
||
# --- Котик ---
|
||
if cat_url:
|
||
print(f"Котик: {cat_url}\n")
|
||
else:
|
||
print("Котика получить не удалось.\n")
|
||
|
||
# --- Погода ---
|
||
if weather_data is not None:
|
||
formatted = format_weather_data_for_console(weather_data)
|
||
if formatted:
|
||
print(f"**Погода в Магнитогорске:**")
|
||
for line in formatted:
|
||
print(line)
|
||
else:
|
||
print("Не удалось получить данные о погоде.")
|
||
else:
|
||
print("Не удалось получить данные о погоде.")
|
||
|
||
print()
|
||
|
||
# --- Новости: статьи ---
|
||
if articles is not None:
|
||
if articles:
|
||
lines = format_articles(articles,
|
||
"Лучшие статьи за сутки / Искусственный интеллект / Хабr",
|
||
"https://habr.com/ru/hubs/artificial_intelligence/articles/top/daily/")
|
||
print("\n".join(lines))
|
||
else:
|
||
print("Новостей пока нет.")
|
||
else:
|
||
print("Не удалось получить новости.")
|
||
|
||
print()
|
||
|
||
# --- Новости: посты ---
|
||
if posts is not None:
|
||
if posts:
|
||
lines = format_articles(posts,
|
||
"Лучшие новости за сутки / Искусственный интеллект / Хабr",
|
||
"https://habr.com/ru/hubs/artificial_intelligence/news/top/daily/")
|
||
print("\n".join(lines))
|
||
else:
|
||
print("Новостей пока нет.")
|
||
else:
|
||
print("Не удалось получить новости.")
|