46
46
from typing_extensions import Literal
47
47
from weakref import ReferenceType
48
48
49
- _TracebackStyle = Literal ["long" , "short" , "line" , "no" , "native" ]
49
+ _TracebackStyle = Literal ["long" , "short" , "line" , "no" , "native" , "value" ]
50
50
51
51
52
52
class Code :
@@ -583,7 +583,7 @@ def getrepr(
583
583
Show locals per traceback entry.
584
584
Ignored if ``style=="native"``.
585
585
586
- :param str style: long|short|no|native traceback style
586
+ :param str style: long|short|no|native|value traceback style
587
587
588
588
:param bool abspath:
589
589
If paths should be changed to absolute or left unchanged.
@@ -758,16 +758,15 @@ def repr_locals(self, locals: Dict[str, object]) -> Optional["ReprLocals"]:
758
758
def repr_traceback_entry (
759
759
self , entry : TracebackEntry , excinfo : Optional [ExceptionInfo ] = None
760
760
) -> "ReprEntry" :
761
- source = self ._getentrysource (entry )
762
- if source is None :
763
- source = Source ("???" )
764
- line_index = 0
765
- else :
766
- line_index = entry .lineno - entry .getfirstlinesource ()
767
-
768
761
lines = [] # type: List[str]
769
762
style = entry ._repr_style if entry ._repr_style is not None else self .style
770
763
if style in ("short" , "long" ):
764
+ source = self ._getentrysource (entry )
765
+ if source is None :
766
+ source = Source ("???" )
767
+ line_index = 0
768
+ else :
769
+ line_index = entry .lineno - entry .getfirstlinesource ()
771
770
short = style == "short"
772
771
reprargs = self .repr_args (entry ) if not short else None
773
772
s = self .get_source (source , line_index , excinfo , short = short )
@@ -780,9 +779,14 @@ def repr_traceback_entry(
780
779
reprfileloc = ReprFileLocation (path , entry .lineno + 1 , message )
781
780
localsrepr = self .repr_locals (entry .locals )
782
781
return ReprEntry (lines , reprargs , localsrepr , reprfileloc , style )
783
- if excinfo :
784
- lines .extend (self .get_exconly (excinfo , indent = 4 ))
785
- return ReprEntry (lines , None , None , None , style )
782
+ elif style == "value" :
783
+ if excinfo :
784
+ lines .extend (str (excinfo .value ).split ("\n " ))
785
+ return ReprEntry (lines , None , None , None , style )
786
+ else :
787
+ if excinfo :
788
+ lines .extend (self .get_exconly (excinfo , indent = 4 ))
789
+ return ReprEntry (lines , None , None , None , style )
786
790
787
791
def _makepath (self , path ):
788
792
if not self .abspath :
@@ -806,6 +810,11 @@ def repr_traceback(self, excinfo: ExceptionInfo) -> "ReprTraceback":
806
810
807
811
last = traceback [- 1 ]
808
812
entries = []
813
+ if self .style == "value" :
814
+ reprentry = self .repr_traceback_entry (last , excinfo )
815
+ entries .append (reprentry )
816
+ return ReprTraceback (entries , None , style = self .style )
817
+
809
818
for index , entry in enumerate (traceback ):
810
819
einfo = (last == entry ) and excinfo or None
811
820
reprentry = self .repr_traceback_entry (entry , einfo )
@@ -865,7 +874,9 @@ def repr_excinfo(self, excinfo: ExceptionInfo) -> "ExceptionChainRepr":
865
874
seen .add (id (e ))
866
875
if excinfo_ :
867
876
reprtraceback = self .repr_traceback (excinfo_ )
868
- reprcrash = excinfo_ ._getreprcrash () # type: Optional[ReprFileLocation]
877
+ reprcrash = (
878
+ excinfo_ ._getreprcrash () if self .style != "value" else None
879
+ ) # type: Optional[ReprFileLocation]
869
880
else :
870
881
# fallback to native repr if the exception doesn't have a traceback:
871
882
# ExceptionInfo objects require a full traceback to work
@@ -1048,8 +1059,11 @@ def _write_entry_lines(self, tw: TerminalWriter) -> None:
1048
1059
"Unexpected failure lines between source lines:\n "
1049
1060
+ "\n " .join (self .lines )
1050
1061
)
1051
- indents .append (line [:indent_size ])
1052
- source_lines .append (line [indent_size :])
1062
+ if self .style == "value" :
1063
+ source_lines .append (line )
1064
+ else :
1065
+ indents .append (line [:indent_size ])
1066
+ source_lines .append (line [indent_size :])
1053
1067
else :
1054
1068
seeing_failures = True
1055
1069
failure_lines .append (line )
0 commit comments