
    et                        d dl Z d dlZd dlZd dlZd dlZd dl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 d dlmZ d dlmZmZmZmZ d dlmZ d dlmZ d d	lmZ d d
lm 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* d dl+m,Z,m-Z-m.Z.m/Z/ e	j0        1                    d          d             Z2e	j0        1                    d          d             Z3e	j0        1                    d          d             Z4d Z5d Z6d Z7d Z8d Z9d Z:d Z;d Z<d Z=d Z>d Z?d  Z@d! ZAd" ZBd# ZCd$ ZDd% ZEd& ZFd' ZGd( ZHd) ZIe	j0        1                    d          d*             ZJe	j0        1                    d          d+             ZKe	j0        1                    d          d,             ZLe	j0        1                    d          d-             ZMe	j0        1                    d          d.             ZNd/ ZOd0 ZPd1 ZQd2 ZRd3 ZSd4 ZTd5 ZUd6 ZVd7 ZWd8 ZXd9 ZYd: ZZd; Z[ G d< d=e&          Z\d> Z]d? Z^d@ Z_dA Z` G dB dCe$          ZadD ZbdE ZcdF ZddG ZedH ZfdI ZgdTdJZhdTdKZie	j0        j                    dLdMehfdNehfdMeifdNeifg          dO             Zke	j0        j                    dLdMehfdNehfdMeifdNeifg          dP             Zle	j0        j                    dLdMehfdNehfdMeifdNeifg          dQ             ZmdR ZndS ZodS )U    N)ButtonClick)config)state)DIST_DIR)
INDEX_HTML
get_serverserve
set_curdoc)Row)HTML)TableEditEvent)Markdown)ParamFunction)ReactiveHTML)BootstrapTemplate)serve_and_requestserve_and_wait
wait_until)Button	TabulatorTerminal	TextInputservernamec                     | \  }}}}|j         |k    sJ |j        j        d         }t          |t                    sJ |j        dk    sJ d S )Nr   z&lt;h1&gt;Title&lt;/h1&gt;)portdocumentroots
isinstanceBkHTMLtexthtml_server_sessionhtmlr   sessionr   roots         7lib/python3.11/site-packages/panel/tests/test_server.pytest_get_serverr)   "   sc    "5D&'4;$!!$DdF#####94444444    c                     | \  }}}}d|_         |                                 |j        j        d         }t	          |t
                    sJ |j        dk    sJ d S )N<h1>New Title</h1>r   z&lt;h1&gt;New Title&lt;/h1&gt;)objectpullr   r   r    r!   r"   r#   s         r(   test_server_updater/   +   sd    "5D&'4&DKLLNNN!!$DdF#####98888888r*   c                     | \  }}}fd}|j                             |d           |                    j        d d ddd           d S )Nc                 2    t           j        j        u sJ d S N)r   curdocr   )eventr&   s    r(   handle_eventz1test_server_change_io_state.<locals>.handle_event9   s    |w///////r*   r-   r"   z<h1>Title</h1>r,   )paramwatch_server_changer   )r$   r%   r   r   r5   r&   s        @r(   test_server_change_io_stater9   5   sm    "5D&'40 0 0 0 0 	J\8,,,($f>NPdeeeeer*   c                     t          d          } dt          j                            t                    i}t          | |d          }t          t          d          5 }|                                |j        	                    d          
                    dd          k    sJ 	 d d d            d S # 1 swxY w Y   d S )	N# Titletestsz/tests/test_server.py)static_dirssuffixutf-8encoding

)r   ospathdirname__file__r   openreadcontentdecodereplace)r%   staticrfs       r(   test_server_static_dirsrP   @   s    IDrwx001F$F;RSSSA	h	)	)	) KQvvxx19++G44<<VTJJJJJJJK K K K K K K K K K K K K K K K K Ks   AB33B7:B7c                      t          d          } t          d| idt          d          }d|j                            d          v sJ d S )Nr;   appTF)	use_indexindexredirect_rootzhref="./app"r?   )r   r   r   rJ   rK   )r%   rN   s     r(   test_server_root_handlerrV   K   sY    ID	Zu	 	 	A QY--g66666666r*   c                  F   t                      } t          d| id          }t          t          dz  dz  dz  d          5 }|                                |j                            d                              d	d
          k    sJ 	 d d d            d S # 1 swxY w Y   d S )Ntemplatez@/static/extensions/panel/bundled/bootstraptemplate/bootstrap.cssr>   bundledbootstraptemplatebootstrap.cssr?   r@   rB   rC   r   r   rH   r   rI   rJ   rK   rL   rX   rN   rO   s      r(   %test_server_template_static_resourcesr_   U   s     ""H:x09{|||A	h"%88?JU\	]	]	] Kabvvxx19++G44<<VTJJJJJJJK K K K K K K K K K K K K K K K K Ks   ABBBc                  H   t                      } t          d| idd          }t          t          dz  dz  dz  d	          5 }|                                |j                            d                              d
