a
    Df}?                     @  sx  d dl m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Zd dlmZ d dlmZmZ d dlmZmZmZ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"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l0m1Z1m2Z2 ddl3m4Z4m3Z3 erRd dl5m6Z6 e	7e8Z9e"e#e$e&fZ:dZ;da<dd Z=da>g Z?ej@G dd dZAG dd deZBdd ZCdddd d!d"ZDdMd$d%ZEd&d' ZFd(d) ZGd*d+ ZHd,d- ZId.d/ ZJd0dd1d2d3ZKd0dd1d4d5ZLd6d6d7d8d9ZMdNd:d;ZNdOd<d=ZOed>d?d@dAZPedPdBdCdDdEZQedQddGdHdIdJdKdLZRdS )R    )annotationsN)contextmanager)partialwraps)TYPE_CHECKINGAnyCallableDictIteratorListOptional)SessionContext)Serializable)Document)ColumnDataChangedEventColumnsPatchedEventColumnsStreamedEventDocumentChangedEventModelChangedEvent) visit_immediate_value_references)CustomJS   )config)param_watchers   )LOADING_INDICATOR_CSS_CLASS)holdmonkeypatch_events)curdoc_lockedstate)HasProps   c                   C  s   t d u rt a t S N)_WRITE_LOCKasyncioLock r&   r&   ^/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/panel/io/document.py
WRITE_LOCK5   s    r(   c                   @  s&   e Zd ZU ded< ded< ded< dS )Requestdictheaderscookies	argumentsN)__name__
__module____qualname____annotations__r&   r&   r&   r'   r)   >   s   
r)   c                      sH   e Zd Zdd fdd
Zdd Zeddd	d
Zedd Z  ZS )MockSessionContextN)documentc                  s"   || _ t j|d d d| d S )N)Zserver_context
session_id)Z	_documentsuper__init__)selfr3   argskwargs	__class__r&   r'   r6   G   s    zMockSessionContext.__init__c                 G  s   d S r"   r&   )r7   r8   r&   r&   r'   with_locked_documentK   s    z'MockSessionContext.with_locked_documentboolreturnc                 C  s   dS )NFr&   r7   r&   r&   r'   	destroyedN   s    zMockSessionContext.destroyedc                 C  s   t i i i dS )N)r+   r,   r-   )r)   r@   r&   r&   r'   requestR   s    zMockSessionContext.request)	r.   r/   r0   r6   r<   propertyrA   rB   __classcell__r&   r&   r:   r'   r2   E   s   r2   c                 C  s   | t v rt |  d S r"   )_write_tasksremove)taskr&   r&   r'   _cleanup_taskV   s    rH   r   zList[DocumentChangedEvent]None)doceventsr?   c                 C  s   |D ]}| j | qdS )z\
    Handles dispatch of events which could not be processed in
    unlocked decorator.
    N)	callbacksZtrigger_on_change)rJ   rK   eventr&   r&   r'   _dispatch_eventsZ   s    rN   Tc              	   C  s(  | j D ]$}z|d  W q ty(   Y q0 qt| jdrDi | jjd < ddlm} i }ttj	
 D ]\}\}}}}	|| u r|| t||rg |_| D ] }
g |
_t|
i  i |
_i |
_qt|i  i |_i |_qb||| |	f||< qb|t_	|sd S | tjv rtj|  }i |_tj| = | d  d S )N_change_callbacksr   )Viewable)Zsession_destroyed_callbacks	ExceptionhasattrrL   rO   ZviewablerP   listr   Z_viewsitems_cleanup
isinstanceZ_hooksselectr   Z
_documentsZ_internal_callbacksZ
_templatesdestroy)rJ   rX   callbackrP   ZviewsrefZpanerootZvdocZcommptmplr&   r&   r'   _cleanup_docb   s>    





r^   c                   s   ddl m} t 4 I dH ~ | D ]b}z|I dH  W q  |yN   td Y q  ty } ztd|  W Y d}~q d}~0 0 q W d  I dH  q1 I dH s0    Y  dS )zF
    Ensure that all write_message calls are awaited and handled.
    r   )WebSocketClosedErrorNz/Failed sending message as connection was closedz/Failed sending message due to following error: )tornado.websocketr_   r(   loggerwarningrQ   )futuresr_   futureer&   r&   r'   _run_write_futures   s    rf   c              	   O  s`   z,t ||i |}t| |t W n. tyZ   | t|g|R i | Y n0 dS )z<
    Schedules tasks that write messages to the socket.
    N)	r$   Zensure_futurerE   appendZadd_done_callbackrH   RuntimeErroradd_next_tick_callbackr   )rJ   funcr8   r9   rG   r&   r&   r'   _dispatch_write_task   s    
