summaryrefslogtreecommitdiff
path: root/text_utils.py
diff options
context:
space:
mode:
authorScott Gasch <[email protected]>2021-09-08 23:29:05 -0700
committerScott Gasch <[email protected]>2021-09-08 23:29:05 -0700
commit709370b2198e09f1dbe195fe8813602a3125b7f6 (patch)
tree5bbe521d7973f86526ed09d4411a5b3ff0e23aaa /text_utils.py
parentb10d30a46e601c9ee1f843241f2d69a1f90f7a94 (diff)
Add doctests to some of this stuff.
Diffstat (limited to 'text_utils.py')
-rw-r--r--text_utils.py59
1 files changed, 57 insertions, 2 deletions
diff --git a/text_utils.py b/text_utils.py
index 3be32ff..8ea6e19 100644
--- a/text_utils.py
+++ b/text_utils.py
@@ -16,6 +16,8 @@ class RowsColumns(NamedTuple):
def get_console_rows_columns() -> RowsColumns:
+ """Returns the number of rows/columns on the current console."""
+
from exec_utils import cmd
rows, columns = cmd("stty size").split()
return RowsColumns(int(rows), int(columns))
@@ -31,6 +33,8 @@ def progress_graph(
right_end="]",
redraw=True,
) -> None:
+ """Draws a progress graph."""
+
percent = current / total
ret = "\r" if redraw else "\n"
bar = bar_graph(
@@ -53,9 +57,17 @@ def bar_graph(
include_text=True,
width=70,
fgcolor=fg("school bus yellow"),
+ reset=reset(),
left_end="[",
right_end="]",
) -> None:
+ """Returns a string containing a bar graph.
+
+ >>> bar_graph(0.5, fgcolor='', reset='')
+ '[███████████████████████████████████ ] 50.0%'
+
+ """
+
if percentage < 0.0 or percentage > 1.0:
raise ValueError(percentage)
if include_text:
@@ -75,7 +87,7 @@ def bar_graph(
fgcolor +
"█" * whole_width + part_char +
" " * (width - whole_width - 1) +
- reset() +
+ reset +
right_end + " " +
text)
@@ -87,6 +99,17 @@ def distribute_strings(
alignment: str = "c",
padding: str = " ",
) -> str:
+ """
+ Distributes strings into a line with a particular justification.
+
+ >>> distribute_strings(['this', 'is', 'a', 'test'], width=40)
+ ' this is a test '
+ >>> distribute_strings(['this', 'is', 'a', 'test'], width=40, alignment='l')
+ 'this is a test '
+ >>> distribute_strings(['this', 'is', 'a', 'test'], width=40, alignment='r')
+ ' this is a test'
+
+ """
subwidth = math.floor(width / len(strings))
retval = ""
for string in strings:
@@ -100,6 +123,15 @@ def distribute_strings(
def justify_string_by_chunk(
string: str, width: int = 80, padding: str = " "
) -> str:
+ """
+ Justifies a string.
+
+ >>> justify_string_by_chunk("This is a test", 40)
+ 'This is a test'
+ >>> justify_string_by_chunk("This is a test", 20)
+ 'This is a test'
+
+ """
padding = padding[0]
first, *rest, last = string.split()
w = width - (len(first) + 1 + len(last) + 1)
@@ -115,6 +147,18 @@ def justify_string_by_chunk(
def justify_string(
string: str, *, width: int = 80, alignment: str = "c", padding: str = " "
) -> str:
+ """Justify a string.
+
+ >>> justify_string('This is another test', width=40, alignment='c')
+ ' This is another test '
+ >>> justify_string('This is another test', width=40, alignment='l')
+ 'This is another test '
+ >>> justify_string('This is another test', width=40, alignment='r')
+ ' This is another test'
+ >>> justify_string('This is another test', width=40, alignment='j')
+ 'This is another test'
+
+ """
alignment = alignment[0]
padding = padding[0]
while len(string) < width:
@@ -139,7 +183,13 @@ def justify_string(
def justify_text(text: str, *, width: int = 80, alignment: str = "c") -> str:
- print("-" * width)
+ """
+ Justifies text.
+
+ >>> justify_text('This is a test of the emergency broadcast system. This is only a test.',
+ ... width=40, alignment='j') #doctest: +NORMALIZE_WHITESPACE
+ 'This is a test of the emergency\\nbroadcast system. This is only a test.'
+ """
retval = ""
line = ""
for word in text.split():
@@ -216,3 +266,8 @@ class Indenter:
import string_utils
text = string_utils.sprintf(*arg, **kwargs)
print(self.pad_prefix + self.padding * self.level + text, end='')
+
+
+if __name__ == '__main__':
+ import doctest
+ doctest.testmod()