d          k    sJ 	 d d d            d S # 1 swxY w Y   d S )NrX   /prefixzG/prefix/static/extensions/panel/bundled/bootstraptemplate/bootstrap.cssprefixr>   rZ   r[   r\   r?   r@   rB   rC   r]   r^   s      r(   1test_server_template_static_resources_with_prefixrd   ^   s	    ""H:x0  LU  	V  	V  	VA	h"%88?JU\	]	]	] Kabvvxx19++G44<<VTJJJJJJJK K K K K K K K K K K K K K K K K Ks   ABBBc                      t                      } t          d| idd          }d|j                            d          v sJ d S )NrX   ra   /prefix/templaterb   zFhref="static/extensions/panel/bundled/bootstraptemplate/bootstrap.css"r?   r   r   rJ   rK   rX   rN   s     r(   >test_server_template_static_resources_with_prefix_relative_urlri   g   sQ     ""H:x0K]^^^ASWXW`WgWghoWpWpppppppr*   c                      t                      } t          d| idd          }d|j                            d          v sJ d S )N/subpath/templatera   /prefix/subpath/templaterb   zIhref="../static/extensions/panel/bundled/bootstraptemplate/bootstrap.css"r?   rg   rh   s     r(   Jtest_server_template_static_resources_with_subpath_and_prefix_relative_urlrm   o   sR     ""H.9)TnoooAVZ[ZcZjZjkrZsZsssssssr*   c                  P    t          d          } t          |           j        sJ d S )Nr;   )r   r   ok)mds    r(   test_server_extensions_on_rootrq   w   s,    	)		BR  ######r*   c                     t          d          }d}d| d|  d| }t          ||i| d| d|           }|j        dk    sJ d	|  d
|j                            d          v sJ d S )Nr;   testz,bokeh-autoload-element=1002&bokeh-app-path=/z%&bokeh-absolute-url=http://localhost:/z/autoload.js?)r   r>      http://localhost:z%/static/extensions/panel/panel.min.jsr?   )r   r   status_coderJ   rK   )r   r%   app_nameargsrN   s        r(   test_autoload_jsrz   |   s    IDHz(zzimzzpxzzD8T*>_(>_>_Y]>_>_```A=CJtJJJaiN^N^_fNgNgggggggr*   c                     t          d          } g dgffd	}|                     |           t          |            t          | j                                                  d         d         j        }t          |          5  t          d          D ]}| xj	        dz  c_	        	 d d d            n# 1 swxY w Y   t          fd           d S )NClickr   r   c                    K   |dxx         dz  cc<                        |d                    t          j        d           d {V  |dxx         dz  cc<   d S Nr      appendasynciosleepr4   countcountss     r(   cbz'test_server_async_callbacks.<locals>.cb   sm      aAeAhmAaAr*      r   c                  P    t                     dk    ot                     dk    S r~   lenmaxr   s   r(   <lambda>z-test_server_async_callbacks.<locals>.<lambda>        s6{{Q:3v;;? r*   )r   on_clickr   list_modelsvaluesr   r
   rangeclicksr   )buttonr   doc_r   s       @r(   test_server_async_callbacksr      s2   !!!FF c       OOBf
v~$$&&
'
'
*1
-
6C	C  q 	 	AMMQMMM	              
 ::::;;;;;s   #B66B:=B:c                     i fdfd}t          |d           t          fd           t          fd           d S )Nc                    K   t          j        d           d {V  g t          j        <   t	          d          D ]K} t          j        d           d {V  t          j                                     t          j                   Ld S )N      ?r   皙?)r   r   r   r3   r   r   )r   docss    r(   taskz+test_server_async_local_state.<locals>.task   s      mC         U\q 	4 	4A-$$$$$$$$$%%el3333	4 	4r*   c                  0    t          j                    dS NzMy appr   executer   s   r(   rR   z*test_server_async_local_state.<locals>.app       dxr*      nc                  *    t                     dk    S Nr   r   r   s   r(   r   z/test_server_async_local_state.<locals>.<lambda>       s4yyA~ r*   c                  Z    t          d                                  D                       S )Nc                 h    g | ]/\  }}t          t          |                    d k    o	|d         |u 0S )r   r   r   set.0r   r   s      r(   
<listcomp>zCtest_server_async_local_state.<locals>.<lambda>.<locals>.<listcomp>   s:    aaaysDCD		NNa/BDGsNaaar*   allitemsr   s   r(   r   z/test_server_async_local_state.<locals>.<lambda>   s+    saaTXT^T^T`T`aaabb r*   r   r   bokeh_curdocrR   r   r   s     @@r(   test_server_async_local_stater      s    D4 4 4 4 4     cQ %%%%&&&bbbbcccccr*   c                     i dfd	fd}t          |d           t          fd           t          fd           d S )	Nr   c                 `  K   t          j        d           d {V  | dk    r t          j         | dz
                       g t          j        <   t          d          D ]K}t          j        d           d {V  t          j                                     t          j                   Ld S )Nr   r   r   
   r   )r   r   ensure_futurer   r3   r   r   )depthr   r   r   s     r(   r   z8test_server_async_local_state_nested_tasks.<locals>.task   s      mC         199!$$uQw--000U\r 	4 	4A-$$$$$$$$$%%el3333	4 	4r*   c                  0    t          j                    dS r   r   r   s   r(   rR   z7test_server_async_local_state_nested_tasks.<locals>.app   r   r*   r   r   c                  *    t                     dk    S r   r   r   s   r(   r   z<test_server_async_local_state_nested_tasks.<locals>.<lambda>   r   r*   c                  Z    t          d                                  D                       S )Nc              3   p   K   | ]1\  }}t          t          |                    d k    o	|d         |u V  2dS )r   r   Nr   r   s      r(   	<genexpr>zOtest_server_async_local_state_nested_tasks.<locals>.<lambda>.<locals>.<genexpr>   sD      ``ic43s4yy>>Q.A47c>``````r*   r   r   s   r(   r   z<test_server_async_local_state_nested_tasks.<locals>.<lambda>   s+    s``SWS]S]S_S_````` r*   )r   r   r   s     @@r(   *test_server_async_local_state_nested_tasksr      s    D4 4 4 4 4 4 4     cQ %%%%&&&````aaaaar*   c                     ddfd} fd}d\  }}t          | |           t          ||           t          j        d| d          j                            d	          }t          j        d| d          j                            d	          }t
          j        vsJ t
          j        vsJ |v sJ |vsJ |vsJ |v sJ d S )
