init
This commit is contained in:
+65
@@ -0,0 +1,65 @@
|
||||
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")
|
||||
Reference in New Issue
Block a user