Quick fixes & tests

This commit is contained in:
Artem Kokos
2026-03-28 23:55:46 +07:00
parent 06cd57e2c4
commit 7bc6e024c0
13 changed files with 455 additions and 112 deletions

View File

@@ -1,5 +1,5 @@
from abc import ABC, abstractmethod
from typing import List
from typing import Any, List
from ..types import ReportRow
@@ -7,13 +7,19 @@ class Formatter(ABC):
"""
Абстрактный базовый класс для всех форматтеров.
Определяет общий интерфейс для форматирования отчета.
Контракт:
- format() возвращает строку для текстовых форматтеров (CSV, HTML, Markdown, console)
и объект OpenDocument для ODTFormatter.
- save() сохраняет результат в файл; консольные форматтеры бросают NotImplementedError.
"""
@abstractmethod
def format(self, rows: List[ReportRow]) -> str:
def format(self, rows: List[ReportRow]) -> Any:
"""
Форматирует список строк отчета в нужный формат.
Возвращает строковое представление отчета.
Для текстовых форматтеров возвращает str.
Для ODTFormatter возвращает объект OpenDocument.
"""
pass
@@ -22,6 +28,6 @@ class Formatter(ABC):
"""
Сохраняет отформатированный отчет в файл по указанному пути.
Для форматтеров, которые не поддерживают сохранение (например, консольные),
можно вызывать `format` и записывать результат вручную.
бросает NotImplementedError.
"""
pass

View File

@@ -8,7 +8,7 @@ from ..types import ReportRow
class CSVFormatter(Formatter):
"""Форматтер для экспорта в CSV."""
def __init__(self, **kwargs):
def __init__(self, **_kwargs):
super().__init__()
def format(self, rows: List[ReportRow]) -> str:

View File

@@ -6,7 +6,7 @@ from ..types import ReportRow
class HTMLFormatter(Formatter):
"""Форматтер для экспорта отчёта в HTML."""
def __init__(self, **kwargs):
def __init__(self, **_kwargs):
super().__init__()
def format(self, rows: List[ReportRow]) -> str:

View File

@@ -6,7 +6,7 @@ from ..types import ReportRow
class MarkdownFormatter(Formatter):
"""Форматтер для экспорта в Markdown."""
def __init__(self, **kwargs):
def __init__(self, **_kwargs):
super().__init__()
def format(self, rows: List[ReportRow]) -> str:

View File

@@ -103,7 +103,7 @@ class ODTFormatter(Formatter):
if first_version_in_project and first_row_in_version:
cell_project = TableCell(stylename=cell_style_name)
cell_project.setAttribute("numberrowsspanned", str(total_project_rows))
p = P(stylename=para_style_name, text=project) # Полное название проекта
p = P(stylename=para_style_name, text=project)
cell_project.addElement(p)
row.addElement(cell_project)
@@ -115,9 +115,6 @@ class ODTFormatter(Formatter):
cell_version.addElement(p)
row.addElement(cell_version)
first_row_in_version = False
else:
# Пропускаем - уже объединена
pass
# Остальные колонки
task_cell = TableCell(stylename=cell_style_name)
@@ -137,7 +134,8 @@ class ODTFormatter(Formatter):
row.addElement(time_cell)
table.addElement(row)
first_version_in_project = False
first_version_in_project = False
doc.text.addElement(table)
doc.text.addElement(P(stylename=para_style_name, text=""))