Nzbody { background-color: red }z body { background-color: green }c                  "     gt           _        d S r2   r   raw_css)CSS1s   r(   app1z1test_serve_config_per_session_state.<locals>.app1       r*   c                  "     gt           _        d S r2   r   )CSS2s   r(   app2z1test_serve_config_per_session_state.<locals>.app2   r   r*   )iY  iZ  r   rv   rt   r?   )r   requestsgetrJ   rK   r   r   )r   r   port1port2r1r2r   r   s         @@r(   #test_serve_config_per_session_stater      s'   +D-D                   LE54e$$$$4e$$$$	2%222	3	3	;	B	B7	K	KB	2%222	3	3	;	B	B7	K	KBv~%%%%v~%%%%2::::r>>>>r>>>>2::::::r*   c                      g fd} t          j        |            t          d          }t          |d           t	                    dk    sJ d S )Nc                 2                         |            d S r2   r   session_contextsession_contextss    r(   append_sessionz6test_server_on_session_created.<locals>.append_session       00000r*   r;   r   r   )r   on_session_createdr   r   r   r   r%   r   s     @r(   test_server_on_session_createdr      ss    1 1 1 1 1	^,,,IDda      A%%%%%%r*   c                      g fd} t          j        |            t          d          }t          |ddd           t	          fd           d S )Nc                 2                         |            d S r2   r   r   s    r(   r   z8test_server_on_session_destroyed.<locals>.append_session   r   r*   r;   r   i  )r   "check_unused_sessions_milliseconds$unused_session_lifetime_millisecondsc                  *    t                     dk    S r   r   )r   s   r(   r   z2test_server_on_session_destroyed.<locals>.<lambda>   s    s+,,1 r*   )r   on_session_destroyedr   r   r   r   s     @r(    test_server_on_session_destroyedr      sv    1 1 1 1 1	~...IDdaCnqrrrr111122222r*   c                  ,   t          j        d          5  t          d          } t          |            t          j        d         dk    sJ t          t          j        d                   dk    sJ t          t          j        d                                                   d         \  }}|d         	                    d	          sJ t          j        d
         dk    sJ t          | j
                                                  d         }t          j                    }t          j                    }i |_        ||_        ||_        ||_        t%          j        |          |_        t+          |          5  t	          j        d            t          j        d
         dk    sJ 	 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                     |           t	          j        |           t          j        d
         dk    sJ d S )N)session_historyr;   totalr   sessionsr   
user_agentzpython-requestslive)r   r   r   r   r   session_infor   r   r   
startswith
_documentskeysr6   Parameterized	argumentsrequest	_documentidweakrefref_session_contextr
   _init_session_server_destroy_destroy_session)r%   sidr&   r   r   r   s         r(   test_server_session_infor     sd   	B	'	'	' 3 3	""$!'*a////5%j122a7777E.z:@@BBCCAFW|$//0ABBBBB!&)Q....4?''))**1--//%''")$'! &{?;;__ 	3 	3%%%%f-22222	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3'3 3 3 3 3 3 3 3 3 3 3 3 3 3 3. 	)))	?+++f%******s6   E!G7-F1%G1F5	5G8F5	9GGGc                 j    g dgffd	fd}t          |           t          fd           d S )Nr   c                 b   K                        | d                    | dxx         dz  cc<   d S r~   r   r   r   s    r(   r   z/test_server_periodic_async_callback.<locals>.cb  s6      eAhaAr*   c                  R    t          d          } t          j        d           | S Nr|   r   d   r   r   add_periodic_callbackr   r   s    r(   rR   z0test_server_periodic_async_callback.<locals>.app"  +    W%%%#B,,,r*   c                      t                     dk    o, t          t          t                                         k    S )Nr   )r   r   r   r   s   r(   r   z5test_server_periodic_async_callback.<locals>.<lambda>)  s2    s6{{a'NFd5V;M;M6N6N,N r*   r   threadsr   rR   r   r   s      @@r(   #test_server_periodic_async_callbackr    ss    Fs          
 cNNNNOOOOOr*   c                  t    dt           j        d<   d fd} t          |            t          d            d S )Nr   r   c                  :    t           j        dxx         dz  cc<   d S )Nr   r   r   cache r*   r(   periodic_cbz0test_server_schedule_repeat.<locals>.periodic_cb.  s&    G!r*   c                  6    t          j        d d           dS )Nperiodic0.5s)period# state.schedule testr   schedule_taskr  s   r(   rR   z(test_server_schedule_repeat.<locals>.app1  s!    JFCCCC&&r*   c                  .    t           j        d         dk    S )Nr   r   r  r  r*   r(   r   z-test_server_schedule_repeat.<locals>.<lambda>7  s    u{7+a/ r*   )r   r  r   r   )rR   r  s    @r(   test_server_schedule_repeatr   ,  s_    EK" " "' ' ' ' ' c//00000r*   c                 j    g dgffd	fd}t          |           t          fd           d S )Nr   c                     | dxx         dz  cc<                        | d                    t          j        d           | dxx         dz  cc<   d S Nr   r   r   r   r   timer   r  s    r(   r  z2test_server_schedule_threaded.<locals>.periodic_cb;  sT    aAeAh
