summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd2/utils.py16
-rw-r--r--tests/test_utils.py23
2 files changed, 39 insertions, 0 deletions
diff --git a/cmd2/utils.py b/cmd2/utils.py
index c8fb4aff..3e28641d 100644
--- a/cmd2/utils.py
+++ b/cmd2/utils.py
@@ -5,6 +5,7 @@ import collections
import glob
import os
import re
+import shutil
import subprocess
import sys
import threading
@@ -377,6 +378,21 @@ def get_exes_in_path(starts_with: str) -> List[str]:
return list(exes_set)
+def center_text(msg: str, *, pad: str = ' ') -> str:
+ """Centers text horizontally for display within the current terminal, optionally padding both sides.
+
+ :param msg: message to display in the center
+ :param pad: (optional) if provided, the first character will be used to pad both sides of the message
+ :return: centered message, optionally padded on both sides with pad_char
+ """
+ term_width = shutil.get_terminal_size().columns
+ surrounded_msg = ' {} '.format(msg)
+ if not pad:
+ pad = ' '
+ fill_char = pad[:1]
+ return surrounded_msg.center(term_width, fill_char)
+
+
class StdSim(object):
"""
Class to simulate behavior of sys.stdout or sys.stderr.
diff --git a/tests/test_utils.py b/tests/test_utils.py
index b43eb10c..44421b93 100644
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -276,3 +276,26 @@ def test_context_flag_bool(context_flag):
def test_context_flag_exit_err(context_flag):
with pytest.raises(ValueError):
context_flag.__exit__()
+
+
+def test_center_text_pad_none():
+ msg = 'foo'
+ centered = cu.center_text(msg, pad=None)
+ expected_center = ' ' + msg + ' '
+ assert expected_center in centered
+ letters_in_centered = set(centered)
+ letters_in_msg = set(msg)
+ assert len(letters_in_centered) == len(letters_in_msg) + 1
+
+def test_center_text_pad_equals():
+ msg = 'foo'
+ pad = '='
+ centered = cu.center_text(msg, pad=pad)
+ expected_center = ' ' + msg + ' '
+ assert expected_center in centered
+ assert centered.startswith(pad)
+ assert centered.endswith(pad)
+ letters_in_centered = set(centered)
+ letters_in_msg = set(msg)
+ assert len(letters_in_centered) == len(letters_in_msg) + 2
+