feat: вынести город в WEATHER_CITY env-переменную

Город больше не захардкожен в коде. Переопределяется через
WEATHER_CITY (по умолчанию "Магнитогорск"). Шаблон изменён на
"Погода: {city}:" для обхода проблемы падежей в русском языке.

Файлы: utils/pogoda.py, .env.example, tests/test_morning_runner.py
This commit is contained in:
deadzilla 2026-07-22 22:04:54 +05:00
parent 1a6b7043ad
commit ecff77ef66
4 changed files with 9 additions and 5 deletions

View File

@ -10,4 +10,5 @@ YANDEX_WEATHER_API_RATE=1
YANDEX_WEATHER_API_BURST=3 YANDEX_WEATHER_API_BURST=3
HABR_RSS_RATE=1 HABR_RSS_RATE=1
HABR_RSS_BURST=2 HABR_RSS_BURST=2
WEATHER_CITY=Магнитогорск
WEATHER_CACHE_TTL=3600 WEATHER_CACHE_TTL=3600

View File

@ -83,7 +83,7 @@
- [ ] **`commands/news.py` — дублирование кода для статей и постов** — блоки обработки `articles` и `posts` почти идентичны (проверка `None`, форматирование, fallback). Вынести в вспомогательную функцию - [ ] **`commands/news.py` — дублирование кода для статей и постов** — блоки обработки `articles` и `posts` почти идентичны (проверка `None`, форматирование, fallback). Вынести в вспомогательную функцию
- [ ] **Город захардкожен в `API_URL_WEATHER`**`Magnitogorsk` в URL `wttr.in`. При необходимости поддержки других городов потребуется рефакторинг. Минимум — задокументировать ограничение и вынести в env-переменную `WEATHER_CITY` - [x] ~~**Город захардкожен в `API_URL_WEATHER`**~~ — вынесен в `WEATHER_CITY` env-переменную, шаблон `"Погода: {city}:"` (`utils/pogoda.py`, `.env.example`)
- [ ] **`Scheduler._task` без `add_done_callback`** — если `_scheduler_loop` завершится unexpectedly (не через `CancelledError`), это не будет залогировано. Добавить callback для логирования нештатного завершения task - [ ] **`Scheduler._task` без `add_done_callback`** — если `_scheduler_loop` завершится unexpectedly (не через `CancelledError`), это не будет залогировано. Добавить callback для логирования нештатного завершения task

View File

@ -170,7 +170,7 @@ class TestRunMorning:
second_call = channel.send.call_args_list[1] second_call = channel.send.call_args_list[1]
message_text = second_call[0][0] message_text = second_call[0][0]
assert "Утренний дайджест" in message_text assert "Утренний дайджест" in message_text
assert "Погода в Магнитогорске" in message_text assert "Погода: Магнитогорск" in message_text
class TestRunMorningWithFallback: class TestRunMorningWithFallback:
@ -242,5 +242,5 @@ class TestRunMorningWithFallback:
message_text = call_args[0][0] message_text = call_args[0][0]
# Проверяем, что в тексте есть погода и нет fallback сообщения # Проверяем, что в тексте есть погода и нет fallback сообщения
assert "Погода в Магнитогорске" in message_text assert "Погода: Магнитогорск" in message_text
assert "Не удалось получить данные из внешних источников" not in message_text assert "Не удалось получить данные из внешних источников" not in message_text

View File

@ -20,7 +20,10 @@ from utils.rate_limiter import yandex_weather_limiter
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# Координаты Магнитогорска # Город для погоды (переопределяется WEATHER_CITY)
_WEATHER_CITY: str = os.getenv("WEATHER_CITY", "Магнитогорск")
# Координаты города
_LATITUDE: float = 53.40716 _LATITUDE: float = 53.40716
_LONGITUDE: float = 58.980289 _LONGITUDE: float = 58.980289
@ -281,7 +284,7 @@ def format_weather_for_message(data: Optional[dict]) -> Optional[str]:
lines = format_weather_data_for_console(data) lines = format_weather_data_for_console(data)
if not lines: if not lines:
return None return None
return "Погода в Магнитогорске:\n" + "\n".join(lines) return f"Погода: {_WEATHER_CITY}:\n" + "\n".join(lines)
def pressure_to_mmhg(mb: float | int | str | None) -> float | str: def pressure_to_mmhg(mb: float | int | str | None) -> float | str: