
    e)                     T   d 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
Z
ddlmZ ddlmZmZ ddlZddlZddlmZ ddlmZ ddlmZmZ ddlmZ dd	lmZmZ dd
l m!Z! ddl"mZm#Z# ddl$m%Z%m&Z& dZ'de_(        da)dZ*da+d Z,d Z-d Z.d Z/ej0        d             Z1 ej2        e/           ddddddddddddd d!d"dd#Z3d$ Z4d% Z5d& Z6ej0        d'             Z7 e-            gZ8ej0        d(             Z9ej0        d)             Z:ej0        d*             Z;ej0        d+             Z<ej0        d,             Z=ej0        d-             Z>ej0        d.             Z?ej0        d/             Z@ej0        d0             ZAej0        d1             ZB ej0                    d2             ZC ej0                    d3             ZDej0        d4             ZEej0        d5             ZFed6             ZG ej0        d78          d9             ZH ej0        d78          d:             ZI ej0        d78          d;             ZJej0        d<             ZKej0        d=             ZLej0        d>             ZMej0        d?             ZNej0        d@             ZOej0        dA             ZPej0        dB             ZQdS )Cz5
A module containing testing utilities and fixtures.
    N)contextmanager)PIPEPopen)pull_sessionDocument)curdoc
set_curdocComm)configserve)panel_extension)r
   state)HTMLMarkdown)uijupyter
subprocessFi"     c                     t          j         t           j        t           j                  }|                    d           |                    d| f          dk    }|                                 |S )N   z	127.0.0.1r   )socketAF_INETSOCK_STREAM
settimeout
connect_exclose)portsockis_opens      4lib/python3.11/site-packages/panel/tests/conftest.py	port_openr#   '   sW    =);<<DOOAoo{D122a7GJJLLLN    c                      t          t          j                            dd                    } t          j                            dd          }t          t	          j        dd|                    }d|| z  dz  z   S )	NPYTEST_XDIST_WORKER_COUNT1PYTEST_XDIST_WORKER0\D i)#  
   )intosenvirongetresub)worker_count	worker_id
worker_idxs      r"   get_default_portr6   /   sf    rz~~&A3GGHHL
4c::IRVE2y1122J:,r122r$   c                     dddt          t                    dg} t          | t          t          dd          xa}t          j                    t          z   }	 |j        	                                }t          j
        d	           d
|v rd
}n.d|v rd}n't          j                    |k    rt          d          bt          |                    |          d         d d                   ad S )Nr   serverz--portz--NotebookApp.token=''r   zutf-8)stdoutstderrbufsizeencodingTg{Gz?zhttp://127.0.0.1:http://localhost:z6jupyter server did not start within {timeout} seconds.   )strJUPYTER_PORTr   r   JUPYTER_PROCESStime	monotonicJUPYTER_TIMEOUTr:   readlinesleepTimeoutErrorr-   split)argsprocessdeadlinelinehosts        r"   start_jupyterrO   5   s    x3|+<+<>VWD %d4aZa b b bbOg~/1H~&&((
4$&&&D$&&&D>h&&H   tzz$''+BQB/00LLLr$   c                  j    t           +t          j        t           j        t          j                   d S d S N)rB   r.   killpidsignalSIGTERM r$   r"   cleanup_jupyterrW   I   s-    "
#V^44444 #"r$   c                     t          j        | j        j                  }|                    t          j        | j        j                                                            }dt           dt          |           S )Nr=   z/panel-preview/render/)
pathlibPathfspathdirnamerelative_tor   invocation_dirabsoluterA   r@   )requestpathrels      r"   jupyter_previewrc   M   s`    <.//D


7<(EFFOOQQ
R
RCM|MM3s88MMMr$   z%<Command line help text for flag1...>zUI test markerz$Test only runs with the --ui option.)helpmarker-descrzskip-reasonzRuns Jupyter related testszJupyter test markerz)Test only runs with the --jupyter option.z Runs tests that fork the processzSubprocess test markerz,Test only runs with the --subprocess option.zRuns docs specific testszDocs test markerz&Test only runs with the --docs option.)r   r   r   docsc                     t                                           D ]7\  }}|                     d                    |          dd|d                    8d S )Nz--{}
store_trueFrd   )actiondefaultrd   )optional_markersitems	addoptionformat)parsermarkerinfos      r"   pytest_addoptionrr   l   sf    (..00 ; ;v..|!&T&\ 	 	; 	; 	; 	;; ;r$   c           	          t                                           D ]0\  }} | j        dd                    ||d                              1| j        j        r$t          t                    st                       d S d S d S )Nmarkersz{}: {}re   )	rk   rl   addinivalue_linern   optionr   r#   rA   rO   )r   rp   rq   s      r"   pytest_configurerw   r   s    (..00 O O	 (^8L M M	O 	O 	O 	O} Y|%<%<    r$   c                     g g }} fdt           D             }| }|D ]|r6t          fdt           D                       r|                               :|r|                               R|s1t          fd|D                       r|                               |                                j                            |           ||d d <   d S )Nc                 :    g | ]} j         d |           |S )z--)	getoption).0mr   s     r"   
<listcomp>z1pytest_collection_modifyitems.<locals>.<listcomp>|   s2    IIIQ.>f.>xAxx.H.HIqIIIr$   c              3   *   K   | ]}|j         v V  d S rQ   keywordsr{   r|   items     r"   	<genexpr>z0pytest_collection_modifyitems.<locals>.<genexpr>   s*      FFdm+FFFFFFr$   c              3   *   K   | ]}|j         v V  d S rQ   r   r   s     r"   r   z0pytest_collection_modifyitems.<locals>.<genexpr>   s*      CCaqDM1CCCCCCr$   )rl   )rk   anyappendhookpytest_deselected)r   rl   skippedselectedrt   emptyr   s   `     @r"   pytest_collection_modifyitemsr   z   s   BXGIIII*IIIGKE ! ! 	!SFFFF5EFFFFF 	!NN4     	!OOD!!!! 	!3CCCC7CCCCC 	!OOD!!!!NN4    
K!!!000E!!!HHHr$   c              #   <   K   |                      d           | V  d S )Ni N  )set_default_timeout)contexts    r"   r   r      s)       '''
MMMMMr$   c                      t                      S rQ   r   rV   r$   r"   documentr      s    ::r$   c               #      K   t                      } t          j                                        fd| _        t          |           5  | V  d d d            d S # 1 swxY w Y   d S )Nc                       S rQ   rV   session_contexts   r"   <lambda>z!server_document.<locals>.<lambda>       ? r$   )r   unittestmockMock_session_contextr
   )docr   s    @r"   server_documentr      s      
**Cm((**O2222C	C  			                 s   	AA"Ac               #     K   t                      } t                      }t          j                                        fd|_        t          |           	 |V  t          |            d S # t          |            w xY w)Nc                       S rQ   rV   r   s   r"   r   zbokeh_curdoc.<locals>.<lambda>   r   r$   )r	   r   r   r   r   r   	set_bkdoc)old_docr   r   s     @r"   bokeh_curdocr      s~      hhG
**Cm((**O2222CcNNN			'	's   A- -A>c                      t                      S rQ   r   rV   r$   r"   commr      s    66Mr$   c                  ,   t           j                            dd          } t          t           j                            dd                    }t          d         t          t          j        dd|                     z   }t          dxx         |z  cc<   |S )Nr(   r)   r&   r'   r   r*   r+   )r.   r/   r0   r-   PORTr1   r2   )r4   r3   new_ports      r"   r   r      su    
4c::Irz~~&A3GGHHLAwRVE2y99:::HGGG|GGGOr$   c                  L    t          j        g dg dg ddg dg d          S )N)r         )gQ	@gQ@gףp=
"@)ABC)r-   floatr@   )indexcolumns)pd	DataFramerV   r$   r"   	dataframer      sN    <yy###  YY 7 7 7	9 9 9 9r$   c               #      K   dd l } |                     d           | j        j        }d| j        _        d V  || j        _        d S )Nr   bokeh	holoviewsrendererStorecurrent_backendhvprev_backends     r"   hv_bokehr      sQ      KK8+L&BH	EEE+BHr$   c               #   b   K   g fd} | V  D ]}|t           j        v rt           j        |= d S )Nc                                          | j        d                    i }|g ft          j        | j        d         <   |S )Nid)r   refr   _handles)modelhandlecleanups     r"   display_handlez*get_display_handle.<locals>.display_handle   s;    uy'''+12,uy'r$   )r   r   )r   r   r   s     @r"   get_display_handler      sd      G    
  $ $%.  s#$ $r$   c               #      K   dd l } |                     d           | j        j        }d| j        _        d V  || j        _        d S )Nr   
matplotlibr   r   s     r"   hv_mplr      sQ      KK8+L+BH	EEE+BHr$   c              #     K   | j         j        }t          j        dd|          }d}t	          |          |k    r
|d |         }|                    |d          }|V  t          j        t          |                     d S )Nz[\W]_   T)numbered)	nodenamer1   r2   lenmktempshutilrmtreer@   )r`   tmpdir_factoryr   MAXVALtmp_dirs        r"   tmpdirr      s      <D6'3%%DF
4yy6GVG}##D4#88G
MMM
M#g,,r$   c               #     K   d} t          d          }t          || dd          }t          dd                    |j                  |j                  }|||| fV  	 |                                 d S # t          $ r Y d S w xY w)Ni  z<h1>Title</h1>Fr   showstartTesthttp://localhost:{:d}/
session_idurlio_loop)r   r   r   rn   r   r   stopAssertionErrorr   htmlr8   sessions       r"   html_server_sessionr      s      D !!D4de<<<F$++FK88  G
 
