B
    S&                 @   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*   y| | W n t k
r    dS X dS d S )NFT)
ValueError)fv r   2lib/python3.7/site-packages/patsy/parse_formula.py_is_a   s
    r   c             C   s  g }g }g }d}x| D ]\}}}|dks,t |dkrN||krN| |||f P |dkr^|d7 }|dkrn|d8 }|dk rtd||| || || qW |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   Z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}x|D ]}|||< q,W t|}|d tt| }xH|D ]@\}}}||krt|| |V  q`||||f t	||V  q`W d 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    


r5   c              C   sj  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}xdt||D ]V\}}t|ts$t|j	|d ks8t|j
|d ksLt|j|d	 kstqW 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   $   &   Z10)listr5   r   r   r/   r0   r%   
isinstancer"   typer,   r!   )r3   tokensZ	expectedsgotexpectedr   r   r   test__tokenize_formula`   s*    rX   r8   r   ir:   r6   d   r7   *   /:i,  z**i  c             C   s~   |   sd} x|D ]}|jdk rtdqW t| }dd |D }tt| ||t}t|trh|j	dkrzt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>r8   )stripZ
precedencer   _default_opsr	   r5   _atomic_token_typesrS   r
   rT   r,   )r3   extra_operatorsr_   Z	operatorsr4   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   sv   t | tst| jrT| j|d ks&txJt| j|dd  D ]\}}t|| q<W n| jtksbt| jj	|ksrtd S )Nr   r   )
rS   r
   r"   argsrT   r%   _compare_treesrc   tokenr!   )rV   rW   argZexpected_argr   r   r   rm      s    rm   c             C   sL   xFt | D ]8\}}t||d}tt|t| t| t|| qW d S )N)rd   )sixZ	iteritemsr   printreprrm   )Z
test_casesrd   r3   rW   Zactualr   r   r   _do_parse_test   s
    rs   c               C   s   t tg  d S )N)rs   _parser_testsr   r   r   r   test_parse_formula   s    ru   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   rB   r:   r;   r   r<   r?   r@   r=   rA   )r   r,   r   r"   rn   rl   )re   r   r   r   test_parse_origin   s    "rv   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  x|D ]}g }d }d }x:|D ]2}|dkr2t |}q|dkrDt |}q|| qW d|}|d k	rl|d k	sptt| tt||| y| | W nZ tk
r } z<t| |jj|kst|jj	|kst|jj
|kstW d d }~X Y qX dstdqW d S )N<>rj   Fz!parser failed to report an error!)lenr$   joinr"   rq   rr   r   r,   r3   startend)	parse_fnZerror_descsZ
error_descZlettersr{   r|   Z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 )N)rd   )r   )r3   )rd   r   r   r}     s    z#test_parse_errors.<locals>.parse_fn)r   _parser_error_tests)rd   r}   r   )rd   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:      )rd   )r   rs   rt   _extra_op_parser_testsr   )rd   r   r   r   test_parse_extra_op$  s    r   )(Z
__future__r   __all__tokenizerp   Z	six.movesr   StringIOZpatsyr   Zpatsy.originr   Zpatsy.infix_parserr   r   r	   r
   Zpatsy.tokensr   r   Z
patsy.utilr   rc   r   r.   r5   rX   Z_unary_tilderb   r   rt   rm   rs   ru   rv   r   r   r   r   r   r   r   r   r   <module>
   s   	&








