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

172 lines
5.9 KiB
Python

# DRF Rack
# Библиотека классов расширений для Django REST Framework
#
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
# Все права защищены. Лицензия: 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.")