import os import json from src.settings.settings import settings from src.errors.instance_exception import instance_exception from src.validation.validator import validator from src.errors.file_exception import file_exception class settings_manager(object): # Объект настроек __settings = settings() # Путь до файла настроек __filename = "settings.json" # Словарь со считанными данными __data = {} # Валидатор __vtor = validator() # Возвращаем существующий инстанс при вызове new() (singleton) def __new__(cls): if not hasattr(cls, "instance"): cls.instance = super(settings_manager, cls).__new__(cls) return cls.instance @property def data(self): return self.__data @property def settings(self): return self.__settings def __convert(self): """ Заполнить объект настроек Raises: Exception: Невозможно создать экземпляр класса настроек """ # Создаем инстанс settings, если он еще не создан if not self.__settings: self.__settings = settings() # Выбрасываем ошибку, если тип __settings не соответствует нужному if not isinstance(self.__settings, settings): raise instance_exception("Невозможно создать экземпляр класса настроек") # Переносим считанные значения в инстанс настроек for key in self.__data.keys(): # Пропускаем, если у settings нет соответствующего свойства if not hasattr(self.__settings, key): continue setattr(self.__settings, key, self.__data[key]) def open(self, filename): """ Открыть файл с настройками Args: filename: Имя файла Raises: TypeError: Неверный тип аргумента ValueError: Неверная длина аргумента """ # Проверяем, чтобы путь был строкой self.__vtor.check_type(filename, str) # Проверяем, чтобы путь не был пуст self.__vtor.check_length_greater(filename, 0) # Убираем leading/trailing пробелы self.__filename = filename.strip() return self.__open() def __open(self): """ Открыть файл с настройками Raises: FileNotFoundError: Ошибка при открытии файла """ settings_file = self.__filename # Проверяем, существует ли файл по данному пути if not os.path.exists(settings_file): raise file_exception("Файл не найден") # Открываем файл и парсим JSON with open(settings_file, "r", encoding="UTF-8") as read_file: self.__data = json.load(read_file) # Заполняем объект settings прочитанными значениями self.__convert() return True