File size: 2,034 Bytes
86c402d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
"""
Модуль с фабрикой парсеров для различных форматов документов.
"""

import logging

from .abstract_parser import AbstractParser
from .file_types import FileType

logger = logging.getLogger(__name__)


class ParserFactory:
    """
    Фабрика парсеров документов.
    
    Отвечает за выбор подходящего парсера для конкретного документа.
    """
    
    def __init__(self):
        """
        Инициализирует фабрику парсеров.
        """
        self.parsers: list[AbstractParser] = []
    
    def register_parser(self, parser: AbstractParser) -> None:
        """
        Регистрирует парсер в фабрике.
        
        Args:
            parser (AbstractParser): Парсер для регистрации.
        """
        self.parsers.append(parser)
        logger.debug(f"Зарегистрирован парсер: {parser.__class__.__name__}")
    
    def get_parser(self, file: str | FileType) -> AbstractParser | None:
        """
        Возвращает подходящий парсер для файла.
        
        Args:
            file: Может быть одним из:
                - str: Путь к файлу для определения подходящего парсера.
                - FileType: Тип файла для определения подходящего парсера.
            
        Returns:
            AbstractParser | None: Подходящий парсер или None, если такой не найден.
        """
        for parser in self.parsers:
            if parser.supports_file(file):
                logger.debug(f"Выбран парсер {parser.__class__.__name__} для файла {file}")
                return parser
        
        logger.warning(f"Не найден подходящий парсер для {file}")
        return None