
    -eA                       d Z ddlmZ ddlZ ej        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         Z6 G d d          Z7d'dZ8d(d$Z9d)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                     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Zed`d            Zedad            Z	e	j
        dbd             Z	dcd'Zddd(Zdedfd,Zedgd-            Z	 dhdid;Zdjd?ZdkdAZdldCZdmdFZdndHZdodJZdpdMZdqdOZdrdPZdsdQZdtdRZdudTZdvdWZdwdYZdxd[Zdyd]Zddd^Z dS )zr$   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_callbacksset[SessionDestroyedCallback]_session_destroyed_callbackszset[SessionCallback]_session_callbacksz,dict[str, set[weakref.ReferenceType[Model]]]_subscribed_modelsNHoldPolicyType | None_holdlist[DocumentChangedEvent]_held_eventsdocumentr    c                   t          j        |          | _        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

        Nbokeh_event)weakrefrefr'   r(   r   listr)   r*   r+   setr-   r.   r/   r1   r3   
on_messagetrigger_event)selfr4   s     8lib/python3.11/site-packages/bokeh/document/callbacks.py__init__z DocumentCallbackManager.__init__m   s     !X..!# +D 1 1#.t#4#4 "-d"3"3,/EE)"%%%"-c"2"2
t'9:::::    returnlist[SessionCallback]c                *    t          | j                  S )zA A list of all the session callbacks for this document.

        )r9   r.   r=   s    r>   session_callbacksz)DocumentCallbackManager.session_callbacks   s    
 D+,,,r@   c                    | j         S )zN A list of all the on_session_destroyed callbacks for this document.

        r-   rD   s    r>   session_destroyed_callbacksz3DocumentCallbackManager.session_destroyed_callbacks   s    
 00r@   	callbacksNonec                    || _         d S NrG   )r=   rI   s     r>   rH   z3DocumentCallbackManager.session_destroyed_callbacks   s    ,5)))r@   callback_objr   callbackr   one_shotboolc                B                                      }|t          d          |r t                    d f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   rJ   c                 T    j         v r                                             S rL   )r.   remove_session_callback)rN   rM   r=   s   r>   remove_then_invokezHDocumentCallbackManager.add_session_callback.<locals>.remove_then_invoke   s1    4#:::00>>>xzz!r@   rA   rJ   )	r'   RuntimeErrorr   _wrap_with_curdoc	_callbackr.   addtrigger_on_changer   )r=   rM   rN   rO   docrT   actual_callbacks   ```    r>   add_session_callbackz,DocumentCallbackManager.add_session_callback   s    , nn;abbb 	'8__" " " " " " " _" 1OO&O!23!H!H##L111 	3CFFGGGr@   c                    | j                                          | ` | j                                         | `| j                                         | `| j                                         | `dS )z6 Clean up references to the Documents models

        N)r(   clearr)   r*   r+   rD   s    r>   destroyzDocumentCallbackManager.destroy   sv     	$$&&&"##%%%! &&((($%%'''###r@   combinepolicyr   c                    | j         3| j         |k    r(t                              d| j          d| d           d S |t          vrt	          d|           || _         d S )Nzhold already active with 'z', ignoring ''zUnknown hold policy )r1   logwarningr   
ValueError)r=   rb   s     r>   holdzDocumentCallbackManager.hold   sp    :!djF&:&:KKWTZWWfWWWXXXF##<F<<===


r@   c                    | j         S rL   )r1   rD   s    r>   
hold_valuez"DocumentCallbackManager.hold_value   s
    zr@   modelr   attrstroldr   newhintDocumentPatchedEvent | NonesetterSetter | Nonecallback_invokerInvoker | Nonec                b   |                                  }|dS |dk    r|j                            |||           |=|                    |                              |          }t          ||||||          }	n |j        J ||_        |j        ||_        |}	|                     |	           dS )z* Called by Model when it changes

        Nname)	r'   modelsupdate_namelookup	get_valuer   rt   rr   rZ   )
