summaryrefslogtreecommitdiff
path: root/cloudinit/simpletable.py
blob: fc73544f60cabd7544674c8925c343f12ea401b9 (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
62
63
64
65
66
67
68
# Copyright (C) 2017 Amazon.com, Inc. or its affiliates
#
# Author: Ethan Faust <efaust@amazon.com>
# Author: Andrew Jorgensen <ajorgens@amazon.com>
#
# This file is part of cloud-init. See LICENSE file for license information.


class SimpleTable:
    """A minimal implementation of PrettyTable
    for distribution with cloud-init.
    """

    def __init__(self, fields):
        self.fields = fields
        self.rows = []

        # initialize list of 0s the same length
        # as the number of fields
        self.column_widths = [0] * len(self.fields)
        self.update_column_widths(fields)

    def update_column_widths(self, values):
        for i, value in enumerate(values):
            self.column_widths[i] = max(len(value), self.column_widths[i])

    def add_row(self, values):
        if len(values) > len(self.fields):
            raise TypeError("too many values")
        values = [str(value) for value in values]
        self.rows.append(values)
        self.update_column_widths(values)

    def _hdiv(self):
        """Returns a horizontal divider for the table."""
        return (
            "+" + "+".join(["-" * (w + 2) for w in self.column_widths]) + "+"
        )

    def _row(self, row):
        """Returns a formatted row."""
        return (
            "|"
            + "|".join(
                [
                    col.center(self.column_widths[i] + 2)
                    for i, col in enumerate(row)
                ]
            )
            + "|"
        )

    def __str__(self):
        """Returns a string representation of the table with lines around.

        +-----+-----+
        | one | two |
        +-----+-----+
        |  1  |  2  |
        |  01 |  10 |
        +-----+-----+
        """
        lines = [self._hdiv(), self._row(self.fields), self._hdiv()]
        lines += [self._row(r) for r in self.rows] + [self._hdiv()]
        return "\n".join(lines)

    def get_string(self):
        return self.__str__()