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