diff options
author | Todd Leonhardt <todd.leonhardt@gmail.com> | 2019-06-30 17:59:38 -0400 |
---|---|---|
committer | Todd Leonhardt <todd.leonhardt@gmail.com> | 2019-06-30 17:59:38 -0400 |
commit | 5074f2573b08f4f44ab3a41ac7a450c4844dcd3d (patch) | |
tree | 731897fe25f9fd3beaeb3e8541a16a8226558545 /cmd2/cmd2.py | |
parent | 6787a3d412a1fba8783dc393d8d4af124220f4b9 (diff) | |
download | cmd2-git-5074f2573b08f4f44ab3a41ac7a450c4844dcd3d.tar.gz |
Initial changes for encapsulation of colorama usage within ansi.py
Changes include:
- ansi.py is now the only cmd2 code which depends on colorama
- cmd2 tests no longer rely on colorama
- Added new functions to ansi.py:
- async_alert_str()
- set_title_str
- Added unit test for set_title_str
TODO:
- Refactor async_alert_str so cursor position is passed in and import from rl_utils is no longer required
- Add unit test(s) for async_alert_str
- Refactor FG_COLORS and BG_COLORS in ansi.py to not use constants from colorama
Diffstat (limited to 'cmd2/cmd2.py')
-rw-r--r-- | cmd2/cmd2.py | 58 |
1 files changed, 4 insertions, 54 deletions
diff --git a/cmd2/cmd2.py b/cmd2/cmd2.py index d41a631d..77af3910 100644 --- a/cmd2/cmd2.py +++ b/cmd2/cmd2.py @@ -42,8 +42,6 @@ from collections import namedtuple from contextlib import redirect_stdout from typing import Any, Callable, Dict, List, Mapping, Optional, Tuple, Type, Union -import colorama - from . import ansi from . import constants from . import plugin @@ -54,7 +52,7 @@ from .history import History, HistoryItem from .parsing import StatementParser, Statement, Macro, MacroArg, shlex_split # Set up readline -from .rl_utils import rl_type, RlType, rl_get_point, rl_set_prompt, vt100_support, rl_make_safe_prompt +from .rl_utils import rl_type, RlType, rl_set_prompt, vt100_support, rl_make_safe_prompt if rl_type == RlType.NONE: # pragma: no cover rl_warning = "Readline features including tab completion have been disabled since no \n" \ @@ -359,9 +357,6 @@ class Cmd(cmd.Cmd): except AttributeError: pass - # Override whether ansi codes should be stripped from the output since cmd2 has its own logic for doing this - colorama.init(strip=False) - # initialize plugin system # needs to be done before we call __init__(0) self._initialize_plugin_system() @@ -3782,9 +3777,6 @@ class Cmd(cmd.Cmd): if not (vt100_support and self.use_rawinput): return - import shutil - from colorama import Cursor - # Sanity check that can't fail if self.terminal_lock was acquired before calling this function if self.terminal_lock.acquire(blocking=False): @@ -3808,50 +3800,8 @@ class Cmd(cmd.Cmd): update_terminal = True if update_terminal: - # Get the size of the terminal - terminal_size = shutil.get_terminal_size() - - # Split the prompt lines since it can contain newline characters. - prompt_lines = current_prompt.splitlines() - - # Calculate how many terminal lines are taken up by all prompt lines except for the last one. - # That will be included in the input lines calculations since that is where the cursor is. - num_prompt_terminal_lines = 0 - for line in prompt_lines[:-1]: - line_width = ansi.ansi_safe_wcswidth(line) - num_prompt_terminal_lines += int(line_width / terminal_size.columns) + 1 - - # Now calculate how many terminal lines are take up by the input - last_prompt_line = prompt_lines[-1] - last_prompt_line_width = ansi.ansi_safe_wcswidth(last_prompt_line) - - input_width = last_prompt_line_width + ansi.ansi_safe_wcswidth(readline.get_line_buffer()) - - num_input_terminal_lines = int(input_width / terminal_size.columns) + 1 - - # Get the cursor's offset from the beginning of the first input line - cursor_input_offset = last_prompt_line_width + rl_get_point() - - # Calculate what input line the cursor is on - cursor_input_line = int(cursor_input_offset / terminal_size.columns) + 1 - - # Create a string that when printed will clear all input lines and display the alert - terminal_str = '' - - # Move the cursor down to the last input line - if cursor_input_line != num_input_terminal_lines: - terminal_str += Cursor.DOWN(num_input_terminal_lines - cursor_input_line) - - # Clear each line from the bottom up so that the cursor ends up on the first prompt line - total_lines = num_prompt_terminal_lines + num_input_terminal_lines - terminal_str += (colorama.ansi.clear_line() + Cursor.UP(1)) * (total_lines - 1) - - # Clear the first prompt line - terminal_str += colorama.ansi.clear_line() - - # Move the cursor to the beginning of the first prompt line and print the alert - terminal_str += '\r' + alert_msg - + terminal_str = ansi.async_alert_str(prompt=current_prompt, line=readline.get_line_buffer(), + alert_msg=alert_msg) if rl_type == RlType.GNU: sys.stderr.write(terminal_str) elif rl_type == RlType.PYREADLINE: @@ -3904,7 +3854,7 @@ class Cmd(cmd.Cmd): # Sanity check that can't fail if self.terminal_lock was acquired before calling this function if self.terminal_lock.acquire(blocking=False): try: - sys.stderr.write(colorama.ansi.set_title(title)) + sys.stderr.write(ansi.set_title_str(title)) except AttributeError: # Debugging in Pycharm has issues with setting terminal title pass |