rk   c                   s   ddl m} i }| D ]d\}}|j}t|drH|jjjdkrH|||< qt|j|rbt	||d}nt
||d}t|I dH  q|sdS tdI dH  t| t| | dS )z
    Writes messages to a socket, ensuring that the write_lock is not
    set, otherwise re-schedules the write task on the event loop.
    r   WebSocketHandler
write_lock)msgNg{Gz?)r`   rm   rT   _socketrR   rn   _block_valuerV   dispatch_tornadodispatch_djangorf   r$   sleeprk   _dispatch_msgs)rJ   msgsrm   	remainingconnro   socketrc   r&   r&   r'   rv      s    rv   c                  C  sJ   t  t  } tk r>tj tj| d }tj	dt
|d d S t  d S )Nseconds
gc.collectat)time	monotonic_panel_last_cleanupGC_DEBOUNCEdtdatetimenow	timedeltar   schedule_task_garbage_collectgcZcollect)Znew_timer   r&   r&   r'   r      s
    r   c                 C  s  |dur|  | | `| `| `d| _| j  | j  | jj	D ]&}|j
tjv rZtj|j
= |j  ~q@g | j_	tj| g D ]}|  q~ttD ]<}|dr|dkrqtt|}t|tjr| |v r|| = qt atj tjtd }tj dt!|d | `dS )a  
    Override for Document.destroy() without calling gc.collect directly.
    The gc.collect() call is scheduled as a task, ensuring that when
    multiple documents are destroyed in quick succession we do not
    schedule excessive garbage collection.
    N_Z_param_watchersr{   r}   r~   )"Zremove_on_changeZ_rootsZ_theme	_template_session_contextrL   rX   modelsmodulesZ_modulesr.   sys__dict__clearr   Z	_periodicgetstopdir
startswithgetattrrV   weakrefWeakKeyDictionaryr   r   r   r   r   r   r   r   r   r   )r7   sessionmodulecbattrZ	state_objr   r&   r&   r'   _destroy_document   s4    






r   zOptional[Document])rJ   r?   c                 C  s.   | pt  }|d u rt }nt|ts*|j}|S r"   )r   r   rV   Z_doc)rJ   curdocr&   r&   r'   create_doc_if_none_exists   s    

r   c              	   C  s   t | }|js|S t }|r(|tj|< tjrP|dt	dt
dtjdd |jj}tjd }||vrn|S || dtj  i |dtj |S )NZdocument_readyze
            const body = document.getElementsByTagName('body')[0]
            body.classList.remove(z, z)
            )codesessionsstarted)r   session_context	threading	get_identr   Z_thread_id_r   Zglobal_loading_spinnerZjs_on_eventr   r   Zloading_spinneridZsession_infoupdater   r   r   	timestampZon_eventZ_init_session)rJ   r   Z	thread_idr4   r   r&   r&   r'   init_doc  s&    

r   r   )rj   r?   c                   s>   t  r t  fdd}nt  fdd}d|_|S )a)  
    Wrap a callback function to execute with a lock allowing the
    function to modify bokeh models directly.

    Arguments
    ---------
    func: callable
      The callable to wrap

    Returns
    -------
    wrapper: callable
      Function wrapped to execute without a Document lock.
    c                    s    | i |I d H S r"   r&   r8   kwrj   r&   r'   wrapper-  s    zwith_lock.<locals>.wrapperc                    s    | i |S r"   r&   r   r   r&   r'   r   1  s    T)inspectiscoroutinefunctionr   lock)rj   r   r&   r   r'   	with_lock  s    
r   c           
   	   C  s   ddl m} | j}t|dd}|r*| r.g S |d u rD| jd|}|||j|||j	|||j
g}|jD ]:}t|j}| }	|||||j||	ddg qr|S )Nr   rl   Zws_connectionF	PATCH-DOCT)binary)r`   rm   rp   r   Z
is_closingprotocolcreateZwrite_messageheader_jsonmetadata_jsoncontent_json_buffersjsondumpsrZ   to_bytesextend)
ry   rK   ro   rm   rz   Zws_connrc   bufferheaderpayloadr&   r&   r'   rs   7  s&    

