from tabulate import tabulate from ..types import TaskRow class TaskTableFormatter: """Консольный форматтер таблицы открытых задач пользователя (режим --my-tasks). Не входит в фабрику файловых форматтеров: таблица всегда печатается в stdout, поэтому сохранение в файл не поддержано. """ def __init__(self, base_url: str) -> None: self.base_url = base_url def _hyperlink(self, issue_id: int) -> str: # OSC 8-гиперссылка: номер задачи остаётся видимым терминалом без # поддержки ссылок, а поддерживающие делают его кликабельным. url = f"{self.base_url.rstrip('/')}/issues/{issue_id}" return f"\x1b]8;;{url}\x1b\\{issue_id}\x1b]8;;\x1b\\" def format(self, rows: list[TaskRow]) -> str: table_rows = [["ID", "Тема", "Статус", "Приор.", "Версия", "Срок"]] for row in rows: due_text = row["due_text"] if row["overdue"]: due_text = f"{due_text} (!)" table_rows.append( [ self._hyperlink(row["issue_id"]), row["subject"], row["status_ru"], row["priority"], row["version_name"] or "-", due_text or "-", ] ) return tabulate(table_rows, headers="firstrow", tablefmt="simple") def save(self, rows: list[TaskRow], output_path: str) -> None: # Консольные форматтеры не умеют сохранять в файл напрямую. raise NotImplementedError( "TaskTableFormatter не поддерживает сохранение в файл." )