aboutsummaryrefslogtreecommitdiff
path: root/wqflask/utility/configuration.py
diff options
context:
space:
mode:
Diffstat (limited to 'wqflask/utility/configuration.py')
-rw-r--r--wqflask/utility/configuration.py165
1 files changed, 165 insertions, 0 deletions
diff --git a/wqflask/utility/configuration.py b/wqflask/utility/configuration.py
new file mode 100644
index 00000000..933d9626
--- /dev/null
+++ b/wqflask/utility/configuration.py
@@ -0,0 +1,165 @@
+"""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)