U
    .b\*                     @   s   d dl Z d dlmZ d dlmZ d dlmZ dd Zdd Zd	d
 Z	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eZG dd deZdS )    N)	functions)string_type)Numberc                 C   s   t | |rdS | |kS d S )NF)_is_special_integer_casexy r	   4/tmp/pip-unpacked-wheel-l21h4tpp/jmespath/visitor.py_equals   s    
r   c                 C   s\   t | tkr,| dks| dkr,|dkp*|dkS t |tkrX|dksH|dkrX| dkpV| dkS d S )Nr      TF)typeintr   r	   r	   r
   r      s    r   c                 C   s   t | pt| tS N)_is_actual_number
isinstancer   r   r	   r	   r
   _is_comparable&   s    r   c                 C   s   | dks| dkrdS t | tS )NTF)r   r   r   r	   r	   r
   r   .   s    r   c                   @   s   e Zd ZdZdddZdS )Optionsz8Options to control how a JMESPath function is evaluated.Nc                 C   s   || _ || _d S r   )dict_clscustom_functions)selfr   r   r	   r	   r
   __init__=   s    	zOptions.__init__)NN)__name__
__module____qualname____doc__r   r	   r	   r	   r
   r   ;   s   r   c                   @   s   e Zd Zdd Zdd ZdS )_Expressionc                 C   s   || _ || _d S r   )
expressioninterpreter)r   r   r   r	   r	   r
   r   K   s    z_Expression.__init__c                 O   s   | j j|f||S r   )r   visitr   nodeargskwargsr	   r	   r
   r    O   s    z_Expression.visitN)r   r   r   r   r    r	   r	   r	   r
   r   J   s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )Visitorc                 C   s
   i | _ d S r   )_method_cacher   r	   r	   r
   r   T   s    zVisitor.__init__c                 O   sL   |d }| j |}|d kr<t| d|d  | j}|| j |< ||f||S )Nr   zvisit_%s)r&   getgetattrdefault_visit)r   r"   r#   r$   Z	node_typemethodr	   r	   r
   r    W   s     
 
