Files
drf-rack/net/xeaf/rack/utils/settings/environment.py

171 lines
5.9 KiB
Python

# DRF Rack
# Библиотека классов расширений для Django REST Framework
#
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
# Все права защищены. Лицензия: MIT
"""
Описание класса EnvUtils
"""
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
environ.Env.read_env(os.path.join(cls.__base_dir, '.env'))
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.")