3aBr*   c                  h    t          j        d dd           t          j        d dd           dS )N	periodic1r  T)r  threaded	periodic2r  r  r  s   r(   rR   z*test_server_schedule_threaded.<locals>.appA  s=    KVdSSSSKVdSSSS&&r*   c                  P    t                     dk    ot                     dk    S r~   r   r   s   r(   r   z/test_server_schedule_threaded.<locals>.<lambda>I  r   r*   r   )r  rR   r   r  s     @@r(   test_server_schedule_threadedr+  9  su    F#      ' ' ' ' '
 c ::::;;;;;r*   c                  v   d t           j                                        t          j        d          z   fd} t	          |            t          d            t          t          j        d         z
            t          j        d          k     sJ t          t          j
                  dk    sJ d S )	Nc                  \    t           j                                        t          j        d<   d S Nat)dtdatetimenowr   r  r  r*   r(   r  z,test_server_schedule_at.<locals>.periodic_cbM  s     KOO--Dr*   Q?secondsc                  6    t          j        d            dS Nr  )r/  r  r  )r  	scheduleds   r(   rR   z$test_server_schedule_at.<locals>.appR  s!    J	BBBB&&r*   c                      dt           j        v S r.  r  r  r*   r(   r   z)test_server_schedule_at.<locals>.<lambda>Y  s    tu{* r*   r/  皙?r   )r0  r1  r2  	timedeltar   r   absr   r  r   
_scheduled)rR   r  r8  s    @@r(   test_server_schedule_atr>  L  s    . . . !!BL$>$>$>>I' ' ' ' ' ' c **+++u{4 9,--S0I0I0IIIIIu  A%%%%%%r*   c                     g t           j        d<   d t          j                                        t          j        d          z   t          j                                        t          j        d          z   fdfd} t          |            t          d            t          t           j        d         d	         z
            t          j        d
          k     sJ t          t           j        d         d         z
            t          j        d
          k     sJ t          t           j
                  d	k    sJ d S )Nr/  c                      t           j        d                             t          j                                                   d S r.  r   r  r   r0  r1  r2  r  r*   r(   r  z5test_server_schedule_at_iterator.<locals>.periodic_cb`  /    D  !2!233333r*   r3  r4  (\?c               3      K    V  V  d S r2   r  )
scheduled1
scheduled2s   r(   schedulez2test_server_schedule_at_iterator.<locals>.schedulef  s%      r*   c                  F    t          j        d                         dS r7  r  r  rG  s   r(   rR   z-test_server_schedule_at_iterator.<locals>.appj  s'    J

CCCC&&r*   c                  H    t          t          j        d                   dk    S Nr/     r   r   r  r  r*   r(   r   z2test_server_schedule_at_iterator.<locals>.<lambda>q      s5;t,--2 r*   r   r:  r   )r   r  r0  r1  r2  r;  r   r   r<  r   r=  )rR   r  rG  rE  rF  s    @@@@r(    test_server_schedule_at_iteratorrO  ^  sY   EK4 4 4 ""R\$%?%?%??J""R\$%?%?%??J     ' ' ' ' ' ' c 22333u{4 #j011BL4M4M4MMMMMu{4 #j011BL4M4M4MMMMMu  A%%%%%%r*   c                     g t           j        d<   d t          j                                        t          j        d          z   t          j                                        t          j        d          z   g} t          |           fdfd}t          |           t          d            d	 | D             } t          t           j        d         d
         | d
         z
            t          j        d          k     sJ t          t           j        d         d         | d         z
            t          j        d          k     sJ t          t           j                  d
k    sJ d S )Nr/  c                      t           j        d                             t          j                                                   d S r.  rA  r  r*   r(   r  z5test_server_schedule_at_callable.<locals>.periodic_cby  rB  r*   r3  r4  rC  c                 "    t                    S r2   )next)utcnowsiters    r(   rG  z2test_server_schedule_at_callable.<locals>.schedule  s    E{{r*   c                  6    t          j        d            dS r7  r  rI  s   r(   rR   z-test_server_schedule_at_callable.<locals>.app  s!    JAAAA&&r*   c                  H    t          t          j        d                   dk    S rK  rM  r  r*   r(   r   z2test_server_schedule_at_callable.<locals>.<lambda>  rN  r*   c                     g | ]M}|                     t          j        j                                                                        d           NS ))tzinfoN)rL   r0  timezoneutc
astimezone)r   ss     r(   r   z4test_server_schedule_at_callable.<locals>.<listcomp>  sW        	
			))4466>>d>KK  r*   r   r:  r   )r   r  r0  r1  rT  r;  iterr   r   r<  r   r=  )r8  rR   r  rG  rU  s     @@@r(    test_server_schedule_at_callabler_  w  s   EK4 4 4 	r|D9999
r|D9999I OOE    ' ' ' ' ' ' c 22333   I u{4 #il233bl36O6O6OOOOOu{4 #il233bl36O6O6OOOOOu  A%%%%%%r*   c                 H   dgfd}t          |d          \  }}t          t          j                  dk    sJ dt          j        v sJ t          j        d         }|j        |j                            d          v sJ |j        |j                            d          vsJ d S )Nr   c                 <    d| d          }| dxx         dz  cc<   |S )N# Count r   r   r  )r   rJ   s     r(   rR   z'test_server_reuse_sessions.<locals>.app  s-    (VAY((q			Q			r*   rL  r   r   )rt   defaultr?   )r   r   r   	_sessionstokenrJ   rK   )reuse_sessionsrR   r   r   r&   s        r(   test_server_reuse_sessionsrg    s    3    
 sa(((FBu1$$$$u....o./G=BJ--g666666=
 1 1' : :::::::r*   c                    d t           _        dgfd}t          ||            t          j        d|  d          }t          j        d|  d          }t          t          j                  dk    sJ d	t          j        v sJ d
t          j        v sJ t          j                                        \  }}|j	        |j
                            d          v sJ |j	        |j
                            d          v sJ d S )Nc                 T    | j         | j                            ddg          d         fS )Narg r   )rE   r   r   )rN   s    r(   r   zBtest_server_reuse_sessions_with_session_key_func.<locals>.<lambda>  s$    1M1Ma1P(Q r*   r   c                    dt           j        v r,t           j        d         d                             d          }nd}d| d          }t          |          }|j                            |           | dxx         dz  cc<   |S )Nrj  r   r?   Emptyrb  )titler   )r   session_argsrK   r   mainr   )r   rn  rJ   tmpls       r(   rR   z=test_server_reuse_sessions_with_session_key_func.<locals>.app  s    E&&&&u-a077@@EEE(VAY(( u---	!!!q			Q			r*   r   rv   z	/?arg=fooz	/?arg=barrL  )rt   s   foo)rt   s   barr?   )r   session_key_funcr   r   r   r   r   rd  r   re  rJ   rK   )r   rf  rR   r   r   session1session2s          r(   0test_server_reuse_sessions_with_session_key_funcru    s   QQF3 	 	 	 	 3T""""	9$999	:	:B	9$999	:	:Bu1$$$$EO++++EO++++//11Hh>RZ..w777777>RZ..w77777777r*   c                 j    | ^ }}|^ }}t          t                    }d| d|v sJ d| d|v sJ d S )Nz
localhost:z - HTMLz - Markdown)reprr   )r$   markdown_server_sessionr   	html_portmarkdown_portserver_infos         r(   test_show_server_infor|    s^    'MQ	/Qu++K*	***k99992222kAAAAAAr*   c                 d    | ^}}}|^}}}t          j                     |j        sJ |j        sJ d S r2   )r   kill_all_servers_stopped)r$   rx  r   server_1server_2s        r(   test_kill_all_serversr    sK    )OAx!-OAx!	r*   c                      | dddd          \  }}|j         j        dk    sJ |j         j        dk    sJ t          j        t                    5   | dddd          \  }}ddd           dS # 1 swxY w Y   dS )z)Serve multiple apps with a title per app.)r   r   APP1APP2)slugstitles)badkeyr   N)r   rn  pytestraisesKeyError)multiple_apps_server_sessionsrs  rt  s      r(   test_multiple_titlesr    s    76'G'GI I IHh"f,,,,"f,,,, 
x	 	  O O::"ff+M+MO O O(O O O O O O O O O O O O O O O O O Os   A22A69A6c                      t          j        t                    j        dz  dz  } t	          d| i          }d|j        j        v sJ d S )Niozpanel_app.pyz	panel-appz
/panel-apppathlibPathrG   parentr   _tornadoapplicationsrE   r   s     r(   (test_serve_can_serve_panel_app_from_filer    sL    <!!(4/>Dd+,,F6?7777777r*   c                      t          j        t                    j        dz  dz  } t	          d| i          }d|j        j        v sJ d S )Nr  z	bk_app.pyzbk-appz/bk-appr  r  s     r(   (test_serve_can_serve_bokeh_app_from_filer    sL    <!!(4/;D4())F4444444r*   c                 r    g fdfdfd}t          |           t          fd           d S )Nc                  F                          t          j                   d S r2   r   r   loadedr  s   r(   r   z*test_server_on_load_after_init.<locals>.cb      el#####r*   c                  4    t          j         d           d S )NTrG  r   r   s   r(   cb2z+test_server_on_load_after_init.<locals>.cb2  s    b4((((((r*   c                      t          j                   t          j                   d } t          j        | d           dS )Nc                  D    t          j        t           j        d            d S r2   r   _schedule_on_loadr3   r  r*   r(   r  z;test_server_on_load_after_init.<locals>.app.<locals>.loaded      #EL$77777r*   Tr  Appr   onloadr   r  r   r  s    r(   rR   z+test_server_on_load_after_init.<locals>.app  L    RS	8 	8 	8ft,,,,ur*   c                       ddgk    S )NFTr  r  s   r(   r   z0test_server_on_load_after_init.<locals>.<lambda>  s    v%. r*   r   r  r   rR   r   r  r  s      @@@r(   test_server_on_load_after_initr    s    F$ $ $ $ $) ) ) ) )      c ..../////r*   c                 r    g fdfdfd}t          |           t          fd           d S )Nc                  F                          t          j                   d S r2   r  r  s   r(   r   z+test_server_on_load_during_load.<locals>.cb  r  r*   c                  0    t          j                    d S r2   )r   r  r  s   r(   r  z,test_server_on_load_during_load.<locals>.cb2  s    Rr*   c                      t          j                   t          j                   d } t          j        | d           dS )Nc                  D    t          j        t           j        d            d S r2   r  r  r*   r(   r  z<test_server_on_load_during_load.<locals>.app.<locals>.loaded  r  r*   Tr  r  r  r  s    r(   rR   z,test_server_on_load_during_load.<locals>.app  r  r*   c                       ddgk    S )NFr  r  s   r(   r   z1test_server_on_load_during_load.<locals>.<lambda>  s    v%/ r*   r   r  s      @@@r(   test_server_on_load_during_loadr  
  s    F$ $ $ $ $          c ////00000r*   c                 j    g dgffd	fd}t          |           t          fd           d S )Nr   c                     | dxx         dz  cc<                        | d                    t          j        d           | dxx         dz  cc<   d S Nr   r   r   r$  r  s    r(   r   z+test_server_thread_pool_on_load.<locals>.cb%  T    aAeAh
3aAr*   c                      t          j        d           t          j        d           d } t          j        | d           dS )NT)r(  c                  D    t          j        t           j        d            d S r2   r  r  r*   r(   r  z<test_server_thread_pool_on_load.<locals>.app.<locals>.loaded0  r  r*   r  r  r  r  r   s    r(   rR   z,test_server_thread_pool_on_load.<locals>.app+  sV    R$''''R$''''	8 	8 	8ft,,,,ur*   c                  P    t                     dk    ot                     dk    S r~   r   r   s   r(   r   z1test_server_thread_pool_on_load.<locals>.<lambda>9  r   r*   r   r  s      @@r(   test_server_thread_pool_on_loadr  "  su    F      	 	 	 	 	 c ::::;;;;;r*   c                 j    g dgffd	fd}t          |           t          fd           d S )Nr   c                     | dxx         dz  cc<                        | d                    t          j        d           | dxx         dz  cc<   d S r  r$  r  s    r(   r   z+test_server_thread_pool_execute.<locals>.cb?  r  r*   c                  `    t          j         d           t          j         d           dS )Nthreadr  r  r   r  s   r(   rR   z,test_server_thread_pool_execute.<locals>.appE  s2    b8,,,,b8,,,,ur*   c                  P    t                     dk    ot                     dk    S r~   r   r   s   r(   r   z1test_server_thread_pool_execute.<locals>.<lambda>M  r   r*   r   r  s      @@r(   test_server_thread_pool_executer  <  su    F          
 c ::::;;;;;r*   c                 j    g dgffd	fd}t          |           t          fd           d S )Nr   c                     | dxx         dz  cc<                        | d                    t          j        d           d         }| dxx         dz  cc<   |S r#  r$  )r   valuer   s     r(   r   z.test_server_thread_pool_defer_load.<locals>.cbS  s^    aAeAh
