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