changeset 5:9d4152f32223

Add some code for settings validation.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 04 Jul 2016 12:52:00 +0300
parents ad1e3184c8e3
children ee6bf617f839
files multimerge.py
diffstat 1 files changed, 91 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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: