repr.py (7412B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\lib\werkzeug\debug\repr.py 2 import sys 3 import re 4 from traceback import format_exception_only 5 try: 6 from collections import deque 7 except ImportError: 8 deque = None 9 10 from werkzeug.utils import escape 11 from werkzeug.debug.utils import render_template 12 missing = object() 13 _paragraph_re = re.compile('(?:\\r\\n|\\r|\\n){2,}') 14 RegexType = type(_paragraph_re) 15 16 def debug_repr(obj): 17 return DebugReprGenerator().repr(obj) 18 19 20 def dump(obj = missing): 21 gen = DebugReprGenerator() 22 if obj is missing: 23 rv = gen.dump_locals(sys._getframe(1).f_locals) 24 else: 25 rv = gen.dump_object(obj) 26 sys.stdout._write(rv) 27 28 29 class _Helper(object): 30 31 def __call__(self, topic = None): 32 title = text = None 33 if topic is not None: 34 import pydoc 35 pydoc.help(topic) 36 rv = sys.stdout.reset().decode('utf-8', 'ignore') 37 paragraphs = _paragraph_re.split(rv) 38 if len(paragraphs) > 1: 39 title = paragraphs[0] 40 text = '\n\n'.join(paragraphs[1:]) 41 else: 42 title = 'Help' 43 text = paragraphs[0] 44 rv = render_template('help_command.html', title=title, text=text) 45 sys.stdout._write(rv) 46 47 48 helper = _Helper() 49 50 def _add_subclass_info(inner, obj, base): 51 if isinstance(base, tuple): 52 for base in base: 53 if type(obj) is base: 54 return inner 55 56 elif type(obj) is base: 57 return inner 58 module = '' 59 if obj.__class__.__module__ not in ('__builtin__', 'exceptions'): 60 module = '<span class="module">%s.</span>' % obj.__class__.__module__ 61 return '%s%s(%s)' % (module, obj.__class__.__name__, inner) 62 63 64 class DebugReprGenerator(object): 65 66 def __init__(self): 67 self._stack = [] 68 69 def _sequence_repr_maker(left, right, base = object(), limit = 8): 70 71 def proxy(self, obj, recursive): 72 if recursive: 73 return _add_subclass_info(left + '...' + right, obj, base) 74 buf = [left] 75 have_extended_section = False 76 for idx, item in enumerate(obj): 77 if idx: 78 buf.append(', ') 79 if idx == limit: 80 buf.append('<span class="extended">') 81 have_extended_section = True 82 buf.append(self.repr(item)) 83 84 if have_extended_section: 85 buf.append('</span>') 86 buf.append(right) 87 return _add_subclass_info(u''.join(buf), obj, base) 88 89 return proxy 90 91 list_repr = _sequence_repr_maker('[', ']', list) 92 tuple_repr = _sequence_repr_maker('(', ')', tuple) 93 set_repr = _sequence_repr_maker('set([', '])', set) 94 frozenset_repr = _sequence_repr_maker('frozenset([', '])', frozenset) 95 if deque is not None: 96 deque_repr = _sequence_repr_maker('<span class="module">collections.</span>deque([', '])', deque) 97 del _sequence_repr_maker 98 99 def regex_repr(self, obj): 100 pattern = repr(obj.pattern).decode('string-escape', 'ignore') 101 if pattern[:1] == 'u': 102 pattern = 'ur' + pattern[1:] 103 else: 104 pattern = 'r' + pattern 105 return u're.compile(<span class="string regex">%s</span>)' % pattern 106 107 def string_repr(self, obj, limit = 70): 108 buf = ['<span class="string">'] 109 escaped = escape(obj) 110 a = repr(escaped[:limit]) 111 b = repr(escaped[limit:]) 112 if isinstance(obj, unicode): 113 buf.append('u') 114 a = a[1:] 115 b = b[1:] 116 if b != "''": 117 buf.extend((a[:-1], 118 '<span class="extended">', 119 b[1:], 120 '</span>')) 121 else: 122 buf.append(a) 123 buf.append('</span>') 124 return _add_subclass_info(u''.join(buf), obj, (str, unicode)) 125 126 def dict_repr(self, d, recursive, limit = 5): 127 if recursive: 128 return _add_subclass_info(u'{...}', d, dict) 129 buf = ['{'] 130 have_extended_section = False 131 for idx, (key, value) in enumerate(d.iteritems()): 132 if idx: 133 buf.append(', ') 134 if idx == limit - 1: 135 buf.append('<span class="extended">') 136 have_extended_section = True 137 buf.append('<span class="pair"><span class="key">%s</span>: <span class="value">%s</span></span>' % (self.repr(key), self.repr(value))) 138 139 if have_extended_section: 140 buf.append('</span>') 141 buf.append('}') 142 return _add_subclass_info(u''.join(buf), d, dict) 143 144 def object_repr(self, obj): 145 return u'<span class="object">%s</span>' % escape(repr(obj).decode('utf-8', 'replace')) 146 147 def dispatch_repr(self, obj, recursive): 148 if obj is helper: 149 return helper.get_help(None) 150 if isinstance(obj, (int, 151 long, 152 float, 153 complex)): 154 return u'<span class="number">%r</span>' % obj 155 if isinstance(obj, basestring): 156 return self.string_repr(obj) 157 if isinstance(obj, RegexType): 158 return self.regex_repr(obj) 159 if isinstance(obj, list): 160 return self.list_repr(obj, recursive) 161 if isinstance(obj, tuple): 162 return self.tuple_repr(obj, recursive) 163 if isinstance(obj, set): 164 return self.set_repr(obj, recursive) 165 if isinstance(obj, frozenset): 166 return self.frozenset_repr(obj, recursive) 167 if isinstance(obj, dict): 168 return self.dict_repr(obj, recursive) 169 if deque is not None and isinstance(obj, deque): 170 return self.deque_repr(obj, recursive) 171 return self.object_repr(obj) 172 173 def fallback_repr(self): 174 try: 175 info = ''.join(format_exception_only(*sys.exc_info()[:2])) 176 except: 177 info = '?' 178 179 return u'<span class="brokenrepr"><broken repr (%s)></span>' % escape(info.decode('utf-8', 'ignore').strip()) 180 181 def repr(self, obj): 182 recursive = False 183 for item in self._stack: 184 if item is obj: 185 recursive = True 186 break 187 188 self._stack.append(obj) 189 try: 190 return self.dispatch_repr(obj, recursive) 191 except: 192 return self.fallback_repr() 193 finally: 194 self._stack.pop() 195 196 def dump_object(self, obj): 197 repr = items = None 198 if isinstance(obj, dict): 199 title = 'Contents of' 200 items = [] 201 for key, value in obj.iteritems(): 202 if not isinstance(key, basestring): 203 items = None 204 break 205 items.append((key, self.repr(value))) 206 207 if items is None: 208 items = [] 209 repr = self.repr(obj) 210 for key in dir(obj): 211 try: 212 items.append((key, self.repr(getattr(obj, key)))) 213 except: 214 pass 215 216 title = 'Details for' 217 title += ' ' + object.__repr__(obj)[1:-1] 218 return render_template('dump_object.html', items=items, title=title, repr=repr) 219 220 def dump_locals(self, d): 221 items = [ (key, self.repr(value)) for key, value in d.items() ] 222 return render_template('dump_object.html', items=items, title='Local variables in frame', repr=None)