Source code for acro.utils
"""ACRO: Utility Functions."""
from __future__ import annotations
import logging
from inspect import FrameInfo, getframeinfo
import pandas as pd
logger = logging.getLogger("acro")
[docs]
def get_command(default: str, stack_list: list[FrameInfo]) -> str:
"""Return the calling source line as a string.
Parameters
----------
default : str
Default string to return if unable to extract the stack.
stack_list : list[tuple]
A list of frame records for the caller's stack. The first entry in the
returned list represents the caller; the last entry represents the
outermost call on the stack.
Returns
-------
str
The calling source line.
"""
command: str = default
if len(stack_list) > 1:
code = getframeinfo(stack_list[1][0]).code_context
if code is not None:
command = "\n".join(code).strip()
logger.debug("command: %s", command)
return command
[docs]
def prettify_table_string(table: pd.DataFrame, separator: str | None = None) -> str:
"""
Add delimiters to table.to_string() to improve readability for onscreen display.
Splits fields on whitespace unless an optional separator is provided e.g. ',' for csv.
"""
hdelim = "-"
vdelim = "|"
table.rename(columns=lambda x: str(x).replace(" ", "_"), inplace=True)
output = table.to_string(justify="left")
as_strings = output.split("\n")
nheaders = len(as_strings) - table.shape[0]
rowlen = len(as_strings[0])
# get top level column labels and their positions
if separator is not None:
rowone_strings = as_strings[0].split(separator)
else:
rowone_strings = as_strings[0].split()
vals = rowone_strings[1:]
positions = []
for val in vals:
positions.append(as_strings[0].find(val))
for row, _ in enumerate(as_strings):
for pos in positions[::-1]:
as_strings[row] = as_strings[row][0:pos] + vdelim + as_strings[row][pos:]
rowlen += len(positions) # add on space for v delimiters
outstr = ""
outstr += hdelim * rowlen + vdelim + "\n"
for row in range(nheaders):
outstr += as_strings[row] + vdelim + "\n"
outstr += hdelim * rowlen + vdelim + "\n"
for row in range(nheaders, len(as_strings)):
outstr += as_strings[row] + vdelim + "\n"
outstr += hdelim * rowlen + vdelim + "\n"
return outstr