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:])
|