U
    Kvf&                     @   s  d dl mZ dgZd dlZd dlZd dlmZ d dlm	Z	 d dl
mZ d dlmZmZmZmZ d dlmZmZ d d	lmZ d
dddgZdd Zdd Zdd Zdd ZedddZeedddedddedddedddeddded dd!ed"dd#edddedddg
Zg fd$dZdd%gdd%gdd%gdd%gdd&gdd&d'gdd&d'gdd&d'gdd&dd'ggdddd&d'gd(ggdddd&dd'd(ggd)ggddd&d*ggddd&d*ggddd&d'gdd(d)ggddd&dd'd(gggddd"d&d+gggddd d&d'gggddd&d d'd(gggdd dd&d'gd(ggddd&d d'd(gggddd&dd'd(gggdd&gddd%ggd,Zd-d. Zd/d0 Z d1d2 Z!d3d4 Z"d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIgZ#dJdK Z$g fdLdMZ%ddNd&d'ggddd&dNd'd(gggdOZ&dPdQ Z'dS )R    )print_functionparse_formulaN)	cStringIO)
PatsyError)Origin)TokenOperatorinfix_parse	ParseNode)python_tokenizepretty_untokenize)PushbackAdapterPYTHON_EXPRZEROONENUMBERc                 C   s,   z| | W n t k
r"   Y dS X dS d S )NFT)
ValueError)fv r   7/tmp/pip-unpacked-wheel-68fdvdus/patsy/parse_formula.py_is_a   s
    r   c                 C   s  g }g }g }d}| D ]\}}}|dks*t |dkrN||krN| |||f  q|dkr^|d7 }|dkrn|d8 }|dk rtd||| || || q|dkrtt||}	|	dkrd}
n,|	dkrd	}
ntt|	stt|	rd
}
nd}
t	|
t
||	dS tdt
|d S )Nr   )([{   ))]}zunmatched close bracket0r   1r   r   r   )extraz.unclosed bracket in embedded Python expression)AssertionError	push_backr   appendr   zipr   intfloatr   r   combine)it
end_tokensZpytypesZtoken_stringsZoriginsZbracket_levelpytypetoken_stringoriginZ	expr_text
token_typer   r   r   _read_python_expr%   s>    



r/   c           	      c   s   d|kst d|kst tjtjd}|D ]}|||< q*t|}|d tt| }|D ]@\}}}||kr~t|| |V  qZ||||f t	||V  qZd S )Nr   r   )r   r   )
r"   r   LPARENRPARENsetremover   r   r#   r/   )	codeoperator_stringsZmagic_token_typesZoperator_stringr*   r)   r+   r,   r-   r   r   r   _tokenize_formulaK   s    

r6   c                  C   sf  d} t t| dddg}dt| dddfdt| d	d
d fdt| dddfdt| ddd ftjt| ddd fdt| dddftjt| ddd fdt| ddd fdt| ddd fdt| dddfdt| ddd fdt| dd d!fdt| d"d#d fd$t| d%d&d'fg}t||D ]V\}}t|ts"t|j	|d ks6t|j
|d ksJt|j|d	 ks
tq
d S )(Nz&y ~ a + (foo(b,c +   2)) + -1 + 0 + 10+-~r   r   r   y            a         	      zfoo(b, c + 2)               r      r          r       !   r   "   #   r   $   &   10)listr6   r   r   r0   r1   r%   
isinstancer"   typer-   r!   )r4   tokens	expectedsgotexpectedr   r   r   test__tokenize_formula`   s,    r[   r9   r   ir;   r7   d   r8   *   /:i,  z**i  c                 C   sz   |   sd} |D ]}|jdk rtdqt| }dd |D }tt| ||t}t|trd|j	dkrvtdd |g|j
}|S )Nz~ 1r   z'all operators must have precedence >= 0c                 S   s   g | ]
}|j qS r   )r.   ).0opr   r   r   
<listcomp>   s     z!parse_formula.<locals>.<listcomp>r9   )strip
precedencer   _default_opsr	   r6   _atomic_token_typesrU   r
   rV   r-   )r4   extra_operatorsrb   	operatorsr5   treer   r   r   r      s    


r    r?   bcdznp.log(a, base=10)2)  z 
 r    r?   za ~ bz(a ~ b)za ~ ((((b))))za ~ ((((+b))))z	a + b + cza + (b ~ c) + dza + np.log(a, base=10)za + np . log(a , base = 10)za + b ~ c * dz	a + b * cz-a**2z-a:bza + b:cz	(a + b):cza*b:cza+b / cz~ az-1c                 C   sr   t | tst| jrP| j|d ks&tt| j|dd  D ]\}}t|| q:n| jtks^t| jj	|ksntd S )Nr   r   )
rU   r
   r"   argsrV   r%   _compare_treesrg   tokenr!   )rY   rZ   argZexpected_argr   r   r   rr      s    rr   c                 C   sH   t | D ]8\}}t||d}tt|t| t| t|| q
d S Nrh   )six	iteritemsr   printreprrr   )Z
test_casesrh   r4   rZ   actualr   r   r   _do_parse_test   s
    r|   c                   C   s   t tg  d S )N)r|   _parser_testsr   r   r   r   test_parse_formula   s    r~   c                  C   s   t d} | jtdddkst| jjtdddks6t| jd jtdddksRt| jd jtdddksnt| jd jjtddd	kst| jd jd jtddd
kst| jd jd jtdddkstd S )Nz	a ~ b + cr   rC   r;   r<   r   r=   r@   rA   r>   rB   )r   r-   r   r"   rs   rq   )rj   r   r   r   test_parse_origin   s    "r   za <+>za + <(>za + b <# asdf>z<)>za + <)>z<*> aza + <*>za + <foo[bar>za + <foo{bar>za + <foo(bar>z
a + <[bar>z
a + <{bar>za + <{bar[]>za + foo<]>barza + foo[]<]>barza + foo{}<}>barza + foo<)>barza + b<)>z(a) <.>z<(>a + bz
a +< >'fooc           	      C   s
  |D  ]}g }d }d }|D ]2}|dkr0t |}q|dkrBt |}q|| qd|}|d k	rh|d k	sltt| tt||| z| | W nf tk
r } zHt| |jj|kst|jj	d|fkst|jj
|t |fkstW 5 d }~X Y qX dstdqd S )N<>ro   r   Fz!parser failed to report an error!)lenr$   joinr"   ry   rz   r   r-   r4   startend)	parse_fnZerror_descsZ
error_desclettersr   r   letterZbad_codeer   r   r   _parsing_error_test   s,    



*r   c                    s    fdd}t |t d S )Nc                    s   t |  dS ru   )r   )r4   rv   r   r   r     s    z#test_parse_errors.<locals>.parse_fn)r   _parser_error_tests)rh   r   r   rv   r   test_parse_errors  s    r   |)za | bza * b|cc                  C   s4   t dddg} tt| d tt| d t| d d S )Nr   r;      rv   )r   r|   r}   _extra_op_parser_testsr   rv   r   r   r   test_parse_extra_op$  s    r   )(
__future__r   __all__tokenizerw   Z	six.movesr   StringIOZpatsyr   Zpatsy.originr   Zpatsy.infix_parserr   r   r	   r
   Zpatsy.tokensr   r   Z
patsy.utilr   rg   r   r/   r6   r[   Z_unary_tilderf   r   r}   rr   r|   r~   r   r   r   r   r   r   r   r   r   r   <module>
   s   	&









#
#