a
    ;gh2                     @   s   d dl mZ ddlmZ ddlmZmZ ddlmZ G dd dZ	e	dZ
e	d	Ze	d
ZG dd dZG dd deZG dd deZG dd deZG dd dZdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%S )&    )	Component   )validate_callback)flatten_groupingmake_grouping_by_index)stringify_idc                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
	_Wildcardc                 C   s
   || _ d S N_name)selfname r   a/mounts/lovelace/software/anaconda3/envs/metaDMG/lib/python3.9/site-packages/dash/dependencies.py__init__	   s    z_Wildcard.__init__c                 C   s   | j S r	   r
   r   r   r   r   __str__   s    z_Wildcard.__str__c                 C   s   d|  dS )N<>r   r   r   r   r   __repr__   s    z_Wildcard.__repr__c                 C   s   d| j  dS )Nz["z"]r
   r   r   r   r   to_json   s    z_Wildcard.to_jsonN)__name__
__module____qualname__r   r   r   r   r   r   r   r   r      s   r   MATCHALL
ALLSMALLERc                   @   sT   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )DashDependencyc                 C   s,   t |tr| | _n|| _|| _d| _d S )NF)
isinstancer   Z_set_random_idcomponent_idcomponent_propertyallow_duplicate)r   r   r    r   r   r   r      s
    
zDashDependency.__init__c                 C   s   |    d| j S )N.component_id_strr    r   r   r   r   r   (   s    zDashDependency.__str__c                 C   s   d| j j d|  dS )Nr   z `z`>)	__class__r   r   r   r   r   r   +   s    zDashDependency.__repr__c                 C   s
   t | jS r	   )r   r   r   r   r   r   r$   .   s    zDashDependency.component_id_strc                 C   s   |   | jdS )N)idpropertyr#   r   r   r   r   to_dict1   s    zDashDependency.to_dictc                 C   s    t |to| j|jko| |S )z
        We use "==" to denote two deps that refer to the same prop on
        the same component. In the case of wildcard deps, this means
        the same prop on *at least one* of the same components.
        )r   r   r    _id_matches)r   otherr   r   r   __eq__4   s
    

zDashDependency.__eq__c                 C   s   | j }|j }t|t}t|t}||kr,dS |rt| t| krLdS | D ]p\}}|| }||krnqTt|t}	t|t}
|	s|
r|	rT|
sqT|tu sT|tu rqT|tu s|tu r dS qT dS qTdS ||kS )NFT)	r   r   dictsetkeysitemsr   r   r   )r   r*   Zmy_idZother_idZ	self_dict
other_dictkvZother_vZv_wildZ
other_wildr   r   r   r)   @   s2    



