py.lib.aw_config

Yohn Y. 2024-05-05 Parent:b76a704f31b1

6:4bcdc1276091 Go to Latest

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

Added tag 0.202405.11 for changeset 564293b54664

History
awgur@2 1 # coding: utf-8
awgur@2 2 """\
awgur@2 3 Пробуем упростить работу с объектами конфигурации при работе с приложениями.
awgur@2 4 """
awgur@2 5 from threading import Lock
awgur@2 6 from typing import Optional, Dict
awgur@2 7
awgur@2 8 from .error import Error
awgur@2 9
awgur@2 10
awgur@2 11 class AppConfManagerError(Error):
awgur@2 12 """\
awgur@2 13 Базовый класс ошибок работы с хранилищем конфигураций
awgur@2 14 """
awgur@2 15
awgur@2 16
awgur@2 17 class AppConfNotFound(AppConfManagerError):
awgur@2 18 """\
awgur@2 19 Исключение, возникающее когда в хранилище не найдена нужная конфигурация
awgur@2 20 """
awgur@2 21
awgur@2 22
awgur@2 23 _CONFIG: Optional[Dict] = None
awgur@2 24 _CONFIG_GUARD = Lock()
awgur@2 25
awgur@2 26
awgur@2 27 def init_configs():
awgur@2 28 """\
awgur@2 29 Инициализируем хранилище конфигураций
awgur@2 30 """
awgur@2 31 global _CONFIG
awgur@2 32 with _CONFIG_GUARD:
awgur@2 33 if _CONFIG is None:
awgur@2 34 _CONFIG = {}
awgur@2 35
awgur@2 36
awgur@2 37 def add_config(conf_selector, conf_obj):
awgur@2 38 """\
awgur@2 39 Добавляет в хранилище объект конфигурации. Затем его можно извлечь по селектору. Удобно указывать
awgur@2 40 в качестве такого селектора класс, объектом которого является данный объект конфигурации
awgur@2 41 """
awgur@2 42 global _CONFIG
awgur@2 43 with _CONFIG_GUARD:
awgur@2 44 if _CONFIG is None:
awgur@2 45 raise AppConfManagerError(f'При попытке добавить конфигурацию "{conf_selector}" в хранилище '
awgur@2 46 f'оказалось, что оно не инициализировано')
awgur@2 47
awgur@2 48 if conf_selector in _CONFIG:
awgur@2 49 raise AppConfManagerError(f'Селектор "{conf_selector}" дублируется.')
awgur@2 50
awgur@2 51 _CONFIG[conf_selector] = conf_obj
awgur@2 52
awgur@2 53
awgur@2 54 def replace_config(conf_selector, conf_obj):
awgur@2 55 """\
awgur@2 56 Заменяем добавленный ранее объект конфигурации
awgur@2 57 """
awgur@2 58 global _CONFIG
awgur@2 59 with _CONFIG_GUARD:
awgur@2 60 if _CONFIG is None:
awgur@2 61 raise AppConfManagerError(f'При попытке заменить конфигурацию "{conf_selector}" в хранилище '
awgur@2 62 f'оказалось, что оно не инициализировано')
awgur@2 63
awgur@2 64 elif conf_selector in _CONFIG:
awgur@2 65 _CONFIG[conf_selector] = conf_obj
awgur@2 66
awgur@2 67 else:
awgur@2 68 raise AppConfManagerError(f'Не найдена предыдущая конфигурация "{conf_selector}" при попытке её замены')
awgur@2 69
awgur@2 70
awgur@2 71 def get_config(conf_selector):
awgur@2 72 """\
awgur@2 73 Получаем из хранилища добавленный ранее объект конфигурации по селектору.
awgur@2 74 """
awgur@2 75 if _CONFIG is None:
awgur@2 76 raise AppConfManagerError('Попытка работать с неинициализированным хранилищем конфигураций')
awgur@2 77
awgur@2 78 else:
awgur@2 79 try:
awgur@2 80 return _CONFIG[conf_selector]
awgur@2 81
awgur@2 82 except KeyError:
awgur@2 83 raise AppConfNotFound(f'Не найдена конфигурация "{conf_selector}" в хранилище')
awgur@2 84
awgur@2 85 except (ValueError, TypeError) as e:
awgur@2 86 raise AppConfManagerError(f'Ошибка получения конфигурации "{conf_selector}" из хранилища: {e}')