You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
2.4 KiB
70 lines
2.4 KiB
from terminaltables.terminal_io import terminal_size
|
|
from terminaltables import AsciiTable
|
|
from textwrap import fill
|
|
from pydoc import pipepager, tempfilepager, plainpager, plain
|
|
import datetime
|
|
import os
|
|
import sys
|
|
|
|
|
|
def getpager():
|
|
"""Decide what method to use for paging through text."""
|
|
if not hasattr(sys.stdin, "isatty"):
|
|
return plainpager
|
|
if not hasattr(sys.stdout, "isatty"):
|
|
return plainpager
|
|
if not sys.stdin.isatty() or not sys.stdout.isatty():
|
|
return plainpager
|
|
use_pager = os.environ.get('MANPAGER') or os.environ.get('PAGER')
|
|
if use_pager:
|
|
if sys.platform == 'win32': # pipes completely broken in Windows
|
|
return lambda text: tempfilepager(plain(text), use_pager)
|
|
elif os.environ.get('TERM') in ('dumb', 'emacs'):
|
|
return lambda text: pipepager(plain(text), use_pager)
|
|
else:
|
|
return lambda text: pipepager(text, use_pager)
|
|
if os.environ.get('TERM') in ('dumb', 'emacs'):
|
|
return plainpager
|
|
if sys.platform == 'win32':
|
|
return lambda text: tempfilepager(plain(text), 'more <')
|
|
if hasattr(os, 'system') and os.system('(less) 2>/dev/null') == 0:
|
|
return lambda text: pipepager(text, 'less -X')
|
|
|
|
|
|
def str_coerce(s, **kwargs):
|
|
if isinstance(s, datetime.datetime):
|
|
return s.strftime(kwargs['datetime_format'])
|
|
else:
|
|
return str(s)
|
|
|
|
|
|
def create_table(list_param, datetime_format):
|
|
rows = []
|
|
for row in list_param:
|
|
rows.append([])
|
|
for item in row:
|
|
rows[-1].append(str_coerce(item, datetime_format=datetime_format))
|
|
return AsciiTable(rows)
|
|
|
|
|
|
def render_table(table: AsciiTable, interactive=True):
|
|
'''Do all wrapping to make the table fit in screen'''
|
|
table.inner_row_border = True
|
|
data = table.table_data
|
|
terminal_width = terminal_size()[0]
|
|
n_cols = len(data[0])
|
|
even_distribution = terminal_width // n_cols
|
|
for row_num, row in enumerate(data):
|
|
for col_num, col_data in enumerate(row):
|
|
if len(col_data) > even_distribution:
|
|
if col_num != n_cols - 1:
|
|
data[row_num][col_num] = fill(col_data, even_distribution)
|
|
else:
|
|
data[row_num][col_num] = ''
|
|
data[row_num][col_num] = fill(
|
|
col_data, table.column_max_width(col_num))
|
|
if interactive:
|
|
pager = getpager()
|
|
pager(table.table)
|
|
else:
|
|
print(table.table
|