a
    oDfq                     @  s  d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	m
Z
mZmZmZmZmZmZ ddlZddl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l!m"Z" er2ddl#mZ zddl$m%Z% eeedf Z&W n  e'y   eeef Z&Y n0 eee( e(f Z)eee( ee( f Z*ddddddZ+dddddddZ,G dd dej-Z.G dd de.Z/G dd  d e0Z1G d!d" d"e1Z2G d#d$ d$e2Z3e.j4e2d% e/j4e3d% d&Z5dS )'zE
Defines Links which allow declaring links between bokeh properties.
    )annotationsN)
TYPE_CHECKINGAnyDictIterableListOptionalSequenceTupleTypeUnion)CustomJS	LayoutDOMModel   )create_linked_datamodel)LOADING_INDICATOR_CSS_CLASS)ReactiveHTML)Reactive)warn)Viewable)r   Dimensionedr   
'Reactive'zIterable[str]None)source
propertiesreturnc              	   C  s"  |D ]}| drqqt| drtt| jtrt| j}|dD ]2}t||rXt||}q>td| d| j dq>q|| jvr|t	| j
 vrt|t	| j}|rd|}nd}td	|d
t| j d| dq| j|dd u s | j
|dd u rtd|dt| j dqd S )Nevent:object.zCould not resolve z on zF model. Ensure you jslink an attribute that exists on the bokeh model.z Similar parameters include:  Could not jslink  parameter (or property) on > object because it was not found. Similar parameters include: FCannot jslink  parameter on zG object, the parameter requires a live Python kernel to have an effect.)
startswithhasattr
isinstancer   r   splitgetattr
ValueErrorparamlist_renamevaluesdifflibget_close_matchestype__name___source_transformsget)r   r   propcurrentattrmatchesmatches_repr r<   X/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/panel/links.pyassert_source_syncable&   s<    



r>   'JSLinkTarget'Dict[str, str])r   targetr   r   c                 C  s   |  D ]\}}|drqq||jvr|t|j vrt|t|j}|rZd| }nd}td|dt	| j
 d| q|j|dd u s|j|dd u rtd|d	t	| j
 d
|d	t	|j
 d	qd S )Nr   z Similar parameters include: %rr!   r"   r#   r$   Fr%   r&   z object to z5. It requires a live Python kernel to have an effect.)itemsr'   r-   r.   r/   r0   r1   r2   r,   r3   r4   r5   r6   )r   rA   r   kpr:   r;   r<   r<   r=   assert_target_syncableH   s2    

rE   c                      s   e Zd ZU dZeji dddZejdddZe	 Z
ded	< i Zd
ed< dZded< d'ddddd fddZddddZedddddZedddd Zed(d!d"d#d$d%d&Z  ZS ))Callbackz
    A Callback defines some callback to be triggered when a property
    changes on the source object. A Callback can execute arbitrary
    Javascript code and will make all objects referenced in the args
    available in the JS namespace.
    Tz
        A mapping of names to Python objects. These objects are made
        available to the callback's code snippet as the values of
        named parameters to the callback.)defaultZ
allow_NonedocNz
        A dictionary mapping from a source specification to a JS code
        snippet to be executed if the source property changes.rG   rH   z?weakref.WeakKeyDictionary[Reactive | BkModel, List['Callback']]registryz1Dict[Type['Callback'], Type['CallbackGenerator']]
_callbacksFbool_requires_targetr   r?   Dict[str, Any]r@   )r   rA   argscodec                   s^   |du rt dt| j |du r&dnt|| _|s:i }t jf ||d| |   dS )a9  
        A Callback defines some callback to be triggered when a
        property changes on the source object. A Callback can execute
        arbitrary Javascript code and will make all objects referenced
        in the args available in the JS namespace.

        Arguments
        ---------
        source (Reactive):
           The source object the callback is attached to.
        target (Reactive | Model, optional):
           An optional target to trigger some action on when the source
           property changes.
        args (Dict[str, Any], optional):
           Additional args to make available in the Javascript namespace
           indexed by name.
        code (Dict[str, str], optional):
           A dictionary mapping from the changed source property to
           a JS code snippet to execute.
        Nz%s must define a source)rO   rP   )	r,   r3   r4   weakrefref_sourcesuper__init__init)selfr   rA   rO   rP   params	__class__r<   r=   rU   |   s    zCallback.__init__r   r   c                 C  s   t jtjvrtjt j | j}|du r,dS || jv r| j| }dd | j 	 D }|D ]\}dd |j 	 D }t
