#!/usr/bin/env python3 """ Usage: todo [--id | --date | --priority] [--reverse] [--file ] Options: -i --id Sort by ID -d --date Sort by date -p --priority Sort by priority -r --reverse Reverse sort order -f --file Path to todo file -h --help Show this screen -v --version Show version """ from sys import exit from collections import OrderedDict from os import getenv, path from docopt import docopt import toml def dict_sort_key(sort_key): '''Return a function for sorted() to sort a dict by the given key''' def key(item): return (sort_key not in item[1], item[1].get(sort_key, None)) return key def sort_dict_by_int(d, rev): '''Return dict sorted by int key''' sorted_dict = [ (key, d[key]) for key in sorted(d, key=int, reverse=rev) ] return OrderedDict(sorted_dict) def sort_dict(todo_dict, sort_key, rev=False): todo_dict = sort_dict_by_int(todo_dict, rev) if sort_key != 'id': todo_list = list(todo_dict.items()) todo_dict = sorted(todo_list, reverse=rev, key=dict_sort_key(sort_key)) return OrderedDict(todo_dict) class Config(): def __init__(self): self.todo_file = None self.sort_key = None self.reverse = False def parse_args(args): config = Config() home_dir = path.expanduser('~') data_home = getenv('XDG_DATA_HOME') if args['--id']: config.sort_key = 'id' elif args['--date']: config.sort_key = 'date' else: config.sort_key = 'priority' config.reverse = args['--reverse'] if args['']: config.todo_file = args[''] else: if data_home: config.todo_file = data_home + '/todo.toml' else: config.todo_file = home_dir + '/.local/share/todo.toml' return config def color_bold(text): color_string = '\x1b[1m{}\x1b[0m' return color_string.format(text) def color_red(text): color_string = '\x1b[38;2;250;050;050m{}\x1b[0m' return color_string.format(text) def color_yellow(text): color_string = '\x1b[38;2;250;150;050m{}\x1b[0m' return color_string.format(text) def color_blue(text): color_string = '\x1b[38;2;050;150;250m{}\x1b[0m' return color_string.format(text) def main(): arguments = docopt(__doc__, version='todo 0.0.1.alpha') config = parse_args(arguments) print(arguments) todo_dict = toml.load(config.todo_file) unsorted = OrderedDict(sorted(todo_dict.items())) todo_dict = sort_dict(unsorted, config.sort_key, config.reverse) print(todo_dict) for t_id in todo_dict: task = todo_dict[t_id] output = "{}. ".format(t_id) if 'priority' in task: output += "({}) ".format(task['priority']) if 'date' in task: output += "{}".format(task['date']) if 'description' in task: output += "\n {}".format(task['description']) if 'url' in task: output += "\n URL: {}".format(task['url']) if 'context' in task: output += "\n Contexts: {}".format(task['context']) print(output) if __name__ == '__main__': main()