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|ƒr†t|ƒsŠd 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