66 lines
1.8 KiB
Python
66 lines
1.8 KiB
Python
import datetime
|
||||
|
|
from collections.abc import Sequence
|
|||
|
|
from pathlib import Path
|
|||
|
|
|
|||
|
|
from db_models import WeatherForecast
|
|||
|
|
|
|||
|
|
_HEADERS = [
|
|||
|
|
"Дата",
|
|||
|
|
"Мин. темп. (°C)",
|
|||
|
|
"Макс. темп. (°C)",
|
|||
|
|
"Описание",
|
|||
|
|
"Влажность (%)",
|
|||
|
|
"Ветер (м/с)",
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
|
|||
|
|
def _format_number(value: float) -> str:
|
|||
|
|
return f"{value:g}"
|
|||
|
|
|
|||
|
|
|
|||
|
|
def export_md(records: Sequence[WeatherForecast], output_file: str, city: str) -> None:
|
|||
|
|
rows: list[list[str]] = []
|
|||
|
|
for record in sorted(records, key=lambda r: r.forecast_date):
|
|||
|
|
rows.append(
|
|||
|
|
[
|
|||
|
|
record.forecast_date.isoformat(),
|
|||
|
|
_format_number(record.temp_min),
|
|||
|
|
_format_number(record.temp_max),
|
|||
|
|
record.description or "",
|
|||
|
|
str(record.humidity),
|
|||
|
|
_format_number(record.wind_speed),
|
|||
|
|
]
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
if records:
|
|||
|
|
dates: list[datetime.date] = [r.forecast_date for r in records]
|
|||
|
|
period = f"Период: {min(dates).isoformat()} - {max(dates).isoformat()}"
|
|||
|
|
else:
|
|||
|
|
period = "Период: -"
|
|||
|
|
|
|||
|
|
location = f"Автоматически определённая локация: {city}"
|
|||
|
|
|
|||
|
|
widths = [len(header) for header in _HEADERS]
|
|||
|
|
for row in rows:
|
|||
|
|
for i, cell in enumerate(row):
|
|||
|
|
widths[i] = max(widths[i], len(cell))
|
|||
|
|
|
|||
|
|
def _row(row: list[str]) -> str:
|
|||
|
|
padded = [cell.ljust(widths[i]) for i, cell in enumerate(row)]
|
|||
|
|
return "| " + " | ".join(padded) + " |"
|
|||
|
|
|
|||
|
|
separator = "| " + " | ".join("-" * width for width in widths) + " |"
|
|||
|
|
|
|||
|
|
lines = [
|
|||
|
|
"# Прогноз погоды",
|
|||
|
|
"",
|
|||
|
|
location,
|
|||
|
|
period,
|
|||
|
|
"",
|
|||
|
|
_row(_HEADERS),
|
|||
|
|
separator,
|
|||
|
|
*(_row(row) for row in rows),
|
|||
|
|
"",
|
|||
|
|
]
|
|||
|
|
Path(output_file).write_text("\n".join(lines), encoding="utf-8")
|