py.lib.aw_config
2024-05-04
py.lib.aw_config/src/aw_config/app_config_manager.py
+ Функционал управления объектами конфигураций + В модуле разбора файла конфигураций по умолчанию считаем параметры строками . Чистка от мусора и рефакторинг по результатам анализа кода IDE
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}')