settings_manager.py 3.4 KB

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