%%%%      A5 5
BBc               #     K   d} t          d          }t          || dd          }t          dd                    |j                  |j                  }|||| fV  	 |                                 d S # t          $ r Y d S w xY w)Ni  z#TitleFr   r   r   r   )r   r   r   rn   r   r   r   r   r   s       r"   markdown_server_sessionr     s      DHD4de<<<F$++FK88  G
 
%%%%   r   c              #   z    K   g  fd}|V  D ]'}	 |                                  # t          $ r Y $w xY wdS )z]Serve multiple apps and yield a factory to allow
    parameterizing the slugs and the titles.c                 (   | \  }}|t          d          |t          d          i}t          ||dd          }	                    |           t          d|j        dd|j                  }t          d|j        dd	|j                  }||fS )
Nz	First appz
Second appF)r   titler   r   r=   dz/app1)r   r   z/app2)r   r   r   r   r   r   )
slugstitles	app1_slug	app2_slugappsr8   session1session2r   serverss
           r"   create_sessionsz6multiple_apps_server_sessions.<locals>.create_sessions  s    $	9x,,x--
 t$f5NNNv8FK8888N
 
 
  8FK8888N
 
 
 !!r$   N)r   r   )r   r   r8   r   s   `  @r"   multiple_apps_server_sessionsr     s       G" " " " " ""   	KKMMMM 	 	 	H	 s   +
88c               #      K   t           j        } t                      t           _        	 d V  | t           _        d S # | t           _        w xY wrQ   )r   r	   r   )
old_curdocs    r"   with_curdocr   2  sD      J::EL"!z!!!!s	   : Ac              #      K   t           j                            |           }|t           j        | <   d V  |t           j        | = d S |t           j        | <   d S rQ   )r.   r/   r0   )env_varvalue	old_values      r"   set_env_varr  <  sV      
w''IBJw	EEEJw'
7r$   T)autousec                      ddl m}  t          t          j                                                  fd| j                                        D             | _        dS )z3
    Cleanup Panel extensions after each test.
    r   )_default_resolverc                 T    i | ]#\  }t          fd D                        |$S )c              3   L   K   | ]}j                             |          V  d S rQ   )
__module__
startswith)r{   trr   s     r"   r   z,module_cleanup.<locals>.<dictcomp>.<genexpr>P  s4      FFr5#..r22FFFFFFr$   )r   )r{   r   r   to_resets     @r"   
<dictcomp>z"module_cleanup.<locals>.<dictcomp>N  sS     ' ' '#eFFFFXFFFFF'e' ' 'r$   N)bokeh.core.has_propsr  listr   _importsvalues_known_modelsrl   )r  r  s    @r"   module_cleanupr  F  st    
 766666O,335566H' ' ' ''8'F'L'L'N'N' ' '###r$   c               #   j   K   	 dV  t          j                     dS # t          j                     w xY w)z0
    Clean up server state after each test.
    N)r   resetrV   r$   r"   server_cleanupr  S  s3      
s    2c                  ,    t          j                     d S rQ   )r   clear_cachesrV   r$   r"   cache_cleanupr  ]  s    	r$   c               #      K   t          j        dd          } 	 | V  |                                  d S # |                                  w xY w)Nwz.pymodesuffixtempfileNamedTemporaryFiler   tfs    r"   py_filer#  a  sL      		$#e	<	<	<B









	   4 A
c               #      K   t          j        dd          } 	 | V  |                                  d S # |                                  w xY w)Nr  z.htmlr  r  r!  s    r"   	html_filer&  i  sL      		$#g	>	>	>B









r$  c               #   f   K   dt           _        	 dV  d t           _        d S # d t           _        w xY w)Nr?   )r   nthreadsrV   r$   r"   threadsr)  q  s9      FO$s   " 0c               #     K   dt           _        	 d V  dt           _        d t           _        t          j                                         t          j                                         d S # dt           _        d t           _        t          j                                         t          j                                         w xY w)NTF)r   reuse_sessionssession_key_funcr   	_sessionsclear_session_key_funcsrV   r$   r"   r+  r+  y  s       F) %"& &&((((( !&"& &&((((s   A* *AC c               #      K   d V  d S rQ   rV   rV   r$   r"   	nothreadsr1    s      	EEEEEr$   c              #      K   t          j        | j        j                   d V  t          j        | j        j                   d S rQ   )r.   chdirr[   r\   r   r^   )r`   s    r"   change_test_dirr4    s?      HW^#$$$	EEEHW^*+++++r$   c               #      K   g fd} t           j        }| t           _        	 V  |t           _        d S # |t           _        w xY w)Nc                 2                         |            d S rQ   )r   )	exception
exceptionss    r"   ehz)exception_handler_accumulator.<locals>.eh  s    )$$$$$r$   )r   exception_handler)r9  old_ehr8  s     @r"   exception_handler_accumulatorr<    sj      J% % % % % %F!F*#)   6 ))))s	   6 A)R__doc__atexitr.   rY   r1   r   rT   r   r  rC   r   
contextlibr   r   r   r   pandasr   pytestbokeh.clientr   bokeh.documentr   bokeh.io.docr	   r
   r   pyviz_commsr   panelr   r   panel.configr   panel.io.stater   
panel.paner   r   CUSTOM_MARKSapply_signaturesrA   rE   rB   r#   r6   rO   rW   fixturerc   registerrk   rr   rw   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+  r1  r4  r<  rV   r$   r"   <module>rN     s     				  				       % % % % % % " " " " " " " "      % % % % % % # # # # # # 8 8 8 8 8 8 8 8               ( ( ( ( ( ( , , , , , , , , % % % % % % % %.   3 3 31 1 1(5 5 5 N N N
        8(=  --B  30E  +*? !  0; ; ;    $   
 	      	 	 	       9 9 9 , , , 
$ 
$ 
$ , , ,                 : " " " ( ( ( 
 
 
                ) ) ) 
 
 
 , , ,
 * * * * *r$   