|dsq\t|t| u r\|j|u r\|j| ju r\||kr\ dS q\| j| |  n| g| j|< dS )z(
        Registers the Callback
        Nc                 S  s   i | ]\}}|d kr||qS namer<   .0rC   vr<   r<   r=   
<dictcomp>   s   z!Callback.init.<locals>.<dictcomp>c                 S  s   i | ]\}}|d kr||qS r\   r<   r^   r<   r<   r=   ra      s   rA   )rF   _process_callbacksr   Z_preprocessing_hooksappendr   rJ   r-   r0   rB   r(   r3   rA   rW   r   linksrX   linkZlink_paramsr<   r<   r=   rV      s0    



zCallback.initzType['CallbackGenerator'])callbackr   c                 C  s   || j | < dS )zu
        Register a LinkCallback providing the implementation for
        the Link for a particular backend.
        N)rK   )clsrg   r<   r<   r=   register_callback   s    zCallback.register_callbackzReactive | Nonec                 C  s   | j r|   S d S N)rS   rW   r<   r<   r=   r      s    zCallback.sourcer   BkModelzViewable | None)	root_view
root_modelchangedc                   sn  |sd S |j d }|d urz|t}||jv rJ||j| d dti7 }dd j D tfdd|D szd S ||u r|n|tt|dti sd S fddD }i }d	t	j
v rdd
lm  ddlm}	m}
  fdd|D }||	}|
