py.lib
32:eb41cc498ddb Browse Files
+ Поддержали наборы объектов концигурации в библиотеке помощника разбора конфигурации + Позволяем в помощнике получить секции конфигурации.
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()