U
    Zf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   5/tmp/pip-unpacked-wheel-47crqvv_/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ksT|tkrqT|tks|tk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k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|k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>   s     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"    
rW   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   updaterM   rN   type)rS   Zinput_parametersZstate_parametersrT   r   r   r   5extract_grouped_input_state_callback_args_from_kwargs   s8    



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      s     zFextract_grouped_input_state_callback_args_from_args.<locals>.<genexpr>r   )r   rO   rP   rQ   len)rR   rT   rV   r   r   r   3extract_grouped_input_state_callback_args_from_args   s    r_   c                 C   s(   d|krt |S d|kr tdt| S )NrX   rY   zQThe state keyword argument may not be provided without the input keyword argument)r]   rD   r_   )rR   rS   r   r   r   )extract_grouped_input_state_callback_args   s    r`   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   rU   r   r   r   
<listcomp>  s     
 z8compute_input_state_grouping_indices.<locals>.<listcomp>c                 S   s   g | ]}t |tr|qS r   )r   r@   ra   r   r   r   rb     s     
 r   r   )r   r^   r   r>   rP   r   )
Zinput_state_groupingZ	flat_depsflat_inputs
flat_stateZtotal_inputsZinput_countZstate_countZ	flat_indsrU   Zgrouping_indsr   r   r   $compute_input_state_grouping_indices  s    




re   c                 C   s   | dd}|dk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   )rZ   r   boolrM   rN   rW   r   r^   r`   re   r>   r8   r@   r   )rR   rS   rg   	flat_argsargoutputsZflat_outputsout0Zinputs_staterc   rd   Zinput_state_indicestypesr   r   r   handle_grouped_callback_args  s&    



ro   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   )rZ   r   rM   rN   rP   rQ   )rR   rS   r   type_rT   r   r   r   extract_callback_args>  s    rq   c                 C   s   | dd}|dk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 )	rf   rg   Nrh   rH   r   r   rX   rY   )rZ   r   ri   rM   rN   rq   r8   r^   r>   r@   r   )rR   rS   rg   rj   rk   rl   Zvalidate_outputsrm   rX   Zstatesrn   r   r   r   handle_callback_argsM  s"    
rr   N)Zdash.development.base_componentr   	_validater   Z	_groupingr   r   _utilsr   r   r   r   r   r   r8   r>   r@   rA   rW   r]   r_   r`   re   ro   rq   rr   r   r   r   r   <module>   s(   Q
0"