||}D ]}j|g D ]}t|dr^||jg D ]}||||f qFi |t|< |j D ]R\}}z||g }W n ty   Y qtY n0 |D ]}||t| |< qqtq(q|D ]\}}}jt| }|d u s|t|d|gvst|ddr"|d u s|d urD|t|d|gvrDq|t|i }||||||d qd S )Nidr   r3   c                 S  s&   g | ]}|D ]}t |tr|jqqS r<   )r)   LinkrA   )r_   re   rf   r<   r<   r=   
<listcomp>       z/Callback._process_callbacks.<locals>.<listcomp>c                 3  s    | ]}| j v p|v V  qd S rj   )rJ   )r_   m)rh   targetsr<   r=   	<genexpr>   rs   z.Callback._process_callbacks.<locals>.<genexpr>c              	     sP   g | ]H} j |g D ]4}|jr8|jv s8t|jtjr||t|d dfqqS )rA   N)rJ   r6   rM   rA   r)   r-   Parameterizedr+   )r_   srcrf   )rh   linkabler<   r=   rr      s
   	holoviewsr   r   )	HoloViewsgenerate_panel_bokeh_mapc                   s0   g | ](\}}}t | st | s|||fqS r<   )r)   )r_   rf   rx   tgtr   r<   r=   rr      s   rA   _modelsrM   F)arg_overrides)rR   selectr   r~   rl   rJ   r0   anyr.   sysmodulesholoviews.core.dimensionr   pane.holoviewsr{   r|   r6   r(   rA   rc   rp   rO   rB   	ExceptionrK   r3   r+   )rh   rm   rn   ro   Z
old_modelsrR   inspectfoundr   r{   r|   Zhv_viewsZ
map_hve_bkrx   rf   r}   rC   r`   Zhv_objscbZ	overridesr<   )r   rh   ry   ru   r=   rb      sn    





 
zCallback._process_callbacks)NNN)NN)r4   
__module____qualname____doc__r-   r   rO   rP   rQ   WeakKeyDictionaryrJ   __annotations__rK   rM   rU   rV   classmethodri   propertyr   rb   __classcell__r<   r<   rY   r=   rF   a   s"   
  " rF   c                      sx   e Zd ZdZejdddZeji ddZdZ	ddd	d
 fddZ
eddddZddddZddddZ  ZS )rq   aW  
    A Link defines some connection between a source and target model.
    It allows defining callbacks in response to some change or event
    on the source object. Instead a Link directly causes some action
    to occur on the target, for JS based backends this usually means
    that a corresponding JS callback will effect some change on the
    target in response to a change on the source.

    A Link must define a source object which is what triggers events,
    but must not define a target. It is also possible to define bi-
    directional links between the source and target object.
    Fz>
        Whether to link source and target in both directions.rI   z[
        A dictionary mapping between source specification to target
        specification.TNr   Optional['JSLinkTarget'])r   rA   c                   sP   | j r |d u r tdt| j |d u r,d nt|| _t j|fi | d S )Nz%s must define a target.)	rM   r,   r3   r4   rQ   rR   _targetrT   rU   )rW   r   rA   rX   rY   r<   r=   rU   #  s    zLink.__init__'JSLinkTarget' | Noner[   c                 C  s   | j r|   S d S rj   )r   rk   r<   r<   r=   rA   *  s    zLink.targetr   c                 C  s   |    | j}|du rdS || jv r| j| }dd | j  D }|D ]P}dd |j  D }t|t| u rJ|j|u rJ|j| ju rJ||krJ dS qJ| j| |  n| g| j|< dS )z$
        Registers the Link
        Nc                 S  s   i | ]\}}|d kr||qS r\   r<   r^   r<   r<   r=   ra   9  s   zLink.link.<locals>.<dictcomp>c                 S  s   i | ]\}}|d kr||qS r\   r<   r^   r<   r<   r=   ra   =  s   )	rV   r   rJ   r-   r0   rB   r3   rA   rc   rd   r<   r<   r=   rf   .  s*    


z	Link.linkc                 C  s6   | j }|du rdS | j|g }| |v r2||  dS )z&
        Unregisters the Link
        N)r   rJ   r6   remove)rW   r   re   r<   r<   r=   unlinkG  s    zLink.unlink)N)r4   r   r   r   r-   Booleanbidirectionalr   r   rM   rU   r   rA   rf   r   r   r<   r<   rY   r=   rq     s   rq   c                	   @  s   e Zd ZdZdi fddddddd	d
ZedddddddZdddddddddddZdd ZdddddddZ	ddd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dd*d+d,ZdS )-CallbackGeneratorTN'Model''Link'r   r   rN   )rn   rf   r   rA   r   c           
   
   C  s   || _ || _|| _|| _|| _|   | |||}|D ]j\}}}	|d rj|d urj|d drj|d sjq8z| |||||||	 W q8 t	y   | j
r n Y q80 q8d S )Nr   r   )rn   rf   r   rA   r   validate
_get_specsr'   _init_callbackr   error)
rW   rn   rf   r   rA   r   specssrc_spectgt_specrP   r<   r<   r=   rU   X  s     &zCallbackGenerator.__init__r?   
str | None'Model' | None)rn   obj
model_specr   c           
      C  s   ddl m} d}dtjv rr||rr|du r0|jS |d}|d }t|dkrbd|dd }nd}|j| }nJt	|t
r|j|jd d\}}n&t	|tr|}nt	|tjrt||}|dur|dD ]}	t||	}q|S )	a  
        Resolves a model given the supplied object and a model_spec.

        Arguments
        ----------
        root_model: bokeh.model.Model
          The root bokeh model often used to index models
        obj: holoviews.plotting.ElementPlot or bokeh.model.Model or panel.Viewable
          The object to look the model up on
        model_spec: string
          A string defining how to look up the model, can be a single
          string defining the handle in a HoloViews plot or a path
          split by periods (.) to indicate a multi-level lookup.

        Returns
        -------
        model: bokeh.model.Model
          The resolved bokeh model
        r   )is_bokeh_element_plotNrz   r    r   rp   NN)r   r   r   r   stater*   lenjoinhandlesr)   r   r~   r6   rR   rl   r-   rw   r   r+   )
rh   rn   r   r   r   modelZmodel_specsZhandle_spec_specr<   r<   r=   _resolve_modeln  s*    



z CallbackGenerator._resolve_model'SourceModelSpec'r   z'TargetModelSpec'zOptional[str]r   )rn   rf   r   r   rA   r   rP   r   c              
     s  dd |j   D }| |||d }	|	d u r6d S |jd }
t|||f t|	j t|	j  }t	 fdd|D rd S |	|d< d }|j
r| |||d }|d ur||d< t|jfi | j D ]<\}}| ||d }|d ur|||< qt|t js|||< qd	tjv rd
dlm}m} t||rF|j|
 d }n|}t|drZdnd}||r|j D ]0\}}|| }t|trr||vrr|||< qrt||r|
|jv r|j|
 d }n|}||r|j D ]0\}}d| }t|tr||vr|||< qt|	trD|d
 |	j v rD|	j |d< }	t|trr|d
 |j v rr|j |d< }| |||	|d
 |||d
  | | |d u r| |||d
 ||d
 }ndj|d}t || gd}| !||\}}|D ]}|	"|| q|D ]}|	#|| q|d
 }t$|ddrF|d u sF|d u rJd S | |||||d
 }t|}||d< |	|d< t || gd}| !|d |f\}}| }|D ]H}||vrd| d| d}| j%rt&|nt'| |"|| q|D ]}|#|| qd S )Nc                 S  s   i | ]\}}|d vr||qS ))r   rA   r]   rP   rO   r<   r^   r<   r<   r=   ra     s   z4CallbackGenerator._init_callback.<locals>.<dictcomp>r   rp   c                 3  s"   | ]}|D ]} |j v V  q
qd S rj   )tags)r_   Zcbsr   Zlink_idr<   r=   rv     rs   z3CallbackGenerator._init_callback.<locals>.<genexpr>r   rA   rz   r   )r{   r   Zsource_r!   target_z2try {{ {code} }} catch(err) {{ console.log(err) }})rP   )rO   rP   r   r   Fz&Could not link non-existent property 'z' on z model)(r-   r0   rB   r   rR   rp   r.   Zjs_property_callbacksZjs_event_callbacksr   rM   dictrO   r   r)   rw   r   r   r   r{   r   Z_plotsr(   r   rl   r   datar   _initialize_models_process_references	_get_codeformatr   _get_triggersZjs_on_changeZjs_on_eventr+   r   r,   r   )rW   rn   rf   r   r   rA   r   rP   
references	src_modelrR   	callbacks	tgt_modelrC   r`   Z	arg_modelr{   r   rx   prefixr}   Zsrc_cbchangeseventschZevtgt_propZreverse_referencesZtgt_cbr   msgr<   r   r=   r     s    
 





"

z CallbackGenerator._init_callbackc                 C  s   dS )z8
        Method to process references in place.
        Nr<   )rW   r   r<   r<   r=   r     s    z%CallbackGenerator._process_referencesASequence[Tuple['SourceModelSpec', 'TargetModelSpec', str | None]]rf   r   rA   r   c                 C  s   g S )z\
        Return a list of spec tuples that define source and target
        models.
        r<   )rW   rf   r   rA   r<   r<   r=   r     s    zCallbackGenerator._get_specsstrrf   r   r   rA   r   r   c                 C  s   dS )z2
        Returns the code to be executed.
        r!   r<   )rW   rf   r   r   rA   r   r<   r<   r=   r     s    zCallbackGenerator._get_codeTuple[List[str], List[str]]rf   r   r   c                 C  s   g g fS )zK
        Returns the changes and events that trigger the callback.
        r<   rW   rf   r   r<   r<   r=   r   #  s    zCallbackGenerator._get_triggersr   r   r   rA   r   r   r   c                 C  s   dS )z_
        Applies any necessary initialization to the source and target
        models.
        Nr<   )rW   rf   r   r   r   rA   r   r   r<   r<   r=   r   +  s    z$CallbackGenerator._initialize_modelsr[   c                 C  s   d S rj   r<   rk   r<   r<   r=   r   4  s    zCallbackGenerator.validate)r4   r   r   r   rU   r   r   r   r   r   r   r   r   r   r<   r<   r<   r=   r   T  s   0m			r   c                   @  s2   e Zd ZddddddZdddd	d
