diff options
author | Chris Johns <chrisj@rtems.org> | 2017-04-25 02:38:40 +1000 |
---|---|---|
committer | Chris Johns <chrisj@rtems.org> | 2017-04-25 02:38:40 +1000 |
commit | 224fb21b30d3a3bedb77d448705ca11cb7835b32 (patch) | |
tree | cf76772b312f5f6fc3d7086ff8ced5cbec50b028 /rtemstoolkit | |
parent | 437092487f618d172b51b8d22a87cde36dad364d (diff) |
rtemstoolkit: Add a textbox module for formatted reporting.
Diffstat (limited to 'rtemstoolkit')
-rw-r--r-- | rtemstoolkit/textbox.py | 121 | ||||
-rw-r--r-- | rtemstoolkit/wscript | 2 |
2 files changed, 123 insertions, 0 deletions
diff --git a/rtemstoolkit/textbox.py b/rtemstoolkit/textbox.py new file mode 100644 index 0000000..8341bdd --- /dev/null +++ b/rtemstoolkit/textbox.py @@ -0,0 +1,121 @@ +# +# RTEMS Tools Project (http://www.rtems.org/) +# Copyright 2017 Chris Johns (chrisj@rtems.org) +# All rights reserved. +# +# This file is part of the RTEMS Tools package in 'rtems-tools'. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +# +# Manage paths locally. The internally the path is in Unix or shell format and +# we convert to the native format when performing operations at the Python +# level. This allows macro expansion to work. +# + +from __future__ import print_function + +import copy +import os + +# +# Support to handle use in a package and as a unit test. +# If there is a better way to let us know. +# +try: + from . import error +except (ValueError, SystemError): + import error + +def line(cols, line = '-', marker = '|', indent = 0, linesep = os.linesep): + s = ' ' * indent + marker + for c in cols: + s += line[0] * (c - 1) + marker + return s + linesep + +def row(cols, data, indent = 0, marker = '|', linesep = os.linesep): + if len(cols) != len(data): + raise error.internal('data size (%d) does not' \ + ' match columns (%d)' % (len(data), len(cols))) + s = ' ' * indent + '|' + for c in range(0, len(cols)): + if c < len(cols) - 1: + m = marker + else: + m = '|' + s += '%-*s%s' % (cols[c] - 1, str(data[c]), m) + return s + linesep + +def even_columns(cols, width = 80): + per_col = width / cols + columns = [per_col for c in range(0, cols)] + for remainder in range(0, width - (per_col * cols)): + if remainder % 2 == 0: + columns[remainder] += 1 + else: + columns[len(columns) - remainder] += 1 + return columns + +def merge_columns(columns): + columns = copy.deepcopy(columns) + cols = [] + while True: + empty = True + for c in columns: + if len(c) != 0: + empty = False + break + if empty: + break + lowest = 0 + lowest_size = 99999 + for c in range(0, len(columns)): + if len(columns[c]) > 0 and columns[c][0] < lowest_size: + lowest = c + lowest_size = columns[c][0] + cols += [lowest_size] + columns[lowest] = columns[lowest][1:] + for c in range(0, len(columns)): + if len(columns[c]) > 0 and c != lowest: + if columns[c][0] != lowest_size: + columns[c][0] -= lowest_size + else: + columns[c] = columns[c][1:] + return cols + +if __name__ == '__main__': + width = 75 + cols_1 = [width] + cols_2 = [10, width - 10] + cols_3 = even_columns(3, width = width) + cols_4 = even_columns(4, width = width) + print(line(cols_1, marker = 'X', linesep = '')) + print(line(cols_1, marker = '+', indent = 1, linesep = '')) + print(line(cols_1, marker = '+', indent = 2, linesep = '')) + print(line(cols_2, marker = '+', indent = 2, linesep = '')) + print(line(cols_3, marker = '+', indent = 2, linesep = '')) + print(line(cols_4, marker = '+', indent = 2, linesep = '')) + print(row(cols_4, [' %d' % (i) for i in [1, 2, 3, 4]], indent = 2, linesep = '')) + print(line(cols_4, marker = '+', indent = 2, linesep = '')) + print(line(merge_columns([cols_2, cols_3, cols_4]), indent = 2, linesep = '')) diff --git a/rtemstoolkit/wscript b/rtemstoolkit/wscript index d018624..1bf0652 100644 --- a/rtemstoolkit/wscript +++ b/rtemstoolkit/wscript @@ -135,6 +135,7 @@ def build(bld): 'execute.py', 'freebsd.py', 'git.py', + 'host.py', 'linux.py', 'log.py', 'macros.py', @@ -142,6 +143,7 @@ def build(bld): 'options.py', 'path.py', 'stacktraces.py', + 'textbox.py', 'version.py', 'windows.py'], install_from = '.', |