Source code for regolith.validators
"""Validators and converters for regolith input."""
import os
from getpass import getpass
from regolith.tools import string_types
[docs]def noop(x):
"""Does nothing, just returns the input."""
return x
[docs]def is_int(x):
"""Tests if something is an integer"""
return isinstance(x, int)
[docs]def always_true(x):
"""Returns True"""
return True
[docs]def always_false(x):
"""Returns False"""
return False
[docs]def is_bool(x):
"""Tests if something is a boolean"""
return isinstance(x, bool)
[docs]def is_string(x):
"""Tests if something is a string"""
return isinstance(x, string_types)
_FALSES = frozenset(["", "0", "n", "f", "no", "none", "false"])
[docs]def to_bool(x):
""""Converts to a boolean in a semantically meaningful way."""
if isinstance(x, bool):
return x
elif isinstance(x, string_types):
return False if x.lower() in _FALSES else True
else:
return bool(x)
[docs]def ensure_string(x):
"""Returns a string if x is not a string, and x if it already is."""
if isinstance(x, string_types):
return x
else:
return str(x)
[docs]def ensure_database(db):
db["name"] = ensure_string(db["name"])
db["url"] = ensure_string(db["url"])
db["path"] = ensure_string(db["path"])
db["public"] = to_bool(db.get("public", True))
return db
[docs]def ensure_databases(dbs):
"""Ensures each dataset in a list of databases"""
return list(map(ensure_database, dbs))
[docs]def ensure_store(store):
store["name"] = ensure_string(store["name"])
store["url"] = ensure_string(store["url"])
store["path"] = ensure_string(store.get("path", None) or "")
store["public"] = to_bool(store.get("public", True))
return store
[docs]def ensure_stores(stores):
"""Ensures each store in a list of stores"""
return list(map(ensure_store, stores))
[docs]def ensure_email(email):
"""Ensures the email top-level key is well formed."""
email["url"] = ensure_string(email["url"])
if "cred" in email:
email["cred"] = ensure_string(email["cred"])
else:
email["cred"] = email["url"] + ".cred"
if not os.path.isfile(email["cred"]):
user = input("Email address for " + email["url"] + ": ")
password = getpass()
s = user + "\n" + password
with open(email["cred"], "w") as f:
f.write(s)
with open(email["cred"], encoding='utf-8') as f:
email["from"] = f.readline().strip()
email["password"] = f.readline().strip()
email["user"] = email["from"].partition("@")[0]
email["port"] = int(email.get("port", 0))
email["verbosity"] = int(email.get("verbosity", 0))
email["tls"] = to_bool(email.get("tls", False))
return email
DEFAULT_VALIDATORS = {
"backend": (is_string, ensure_string),
"builddir": (is_string, ensure_string),
"databases": (always_false, ensure_databases),
"stores": (always_false, ensure_stores),
"email": (always_false, ensure_email),
}