
    g$                        d g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
 Zd Zd Z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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d+dddd!g d,gd-ggd.dg d/gd0dg d/gd1dg d)g d2gd3ddd!g d4ggd5ddg d6ggd7ddg d8ggddd!g d9ggddg d)d*ggddd!g d9ggddd!g d:ggdd!gdddggd;Zd< Zd= Zd> Zd? Zg d@ZdA Z g fdBZ!dg dCgddd!g dDggdEZ"dF Z#y)Gparse_formula    N)StringIO)
PatsyError)Origin)TokenOperatorinfix_parse	ParseNode)python_tokenizepretty_untokenize)PushbackAdapter)PYTHON_EXPRZEROONENUMBERc                 4    	  | |       y# t         $ r Y yw xY w)NTF)
ValueError)fvs     P/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/patsy/parse_formula.py_is_ar      s'    	!   s    	c                 >   g }g }g }d}| D ]  \  }}}|dk\  sJ |dk(  r||v r| j                  |||f        nX|dv r|dz  }|dv r|dz  }|dk  rt        d|      |j                  |       |j                  |       |j                  |        |dk(  rkt        t	        ||            }	|	dk(  rd}
n-|	dk(  rd	}
n%t        t        |	      st        t        |	      rd
}
nd}
t        |
t        j                  |      |	      S t        dt        j                  |            )Nr   )([{   ))]}zunmatched close bracket0r   1r   r   r   )extraz.unclosed bracket in embedded Python expression)	push_backr   appendr   zipr   intfloatr   r   combine)it
end_tokenspytypestoken_stringsoriginsbracket_levelpytypetoken_stringorigin	expr_text
token_types              r   _read_python_exprr4   %   sG    GMGM(* $f!!!A,*"<LL&,78?*QM?*QM16??v\*v %c'=&AB	J#J3	"eE9&=!J&JZ!8	JJ?PWAX
 	
    c              #   d  K   d|vsJ d|vsJ t         j                  t         j                  d}|D ]  }|||<   	 t        |      }|j	                  d       t        t        |             }|D ]>  \  }}}||v rt        ||   |       |j                  |||f       t        ||       @ y w)Nr   r   )r   r   )	r   LPARENRPARENsetremover   r   r#   r4   )	codeoperator_stringsmagic_token_typesoperator_stringr*   r)   r/   r0   r1   s	            r   _tokenize_formular?   L   s     &&&&&&&&\\\\ , =-</*= &'Jc	.	/B(* 4$f,,),7@@LL&,78#B
334s   B.B0c                     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 ]S  \  }}t        |t              sJ |j                  |d   k(  sJ |j                  |d   k(  sJ |j                  |d   k(  rSJ  y ))Nz&y ~ a + (foo(b,c +   2)) + -1 + 0 + 10)+-~r   r   r   yrC               arA            	      zfoo(b, c + 2)         rB         r      r!         r       !   r    "   #   r   $   &   10)listr?   r   r   r7   r8   r%   
isinstancetyper1   r"   )r;   tokens	expectedsgotexpecteds        r   test__tokenize_formulare   c   s   3D#D/:;F	tQ*C0	fT1a $'	tQ*C0	fT1a $'	vdAq)40	tQ+_=	vdB+T2	fT2r"D)	fT2r"D)	tR$c*	fT2r"D)	b"%s+	fT2r"D)	6$B'.I  VY/ (X#u%%%xx8A;&&&zzXa[(((yyHQK'''	(r5   rC   r   irE   rA   d   rB   *   /:i,  **i  c                 `   | j                         sd} |D ]  }|j                  dk  st        d       t        |z   }|D cg c]  }|j                   }}t        t        | |      |t              }t        |t              r|j                  dk7  rt        dd |g|j                        }|S c c}w )Nz~ 1r   z'all operators must have precedence >= 0rC   )strip
precedencer   _default_opsr3   r	   r?   _atomic_token_typesr_   r
   r`   r1   )r;   extra_operatorsop	operatorsr<   trees         r   r   r      s    ::< H==1FGGH .I09:"::$ 019>QD dI&$))s*:dTFDKK8K ;s   B+ r!    z 
 rI   za ~ b)rC   rI   bz(a ~ b)za ~ ((((b))))za ~ ((((+b))))rw   z	a + b + c)rA   rI   rw   cza + (b ~ c) + d)rC   rw   rx   dza + np.log(a, base=10))rA   rI   znp.log(a, base=10)za + np . log(a , base = 10)za + b ~ c * d)rg   rx   ry   z	a + b * c)rg   rw   rx   z-a**2)rk   rI   2z-a:b)rj   rI   rw   )rj   rw   rx   )ri   rw   rx   )za + b:cz	(a + b):cza*b:cza+b / cz~ az-1c                 "   t        | t              sJ | j                  rB| j                  |d   k(  sJ t	        | j                  |dd        D ]  \  }}t        ||        y | j                  t        v sJ | j                  j                  |k(  sJ y )Nr   r   )	r_   r
   argsr`   r%   _compare_treesrp   tokenr"   )rc   rd   argexpected_args       r   r}   r}      s    c9%%%
xxxx8A;&&&!$SXXx|!< 	.C3-	. xx....yy(***r5   c                     | j                         D ]G  \  }}t        ||      }t        t        |      t        |             t        |       t	        ||       I y Nrq   )itemsr   printreprr}   )
test_casesrq   r;   rd   actuals        r   _do_parse_testr      sM    $**, )ht_Ed4j$x.)fvx(	)r5   c                  $    t        t        g        y )N)r   _parser_tests r5   r   test_parse_formular      s    ="%r5   c                     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(  sJ | j                  d   j                  j                  t        ddd	      k(  sJ | j                  d   j                  d   j                  t        ddd
      k(  sJ | j                  d   j                  d   j                  t        ddd      k(  sJ y )Nz	a ~ b + cr   rM   rE   rF   r   rG   rJ   rK   rH   rL   )r   r1   r   r~   r|   )rt   s    r   test_parse_originr      s   %D;;&a3333::{Aq 999999Q<&a";;;;99Q<&a";;;;99Q<$${Aq(AAAA99Q<Q&&&a*CCCC99Q<Q&&&a*CCCCr5   )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                    |D ]  }g }d }d }|D ]5  }|dk(  rt        |      }|dk(  rt        |      }%|j                  |       7 dj                  |      }||J t        |       t        t	        |      ||       	  | |       J d        y # t
        $ rr}t        |       |j                  j                  |k(  sJ |j                  j                  d|fv sJ |j                  j                  |t        |      fv sJ Y d }~d }~ww xY w)N<>ru   z!parser failed to report an error!r   )
lenr$   joinr   r   r   r1   r;   startend)	parse_fnerror_descs
error_desclettersr   r   letterbad_codees	            r   _parsing_error_testr      s   ! >
  	'F}G3'lv&	' 777# S_44jd8neS)	>X >==5/>"  	8!H88==H,,,88>>aZ///88<<CX#7777		8s   ?B	DA'DDc                 0      fd}t        |t               y )Nc                     t        |       S r   )r   )r;   rq   s    r   r   z#test_parse_errors.<locals>.parse_fn  s    T?CCr5   )r   _parser_error_tests)rq   r   s   ` r   test_parse_errorsr     s    D "56r5   )|rI   rw   )r   rw   rx   )za | bza * b|cc                  |    t        ddd      g} t        t        |        t        t        |        t	        |        y )Nr   rE      r   )r   r   r   _extra_op_parser_testsr   r   s    r   test_parse_extra_opr   #  s0    Q,-O=/B)?Ko6r5   )$__all__tokenizeior   patsyr   patsy.originr   patsy.infix_parserr   r   r	   r
   patsy.tokensr   r   
patsy.utilr   rp   r   r4   r?   re   _unary_tildero   r   r   r}   r   r   r   r   r   r   r   r   r   r5   r   <module>r      s   
     F F ; &> $
N4.(4 Q%S!TS!SS!SS!SS!SS!ST1cS!SS!S )+ (c
#s S#J #s	
 #s _  _ sC#s, #_c23 cCo#>DE s$DE "C)I#J  c?O<!" #S/23#$ cC)*+%& S3()'( c301_c23Co./c301:c

3:+)&D 6>6 ') 7 ?#c301 7r5   