List open Redmine issues assigned to the current (or overridden) user, sorted by priority rank (P1..P5) then version due date with a stable id tie-break. Renders an OSC 8 hyperlinked console table on stdout and a counts/hours summary line on stderr; version due dates are fetched once per unique version, unavailable versions degrade to an empty due date. Also migrates the codebase to ruff 0.17.3 defaults (PEP 585/604 annotations, targeted noqa for intentional blind excepts and CLI root logging). Behavior-neutral: 408 tests pass with -W error.
60 lines
2.3 KiB
Python
60 lines
2.3 KiB
Python
from .base import Formatter
|
||
from .console import CompactFormatter, TableFormatter
|
||
from .csv import CSVFormatter
|
||
from .html import HTMLFormatter
|
||
from .json import JSONFormatter
|
||
from .markdown import MarkdownFormatter
|
||
from .xlsx import XLSXFormatter
|
||
|
||
# Словарь для сопоставления расширений файлов с классами форматтеров.
|
||
# ODT и XLSX намеренно отсутствуют — их импорт отложен (ленивый), так как
|
||
# odfpy/openpyxl может быть не установлен. См. get_formatter_by_extension.
|
||
FORMATTER_MAP: dict[str, type[Formatter]] = {
|
||
".csv": CSVFormatter,
|
||
".json": JSONFormatter,
|
||
".md": MarkdownFormatter,
|
||
".html": HTMLFormatter,
|
||
".xlsx": XLSXFormatter,
|
||
}
|
||
|
||
|
||
# Словарь для сопоставления типа вывода (консоль) с классами форматтеров
|
||
CONSOLE_FORMATTER_MAP: dict[str, type[Formatter]] = {
|
||
"table": TableFormatter,
|
||
"compact": CompactFormatter,
|
||
}
|
||
|
||
|
||
def get_formatter_by_extension(extension: str, **kwargs) -> Formatter | None:
|
||
"""
|
||
Возвращает экземпляр форматтера по расширению файла.
|
||
Ключевые аргументы (**kwargs) передаются в конструктор форматтера.
|
||
Возвращает None для .odt, если odfpy не установлен.
|
||
"""
|
||
ext = extension.lower()
|
||
|
||
formatter_class = FORMATTER_MAP.get(ext)
|
||
if formatter_class:
|
||
return formatter_class(**kwargs)
|
||
|
||
# ODT требует odfpy — ленивый импорт, чтобы отсутствие зависимости
|
||
# не ломало загрузку модуля и другие форматтеры.
|
||
if ext == ".odt":
|
||
try:
|
||
from .odt import ODTFormatter
|
||
except ImportError:
|
||
return None
|
||
return ODTFormatter(**kwargs)
|
||
|
||
return None
|
||
|
||
|
||
def get_console_formatter(formatter_type: str) -> Formatter | None:
|
||
"""
|
||
Возвращает экземпляр консольного форматтера по его типу.
|
||
"""
|
||
formatter_class = CONSOLE_FORMATTER_MAP.get(formatter_type.lower())
|
||
if formatter_class:
|
||
return formatter_class()
|
||
return None
|