import csv import io from typing import List from ..types import ReportRow from .base import Formatter class CSVFormatter(Formatter): """Форматтер для экспорта в CSV. Использует полные значения project/version (а не display-значения с пустыми ячейками для групп). Каждая строка CSV самодостаточна — это корректно для табличного формата (#31). Файл сохраняется в UTF-8 с BOM (utf-8-sig) для корректного отображения кириллицы в Microsoft Excel (#26). """ def __init__(self, **_kwargs): super().__init__() def format(self, rows: List[ReportRow]) -> str: output = io.StringIO() writer = csv.writer(output, dialect="excel") writer.writerow(["Project", "Version", "Issue ID", "Subject", "Status", "Spent Time"]) for r in rows: writer.writerow( [ r["project"], r["version"], r["issue_id"], r["subject"], r["status_ru"], r["time_text"], ] ) return output.getvalue() def save(self, rows: List[ReportRow], output_path: str) -> None: content = self.format(rows) with open(output_path, "w", encoding="utf-8-sig", newline="") as f: f.write(content)