3r
aAr*   c                      d } t          j        | d           t          t          d          t          d                    S )Nc                  D    t          j        t           j        d            d S r2   r  r  r*   r(   r  z?test_server_thread_pool_defer_load.<locals>.app.<locals>.loaded]  r  r*   Tr  )
defer_load)r   r   r   r   r  s    r(   rR   z/test_server_thread_pool_defer_load.<locals>.app[  sY    	8 	8 	8ft,,,,"..."...
 
 	
r*   c                  P    t                     dk    ot                     dk    S r~   r   r   s   r(   r   z4test_server_thread_pool_defer_load.<locals>.<lambda>i  r   r*   r   r  s      @@r(   "test_server_thread_pool_defer_loadr  P  su    F      	
 	
 	
 	
 	
 c ::::;;;;;r*   c           	      f   t          d          }t          d          }g dgffd	}|                    |           |                    |           t          ||          }t          |           t	          |j                                                  d         d         }|j        }t          |          5  |	                    ||j
        d         d ddd           |	                    ||j
        d         d ddd           d d d            n# 1 swxY w Y   t          fd           d S )	Nr|   r   r   c                     |dxx         dz  cc<                        |d                    t          j        d           |dxx         dz  cc<   d S r  r$  r   s     r(   r   z0test_server_thread_pool_change_event.<locals>.cbr  r  r*   r   r   r   c                  P    t                     dk    ot                     dk    S r~   r   r   s   r(   r   z6test_server_thread_pool_change_event.<locals>.<lambda>  r   r*   )r   r   r   r   r   r   r   r   r
   r8   r   r   )	r  r   r   button2r   layoutmodelr   r   s	           @r(   $test_server_thread_pool_change_eventr  l  s   !!!F'"""GF       OOBR!!Ff&&(())!,Q/E
.C	C K Kc59T?D(AqIIIsEIdOT8QJJJK K K K K K K K K K K K K K K
 ::::;;;;;s   =ADDDc                   	 dd l }|                    ddgddggddg          }t          |          }g 	dgf	fd	}|                    |           t	          |           t          |j                                                  d         d         }t          |dd          }t          d          D ]}|
                    |j        |           t          	fd	           d S )
