Blame view
tools/patman/terminal.py
4.42 KB
83d290c56 SPDX: Convert all... |
1 |
# SPDX-License-Identifier: GPL-2.0+ |
0d24de9d5 Add 'patman' patc... |
2 3 |
# Copyright (c) 2011 The Chromium OS Authors. # |
0d24de9d5 Add 'patman' patc... |
4 5 6 7 8 |
"""Terminal utilities This module handles terminal interaction including ANSI color codes. """ |
a920a17b2 patman: Make prin... |
9 |
from __future__ import print_function |
bbd01435b patman: Use ANSI ... |
10 11 12 13 14 |
import os import sys # Selection of when we want our output to be colored COLOR_IF_TERMINAL, COLOR_ALWAYS, COLOR_NEVER = range(3) |
3c6c0f81b patman: Add a way... |
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# Initially, we are set up to print to the terminal print_test_mode = False print_test_list = [] class PrintLine: """A line of text output Members: text: Text line that was printed newline: True to output a newline after the text colour: Text colour to use """ def __init__(self, text, newline, colour): self.text = text self.newline = newline self.colour = colour def __str__(self): return 'newline=%s, colour=%s, text=%s' % (self.newline, self.colour, self.text) def Print(text='', newline=True, colour=None): """Handle a line of output to the terminal. In test mode this is recorded in a list. Otherwise it is output to the terminal. Args: text: Text to print newline: True to add a new line at the end of the text colour: Colour to use for the text """ if print_test_mode: print_test_list.append(PrintLine(text, newline, colour)) else: if colour: col = Color() text = col.Color(colour, text) |
a920a17b2 patman: Make prin... |
53 |
print(text, end='') |
3c6c0f81b patman: Add a way... |
54 |
if newline: |
a920a17b2 patman: Make prin... |
55 |
print() |
8b4919ed2 patman: Flush out... |
56 57 |
else: sys.stdout.flush() |
3c6c0f81b patman: Add a way... |
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
def SetPrintTestMode(): """Go into test mode, where all printing is recorded""" global print_test_mode print_test_mode = True def GetPrintTestLines(): """Get a list of all lines output through Print() Returns: A list of PrintLine objects """ global print_test_list ret = print_test_list print_test_list = [] return ret def EchoPrintTestLines(): """Print out the text lines collected""" for line in print_test_list: if line.colour: col = Color() |
a920a17b2 patman: Make prin... |
82 |
print(col.Color(line.colour, line.text), end='') |
3c6c0f81b patman: Add a way... |
83 |
else: |
a920a17b2 patman: Make prin... |
84 |
print(line.text, end='') |
3c6c0f81b patman: Add a way... |
85 |
if line.newline: |
a920a17b2 patman: Make prin... |
86 |
print() |
3c6c0f81b patman: Add a way... |
87 |
|
0d24de9d5 Add 'patman' patc... |
88 |
class Color(object): |
6ba5737ff patman: Fix inden... |
89 90 91 92 93 94 95 |
"""Conditionally wraps text in ANSI color escape sequences.""" BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8) BOLD = -1 BRIGHT_START = '\033[1;%dm' NORMAL_START = '\033[22;%dm' BOLD_START = '\033[1m' RESET = '\033[0m' |
0d24de9d5 Add 'patman' patc... |
96 |
|
6ba5737ff patman: Fix inden... |
97 98 |
def __init__(self, colored=COLOR_IF_TERMINAL): """Create a new Color object, optionally disabling color output. |
0d24de9d5 Add 'patman' patc... |
99 |
|
6ba5737ff patman: Fix inden... |
100 101 102 103 |
Args: enabled: True if color output should be enabled. If False then this class will not add color codes at all. """ |
e752edcb6 patman: Correct u... |
104 105 106 107 108 109 |
try: self._enabled = (colored == COLOR_ALWAYS or (colored == COLOR_IF_TERMINAL and os.isatty(sys.stdout.fileno()))) except: self._enabled = False |
0d24de9d5 Add 'patman' patc... |
110 |
|
6ba5737ff patman: Fix inden... |
111 112 |
def Start(self, color, bright=True): """Returns a start color code. |
0d24de9d5 Add 'patman' patc... |
113 |
|
6ba5737ff patman: Fix inden... |
114 115 |
Args: color: Color to use, .e.g BLACK, RED, etc. |
0d24de9d5 Add 'patman' patc... |
116 |
|
6ba5737ff patman: Fix inden... |
117 118 119 120 121 122 123 124 |
Returns: If color is enabled, returns an ANSI sequence to start the given color, otherwise returns empty string """ if self._enabled: base = self.BRIGHT_START if bright else self.NORMAL_START return base % (color + 30) return '' |
0d24de9d5 Add 'patman' patc... |
125 |
|
6ba5737ff patman: Fix inden... |
126 |
def Stop(self): |
ab4a6aba7 patman: fix some ... |
127 |
"""Returns a stop color code. |
0d24de9d5 Add 'patman' patc... |
128 |
|
6ba5737ff patman: Fix inden... |
129 130 131 132 133 134 135 |
Returns: If color is enabled, returns an ANSI color reset sequence, otherwise returns empty string """ if self._enabled: return self.RESET return '' |
0d24de9d5 Add 'patman' patc... |
136 |
|
6ba5737ff patman: Fix inden... |
137 138 |
def Color(self, color, text, bright=True): """Returns text with conditionally added color escape sequences. |
0d24de9d5 Add 'patman' patc... |
139 |
|
6ba5737ff patman: Fix inden... |
140 141 142 143 |
Keyword arguments: color: Text color -- one of the color constants defined in this class. text: The text to color. |
0d24de9d5 Add 'patman' patc... |
144 |
|
6ba5737ff patman: Fix inden... |
145 146 147 148 149 150 151 152 153 154 155 156 157 |
Returns: If self._enabled is False, returns the original text. If it's True, returns text with color escape sequences based on the value of color. """ if not self._enabled: return text if color == self.BOLD: start = self.BOLD_START else: base = self.BRIGHT_START if bright else self.NORMAL_START start = base % (color + 30) return start + text + self.RESET |