U
    /e2                     @  s8  d Z ddlmZ ddlZeeZddlmZ ddl	m
Z
mZmZmZmZmZmZmZmZ ddlmZ ddlmZmZ dd	lmZ e
rdd
lmZ ddlmZ ddlmZ ddlm Z  dZ!eegdf Z"eg df Z#ee"e#f Z$ee%eegdf Z&G dd dZ'G dd dZ(dddddZ)ddddddddZ*dS ) z Provides ``PropertyCallbackManager`` and ``EventCallbackManager``
mixin classes for adding ``on_change`` and ``on_event`` callback
interfaces to classes.
    )annotationsN)	signature)	TYPE_CHECKINGAnyCallableDictListSequenceTypeUnioncast   )Unknown)Event
ModelEvent)get_param_info)Setter)ID)Document)DocumentPatchedEvent)EventCallbackManagerPropertyCallbackManagerc                      s|   e Zd ZU dZded< ded< ded< ded	< d
d
dd fddZddddddZdddddZddddZ  Z	S )r   zs A mixin class to provide an interface for registering and
    triggering event callbacks on the Python side.

    Document | Nonedocumentr   idz	List[str]subscribed_eventszDict[str, List[EventCallback]]_event_callbacksr   Noneargskwreturnc                   s   t  j|| i | _d S N)super__init__r   selfr   r    	__class__ ?/tmp/pip-unpacked-wheel-f5fndrjf/bokeh/util/callback_manager.pyr$   R   s    zEventCallbackManager.__init__zstr | Type[Event]EventCallback)event	callbacksr!   c                 G  s   t |tst|tr|j}|D ]}t|dkrt|ddd q|| jkr^dd |D | j|< n| j| | || j	kr| j	
| dS )z Run callbacks when the specified event occurs on this Model

        Not all Events are supported for all Models.
        See specific Events in :ref:`bokeh.events` for more information on
        which Models are able to trigger them.
        r   )r,   zEvent callback)whatc                 S  s   g | ]}|qS r)   r)   ).0cbr)   r)   r*   
<listcomp>e   s     z1EventCallbackManager.on_event.<locals>.<listcomp>N)
isinstancestr
issubclassr   
event_name_nargs_check_callbackr   extendr   append)r&   r,   r-   callbackr)   r)   r*   on_eventV   s    

zEventCallbackManager.on_eventr   )r,   r!   c                   sN   dd fdd}j d k	rDddlm} j jt| | n|  d S )Nr   r!   c                    sX   j  jg D ]B}  jd k	rj jkrt| dkrDtt|   qtt|   qd S )Nr   )	r   getr5   Z	_model_idr   r6   r   EventCallbackWithoutEventEventCallbackWithEvent)r:   r,   r&   r)   r*   invokem   s
    z3EventCallbackManager._trigger_event.<locals>.invoker   Model)r   modelrC   r-   Znotify_eventr   )r&   r,   rA   rC   r)   r@   r*   _trigger_eventl   s
    
z#EventCallbackManager._trigger_eventr<   c                 C  s@   | j d krd S | jD ]&}ddlm} | j j|t||  qd S )Nr   rB   )r   r   rD   rC   r-   	subscriber   )r&   keyrC   r)   r)   r*   _update_event_callbacks{   s
    

z,EventCallbackManager._update_event_callbacks)
__name__
__module____qualname____doc____annotations__r$   r;   rE   rH   __classcell__r)   r)   r'   r*   r   G   s   
r   c                      sz   e Zd ZU dZded< ded< dddd fd	d
ZddddddZddddddZddddddddddZ  Z	S )r   zZ A mixin class to provide an interface for registering and
    triggering callbacks.

    r   r   z!Dict[str, List[PropertyCallback]]
_callbacksr   r   r   c                   s   t  j|| i | _d S r"   )r#   r$   rO   r%   r'   r)   r*   r$      s    z PropertyCallbackManager.__init__r3   PropertyCallback)attrr-   r!   c                 G  sN   t |dkrtd| j|g }|D ]"}||kr4q&t|d || q&dS )z Add a callback on this object to trigger when ``attr`` changes.

        Args:
            attr (str) : an attribute name on this object
            callback (callable) : a callback function to register

        Returns:
            None

        r   zSon_change takes an attribute name and one or more callbacks, got only one parameter)rQ   oldnewN)len
ValueErrorrO   
setdefaultr7   r9   r&   rQ   r-   rO   r:   r)   r)   r*   	on_change   s    
z!PropertyCallbackManager.on_changec                 G  s:   t |dkrtd| j|g }|D ]}|| q&dS )z$ Remove a callback from this object r   zZremove_on_change takes an attribute name and one or more callbacks, got only one parameterN)rT   rU   rO   rV   removerW   r)   r)   r*   remove_on_change   s
    z(PropertyCallbackManager.remove_on_changeNr   zDocumentPatchedEvent | NonezSetter | None)rQ   rR   rS   hintsetterr!   c              	     sZ   dd fdd}j dk	rPddlm} j jt| ||| n|  dS )z Trigger callbacks for ``attr`` on this object.

        Args:
            attr (str) :
            old (object) :
            new (object) :

        Returns:
            None

        r   r<   c                    s*   j  } | r&| D ]}|  qd S r"   )rO   r=   )r-   r:   rQ   rS   rR   r&   r)   r*   rA      s    z/PropertyCallbackManager.trigger.<locals>.invokeNr   rB   )r   rD   rC   r-   Znotify_changer   )r&   rQ   rR   rS   r[   r\   rA   rC   r)   r]   r*   trigger   s
    
"zPropertyCallbackManager.trigger)NN)
rI   rJ   rK   rL   rM   r$   rX   rZ   r^   rN   r)   r)   r'   r*   r      s   
	   r   zCallable[..., Any]int)fnr!   c                 C  s$   t | }t|\}}t|t| S r"   )r   r   rT   )r`   sig	all_namesdefault_valuesr)   r)   r*   r6      s    r6   Callback functionszSequence[str]r3   r   )r:   fargsr.   r!   c           	      C  sZ   t | }t|}|d }t|\}}t|t| }|t|krVt|d||f dS )z3Bokeh-internal function to check callback signaturez) must have signature func(%s), got func%sz, N)r   r3   r   rT   rU   join)	r:   re   r.   ra   Zformatted_args	error_msgrb   rc   nargsr)   r)   r*   r7      s    r7   )rd   )+rL   
__future__r   logging	getLoggerrI   loginspectr   typingr   r   r   r   r   r	   r
   r   r   Z
core.typesr   eventsr   r   Zutil.functionsr   Zcore.has_propsr   r   Zdocument.documentr   Zdocument.eventsr   __all__r?   r>   r+   r3   rP   r   r   r6   r7   r)   r)   r)   r*   <module>   s,   
,<K