py.lib

Yohn Y. 2022-08-13 Parent:4186c3b229fa Child:57f63bf31fd8

32:eb41cc498ddb Go to Latest

py.lib/config_parse_helper.py

+ Поддержали наборы объектов концигурации в библиотеке помощника разбора конфигурации + Позволяем в помощнике получить секции конфигурации.

History
     1.1 --- a/config_parse_helper.py	Fri Aug 05 23:58:12 2022 +0300
     1.2 +++ b/config_parse_helper.py	Sat Aug 13 13:21:35 2022 +0300
     1.3 @@ -1,7 +1,7 @@
     1.4  # coding: utf-8
     1.5  from configparser import ConfigParser
     1.6  from dataclasses import is_dataclass, fields, Field, MISSING
     1.7 -from typing import Iterable, Optional, Dict, Any
     1.8 +from typing import Iterable, Optional, Dict, Any, List
     1.9  from threading import RLock
    1.10  from os import getenv
    1.11  
    1.12 @@ -133,7 +133,62 @@
    1.13              raise ConfigParseHelperError(f'Ошибка при получении значения из переменной окружения "{env_name}": {e}')
    1.14  
    1.15  
    1.16 +class CPHObjectsListGetter:
    1.17 +    """\
    1.18 +    Помощник для случаев, когда в наборе секций хранится однотипный набор объектов
    1.19 +    """
    1.20 +    def __init__(self, config_object_class: type, config_parser: ConfigParser, sections: Iterable[str]):
    1.21 +        self.sections = sections
    1.22 +        self.conf_parser = config_parser
    1.23 +
    1.24 +        if not is_dataclass(config_object_class):
    1.25 +            raise ConfigParseHelperError(f'Представленный в качестве представления объекта конфигурации '
    1.26 +                                         f'класс не является классом данных: {config_object_class.__name__}')
    1.27 +
    1.28 +        self.res_obj = config_object_class
    1.29 +        self.fields = dict((fld.name, fld) for fld in fields(config_object_class))
    1.30 +        self.obj_list = []
    1.31 +        self.ident_list = []
    1.32 +
    1.33 +    def add_params(self, params: Dict[str, Any]):
    1.34 +        try:
    1.35 +            self.obj_list.append(self.res_obj(**params))
    1.36 +
    1.37 +        except (ValueError, TypeError) as e:
    1.38 +            raise ConfigParseHelperError(f'Ошибка создания объекта объекта конфигурации, '
    1.39 +                                         f'списка объектов конфигурации: {e}')
    1.40 +
    1.41 +    def get(self, config_prop_name: str, dc_prop_name: str):
    1.42 +        """\
    1.43 +        Подготавливаем список соответствия названий параметров в секции конкретным свойствам данного
    1.44 +        в помощник класса
    1.45 +
    1.46 +        :param config_prop_name: Имя опции в файле конфигурации
    1.47 +        :param dc_prop_name: Имя свойства в классе данных, хранящем конфигурацию
    1.48 +        """
    1.49 +
    1.50 +        self.ident_list.append((config_prop_name, dc_prop_name))
    1.51 +
    1.52 +    def get_config_objects(self) -> List[object]:
    1.53 +        for section in self.sections:
    1.54 +            try:
    1.55 +                with CPHSection(self, section) as section_helper:
    1.56 +                    for conf_prop, dc_prop in self.ident_list:
    1.57 +                        section_helper.get(conf_prop, dc_prop)
    1.58 +
    1.59 +            except ConfigParseHelperError as e:
    1.60 +                raise ConfigParseHelperError(f'Ошибка при разборе секции "{section}": {e}')
    1.61 +
    1.62 +        res = self.obj_list[:]
    1.63 +        self.obj_list.clear()
    1.64 +
    1.65 +        return res
    1.66 +
    1.67 +
    1.68  class ConfigParseHelper:
    1.69 +    """\
    1.70 +    Помощник разбора конфигурации
    1.71 +    """
    1.72      def __init__(self, config_object_class: type, required_sections: Optional[Iterable[str]] = None):
    1.73          """\
    1.74          :param config_object_class: Dataclass, который мы подготовили как хранилище параметров конфигурации
    1.75 @@ -197,3 +252,6 @@
    1.76  
    1.77          except (ValueError, TypeError) as e:
    1.78              raise ConfigParseHelperError(f'Не удалось инициализировать объект конфигурации: {e}')
    1.79 +
    1.80 +    def get_sections(self):
    1.81 +        return self.conf_parser.sections()