o
    #e&                     @   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 g d
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i d"dd#gd$dd#gd%dd#gd#dd#gd&dd&gd'g d(d)g d(d*g d(d+dd&dd,ggd-ddg d.d/ggd0dddd&g d1gd2ggd3dg d4gd5dg d4gd6dg d.g d7gd8ddd&g d9ggd:ddg d;ggd<ddg d=ggddd&g d>ggddg d.d/ggddd&g d>ggddd&g d?ggdd&gddd#ggd@ZdAdB ZdCdD Z dEdF Z!dGdH Z"g dIZ#dJdK Z$g fdLdMZ%dg dNgddd&g dOggdPZ&dQdR Z'dS )S    )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 dS  t y   Y dS w )NFT)
ValueError)fv r   3lib/python3.10/site-packages/patsy/parse_formula.py_is_a   s   
r   c                 C   s  g }g }g }d}| D ]E\}}}|dksJ |dkr'||v r'|  |||f  n)|dv r/|d7 }|dv r7|d8 }|dk r@td||| || || q
|dkrtt||}	|	dkrbd}
n|	dkrid	}
ntt|	sstt|	rvd
}
nd}
t|
t	
||	dS tdt	
|)Nr   )([{   ))]}zunmatched close bracket0r   1r   r   r   )extraz.unclosed bracket in embedded Python expression)	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|vsJ d|vsJ t jt jd}|D ]}|||< qt|}|d tt| }|D ] \}}}||v r@t || |V  q.||||f t||V  q.d S )Nr   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"   

r4   c                  C   sZ  d} t t| g d}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 ]&\}}t|tsJ |j|d ksJ |j	|d ksJ |j
|d ksJ qd S ))Nz&y ~ a + (foo(b,c +   2)) + -1 + 0 + 10)+-~r   r   r   yr7               ar5            	      zfoo(b, c + 2)         r6         r      r          r       !   r   "   #   r   $   &   Z10)listr4   r   r   r.   r/   r$   
isinstancetyper+   r!   )r2   tokensZ	expectedsgotexpectedr   r   r   test__tokenize_formula`   s.   rW   r7   r   ir9   r5   d   r6   *   /:i,  **i  c                 C   sz   |   sd} |D ]}|jdk rtdqt| }dd |D }tt| ||t}t|tr2|j	dkr;t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>r7   )stripZ
precedencer   _default_opsr	   r4   _atomic_token_typesrR   r
   rS   r+   )r2   extra_operatorsr_   Z	operatorsr3   treer   r   r   r      s   

 r     z 
 r=   za ~ b)r7   r=   bz(a ~ b)za ~ ((((b))))za ~ ((((+b))))rh   z	a + b + c)r5   r=   rh   cza + (b ~ c) + d)r7   rh   ri   dza + np.log(a, base=10))r5   r=   znp.log(a, base=10)za + np . log(a , base = 10)za + b ~ c * d)rY   ri   rj   z	a + b * c)rY   rh   ri   z-a**2)r]   r=   2z-a:b)r\   r=   rh   )r\   rh   ri   )r[   rh   ri   )za + b:cz	(a + b):cza*b:cza+b / cz~ az-1c                 C   st   t | tsJ | jr)| j|d ksJ t| j|dd  D ]	\}}t|| qd S | jtv s0J | jj|ks8J d S )Nr   r   )	rR   r
   argsrS   r$   _compare_treesrc   tokenr!   )rU   rV   argZexpected_argr   r   r   rm      s   rm   c                 C   sH   t | D ]\}}t||d}tt|t| t| t|| qd S Nrd   )sixZ	iteritemsr   printreprrm   )Z
test_casesrd   r2   rV   actualr   r   r   _do_parse_test   s   rv   c                   C   s   t tg  d S )N)rv   _parser_testsr   r   r   r   test_parse_formula   s   rx   c                  C   s   t d} | jtdddksJ | jjtdddksJ | jd jtdddks)J | jd jtdddks7J | jd jjtddd	ksFJ | jd jd jtddd
ksWJ | jd jd jtdddkshJ d S )Nz	a ~ b + cr   rA   r9   r:   r   r;   r>   r?   r<   r@   )r   r+   r   rn   rl   )re   r   r   r   test_parse_origin   s   "&ry   )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 ]}|dkrt |}q|dkr t |}q|| qd|}|d ur3|d us5J t| tt||| z| | W n4 ty{ } z(t| |jj|ks[J |jjd|fv seJ |jj	|t |fv sqJ W Y d }~qd }~ww J dd S )N<>rf   r   Fz!parser failed to report an error!)
lenr#   joinrs   rt   r   r+   r2   startend)	parse_fnZerror_descsZ
error_descZlettersr~   r   ZletterZbad_codeer   r   r   _parsing_error_test   s2   


$r   c                    s    fdd}t |t d S )Nc                    s   t |  dS rp   )r   )r2   rq   r   r   r     s   z#test_parse_errors.<locals>.parse_fn)r   _parser_error_tests)rd   r   r   rq   r   test_parse_errors  s   r   )|r=   rh   )r   rh   ri   )za | bza * b|cc                  C   s4   t dddg} tt| d tt| d t| d d S )Nr   r9      rq   )r   rv   rw   _extra_op_parser_testsr   rq   r   r   r   test_parse_extra_op$  s   r   )(Z
__future__r   __all__tokenizerr   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-   r4   rW   Z_unary_tilderb   r   rw   rm   rv   rx   ry   r   r   r   r   r   r   r   r   r   <module>   s   		&








	

#
#
