U
    M8ÚcR*  ã                   @   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_number_case©ÚxÚy© r
   ú4/tmp/pip-unpacked-wheel-dwe9sm7_/jmespath/visitor.pyÚ_equals   s    
r   c                 C   s8   t | ƒr| dkrt|tƒS t |ƒr4|dkr4t| tƒS d S )N)r   é   )Ú_is_actual_numberÚ
isinstanceÚboolr   r
   r
   r   r      s    
r   c                 C   s   t | ƒpt| tƒS ©N)r   r   r   ©r   r
   r
   r   Ú_is_comparable&   s    r   c                 C   s   t | tƒrdS t | tƒS r   )r   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 )NÚtypez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gter2   r3   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 ©NrB   )r)   ÚAttributeError©r   r"   rB   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 )NrB   r?   r   r   )ÚCOMPARATOR_FUNCÚ_EQUALITY_OPSr    ÚintÚfloatr   )r   r"   rB   Zcomparator_funcÚleftÚrightZ	num_typesr
   r
   r   Úvisit_comparatorŒ   s    þÿz TreeInterpreter.visit_comparatorc                 C   s   |S r   r
   rG   r
   r
   r   Úvisit_current    s    zTreeInterpreter.visit_currentc                 C   s   t |d d | ƒS ©Nr?   r   )r   rG   r
   r
   r   Úvisit_expref£   s    zTreeInterpreter.visit_exprefc                 C   s:   g }|d D ]}|   ||¡}| |¡ q| j |d |¡S ©Nr?   rB   )r    Úappendr:   Úcall_function)r   r"   rB   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_truerT   )r   r"   rB   ÚbaseZcomparator_nodeÚ	collectedÚelementrW   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 rQ   )r    r   rZ   ÚextendrT   )r   r"   rB   r\   Zmerged_listr^   r
   r
   r   Úvisit_flattenº   s    

zTreeInterpreter.visit_flattenc                 C   s   |S r   r
   rG   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 rE   )r   rZ   Ú
IndexErrorrG   r
   r
   r   Úvisit_indexÊ   s    
zTreeInterpreter.visit_indexc                 C   s"   |}|d D ]}|   ||¡}q|S r>   r@   rA   r
   r
   r   Úvisit_index_expressionÔ   s    z&TreeInterpreter.visit_index_expressionc                 C   s"   t |tƒsd S t|d Ž }|| S r>   )r   rZ   Úslice)r   r"   rB   Úsr
   r
   r   Úvisit_sliceÚ   s    
zTreeInterpreter.visit_slicec                 C   s   |   |d d |¡S rQ   r@   rG   r
   r
   r   Úvisit_key_val_pairà   s    z"TreeInterpreter.visit_key_val_pairc                 C   s   |d S rE   r
   rG   r
   r
   r   Úvisit_literalã   s    zTreeInterpreter.visit_literalc                 C   s:   |d krd S |   ¡ }|d D ]}|  ||¡||d < q|S rS   )r8   r    ©r   r"   rB   r]   rV   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>   )rT   r    rk   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"   rB   Úmatchedr
   r
   r   Úvisit_or_expressionö   s    
z#TreeInterpreter.visit_or_expressionc                 C   s6   |   |d d |¡}|  |¡r"|S |   |d d |¡S rn   ro   rq   r
   r
   r   Úvisit_and_expressionü   s    
z$TreeInterpreter.visit_and_expressionc                 C   s.   |   |d d |¡}t|ƒr(|dkr(dS | S )Nr?   r   F)r    r   )r   r"   rB   Zoriginal_resultr
   r
   r   Úvisit_not_expression  s    z$TreeInterpreter.visit_not_expressionc                 C   s"   |}|d D ]}|   ||¡}q|S r>   r@   rA   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 rn   )r    r   rZ   rT   ©r   r"   rB   r\   r]   r^   rW   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 rn   )r    ÚvaluesrF   rT   rw   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   rB   r
   r
   r   rp   (  s     ÿzTreeInterpreter._is_falsec                 C   s   |   |¡ S r   )rp   r|   r
   r
   r   r[   /  s    zTreeInterpreter._is_true)N)(r   r   r   r   Úoperatorr4   r5   ÚleÚgerI   rJ   Údictr7   r   r+   rD   rH   rO   rP   rR   rX   r_   ra   rb   rd   re   rh   ri   rj   rl   rm   rs   rt   ru   rv   rx   rz   rp   r[   Ú__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   )r6   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ƒ   rT   r„   Ú_visitÚjoin)r   r"   r#   r$   rW   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(   rB   r{   r?   r…   r   z
  %s -> %s)rƒ   rT   r)   r„   rˆ   )r   r"   rW   rV   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