3
e%              	   @   s
  d Z ddlZddlZddlZddlZddlmZ ddlm	Z	 ddl
mZ e ZejdZeeZdZdZeed	d
dZefedd	ddZG dd dZe Zeeejejejejdf f edddZdeeejeejdeje gef dddZ!G dd dZ"dS )zObject representations for debugging purposes. Unlike the default
repr, these expose more information and produce HTML instead of ASCII.

Together with the CSS and JavaScript of the debugger this gives a
colorful and more compact output.
    N)deque)escape)format_exception_onlyz(?:\r\n|\r|\n){2,}zL<div class=box>
  <h3>%(title)s</h3>
  <pre class=help>%(text)s</pre>
</div>zQ<div class=box>
  <h3>%(title)s</h3>
  %(repr)s
  <table>%(items)s</table>
</div>)objreturnc             C   s   t  j| S )z1Creates a debug repr of an object as HTML string.)DebugReprGeneratorrepr)r    r	   7/tmp/pip-build-3irwxpxt/Werkzeug/werkzeug/debug/repr.py
debug_repr"   s    r   c             C   s<   t  }| tkr"|jtjdj}n
|j| }tjj| dS )zdPrint the object details to stdout._write (for the interactive
    console of the web debugger.
       N)	r   missingdump_localssys	_getframef_localsdump_objectstdout_write)r   genrvr	   r	   r
   dump'   s
    
r   c               @   s8   e Zd ZdZedddZd	ejej ddddZ	dS )
_HelperzDisplays an HTML version of the normal help, for the interactive
    debugger only because it requires a patched sys.stdout.
    )r   c             C   s   dS )Nz(Type help(object) for help about object.r	   )selfr	   r	   r
   __repr__8   s    z_Helper.__repr__N)topicr   c             C   s   |d kr t jjd| d d S dd l}|j| t jj }t|trR|jdd}t	j
|}t|dkr|d }dj|dd  }nd}|d }t jjt||d	  d S )
Nz<span class=help>z</span>r   zutf-8ignorer   z

ZHelp)titletext)r   r   r   pydochelpreset
isinstancebytesdecode_paragraph_resplitlenjoin	HELP_HTML)r   r   r   r   Z
paragraphsr   r   r	   r	   r
   __call__;   s    



z_Helper.__call__)N)
__name__
__module____qualname____doc__strr   tOptionalAnyr*   r	   r	   r	   r
   r   3   s   r   .)innerr   baser   c             C   st   t |tr*x.|D ]}t||kr| S qW nt||kr:| S d}|jjdkrZd|jj d}| t|j d|  dS )	N __builtin__
exceptionsz<span class="module">z.</span>())r6   r7   )r"   tupletype	__class__r,   r+   )r3   r   r4   moduler	   r	   r
   _add_subclass_infoR   s    


r>      r   )leftrightr4   limitr   c                s$   dt jttd fdd}|S )Nr   )r   r   	recursiver   c                s   |rt  d | S g}d}xHt|D ]<\}}|rD|jd |krZ|jd d}|j| j| q.W |r||jd |j t dj|| S )Nz...Fz, z<span class="extended">Tz</span>r5   )r>   	enumerateappendr   r(   )r   r   rC   bufhave_extended_sectionidxitem)r4   r@   rB   rA   r	   r
   proxyd   s    



z#_sequence_repr_maker.<locals>.proxy)r0   Iterableboolr/   )r@   rA   r4   rB   rJ   r	   )r4   r@   rB   rA   r
   _sequence_repr_makera   s     rM   c               @   s  e Zd ZddddZeddeZeddeZed	d
e	Z
edd
eZedd
eZejedddZd)ejeef eedddZd*ejejedf ejeef ejejeef ef f eeedddZejejeje ejeje f  edddZejeedddZ edddZ!e"eddd Z#e"edd!d"Z$ejeejf ed#d$d%Z%d+ej&ej'eef  eeje ed&d'd(Z(dS ),r   N)r   c             C   s
   g | _ d S )N)_stack)r   r	   r	   r
   __init__y   s    zDebugReprGenerator.__init__[]r8   r9   zset([z])zfrozenset([z/<span class="module">collections.</span>deque([)r   r   c             C   s.   t |j}tj|dd}d| }d| dS )Nzunicode-escaper   rz&re.compile(<span class="string regex">z</span>))r   patterncodecsr$   )r   r   rS   r	   r	   r
   
regex_repr   s    