r=   rk   rl   rn   ro   rp   rr   rt   r[   events
             r>   notify_changez%DocumentCallbackManager.notify_change   s    
 nn;F 6>>J""5#s333 <,,t$$..u55C%c5$VEUVVEE(000$4D!{"$Eu%%%%%r@   r|   r   r#   c                V    |                                  }|dS t          ||           dS z


        N)r'   r%   )r=   rk   r|   rt   r[   s        r>   notify_eventz$DocumentCallbackManager.notify_event   s6     nn;F 	3 011111r@   r!   c                X    |D ]&}|| j         v rt          |d           || j         |<   'dS )zm Provide callbacks to invoke if the document or any Model reachable
        from its roots changes.

        r|   N)r(   r   r=   rI   rN   s      r>   	on_changez!DocumentCallbackManager.on_change  sN    
 " 	8 	8H4111Hj111/7D"8,,	8 	8r@   receiverc                8    | j         vrfd| j         <   d S d S )Nc                .    |                                S rL   )dispatch)r|   r   s    r>   <lambda>z?DocumentCallbackManager.on_change_dispatch_to.<locals>.<lambda>  s    U^^H=U=U r@   r(   )r=   r   s    `r>   on_change_dispatch_toz-DocumentCallbackManager.on_change_dispatch_to  s5    4111/U/U/U/UD"8,,, 21r@   str | type[Event]EventCallbackc                "     | j         |g|R   dS )zD Provide callbacks to invoke if a bokeh event is received.

        N	_on_eventr=   r|   rI   s      r>   on_eventz DocumentCallbackManager.on_event  $     	u)y))))))r@   JSEventCallbackc                "     | j         |g|R   dS )zG Provide JS callbacks to invoke if a bokeh event is received.

        Nr   r   s      r>   js_on_eventz#DocumentCallbackManager.js_on_event  r   r@   EventCallback | JSEventCallbackc                   t          |t                    st          |t                    r|j        }|t
          vrt          d|           t          t
          |         t                    st          d          |D ]j}t          |t                    r!| j	        |         
                    |           8t          |dd           | j        |         
                    |           kd 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.r   zEvent callback)what)
isinstancerm   
issubclassr   
event_namer   rg   r   r   r*   appendr   r)   )r=   r|   rI   rN   s       r>   r   z!DocumentCallbackManager._on_event"  s   %%% 	%*UE*B*B 	%$E///5e556661%8-HH 	O N O O O " 	> 	>H(O44 >(/66x@@@@*;KLLLL%e,33H====	> 	>r@   msg_typeMessageCallbackc                F    | j         |                             |           d S rL   )r+   extend)r=   r   rI   s      r>   r;   z"DocumentCallbackManager.on_message5  s$    )00;;;;;r@   r   c                d    |D ],}t          |d           | j                            |           -dS )za Provide callbacks to invoke when the session serving the Document
        is destroyed

        )session_contextN)r   r-   rY   r   s      r>   on_session_destroyedz,DocumentCallbackManager.on_session_destroyed8  sH    
 " 	< 	<HH&:;;;-11(;;;;	< 	<r@   c                     |D ]
}| j         |= dS )z Remove a callback added earlier with ``on_change``.

        Raises:
            KeyError, if the callback was never added

        Nr   r   s      r>   remove_on_changez(DocumentCallbackManager.remove_on_changeA  s+     " 	1 	1H&x00	1 	1r@   c                z    | j                             |d          }|||v r|                    |           dS dS dS r   )r+   getremove)r=   r   rN   message_callbackss       r>   remove_on_messagez)DocumentCallbackManager.remove_on_messageK  sV     !377$GG(X9J-J-J$$X..... )(-J-Jr@   c                    	 |g}| j                             |           n# t          $ r t          d          w xY w|                                 }|dS |D ]%}|                     t          ||                     &d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   KeyErrorrg   r'   rZ   r   )r=   rM   callback_objsr[   s       r>   rS   z/DocumentCallbackManager.remove_session_callbackS  s    	e)NM#**<8888 	e 	e 	ecddd	e nn;F * 	N 	NL""#9#|#L#LMMMM	N 	Ns     :keyc                j    | j         |                             t          j        |                     d S rL   )r/   rY   r7   r8   )r=   r   rk   s      r>   	subscribez!DocumentCallbackManager.subscribel  s.    $((U););<<<<<r@   r   tuple[EventCallback, ...]c                R    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   )r=   r   s     r>   event_callbacks_for_event_namez6DocumentCallbackManager.event_callbacks_for_event_nameo  s%     T*..z2>>???r@   "tuple[DocumentChangeCallback, ...]c                N    t          | j                                                  S )zB Return a tuple containing all current change callbacks.

        )r   r(   valuesrD   s    r>   change_callbacksz(DocumentCallbackManager.change_callbacksy  s!     T+2244555r@   r   c                   t          |t                    rJ| j        |j                                                 }|D ]#} |            }|r|                    |           $|                     |j                  D ]} ||           d S rL   )r   r   r/   r   copy_trigger_eventr   )r=   r|   
subscribed	model_refrk   cbs         r>   r<   z%DocumentCallbackManager.trigger_event  s    eZ(( 	001ABGGIIJ' 0 0	!	 0((///55e6FGG 	 	BBuIIII	 	r@   r"   c                2                                      }|d S  j        dk    r j                                       d S  j        dk    rt	           j                   d S j        t          |j                   d fd}t          ||           d S )Ncollectra   rA   rJ   c                 L                                     D ]}  |            d S rL   )r   )r   r|   r=   s    r>   invoke_callbackszCDocumentCallbackManager.trigger_on_change.<locals>.invoke_callbacks  s7    ++--  5				 r@   rU   )r'   r1   r3   r   _combine_document_eventsrt   r%   )r=   r|   r[   r   s   ``  r>   rZ   z)DocumentCallbackManager.trigger_on_change  s    nn;F:""$$U+++FZ9$$$UD,=>>>F!-sE$:;;;	 	 	 	 	 	 	 	3 011111r@   c                    | j         dS d| _         t          | j                  }g | _        |D ]}|                     |           dS )zo Turn off any active document hold and apply any collected events.

        Returns:
            None

        N)r1   r9   r3   rZ   )r=   eventsr|   s      r>   unholdzDocumentCallbackManager.unhold  s`     :F
