
    Bee'                        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 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j-        d             Z. ej/        e,           dddddddddddddd d!dd"Z0d# Z1d$ Z2d% Z3ej-        d&             Z4 e*            gZ5ej-        d'             Z6ej-        d(             Z7ej-        d)             Z8ej-        d*             Z9ej-        d+             Z:ej-        d,             Z;ej-        d-             Z<ej-        d.             Z=ej-        d/             Z> ej-                    d0             Z? ej-                    d1             Z@ej-        d2             ZAej-        d3             ZBed4             ZC ej-        d56          d7             ZD ej-        d56          d8             ZE ej-        d56          d9             ZFej-        d:             ZGej-        d;             ZHej-        d<             ZIej-        d=             ZJej-        d>             ZKej-        d?             ZLdS )@z5
A module containing testing utilities and fixtures.
    N)contextmanager)PIPEPopen)pull_sessionDocumentComm)configserve)panel_extension)
set_curdoc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_portr5   .   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_TIMEOUTr9   readlinesleepTimeoutErrorr,   split)argsprocessdeadlinelinehosts        r!   start_jupyterrN   4   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)rA   r-   killpidsignalSIGTERM r#   r!   cleanup_jupyterrV   H   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absoluter@   r?   )requestpathrels      r!   jupyter_previewrb   L   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_trueFrc   )actiondefaultrc   )optional_markersitems	addoptionformat)parsermarkerinfos      r!   pytest_addoptionrq   k   sf    (..00 ; ;v..|!&T&\ 	 	; 	; 	; 	;; ;r#   c           	         t                                           D ]0\  }} | j        dd                    ||d                              1t	          | j        d          r$t          t                    st                       d S d S d S )Nmarkersz{}: {}rd   r   )	rj   rk   addinivalue_linerm   getattroptionr"   r@   rN   )r   ro   rp   s      r!   pytest_configurerw   q   s    (..00 O O	 (^8L M M	O 	O 	O 	Ov}i(( <1H1H    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 rP   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 rP   r   r   s     r!   r   z0pytest_collection_modifyitems.<locals>.<genexpr>   s*      CCaqDM1CCCCCCr#   )rk   )rj   anyappendhookpytest_deselected)r   rk   skippedselectedrs   emptyr   s   `     @r!   pytest_collection_modifyitemsr   y   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 rP   r   rU   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 rP   rU   )session_contexts   r!   <lambda>z!server_document.<locals>.<lambda>   s    ? 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                      t                      S rP   r	   rU   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.   r/   r,   PORTr0   r1   )r3   r2   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	DataFramerU   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namer0   r1   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   rm   r   r   stopAssertionErrorr   htmlr7   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   rm   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appsr7   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   r7   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rP   )r   curdocr   )
old_curdocs    r!   with_curdocr   %  sD      J::EL"!z!!!!s	   : Ac              #      K   t           j                            |           }|t           j        | <   d V  |t           j        | = d S |t           j        | <   d S rP   )r-   r.   r/   )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 rP   )
__module__
startswith)r{   trr   s     r!   r   z,module_cleanup.<locals>.<dictcomp>.<genexpr>C  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>A  sS     ' ' '#eFFFFXFFFFF'e' ' 'r#   N)bokeh.core.has_propsr   listr   _importsvalues_known_modelsrk   )r   r  s    @r!   module_cleanupr  9  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   resetrU   r#   r!   server_cleanupr  F  s3      
s    2c                  ,    t          j                     d S rP   )r   clear_cachesrU   r#   r!   cache_cleanupr  P  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  T  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   \  sL      		$#g	>	>	>B









r  c               #   f   K   dt           _        	 dV  d t           _        d S # d t           _        w xY w)Nr>   )r   nthreadsrU   r#   r!   threadsr#  d  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_funcsrU   r#   r!   r%  r%  l  s       F) %"& &&((((( !&"& &&((((s   A* *AC c               #      K   d V  d S rP   rU   rU   r#   r!   	nothreadsr+  w  s      	EEEEEr#   c              #      K   t          j        | j        j                   d V  t          j        | j        j                   d S rP   )r-   chdirrZ   r[   r   r]   )r_   s    r!   change_test_dirr.  {  s?      HW^#$$$	EEEHW^*+++++r#   )M__doc__atexitr-   rX   r0   r   rS   r   r  rB   r   
contextlibr   r   r   r   pandasr   pytestbokeh.clientr   bokeh.documentr   pyviz_commsr
   panelr   r   panel.configr   panel.io.stater   r   
panel.paner   r   CUSTOM_MARKSapply_signaturesr@   rD   rA   r"   r5   rN   rV   fixturerb   registerrj   rq   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+  r.  rU   r#   r!   <module>r?     sa     				  				       % % % % % % " " " " " " " "      % % % % % % # # # # # #               ( ( ( ( ( ( , , , , , , , , % % % % % % % %.   3 3 31 1 1(5 5 5 N N N
        8(=  --B  30E  +*? !  0; ; ;    $   
 	            9 9 9 , , , 
$ 
$ 
$ , , ,                 : " " " ( ( ( 
 
 
                ) ) ) 
 
 
 , , , , ,r#   