zDebugReprGenerator.regex_reprF   )r   rB   r   c             C   s   dg}t |}t|| dkrJ|jt|d | dt||d  df n|jt| |jd dj|}|d dks|d dkr|d	 dkrt||ttfS |S )
Nz<span class="string">   z<span class="extended">z</span>r5   r   z'"br   )	r   r'   extendr   rE   r(   r>   r#   r/   )r   r   rB   rF   rR   outr	   r	   r
   string_repr   s    


$zDebugReprGenerator.string_repr   )drC   rB   r   c       	      C   s   |rt d|tS dg}d}xht|j D ]X\}\}}|rB|jd ||d kr\|jd d}|jd| j| d	| j| d
 q(W |r|jd |jd t dj||tS )Nz{...}{Fz, r   z<span class="extended">Tz%<span class="pair"><span class="key">z</span>: <span class="value">z</span></span>z</span>}r5   )r>   dictrD   itemsrE   r   r(   )	r   r]   rC   rB   rF   rG   rH   keyvaluer	   r	   r
   	dict_repr   s     

$

zDebugReprGenerator.dict_reprc             C   s   t |}dt| dS )Nz<span class="object">z</span>)r   r   )r   r   rR   r	   r	   r
   object_repr   s    zDebugReprGenerator.object_repr)r   rC   r   c             C   s   |t krdt dS t|tttfr0d|dS t|tsDt|trN| j|S t|trb| j	|S t|t
rx| j||S t|tr| j||S t|tr| j||S t|tr| j||S t|tr| j||S t|tr| j||S | j|S )Nz<span class="help">z</span>z<span class="number">)helperr"   intfloatcomplexr/   r#   r[   	RegexTyperU   list	list_reprr:   
tuple_reprsetset_repr	frozensetfrozenset_reprr`   rd   r   
deque_reprre   )r   r   rC   r	   r	   r
   dispatch_repr   s*    








z DebugReprGenerator.dispatch_reprc             C   sL   ydj ttj d d  }W n tk
r6   d}Y nX dt|j  dS )Nr5   rW   ?z*<span class="brokenrepr">&lt;broken repr (z)&gt;</span>)r(   r   r   exc_info	Exceptionr   strip)r   infor	   r	   r
   fallback_repr   s
    
z DebugReprGenerator.fallback_reprc             C   sj   d}x| j D ]}||krd}P qW | j j| z*y| j||S  tk
rT   | j S X W d | j j  X d S )NFT)rN   rE   rs   rv   ry   pop)r   r   rC   rI   r	   r	   r
   r      s    zDebugReprGenerator.reprc             C   s   d }d }t |trTd}g }x8|j D ],\}}t |ts<d }P |j|| j|f q$W |d krg }| j|}xDt|D ]8}y|j|| jt||f W qt tk
r   Y qtX qtW d}|dt	j
|dd  7 }| j|||S )NzContents ofzDetails for r   )r"   r`   ra   r/   rE   r   dirgetattrrv   objectr   render_object_dump)r   r   r   ra   r   rb   rc   r	   r	   r
   r      s*    



zDebugReprGenerator.dump_object)r]   r   c                s"    fdd|j  D } j|dS )Nc                s   g | ]\}}| j |fqS r	   )r   ).0rb   rc   )r   r	   r
   
<listcomp>  s    z2DebugReprGenerator.dump_locals.<locals>.<listcomp>zLocal variables in frame)ra   r   )r   r]   ra   r	   )r   r
   r     s    zDebugReprGenerator.dump_locals)ra   r   r   r   c             C   sj   g }x,|D ]$\}}|j dt| d| d q
W |s@|j d tt|d|rR|nd ddj|d S )	Nz<tr><th>z<td><pre class=repr>z</pre>z<tr><td><em>Nothing</em>z<pre class=repr>r5   
)r   r   ra   )rE   r   OBJECT_DUMP_HTMLr(   )r   ra   r   r   Z
html_itemsrb   rc   r	   r	   r
   r     s     
z%DebugReprGenerator.render_object_dump)rV   )r\   )N))r+   r,   r-   rO   rM   rk   rl   r:   rm   rn   ro   rp   rq   r   rr   r0   Patternr/   rU   Unionr#   rg   r[   DictrL   rd   r1   Typer`   Callablere   r2   rs   ry   r   r   r   r   ListTupler   r	   r	   r	   r
   r   x   s(   
<"
)r?   )#r.   rT   rer   typingr0   collectionsr   htmlr   	tracebackr   r   r   compiler%   r;   rj   r)   r   r/   r   r   r   rf   r   r   r   r>   rg   r   rK   rL   rM   r   r	   r	   r	   r
   <module>   s*   
 