py.lib.aw_config
2024-05-05
Parent:b76a704f31b1
py.lib.aw_config/src/aw_config/app_config_manager.py
Added tag 0.202405.11 for changeset 564293b54664
| 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}') |