git.fiddlerwoaroof.com
responsedict.py
5475dee4
 # Copyright (c) 2011 Edward Langley
 # All rights reserved.
 
49616e52
 from __future__ import print_function
 import collections
 import itertools
 from pprint import pprint
 class ResponseDict(collections.Mapping):
     '''A mapping to hold the results of MPD commands'''
     def __init__(self, dat=None):
         self.data = [{}]
         if dat is not None:
             dat = self.__preproc_dat(dat)
             for line in dat:
                 self.add_line(line)
 
     def __preproc_dat(self, dat):
         if hasattr(dat, 'split'):
             dat = dat.split('\n')
         return dat
 
     def add_line(self, line):
         k,_,v = line.strip().partition(':')
 
0fdce423
         if k in self.data[-1] and k.lower() == 'file':
             self.data.append({})
         self.data[-1].setdefault(k, []).append(v.strip())
         return (k,self.data[-1][k][-1])
49616e52
 
     def __getitem__(self,it):
         return self.data[-1][it]
 
     def __iter__(self):
         return iter(self.data[-1])
 
     def __len__(self):
         return len(self.data[-1])
 
     def as_list(self):
0fdce423
         out = []
         for datum in self.data:
             out.append({})
             for k in datum:
                 out[-1].setdefault(k,[]).extend(item for item in datum[k])
         return out
49616e52
 
     def as_table(self):
         keys = set()
         out = {}
         for dct in self.data:
             keys.update(dct)
         for dct in self.data:
             for key in keys:
0fdce423
                 out.setdefault(key, []).append(dct.get(key,['']))
49616e52
         return out
 
 
 def pprint_table(tbl, cols=None):
     keys = tbl.keys()
     if cols is None:
         cols = keys
 
     print('\t'.join(cols))
     out = []
     for k in cols:
         out.append(tbl[k])
     out = zip(*out)
     print('\n'.join('\t'.join(z) for z in out))
 
 
 
 
 def main(args):
     import sys
     import argparse
     parser = argparse.ArgumentParser()
     parser.add_argument('-c', '--col', action='append', default=None)
     args = parser.parse_args(args)
     rdict = ResponseDict()
     line = sys.stdin.readline().strip()
     while True:
         line = sys.stdin.readline().strip()
         if line == 'OK': break
         rdict.add_line(line)
     pprint_table(rdict.as_table(), cols=args.col)
 
 if __name__ == '__main__':
     import sys
     main(sys.argv[1:])