a
    @DfA                     @  s  d Z ddlmZ ddlZeeZddl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 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m Z m!Z!m"Z"m#Z#m$Z$m%Z% ddl&m'Z' erddl(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/ ddlm0Z0m1Z1m2Z2 dZ3eg df Zedef Z4eegdf Z5eegdf Z6G dd dZ7ddddddZ8dd dd!d"d#Z9dd$d$dd%d&Z:dS )'zX Encapulate the management of Document callbacks with a
DocumentCallbackManager class.

    )annotationsN)defaultdictwraps)TYPE_CHECKINGAnyCallable   )
HoldPolicyHoldPolicyType)_CONCRETE_EVENT_CLASSESDocumentEventEvent
ModelEvent)Model)Callback)_check_callback   )DocumentPatchedEventModelChangedEventRootAddedEventRootRemovedEventSessionCallbackAddedSessionCallbackRemovedTitleChangedEvent)UnlockedDocumentProxy)SessionDestroyedCallback)Setter)SessionCallback)Document)DocumentChangeCallbackDocumentChangedEventInvoker)	DocumentCallbackManagerr   invoke_with_curdocr   r   r   r   r   r   .c                
   @  s.  e Zd ZU dZded< ded< ded< ded	< d
ed< ded< ded< ded< dZded< ded< ddddZeddddZedddd Z	e	j
dd!d"d#d Z	d$d%d&d$d'd(d)Zd!dd*d+Zdtd-d!d.d/d0Zeddd1d2Zdud3d4d5d5d6d7d8d!d9d:d;Zd3d<d=d!d>d?d@ZdAd!d"dBdCZd5d!dDdEdFZdGdHd!dIdJdKZdGdLd!dIdMdNZdGdOd!dIdPdQZd4dRd!dSdTdUZdVd!d"dWdXZd5d!d"dYdZZd4dRd!d[d\d]Zd$d!d^d_d`Zd4d3d!dadbdcZd4dddedfdgZdhddidjZdkd!dldmdnZdod!dldpdqZd!ddrdsZ dS )vr#   z Manage and provide access to all of the models that belong to a Bokeh
    Document.

    The set of "all models" means specifically all the models reachable from
    references form a Document's roots.

    zweakref.ReferenceType[Document]	_documentz!dict[Any, DocumentChangeCallback]_change_callbackszdict[str, list[EventCallback]]_event_callbacksz dict[str, list[JSEventCallback]]_js_event_callbacksz dict[str, list[MessageCallback]]_message_callbackszset[SessionDestroyedCallback]_session_destroyed_callbackszset[SessionCallback]_session_callbacksz,dict[str, set[weakref.ReferenceType[Model]]]_subscribed_modelsNzHoldPolicyType | None_holdlist[DocumentChangedEvent]_held_eventsr   )documentc                 C  sh   t || _i | _tt| _tt| _tt| _t	 | _
t	 | _tt	| _d| _g | _| d| j dS )z

        Args:
            document (Document): A Document to manage models for
                A weak reference to the Document will be retained

        NZbokeh_event)weakrefrefr%   r&   r   listr'   r(   r)   setr*   r+   r,   r-   r/   
on_messagetrigger_event)selfr0    r8   e/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/bokeh/document/callbacks.py__init__m   s    



z DocumentCallbackManager.__init__zlist[SessionCallback]returnc                 C  s
   t | jS )zA A list of all the session callbacks for this document.

        )r3   r+   r7   r8   r8   r9   session_callbacks   s    z)DocumentCallbackManager.session_callbacksc                 C  s   | j S )zN A list of all the on_session_destroyed callbacks for this document.

        r*   r=   r8   r8   r9   session_destroyed_callbacks   s    z3DocumentCallbackManager.session_destroyed_callbacksNone)	callbacksr<   c                 C  s
   || _ d S Nr?   )r7   rB   r8   r8   r9   r@      s    r   r   bool)callback_objcallbackone_shotr<   c                   sp     }|du rtd|r@t dd fdd}|}n }t||_j t| S )a   Internal implementation for adding session callbacks.

        Args:
            callback_obj (SessionCallback) :
                A session callback object that wraps a callable and is
                passed to ``trigger_on_change``.

            callback (callable) :
                A callable to execute when session events happen.

            one_shot (bool) :
                Whether the callback should immediately auto-remove itself
                after one execution.

        Returns:
            SessionCallback : passed in as ``callback_obj``.

        Raises:
            ValueError, if the callback has been previously added

        Nz@Attempting to add session callback to already-destroyed DocumentrA   r;   c                     s   j v r   S rC   )r+   remove_session_callbackr8   rF   rE   r7   r8   r9   remove_then_invoke   s    

zHDocumentCallbackManager.add_session_callback.<locals>.remove_then_invoke)	r%   RuntimeErrorr   _wrap_with_curdocZ	_callbackr+   addtrigger_on_changer   )r7   rE   rF   rG   docrJ   Zactual_callbackr8   rI   r9   add_session_callback   s    z,DocumentCallbackManager.add_session_callbackc                 C  s<   | j   | ` | j  | `| j  | `| j  | `dS )z6 Clean up references to the Documents models

        N)r&   clearr'   r(   r)   r=   r8   r8   r9   destroy   s    



zDocumentCallbackManager.destroycombiner   )policyr<   c                 C  sR   | j d ur2| j |kr2td| j  d| d d S |tvrHtd| || _ d S )Nzhold already active with 'z', ignoring ''zUnknown hold policy )r-   logwarningr
   
ValueError)r7   rT   r8   r8   r9   hold   s    zDocumentCallbackManager.holdc                 C  s   | j S rC   )r-   r=   r8   r8   r9   
hold_value   s    z"DocumentCallbackManager.hold_valuer   strr   zDocumentPatchedEvent | NonezSetter | NonezInvoker | None)modelattroldnewhintsettercallback_invokerr<   c           
      C  s   |   }|du rdS |dkr,|j||| |du rX|||}t||||||}	n(|jdu sfJ ||_|jdu r|||_|}	| |	 dS )z* Called by Model when it changes

        Nname)	r%   modelsZupdate_namelookup	get_valuer   rb   ra   rN   )
r7   r\   r]   r^   r_   r`   ra   rb   rO   eventr8   r8   r9   notify_change   s    
z%DocumentCallbackManager.notify_changer   r"   )r\   rg   rb   r<   c                 C  s"   |   }|du rdS t|| dS z


        N)r%   r$   )r7   r\   rg   rb   rO   r8   r8   r9   notify_event   s    z$DocumentCallbackManager.notify_eventr    c                 G  s.   |D ]$}|| j v rqt|d || j |< qdS )zm Provide callbacks to invoke if the document or any Model reachable
        from its roots changes.

        rg   N)r&   r   r7   rB   rF   r8   r8   r9   	on_change  s
    

