summaryrefslogtreecommitdiffstats
path: root/accounts/utils/console.py
blob: f81bd360211ba15f4f72d30000363a70bdbc0116 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# -*- coding: utf-8 -*-

class TablePrinter(object):

    def __init__(self, headers=None, separator='|'):
        self.headers = headers
        self.separator = separator

        self.format_string = ''
        self.widths = list()

        if headers is not None:
            self._calulate_widths([headers])

    def _calulate_widths(self, rows):
        def _get_column_count(rows):
            return min([len(row) for row in rows])

        def _column_width(column, width):
            widths = [len(elem) for elem in column]
            widths.append(width)
            return max(widths)

        columns = _get_column_count(rows)
        while len(self.widths) < columns:
            self.widths.append(0)

        self.widths = [_column_width(column, width)
                       for column, width
                       in zip(zip(*rows), self.widths)]
        self._update_format_string()


    def _update_format_string(self):
        def _column_format(width):
            return '%%-%ds' % width

        sep = ' %s ' % self.separator
        self.format_string = '%s %s %s' % (
            self.separator,
            sep.join(['%%-%ds' % width for width in self.widths]),
            self.separator)

    def output(self, rows):
        self._calulate_widths(rows)

        if self.headers is not None:
            self._print_row(self.headers)
            self._print_headline()

        for row in rows:
            self._print_row(row)

    def _print_headline(self):
        print('%s%s%s' % (
            self.separator,
            self.separator.join(['-' * (width + 2) for width in self.widths]),
            self.separator))

    def _print_row(self, row):
        print(self.format_string % tuple(row))