main.py (4236B)
1 #!/usr/bin/python 2 3 # Author: Louis Holbrook <dev@holbrook.no> (https://holbrook.no) 4 # License: GPLv3 5 # Description: Work log tool 6 7 # standard imports 8 import os 9 import sys 10 import argparse 11 import configparser 12 import json 13 import logging 14 15 # local imports 16 import feedwarrior 17 from feedwarrior.cmd import create as cmd_create 18 from feedwarrior.cmd import entry as cmd_entry 19 from feedwarrior.cmd import show as cmd_show 20 from feedwarrior.cmd import ls as cmd_list 21 from feedwarrior.cmd import add as cmd_add 22 from feedwarrior.cmd import attach as cmd_attach 23 24 logging.basicConfig(level=logging.ERROR) 25 logg = logging.getLogger() 26 27 28 def matches_part(full, part): 29 if len(part) > len(full): 30 return False 31 return full[:len(part)] == part 32 33 34 35 argparser = argparse.ArgumentParser(description='create and manipulate feedwarrior feeds') 36 argparser.add_argument('-l', help='feed log to operate on') 37 argparser.add_argument('-c', type=str, default='config.ini', help='configuration file') 38 argparser.add_argument('-v', action='store_true', help='be verbose') 39 argparser.add_argument('--headers', action='store_true', help='add headers in output') 40 sub = argparser.add_subparsers() 41 # TODO: add subparser to same level flags as main parser 42 sub.dest = 'command' 43 sub_entry = sub.add_parser('entry', help='add entry to feed') 44 cmd_entry.parse_args(sub_entry) 45 sub_show = sub.add_parser('show', help='view feed log') 46 cmd_show.parse_args(sub_show) 47 sub_create = sub.add_parser('create', help='create new feed') 48 cmd_create.parse_args(sub_create) 49 sub_list = sub.add_parser('list', help='list feeds') 50 cmd_list.parse_args(sub_list) 51 sub_add = sub.add_parser('add', help='add new entry with editor') 52 cmd_add.parse_args(sub_add) 53 sub_attach = sub.add_parser('attach', help='attach file to existing entry') 54 cmd_attach.parse_args(sub_attach) 55 56 57 args = argparser.parse_known_args() 58 args = argparser.parse_args(args[1], args[0]) 59 if args.v: 60 logging.getLogger().setLevel(logging.DEBUG) 61 62 logg.debug('attempting to load config {}'.format(args.c)) 63 config = feedwarrior.load_config(args.c) 64 65 66 def get_feed_by_name(s): 67 index_path = os.path.join(config.feeds_dir, 'names', s) 68 resolved_path = os.path.realpath(index_path) 69 os.stat(resolved_path) 70 logg.debug('feed path {} resolves to {}'.format(index_path, resolved_path)) 71 return os.path.basename(resolved_path) 72 73 74 75 def main(): 76 feed_current = None 77 if args.l != None: 78 try: 79 uu = feedwarrior.common.parse_uuid(args.l) 80 feed_current = feedwarrior.feed(uu) 81 except ValueError: 82 try: 83 uu = get_feed_by_name(args.l) 84 feed_current = feedwarrior.feed(uu) 85 except FileNotFoundError as e: 86 sys.stderr.write('cannot resolve feed {}\n'.format(args.l)) 87 sys.exit(1) 88 89 cmd_mod = None 90 if args.command == None or matches_part('show', args.command): 91 if feed_current == None: 92 sys.stderr.write('plesae speficy a feed for showing\n') 93 sys.exit(1) 94 feed_current = feedwarrior.load_feed(config.data_dir, feed_current.uuid) 95 cmd_mod = cmd_show 96 elif matches_part('create', args.command): 97 feed_current = feedwarrior.feed(parent=feed_current) 98 cmd_mod = cmd_create 99 elif matches_part('entry', args.command): 100 cmd_mod = cmd_entry 101 elif matches_part('list', args.command) or args.command == 'ls': 102 cmd_mod = cmd_list 103 elif matches_part('add', args.command): 104 cmd_mod = cmd_add 105 elif matches_part('attach', args.command): 106 cmd_mod = cmd_attach 107 else: 108 sys.stderr.write('invalid command {}\n'.format(args.command)) 109 sys.exit(1) 110 111 try: 112 os.makedirs(config.entries_dir, mode=0o777, exist_ok=False) 113 os.makedirs(config.feeds_dir, mode=0o777, exist_ok=False) 114 os.makedirs(os.path.join(config.feeds_dir, 'names'), mode=0o777, exist_ok=False) 115 logg.debug('creating datadir {}'.format(config.data_dir)) 116 except FileExistsError as e: 117 logg.debug('found existing datadir {}'.format(config.data_dir)) 118 119 cmd_mod.check_args(args) 120 r = cmd_mod.execute(config, feed_current, args) 121 if r != None: 122 print(r) 123 124 125 if __name__ == '__main__': 126 main()