aboutsummaryrefslogtreecommitdiff
"""Functions used in setting up configurations."""
import os # replace os.path with pathlib.Path
import sys
import logging

from flask import current_app

logger = logging.getLogger(__name__)

def override_from_envvars(app):
    """
    Override `app` configuration values with those in the enviroment variables with the same names.
    """
    configs = dict((key, value.strip()) for key,value in
                   ((key, os.environ.get(key)) for key in app.config.keys())
                   if value is not None and value != "")
    app.config.update(**configs)
    return app

def get_setting(app, setting_id, guess=None):
    """Resolve a setting from the `app`."""
    setting = app.config.get(setting_id, guess or "")
    if setting is None or setting == "":
        raise Exception(
            f"{setting_id} setting unknown or faulty "
            "(update default_settings.py?).")
    return setting

def get_setting_bool(app, setting_id):
    v = get_setting(app, setting_id)
    if v not in [0, False, 'False', 'FALSE', None]:
        return True
    return False


def get_setting_int(app, setting_id):
    val = get_setting(app, setting_id)
    if isinstance(val, str):
        return int(val)
    if val is None:
        return 0
    return val

def valid_bin(path):
    if os.path.islink(path) or valid_file(path):
        return path
    return None

def valid_file(path):
    if os.path.isfile(path):
        return path
    return None

def valid_path(path):
    if os.path.isdir(path):
        return path
    return None

def flat_file_exists(app, subdir):
    base = get_setting(app, "GENENETWORK_FILES")
    return valid_path(base + "/" + subdir)

def flat_files(app, subdir=None):
    base = get_setting(app, "GENENETWORK_FILES")
    if subdir:
        return assert_dir(base + "/" + subdir)
    return assert_dir(base)

def assert_bin(fn):
    if not valid_bin(fn):
        raise Exception("ERROR: can not find binary " + fn)
    return fn


def assert_dir(the_dir):
    if not valid_path(the_dir):
        raise FileNotFoundError(f"ERROR: can not find directory '{the_dir}'")
    return the_dir

def assert_writable_dir(path):
    try:
        fn = path + "/test.txt"
        fh = open(fn, 'w')
        fh.write("I am writing this text to the file\n")
        fh.close()
        os.remove(fn)
    except IOError:
        raise Exception(f"Unable to write test.txt to directory {path}")
    return path

def assert_file(fn):
    if not valid_file(fn):
        raise FileNotFoundError(f"Unable to find file '{fn}'")
    return fn

def mk_dir(path):
    if not valid_path(path):
        os.makedirs(path)
    return assert_dir(path)

def locate(app, name, subdir=None):
    """
    Locate a static flat file in the GENENETWORK_FILES environment.

    This function throws an error when the file is not found.
    """
    base = get_setting(app, "GENENETWORK_FILES")
    if subdir:
        base = base + "/" + subdir
    if valid_path(base):
        lookfor = base + "/" + name
        if valid_file(lookfor):
            return lookfor
        else:
            raise Exception("Can not locate " + lookfor)
    if subdir:
        sys.stderr.write(subdir)
    raise Exception("Can not locate " + name + " in " + base)

def locate_ignore_error(app, name, subdir=None):
    """
    Locate a static flat file in the GENENETWORK_FILES environment.

    This function does not throw an error when the file is not found
    but returns None.
    """
    base = get_setting(app, "GENENETWORK_FILES")
    if subdir:
        base = base + "/" + subdir
    if valid_path(base):
        lookfor = base + "/" + name
        if valid_file(lookfor):
            return lookfor
    return None

def tempdir(app):
    """Retrieve the configured temporary directory or `/tmp`."""
    return valid_path(get_setting(app, "TMPDIR", "/tmp"))

def show_settings(app):
    """Print out the application configurations."""
    BLUE = '\033[94m'
    GREEN = '\033[92m'
    BOLD = '\033[1m'
    ENDC = '\033[0m'
    app = app or current_app
    LOG_LEVEL = app.config.get("LOG_LEVEL")

    print(("Set global log level to " + BLUE + LOG_LEVEL + ENDC),
          file=sys.stderr)
    log_level = getattr(logging, LOG_LEVEL.upper())
    logging.basicConfig(level=log_level)

    logger.info(BLUE + "Mr. Mojo Risin 2" + ENDC)
    keylist = list(app.config.keys())
    print("runserver.py: ****** Webserver configuration - k,v pairs from app.config ******",
          file=sys.stderr)
    keylist.sort()
    for k in keylist:
        try:
            print(("%s: %s%s%s%s" % (k, BLUE, BOLD, get_setting(app, k), ENDC)),
                  file=sys.stderr)
        except:
            print(("%s: %s%s%s%s" % (k, GREEN, BOLD, app.config[k], ENDC)),
                  file=sys.stderr)