a
    DfE-                     @   s  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
mZ d dlmZ d dlZd dlZd dlZd dlmZ d dlZd dlmZ d dlmZ eejZzd dlZeejZW n ey   d\ZZY n0 ej j!edu peedk d	d
Z"zd dl#Z$e$%d W n ey2   dZ$Y n0 ej j!e$du dd
Z&zd dl'Z'W n eyl   dZ'Y n0 ej j!e'du dd
Z(zd dl)Z)W n ey   dZ)Y n0 ej j!e)du dd
Z*e+dZ,dej-v Z.ej j!e/ dkdd
Z0d dl1m2Z2 d dl3m4Z4 d dl5m6Z6 dd Z7dd Z8d6ddZ9d7ddZ:d d! Z;d8d"d#Z<d9d&d'Z=d:d)d*Z>d;d,d-Z?ej@d<d.d/ZAG d0d1 d1ZBd2d3 ZCd4d5 ZDdS )=    N)EmptyQueue)Thread)Version)serve)state)NNz	1.13.0a23zrequires holoviews)reasonZAggzrequires matplotlibzrequires streamzzrequires jupyter_bokehz-Bokeh app running at: http://localhost:(\d+)/posixLinuxzOnly supported on Linux)Alert)Markdown)_ButtonBasec                  C   s@   dd l m}  |  }|d}|tjdd | | |S )Nr   o   
      )	Zmatplotlib.pyplotZpyplotfigureZadd_subplotZplotnprandomZrandclose)ZpltZfigax r   ]/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/panel/tests/util.py
mpl_figureB   s    

r   c                 C   sd  ddi| _ |j d dksJ dg| _t| trB|jg dksJ nLt| tr`|jddgksJ n.t| tr~|jddgksJ n|jdgksJ d| _|jdksJ d| _|jdksJ d	| _|jd	ksJ d
| _	|j	d
ksJ d| _
|j
dksJ d| _|jdksJ d| _|jdksJ d| _|jdks4J d| _|jdksJJ d| _|jdks`J d S )NZ
backgroundz#fffff0custom_class)markdownr   alertzalert-primaryr   Zsolidi  i  i,     iX  i&  r   Zstretch_widthmaxmin)ZstylesZcss_classes
isinstancer   r   r   widthheightZ
min_heightZ	min_widthZ
max_height	max_widthmarginZsizing_modeZwidth_policyZheight_policy)Z
layoutablemodelr   r   r   check_layoutable_propertiesK   s<    



r%     d   c           	   
      s   d}t     fdd}d d}z
|  }W n4 tyd } z| rPt||W Y d}~nBd}~0 0 |dvr|td||du rdS |rdS | rt||r|| q&t |d	  q&dS )
a  
    Exercice a test function in a loop until it evaluates to True
    or times out.

    The function can either be a simple lambda that returns True or False:
    >>> wait_until(lambda: x.values() == ['x'])

    Or a defined function with an assert:
    >>> def _()
    >>>    assert x.values() == ['x']
    >>> wait_until(_)

    In a Playwright context test you should pass the page fixture:
    >>> wait_until(lambda: x.values() == ['x'], page)

    Parameters
    ----------
    fn : callable
        Callback
    page : playwright.sync_api.Page, optional
        Playwright page
    timeout : int, optional
        Total timeout in milliseconds, by default 5000
    interval : int, optional
        Waiting interval, by default 100

    Adapted from pytest-qt.
    Tc                     s   t     } | d }|kS N  timeelapsedZ
elapsed_msstarttimeoutr   r   	timed_out   s    zwait_until.<locals>.timed_outzwait_until timed out in  millisecondsNNTFz@`wait_until` callback must return None, True or False, returned r)   )r+   AssertionErrorTimeoutError
ValueErrorwait_for_timeoutsleep	fnpager0   intervalZ__tracebackhide__r1   Ztimeout_msgresulter   r.   r   
wait_untilx   s0    
 r?   c           	   
      s   d}t     fdd}d d}z|  }t|rB|I dH }W n4 tyx } z| rdt||W Y d}~nBd}~0 0 |dvrtd||du rdS |rdS | rt||r||I dH  q&t|d	 I dH  q&dS )
a0  
    Exercise a test function in a loop until it evaluates to True
    or times out.

    The function can either be a simple lambda that returns True or False:
    >>> await async_wait_until(lambda: x.values() == ['x'])

    Or a defined function with an assert:
    >>> async def _()
    >>>    assert x.values() == ['x']
    >>> await async_wait_until(_)

    In a Playwright context test, you should pass the page fixture:
    >>> await async_wait_until(lambda: x.values() == ['x'], page)

    Parameters
    ----------
    fn : callable
        Callback
    page : playwright.async_api.Page, optional
        Playwright page
    timeout : int, optional
        Total timeout in milliseconds, by default 5000
    interval : int, optional
        Waiting interval, by default 100

    Adapted from pytest-qt.
    Tc                     s   t     } | d }|kS r(   r*   r,   r.   r   r   r1      s    z#async_wait_until.<locals>.timed_outzasync_wait_until timed out in r2   Nr3   zG`async_wait_until` callback must return None, True, or False, returned r)   )r+   asyncioiscoroutiner4   r5   r6   r7   r8   r9   r   r.   r   async_wait_until   s4    
 rB   c                   C   s0   t jdv rdS t jdkrdS tdt j dS )z8
    Get the CTRL modifier on the current platform.
    )linuxwin32ZControldarwinZMetaz)No control modifier defined for platform N)sysplatformr6   r   r   r   r   get_ctrl_modifier  s
    

