comparison multimerge.py @ 23:ff47f8088ef9

Make things more OO.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 04 Jul 2016 14:20:56 +0300
parents 793b7997cc2b
children 1bce0c6a673c
comparison
equal deleted inserted replaced
22:793b7997cc2b 23:ff47f8088ef9
92 ev_start = event["start"].get("dateTime", event["start"].get("date")) 92 ev_start = event["start"].get("dateTime", event["start"].get("date"))
93 ev_end = event["end"].get("dateTime", event["end"].get("date")) 93 ev_end = event["end"].get("dateTime", event["end"].get("date"))
94 gcm_print(u"{0:25} - {1:25} : {2}".format(ev_start, ev_end, event["summary"])) 94 gcm_print(u"{0:25} - {1:25} : {2}".format(ev_start, ev_end, event["summary"]))
95 95
96 96
97 def gcm_is_str(mstr):
98 return isinstance(mstr, basestring)
99
100
101 def gcm_is_string(mstr):
102 return mstr == None or gcm_is_str(mstr)
103
104
105 def gcm_is_log_level(mstr):
106 if not gcm_is_str(mstr):
107 return False
108 else:
109 return mstr.upper() in ["CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"]
110
111
112 def gcm_trans_log_level(mstr):
113 return mstr.upper()
114
115
116 def gcm_is_filename(mstr):
117 if not gcm_is_str(mstr):
118 return False
119 else:
120 return re.match("^[a-z0-9][a-z0-9\.\_\-]+$", mstr, flags=re.IGNORECASE)
121
122
123 def gcm_trans_bool(mbool):
124 if gcm_is_str(mbool):
125 if re.match("^\s*(true|1|on|yes)\s*$", mbool, re.IGNORECASE):
126 mbool = True
127 elif re.match("^\s*(false|0|off|no)\s*$", mbool, re.IGNORECASE):
128 mbool = False
129 else:
130 return None
131 return mbool
132
133 def gcm_is_bool(mbool):
134 mval = gcm_trans_bool(mbool)
135 if not isinstance(mval, bool):
136 gcm_fatal("gcm_is_bool(): Invalid boolean value '{0}', should be true|false|1|0|on|off|yes|no.".format(mbool))
137 else:
138 return True
139
140
141 def gcm_trans_list(mlist):
142 morig = mlist
143 if gcm_is_str(mlist):
144 mlist = re.split("\s*,\s*", mlist, flags=re.IGNORECASE)
145 if not isinstance(mlist, list):
146 gcm_fatal("gcm_trans_list(): Could not parse list '{0}'.".format(mlist))
147 elif not isinstance(mlist, list):
148 gcm_fatal("gcm_trans_list(): Invalid value '{0}'.".format(mlist))
149 return mlist
150
151 def gcm_is_list(mlist):
152 return gcm_trans_list(mlist)
153
154
155 def gcm_is_email(mstr):
156 if not gcm_is_string(mstr):
157 return False
158 else:
159 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)
160
161
162 def gcm_trans_email_list(mlist):
163 if mlist == None:
164 return mlist
165 else:
166 return gcm_trans_list(mlist.strip())
167
168 def gcm_is_email_list(mlist):
169 mlist = gcm_trans_email_list(mlist)
170 if mlist != None:
171 for email in mlist:
172 if not gcm_is_email(email):
173 gcm_fatal("Invalid e-mail address '{0}' in list {1}.".format(email, ", ".join(mlist)))
174 return True
175 97
176 98
177 class GCMSettings(dict): 99 class GCMSettings(dict):
178 def __init__(self): 100 def __init__(self):
179 self.m_data = {} 101 self.m_data = {}
223 if cfgparser.has_option(sect, name): 145 if cfgparser.has_option(sect, name):
224 value = cfgparser.get(sect, name) 146 value = cfgparser.get(sect, name)
225 self.mset(name, value) 147 self.mset(name, value)
226 gcm_debug("{0} -> '{1}' == {2}".format(name, value, self.mget(name))) 148 gcm_debug("{0} -> '{1}' == {2}".format(name, value, self.mget(name)))
227 149
150 def is_str(self, mvalue):
151 return isinstance(mvalue, basestring)
152
153 def is_string(self, mvalue):
154 return mvalue == None or self.is_str(mvalue)
155
156 def is_log_level(self, mvalue):
157 if not self.is_str(mvalue):
158 return False
159 else:
160 return mvalue.upper() in ["CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"]
161
162 def trans_log_level(self, mvalue):
163 return mvalue.upper()
164
165 def is_filename(self, mvalue):
166 if not self.is_str(mvalue):
167 return False
168 else:
169 return re.match("^[a-z0-9][a-z0-9\.\_\-]+$", mvalue, flags=re.IGNORECASE)
170
171 def trans_bool(self, mvalue):
172 if self.is_str(mvalue):
173 if re.match("^\s*(true|1|on|yes)\s*$", mvalue, re.IGNORECASE):
174 mvalue = True
175 elif re.match("^\s*(false|0|off|no)\s*$", mvalue, re.IGNORECASE):
176 mvalue = False
177 else:
178 return None
179 return mvalue
180
181 def is_bool(self, mvalue):
182 mval = self.trans_bool(mvalue)
183 if not isinstance(mval, bool):
184 gcm_fatal("GCMSettings.is_bool(): Invalid boolean value '{0}', should be true|false|1|0|on|off|yes|no.".format(mvalue))
185 else:
186 return True
187
188 def trans_list(self, mvalue):
189 morig = mvalue
190 if self.is_str(mvalue):
191 mvalue = re.split("\s*,\s*", mvalue, flags=re.IGNORECASE)
192 if not isinstance(mvalue, list):
193 gcm_fatal("GCMSettings.trans_list(): Could not parse list '{0}'.".format(mvalue))
194 elif not isinstance(mvalue, list):
195 gcm_fatal("GCMSettings.trans_list(): Invalid value '{0}'.".format(mvalue))
196 return mvalue
197
198 def is_list(self, mvalue):
199 return self.trans_list(mvalue)
200
201 def is_email(self, mvalue):
202 if not self.is_string(mvalue):
203 return False
204 else:
205 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)
206
207 def trans_email_list(self, mvalue):
208 if mvalue == None:
209 return mvalue
210 else:
211 return self.trans_list(mvalue.strip())
212
213 def is_email_list(self, mvalue):
214 mvalue = self.trans_email_list(mvalue)
215 if mvalue != None:
216 for email in mvalue:
217 if not self.is_email(email):
218 gcm_fatal("Invalid e-mail address '{0}' in list {1}.".format(email, ", ".join(mvalue)))
219 return True
220
228 221
229 ### 222 ###
230 ### Main program starts 223 ### Main program starts
231 ### 224 ###
232 gcm_msgbuf = [] 225 gcm_msgbuf = []
234 227
235 228
236 ## Settings 229 ## Settings
237 cfg = GCMSettings() 230 cfg = GCMSettings()
238 231
239 cfg.mdef("debug", True, gcm_is_bool, gcm_trans_bool, False) 232 cfg.mdef("debug", True, cfg.is_bool, cfg.trans_bool, False)
240 233
241 cfg.mdef("email_ok", False, None, None, False) 234 cfg.mdef("email_ok", False, None, None, False)
242 cfg.mdef("email", True, gcm_is_bool, gcm_trans_bool, False) 235 cfg.mdef("email", True, cfg.is_bool, cfg.trans_bool, False)
243 cfg.mdef("email_to", True, gcm_is_email_list, gcm_trans_email_list, None) 236 cfg.mdef("email_to", True, cfg.is_email_list, cfg.trans_email_list, None)
244 cfg.mdef("email_sender", True, gcm_is_email, None, None) 237 cfg.mdef("email_sender", True, cfg.is_email, None, None)
245 cfg.mdef("email_subject", True, gcm_is_string, None, "Google Calendar MultiMerge status") 238 cfg.mdef("email_subject", True, cfg.is_string, None, "Google Calendar MultiMerge status")
246 239
247 cfg.mdef("source_regex", True, gcm_is_string, None, "^R:\s*(.*?)\s*\(\s*(.+?)\s*\)\s*$") 240 cfg.mdef("source_regex", True, cfg.is_string, None, "^R:\s*(.*?)\s*\(\s*(.+?)\s*\)\s*$")
248 cfg.mdef("source_regmap", False, gcm_is_list, gcm_trans_list, [1, 2]) 241 cfg.mdef("source_regmap", False, cfg.is_list, cfg.trans_list, [1, 2])
249 cfg.mdef("source_regmap_len", False, None, None, len(cfg.source_regmap)) 242 cfg.mdef("source_regmap_len", False, None, None, len(cfg.source_regmap))
250 243
251 cfg.mdef("dest_name", True, gcm_is_string, None, u"Raahen kansainvälisyystoiminta") 244 cfg.mdef("dest_name", True, cfg.is_string, None, u"Raahen kansainvälisyystoiminta")
252 cfg.mdef("dest_id", True, gcm_is_string, None, None) 245 cfg.mdef("dest_id", True, cfg.is_string, None, None)
253 246
254 cfg.mdef("noauth_local_webserver", False, None, None, True) 247 cfg.mdef("noauth_local_webserver", False, None, None, True)
255 #cfg.mdef("auth_host_name", False, None, None, "localhost") 248 #cfg.mdef("auth_host_name", False, None, None, "localhost")
256 #cfg.mdef("auth_host_port", False, None, None, [8080, 8090]) 249 #cfg.mdef("auth_host_port", False, None, None, [8080, 8090])
257 cfg.mdef("logging_level", True, gcm_is_log_level, gcm_trans_log_level, "ERROR") 250 cfg.mdef("logging_level", True, cfg.is_log_level, cfg.trans_log_level, "ERROR")
258 251
259 # No need to touch these 252 # No need to touch these
260 cfg.mdef("app_name", False, None, None, "Google Calendar MultiMerge") 253 cfg.mdef("app_name", False, None, None, "Google Calendar MultiMerge")
261 cfg.mdef("scope", False, None, None, "https://www.googleapis.com/auth/calendar") 254 cfg.mdef("scope", False, None, None, "https://www.googleapis.com/auth/calendar")
262 #cfg.mdef("scope", False, None, None, "https://www.googleapis.com/auth/calendar.readonly") 255 #cfg.mdef("scope", False, None, None, "https://www.googleapis.com/auth/calendar.readonly")
263 cfg.mdef("secret_file", True, gcm_is_filename, None, "client_secret.json") 256 cfg.mdef("secret_file", True, cfg.is_filename, None, "client_secret.json")
264 cfg.mdef("credential_file", True, gcm_is_filename, None, "client_credentials.json") 257 cfg.mdef("credential_file", True, cfg.is_filename, None, "client_credentials.json")
265 258
266 259
267 ## Read, parse and validate configuration file 260 ## Read, parse and validate configuration file
268 if len(sys.argv) > 1: 261 if len(sys.argv) > 1:
269 gcm_debug("Reading configuration from '{0}'.".format(sys.argv[1])) 262 gcm_debug("Reading configuration from '{0}'.".format(sys.argv[1]))