Skip to content

Commit

Permalink
Fix repeated line not detected during exception formatting (#1239)
Browse files Browse the repository at this point in the history
  • Loading branch information
Delgan authored Nov 24, 2024
1 parent 65fe4a8 commit a486a6c
Show file tree
Hide file tree
Showing 8 changed files with 739 additions and 6 deletions.
38 changes: 32 additions & 6 deletions loguru/_better_exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -534,13 +534,39 @@ def _format_exception(
yield from self._indent("-" * 35, group_nesting + 1, prefix="+-")

def _format_list(self, frames):
result = []
for filename, lineno, name, line in frames:
row = []
row.append(' File "{}", line {}, in {}\n'.format(filename, lineno, name))

def source_message(filename, lineno, name, line):
message = ' File "%s", line %d, in %s\n' % (filename, lineno, name)
if line:
row.append(" {}\n".format(line.strip()))
result.append("".join(row))
message += " %s\n" % line.strip()
return message

def skip_message(count):
plural = "s" if count > 1 else ""
return " [Previous line repeated %d more time%s]\n" % (count, plural)

result = []
count = 0
last_source = None

for *source, line in frames:
if source != last_source and count > 3:
result.append(skip_message(count - 3))

if source == last_source:
count += 1
if count > 3:
continue
else:
count = 1

result.append(source_message(*source, line))
last_source = source

# Add a final skip message if the iteration of frames ended mid-repetition.
if count > 3:
result.append(skip_message(count - 3))

return result

def format_exception(self, type_, value, tb, *, from_decorator=False):
Expand Down
79 changes: 79 additions & 0 deletions tests/exceptions/output/others/one_liner_recursion.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@

Traceback (most recent call last):
File "tests/exceptions/source/others/one_liner_recursion.py", line 14, in <module>
rec = lambda r, i: 1 / 0 if i == 0 else r(r, i - 1); rec(rec, 10)
File "tests/exceptions/source/others/one_liner_recursion.py", line 14, in <lambda>
rec = lambda r, i: 1 / 0 if i == 0 else r(r, i - 1); rec(rec, 10)
File "tests/exceptions/source/others/one_liner_recursion.py", line 14, in <lambda>
rec = lambda r, i: 1 / 0 if i == 0 else r(r, i - 1); rec(rec, 10)
File "tests/exceptions/source/others/one_liner_recursion.py", line 14, in <lambda>
rec = lambda r, i: 1 / 0 if i == 0 else r(r, i - 1); rec(rec, 10)
[Previous line repeated 8 more times]
ZeroDivisionError: division by zero

Traceback (most recent call last):
> File "tests/exceptions/source/others/one_liner_recursion.py", line 14, in <module>
rec = lambda r, i: 1 / 0 if i == 0 else r(r, i - 1); rec(rec, 10)
File "tests/exceptions/source/others/one_liner_recursion.py", line 14, in <lambda>
rec = lambda r, i: 1 / 0 if i == 0 else r(r, i - 1); rec(rec, 10)
File "tests/exceptions/source/others/one_liner_recursion.py", line 14, in <lambda>
rec = lambda r, i: 1 / 0 if i == 0 else r(r, i - 1); rec(rec, 10)
File "tests/exceptions/source/others/one_liner_recursion.py", line 14, in <lambda>
rec = lambda r, i: 1 / 0 if i == 0 else r(r, i - 1); rec(rec, 10)
[Previous line repeated 8 more times]
ZeroDivisionError: division by zero

Traceback (most recent call last):
File "tests/exceptions/source/others/one_liner_recursion.py", line 14, in <module>
rec = lambda r, i: 1 / 0 if i == 0 else r(r, i - 1); rec(rec, 10)
File "tests/exceptions/source/others/one_liner_recursion.py", line 14, in <lambda>
rec = lambda r, i: 1 / 0 if i == 0 else r(r, i - 1); rec(rec, 10)
File "tests/exceptions/source/others/one_liner_recursion.py", line 14, in <lambda>
rec = lambda r, i: 1 / 0 if i == 0 else r(r, i - 1); rec(rec, 10)
File "tests/exceptions/source/others/one_liner_recursion.py", line 14, in <lambda>
rec = lambda r, i: 1 / 0 if i == 0 else r(r, i - 1); rec(rec, 10)
[Previous line repeated 8 more times]
ZeroDivisionError: division by zero

Traceback (most recent call last):

File "tests/exceptions/source/others/one_liner_recursion.py", line 14, in <module>
rec = lambda r, i: 1 / 0 if i == 0 else r(r, i - 1); rec(rec, 10)
│ └ <function <lambda> at 0xDEADBEEF>
└ <function <lambda> at 0xDEADBEEF>

File "tests/exceptions/source/others/one_liner_recursion.py", line 14, in <lambda>
rec = lambda r, i: 1 / 0 if i == 0 else r(r, i - 1); rec(rec, 10)
│ │ │ │ │ │ │ └ <function <lambda> at 0xDEADBEEF>
│ │ │ │ │ │ └ <function <lambda> at 0xDEADBEEF>
│ │ │ │ │ └ 10
│ │ │ │ └ <function <lambda> at 0xDEADBEEF>
│ │ │ └ <function <lambda> at 0xDEADBEEF>
│ │ └ 10
│ └ 10
└ <function <lambda> at 0xDEADBEEF>

File "tests/exceptions/source/others/one_liner_recursion.py", line 14, in <lambda>
rec = lambda r, i: 1 / 0 if i == 0 else r(r, i - 1); rec(rec, 10)
│ │ │ │ │ │ │ └ <function <lambda> at 0xDEADBEEF>
│ │ │ │ │ │ └ <function <lambda> at 0xDEADBEEF>
│ │ │ │ │ └ 9
│ │ │ │ └ <function <lambda> at 0xDEADBEEF>
│ │ │ └ <function <lambda> at 0xDEADBEEF>
│ │ └ 9
│ └ 9
└ <function <lambda> at 0xDEADBEEF>

File "tests/exceptions/source/others/one_liner_recursion.py", line 14, in <lambda>
rec = lambda r, i: 1 / 0 if i == 0 else r(r, i - 1); rec(rec, 10)
│ │ │ │ │ │ │ └ <function <lambda> at 0xDEADBEEF>
│ │ │ │ │ │ └ <function <lambda> at 0xDEADBEEF>
│ │ │ │ │ └ 8
│ │ │ │ └ <function <lambda> at 0xDEADBEEF>
│ │ │ └ <function <lambda> at 0xDEADBEEF>
│ │ └ 8
│ └ 8
└ <function <lambda> at 0xDEADBEEF>
[Previous line repeated 8 more times]

ZeroDivisionError: division by zero
57 changes: 57 additions & 0 deletions tests/exceptions/output/others/recursion_error.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@

Traceback (most recent call last):
File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
[Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded

Traceback (most recent call last):
> File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
[Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded

Traceback (most recent call last):
File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
[Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded

Traceback (most recent call last):

File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>
recursive()
└ <function recursive at 0xDEADBEEF>

File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
└ <function recursive at 0xDEADBEEF>

File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
└ <function recursive at 0xDEADBEEF>

File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
└ <function recursive at 0xDEADBEEF>
[Previous line repeated 996 more times]

RecursionError: maximum recursion depth exceeded
Loading

0 comments on commit a486a6c

Please sign in to comment.