Package omero :: Package util :: Module text
[hide private]
[frames] | no frames]

Source Code for Module omero.util.text

  1  #!/usr/bin/env python 
  2  # 
  3  # OMERO Text handling utilities 
  4  # 
  5  # Copyright 2010 Glencoe Software, Inc.  All Rights Reserved. 
  6  # Use is subject to license terms supplied in LICENSE.txt 
  7  # 
  8   
  9  # 
 10  # The following classes (ALIGN, Column, Table) were originally from 
 11  # http://code.activestate.com/recipes/577202-render-tables-for-text-interface/ 
 12  # 
 13   
14 -class TableBuilder(object):
15 """ 16 OMERO-addition to make working with Tables easier 17 """ 18
19 - def __init__(self, *headers):
20 self.headers = list(headers) 21 self.results = [[] for x in self.headers]
22
23 - def col(self, name):
24 """ 25 Add a new column and back fill spaces 26 """ 27 self.headers.append(name) 28 self.results.append(["" for x in range(len(self.results[0]))])
29
30 - def cols(self, names):
31 """ 32 Similar to col() but only adds unknown columns 33 """ 34 for name in names: 35 if name not in self.headers: 36 self.col(name)
37
38 - def row(self, *items, **by_name):
39 40 if len(items) > len(self.headers): 41 raise ValueError("Size mismatch: %s != %s" % (len(items), len(self.headers))) 42 43 # Fill in all values, even if missing 44 for idx in range(len(self.results)): 45 value = None 46 if idx < len(items): 47 value = items[idx] 48 self.results[idx].append(value) 49 50 size = len(self.results[0]) 51 for k, v in by_name.items(): 52 if k not in self.headers: 53 raise KeyError("%s not in %s" % (k, self.headers)) 54 idx = self.headers.index(k) 55 self.results[idx][-1] = by_name[self.headers[idx]]
56
57 - def build(self):
58 columns = [] 59 for i, x in enumerate(self.headers): 60 columns.append(Column(x, self.results[i])) 61 return Table(*columns)
62
63 - def __str__(self):
64 return str(self.build())
65 66
67 -class ALIGN:
68 LEFT, RIGHT = '-', ''
69 70
71 -class Column(list):
72
73 - def __init__(self, name, data, align=ALIGN.LEFT):
74 list.__init__(self, data) 75 self.name = name 76 self.width = max(len(str(x)) for x in data + [name]) 77 self.format = ' %%%s%ds ' % (align, self.width)
78 79
80 -class Table:
81
82 - def __init__(self, *columns):
83 self.columns = columns 84 self.length = max(len(x) for x in columns)
85
86 - def get_row(self, i=None):
87 for x in self.columns: 88 if i is None: 89 yield x.format % x.name 90 else: 91 yield x.format % x[i]
92
93 - def get_rows(self):
94 yield '|'.join(self.get_row(None)) 95 yield "+".join(["-"* (x.width+2) for x in self.columns]) 96 for i in range(0, self.length): 97 yield '|'.join(self.get_row(i)) 98 yield "(%s %s)" % (self.length, (self.length == 1 and "row" or "rows"))
99
100 - def __str__(self):
101 return '\n'.join(self.get_rows())
102