a
    DfN&                     @  s   d Z ddlmZ ddlZddlmZmZmZmZ ddl	Z	ddl
mZ ddlmZ ddlmZmZmZ dd	lmZ d
dlmZ G dd dejZG dd dejZG dd deZG dd deZdS )zm
The Debugger Widget is an uneditable Card that gives you feedback on errors
thrown by your Panel callbacks.
    )annotationsN)ClassVarDictListMapping   )CDN_DIST)state)CardHSpacerRow)ReactiveHTML   )Terminalc                      s.   e Zd Zdd fdd
Z fddZ  ZS )TermFormatterT)	only_lastc                  s   t  j|i | || _dS )aE  
        Standard logging.Formatter with the default option of prompting
        only the last stack. Does not cache exc_text.

        Parameters
        ----------
        only_last : BOOLEAN, optional
            Whether the full stack trace or only the last file should be shown.
            The default is True.
        N)super__init__r   )selfr   argskwargs	__class__ c/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/panel/widgets/debugger.pyr      s    zTermFormatter.__init__c                   s   |  |_|  r"| || j|_| |}d }|jrht 	|j}|
d}|dkrh| jrh||d  }|r|dd  dkr|d }|| }|jr|dd  dkr|d }|| |j }|S )NFiler   
)
getMessagemessageusesTime
formatTimedatefmtasctimeformatMessageexc_infor   formatExceptionrfindr   
stack_infoformatStack)r   recordsexc_textlastr   r   r   format&   s&    


zTermFormatter.format)__name__
__module____qualname__r   r.   __classcell__r   r   r   r   r      s   r   c                   @  s$   e Zd Zdd Zdd Zdd ZdS )CheckFilterc                 C  s
   || _ dS )z
        Add a debugger to this logging filter.

        Parameters
        ----------
        widg : panel.widgets.Debugger
            The widget displaying the logs.

        Returns
        -------
        None.
        N)debugger)r   r4   r   r   r   add_debugger>   s    zCheckFilter.add_debuggerc                 C  st   t | dsd S |jdkr*| j jd7  _nFd|j  kr@dkrVn n| j jd7  _n|jdk rp| j jd7  _d S )Nr4   (   r      )hasattrlevelnor4   _number_of_errors_number_of_warnings_number_of_infos)r   r*   r   r   r   _update_debuggerM   s    


zCheckFilter._update_debuggerc                 C  sb   t | dsdS tjrTtjjrTtjjj}tdd t| jj	 t
 D }||vrTdS | | dS )z
        Will filter out messages coming from a different bokeh document than
        the document where the debugger is embedded in server mode.
        Returns True if no debugger was added.
        r4   Tc                 s  s    | ]}|j jr|j jjV  qd S N)documentsession_contextid).0mr   r   r   	<genexpr>c   s   z%CheckFilter.filter.<locals>.<genexpr>F)r8   r	   Zcurdocr@   rA   setsumr4   Z_modelsvaluestupler=   )r   r*   Z
session_idZwidget_session_idsr   r   r   filterW   s    


zCheckFilter.filterN)r/   r0   r1   r5   r=   rI   r   r   r   r   r3   <   s   
r3   c                   @  sf   e Zd ZU e Ze ZejddZdZ	de
d< dZde
d< edd	Zd
e
d< ddgiZde
d< dS )DebuggerButtonsr   )defaultu  
    <div style="display: flex;">
      <button class="special_btn clear_btn" id="clear_btn" onclick="${script('click_clear')}" style="width: ${model.width}px;">
        <span class="shown">☐</span>
        <span class="tooltiptext">Acknowledge logs and clear</span>
      </button>
      <button class="special_btn" id="save_btn" onclick="${script('click')}" style="width: ${model.width}px;">💾
        <span class="tooltiptext">Save logs</span>
      </button>
    </div>
    zClassVar[str]	_templatea  
        var filename = data.debug_name+'.txt'
        console.log('saving debugger terminal output to '+filename)
        var blob = new Blob([data.terminal_output],
            { type: "text/plain;charset=utf-8" });
        if (navigator.msSaveBlob) {
            navigator.msSaveBlob(blob, filename);
        } else {
            var link = document.createElement('a');
            var url = URL.createObjectURL(blob);
            link.href = url;
            link.download = filename;
            document.body.appendChild(link);
            link.click();
            setTimeout(function() {
                document.body.removeChild(link);
                window.URL.revokeObjectURL(url);
            }, 0);
        }
        js_cbzdata.clears += 1)clickZclick_clearz$ClassVar[Dict[str, str | List[str]]]_scriptsZ	clear_btnrN   zClassVar[Dict[str, List[str]]]_dom_eventsN)r/   r0   r1   paramStringZterminal_output
