from typing import Dict, Optional, Type 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) -> Optional[Formatter]: """ Возвращает экземпляр форматтера по расширению файла. Ключевые аргументы (**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) -> Optional[Formatter]: """ Возвращает экземпляр консольного форматтера по его типу. """ formatter_class = CONSOLE_FORMATTER_MAP.get(formatter_type.lower()) if formatter_class: return formatter_class() return None