
    	ei&                       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ej                  Z G d dej                  Z G d de          Z G 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                  .     e Zd Zdd fd
Z fdZ xZS )TermFormatterT)	only_lastc               H     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__s       6lib/python3.11/site-packages/panel/widgets/debugger.pyr   zTermFormatter.__init__   s,     	$)&)))"    c                $   |                                 |_        |                                 r |                     || j                  |_        |                     |          }d }|j        rRt                      	                    |j                  }|
                    d          }|dk    r| j        r
||d          }|r|dd          dk    r|dz   }||z   }|j        r0|dd          dk    r|dz   }||                     |j                  z   }|S )NFiler   
)
getMessagemessageusesTime
formatTimedatefmtasctimeformatMessageexc_infor   formatExceptionrfindr   
stack_infoformatStack)r   recordsexc_textlastr   s        r   formatzTermFormatter.format&   s   **,,==?? 	C!__VT\BBFNv&&? 	+ww..v??H>>&))DQww4>w#DEE? 	v~~HHA 	8v~~HD$$V%6777Ar   )__name__
__module____qualname__r   r1   __classcell__r   s   @r   r   r      s^        (, # # # # # # #        r   r   c                       e Zd Zd Zd Zd ZdS )CheckFilterc                    || _         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   r:   s     r   add_debuggerzCheckFilter.add_debugger>   s     !r   c                
   t          | d          sd S |j        dk    r| j        xj        dz  c_        d S d|j        cxk    rdk    rn n| j        xj        dz  c_        d S |j        dk     r| j        xj        dz  c_        d S d S )Nr:   (   r      )hasattrlevelnor:   _number_of_errors_number_of_warnings_number_of_infos)r   r-   s     r   _update_debuggerzCheckFilter._update_debuggerM   s    tZ(( 	F>RM++q0++++&.&&&&B&&&&&M--2----^b  M**a/**** ! r   c                d   t          | d          sdS t          j        r|t          j        j        rkt          j        j        j        }t          d t          | j        j        	                                t                                D                       }||vrd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.
        r:   Tc              3  P   K   | ]!}|j         j        |j         j        j        V  "d S N)documentsession_contextid).0ms     r   	<genexpr>z%CheckFilter.filter.<locals>.<genexpr>c   sQ       %Z %Z)*>?j>X%ZQZ%?%B %Z %Z %Z %Z %Z %Zr   F)r?   r
   curdocrI   rJ   setsumr:   _modelsvaluestuplerD   )r   r-   
session_idwidget_session_idss       r   filterzCheckFilter.filterW   s     tZ(( 	4 < 	EL8 	58J!$ %Z %Z.1$-2G2N2N2P2P27''/; /;%Z %Z %Z "Z "Z !333uf%%%tr   N)r2   r3   r4   r;   rD   rV    r   r   r8   r8   <   sA        ! ! !0 0 0    r   r8   c                      e Zd ZU  ej                    Z ej                    Z ej        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)clickclick_clearz$ClassVar[Dict[str, str | List[str]]]_scripts	clear_btnr]   zClassVar[Dict[str, List[str]]]_dom_eventsN)r2   r3   r4   paramStringterminal_output
debug_nameIntegerclearsr[   __annotations__r\   r_   ra   rW   r   r   rY   rY   m   s         "elnnOJU]1%%%F
 I 
 
 
 
E    , )6 6H    
 4?	2JKJJJJJJr   rY   c                      e Zd ZU dZ ej        ddd          Z ej        ddd          Z ej        ddd          Z ej	        dd	
          Z
 ej        ej        d
          Z ej        ddidd          Z ej        dgeddd          Z eej        fi ddddddddZded<   e dgZded<    fdZd Zd Z ej        dd          d              Z x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.)rZ   rm   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.)rZ   rl   rm   panel)r   NzA
        Loggers which will be prompted in the debugger terminal.)rZ   	item_typerk   rl   rm   N)rA   rB   rC   r   levelformatter_argslogger_namesz"ClassVar[Mapping[str, str | None]]_renamezcss/debugger.csszClassVar[List[str]]_stylesheetsc           	         t                      j        di | dg| _        dg| _        dg| _        dg| _        | j        rdnd}| j        p| j        }t          d|| j	        d|r|d	z
  nd 
          }t          j        |          }d|_        t          di | j        d| j        i}|                    |           |                    | j                   t'                      }|                    |            |                    |           | j        D ]+}t          j        |          }	|	                    |           ,|| _        || _        | j                            | j        d           | j                            | j        d           | j                            | j        d           t=          | j                  | _         d}
d}| j        !                    | j         d|
i           | j        !                    | j         d|i           | j         !                    | j        d           | j        j                            | j"        dg           | !                    | j         d           d| _#        | $                    tK          d| j	         tM                      | j         dd                     | $                    |           d| j        d         _'        d| _(        d S ) Nzdebugger-card-buttonzdebugger-cardzdebugger-card-headerzdebugger-card-titlestretch_widthstretch_both   r   F   )
min_heightsizing_modenamemarginheightz  
r   rA   rB   rC   )stylesheetsz>
        target.data.terminal_output += source.output
        z2
        target.data.terminal_output = ''
        _output)code_clears)rg   re   )r}    z### )endstart)r|   alignTobjectsrW   ))r   r   button_css_classescss_classesheader_css_classestitle_css_classesr   r{   r   r}   loggingStreamHandler
terminatorr   rr   r   setFormattersetLevelrq   r8   r;   	addFilterrs   	getLogger
addHandlerterminalstream_handlerrb   watchupdate_log_countsrY   ru   btnsjslinkacknowledge_errorstitleappendr   r   constant	collapsed)r   paramssmoder   r   r   	formattercurr_filterlogger_nameloggerincclrr   s               r   r   zDebugger.__init__   s"   ""6"""#9":+,#9":"7!8#';BN/DIF<fRii
 
 

 !.x88$*!! 
 
!
 
n
 
 
	
 	##I...
+++!mm  &&&  ---, 	. 	.K&{33Fn---- , 	
/0CDDD
/0EFFF
/0BCCC $0ABBB	 	TYi-=>>>TYi-=>>>	y999!!$"9I;GGGDIL111 
 	"ty""GIIty+?  	
 	
 	
 	H *.
9& r   c                   g }| j         r|                    d| j                     | j        r|                    d| j                    | j        r|                    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, )rA   r   rB   rC   joinr   )r   eventr   s      r   r   zDebugger.update_log_counts  s    ! 	gLLeTMceefff# 	gLLe4Kceefff  	8LL6t466777YYu%%


r   c                0    d| _         d| _        d| _        d S )Nr   )rA   rB   rC   )r   r   s     r   r   zDebugger.acknowledge_errors#  s     !"#$  !r   rq   )r   c                D    | j                             | j                   d S rG   )r   r   rq   )r   s    r   _update_levelzDebugger._update_level(  s!    $$TZ00000r   )r2   r3   r4   __doc__rb   rf   rA   rB   rC   Booleanr   r   ERRORrq   r   rr   r   strrs   dictr   rt   rh   r	   ru   r   r   r   dependsr   r5   r6   s   @r   rj   rj      s          &Y2 L< = = = (%-yR N> ? ? ? %u}I" KA B B B d 1? @ @ @I EM'- 6< = = =E  UZMN %& & &N 5:wi3R .DE E EL 37$	3 	3!#  	3 	3G 	 	 	 	 -5)F)F)F(GLGGGGJ J J J JX	& 	& 	&" " "
 U]7$'''1 1 ('1 1 1 1 1r   rj   )r   
__future__r   r   typingr   r   r   r   rb   io.resourcesr	   io.stater
   layoutr   r   r   reactiver   r   r   	Formatterr   Filterr8   rY   rj   rW   r   r   <module>r      s    # " " " " "              # # # # # #       ' ' ' ' ' ' ' ' ' ' # # # # # #      # # # # #G% # # #L. . . . .'. . . .b.K .K .K .K .Kl .K .K .KbL1 L1 L1 L1 L1t L1 L1 L1 L1 L1r   