debug_nameIntegerclearsrL   __annotations__rM   rO   rP   r   r   r   r   rJ   m   s   
rJ   c                
      s   e Zd ZU dZejddddZejddddZejddddZej	dd	d
Z
ejejdd
ZejddidddZejdgeddddZeejddddddddZded< e dgZded<  fddZdd Zdd  Zejd!dd"d#d$ Z  ZS )%Debuggera  
    A uneditable Card layout holding a terminal printing out logs from your
    callbacks. By default, it will only print exceptions. If you want to add
    your own log, use the `panel.callbacks` logger within your callbacks:
    `logger = logging.getLogger('panel.callbacks')`
    )r   Nr   z9
        Number of logged errors since last acknowledged.)bounds
precedencedocz;
        Number of logged warnings since last acknowledged.z>
        Number of logged information since last acknowledged.Tz<
        Whether only the last stack is printed or the full.)rK   rZ   z9
        Logging level to print in the debugger terminal.fmtz3%(asctime)s [%(name)s - %(levelname)s]: %(message)szg
        Arguments to pass to the logging formatter. See the standard
        python logging libraries.)rK   rY   rZ   Zpanel)r   NzA
        Loggers which will be prompted in the debugger terminal.)rK   Z	item_typerX   rY   rZ   N)r:   r;   r<   r   levelformatter_argslogger_namesz"ClassVar[Mapping[str, str | None]]_renamezcss/debugger.csszClassVar[List[str]]_stylesheetsc              	     s  t  jf i | dg| _dg| _dg| _dg| _| jr<dnd}| jpJ| j}td|| j	d|rd|d	 nd d
}t
|}d|_tf i | jd| ji}|| || j t }||  || | jD ]}t
|}	|	| q|| _|| _| j| jd | j| jd | j| jd t| jd| _ d}
d}| jj!| j d|
id | jj!| j d|id | j j!| jdd | jj| j"dg | j!| j dd d| _#| $t%d| j	 t& | j ddd | $| d| jd _'d| _(d S )Nzdebugger-card-buttonzdebugger-cardzdebugger-card-headerzdebugger-card-titleZstretch_widthZstretch_both   r   F   )
min_heightsizing_modenamemarginheightz  
r   r:   r;   r<   )Zstylesheetsz>
        target.data.terminal_output += source.output
        z2
        target.data.terminal_output = ''
        _output)codeZ_clears)rU   rS   )re    z### )endstart)rd   ZalignTZobjects))r   r   Zbutton_css_classesZcss_classesZheader_css_classesZtitle_css_classesrg   rc   r   re   loggingStreamHandler
terminatorr   r]   r   setFormattersetLevelr\   r3   r5   	addFilterr^   	getLogger
addHandlerterminalstream_handlerrQ   watchupdate_log_countsrJ   r`   ZbtnsZjslinkacknowledge_errorstitleappendr   r   Zconstant	collapsed)r   paramsZsmoderg   ru   rv   	formatterZcurr_filterZlogger_nameloggerincZclrr   r   r   r      sb    






zDebugger.__init__c                 C  s\   g }| j r|d| j   | jr4|d| j  | jrL|d| j  d|| _d S )Nz1<span style="color:rgb(190,0,0);">errors: </span>z/<span style="color:rgb(190,160,20);">w: </span>zi: z, )r:   r{   r;   r<   joinrz   )r   eventrz   r   r   r   rx     s    zDebugger.update_log_countsc                 C  s   d| _ d| _d| _d S )Nr   )r:   r;   r<   )r   r   r   r   r   ry   #  s    zDebugger.acknowledge_errorsr\   )rw   c                 C  s   | j | j d S r>   )rv   rq   r\   )r   r   r   r   _update_level(  s    zDebugger._update_level)r/   r0   r1   __doc__rQ   rT   r:   r;   r<   Booleanr   rm   ERRORr\   r   r]   r   strr^   dictr
   r_   rV   r   r`   r   rx   ry   dependsr   r2   r   r   r   r   rW      s:   

LrW   )r   
__future__r   rm   typingr   r   r   r   rQ   Zio.resourcesr   Zio.stater	   Zlayoutr
   r   r   Zreactiver   ru   r   	Formatterr   Filterr3   rJ   rW   r   r   r   r   <module>   s   &11