rH   c              	      sn   | dt j t| f|pdddd |p,dd| t fdd| tj  d }|j}t	||d	 |S )
N	server_idr   TF )portZthreadedshowZlivenessrI   prefixc                      s
    t jv S N)r   _serversr   rI   r   r   <lambda>      z serve_and_wait.<locals>.<lambda>)rM   )
popuuiduuid4hexr   r?   r   rO   rK   wait_for_server)appr;   rM   rK   kwargsserverr   rP   r   serve_and_wait  s    &r[   rJ   Tc                    s`   g  |  d fdd t|| fi |}| d| |  |rXt fdd| dd  |fS )Nconsolec                    s
     | S rN   )append)msgZmsgsr   r   rQ     rR   z!serve_component.<locals>.<lambda>http://localhost:c                      s   t dd  D S )Nc                 s   s   | ]}d t |v V  qdS )z"Websocket connection 0 is now openN)str).0r^   r   r   r   	<genexpr>!  rR   z4serve_component.<locals>.<lambda>.<locals>.<genexpr>)anyr   r_   r   r   rQ   !  rR   r   )r<   )onr[   gotor?   )r;   rX   suffixwaitrY   rK   r   r_   r   serve_component  s    ri      c                    sD   t | fd i|  fddt|D }t|dkr@|d S |S )NrK   c                    s    g | ]}t d    qS )r`   )requestsget)rb   irK   rg   r   r   
<listcomp>(  rR   z%serve_and_request.<locals>.<listcomp>rj   r   )r[   rangelen)rX   rg   nrK   rY   reqsr   rn   r   serve_and_request&  s    rt      c                 C   sx   t   }|pd}d|  | d}zt|jr4W d S W n tyH   Y n0 t d t   | |kr t| dq d S )NrJ   r`   z	/livenessg?z  did not respond before timeout.)r+   rk   rl   ok	Exceptionr8   RuntimeError)rK   rM   r0   r/   urlr   r   r   rW   ,  s    

rW   c                 c   s   t jdddg|  }tj|tjtjd|td}z
|V  W nv ty } z^|  |	  t
d| z"|j  }t
d t
| W n ty   Y n0  W Y d }~nd }~0 0 |  |	  d S )Nz-mpanelr   F)stdoutstderrshellcwd	close_fdszAn error occurred: %sz%
---- subprocess stdout follows ----
)rF   
executable
subprocessPopenPIPESTDOUTON_POSIXrw   	terminaterh   printr{   readdecode)argsr~   cmdpr>   outr   r   r   run_panel_serve;  s"    

r   c                   @   s$   e Zd ZddddZdddZdS )NBSRN)returnc                 C   sB   || _ t | _dd }t|| j | jfd| _d| j_| j  dS )z
        NonBlockingStreamReader

        stream: the stream to read from.
                Usually a process' stdout or stderr.
        c                 S   s(   t | jdD ]}|| q|   dS )zN
            Collect lines from 'stream' and put them in 'queue'.
            rR   N)iterreadlineputr   )streamqueueliner   r   r   _populateQueue]  s    z%NBSR.__init__.<locals>._populateQueue)targetr   TN)Z_sr   _qr   Z_tdaemonr/   )selfr   r   r   r   r   __init__R  s    
zNBSR.__init__c                 C   s0   z| j j|d u|dW S  ty*   Y d S 0 d S )N)blockr0   )r   rl   r   )r   r0   r   r   r   r   j  s    zNBSR.readline)N)__name__
__module____qualname__r   r   r   r   r   r   r   Q  s   r   c                 C   s   t | }d }g }tdD ]>}|d}|s,q|d}|| t|}|d ur qXq|d u rzd|}t	d|  t
|dS )N   g      ?zutf-8z
    zKNo matching log line in process output, following output was captured:

   rj   )r   rp   r   r   r]   APP_PATTERNsearchjoinpytestZfailintgroup)r{   Znbsrmoutput_or   r   r   r   wait_for_ports  s(    




r   c                 C   s*   | |  |  t| |d d S )Nr   )writeflushosfsyncseek)contentZfile_objr   r   r   
write_file  s    

r   )Nr&   r'   )Nr&   r'   )NNN)rJ   T)rJ   rj   N)Nru   )N)Er@   
contextlibr   rG   rer   rF   r+   rT   r   r   r   	threadingr   numpyr   r   rk   Zpackaging.versionr   rz   ZpnZpanel.io.serverr   Zpanel.io.stater   __version__ZpnvZ	holoviewsZhvZ
hv_versionrw   markZskipifZhv_availableZ
matplotlibZmplZuseZmpl_availableZstreamzZstreamz_availableZjupyter_bokehZjb_availablecompiler   builtin_module_namesr   systemZ
linux_onlyZpanel.pane.alertr   Zpanel.pane.markupr   Zpanel.widgets.buttonr   r   r%   r?   rB   rH   r[   ri   rt   rW   contextmanagerr   r   r   r   r   r   r   r   <module>   s|   





	-
E
G




"