#!/usr/bin/env python3 import argparse import os import pathlib import subprocess import sys import yaml try: _data_home = os.environ['XDG_DATA_HOME'] except KeyError: _data_home = pathlib.Path(os.path.expanduser('~'), '.local', 'share') SHARE_DIR = pathlib.Path(_data_home, 'rt-auto-remind') SHARE_DIR.mkdir(parents=True, exist_ok=True) class Reminder: def __init__(self, key, min_days, max_days, search, body_file, date_field='Due', action='correspond', dry_run=False, rt_args=None): self.key = key self.min_days_diff = int(min_days) self.max_days_diff = int(max_days) self.search = search self.date_field = date_field self.body_file = body_file self.action = action self.dry_run = dry_run self.rt_args = [] if rt_args is None else rt_args.copy() def _remind_cmd(self): yield 'rt-auto-remind' if self.dry_run: yield '--dry-run' yield '--{}'.format(self.action) yield '--key' yield self.key yield self.date_field yield str(self.min_days_diff) yield str(self.max_days_diff) yield self.search yield str(self.body_file) yield from self.rt_args def remind_cmd(self): return list(self._remind_cmd()) def parse_arguments(arglist): parser = argparse.ArgumentParser() parser.add_argument( '--dry-run', '-n', action='store_true', help="Pass --dry-run to rt-auto-remind", ) parser.add_argument( '--template-dir', type=pathlib.Path, default=SHARE_DIR / 'templates', help="Directory to search for templates that aren't specified in the" " YAML file (default `%(default)s`)", ) parser.add_argument( 'yaml_files', metavar='PATH', type=pathlib.Path, nargs='+', help="YAML file(s) with configuration of reminders to send out", ) return parser.parse_args(arglist) def main(arglist=None, stdout=sys.stdout, stderr=sys.stderr): args = parse_arguments(arglist) failures = 0 for yaml_path in args.yaml_files: with yaml_path.open() as yaml_file: yaml_data = yaml.safe_load(yaml_file) for key, reminder_kwargs in yaml_data.items(): if 'body_file' not in reminder_kwargs: reminder_kwargs['body_file'] = args.template_dir / (key + '.txt') if args.dry_run: reminder_kwargs['dry_run'] = True reminder = Reminder(key, **reminder_kwargs) try: subprocess.run(reminder.remind_cmd(), check=True) except subprocess.CalledProcessError as error: print("warning: reminder {} exited {}".format(key, error.returncode)) failures += 1 if failures == 0: return 0 else: return min(10 + failures, 99) if __name__ == '__main__': exit(main())