@@ -455,7 +455,18 @@ class Mismatch(Failure):
455455 """
456456
457457 def __init__ (self , expected , actual , help = None ):
458- super ().__init__ (rationale = _ ("expected {}, not {}" ).format (_raw (expected ), _raw (actual )), help = help )
458+ expected , actual = _truncate (expected , actual ), _truncate (actual , expected )
459+
460+ # rationale = _("expected {}, not {}").format(
461+ # _raw(expected),
462+ # _raw(actual)
463+ # )
464+ rationale = _ ("expected: {}\n actual: {}" ).format (
465+ _raw (expected ),
466+ _raw (actual )
467+ )
468+
469+ super ().__init__ (rationale = rationale , help = help )
459470
460471 if expected == EOF :
461472 expected = "EOF"
@@ -495,6 +506,30 @@ def wrapper(*args, **kwargs):
495506 return wrapper
496507 return decorator
497508
509+ def _truncate (s , other , max_len = 10 ):
510+ """Truncate string s around its first difference with other"""
511+
512+ # find the index of first difference
513+ limit = min (len (s ), len (other ))
514+ i = limit
515+ for index in range (limit ):
516+ if s [index ] != other [index ]:
517+ i = index
518+ break
519+
520+ # center around diff
521+ start = max (i - (max_len // 2 ), 0 )
522+ end = min (start + max_len , len (s ))
523+
524+ snippet = s [start :end ]
525+
526+ if start > 0 :
527+ snippet = "..." + snippet
528+ if end < len (s ):
529+ snippet = snippet + "..."
530+
531+ return snippet
532+
498533
499534def _raw (s ):
500535 """Get raw representation of s, truncating if too long."""
@@ -506,8 +541,7 @@ def _raw(s):
506541 return "EOF"
507542
508543 s = f'"{ repr (str (s ))[1 :- 1 ]} "'
509- # if len(s) > 15:
510- # s = s[:15] + "...\"" # Truncate if too long
544+
511545 return s
512546
513547
0 commit comments