d'(( 	* 	*E""5))))	* 	*r@   )r4   r    )rA   rB   )rA   r,   )rI   r,   rA   rJ   )rM   r   rN   r   rO   rP   rA   r   rU   )ra   )rb   r   rA   rJ   )rA   r0   )NNN)rk   r   rl   rm   rn   r   ro   r   rp   rq   rr   rs   rt   ru   rA   rJ   )rk   r   r|   r   rt   r#   rA   rJ   )rI   r!   rA   rJ   )r   r   rA   rJ   )r|   r   rI   r   rA   rJ   )r|   r   rI   r   rA   rJ   )r|   r   rI   r   rA   rJ   )r   rm   rI   r   rA   rJ   )rI   r   rA   rJ   )rI   r   rA   rJ   )r   rm   rN   r   rA   rJ   )rM   r   rA   rJ   )r   rm   rk   r   rA   rJ   )r   rm   rA   r   )rA   r   )r|   r   rA   rJ   )r|   r"   rA   rJ   )!__name__
__module____qualname____doc____annotations__r1   r?   propertyrE   rH   rr   r]   r`   rh   rj   r}   r   r   r   r   r   r   r;   r   r   r   rS   r   r   r   r<   rZ   r    r@   r>   r$   r$   V   s          /...8888444499998888????,,,,DDDD#'E'''',,,,; ; ; ;0 - - - X- 1 1 1 X1 !'6 6 6 ('6* * * *X$ $ $ $         X x|& & & & &8	2 	2 	2 	2
8 
8 
8 
8V V V V* * * ** * * *> > > >&< < < << < < <1 1 1 1/ / / /N N N N2= = = =@ @ @ @6 6 6 6
 
 
 
2 2 2 2(* * * * * *r@   r$   r[   r    fCallable[[], None]rA   rJ   c                    ddl m} t          |dd          rt          |           n| } ||          5   |            cd d d            S # 1 swxY w Y   d S )Nr
   )patch_curdocnolockF)io.docr   getattrr   )r[   r   r   curdocs       r>   r%   r%     s    %%%%%%KRSTV^`eKfKf-o-B3-G-G-GloF	f		  qss                 s   
AAA	new_eventr"   
old_eventsr2   c                    t          |          D ]}|                    |           r dS |                    |            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)reversedra   r   )r   r   r|   s      r>   r   r     sW    , *%%  ==## 	FF	 i     r@   Callable[..., Any]c                B     t                    d fd            }|S )Nargsr   kwargsrA   rJ   c                 b     t                    d fd            }t          |          S )NrA   r   c                       i S rL   r   )r   r   r   s   r>   invokez2_wrap_with_curdoc.<locals>.wrapper.<locals>.invoke  s    1d%f%%%r@   )rA   r   )r   r%   )r   r   r   r[   r   s   `` r>   wrapperz"_wrap_with_curdoc.<locals>.wrapper  sM    	q	& 	& 	& 	& 	& 	& 	& 
	&!#v...r@   )r   r   r   r   rA   rJ   r   )r[   r   r   s   `` r>   rW   rW     s>    
1XX/ / / / / / X/
 Nr@   )r[   r    r   r   rA   rJ   )r   r"   r   r2   rA   rJ   )r[   r    r   r   rA   r   );r   
__future__r   logging	getLoggerr   re   r7   collectionsr   	functoolsr   typingr   r   r	   
core.enumsr   r   r   r   r   r   r   rk   r   models.callbacksr   r   util.callback_managerr   r   r   r   r   r   r   r   lockingr   application.applicationr   core.has_propsr   server.callbacksr   r4   r    r!   r"   r#   __all__
Originatorr   r   r$   r%   r   rW   r   r@   r>   <module>r      s    # " " " " " g!!  # # # # # #       / / / / / / / / / / 4 3 3 3 3 3 3 3                  : : : : : : 3 3 3 3 3 3                  + * * * * * NBBBBBB''''''222222""""""MMMMMMMMMM
 BHc3h
C5$;'%$'Y* Y* Y* Y* Y* Y* Y* Y*~
   ! ! ! !:     r@   