File size: 6,957 Bytes
39b42cf
 
88f24c6
 
39b42cf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
from tabulate import tabulate

from .ansi_utils import ansi_color_str
from .attr_utils import get_class_attributes


def transpose_dict(d):
    return {k: [dic[k] for dic in d.values()] for k in d.keys()}


def format_data_as_table(data, headers=None, tablefmt='grid', **kwargs):
    if kwargs.get('use_color', False):
        # Apply color to headers if applicable
        if headers:
            headers = [ansi_color_str(header, fg="yellow") for header in headers]


    return tabulate(data, headers=headers, tablefmt=tablefmt)

def format_property(name, data, headers=None, tablefmt='simple_grid', use_color=False):
    colored_name = ansi_color_str(f"===[{name}]<{type(data).__name__}>===", fg="yellow") if use_color else f"===[{name}]<{type(data).__name__}>==="
    return f'{colored_name}\n{format_table(data, headers, tablefmt, use_color=use_color)}'



# note: pretty sure transpose doesn't work correctly
def format_table(data, headers=None, tablefmt='simple_grid', **kwargs):
    if not data:
        return ""
    if isinstance(data, dict):
        return format_dict_as_table(data, headers, tablefmt, **kwargs)
    elif isinstance(data, (list, set)):
        # transpose = list(zip(*data))
        return format_list_as_table(data, headers, tablefmt, **kwargs)
    elif hasattr(data, '__dict__'):
        return format_obj_as_table(data, headers, tablefmt, **kwargs)
    else:
        use_color = kwargs.get('use_color', False)
        if use_color:
            return ansi_color_str(str(data), fg='bright_yellow')
        else:
            return str(data)
            


def format_list_as_table(data, headers=None, tablefmt='simple', **kwargs):
    if not headers:
        headers = ["Index", "Value"] if kwargs.get('show_indexes', False) else []

    if kwargs.get('show_indexes', False):
        out_dict = {i: item for i, item in enumerate(data)}
        return format_table(out_dict, headers, tablefmt, **kwargs)
    else:
        formatted_str = ansi_color_str(f" | len={len(data)} | ", fg='bright_cyan') if kwargs.get('use_color', False) else f" | len={len(data)} | "
        formatted_str += "["
        for i, item in enumerate(data):
            formatted_str += format_table(item, [], tablefmt, **kwargs)
            if i < len(data) - 1: formatted_str += kwargs.get('delimeter', ', ')
        formatted_str += "]"
        return formatted_str


def format_dict_as_table(data, headers=None, tablefmt='simple_grid', **kwargs):
    if  kwargs.get('transpose', False):
        if not headers:
            headers =list(data.keys())
        #Transpose the dictionary: each key-value pair becomes a column
        transposed_data = [list(value) for key, value in zip(list(data.keys()), zip(*data.items()))]
        #intended for values of the same lenth
        #transposed_data = [headers] + [list(row) for row in zip(list(data.values()))]
        return format_data_as_table(transposed_data, headers=headers, tablefmt=tablefmt)
    else:
        if not headers:
            headers = ["Key", "Value"]

        # Convert the dictionary into a list of lists
        table_data = [[key, format_table(value, [], 'simple',**kwargs)] for key, value in data.items() if value is not None]

        # Format the table
        return format_data_as_table(table_data, headers=headers, tablefmt=tablefmt)


def format_obj_as_table(data, headers=None, tablefmt='fancy_grid', **kwargs):
    verbose = kwargs.get('verbose', True)
    fancy = kwargs.get('fancy', True)
    use_color = kwargs.get('use_color', True)
    
    attributes_dict = get_class_attributes(data, verbose=verbose)
    class_name = data.__class__.__name__
    variables = [*attributes_dict['variables'].values()]
    methods = [*attributes_dict['methods'].values()]
    # Check if headers are provided, if not, construct them
    if not headers:
        headers = [class_name]
        if variables:
            headers.append('variables')
        if methods:
            headers.append('methods')

    # Initialize an empty list to store the formatted table data
    table_data = []

    # formatted_vars = []
    # for v in variables:
    #     format_v = format_arg(v, use_color=use_color, fancy=fancy)
    #     formatted_vars.append(format_v)

    # Add variables and methods data to the table data
    table_data.append([format_table(variables, ['variables'], 'simple', **kwargs) if variables else None,
                       format_table(methods, ['methods'], 'simple', **kwargs) if methods else None])

    table_data = list(zip(*table_data))

    # Return the formatted table
    return format_data_as_table(table_data, headers, tablefmt, **kwargs)


def print_table(msg, data, headers=None, tablefmt='fancy_grid'):
    print(f'==={msg}==>\n{format_table(data, headers, tablefmt)}')


def format_square_layout(data):
    if isinstance(data, (list, set)):
        result_count = len(data)
        rows, columns = calc_best_square(result_count)
        table_data = [data[i:i + columns] for i in range(0, len(data), columns)]
        return format_table(table_data)
    elif isinstance(data, dict):
        items = [(k, v) for k, v in data.items()]
        result_count = len(items)
        rows, columns = calc_best_square(result_count)
        table_data = [items[i:i + columns] for i in range(0, len(items), columns)]
        return format_table(table_data)
    elif hasattr(data, '__dict__'):
        items = [(k, v) for k, v in data.__dict__.items()]
        result_count = len(items)
        rows, columns = calc_best_square(result_count)
        table_data = [items[i:i + columns] for i in range(0, len(items), columns)]
        return format_table(table_data)
    else:
        return format_table(data)


def print_square_layout(msg, data):
    print(f'==={msg}==>\n{format_square_layout(data)}')


def print_as_square(strings):
    # Calculate the number of strings in the input list
    result_count = len(strings)

    # Calculate the best square layout dimensions based on the result count
    rows, columns = calc_best_square(result_count)

    # Create a grid with empty strings filled in for each cell
    grid = [[' ' for _ in range(columns)] for _ in range(rows)]

    # Iterate over the strings and populate the grid with them
    for i, string in enumerate(strings):
        # Calculate the row and column index for the current string
        row = i // columns
        col = i % columns
        # Ensure the row and column indices are within the valid range of the grid dimensions
        if row < rows and col < columns:
            # Place the string in the corresponding cell of the grid
            grid[row][col] = string

    # Determine the maximum width of each column in the grid
    max_widths = [max(len(cell) for cell in row) for row in grid]

    # Print the grid, ensuring each cell is left-aligned and padded to its maximum width
    for row in grid:
        print(' '.join(cell.ljust(width) for cell, width in zip(row, max_widths)))