Nr   r   rL  AB)columnsc                     |dxx         dz  cc<                        |d                    t          j        d           |dxx         dz  cc<   d S r  r$  r   s     r(   r   z/test_server_thread_pool_bokeh_event.<locals>.cb  r  r*   r   c                  P    t                     dk    ot                     dk    S r~   r   r   s   r(   r   z5test_server_thread_pool_bokeh_event.<locals>.<lambda>  r   r*   )pandas	DataFramer   on_editr   r   r   r   r   r   _server_eventr   r   )
r  r   pddf	tabulatorr   r  r4   r   r   s
            @r(   #test_server_thread_pool_bokeh_eventr    s   	1v1v&c
	;	;B"IF       bi   "))++,,Q/2E5#q))E1XX 7 76666 ::::;;;;;r*   c                 j    g dgffd	fd}t          |           t          fd           d S )Nr   c                     | dxx         dz  cc<                        | d                    t          j        d           | dxx         dz  cc<   d S r  r$  r  s    r(   r   z,test_server_thread_pool_periodic.<locals>.cb  r  r*   c                  R    t          d          } t          j        d           | S r  r	  r  s    r(   rR   z-test_server_thread_pool_periodic.<locals>.app  r  r*   c                  P    t                     dk    ot                     dk    S r~   r   r   s   r(   r   z2test_server_thread_pool_periodic.<locals>.<lambda>  r   r*   r   r  s      @@r(    test_server_thread_pool_periodicr    su    F          
 c ::::;;;;;r*   c                 b    g dgffd	}t          |d           t          fd           d S )Nr   c                      t          d          } fd}t          j        |           d }t          j        |d           |S )Nr|   r   c                       dxx         dz  cc<                         d                    t          j        d            dxx         dz  cc<   d S Nr   r   rL  r$  r  s   r(   r  z;test_server_thread_pool_onload.<locals>.app.<locals>.onload  sT    !HHHMHHHMM%(###JqMMM!HHHMHHHHHr*   c                  D    t          j        t           j        d            d S r2   r  r  r*   r(   r  z;test_server_thread_pool_onload.<locals>.app.<locals>.loaded  r  r*   Tr  r   r   r  r   r   r   r  r  r   s   `   r(   rR   z+test_server_thread_pool_onload.<locals>.app  m    W%%%	 	 	 	 	 	 	V	8 	8 	8ft,,,,r*   rL  r   c                  P    t                     dk    ot                     dk    S r~   r   r   s   r(   r   z0test_server_thread_pool_onload.<locals>.<lambda>  r   r*   r   r  r   rR   r   s      @r(   test_server_thread_pool_onloadr    s`    F#      " cQ ::::;;;;;r*   c                     t          d          d }fd                    |           fd}t          |d           t          d            d S )	Nr|   r   c                 .    t          j        d           d S )Nr   )r%  r   r4   s    r(   r   z(test_server_thread_pool_busy.<locals>.cb  s    
3r*   c                  d                          t          j        t          d                      d S N)r  _comm_eventr   r3   r   r   s   r(   simulate_clickz4test_server_thread_pool_busy.<locals>.simulate_click  ,    5<4)@)@)@AAAAAr*   c                      t           j                                       t           j                                       t           j                                        S r2   r   r3   add_next_tick_callbackr   r  s   r(   rR   z)test_server_thread_pool_busy.<locals>.app  sJ    ++N;;;++N;;;++N;;;r*   rt   rY   c                  <    t           j        dk    ot           j         S )Nr   )r   _busy_counterbusyr  r*   r(   r   z.test_server_thread_pool_busy.<locals>.<lambda>  s    u*a/B
N r*   r   r   r   r   )r  r   r   rR   r   r  s       @@r(   test_server_thread_pool_busyr    s    !!!F  B B B B B OOB      c#&&&&BBCCCCCr*   c                 b    g dgffd	}t          |d           t          fd           d S )Nr   c                      t          d          } fd}t          j        |           d }t          j        |d           |S )Nr|   r   c                     K    dxx         dz  cc<                         d                    t          j        d           d {V   dxx         dz  cc<   d S r  r   r  s   r(   r  z5test_server_async_onload.<locals>.app.<locals>.onload  sm      !HHHMHHHMM%(###-"""""""""!HHHMHHHHHr*   c                  D    t          j        t           j        d            d S r2   r  r  r*   r(   r  z5test_server_async_onload.<locals>.app.<locals>.loaded  r  r*   Tr  r  r  s   `   r(   rR   z%test_server_async_onload.<locals>.app  r  r*   rL  r   c                  H    t                     ot                     dk    S )NrL  r   r   s   r(   r   z*test_server_async_onload.<locals>.<lambda>  s    s6{{7s6{{a'7 r*   r   r  s      @r(   test_server_async_onloadr    s`    F#      " cQ 777788888r*   c                       e Zd ZdZdS )CustomBootstrapTemplate./assets/custom.cssN)__name__
__module____qualname___cssr  r*   r(   r  r    s         DDDr*   r  c                 n   t                      }t          d|id          }t          t          j        t
                    j        dz  dz  d          5 }|                                |j        	                    d          
                    dd	          k    sJ 	 d d d            d S # 1 swxY w Y   d S )
