B
    bAZ                 @   s   d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
mZmZ e ZG dd deZG d	d
 d
eZejZeje_G dd deZdd ZG dd dejZG dd deZdS )z
    werkzeug.debug.console
    ~~~~~~~~~~~~~~~~~~~~~~

    Interactive console support.

    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.
    :license: BSD.
    N)CodeType)escape)Local)
debug_reprdumphelperc               @   sb   e Zd ZdZdd Zdd Zdd Zdd	 ZdddZdd Z	dd Z
dd Zdd Zdd ZdS )HTMLStringOz-A StringO version that HTML escapes on write.c             C   s
   g | _ d S )N)_buffer)self r   5lib/python3.7/site-packages/werkzeug/debug/console.py__init__   s    zHTMLStringO.__init__c             C   s   dS )NFr   )r
   r   r   r   isatty   s    zHTMLStringO.isattyc             C   s   d S )Nr   )r
   r   r   r   close!   s    zHTMLStringO.closec             C   s   d S )Nr   )r
   r   r   r   flush$   s    zHTMLStringO.flushr   c             C   s   d S )Nr   )r
   nmoder   r   r   seek'   s    zHTMLStringO.seekc             C   s(   t | jdkrdS | jd }| jd= |S )Nr    )lenr	   )r
   Zretr   r   r   readline*   s
    
zHTMLStringO.readlinec             C   s   d | j}| jd d = |S )Nr   )joinr	   )r
   valr   r   r   reset1   s    zHTMLStringO.resetc             C   s&   t |tr|dd}| j| d S )Nzutf-8replace)
isinstancebytesdecoder	   append)r
   xr   r   r   _write6   s    
zHTMLStringO._writec             C   s   |  t| d S )N)r    r   )r
   r   r   r   r   write;   s    zHTMLStringO.writec             C   s   |  td| d S )Nr   )r    r   r   )r
   r   r   r   r   
writelines>   s    zHTMLStringO.writelinesN)r   )__name__
__module____qualname____doc__r   r   r   r   r   r   r   r    r!   r"   r   r   r   r   r      s   
r   c               @   s`   e Zd ZdZdd ZeeZdd ZeeZdd ZeeZdd	 Zd
d Z	dd Z
dd ZdS )ThreadedStreamz@Thread-local wrapper for sys.stdout for the interactive console.c               C   s    t tjtst t_t t_d S )N)r   sysstdoutr'   r   _localstreamr   r   r   r   pushF   s    zThreadedStream.pushc              C   s(   y
t j} W n tk
r   dS X |  S )Nr   )r*   r+   AttributeErrorr   )r+   r   r   r   fetchL   s
    
zThreadedStream.fetchc             C   sJ   y
t j}W n tk
r"   t| S X | d k	rF| t jjd< |t|  d S )N_)r*   r+   r-   _displayhook_current_ipylocalsr    r   )objr+   r   r   r   displayhookT   s    

zThreadedStream.displayhookc             C   s   t d| d S )Nzread only attribute %s)r-   )r
   namevaluer   r   r   __setattr__`   s    zThreadedStream.__setattr__c             C   s
   t tjS )N)dirr(   
__stdout__)r
   r   r   r   __dir__c   s    zThreadedStream.__dir__c             C   sB   |dkrt tjS y
tj}W n tk
r6   tj}Y nX t||S )N__members__)r8   r(   r9   r*   r+   r-   getattr)r
   r5   r+   r   r   r   __getattribute__f   s    

zThreadedStream.__getattribute__c             C   s
   t tjS )N)reprr(   r9   )r
   r   r   r   __repr__o   s    zThreadedStream.__repr__N)r#   r$   r%   r&   r,   staticmethodr.   r4   r7   r:   r=   r?   r   r   r   r   r'   B   s   
	r'   c               @   s$   e Zd Zdd Zdd Zdd ZdS )_ConsoleLoaderc             C   s
   i | _ d S )N)_storage)r
   r   r   r   r   z   s    z_ConsoleLoader.__init__c             C   s:   || j t|< x&|jD ]}t|tr|| j t|< qW d S )N)rB   id	co_constsr   r   )r
   codesourcevarr   r   r   register}   s    
z_ConsoleLoader.registerc             C   s(   y| j t| S  tk
r"   Y nX d S )N)rB   rC   KeyError)r
   rE   r   r   r   get_source_by_code   s    z!_ConsoleLoader.get_source_by_codeN)r#   r$   r%   r   rH   rJ   r   r   r   r   rA   x   s   rA   c                s   j   fdd}|_ d S )Nc                s    | ||}j ||  |S )N)loaderrH   )rF   filenameZsymbolrE   )compileconsoler   r   func   s    z_wrap_compiler.<locals>.func)rM   )rN   rO   r   )rM   rN   r   _wrap_compiler   s    rP   c               @   s>   e Zd Zdd Zdd Zdd Zdd Zdd
dZdd Zd	S )_InteractiveConsolec             C   sV   t j| | t|| _t| jd< t| jd< t  | jd< | _d| _	g | _
t|  d S )Nr   help
__loader__F)rE   InteractiveInterpreterr   dictglobalsr   r   rA   rK   morebufferrP   )r
   rV   r2   r   r   r   r      s    


z_InteractiveConsole.__init__c             C   s   |  d }t  | jrdp d}zNd| j|g }tj| |ddr\d| _| j	| nd| _| jd d = W d t
 }X |t| | S )	N
z... z>>> r   z
<debugger>ZsingleTF)rstripr'   r,   rW   r   rX   rE   rT   	runsourcer   r.   r   )r
   rF   promptZsource_to_evaloutputr   r   r   r[      s    

z_InteractiveConsole.runsourcec             C   s6   yt || j| j W n tk
r0   |   Y nX d S )N)evalrV   r2   	Exceptionshowtraceback)r
   rE   r   r   r   runcode   s    z_InteractiveConsole.runcodec             C   s*   ddl m} |dd}tj|  d S )Nr   )get_current_traceback   )skip)werkzeug.debug.tbtoolsrb   r(   r)   r    render_summary)r
   rb   tbr   r   r   r`      s    
z!_InteractiveConsole.showtracebackNc             C   s*   ddl m} |dd}tj|  d S )Nr   )rb      )rd   )re   rb   r(   r)   r    rf   )r
   rL   rb   rg   r   r   r   showsyntaxerror   s    
z#_InteractiveConsole.showsyntaxerrorc             C   s   t j| d S )N)r(   r)   r!   )r
   datar   r   r   r!      s    z_InteractiveConsole.write)N)	r#   r$   r%   r   r[   ra   r`   ri   r!   r   r   r   r   rQ      s   

rQ   c               @   s"   e Zd ZdZdddZdd ZdS )ConsolezAn interactive console.Nc             C   s(   |d kri }|d kri }t ||| _d S )N)rQ   _ipy)r
   rV   r2   r   r   r   r      s
    zConsole.__init__c             C   s(   | j t_tj}z| j |S |t_X d S )N)rl   r*   r1   r(   r)   r[   )r
   rE   Zold_sys_stdoutr   r   r   r^      s
    zConsole.eval)NN)r#   r$   r%   r&   r   r^   r   r   r   r   rk      s   
rk   )r&   r(   rE   typesr   Zwerkzeug.utilsr   Zwerkzeug.localr   Zwerkzeug.debug.reprr   r   r   r*   objectr   r'   r4   r0   rA   rP   rT   rQ   rk   r   r   r   r   <module>
   s   +2
1