# DRF Rack # Библиотека классов расширений для Django REST Framework # # Автор: Николай В. Анохин # Все права защищены. Лицензия: MIT """ Описание класса Environment """ import os import environ from django.core.exceptions import ImproperlyConfigured from environ import Env from environ import NoValue class Environment: """ Реализация доступа к параметрам и переменным окружения """ _base_dir: str """ Путь к корневой директории приложения """ _is_initialized: bool """ Признак инициализации конфигурации """ _env: Env """ Хранилище переменных окружения """ _env_prefix: str """ Префикс переменных окружения """ @classmethod def initialize(cls, base_dir: str, env_prefix: str = ""): """ Инициализирует конфигурацию приложения :param base_dir: Путь к корневой директории :param env_prefix: Префикс переменных окружения """ cls._base_dir = base_dir cls._env = environ.Env() cls._env_prefix = env_prefix env_path = os.path.join(cls._base_dir, '.env') environ.Env.read_env(env_path) cls._is_initialized = True @classmethod def env(cls) -> Env: """ Возвращает объект для работы с переменными окружения :return: Объект для работы с переменными окружения """ cls._check_initialization() return cls._env @classmethod def get_str(cls, name: str, default_value: str | NoValue = Env.NOTSET) -> str: """ Возвращает строковое значение переменной окружения :param name: Название переменной окружения :param default_value: Значение по умолчанию :return: Значение переменной окружения """ return cls.env().str(cls._env_name(name), default_value) @classmethod def get_int(cls, name: str, default_value: int | NoValue = Env.NOTSET) -> int: """ Возвращает целочисленное значение переменной окружения :param name: Название переменной окружения :param default_value: Значение по умолчанию :return: Значение переменной окружения """ return cls.env().int(cls._env_name(name), default_value) @classmethod def get_bool(cls, name: str, default_value: bool | NoValue = Env.NOTSET) -> bool: """ Возвращает логическое значение переменной окружения :param name: Название переменной окружения :param default_value: Значение по умолчанию :return: Значение переменной окружения """ return cls.env().bool(cls._env_name(name), default_value) @classmethod def get_str_as_dir(cls, name: str, default_value: str | NoValue = Env.NOTSET) -> str: """ Возвращает значение переменной окружения в виде проверенного имени директории :param name: Название переменной окружения :param default_value: Значение по умолчанию :return: Значение переменной окружения """ dir_path = cls.get_str(name, default_value) os.makedirs(dir_path, exist_ok=True) return dir_path @classmethod def get_str_as_file(cls, name: str, default_value: str | NoValue = Env.NOTSET) -> str: """ Возвращает значение переменной окружения в виде проверенного имени фйала :param name: Название переменной окружения :param default_value: Значение по умолчанию :return: Значение переменной окружения """ file_path = cls.get_str(name, default_value) dir_path = os.path.dirname(file_path) os.makedirs(dir_path, exist_ok=True) return file_path @classmethod def get_str_as_list(cls, name: str, default_value: str | NoValue = Env.NOTSET) -> list[str]: """ Возвращает значение переменной окружения в виде списка строк :param name: Название переменной окружения :param default_value: Значение по умолчанию :return: Значение переменной окружения """ values = cls.get_str(name, default_value) if not values: return [] return [item.strip() for item in values.split(",") if item.strip()] @classmethod def _env_name(cls, name: str) -> str: """ Возвращает полное имя переменной окружения :param name: Название переменной окружения :return: Имя переменной окружения """ return f"{cls._env_prefix}{name}" @classmethod def _check_initialization(cls) -> None: """ Проверяет завершение инициализации """ if not cls._is_initialized: raise ImproperlyConfigured(f"Class {__class__.__name__} is not initialized.")