z!DocumentCallbackManager.on_change)receiverr<   c                   s     | j vr fdd| j  < d S )Nc                   s
   |   S rC   )dispatchrk   rn   r8   r9   <lambda>      z?DocumentCallbackManager.on_change_dispatch_to.<locals>.<lambda>r&   )r7   rn   r8   rp   r9   on_change_dispatch_to  s    
z-DocumentCallbackManager.on_change_dispatch_tozstr | type[Event]EventCallback)rg   rB   r<   c                 G  s   | j |g|R   dS )zD Provide callbacks to invoke if a bokeh event is received.

        N	_on_eventr7   rg   rB   r8   r8   r9   on_event  s    z DocumentCallbackManager.on_eventJSEventCallbackc                 G  s   | j |g|R   dS )zG Provide JS callbacks to invoke if a bokeh event is received.

        Nrv   rx   r8   r8   r9   js_on_event  s    z#DocumentCallbackManager.js_on_eventzEventCallback | JSEventCallbackc                 G  s   t |tst|tr|j}|tvr0td| tt| tsFtd|D ]>}t |trj| j	| 
| qJt|ddd | j| 
| qJd S )NzUnknown event zDocument.on_event may only be used to subscribe to events of type DocumentEvent. To subscribe to a ModelEvent use the Model.on_event method.rk   zEvent callback)what)
isinstancer[   
issubclassr   
event_namer   rX   r   rz   r(   appendr   r'   )r7   rg   rB   rF   r8   r8   r9   rw   "  s    
z!DocumentCallbackManager._on_eventMessageCallback)msg_typerB   r<   c                 G  s   | j | | d S rC   )r)   extend)r7   r   rB   r8   r8   r9   r5   5  s    z"DocumentCallbackManager.on_messager   c                 G  s$   |D ]}t |d | j| qdS )za Provide callbacks to invoke when the session serving the Document
        is destroyed

        )Zsession_contextN)r   r*   rM   rl   r8   r8   r9   on_session_destroyed8  s    
