Add missing __init__.py to formatters/ so setuptools.find_packages includes the subpackage in wheel/sdist builds (#16). Move ODTFormatter import from top-level to lazy import inside get_formatter_by_extension() so missing odfpy no longer crashes module load before main() runs. Remove dead except ImportError handler in cli.py save() block; surface a clear 'odfpy is not installed' message when the formatter factory returns None for .odt (#25). Closes #16, closes #25
58 lines
2.2 KiB
Python
58 lines
2.2 KiB
Python
from typing import Dict, Optional, Type
|
||
|
||
from .base import Formatter
|
||
from .console import CompactFormatter, TableFormatter
|
||
from .csv import CSVFormatter
|
||
from .html import HTMLFormatter
|
||
from .markdown import MarkdownFormatter
|
||
|
||
# Словарь для сопоставления расширений файлов с классами форматтеров.
|
||
# ODT намеренно отсутствует — его импорт отложен (ленивый), так как odfpy
|
||
# может быть не установлен. См. get_formatter_by_extension.
|
||
FORMATTER_MAP: Dict[str, Type[Formatter]] = {
|
||
".csv": CSVFormatter,
|
||
".md": MarkdownFormatter,
|
||
".html": HTMLFormatter,
|
||
}
|
||
|
||
|
||
# Словарь для сопоставления типа вывода (консоль) с классами форматтеров
|
||
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
|