NrX   zR/components/panel.tests.test_server/CustomBootstrapTemplate/_css/assets/custom.cssrY   assets
custom.cssr?   r@   rB   rC   r  r   rH   r  r  rG   r  rI   rJ   rK   rL   )r   rX   rN   rO   s       r(   %test_server_template_custom_resourcesr    s   &((H:x0  :N  	O  	O  	OA	gl8$$+h6EPW	X	X	X K\]vvxx19++G44<<VTJJJJJJJK K K K K K K K K K K K K K K K K Ks   AB**B.1B.c                 t   t                      }d}t          d|id|          }t          t          j        t
                    j        dz  dz  d          5 }|                                |j        	                    d          
                    d	d
          k    sJ 	 d d d            d S # 1 swxY w Y   d S )NzY/prefix/components/panel.tests.test_server/CustomBootstrapTemplate/_css/assets/custom.cssrX   ra   rb   r  r  r?   r@   rB   rC   r  )r   rX   rE   rN   rO   s        r(   1test_server_template_custom_resources_with_prefixr    s   &((HfD:x04PPPA	gl8$$+h6EPW	X	X	X K\]vvxx19++G44<<VTJJJJJJJK K K K K K K K K K K K K K K K K Ks   AB--B14B1c                     t                      }t          d|idd          }d|j                            d          v sJ d S )NrX   ra   rf   rb   zXhref="components/panel.tests.test_server/CustomBootstrapTemplate/_css/assets/custom.css"r?   r  r   rJ   rK   r   rX   rN   s      r(   >test_server_template_custom_resources_with_prefix_relative_urlr    so    &((H:x0K]^^^Aeijiriyiy  {B  jC  jC  C  C  C  C  C  Cr*   c                     t                      }t          d|idd          }d|j                            d          v sJ d S )Nrk   ra   rl   rb   z[href="../components/panel.tests.test_server/CustomBootstrapTemplate/_css/assets/custom.css"r?   r  r  s      r(   Jtest_server_template_custom_resources_with_subpath_and_prefix_relative_urlr   !  sp    &((H.9)TnoooAhlmlul|l|  ~E  mF  mF  F  F  F  F  F  Fr*   c                       e Zd ZdZdgZdS )CustomComponentcustomr  N)r  r  r  _extension_name__css__r  r*   r(   r"  r"  )  s        O$%GGGr*   r"  c                 r   t                      }d}t          d|i|          }t          t          j        t
                    j        dz  dz  d          5 }|                                |j        	                    d          
                    dd	          k    sJ 	 d d d            d S # 1 swxY w Y   d S )
NzM/components/panel.tests.test_server/CustomComponent/__css__/assets/custom.css	componentrY   r  r  r?   r@   rB   rC   r"  r   rH   r  r  rG   r  rI   rJ   rK   rL   )r   r'  rE   rN   rO   s        r(   &test_server_component_custom_resourcesr)  0  s   !!IZD;	24@@@A	gl8$$+h6EPW	X	X	X K\]vvxx19++G44<<VTJJJJJJJK K K K K K K K K K K K K K K K K Ks   AB,,B03B0c                 p   t                      }t          d|idd          }t          t          j        t
                    j        dz  dz  d          5 }|                                |j        	                    d          
                    d	d
          k    sJ 	 d d d            d S # 1 swxY w Y   d S )Nr'  ra   zT/prefix/components/panel.tests.test_server/CustomComponent/__css__/assets/custom.cssrb   r  r  r?   r@   rB   rC   r(  )r   r'  rN   rO   s       r(   2test_server_component_custom_resources_with_prefixr+  :  s   !!I	i   <R	 	 	A 
gl8$$+h6EPW	X	X	X K\]vvxx19++G44<<VTJJJJJJJK K K K K K K K K K K K K K K K K Ks   AB++B/2B/c                     t                      }t          d|idd          }d|j                            d          v sJ d S )Nr'  ra   z/prefix/componentrb   zShref="components/panel.tests.test_server/CustomComponent/__css__/assets/custom.css"r?   r"  r   rJ   rK   r   r'  rN   s      r(   ?test_server_component_custom_resources_with_prefix_relative_urlr/  E  sQ    !!I;	29M`aaaA`dedmdtdtu|d}d}}}}}}}r*   c                     t                      }t          d|idd          }d|j                            d          v sJ d S )N/subpath/componentra   /prefix/subpath/componentrb   zVhref="../components/panel.tests.test_server/CustomComponent/__css__/assets/custom.css"r?   r-  r.  s      r(   Ktest_server_component_custom_resources_with_subpath_and_prefix_relative_urlr3  M  sl    !!I/;IVqrrrAcghgpgwgwx  hA  hA  A  A  A  A  A  Ar*   c                     t                      }t          d|id          }d|j                            d          v sJ d S )Nr'  z
/componentrY   zIhref="static/extensions/panel/bundled/terminal/xterm@4.11.0/css/xterm.cssr?   r   r   rJ   rK   r.  s      r(   2test_server_component_css_with_prefix_relative_urlr6  U  sL    

I;	2<HHHAVZ[ZcZjZjkrZsZsssssssr*   c                     t                      }t          d|idd          }d|j                            d          v sJ d S )Nr1  ra   r2  rb   zLhref="../static/extensions/panel/bundled/terminal/xterm@4.11.0/css/xterm.cssr?   r5  r.  s      r(   >test_server_component_css_with_subpath_and_prefix_relative_urlr8  ]  sP    

I/;IVqrrrAY]^]f]m]mnu]v]vvvvvvvr*   c                     t                      r2   	Exceptionr  s    r(   synchronous_handlerr<  e  s    
++r*   c                 "   K   t                      r2   r:  r  s    r(   async_handlerr>  h  s      
++r*   zthreads, handlerr  	nothreadsc                     |                     |            g fdfdt                                          |           fd}t          |           t	          fd           d S )Nc                 2                         |            d S r2   r   e
exceptionss    r(   exception_handlerzDtest_server_exception_handler_bokeh_event.<locals>.exception_handlerw      !r*   c                  d                          t          j        t          d                      d S r  r  r  s   r(   r  zAtest_server_exception_handler_bokeh_event.<locals>.simulate_clickz  r  r*   c                  ^    t           _        t          j                                        S r2   r   rE  r   r3   r   )r   rE  r  s   r(   rR   z6test_server_exception_handler_bokeh_event.<locals>.app  s&    #4 ++N;;;r*   c                  *    t                     dk    S Nr   r   rD  s   r(   r   z;test_server_exception_handler_bokeh_event.<locals>.<lambda>      s:!+ r*   )getfixturevaluer   r   r   r   )	r  handlerr   r   rR   r   rE  rD  r  s	        @@@@r(   )test_server_exception_handler_bokeh_eventrP  k  s     G$$$J    B B B B B XXF
OOG      
 c++++,,,,,r*   c                     |                     |            g fdfdt                      j                            |d           fd}t	          |           t          fd           d S )Nc                 2                         |            d S r2   r   rB  s    r(   rE  zKtest_server_exception_handler_async_change_event.<locals>.exception_handler  rF  r*   c                  R                          t          j        d d ddd           d S )Nr  rk  foo)r   subpathattroldnew)r8   r   r3   )