z,DocumentCallbackManager.on_session_destroyedc                 G  s   |D ]}| j |= qdS )z Remove a callback added earlier with ``on_change``.

        Raises:
            KeyError, if the callback was never added

        Nrs   rl   r8   r8   r9   remove_on_changeA  s    z(DocumentCallbackManager.remove_on_change)r   rF   r<   c                 C  s,   | j |d}|dur(||v r(|| dS ri   )r)   getremove)r7   r   rF   Zmessage_callbacksr8   r8   r9   remove_on_messageK  s    z)DocumentCallbackManager.remove_on_message)rE   r<   c                 C  sd   z|g}| j | W n ty0   tdY n0 |  }|du rFdS |D ]}| t|| qJdS )z Remove a callback added earlier with ``add_periodic_callback``,
        ``add_timeout_callback``, or ``add_next_tick_callback``.

        Returns:
            None

        Raises:
            KeyError, if the callback was never added

        zDcallback already ran or was already removed, cannot be removed againN)r+   r   KeyErrorrX   r%   rN   r   )r7   rE   Zcallback_objsrO   r8   r8   r9   rH   S  s    z/DocumentCallbackManager.remove_session_callback)keyr\   r<   c                 C  s   | j | t| d S rC   )r,   rM   r1   r2   )r7   r   r\   r8   r8   r9   	subscribel  s    z!DocumentCallbackManager.subscribeztuple[EventCallback, ...])r   r<   c                 C  s   t | j|g S )z Return a tuple containing all current event callbacks for the given
        event name.

        Args:
            event_name (str) : the event name to look up callbacks for

        )tupler'   r   )r7   r   r8   r8   r9   event_callbacks_for_event_nameo  s    z6DocumentCallbackManager.event_callbacks_for_event_namez"tuple[DocumentChangeCallback, ...]c                 C  s   t | j S )zB Return a tuple containing all current change callbacks.

        )r   r&   valuesr=   r8   r8   r9   change_callbacksy  s    z(DocumentCallbackManager.change_callbacksr   )rg   r<   c                 C  sV   t |tr8| j|j  }|D ]}| }|r|| q| |jD ]}|| qDd S rC   )r}   r   r,   r   copyZ_trigger_eventr   )r7   rg   Z
subscribedZ	model_refr\   cbr8   r8   r9   r6     s    
z%DocumentCallbackManager.trigger_eventr!   c                   s     }|d u rd S jdkr.j  d S jdkrHt j d S  jd ur^t| j dd fdd}t|| d S )NZcollectrS   rA   r;   c                    s     D ]} |   qd S rC   )r   )r   rg   r7   r8   r9   invoke_callbacks  s    zCDocumentCallbackManager.trigger_on_change.<locals>.invoke_callbacks)r%   r-   r/   r   _combine_document_eventsrb   r$   )r7   rg   rO   r   r8   r   r9   rN     s    


z)DocumentCallbackManager.trigger_on_changec                 C  s<   | j du rdS d| _ t| j}g | _|D ]}| | q(dS )zo Turn off any active document hold and apply any collected events.

        Returns:
            None

        N)r-   r3   r/   rN   )r7   eventsrg   r8   r8   r9   unhold  s    

zDocumentCallbackManager.unhold)rS   )NNN)!__name__
__module____qualname____doc____annotations__r-   r:   propertyr>   r@   ra   rP   rR   rY   rZ   rh   rj   rm   rt   ry   r{   rw   r5   r   r   r   rH   r   r   r   r6   rN   r   r8   r8   r8   r9   r#   V   sT   
, 	

r#   r   zCallable[[], None]rA   )rO   fr<   c                 C  sV   ddl m} t|ddr t| n| }|| | W  d    S 1 sH0    Y  d S )Nr	   )patch_curdocZnolockF)Zio.docr   getattrr   )rO   r   r   Zcurdocr8   r8   r9   r$     s    
r$   r!   r.   )	new_event
old_eventsr<   c                 C  s,   t |D ]}|| r dS q||  dS )a   Attempt to combine a new event with a list of previous events.

    The ``old_event`` will be scanned in reverse, and ``.combine(new_event)``
    will be called on each. If a combination can be made, the function
    will return immediately. Otherwise, ``new_event`` will be appended to
    ``old_events``.

    Args:
        new_event (DocumentChangedEvent) :
            The new event to attempt to combine

        old_events (list[DocumentChangedEvent])
            A list of previous events to attempt to combine new_event with

            **This is an "out" parameter**. The values it contains will be
            modified in-place.

    Returns:
        None

    N)reversedrS   r   )r   r   rg   r8   r8   r9   r     s    
r   zCallable[..., Any]c                   s$   t dddd fdd}|S )Nr   rA   )argskwargsr<   c                    s(   t dd fdd}t|S )Nr   r;   c                     s    i S rC   r8   r8   )r   r   r   r8   r9   invoke  s    z2_wrap_with_curdoc.<locals>.wrapper.<locals>.invoke)r   r$   )r   r   r   rO   r   )r   r   r9   wrapper  s    z"_wrap_with_curdoc.<locals>.wrapperr   )rO   r   r   r8   r   r9   rL     s    rL   );r   
__future__r   logging	getLoggerr   rV   r1   collectionsr   	functoolsr   typingr   r   r   Z
core.enumsr
   r   r   r   r   r   r   r\   r   Zmodels.callbacksr   rz   Zutil.callback_managerr   r   r   r   r   r   r   r   Zlockingr   Zapplication.applicationr   Zcore.has_propsr   Zserver.callbacksr   r0   r   r    r!   r"   __all__Z
Originatorr   ru   r#   r$   r   rL   r8   r8   r8   r9   <module>   s>   
$	  a