zDashDependency._id_matchesc                 C   s   t t| S r	   )hashstrr   r   r   r   __hash__`   s    zDashDependency.__hash__c                 C   s0   t | jtr,| j D ]}t |tr dS qdS )zS
        Return true if id contains a wildcard (MATCH, ALL, or ALLSMALLER)
        TF)r   r   r,   valuesr   )r   r2   r   r   r   has_wildcardc   s
    
zDashDependency.has_wildcardN)r   r   r   r   r   r   r$   r(   r+   r)   r5   r7   r   r   r   r   r      s   
 r   c                       s*   e Zd ZdZeefZd fdd	Z  ZS )OutputzOutput of a callback.Fc                    s   t  || || _d S r	   )superr   r!   )r   r   r    r!   r%   r   r   r   s   s    zOutput.__init__)F)	r   r   r   __doc__r   r   allowed_wildcardsr   __classcell__r   r   r:   r   r8   n   s   r8   c                   @   s   e Zd ZdZeeefZdS )Inputz8Input of callback: trigger an update when it is updated.Nr   r   r   r;   r   r   r   r<   r   r   r   r   r>   x   s   r>   c                   @   s   e Zd ZdZeeefZdS )StatezAUse the value of a State in a callback but don't trigger updates.Nr?   r   r   r   r   r@   ~   s   r@   c                   @   s   e Zd ZdddZdd ZdS )ClientsideFunctionNc                 C   s:   | drtd|dv r*td| d|| _|| _d S )NZ_dashprivate_z-Namespaces cannot start with '_dashprivate_'.)ZPreventUpdateZ	no_update"z." is a forbidden namespace in dash_clientside.)
startswith
ValueError	namespacefunction_name)r   rE   rF   r   r   r   r      s    

zClientsideFunction.__init__c                 C   s   d| j  d| j dS )NzClientsideFunction(z, ))rE   rF   r   r   r   r   r      s    zClientsideFunction.__repr__)NN)r   r   r   r   r   r   r   r   r   rA      s   
rA   c                 C   s   d|v rP|d }t |ttfr&t|}t|D ]}t |ts.td| q.|S g }| rt| d }tdd |D r|| d qTqqT|S )NoutputzGInvalid value provided where an Output dependency object was expected: r   c                 s   s   | ]}t |tV  qd S r	   )r   r8   .0dr   r   r   	<genexpr>       z7extract_grouped_output_callback_args.<locals>.<genexpr>)	r   listtupler   r8   rD   allappendpop)argskwargs
parametersdep	next_depsr   r   r   $extract_grouped_output_callback_args   s&    
rX   c                 C   s   | d }t |tr|g}| dd }t |tr4|g}t |trl|rdt |tsTtd|}|| n|}|S t |ttfrt|}|rt |ttfstd|t|7 }|S tdt| d S )NinputsstatezThe input argument to app.callback was a dict, but the state argument was not.
input and state arguments must have the same typezThe input argument to app.callback was a list, but the state argument was not.
input and state arguments must have the same typez]The input argument to app.callback may be a dict, list, or tuple,
but received value of type )	r   r   getr,   rD   updaterN   rO   type)rT   Zinput_parametersZstate_parametersrU   r   r   r   5extract_grouped_input_state_callback_args_from_kwargs   s<    



r^   c                 C   sT   g }| r<t | d }tdd |D r<|| d qq<qt|dkrP|d S |S )Nr   c                 s   s   | ]}t |ttfV  qd S r	   )r   r>   r@   rI   r   r   r   rL      rM   zFextract_grouped_input_state_callback_args_from_args.<locals>.<genexpr>r   )r   rP   rQ   rR   len)rS   rU   rW   r   r   r   3extract_grouped_input_state_callback_args_from_args   s    r`   c                 C   s(   d|v rt |S d|v r tdt| S )NrY   rZ   zQThe state keyword argument may not be provided without the input keyword argument)r^   rD   r`   )rS   rT   r   r   r   )extract_grouped_input_state_callback_args   s    ra   c           
      C   s   t | }dd |D }dd |D }t|}d}d}g }|D ]8}t|tr^|| |d7 }q<|||  |d7 }q<t| |}	|||	fS )Nc                 S   s   g | ]}t |tr|qS r   )r   r>   rJ   rV   r   r   r   
<listcomp>  rM   z8compute_input_state_grouping_indices.<locals>.<listcomp>c                 S   s   g | ]}t |tr|qS r   )r   r@   rb   r   r   r   rc     rM   r   r   )r   r_   r   r>   rQ   r   )
Zinput_state_groupingZ	flat_depsflat_inputs
flat_stateZtotal_inputsZinput_countZstate_countZ	flat_indsrV   Zgrouping_indsr   r   r   $compute_input_state_grouping_indices  s    




rf   c                 C   s   | dd}|du r<| r<t| d tr<| dd | d  } }g }| D ] }|t|ttfr\|n|g7 }qDt||}t|}t|ttfrt|dkr| d| r| d nd}t|ttfs|d }t||}t	|\}	}
}t
ttf}t||	|
|| ||	|
||fS )*Split args into outputs, inputs and statesprevent_initial_callNr   rH   r   )r[   r   boolrN   rO   rX   r   r_   ra   rf   r>   r8   r@   r   )rS   rT   rh   	flat_argsargoutputsZflat_outputsout0Zinputs_staterd   re   Zinput_state_indicestypesr   r   r   handle_grouped_callback_args  s&    



rp   c                 C   sN   | |g }|r&t|ttfsJ|gS n$| rJt| d |rJ|| d q&|S )z3Extract arguments for callback from a name and typer   )r[   r   rN   rO   rQ   rR   )rS   rT   r   type_rU   r   r   r   extract_callback_args>  s    rr   c                 C   s   | dd}|du r<| r<t| d tr<| dd | d  } }g }| D ] }|t|ttfr\|n|g7 }qDt||dt}|}t|dkr| d| r| d nd}t|ttfs|d }t||dt}t||dt	}	ttt	f}
t
|||	||
 |||	|fS )	rg   rh   Nri   rH   r   r   rY   rZ   )r[   r   rj   rN   rO   rr   r8   r_   r>   r@   r   )rS   rT   rh   rk   rl   rm   Zvalidate_outputsrn   rY   Zstatesro   r   r   r   handle_callback_argsM  s"    
rs   N)Zdash.development.base_componentr   	_validater   Z	_groupingr   r   Z_utilsr   r   r   r   r   r   r8   r>   r@   rA   rX   r^   r`   ra   rf   rp   rr   rs   r   r   r   r   <module>   s(   Q
0"