text_inputs   r(   simulate_inputzHtest_server_exception_handler_async_change_event.<locals>.simulate_input  s.    !!%,D$WZ\bg!hhhhhr*   r  c                  ^     t           _        t          j                                       S r2   rI  )rE  rZ  rY  s   r(   rR   z=test_server_exception_handler_async_change_event.<locals>.app  s'    #4 ++N;;;r*   c                  *    t                     dk    S rK  r   rL  s   r(   r   zBtest_server_exception_handler_async_change_event.<locals>.<lambda>  rM  r*   )rN  r   r6   r7   r   r   )	r  rO  r   r   rR   rE  rD  rZ  rY  s	        @@@@r(   0test_server_exception_handler_async_change_eventr]    s     G$$$J    i i i i i J7G,,,      
 c++++,,,,,r*   c                     |                     |            g fdd t                      fd}t          |           t          fd           d S )Nc                 2                         |            d S r2   r   rB  s    r(   rE  zKtest_server_exception_handler_async_onload_event.<locals>.exception_handler  rF  r*   c                  D    t          j        t           j        d            d S r2   r  r  r*   r(   r  z@test_server_exception_handler_async_onload_event.<locals>.loaded  s    d33333r*   c                       t           _        t          j                   t          j                                       S r2   )r   rE  r   r  r3   r   )rE  rO  r  rY  s   r(   rR   z=test_server_exception_handler_async_onload_event.<locals>.app  s7    #4 W++F333r*   c                  *    t                     dk    S rK  r   rL  s   r(   r   zBtest_server_exception_handler_async_onload_event.<locals>.<lambda>  rM  r*   )rN  r   r   r   )	r  rO  r   r   rR   rE  rD  r  rY  s	    `   @@@@r(   0test_server_exception_handler_async_onload_eventrc    s     G$$$J    4 4 4 J        c++++,,,,,r*   c                    t          j        d          }|j        }|j        }	 d|_        |                    t           j                   t                      }t          || dd           t          j	        d           t          j        d|             t          j	        d           |j        D ]}|j        dk    rd|j        vsJ 	 |                    |           ||_        d S # |                    |           ||_        w xY w)	NbokehTF)r   r(  showr   rv   WARNINGEMPTY_LAYOUT)logging	getLoggerlevel	propagatesetLevelrg  r   r	   r%  r   r   r   records	levelnamemessage)r   caplog	bk_logger	old_levelold_propagaterR   recs          r(   #test_server_no_warning_empty_layoutrv    s   !'**II'M,"	7?+++eect%8888 	
1///000
1> 	9 	9C}	))%S[8888	9 	9%%%+	 	9%%%+	++++s   B&C) )Dc                     t                      |dz  fd}fd                    |           fd}t          |           t          fd           d S )Nzbutton.htmlc                 2                                    d S r2   )save)r4   r   fsaves    r(   r   z$test_server_threads_save.<locals>.cb  s    Er*   c                  d                          t          j        t          d                      d S r  r  r  s   r(   r  z0test_server_threads_save.<locals>.simulate_click  r  r*   c                  F    t           j                                        S r2   r  r  s   r(   rR   z%test_server_threads_save.<locals>.app  s    ++N;;;r*   c                  ,                                      S r2   )exists)rz  s   r(   r   z*test_server_threads_save.<locals>.<lambda>  s    u||~~ r*   r  )r  r   tmp_pathr   rR   r   rz  r  s        @@@r(   test_server_threads_saver    s     XXF}$E     B B B B B OOB      c%%%%&&&&&r*   r2   )pr   r1  r0  ri  rD   r  r%  r   r6   r  r   bokeh.eventsr   panel.configr   panel.ior   panel.io.resourcesr   panel.io.serverr   r   r	   r
   panel.layoutr   panel.modelsr   r!   panel.models.tabulatorr   
panel.paner   panel.paramr   panel.reactiver   panel.templater   panel.tests.utilr   r   r   panel.widgetsr   r   r   r   markxdist_groupr)   r/   r9   rP   rV   r_   rd   ri   rm   rq   rz   r   r   r   r   r   r   r  r  r   r+  r>  rO  r_  rg  ru  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r"  r)  r+  r/  r3  r6  r8  r<  r>  parametrizerP  r]  rc  rv  r  r  r*   r(   <module>r     s         				       $ $ $ $ $ $             ' ' ' ' ' '                  ' ' ' ' ' ' 1 1 1 1 1 1       % % % % % % ' ' ' ' ' ' , , , , , , J J J J J J J J J J           
 h''5 5 ('5 h''9 9 ('9 h''f f ('fK K K7 7 7K K KK K Kq q qt t t$ $ $
h h h< < <0d d d*b b b.  .
& 
& 
&
3 
3 
3 + + +:P P P"1 1 1< < <&& & &$& & &2& & &B h''; ; (';" h''8 8 ('86 h''B B ('B h''  (' h''
O 
O ('
O8 8 85 5 50 0 001 1 10< < <4< < <(< < <8< < <8< < <8< < <(< < <4D D D,9 9 94! ! ! ! !/ ! ! !
K K KK K KC C CF F F& & & & &l & & &K K KK K K~ ~ ~A A At t tw w w       	'(	)*	M"	m$	 - - -0 	'(	)*	M"	m$	 - - -0 	'(	)*	M"	m$	 - - -0, , ,6' ' ' ' 'r*   