settings_manager.py 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import os, json
  2. from src.settings import settings
  3. class settings_manager (object):
  4. # Объект настроек
  5. __settings = None
  6. # Путь до файла настроек
  7. __filename = "settings.json"
  8. # Словарь со считанными данными
  9. __data = {}
  10. # Возвращаем существующий инстанс при вызове new() (singleton)
  11. def __new__(cls):
  12. if not hasattr(cls, "instance"):
  13. cls.instance = super(settings_manager, cls).__new__(cls)
  14. return cls.instance
  15. @property
  16. def data(self):
  17. return self.__data
  18. @property
  19. def settings(self):
  20. return self.__settings
  21. def __convert(self):
  22. """
  23. Заполнить объект настроек
  24. Raises:
  25. Exception: Невозможно создать экземпляр класса настроек
  26. """
  27. # Создаем инстанс settings, если он еще не создан
  28. if not self.__settings:
  29. self.__settings = settings()
  30. # Выбрасываем ошибку, если тип __settings не соответствует нужному
  31. if not isinstance(self.__settings, settings):
  32. raise Exception("Невозможно создать экземпляр класса настроек")
  33. # Переносим считанные значения в инстанс настроек
  34. for key in self.__data.keys():
  35. # Пропускаем, если у settings нет соответствующего свойства
  36. if not hasattr(self.__settings, key): continue
  37. setattr(self.__settings, key, self.__data[key])
  38. def open(self, filename):
  39. """
  40. Открыть файл с настройками
  41. Args:
  42. filename: Имя файла
  43. Raises:
  44. TypeError: Неверный тип аргумента
  45. ValueError: Неверная длина аргумента
  46. """
  47. # Проверяем, чтобы путь был строкой
  48. if not isinstance(filename, str):
  49. raise TypeError("Неверный тип аргумента")
  50. # Проверяем, чтобы путь не был пуст
  51. if len(filename) == 0:
  52. raise ValueError("Неверная длина аргумента")
  53. # Убираем leading/trailing пробелы
  54. self.__filename = filename.strip()
  55. return self.__open()
  56. def __open(self):
  57. """
  58. Открыть файл с настройками
  59. Raises:
  60. FileNotFoundError: Ошибка при открытии файла
  61. """
  62. settings_file = self.__filename
  63. # Проверяем, существует ли файл по данному пути
  64. if not os.path.exists(settings_file):
  65. raise FileNotFoundError("Невозможно загрузить файл настроек")
  66. # Открываем файл и парсим JSON
  67. with open(settings_file, "r", encoding="UTF-8") as read_file:
  68. self.__data = json.load(read_file)
  69. # Заполняем объект settings прочитанными значениями
  70. self.__convert()
  71. return True