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")
|