py.lib.aw_config

Yohn Y. 2024-05-04

2:b76a704f31b1 Go to Latest

py.lib.aw_config/src/aw_config/app_config_manager.py

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

History
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/aw_config/app_config_manager.py	Sat May 04 20:36:03 2024 +0300
     1.3 @@ -0,0 +1,86 @@
     1.4 +# coding: utf-8
     1.5 +"""\
     1.6 +Пробуем упростить работу с объектами конфигурации при работе с приложениями.
     1.7 +"""
     1.8 +from threading import Lock
     1.9 +from typing import Optional, Dict
    1.10 +
    1.11 +from .error import Error
    1.12 +
    1.13 +
    1.14 +class AppConfManagerError(Error):
    1.15 +    """\
    1.16 +    Базовый класс ошибок работы с хранилищем конфигураций
    1.17 +    """
    1.18 +
    1.19 +
    1.20 +class AppConfNotFound(AppConfManagerError):
    1.21 +    """\
    1.22 +    Исключение, возникающее когда в хранилище не найдена нужная конфигурация
    1.23 +    """
    1.24 +
    1.25 +
    1.26 +_CONFIG: Optional[Dict] = None
    1.27 +_CONFIG_GUARD = Lock()
    1.28 +
    1.29 +
    1.30 +def init_configs():
    1.31 +    """\
    1.32 +    Инициализируем хранилище конфигураций
    1.33 +    """
    1.34 +    global _CONFIG
    1.35 +    with _CONFIG_GUARD:
    1.36 +        if _CONFIG is None:
    1.37 +            _CONFIG = {}
    1.38 +
    1.39 +
    1.40 +def add_config(conf_selector, conf_obj):
    1.41 +    """\
    1.42 +    Добавляет в хранилище объект конфигурации. Затем его можно извлечь по селектору. Удобно указывать
    1.43 +    в качестве такого селектора класс, объектом которого является данный объект конфигурации
    1.44 +    """
    1.45 +    global _CONFIG
    1.46 +    with _CONFIG_GUARD:
    1.47 +        if _CONFIG is None:
    1.48 +            raise AppConfManagerError(f'При попытке добавить конфигурацию "{conf_selector}" в хранилище '
    1.49 +                                      f'оказалось, что оно не инициализировано')
    1.50 +
    1.51 +        if conf_selector in _CONFIG:
    1.52 +            raise AppConfManagerError(f'Селектор "{conf_selector}" дублируется.')
    1.53 +
    1.54 +        _CONFIG[conf_selector] = conf_obj
    1.55 +
    1.56 +
    1.57 +def replace_config(conf_selector, conf_obj):
    1.58 +    """\
    1.59 +    Заменяем добавленный ранее объект конфигурации
    1.60 +    """
    1.61 +    global _CONFIG
    1.62 +    with _CONFIG_GUARD:
    1.63 +        if _CONFIG is None:
    1.64 +            raise AppConfManagerError(f'При попытке заменить конфигурацию "{conf_selector}" в хранилище '
    1.65 +                                      f'оказалось, что оно не инициализировано')
    1.66 +
    1.67 +        elif conf_selector in _CONFIG:
    1.68 +            _CONFIG[conf_selector] = conf_obj
    1.69 +
    1.70 +        else:
    1.71 +            raise AppConfManagerError(f'Не найдена предыдущая конфигурация "{conf_selector}" при попытке её замены')
    1.72 +
    1.73 +
    1.74 +def get_config(conf_selector):
    1.75 +    """\
    1.76 +    Получаем из хранилища добавленный ранее объект конфигурации по селектору.
    1.77 +    """
    1.78 +    if _CONFIG is None:
    1.79 +        raise AppConfManagerError('Попытка работать с неинициализированным хранилищем конфигураций')
    1.80 +
    1.81 +    else:
    1.82 +        try:
    1.83 +            return _CONFIG[conf_selector]
    1.84 +
    1.85 +        except KeyError:
    1.86 +            raise AppConfNotFound(f'Не найдена конфигурация "{conf_selector}" в хранилище')
    1.87 +
    1.88 +        except (ValueError, TypeError) as e:
    1.89 +            raise AppConfManagerError(f'Ошибка получения конфигурации "{conf_selector}" из хранилища: {e}')