summaryrefslogtreecommitdiffstats
path: root/accounts/utils/console.py
diff options
context:
space:
mode:
Diffstat (limited to 'accounts/utils/console.py')
-rw-r--r--accounts/utils/console.py61
1 files changed, 61 insertions, 0 deletions
diff --git a/accounts/utils/console.py b/accounts/utils/console.py
new file mode 100644
index 0000000..f81bd36
--- /dev/null
+++ b/accounts/utils/console.py
@@ -0,0 +1,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))