Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Roblox
GitHub Repository: Roblox/luau
Path: blob/master/bench/tabulate.py
2723 views
1
# This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
2
from typing import Dict
3
from enum import Enum
4
import re
5
6
class Alignment(Enum):
7
LEFT = 0
8
RIGHT = 1
9
CENTER = 2
10
11
class TablePrinter(object):
12
def __init__(self, columns):
13
assert(len(columns) > 0)
14
self._columns = columns
15
self._widths = [len(col['label']) for col in self._columns]
16
self._rows = []
17
pass
18
19
def _convert_field_dict_to_ordered_list(self, fields:Dict[str, object]):
20
assert(len(fields) == len(self._columns))
21
22
ordered_list = [None] * len(self._columns)
23
column_names = [column['label'] for column in self._columns]
24
25
for column, value in fields.items():
26
index = column_names.index(column)
27
ordered_list[index] = value
28
return ordered_list
29
30
def _print_row(self, row, align_style=None):
31
for i, (value, column, align_width) in enumerate(zip(row, self._columns, self._widths)):
32
if i > 0:
33
print(' | ', end='')
34
35
actual_align_style = align_style if align_style != None else column['align']
36
align_char = {
37
Alignment.LEFT: '<',
38
Alignment.CENTER: '^',
39
Alignment.RIGHT: '>'
40
}[actual_align_style]
41
print('{0:{align_style}{align_width}}'.format(value, align_style=align_char, align_width=align_width), end=' ')
42
print()
43
pass
44
45
def _print_horizontal_separator(self):
46
for i, align_width in enumerate(self._widths):
47
if i > 0:
48
print('-|-', end='')
49
print('-' * (align_width+1), end='')
50
print()
51
pass
52
53
def clean_colorama(self, str):
54
return re.compile(r'(?:\x1B[@-_]|[\x80-\x9F])[0-?]*[ -/]*[@-~]').sub('', str)
55
56
def add_row(self, fields:Dict[str, object]):
57
fields = self._convert_field_dict_to_ordered_list(fields)
58
59
for i, value in enumerate(fields):
60
61
self._widths[i] = max(self._widths[i], len(self.clean_colorama(str(value))))
62
63
self._rows.append(fields)
64
65
def _compute_summary_row(self):
66
sums = [0] * len(self._widths)
67
for row in self._rows:
68
for i, value in enumerate(row):
69
if not isinstance(value, int):
70
continue
71
sums[i] = sums[i] + value
72
sums[0] = "Total"
73
return sums
74
75
def print(self, summary=False):
76
self._print_row([column['label'] for column in self._columns], align_style=Alignment.LEFT)
77
self._print_horizontal_separator()
78
79
if summary:
80
summary_row = self._compute_summary_row()
81
for i, value in enumerate(summary_row):
82
self._widths[i] = max(self._widths[i], len(str(value)))
83
84
for row in self._rows:
85
self._print_row(row)
86
87
if summary:
88
self._print_horizontal_separator()
89
self._print_row(summary_row)
90
91
pass
92
93