feedwarrior

Slim, portable tooling for creating and distributing decentralized append logs
git clone git://git.defalsify.org/logwarrior.git
Log | Files | Refs | README | LICENSE

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()