py.lib.aw_config

Yohn Y. 2024-05-04 Parent:81fc92335324 Child:bac1fe0751a9

2:b76a704f31b1 Browse Files

+ Функционал управления объектами конфигураций + В модуле разбора файла конфигураций по умолчанию считаем параметры строками . Чистка от мусора и рефакторинг по результатам анализа кода IDE

pyproject.toml requirements.txt setup.py src/aw_config/__init__.py src/aw_config/app_config_manager.py src/aw_config/app_tools.py src/aw_config/file.py

     1.1 --- a/pyproject.toml	Sat May 04 18:58:50 2024 +0300
     1.2 +++ b/pyproject.toml	Sat May 04 20:36:03 2024 +0300
     1.3 @@ -4,7 +4,7 @@
     1.4  
     1.5  [project]
     1.6  name = "aw_config"
     1.7 -version = "0.202405.2"
     1.8 +version = "0.202405.7"
     1.9  description = "Модуль поддержки процесса конфигурирования приложения"
    1.10  #readme = "README.md"
    1.11  requires-python = ">=3.9"
     2.1 --- a/requirements.txt	Sat May 04 18:58:50 2024 +0300
     2.2 +++ b/requirements.txt	Sat May 04 20:36:03 2024 +0300
     2.3 @@ -1,2 +1,1 @@
     2.4 -toml>=0.10.2
     2.5 -setuptools>=59.6.0
     2.6 \ No newline at end of file
     2.7 +toml>=0.10.2
     2.8 \ No newline at end of file
     3.1 --- a/setup.py	Sat May 04 18:58:50 2024 +0300
     3.2 +++ b/setup.py	Sat May 04 20:36:03 2024 +0300
     3.3 @@ -3,7 +3,7 @@
     3.4  
     3.5  setup(
     3.6      name='aw_config',
     3.7 -    version='0.202405.2',
     3.8 +    version='0.202405.7',
     3.9      packages=['aw_config'],
    3.10      package_dir={'aw_config': 'src/aw_config'},
    3.11      url='https://devel.a0fs.ru/py.lib.aw_config',
     4.1 --- a/src/aw_config/__init__.py	Sat May 04 18:58:50 2024 +0300
     4.2 +++ b/src/aw_config/__init__.py	Sat May 04 20:36:03 2024 +0300
     4.3 @@ -3,6 +3,8 @@
     4.4  from .type_helpers import ANY, DICT, LIST
     4.5  from .file import ConfigFile, ConfigSectionNotFound, ConfigFileError
     4.6  from .app_tools import get_app_root
     4.7 +from .app_config_manager import (get_config, init_configs, replace_config, add_config,
     4.8 +                                 AppConfNotFound, AppConfManagerError)
     4.9  
    4.10  
    4.11  __all__ = [
    4.12 @@ -10,4 +12,5 @@
    4.13      'ANY', 'DICT', 'LIST',
    4.14      'ConfigFile', 'ConfigSectionNotFound', 'ConfigFileError',
    4.15      'get_app_root',
    4.16 +    'get_config', 'init_configs', 'replace_config', 'add_config', 'AppConfNotFound', 'AppConfManagerError'
    4.17  ]
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/src/aw_config/app_config_manager.py	Sat May 04 20:36:03 2024 +0300
     5.3 @@ -0,0 +1,86 @@
     5.4 +# coding: utf-8
     5.5 +"""\
     5.6 +Пробуем упростить работу с объектами конфигурации при работе с приложениями.
     5.7 +"""
     5.8 +from threading import Lock
     5.9 +from typing import Optional, Dict
    5.10 +
    5.11 +from .error import Error
    5.12 +
    5.13 +
    5.14 +class AppConfManagerError(Error):
    5.15 +    """\
    5.16 +    Базовый класс ошибок работы с хранилищем конфигураций
    5.17 +    """
    5.18 +
    5.19 +
    5.20 +class AppConfNotFound(AppConfManagerError):
    5.21 +    """\
    5.22 +    Исключение, возникающее когда в хранилище не найдена нужная конфигурация
    5.23 +    """
    5.24 +
    5.25 +
    5.26 +_CONFIG: Optional[Dict] = None
    5.27 +_CONFIG_GUARD = Lock()
    5.28 +
    5.29 +
    5.30 +def init_configs():
    5.31 +    """\
    5.32 +    Инициализируем хранилище конфигураций
    5.33 +    """
    5.34 +    global _CONFIG
    5.35 +    with _CONFIG_GUARD:
    5.36 +        if _CONFIG is None:
    5.37 +            _CONFIG = {}
    5.38 +
    5.39 +
    5.40 +def add_config(conf_selector, conf_obj):
    5.41 +    """\
    5.42 +    Добавляет в хранилище объект конфигурации. Затем его можно извлечь по селектору. Удобно указывать
    5.43 +    в качестве такого селектора класс, объектом которого является данный объект конфигурации
    5.44 +    """
    5.45 +    global _CONFIG
    5.46 +    with _CONFIG_GUARD:
    5.47 +        if _CONFIG is None:
    5.48 +            raise AppConfManagerError(f'При попытке добавить конфигурацию "{conf_selector}" в хранилище '
    5.49 +                                      f'оказалось, что оно не инициализировано')
    5.50 +
    5.51 +        if conf_selector in _CONFIG:
    5.52 +            raise AppConfManagerError(f'Селектор "{conf_selector}" дублируется.')
    5.53 +
    5.54 +        _CONFIG[conf_selector] = conf_obj
    5.55 +
    5.56 +
    5.57 +def replace_config(conf_selector, conf_obj):
    5.58 +    """\
    5.59 +    Заменяем добавленный ранее объект конфигурации
    5.60 +    """
    5.61 +    global _CONFIG
    5.62 +    with _CONFIG_GUARD:
    5.63 +        if _CONFIG is None:
    5.64 +            raise AppConfManagerError(f'При попытке заменить конфигурацию "{conf_selector}" в хранилище '
    5.65 +                                      f'оказалось, что оно не инициализировано')
    5.66 +
    5.67 +        elif conf_selector in _CONFIG:
    5.68 +            _CONFIG[conf_selector] = conf_obj
    5.69 +
    5.70 +        else:
    5.71 +            raise AppConfManagerError(f'Не найдена предыдущая конфигурация "{conf_selector}" при попытке её замены')
    5.72 +
    5.73 +
    5.74 +def get_config(conf_selector):
    5.75 +    """\
    5.76 +    Получаем из хранилища добавленный ранее объект конфигурации по селектору.
    5.77 +    """
    5.78 +    if _CONFIG is None:
    5.79 +        raise AppConfManagerError('Попытка работать с неинициализированным хранилищем конфигураций')
    5.80 +
    5.81 +    else:
    5.82 +        try:
    5.83 +            return _CONFIG[conf_selector]
    5.84 +
    5.85 +        except KeyError:
    5.86 +            raise AppConfNotFound(f'Не найдена конфигурация "{conf_selector}" в хранилище')
    5.87 +
    5.88 +        except (ValueError, TypeError) as e:
    5.89 +            raise AppConfManagerError(f'Ошибка получения конфигурации "{conf_selector}" из хранилища: {e}')
     6.1 --- a/src/aw_config/app_tools.py	Sat May 04 18:58:50 2024 +0300
     6.2 +++ b/src/aw_config/app_tools.py	Sat May 04 20:36:03 2024 +0300
     6.3 @@ -2,7 +2,7 @@
     6.4  """\
     6.5  Различные инструменты, полезные в построении среды исполнения приложений
     6.6  """
     6.7 -from os.path import dirname, abspath, exists, join as join_p
     6.8 +from os.path import dirname, abspath
     6.9  from os import listdir
    6.10  
    6.11  from .error import Error
    6.12 @@ -14,21 +14,24 @@
    6.13      """
    6.14  
    6.15  
    6.16 +# noinspection GrazieInspection
    6.17  def get_app_root(file_name) -> str:
    6.18      """\
    6.19      Пытаемся получить по имени файла модуля директорию расположения всего модуля целиком.
    6.20      Полезно при формировании имён каталогов ресурсов.
    6.21 -    :param file_name: при вызове должно быть ``__file__``
    6.22 +    :param file_name: При вызове должно быть ``__file__``
    6.23      :returns Имя каталога, в котором находится сам модуль, из файла которого произведён вызов функции.
    6.24      """
    6.25      res = abspath(file_name)
    6.26      res = dirname(res)
    6.27  
    6.28      while res:
    6.29 -        if not '__init__.py' in list(map(lambda x: x.lover(), dirname(res))):
    6.30 +        if '__init__.py' not in list(map(lambda x: x.lower(), listdir(res))):
    6.31              return res
    6.32  
    6.33          else:
    6.34              res = dirname(res)
    6.35  
    6.36      raise ToolsError(f'Не найдена директория размещения для модуля содержащего: {abspath(file_name)}')
    6.37 +
    6.38 +
     7.1 --- a/src/aw_config/file.py	Sat May 04 18:58:50 2024 +0300
     7.2 +++ b/src/aw_config/file.py	Sat May 04 20:36:03 2024 +0300
     7.3 @@ -48,7 +48,7 @@
     7.4          pass
     7.5  
     7.6      def get_value(self, name: str,
     7.7 -                  val_type: Union[type, BaseTypeHelper],
     7.8 +                  val_type: Union[type, BaseTypeHelper] = str,
     7.9                    default: Any = None,
    7.10                    mandatory: bool = True):
    7.11          """\