Mercurial > hg > gcmultimerge
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])) |