# HG changeset patch # User Matti Hamalainen # Date 1467625920 -10800 # Node ID 9d4152f32223473e2e6500e82eac3f4e5c278fc6 # Parent ad1e3184c8e3e832422e9bcdfc9fe41d9dc3b9ea Add some code for settings validation. diff -r ad1e3184c8e3 -r 9d4152f32223 multimerge.py --- a/multimerge.py Mon Jul 04 12:50:40 2016 +0300 +++ b/multimerge.py Mon Jul 04 12:52:00 2016 +0300 @@ -76,10 +76,92 @@ gcm_print(u"{0:25} - {1:25} : {2}".format(ev_start, ev_end, event["summary"])) +def gcm_is_str(mstr): + return isinstance(mstr, basestring) + + +def gcm_is_string(mstr): + return mstr == None or gcm_is_str(mstr) + + +def gcm_is_log_level(mstr): + if not gcm_is_str(mstr): + return False + else: + return mstr.upper() in ["CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"] + + +def gcm_trans_log_level(mstr): + return mstr.upper() + + +def gcm_is_filename(mstr): + if not gcm_is_str(mstr): + return False + else: + return re.match("^[a-z0-9][a-z0-9\.\_\-]+$", mstr, flags=re.IGNORECASE) + + +def gcm_trans_bool(mbool): + if gcm_is_str(mbool): + if re.match("^\s*(true|1|on|yes)\s*$", mbool, re.IGNORECASE): + mbool = True + elif re.match("^\s*(false|0|off|no)\s*$", mbool, re.IGNORECASE): + mbool = False + else: + return None + return mbool + +def gcm_is_bool(mbool): + mval = gcm_trans_bool(mbool) + if not isinstance(mval, bool): + gcm_fatal("gcm_is_bool(): Invalid boolean value '{0}', should be true|false|1|0|on|off|yes|no.".format(mbool)) + else: + return True + + +def gcm_trans_list(mlist): + morig = mlist + if gcm_is_str(mlist): + mlist = re.split("\s*,\s*", mlist, flags=re.IGNORECASE) + if not isinstance(mlist, list): + gcm_fatal("gcm_trans_list(): Could not parse list '{0}'.".format(mlist)) + elif not isinstance(mlist, list): + gcm_fatal("gcm_trans_list(): Invalid value '{0}'.".format(mlist)) + return mlist + +def gcm_is_list(mlist): + return gcm_trans_list(mlist) + + +def gcm_is_email(mstr): + if not gcm_is_string(mstr): + return False + else: + return re.match("^.*?\s+<[a-z0-9]+[a-z0-9\.\+\-]*\@[a-z0-9]+[a-z0-9\.\-]+>\s*$|[a-z0-9]+[a-z0-9\.\+\-]*\@[a-z0-9]+[a-z0-9\.\-]+", mstr, flags=re.IGNORECASE) + + +def gcm_trans_email_list(mlist): + if mlist == None: + return mlist + else: + return gcm_trans_list(mlist.strip()) + +def gcm_is_email_list(mlist): + mlist = gcm_trans_email_list(mlist) + if mlist != None: + for email in mlist: + if not gcm_is_email(email): + gcm_fatal("Invalid e-mail address '{0}' in list {1}.".format(email, ", ".join(mlist))) + return True + + + class GCMSettings(dict): def __init__(self): self.m_data = {} self.m_saveable = {} + self.m_validate = {} self.m_translate = {} def __getattr__(self, name): @@ -88,6 +170,11 @@ else: gcm_fatal("GCMSettings.__getattr__(): No such attribute '"+ name +"'.") + def mvalidate(self, name, value): + if name in self.m_validate and self.m_validate[name]: + if not self.m_validate[name](value): + gcm_fatal("GCMSettings.mvalidate(): Invalid value for attribute '{0}': {1}".format(name, value)) + def mtranslate(self, name, value): if name in self.m_translate and self.m_translate[name]: return self.m_translate[name](value) @@ -95,10 +182,14 @@ return value def mdef(self, name, saveable, validate, translate, value): + self.mvalidate(name, value) self.m_saveable[name] = saveable + self.m_validate[name] = validate + self.m_translate[name] = translate self.m_data[name] = self.mtranslate(name, value) def mset(self, name, value): + self.mvalidate(name, value) if name in self.m_data: self.m_data[name] = self.mtranslate(name, value) else: