#!/usr/bin/env python3 import argparse import datetime def get_date(s): return datetime.datetime.strptime(s, '%Y-%m-%d').date() parser = argparse.ArgumentParser('calcurse-dateutil') parser.add_argument('--date', type=get_date, action='store', dest='date') parser.add_argument('--range', type=int, action='store', dest='range') parser.add_argument('--unique', action='store_true', dest='unique') parser.add_argument('--append', type=str, action='store', dest='append') parser.add_argument('op', nargs='+') args = parser.parse_args() def skip_days(d, n): return d + datetime.timedelta(days=n) def skip_months(d, n): return d + datetime.timedelta(months=1) def next_weekday(d, w): return skip_days(d, (w - d.weekday() + 7) % 7) def bow(d): return skip_days(d, -d.weekday()) def bom(d): return d.replace(day=1) def eow(d): return skip_days(bow(d), 6) def eom(d): return skip_months(bom(d), 1) s = args.date if args.date else datetime.date.today() r = args.range if args.range else 1 a = args.append if args.append else '' seen = set() for i in range(0, r): d = skip_days(s, i) it = iter(args.op) for arg in it: if arg == 'bow': d = bow(d) elif arg == 'bom': d = bom(d) elif arg == 'eow': d = eow(d) elif arg == 'eom': d = eom(d) elif arg == 'next-weekday': d = next_weekday(d, int(next(it))) elif arg == 'skip-days': d = skip_days(d, int(next(it))) elif arg == 'skip-months': d = skip_months(d, int(next(it))) out = "{}{}".format(d, a) if args.unique: if d not in seen: print(out) seen.add(d) else: print(out)