from os import scandir as oscandir, path as opath
from app.utilites.conf_driver_ini import ConfigDriverIni
[документация]class SomeConfig:
_class_file = __file__
_key_splitter = '.'
_configs_root = opath.dirname(opath.dirname(_class_file))
def __init__(self, configs_root=''):
self.set_root(configs_root)
self._catched_vals = {}
self._last_requested_key = ''
[документация] def get(self, key):
""" key - string with dot delimetr aka Key1.kEy2.3key """
self._last_requested_key = key
if key in self._catched_vals:
return self._catched_vals[key]
_parsed_key = self._parse_key(key)
# теперь требуется бежать по ключу и найти файл в котором есть значение
folder = self._configs_root
for step in _parsed_key:
catch_file = ''
catch_dir = ''
try_dir = opath.join(folder, step)
# если нашли директорию
if opath.exists(try_dir):
catch_dir = try_dir
# сперва ищем файл в директории
files = oscandir(folder)
for fI in files:
if not fI.is_file():
continue
splited = fI.name.split('.')
if step == splited[0] and 2== len(splited):
# нашли файл - значит пытаемся получить значение по нему
catch_file = opath.join(folder, fI.name)
break
if '' != catch_file:
try:
# print('SomeConfig.get->catch_file:', catch_file)
catch_file = self.__get_real_filepath(catch_file)
# print('SomeConfig.get->catch_file real:', catch_file)
file_driver = self._get_file_driver(splited[1])
file_driver.set_file(catch_file)
last_steps = _parsed_key[_parsed_key.index(step)+1:]
if not last_steps:
# dump full file content
if 0== _parsed_key.index(step) and step == opath.basename(catch_file).split('.')[0]:
# мы спросили только файл
val = file_driver.to_dict()
if val is not None:
self._catched_vals[key] = val
pass
break # когда оказывается последнее значение ключа - имя файла
val = file_driver.get(last_steps)
if val is not None:
self._catched_vals[key] = val
except:
# написать в лог для какого типа файла нет драйвера конфига
file_driver = None
catch_file = ''
print('Undefined setting key "{}"'.format(key))
# теперь пробросить исключение что такого ключа нет в хранилище
raise Exception('Undefined setting key "{}"'.format(key))
# теперь можно изменить директорию для поиска
if '' != catch_dir:
folder = catch_dir
# теперь кода все обработано отберем только правильное значение
result = None
result = self._detect_result()
return result
def _detect_result(self):
res = None
res = self._catched_vals[self._last_requested_key]
del self._catched_vals[self._last_requested_key]
# print(res)
return res
@staticmethod
def _get_file_driver(file_ext):
if 'ini' == file_ext:
return ConfigDriverIni()
raise Exception('No config file driver for {} file type!'.format(file_ext))
def _parse_key(self, key):
parsed = key.split(self._key_splitter)
return parsed
[документация] def set_root(self, file_name):
if opath.exists(file_name) and opath.isdir(file_name):
self._configs_root = file_name
def __get_real_filepath(self, req_file):
_root_pth = self.__get_app_path()
# рассматриваем файлы внутри приложения
if req_file.startswith(_root_pth):
_app_conf_pth = _root_pth + opath.sep + 'cfg'
# если запрошенный файл находится вне конфигурационной директории приложения
if not req_file.startswith(_app_conf_pth):
# определяем в какой поддиректории приложения ищется файл
relative = req_file.replace(_root_pth, '')
# считаем что данная директория модуль
_mod_name = relative.lstrip(opath.sep).split(opath.sep)[0]
# _mod_name = _mod_name.lstrip(opath.sep)
# если конфигурационная директория существует
if opath.exists(_app_conf_pth):
_t = opath.join(_app_conf_pth, _mod_name)
# если существует директория модуля в конфигурационной директории
if opath.exists(_t):
_t = opath.join(_app_conf_pth, relative.lstrip(opath.sep))
# существует ли указанный конфигурационный файл
if opath.exists(_t):
req_file = _t
return req_file
def __get_app_path(self):
"""
Метод вычисляет путь директории приложения - это отсчетная точка для модулей
:return: None
"""
_pth_utils = opath.dirname(self._class_file)
return opath.dirname(_pth_utils)