zVisitor.visitc                 O   s   t dd S )Nr*   NotImplementedErrorr!   r	   r	   r
   r*   `   s    zVisitor.default_visitN)r   r   r   r   r    r*   r	   r	   r	   r
   r%   S   s   	r%   c                       s  e Zd Zedd ejejejejdZ	ddgZ
eZd; f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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-d. Z d/d0 Z!d1d2 Z"d3d4 Z#d5d6 Z$d7d8 Z%d9d: Z&  Z'S )<TreeInterpreterc                 C   s   t | | S r   )r   r   r	   r	   r
   <lambda>g       zTreeInterpreter.<lambda>)eqneltgtZlteZgter1   r2   Nc                    sb   t t|   | j| _|d kr$t }|| _|jd k	r>| jj| _|jd k	rT| jj| _	n
t
 | _	d S r   )superr.   r   MAP_TYPE	_dict_clsr   _optionsr   r   
_functionsr   Z	Functions)r   options	__class__r	   r
   r   p   s    


zTreeInterpreter.__init__c                 O   s   t |d d S )Nr   r,   r!   r	   r	   r
   r*   }   s    zTreeInterpreter.default_visitc                 C   s"   |}|d D ]}|  ||}q|S Nchildrenr    r   r"   valueresultr	   r	   r
   visit_subexpression   s    z#TreeInterpreter.visit_subexpressionc                 C   s,   z| |d W S  tk
r&   Y d S X d S NrA   )r(   AttributeErrorr   r"   rA   r	   r	   r
   visit_field   s    zTreeInterpreter.visit_fieldc                 C   s   | j |d  }|d | jkrF|| |d d || |d d |S | |d d |}| |d d |}ttf}t|rt|sd S |||S d S )NrA   r>   r   r   )COMPARATOR_FUNC_EQUALITY_OPSr    r   floatr   )r   r"   rA   Zcomparator_funcleftrightZ	num_typesr	   r	   r
   visit_comparator   s    z TreeInterpreter.visit_comparatorc                 C   s   |S r   r	   rF   r	   r	   r
   visit_current   s    zTreeInterpreter.visit_currentc                 C   s   t |d d | S Nr>   r   )r   rF   r	   r	   r
   visit_expref   s    zTreeInterpreter.visit_exprefc                 C   s:   g }|d D ]}|  ||}|| q| j|d |S Nr>   rA   )r    appendr9   call_function)r   r"   rA   Zresolved_argschildcurrentr	   r	   r
   visit_function_expression   s
    z)TreeInterpreter.visit_function_expressionc                 C   sx   |  |d d |}t|ts"d S |d d }g }|D ]<}| |  ||r6|  |d d |}|d k	r6|| q6|S )Nr>   r      r   )r    r   list_is_truerR   )r   r"   rA   baseZcomparator_node	collectedelementrU   r	   r	   r
   visit_filter_projection   s    
z'TreeInterpreter.visit_filter_projectionc                 C   sT   |  |d d |}t|ts"d S g }|D ]$}t|trD|| q*|| q*|S rO   )r    r   rX   extendrR   )r   r"   rA   rZ   Zmerged_listr\   r	   r	   r
   visit_flatten   s    

zTreeInterpreter.visit_flattenc                 C   s   |S r   r	   rF   r	   r	   r
   visit_identity   s    zTreeInterpreter.visit_identityc                 C   s8   t |tsd S z||d  W S  tk
r2   Y d S X d S rD   )r   rX   
IndexErrorrF   r	   r	   r
   visit_index   s    
zTreeInterpreter.visit_indexc                 C   s"   |}|d D ]}|  ||}q|S r=   r?   r@   r	   r	   r
   visit_index_expression   s    z&TreeInterpreter.visit_index_expressionc                 C   s"   t |tsd S t|d  }|| S r=   )r   rX   slice)r   r"   rA   sr	   r	   r
   visit_slice   s    
zTreeInterpreter.visit_slicec                 C   s   |  |d d |S rO   r?   rF   r	   r	   r
   visit_key_val_pair   s    z"TreeInterpreter.visit_key_val_pairc                 C   s   |d S rD   r	   rF   r	   r	   r
   visit_literal   s    zTreeInterpreter.visit_literalc                 C   s:   |d krd S |   }|d D ]}| ||||d < q|S rQ   )r7   r    r   r"   rA   r[   rT   r	   r	   r
   visit_multi_select_dict   s    z'TreeInterpreter.visit_multi_select_dictc                 C   s4   |d krd S g }|d D ]}| | || q|S r=   )rR   r    ri   r	   r	   r
   visit_multi_select_list   s    z'TreeInterpreter.visit_multi_select_listc                 C   s6   |  |d d |}| |r2|  |d d |}|S Nr>   r   r   r    	_is_falser   r"   rA   matchedr	   r	   r
   visit_or_expression   s    
z#TreeInterpreter.visit_or_expressionc                 C   s6   |  |d d |}| |r"|S |  |d d |S rl   rm   ro   r	   r	   r
   visit_and_expression   s    
z$TreeInterpreter.visit_and_expressionc                 C   s2   |  |d d |}t|tkr,|dkr,dS | S )Nr>   r   F)r    r   r   )r   r"   rA   Zoriginal_resultr	   r	   r
   visit_not_expression  s    z$TreeInterpreter.visit_not_expressionc                 C   s"   |}|d D ]}|  ||}q|S r=   r?   r@   r	   r	   r
   
visit_pipe
  s    zTreeInterpreter.visit_pipec                 C   sZ   |  |d d |}t|ts"d S g }|D ]*}|  |d d |}|d k	r*|| q*|S rl   )r    r   rX   rR   r   r"   rA   rZ   r[   r\   rU   r	   r	   r
   visit_projection  s    
z TreeInterpreter.visit_projectionc                 C   sp   |  |d d |}z| }W n tk
r6   Y d S X g }|D ]*}|  |d d |}|d k	r@|| q@|S rl   )r    valuesrE   rR   ru   r	   r	   r
   visit_value_projection  s    z&TreeInterpreter.visit_value_projectionc                 C   s(   |dkp&|g kp&|i kp&|d kp&|dkS )N Fr	   r   rA   r	   r	   r
   rn   (  s     zTreeInterpreter._is_falsec                 C   s   |  | S r   )rn   rz   r	   r	   r
   rY   /  s    zTreeInterpreter._is_true)N)(r   r   r   r   operatorr3   r4   legerH   rI   dictr6   r   r*   rC   rG   rM   rN   rP   rV   r]   r_   r`   rb   rc   rf   rg   rh   rj   rk   rq   rr   rs   rt   rv   rx   rn   rY   __classcell__r	   r	   r;   r
   r.   d   sF   
r.   c                       s,   e Zd Z fddZdd Zdd Z  ZS )GraphvizVisitorc                    s   t t|   g | _d| _d S )Nr   )r5   r   r   _lines_countr'   r;   r	   r
   r   4  s    zGraphvizVisitor.__init__c                 O   sP   | j d d|d | jf }|  jd7  _| || | j d d| j S )Nzdigraph AST {%s%sr   r   }
)r   rR   r   _visitjoin)r   r"   r#   r$   rU   r	   r	   r
   r    9  s    zGraphvizVisitor.visitc              	   C   sx   | j d||d |ddf  |dg D ]D}d|d | jf }|  jd7  _| j d||f  | || q.d S )	Nz%s [label="%s(%s)"]r   rA   ry   r>   r   r   z
  %s -> %s)r   rR   r(   r   r   )r   r"   rU   rT   Z
child_namer	   r	   r
   r   A  s      
zGraphvizVisitor._visit)r   r   r   r   r    r   r   r	   r	   r;   r
   r   3  s   r   )r{   Zjmespathr   Zjmespath.compatr   Znumbersr   r   r   r   r   objectr   r   r%   r.   r   r	   r	   r	   r
   <module>   s   	 P