ddZdS )JSCallbackGeneratorr   r   r   r   c                 C  s4   |d  dr&g |d dd gfS |d gg fS )Nr   r   :)r'   r*   r   r<   r<   r=   r   ;  s    z!JSCallbackGenerator._get_triggersr   r?   r   r   c                 C  s   |j D ]r}|d}|dr(d |f}qt|dkrPd|d d |d f}q|d }t|trp|j||}d |f}q|d|j | fgS )Nr    r   r   r   r   )	rP   r*   r'   r   r   r)   r   r/   r6   )rW   rf   r   rA   r   	src_specsr   src_propr<   r<   r=   r   B  s    





zJSCallbackGenerator._get_specsN)r4   r   r   r   r   r<   r<   r<   r=   r   9  s   r   c                      sv   e Zd ZdZdZdZddddd fd	d
ZddddddddddZdddddZdddddddddZ	  Z
S )JSLinkCallbackGeneratora  
    var value = source['{src_attr}'];
    value = {src_transform};
    value = {tgt_transform};
    try {{
      var property = target.properties['{tgt_attr}'];
      if (property !== undefined) {{ property.validate(value); }}
    }} catch(err) {{
      console.log('WARNING: Could not set {tgt_attr} on target, raised error: ' + err);
      return;
    }}
    try {{
      target['{tgt_attr}'] = value;
    }} catch(err) {{
      console.log(err)
    }}
    a  
    var value = true
    try {{
      var property = target.properties['{tgt_attr}'];
      if (property !== undefined) {{ property.validate(value); }}
    }} catch(err) {{
      console.log('WARNING: Could not set {tgt_attr} on target, raised error: ' + err);
      return;
    }}
    try {{
      target['{tgt_attr}'] = value;
    }} catch(err) {{
      console.log(err)
    }}
    a  
    if ('{src_attr}'.startsWith('event:')) {{
      var value = true
    }} else {{
      var value = source['{src_attr}'];
      value = {src_transform};
    }}
    if (typeof value !== 'boolean' || source.labels !== ['Loading']) {{
      value = true
    }}
    var css_classes = target.css_classes.slice()
    var loading_css = ['{loading_css_class}', 'pn-{loading_spinner}']
    if (value) {{
      for (var css of loading_css) {{
        if (!(css in css_classes)) {{
          css_classes.push(css)
        }}
      }}
    }} else {{
     for (var css of loading_css) {{
        var index = css_classes.indexOf(css)
        if (index > -1) {{
          css_classes.splice(index, 1)
        }}
      }}
    }}
    target['css_classes'] = css_classes
    r   r   r?   r   r   c                   s   |j rt |||S g }|j D ]\}}|d}t|dkr^d|d d |d f}n(|d }t|t	r~|j
