Skip to content

Commit 0b96e03

Browse files
authored
Decrease default errors verbosity (#132)
* Decrease default errors verbosity * Fix linting issues Remove Inspector import Reformat cleo/ui/exception_trace.py with black
1 parent 8c3fb5b commit 0b96e03

File tree

3 files changed

+70
-14
lines changed

3 files changed

+70
-14
lines changed

cleo/application.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,8 @@ def render_error(self, error: Exception, io: IO) -> None:
490490
trace = ExceptionTrace(
491491
error, solution_provider_repository=self._solution_provider_repository
492492
)
493-
trace.render(io.error_output, isinstance(error, CleoSimpleException))
493+
simple = not io.is_verbose() or isinstance(error, CleoSimpleException)
494+
trace.render(io.error_output, simple)
494495

495496
def _configure_io(self, io: IO) -> None:
496497
if io.input.has_parameter_option("--ansi", True):

cleo/ui/exception_trace.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from typing import TYPE_CHECKING
1313

1414
from crashtest.frame_collection import FrameCollection
15-
from crashtest.inspector import Inspector
1615

1716
from cleo.formatters.formatter import Formatter
1817

@@ -255,9 +254,10 @@ def render(self, io: IO | Output, simple: bool = False) -> None:
255254
if simple:
256255
io.write_line("")
257256
io.write_line(f"<error>{str(self._exception)}</error>")
258-
return
257+
else:
258+
self._render_exception(io, self._exception)
259259

260-
return self._render_exception(io, self._exception)
260+
self._render_solution(io, self._exception)
261261

262262
def _render_exception(self, io: IO | Output, exception: Exception) -> None:
263263
from crashtest.inspector import Inspector
@@ -286,8 +286,6 @@ def _render_exception(self, io: IO | Output, exception: Exception) -> None:
286286
current_frame = inspector.frames[-1]
287287
self._render_snippet(io, current_frame)
288288

289-
self._render_solution(io, inspector)
290-
291289
def _render_snippet(self, io: IO | Output, frame: Frame) -> None:
292290
self._render_line(
293291
io,
@@ -306,12 +304,12 @@ def _render_snippet(self, io: IO | Output, frame: Frame) -> None:
306304
for code_line in code_lines:
307305
self._render_line(io, code_line, indent=4)
308306

309-
def _render_solution(self, io: IO | Output, inspector: Inspector) -> None:
307+
def _render_solution(self, io: IO | Output, exception: Exception) -> None:
310308
if self._solution_provider_repository is None:
311309
return
312310

313311
solutions = self._solution_provider_repository.get_solutions_for_exception(
314-
inspector.exception
312+
exception
315313
)
316314
symbol = "•"
317315
if not io.supports_utf8():
@@ -348,7 +346,7 @@ def _render_trace(self, io: IO | Output, frames: FrameCollection) -> None:
348346
stack_frames.append(frame)
349347

350348
remaining_frames_length = len(stack_frames) - 1
351-
if io.is_verbose() and remaining_frames_length:
349+
if io.is_very_verbose() and remaining_frames_length:
352350
self._render_line(io, "<fg=yellow>Stack trace</>:", True)
353351
max_frame_length = len(str(remaining_frames_length))
354352
frame_collections = stack_frames.compact()

tests/ui/test_exception_trace.py

Lines changed: 62 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,9 @@ def test_render_debug_better_error_message_recursion_error():
144144
assert re.match(expected, io.fetch_output()) is not None
145145

146146

147-
def test_render_verbose_better_error_message():
147+
def test_render_very_verbose_better_error_message():
148148
io = BufferedIO()
149-
io.set_verbosity(Verbosity.VERBOSE)
149+
io.set_verbosity(Verbosity.VERY_VERBOSE)
150150

151151
try:
152152
fail()
@@ -158,7 +158,7 @@ def test_render_verbose_better_error_message():
158158
expected = r"""^
159159
Stack trace:
160160
161-
1 {}:152 in test_render_verbose_better_error_message
161+
1 {}:152 in test_render_very_verbose_better_error_message
162162
fail\(\)
163163
164164
Exception
@@ -192,7 +192,7 @@ def second():
192192

193193
def test_render_debug_better_error_message_recursion_error_with_multiple_duplicated_frames():
194194
io = BufferedIO()
195-
io.set_verbosity(Verbosity.VERBOSE)
195+
io.set_verbosity(Verbosity.VERY_VERBOSE)
196196

197197
with pytest.raises(RecursionError) as e:
198198
first()
@@ -212,7 +212,7 @@ def test_render_can_ignore_given_files():
212212
from tests.ui.helpers import outer
213213

214214
io = BufferedIO()
215-
io.set_verbosity(Verbosity.VERBOSE)
215+
io.set_verbosity(Verbosity.VERY_VERBOSE)
216216

217217
def call():
218218
def run():
@@ -477,3 +477,60 @@ def test():
477477
" ...",
478478
"",
479479
]
480+
481+
482+
def test_simple_render():
483+
io = BufferedIO()
484+
485+
with pytest.raises(Exception) as e:
486+
fail()
487+
488+
trace = ExceptionTrace(e.value)
489+
490+
trace.render(io, simple=True)
491+
492+
expected = """
493+
Failed
494+
"""
495+
496+
assert expected == io.fetch_output()
497+
498+
499+
def test_simple_render_supports_solutions():
500+
from crashtest.contracts.base_solution import BaseSolution
501+
from crashtest.contracts.provides_solution import ProvidesSolution
502+
from crashtest.solution_providers.solution_provider_repository import (
503+
SolutionProviderRepository,
504+
)
505+
506+
class CustomError(ProvidesSolution, Exception):
507+
@property
508+
def solution(self):
509+
solution = BaseSolution("Solution Title.", "Solution Description")
510+
solution.documentation_links.append("https://example.com")
511+
solution.documentation_links.append("https://example2.com")
512+
513+
return solution
514+
515+
io = BufferedIO()
516+
517+
def call():
518+
raise CustomError("Error with solution")
519+
520+
with pytest.raises(CustomError) as e:
521+
call()
522+
523+
trace = ExceptionTrace(
524+
e.value, solution_provider_repository=SolutionProviderRepository()
525+
)
526+
527+
trace.render(io, simple=True)
528+
529+
expected = """
530+
Error with solution
531+
532+
• Solution Title: Solution Description
533+
https://example.com,
534+
https://example2.com
535+
"""
536+
assert expected == io.fetch_output()

0 commit comments

Comments
 (0)