# HG changeset patch # User Matti Hamalainen # Date 1467631256 -10800 # Node ID ff47f8088ef98c69b4d80098617f2520e667572d # Parent 793b7997cc2bfdc7360f0d68fb1b03b5d91597bc Make things more OO. diff -r 793b7997cc2b -r ff47f8088ef9 multimerge.py --- a/multimerge.py Mon Jul 04 14:12:31 2016 +0300 +++ b/multimerge.py Mon Jul 04 14:20:56 2016 +0300 @@ -94,84 +94,6 @@ 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): @@ -225,6 +147,77 @@ self.mset(name, value) gcm_debug("{0} -> '{1}' == {2}".format(name, value, self.mget(name))) + def is_str(self, mvalue): + return isinstance(mvalue, basestring) + + def is_string(self, mvalue): + return mvalue == None or self.is_str(mvalue) + + def is_log_level(self, mvalue): + if not self.is_str(mvalue): + return False + else: + return mvalue.upper() in ["CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"] + + def trans_log_level(self, mvalue): + return mvalue.upper() + + def is_filename(self, mvalue): + if not self.is_str(mvalue): + return False + else: + return re.match("^[a-z0-9][a-z0-9\.\_\-]+$", mvalue, flags=re.IGNORECASE) + + def trans_bool(self, mvalue): + if self.is_str(mvalue): + if re.match("^\s*(true|1|on|yes)\s*$", mvalue, re.IGNORECASE): + mvalue = True + elif re.match("^\s*(false|0|off|no)\s*$", mvalue, re.IGNORECASE): + mvalue = False + else: + return None + return mvalue + + def is_bool(self, mvalue): + mval = self.trans_bool(mvalue) + if not isinstance(mval, bool): + gcm_fatal("GCMSettings.is_bool(): Invalid boolean value '{0}', should be true|false|1|0|on|off|yes|no.".format(mvalue)) + else: + return True + + def trans_list(self, mvalue): + morig = mvalue + if self.is_str(mvalue): + mvalue = re.split("\s*,\s*", mvalue, flags=re.IGNORECASE) + if not isinstance(mvalue, list): + gcm_fatal("GCMSettings.trans_list(): Could not parse list '{0}'.".format(mvalue)) + elif not isinstance(mvalue, list): + gcm_fatal("GCMSettings.trans_list(): Invalid value '{0}'.".format(mvalue)) + return mvalue + + def is_list(self, mvalue): + return self.trans_list(mvalue) + + def is_email(self, mvalue): + if not self.is_string(mvalue): + 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\.\-]+", mvalue, flags=re.IGNORECASE) + + def trans_email_list(self, mvalue): + if mvalue == None: + return mvalue + else: + return self.trans_list(mvalue.strip()) + + def is_email_list(self, mvalue): + mvalue = self.trans_email_list(mvalue) + if mvalue != None: + for email in mvalue: + if not self.is_email(email): + gcm_fatal("Invalid e-mail address '{0}' in list {1}.".format(email, ", ".join(mvalue))) + return True + ### ### Main program starts @@ -236,32 +229,32 @@ ## Settings cfg = GCMSettings() -cfg.mdef("debug", True, gcm_is_bool, gcm_trans_bool, False) +cfg.mdef("debug", True, cfg.is_bool, cfg.trans_bool, False) cfg.mdef("email_ok", False, None, None, False) -cfg.mdef("email", True, gcm_is_bool, gcm_trans_bool, False) -cfg.mdef("email_to", True, gcm_is_email_list, gcm_trans_email_list, None) -cfg.mdef("email_sender", True, gcm_is_email, None, None) -cfg.mdef("email_subject", True, gcm_is_string, None, "Google Calendar MultiMerge status") +cfg.mdef("email", True, cfg.is_bool, cfg.trans_bool, False) +cfg.mdef("email_to", True, cfg.is_email_list, cfg.trans_email_list, None) +cfg.mdef("email_sender", True, cfg.is_email, None, None) +cfg.mdef("email_subject", True, cfg.is_string, None, "Google Calendar MultiMerge status") -cfg.mdef("source_regex", True, gcm_is_string, None, "^R:\s*(.*?)\s*\(\s*(.+?)\s*\)\s*$") -cfg.mdef("source_regmap", False, gcm_is_list, gcm_trans_list, [1, 2]) +cfg.mdef("source_regex", True, cfg.is_string, None, "^R:\s*(.*?)\s*\(\s*(.+?)\s*\)\s*$") +cfg.mdef("source_regmap", False, cfg.is_list, cfg.trans_list, [1, 2]) cfg.mdef("source_regmap_len", False, None, None, len(cfg.source_regmap)) -cfg.mdef("dest_name", True, gcm_is_string, None, u"Raahen kansainvälisyystoiminta") -cfg.mdef("dest_id", True, gcm_is_string, None, None) +cfg.mdef("dest_name", True, cfg.is_string, None, u"Raahen kansainvälisyystoiminta") +cfg.mdef("dest_id", True, cfg.is_string, None, None) cfg.mdef("noauth_local_webserver", False, None, None, True) #cfg.mdef("auth_host_name", False, None, None, "localhost") #cfg.mdef("auth_host_port", False, None, None, [8080, 8090]) -cfg.mdef("logging_level", True, gcm_is_log_level, gcm_trans_log_level, "ERROR") +cfg.mdef("logging_level", True, cfg.is_log_level, cfg.trans_log_level, "ERROR") # No need to touch these cfg.mdef("app_name", False, None, None, "Google Calendar MultiMerge") cfg.mdef("scope", False, None, None, "https://www.googleapis.com/auth/calendar") #cfg.mdef("scope", False, None, None, "https://www.googleapis.com/auth/calendar.readonly") -cfg.mdef("secret_file", True, gcm_is_filename, None, "client_secret.json") -cfg.mdef("credential_file", True, gcm_is_filename, None, "client_credentials.json") +cfg.mdef("secret_file", True, cfg.is_filename, None, "client_secret.json") +cfg.mdef("credential_file", True, cfg.is_filename, None, "client_credentials.json") ## Read, parse and validate configuration file