rs   c                 C  s   | j }|d u r| jd|}|j|jd|j|jd|j|jdg}|jD ]6}t	|j
}| }||j|d|j|dg qJ|S )Nr   )Z	text_data)Zbinary_data)rp   r   r   sendr   r   r   r   r   r   rZ   r   r   )ry   rK   ro   rz   rc   r   r   r   r&   r&   r'   rt   M  s    


rt   r
   r>   c                  c  s  t j} t| dd}t|dd}t jt jkrHt jrH|rHtd dV  dS | du sd|du sdt jrdt jrndV  dS | j	j
rdV  t| j	j dS ddlm} |j}|   d}g g  }}zzdV  d}|D ]*}	|	j}
t|
dr|
jjjdkrd	} qq| j	j}g | j	_t| |D ].}t|tr4|s4|| n
|| qg }|D ]>}	|sZqJn,t|	j|rx|t|	|7 }n|t|	|7 }qJ|rt | rt| t| n| tt| W n8 t y } z|dur|}|W Y d}~n
d}~0 0 W |rdd
d |D }dd |D }i }|D ]"}	|s0q"|	j!"d|||	< q"t| t#| | | j	 j|7  _| $  nv|rd
d |D }dd |D }i }|D ]"}	|sq|	j!"d|||	< qt| t#| | | j	 j|7  _| $  0 dS )z
    Context manager which unlocks a Document and dispatches
    ModelChangedEvents triggered in the context body to all sockets
    on current sessions.
    r   Nr   zUsing the unlocked decorator when running inside a thread is not safe! Ensure you check that pn.state._current_thread matches the current thread id.r   rl   Frn   Tc                 S  s   g | ]}t |ts|qS r&   rV   r   .0re   r&   r&   r'   
<listcomp>      zunlocked.<locals>.<listcomp>c                 S  s   g | ]}t |tr|qS r&   r   r   r&   r&   r'   r     r   r   )%r   r   r   Z_current_threadZ
_thread_idZloadedra   errorZ_jupyter_kernel_contextrL   Z
hold_valuer   _held_eventsr`   rm   Z_subscribed_connectionsr   rp   rR   rn   rq   rr   rV   DISPATCH_EVENTSrg   rs   rt   
_unblockedrk   rf   ri   r   rQ   r   r   rv   unhold)r   r   r   rm   connectionsrK   Zremaining_eventsZdispatch_eventslockedry   rz   rM   rc   re   Zleftover_eventsrw   r&   r&   r'   unlocked_  s    


r   zDocument | None)rJ   c                 c  s   | pt j} | r| jrt | s(dV  dS | jj}| jj}g | j_| j  t  dV  W d   n1 sl0    Y  || j_|| j_dS )a$  
    Context manager to trigger immediate dispatch of events triggered
    inside the execution context even when Document events are
    currently on hold.

    Arguments
    ---------
    doc: Document
        The document to dispatch events on (if `None` then `state.curdoc` is used).
    N)	r   r   r   r   rL   r   Z_holdr   r   )rJ   Z
old_eventsZheldr&   r&   r'   immediate_dispatch  s    

$r   Fr    zDict[str, Any]r=   )rJ   model
propertiesforcec                 #  st   |r
d nDd dd fdd}|  D ]$\}}tt||d| t|| q( r\| j  dV   rp| j  dS )zd
    Freezes the document model references if any of the properties
    are themselves a model.
    r   r   r    r   c                   s    d7  d S )Nr   r&   r   Zdirty_countr&   r'   
mark_dirty  s    zfreeze_doc.<locals>.mark_dirtyN)rT   r   r   r   Z_push_freezeZ_pop_freeze)rJ   r   r   r   r   keyvaluer&   r   r'   
freeze_doc  s    
r   )T)NN)NN)N)F)S
__future__r   r$   Zdataclassesr   r   r   r   r   loggingr   r   r   r   
contextlibr   	functoolsr   r   typingr   r   r   r	   r
   r   r   Zbokeh.application.applicationr   Zbokeh.core.serializationr   Zbokeh.document.documentr   Zbokeh.document.eventsr   r   r   r   r   Zbokeh.model.utilr   Zbokeh.modelsr   r   utilr   Zloadingr   r   r   r   r   r   Zbokeh.core.has_propsr    	getLoggerr.   ra   r   r   r#   r(   r   rE   Z	dataclassr)   r2   rH   rN   r^   rf   rk   rv   r   r   r   r   r   rs   rt   r   r   r   r&   r&   r&   r'   <module>   st   $

+6

`