py.lib.aw_config
2:b76a704f31b1 Browse Files
+ Функционал управления объектами конфигураций + В модуле разбора файла конфигураций по умолчанию считаем параметры строками . Чистка от мусора и рефакторинг по результатам анализа кода IDE
pyproject.toml requirements.txt setup.py src/aw_config/__init__.py src/aw_config/app_config_manager.py src/aw_config/app_tools.py src/aw_config/file.py
1.1 --- a/pyproject.toml Sat May 04 18:58:50 2024 +0300 1.2 +++ b/pyproject.toml Sat May 04 20:36:03 2024 +0300 1.3 @@ -4,7 +4,7 @@ 1.4 1.5 [project] 1.6 name = "aw_config" 1.7 -version = "0.202405.2" 1.8 +version = "0.202405.7" 1.9 description = "Модуль поддержки процесса конфигурирования приложения" 1.10 #readme = "README.md" 1.11 requires-python = ">=3.9"
2.1 --- a/requirements.txt Sat May 04 18:58:50 2024 +0300 2.2 +++ b/requirements.txt Sat May 04 20:36:03 2024 +0300 2.3 @@ -1,2 +1,1 @@ 2.4 -toml>=0.10.2 2.5 -setuptools>=59.6.0 2.6 \ No newline at end of file 2.7 +toml>=0.10.2 2.8 \ No newline at end of file
3.1 --- a/setup.py Sat May 04 18:58:50 2024 +0300 3.2 +++ b/setup.py Sat May 04 20:36:03 2024 +0300 3.3 @@ -3,7 +3,7 @@ 3.4 3.5 setup( 3.6 name='aw_config', 3.7 - version='0.202405.2', 3.8 + version='0.202405.7', 3.9 packages=['aw_config'], 3.10 package_dir={'aw_config': 'src/aw_config'}, 3.11 url='https://devel.a0fs.ru/py.lib.aw_config',
4.1 --- a/src/aw_config/__init__.py Sat May 04 18:58:50 2024 +0300 4.2 +++ b/src/aw_config/__init__.py Sat May 04 20:36:03 2024 +0300 4.3 @@ -3,6 +3,8 @@ 4.4 from .type_helpers import ANY, DICT, LIST 4.5 from .file import ConfigFile, ConfigSectionNotFound, ConfigFileError 4.6 from .app_tools import get_app_root 4.7 +from .app_config_manager import (get_config, init_configs, replace_config, add_config, 4.8 + AppConfNotFound, AppConfManagerError) 4.9 4.10 4.11 __all__ = [ 4.12 @@ -10,4 +12,5 @@ 4.13 'ANY', 'DICT', 'LIST', 4.14 'ConfigFile', 'ConfigSectionNotFound', 'ConfigFileError', 4.15 'get_app_root', 4.16 + 'get_config', 'init_configs', 'replace_config', 'add_config', 'AppConfNotFound', 'AppConfManagerError' 4.17 ]
5.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 5.2 +++ b/src/aw_config/app_config_manager.py Sat May 04 20:36:03 2024 +0300 5.3 @@ -0,0 +1,86 @@ 5.4 +# coding: utf-8 5.5 +"""\ 5.6 +Пробуем упростить работу с объектами конфигурации при работе с приложениями. 5.7 +""" 5.8 +from threading import Lock 5.9 +from typing import Optional, Dict 5.10 + 5.11 +from .error import Error 5.12 + 5.13 + 5.14 +class AppConfManagerError(Error): 5.15 + """\ 5.16 + Базовый класс ошибок работы с хранилищем конфигураций 5.17 + """ 5.18 + 5.19 + 5.20 +class AppConfNotFound(AppConfManagerError): 5.21 + """\ 5.22 + Исключение, возникающее когда в хранилище не найдена нужная конфигурация 5.23 + """ 5.24 + 5.25 + 5.26 +_CONFIG: Optional[Dict] = None 5.27 +_CONFIG_GUARD = Lock() 5.28 + 5.29 + 5.30 +def init_configs(): 5.31 + """\ 5.32 + Инициализируем хранилище конфигураций 5.33 + """ 5.34 + global _CONFIG 5.35 + with _CONFIG_GUARD: 5.36 + if _CONFIG is None: 5.37 + _CONFIG = {} 5.38 + 5.39 + 5.40 +def add_config(conf_selector, conf_obj): 5.41 + """\ 5.42 + Добавляет в хранилище объект конфигурации. Затем его можно извлечь по селектору. Удобно указывать 5.43 + в качестве такого селектора класс, объектом которого является данный объект конфигурации 5.44 + """ 5.45 + global _CONFIG 5.46 + with _CONFIG_GUARD: 5.47 + if _CONFIG is None: 5.48 + raise AppConfManagerError(f'При попытке добавить конфигурацию "{conf_selector}" в хранилище ' 5.49 + f'оказалось, что оно не инициализировано') 5.50 + 5.51 + if conf_selector in _CONFIG: 5.52 + raise AppConfManagerError(f'Селектор "{conf_selector}" дублируется.') 5.53 + 5.54 + _CONFIG[conf_selector] = conf_obj 5.55 + 5.56 + 5.57 +def replace_config(conf_selector, conf_obj): 5.58 + """\ 5.59 + Заменяем добавленный ранее объект конфигурации 5.60 + """ 5.61 + global _CONFIG 5.62 + with _CONFIG_GUARD: 5.63 + if _CONFIG is None: 5.64 + raise AppConfManagerError(f'При попытке заменить конфигурацию "{conf_selector}" в хранилище ' 5.65 + f'оказалось, что оно не инициализировано') 5.66 + 5.67 + elif conf_selector in _CONFIG: 5.68 + _CONFIG[conf_selector] = conf_obj 5.69 + 5.70 + else: 5.71 + raise AppConfManagerError(f'Не найдена предыдущая конфигурация "{conf_selector}" при попытке её замены') 5.72 + 5.73 + 5.74 +def get_config(conf_selector): 5.75 + """\ 5.76 + Получаем из хранилища добавленный ранее объект конфигурации по селектору. 5.77 + """ 5.78 + if _CONFIG is None: 5.79 + raise AppConfManagerError('Попытка работать с неинициализированным хранилищем конфигураций') 5.80 + 5.81 + else: 5.82 + try: 5.83 + return _CONFIG[conf_selector] 5.84 + 5.85 + except KeyError: 5.86 + raise AppConfNotFound(f'Не найдена конфигурация "{conf_selector}" в хранилище') 5.87 + 5.88 + except (ValueError, TypeError) as e: 5.89 + raise AppConfManagerError(f'Ошибка получения конфигурации "{conf_selector}" из хранилища: {e}')
6.1 --- a/src/aw_config/app_tools.py Sat May 04 18:58:50 2024 +0300 6.2 +++ b/src/aw_config/app_tools.py Sat May 04 20:36:03 2024 +0300 6.3 @@ -2,7 +2,7 @@ 6.4 """\ 6.5 Различные инструменты, полезные в построении среды исполнения приложений 6.6 """ 6.7 -from os.path import dirname, abspath, exists, join as join_p 6.8 +from os.path import dirname, abspath 6.9 from os import listdir 6.10 6.11 from .error import Error 6.12 @@ -14,21 +14,24 @@ 6.13 """ 6.14 6.15 6.16 +# noinspection GrazieInspection 6.17 def get_app_root(file_name) -> str: 6.18 """\ 6.19 Пытаемся получить по имени файла модуля директорию расположения всего модуля целиком. 6.20 Полезно при формировании имён каталогов ресурсов. 6.21 - :param file_name: при вызове должно быть ``__file__`` 6.22 + :param file_name: При вызове должно быть ``__file__`` 6.23 :returns Имя каталога, в котором находится сам модуль, из файла которого произведён вызов функции. 6.24 """ 6.25 res = abspath(file_name) 6.26 res = dirname(res) 6.27 6.28 while res: 6.29 - if not '__init__.py' in list(map(lambda x: x.lover(), dirname(res))): 6.30 + if '__init__.py' not in list(map(lambda x: x.lower(), listdir(res))): 6.31 return res 6.32 6.33 else: 6.34 res = dirname(res) 6.35 6.36 raise ToolsError(f'Не найдена директория размещения для модуля содержащего: {abspath(file_name)}') 6.37 + 6.38 +
7.1 --- a/src/aw_config/file.py Sat May 04 18:58:50 2024 +0300 7.2 +++ b/src/aw_config/file.py Sat May 04 20:36:03 2024 +0300 7.3 @@ -48,7 +48,7 @@ 7.4 pass 7.5 7.6 def get_value(self, name: str, 7.7 - val_type: Union[type, BaseTypeHelper], 7.8 + val_type: Union[type, BaseTypeHelper] = str, 7.9 default: Any = None, 7.10 mandatory: bool = True): 7.11 """\