diff --git a/clean_data.py b/clean_data.py index 6869a53..bfc1a3a 100755 --- a/clean_data.py +++ b/clean_data.py @@ -11,14 +11,16 @@ import argparse import quopri from pprint import pprint +import generate + CONFIG_FILE = "generator.conf" if __name__ == "__main__": parser = argparse.ArgumentParser() - parser.add_argument("--config", default=CONFIG_FILE) + parser.add_argument("--config", "-c", default=CONFIG_FILE) args = parser.parse_args() - config = yaml.full_load(open(args.config)) + config = generate.get_config(args.config) open(config["top_mbox_file"], 'w').close() diff --git a/generate.py b/generate.py index ae7ac09..7595b87 100755 --- a/generate.py +++ b/generate.py @@ -25,6 +25,9 @@ WEEKDAYS = { 0: "Montag", 5: "Samstag", 6: "Sonntag" } +IMPORT_RE = re.compile(r"@import\((.*)\)") +FILE_RE = re.compile(r"@file\((.*)\)") + def decode_header(header): decoded_header = email.header.decode_header(header)[0] encoding = decoded_header[1] or "ascii" @@ -152,6 +155,49 @@ def conf2top(top): return Top(top["title"], sender, body, protostub) +import_cache = {} + +def get_imported_conf_entry(f, key): + if f not in import_cache: + import_cache[f] = yaml.safe_load(open(f)) + return import_cache[f][key] + + +def do_imports(entry): + if isinstance(entry, dict): + d = entry.items() + result = {} + for key,value in d: + try: + result[key] = do_imports(value) + except KeyError: + pass + return result + + if isinstance(entry, list): + l = iter(entry) + result = [] + for item in l: + result.append(do_imports(item)) + return result + + if isinstance(entry, str): + match = IMPORT_RE.match(entry) + if match: + f, key = match.group(1).split(":") + return get_imported_conf_entry(f, key) + match = FILE_RE.match(entry) + if match: + with open(match.group(1)) as f: + return f.read().strip() + + return entry + +def get_config(f): + raw_config = yaml.safe_load(open(f)) + config = do_imports(raw_config) + return config + if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--config", "-c", default=CONFIG_FILE) @@ -161,24 +207,17 @@ if __name__ == "__main__": mode.add_argument("--presentation", action="store_true") mode.add_argument("--protocol", action="store_true") parser.add_argument("--debug", action="store_true", help=argparse.SUPPRESS) + parser.add_argument("--print-config", action="store_true", help=argparse.SUPPRESS) parser.add_argument("--write-mbox", action="store_true") parser.add_argument("--send-mm", action="store_true") parser.add_argument("--send-mail", action="store_true") args = parser.parse_args() - config = yaml.safe_load(open(args.config)) + config = get_config(args.config) - if config["redeleitung"]["name"].startswith("./"): - with open(config["redeleitung"]["name"]) as f: - config["redeleitung"]["name"] = f.read().strip() - - if config["protokoll"]["name"].startswith("./"): - with open(config["protokoll"]["name"]) as f: - config["protokoll"]["name"] = f.read().strip() - - if config["place"].startswith("./"): - with open(config["place"]) as f: - config["place"] = f.read().strip() + if args.print_config: + pprint(config) + sys.exit(0) if args.invite: template_file = config["invite_template_file"] diff --git a/read_topmails.py b/read_topmails.py index 4290cb3..1476304 100755 --- a/read_topmails.py +++ b/read_topmails.py @@ -13,7 +13,8 @@ import pytz from pprint import pprint from dateutil import parser -MAILDIR = "/home/yannik/mail/INBOX.Mailinglisten.FSMI/" +import generate + CONFIG_FILE = "generator.conf" def decode_header(header): @@ -24,8 +25,12 @@ def decode_header(header): return decoded_header[0].decode(encoding, errors="replace") if isinstance(decoded_header[0], bytes) else decoded_header[0] if __name__ == "__main__": - config = yaml.full_load(open(CONFIG_FILE)) - in_mbox = mailbox.Maildir(MAILDIR) + parser = argparse.ArgumentParser() + parser.add_argument("--config", "-c", default=CONFIG_FILE) + args = parser.parse_args() + + config = generate.get_config(args.config) + in_mbox = mailbox.Maildir(config["top_inbox_maildir"]) out_mbox = mailbox.mbox(config["top_mbox_file"]) out_mbox.clear() @@ -33,7 +38,7 @@ if __name__ == "__main__": buffer = [] timezone = pytz.timezone("Europe/Berlin") - last_fsr_date = datetime.date.fromisoformat(open("data/last_date").read().strip()) + last_fsr_date = datetime.date.fromisoformat(open(config["last_date_file"]).read().strip()) last_fsr_datetime = datetime.datetime.combine(last_fsr_date, datetime.time(17, 30), timezone) for message in in_mbox: diff --git a/read_ubmails.py b/read_ubmails.py index 7a2f4db..84570ba 100755 --- a/read_ubmails.py +++ b/read_ubmails.py @@ -12,7 +12,9 @@ import quopri from pprint import pprint from dateutil import parser -MAILDIR = "/home/yannik/mail/INBOX.FSMI/" +import generate + +CONFIG_FILE = "generator.conf" def decode_header(header): decoded_header = email.header.decode_header(header)[0] @@ -22,7 +24,12 @@ def decode_header(header): return decoded_header[0].decode(encoding, errors="replace") if isinstance(decoded_header[0], bytes) else decoded_header[0] if __name__ == "__main__": - mbox = mailbox.Maildir(MAILDIR) + parser = argparse.ArgumentParser() + parser.add_argument("--config", "-c", default=CONFIG_FILE) + args = parser.parse_args() + + config = generate.get_config(args.config) + mbox = mailbox.Maildir(config["ubmails_inbox_maildir"]) latest = None latest_date = None