||}d |f}|d}	t|	dkrd|	d d |	d f}n(|	d }
t|t	r|j
|
|
}
d |
f}|||d f q$|S )Nr    r   r   r   )rP   rT   r   r   rB   r*   r   r   r)   r   r/   r6   rc   )rW   rf   r   rA   r   r   r   r   r   Z	tgt_specsr   rY   r<   r=   r     s(    



z"JSLinkCallbackGenerator._get_specsr   r   r   r   r   r   r   c                 C  s  |d ur|r|rdd t |di  D }|||}	|drDd S t|tr|	|jv rt|trdd |j D }
|
||}t ||	}z|||i}W n t	y   i }Y n0 ||v r|| }n
t ||}|r|dkrt
||rt||| |d u r|jstdt| jj d S )Nc                 S  s   i | ]\}}||qS r<   r<   r^   r<   r<   r=   ra     rs   z>JSLinkCallbackGenerator._initialize_models.<locals>.<dictcomp>r/   r   c                 S  s   i | ]\}}||qS r<   r<   r^   r<   r<   r=   ra     rs   Zvalue_throttledzJModel could not be resolved on target %s and no custom code was specified.)r+   rB   r6   r'   r)   r   r-   r/   Z_process_param_changer   r(   setattrrP   r,   r3   rA   r4   )rW   rf   r   r   r   rA   r   r   src_reverse	src_paramtgt_reverse	tgt_paramvaluer   r<   r<   r=   r     s,    





z*JSLinkCallbackGenerator._initialize_modelsr@   )r   r   c                 C  sL   t |D ]>}|dks|dr|dd |v r0q||||dd < qdS )z8
        Strips target_ prefix from references.
        rA   r      N)r.   r'   pop)rW   r   rC   r<   r<   r=   r     s    "z+JSLinkCallbackGenerator._process_referencesr   c                 C  s   t |trDdd |j D }|||}|j|}|d u rHd}nd}t |trdd |j D }	|	||}
|
d u rd}q|j|
d}nd}|dkrddlm} | jj	|||j
tdS |r|d	r| j}n| j}|j	||||d
S d S )Nc                 S  s   i | ]\}}||qS r<   r<   r^   r<   r<   r=   ra     rs   z5JSLinkCallbackGenerator._get_code.<locals>.<dictcomp>r   c                 S  s   i | ]\}}||qS r<   r<   r^   r<   r<   r=   ra     rs   Zloadingr   )config)src_attrsrc_transformloading_spinnerZloading_css_classr   )r   Ztgt_attrr   tgt_transform)r)   r   r/   rB   r6   r5   Z_target_transformsr   _loading_link_templater   r   r   r'   _event_link_template_link_template)rW   rf   r   r   rA   r   r   r   r   r   r   r   r   templater<   r<   r=   r     s<    

z!JSLinkCallbackGenerator._get_code)r4   r   r   r   r   r   r   r   r   r   r   r<   r<   rY   r=   r   T  s   	r   )rg   )rF   r   r   r   rq   )6r   
__future__r   r1   r   rQ   typingr   r   r   r   r   r   r	   r
   r   r   r-   Zbokeh.modelsr   r   r   rl   Zio.datamodelr   Z
io.loadingr   modelsr   Zreactiver   Zutil.warningsr   Zviewabler   Zbokeh.modelr   r   ZJSLinkTargetr   r   ZSourceModelSpecZTargetModelSpecr>   rE   rw   rF   rq   r   r   r   r   ri   __all__r<   r<   r<   r=   <module>   sF   0" +I f *