Source code for khoros.utils.environment

# -*- coding: utf-8 -*-
"""
:Module:            khoros.objects.messages
:Synopsis:          This module includes functions that identify environment variables for the khoros library
:Usage:             ``from khoros.utils import environment``
:Example:           ``environment.update_env_variable_names()``
:Created By:        Jeff Shurtliff
:Last Modified:     Jeff Shurtliff
:Modified Date:     23 May 2022
"""

import os
import json
import importlib

from .. import errors
from ..utils.core_utils import get_file_type

ENV_VARIABLE_NAMES = ['KHOROS_URL', 'KHOROS_TENANT_ID', 'KHOROS_DEFAULT_AUTH', 'KHOROS_OAUTH_ID', 'KHOROS_OAUTH_SECRET',
                      'KHOROS_OAUTH_REDIRECT_URL', 'KHOROS_SESSION_USER', 'KHOROS_SESSION_PW', 'KHOROS_PREFER_JSON',
                      'KHOROS_LIQL_PRETTY', 'KHOROS_LIQL_TRACK_LSI', 'KHOROS_LIQL_ALWAYS_OK', 'KHOROS_TRANSLATE_ERRORS']

ENV_SETTINGS_MAPPING = {
    'KHOROS_URL': ('community_url',),
    'KHOROS_TENANT_ID': ('tenant_id',),
    'KHOROS_DEFAULT_AUTH': ('auth_type',),
    'KHOROS_OAUTH_ID': ('oauth2', 'client_id'),
    'KHOROS_OAUTH_SECRET': ('oauth2', 'client_secret'),
    'KHOROS_OAUTH_REDIRECT_URL': ('oauth2', 'redirect_url'),
    'KHOROS_SESSION_USER': ('session_auth', 'username'),
    'KHOROS_SESSION_PW': ('session_auth', 'password'),
    'KHOROS_PREFER_JSON': ('prefer_json',),
    'KHOROS_TRANSLATE_ERRORS': ('translate_errors',),
    # TODO: Add LiQL environment variables
}

# Define global variables for the variable names and mapping that can be overwritten by custom values
env_variable_names = ENV_VARIABLE_NAMES
env_settings_mapping = ENV_SETTINGS_MAPPING


def _env_variable_exists(env_variable):
    """This function checks to see if an environment variable is already defined.

    .. versionadded:: 2.2.0

    :param env_variable: The name of the environment variable for which to check
    :type env_variable: str
    :returns: Boolean value indicating if the environment variable already exists
    """
    found = False
    try:
        found = True if os.environ[env_variable] else False
    except KeyError:
        pass
    return found


def _get_env_variable_value(env_variable):
    """This function returns the value of a given environment variable name.

    .. versionadded:: 2.2.0

    :param env_variable: The name of the environment variable to return
    :type env_variable: str
    :returns: The value of the environment variable or ``None`` if the variable name does not exist
    """
    return os.getenv(env_variable)


[docs] def get_env_variables(): """This function retrieves any defined environment variables associate with the khoros library. .. versionadded:: 2.2.0 :returns: A dictionary with any relevant, defined environment variables """ env_settings = {} for var_name in env_variable_names: if _env_variable_exists(var_name): env_settings[var_name] = _get_env_variable_value(var_name) return env_settings
def _update_env_list(_orig_name, _custom_name): """This function replaces a value in the ``env_variable_names`` global variable with a custom value. .. versionchanged:: 5.0.0 Removed the redundant return statement. .. versionadded:: 2.2.0 :param _orig_name: The original value to replace :type _orig_name: str :param _custom_name: The custom value that will replace the original value :type _custom_name: str :returns: None """ if _orig_name in env_variable_names: env_variable_names.remove(_orig_name) env_variable_names.append(_custom_name) def _update_env_mapping(_orig_name, _custom_name): """This function replaces a dictionary key in the ``env_variable_mapping`` global variable with a custom name. .. versionchanged:: 5.0.0 Removed the redundant return statement. .. versionadded:: 2.2.0 :param _orig_name: The original value to replace :type _orig_name: str :param _custom_name: The custom value that will replace the original value :type _custom_name: str :returns: None """ if _orig_name in env_settings_mapping: env_settings_mapping[_custom_name] = env_settings_mapping.pop(_orig_name)
[docs] def update_env_variable_names(custom_names): """This function updates the original environment variable names with custom names when applicable. .. versionchanged:: 5.0.0 Removed the redundant return statement. .. versionadded:: 2.2.0 :param custom_names: A dictionary (or file path to a YAML or JSON file) that maps the original and custom names :type custom_names: dict, str :returns: None """ if custom_names: if type(custom_names) == str: custom_names = _import_custom_names_file(custom_names) if type(custom_names) == dict: for orig_name, custom_name in custom_names.items(): _update_env_list(orig_name, custom_name) _update_env_mapping(orig_name, custom_name)
# Define function to import a YAML helper file def _import_custom_names_file(file_path): """This function imports a YAML (.yml) helper config file. .. versionchanged:: 4.0.0 The :py:mod:`importlib` module is now utilized to import the ``PyYAML`` package where necessary. .. versionadded:: 2.2.0 :param file_path: The file path to the YAML file :type file_path: str :returns: The parsed configuration data :raises: :py:exc:`FileNotFoundError`, :py:exc:`khoros.errors.exceptions.UnknownFileTypeError` """ file_type = get_file_type(file_path) with open(file_path, 'r') as cfg_file: if file_type == 'yaml': yaml = importlib.import_module('yaml') custom_names_cfg = yaml.safe_load(cfg_file) elif file_type == 'json': custom_names_cfg = json.load(cfg_file) else: raise errors.exceptions.UnknownFileTypeError(file=file_path) return custom_names_cfg