py.lib

Yohn Y. 2022-08-14 Parent:57f63bf31fd8 Child:f1a05e880961

34:84b54a8a6d4c Go to Latest

py.lib/config_parse_helper.py

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

History
     1.1 --- a/config_parse_helper.py	Sat Aug 13 20:06:47 2022 +0300
     1.2 +++ b/config_parse_helper.py	Sun Aug 14 12:19:08 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, List
     1.8 +from typing import Iterable, Optional, Dict, Any, List, Callable
     1.9  from threading import RLock
    1.10  from os import getenv
    1.11  
    1.12 @@ -99,11 +99,14 @@
    1.13          self.ph = parser_helper_object
    1.14          self.params = {}
    1.15  
    1.16 -    def _add_param(self, param_name: str, param_val: Any):
    1.17 +    def _add_param(self, param_name: str, param_val: Any, parser: Optional[Callable[[Any], Any]] = None):
    1.18          """\
    1.19          Непосредственное добавление полученного параметра со всеми проверками.
    1.20          """
    1.21  
    1.22 +        if parser is not None and param_val is not None:
    1.23 +            param_val = parser(param_val)
    1.24 +
    1.25          fld = self.ph.fields.get(param_name)
    1.26          if not isinstance(fld, Field):
    1.27              raise ConfigParseHelperError(f'В классе данных отсутствует свойство "{param_name}", '
    1.28 @@ -138,7 +141,7 @@
    1.29          if exc_type is None:
    1.30              self.ph.add_params(self.params)
    1.31  
    1.32 -    def get(self, config_prop_name: str, dc_prop_name: str):
    1.33 +    def get(self, config_prop_name: str, dc_prop_name: str, parser: Optional[Callable[[Any], Any]] = None):
    1.34          raise NoSectionNotification()
    1.35  
    1.36  
    1.37 @@ -152,13 +155,14 @@
    1.38          self.section_name = section
    1.39          self.section = parser_helper_object.conf_parser[section]
    1.40  
    1.41 -    def get(self, config_prop_name: str, dc_prop_name: str):
    1.42 +    def get(self, config_prop_name: str, dc_prop_name: str, parser: Optional[Callable[[Any], Any]] = None):
    1.43          """\
    1.44          :param config_prop_name: Имя опции в файле конфигурации
    1.45          :param dc_prop_name: Имя свойства в классе данных, хранящем конфигурацию
    1.46 +        :param parser: Исполнимый обработчик значения, перед его помещением в конфигурацию
    1.47          """
    1.48          try:
    1.49 -            self._add_param(dc_prop_name, self.section.get(config_prop_name))
    1.50 +            self._add_param(dc_prop_name, self.section.get(config_prop_name), parser)
    1.51  
    1.52          except ConfigParseHelperError as e:
    1.53              raise ConfigParseHelperError(f'Ошибка при разборе параметра "{config_prop_name}" '
    1.54 @@ -170,14 +174,15 @@
    1.55      Класс для разбора переменных окружения в том же ключе, что и файла конфигурации
    1.56      """
    1.57  
    1.58 -    def get(self, env_name: str, dc_prop_name: str):
    1.59 +    def get(self, env_name: str, dc_prop_name: str, parser: Optional[Callable[[Any], Any]] = None):
    1.60          """\
    1.61          :param env_name: Имя переменной окружения, хранящей опцию
    1.62          :param dc_prop_name: Имя свойства в классе данных, хранящем конфигурацию
    1.63 +        :param parser: Исполнимый обработчик значения, перед его помещением в конфигурацию
    1.64          """
    1.65  
    1.66          try:
    1.67 -            self._add_param(dc_prop_name, getenv(env_name))
    1.68 +            self._add_param(dc_prop_name, getenv(env_name), parser)
    1.69  
    1.70          except ConfigParseHelperError as e:
    1.71              raise ConfigParseHelperError(f'Ошибка при получении значения из переменной окружения "{env_name}": {e}')
    1.72 @@ -208,23 +213,24 @@
    1.73              raise ConfigParseHelperError(f'Ошибка создания объекта объекта конфигурации, '
    1.74                                           f'списка объектов конфигурации: {e}')
    1.75  
    1.76 -    def get(self, config_prop_name: str, dc_prop_name: str):
    1.77 +    def get(self, config_prop_name: str, dc_prop_name: str, parser: Optional[Callable[[Any], Any]] = None):
    1.78          """\
    1.79          Подготавливаем список соответствия названий параметров в секции конкретным свойствам данного
    1.80          в помощник класса
    1.81  
    1.82          :param config_prop_name: Имя опции в файле конфигурации
    1.83          :param dc_prop_name: Имя свойства в классе данных, хранящем конфигурацию
    1.84 +        :param parser: Исполнимый обработчик значения, перед его помещением в конфигурацию
    1.85          """
    1.86  
    1.87 -        self.ident_list.append((config_prop_name, dc_prop_name))
    1.88 +        self.ident_list.append((config_prop_name, dc_prop_name, parser))
    1.89  
    1.90      def get_config_objects(self) -> List[object]:
    1.91          for section in self.sections:
    1.92              try:
    1.93                  with CPHSection(self, section) as section_helper:
    1.94 -                    for conf_prop, dc_prop in self.ident_list:
    1.95 -                        section_helper.get(conf_prop, dc_prop)
    1.96 +                    for conf_prop, dc_prop, parser in self.ident_list:
    1.97 +                        section_helper.get(conf_prop, dc_prop, parser)
    1.98  
    1.99              except ConfigParseHelperError as e:
   1.100                  raise ConfigParseHelperError(f'Ошибка при разборе секции "{section}": {e}')