Skip to content

Commit aa0e67b

Browse files
committed
Add colored output for the debug REPL
1 parent d6f9178 commit aa0e67b

File tree

1 file changed

+19
-14
lines changed

1 file changed

+19
-14
lines changed

lib/rule_engine/debug_repl.py

+19-14
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@
3232

3333
import argparse
3434
import code
35+
import os
3536
import pprint
3637
import re
38+
import sys
3739
import textwrap
3840
import traceback
3941

@@ -43,6 +45,7 @@
4345

4446
try:
4547
from IPython import embed
48+
from IPython.core import ultratb
4649
from prompt_toolkit import PromptSession
4750
except ImportError:
4851
has_development_dependencies = False
@@ -75,6 +78,11 @@ def main():
7578
if not has_development_dependencies:
7679
parser.error('development dependencies are not installed, install them with: pipenv install --dev')
7780

81+
if os.environ.get('NO_COLOR'):
82+
color_scheme = 'nocolor'
83+
else:
84+
color_scheme = 'neutral'
85+
7886
context = engine.Context()
7987
thing = None
8088
if arguments.edit_console or arguments.edit_file:
@@ -95,11 +103,12 @@ def main():
95103
namespace = {'context': context, 'thing': thing}
96104
print("Starting IPython shell...")
97105
print("Edit the \'context\' and \'thing\' objects as necessary")
98-
embed(colors="neutral", user_ns=namespace)
106+
embed(colors=color_scheme, user_ns=namespace)
99107
context = namespace.get('context', context)
100108
thing = namespace.get('thing', thing)
101109
debugging = arguments.debug
102110
session = PromptSession()
111+
color_tb = ultratb.ColorTB(color_scheme=color_scheme)
103112

104113
while True:
105114
try:
@@ -117,25 +126,21 @@ def main():
117126
rule = engine.Rule(rule_text, context=context)
118127
result = rule.evaluate(thing)
119128
except errors.EngineError as error:
120-
print("{}: {}".format(error.__class__.__name__, error.message))
129+
print(f"{color_tb.Colors.excName}{error.__class__.__name__}:{color_tb.Colors.Normal} {error.message}", file=sys.stderr)
121130
if isinstance(error, (errors.AttributeResolutionError, errors.SymbolResolutionError)) and error.suggestion:
122-
print("Did you mean '{}'?".format(error.suggestion))
131+
print(f"Did you mean '{error.suggestion}'?", file=sys.stderr)
123132
elif isinstance(error, errors.RegexSyntaxError):
124-
print(" Regex: {!r}".format(error.error.pattern))
125-
print(" Details: {} at position {}".format(error.error.msg, error.error.pos))
133+
print(f" Regex: {error.error.pattern!r}", file=sys.stderr)
134+
print(f" Details: {error.error.msg} at position {error.error.pos}", file=sys.stderr)
126135
elif isinstance(error, errors.FunctionCallError):
127-
print(" Function: {!r}".format(error.function_name))
136+
print(f" Function: {error.function_name!r}", file=sys.stderr)
128137
if debugging and error.error:
129-
inner_exception = ''.join(traceback.format_exception(
130-
error.error,
131-
error.error,
132-
error.error.__traceback__
133-
))
134-
print(textwrap.indent(inner_exception, ' ' * 4))
138+
inner_exception = color_tb.text(error.error.__class__, error.error, error.error.__traceback__)
139+
print(textwrap.indent(inner_exception, ' ' * 2), file=sys.stderr)
135140
if debugging:
136-
traceback.print_exc()
141+
print(color_tb.text(error.__class__, error, error.__traceback__), file=sys.stderr)
137142
except Exception as error:
138-
traceback.print_exc()
143+
print(color_tb.text(error.__class__, error, error.__traceback__), file=sys.stderr)
139144
else:
140145
print('result: ')
141146
pprint.pprint(result, indent=4)

0 commit comments

Comments
 (0)