44import reprlib
55
66from collections .abc import Mapping
7+ from typing import Union , Tuple
78
89from rollbar .lib import (
9- integer_types , key_in , key_depth , number_types , sequence_types ,
10+ integer_types , key_in , key_depth , sequence_types ,
1011 string_types )
1112from rollbar .lib .transform import Transform
1213
2526}
2627
2728
29+ def _max_left_right (max_len : int , seperator_len : int ) -> Tuple [int , int ]:
30+ left = max (0 , (max_len - seperator_len )// 2 )
31+ right = max (0 , max_len - seperator_len - left )
32+ return left , right
33+
34+
35+ def shorten_array (obj : array , max_len : int ) -> array :
36+ if len (obj ) <= max_len :
37+ return obj
38+
39+ return obj [:max_len ]
40+
41+
42+ def shorten_bytes (obj : bytes , max_len : int ) -> bytes :
43+ if len (obj ) <= max_len :
44+ return obj
45+
46+ return obj [:max_len ]
47+
48+
49+ def shorten_deque (obj : collections .deque , max_len : int ) -> collections .deque :
50+ if len (obj ) <= max_len :
51+ return obj
52+
53+ return collections .deque (itertools .islice (obj , max_len ))
54+
55+
56+ def shorten_frozenset (obj : frozenset , max_len : int ) -> frozenset :
57+ if len (obj ) <= max_len :
58+ return obj
59+
60+ return frozenset ([elem for i , elem in enumerate (obj ) if i < max_len ] + ['...' ])
61+
62+
63+ def shorten_int (obj : int , max_len : int ) -> Union [int , str ]:
64+ s = repr (obj )
65+ if len (s ) <= max_len :
66+ return obj
67+
68+ left , right = _max_left_right (max_len , 3 )
69+ return s [:left ] + '...' + s [len (s )- right :]
70+
71+
72+ def shorten_list (obj : list , max_len : int ) -> list :
73+ if len (obj ) <= max_len :
74+ return obj
75+
76+ return obj [:max_len ] + ['...' ]
77+
78+
79+ def shorten_mapping (obj : Union [dict , Mapping ], max_keys : int ) -> dict :
80+ if len (obj ) <= max_keys :
81+ return obj
82+
83+ return {k : obj [k ] for k in itertools .islice (obj .keys (), max_keys )}
84+
85+
86+ def shorten_set (obj : set , max_len : int ) -> set :
87+ if len (obj ) <= max_len :
88+ return obj
89+
90+ return set ([elem for i , elem in enumerate (obj ) if i < max_len ] + ['...' ])
91+
92+
93+ def shorten_string (obj : str , max_len : int ) -> str :
94+ if len (obj ) <= max_len :
95+ return obj
96+
97+ left , right = _max_left_right (max_len , 3 )
98+ return obj [:left ] + '...' + obj [len (obj )- right :]
99+
100+
101+ def shorten_tuple (obj : tuple , max_len : int ) -> tuple :
102+ if len (obj ) <= max_len :
103+ return obj
104+
105+ return obj [:max_len ] + ('...' ,)
106+
107+
108+
28109class ShortenerTransform (Transform ):
110+ depth_first = False
111+
29112 def __init__ (self , safe_repr = True , keys = None , ** sizes ):
30113 super (ShortenerTransform , self ).__init__ ()
31114 self .safe_repr = safe_repr
@@ -47,26 +130,33 @@ def _get_max_size(self, obj):
47130
48131 return self ._repr .maxother
49132
50- def _shorten_sequence (self , obj , max_keys ):
51- _len = len (obj )
52- if _len <= max_keys :
53- return obj
54-
55- return self ._repr .repr (obj )
56-
57- def _shorten_mapping (self , obj , max_keys ):
58- _len = len (obj )
59- if _len <= max_keys :
60- return obj
61-
62- return {k : obj [k ] for k in itertools .islice (obj .keys (), max_keys )}
133+ def _shorten (self , val ):
134+ max_size = self ._get_max_size (val )
63135
64- def _shorten_basic (self , obj , max_len ):
65- val = str (obj )
66- if len (val ) <= max_len :
67- return obj
136+ if isinstance (val , array ):
137+ return shorten_array (val , max_size )
138+ if isinstance (val , bytes ):
139+ return shorten_bytes (val , max_size )
140+ if isinstance (val , collections .deque ):
141+ return shorten_deque (val , max_size )
142+ if isinstance (val , (dict , Mapping )):
143+ return shorten_mapping (val , max_size )
144+ if isinstance (val , float ):
145+ return val
146+ if isinstance (val , frozenset ):
147+ return shorten_frozenset (val , max_size )
148+ if isinstance (val , int ):
149+ return shorten_int (val , max_size )
150+ if isinstance (val , list ):
151+ return shorten_list (val , max_size )
152+ if isinstance (val , set ):
153+ return shorten_set (val , max_size )
154+ if isinstance (val , str ):
155+ return shorten_string (val , max_size )
156+ if isinstance (val , tuple ):
157+ return shorten_tuple (val , max_size )
68158
69- return self ._repr . repr ( obj )
159+ return self ._shorten_other ( val )
70160
71161 def _shorten_other (self , obj ):
72162 if obj is None :
@@ -77,19 +167,6 @@ def _shorten_other(self, obj):
77167
78168 return self ._repr .repr (obj )
79169
80- def _shorten (self , val ):
81- max_size = self ._get_max_size (val )
82-
83- if isinstance (val , dict ):
84- return self ._shorten_mapping (val , max_size )
85- if isinstance (val , (string_types , sequence_types )):
86- return self ._shorten_sequence (val , max_size )
87-
88- if isinstance (val , number_types ):
89- return self ._shorten_basic (val , self ._repr .maxlong )
90-
91- return self ._shorten_other (val )
92-
93170 def _should_shorten (self , val , key ):
94171 if not key :
95172 return False
@@ -100,18 +177,18 @@ def _should_drop(self, val, key) -> bool:
100177 if not key :
101178 return False
102179
103- maxdepth = key_depth (key , self .keys )
104- if maxdepth == 0 :
180+ max_depth = key_depth (key , self .keys )
181+ if max_depth == 0 :
105182 return False
106183
107- return (maxdepth + self ._repr .maxlevel ) <= len (key )
184+ return (max_depth + self ._repr .maxlevel ) <= len (key )
108185
109186 def default (self , o , key = None ):
110187 if self ._should_drop (o , key ):
111- if isinstance (o , dict ):
112- return '{ ...}'
188+ if isinstance (o , ( dict , Mapping ) ):
189+ return { ' ...' : '...' }
113190 if isinstance (o , sequence_types ):
114- return '[ ...]'
191+ return [ ' ...' ]
115192
116193 if self ._should_shorten (o , key ):
117194 return self ._shorten (o )
0 commit comments