
    gx                        d dgZ ddlZddlZddlZddlZddlZddlZddlmZ ddl	m
Z
mZmZ ddlmZmZmZ ddlmZ d Z e       Z G d	 d
e      Zd Zd Zd Zd Z G d d e      Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$i Z% e&di e%       ddl'Z G d de      Z(d Z)d Z* G d de      Z+d Z,d  Z-d! Z.d" Z/d# Z0d$ Z1 G d% d&e      Z2d' Z3d( Z4y))EvalEnvironment
EvalFactor    N)
PatsyError)PushbackAdapterno_picklingassert_no_pickling)pretty_untokenizenormalize_token_spacingpython_tokenize)call_and_wrap_excc                      d} t         j                  D ]G  }t        t         |      }|j                         }||t        j
                  kD  s9| |j                  z  } I | S Nr   )
__future__all_feature_namesgetattrgetMandatoryReleasesysversion_infocompiler_flag)flagsfeature_namefeaturemrs       G/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/patsy/eval.py_all_future_flagsr      sa    E"44 +*l3((* :c...W***E+ L    c                   6    e Zd Zd Zd Zd Zd ZddZd Ze	Z
y)	VarLookupDictc                 ,    i gt        |      z   | _        y N)list_dicts)selfdictss     r   __init__zVarLookupDict.__init__/   s    dT%[(r   c                 f    | j                   D ]	  }	 ||   c S  t        |      # t        $ r Y "w xY wr    )r"   KeyError)r#   keyds      r   __getitem__zVarLookupDict.__getitem__2   sC     	Av	
 sm  s   $	00c                 (    || j                   d   |<   y r   )r"   )r#   r(   values      r   __setitem__zVarLookupDict.__setitem__:   s    #Asr   c                 .    	 | |    y# t         $ r Y yw xY w)NTFr'   )r#   r(   s     r   __contains__zVarLookupDict.__contains__=   s'    	I   		s    	Nc                 0    	 | |   S # t         $ r |cY S w xY wr    r/   )r#   r(   defaults      r   getzVarLookupDict.getE   s%    	9 	N	s    c                 N    | j                   j                  d| j                  dS N())	__class____name__r"   r#   s    r   __repr__zVarLookupDict.__repr__K   s    >>22DKK@@r   r    )r9   
__module____qualname__r%   r*   r-   r0   r3   r;   r   __getstate__ r   r   r   r   .   s(    )$A Lr   r   c                  ^   ddi} ddd}t        | |g      }|d   dk(  sJ |d   dk(  sJ d|v sJ d|vsJ dd l}|j                  t        |j                  d       d	|d<   |d   d	k(  sJ | d   dk(  sJ |j                  d      J t        t        |      t              sJ t        |       y )
Na         rA   brF   cr   
   )
r   pytestraisesr'   r*   r3   
isinstancereprstrr   )d1d2dsrI   s       r   test_VarLookupDictrQ   Q   s    
qBq	B	Bx	 Bc7a<<c7a<<"99b==
MM(BNNC0BsGc7b==c7a<<66#;d2h$$$rr   c              #     K   t         j                  t         j                  t         j                  f}|t         j                  t         j
                  fz  }t        j                  t        j                  |             D ]B  }t        ||      rt        d      t        |t         j                        s5|j                   D yw)z~Iterator that yields all the (ast) names in a Python expression.

    :arg code: A string containing a Python expression.
    zcLambda, list/dict/set comprehension, generator expression in patsy formula not currently supported.N)astLambdaListCompGeneratorExpDictCompSetCompwalkparserK   r   Nameid)codedisallowed_ast_nodesnodes      r   	ast_namesr`   e   s       JJc6F6FGS\\3;;774) d01G  dCHH%''Ms   B/C2Cc                      dddgfddgfdddgfddgfg} | D ]'  \  }}t        t        |            t        |      k(  r'J  y )Nz	np.log(x)npxzcenter(x + 1)centerzdt.date.dt.monthdt)setr`   )	test_datar]   expecteds      r   test_ast_namesri   y   sd    	tSk"	se	8S/*	dV$	I $ 5h9T?#s8}4445r   c                      dd l } d }| j                  t        |d       | j                  t        |d       | j                  t        |d       | j                  t        |d       | j                  t        |d       y )Nr   c                 *    t        t        |             S r    )r!   r`   r]   s    r   list_ast_namesz7test_ast_names_disallowed_nodes.<locals>.list_ast_names   s    IdO$$r   zlambda x: x + yz[x + 1 for x in range(10)]z(x + 1 for x in range(10))z{x: True for x in range(10)}z{x + 1 for x in range(10)})rI   rJ   r   )rI   rm   s     r   test_ast_names_disallowed_nodesrn      sa    % MM*n.?@
MM*n.JK
MM*n.JK
MM*n.LM
MM*n.JKr   c                   n    e Zd ZdZddZed        Zd Zdi fdZe	dd       Z
d Zd	 Zd
 Zd Zd ZeZy)r   z}Represents a Python execution environment.

    Encapsulates a namespace for variable lookup and set of __future__
    flags.c                 J    |t          z  rJ t        |      | _        || _        y r    )_ALL_FUTURE_FLAGSr!   _namespacesr   )r#   
namespacesr   s      r   r%   zEvalEnvironment.__init__   s(    -----
+
r   c                 ,    t        | j                        S )znA dict-like object that can be used to look up variables accessible
        from the encapsulated environment.)r   rr   r:   s    r   	namespacezEvalEnvironment.namespace   s     T--..r   c                 V    | j                  | j                  |gz   | j                        S )zReturn a new EvalEnvironment with an extra namespace added.

        This namespace will be used only for variables that are not found in
        any existing namespace, i.e., it is "outside" them all.)r8   rr   r   )r#   outer_namespaces     r   with_outer_namespacez$EvalEnvironment.with_outer_namespace   s'    
 ~~d../1BBDJJOOr   z<string>c                 |    t        ||d| j                  d      }t        |i t        |g| j                  z               S )at  Evaluate some Python code in the encapsulated environment.

        :arg expr: A string containing a Python expression.
        :arg source_name: A name for this string, for use in tracebacks.
        :arg inner_namespace: A dict-like object that will be checked first
          when `expr` attempts to access any variables.
        :returns: The value of `expr`.
        evalF)compiler   rz   r   rr   )r#   exprsource_nameinner_namespacer]   s        r   rz   zEvalEnvironment.eval   s<     t[&$**eDD"m_,=@P@P,PQRRr   c                 x   t        ||       r|S t        |t        j                        r||z   }nt        d      t	        j
                         }	 t        |dz         D ]  }|t        d      |j                  }  | |j                  |j                  g|j                  j                  t        z        ~S # ~w xY w)a  Capture an execution environment from the stack.

        If `eval_env` is already an :class:`EvalEnvironment`, it is returned
        unchanged. Otherwise, we walk up the stack by ``eval_env + reference``
        steps and capture that function's evaluation environment.

        For ``eval_env=0`` and ``reference=0``, the default, this captures the
        stack frame of the function that calls :meth:`capture`. If ``eval_env
        + reference`` is 1, then we capture that function's caller, etc.

        This somewhat complicated calling convention is designed to be
        convenient for functions which want to capture their caller's
        environment by default, but also allow explicit environments to be
        specified. See the second example.

        Example::

          x = 1
          this_env = EvalEnvironment.capture()
          assert this_env.namespace["x"] == 1
          def child_func():
              return EvalEnvironment.capture(1)
          this_env_from_child = child_func()
          assert this_env_from_child.namespace["x"] == 1

        Example::

          # This function can be used like:
          #   my_model(formula_like, data)
          #     -> evaluates formula_like in caller's environment
          #   my_model(formula_like, data, eval_env=1)
          #     -> evaluates formula_like in caller's caller's environment
          #   my_model(formula_like, data, eval_env=my_env)
          #     -> evaluates formula_like in environment 'my_env'
          def my_model(formula_like, data, eval_env=0):
              eval_env = EvalEnvironment.capture(eval_env, reference=1)
              return model_setup_helper(formula_like, data, eval_env)

        This is how :func:`dmatrix` works.

        .. versionadded: 0.2.0
           The ``reference`` argument.
        zWParameter 'eval_env' must be either an integer or an instance of patsy.EvalEnvironment.rB   zcall-stack is not that deep!)rK   numbersIntegral	TypeErrorinspectcurrentframerange
ValueErrorf_backf_locals	f_globalsf_codeco_flagsrq   )clseval_env	referencedepthframeis         r   capturezEvalEnvironment.capture   s    Z h$O'"2"23y(E;  $$&	519% %=$%CDD% 1%%(99 s   A%B6 6B9c                     t        | j                        t        fd|D              }t        |g| j                        S )zWCreates a new, flat EvalEnvironment that contains only
        the variables specified.c              3   ,   K   | ]  }||   f  y wr    r?   ).0namevlds     r   	<genexpr>z)EvalEnvironment.subset.<locals>.<genexpr>  s     :DtSY':s   )r   rr   dictr   r   )r#   namesnew_nsr   s      @r   subsetzEvalEnvironment.subset   s8     D,,-:E::x44r   c                 R    | j                   D cg c]  }t        |       c}S c c}w r    )rr   r\   )r#   ns     r   _namespace_idszEvalEnvironment._namespace_ids  s     #//0!1000s   $c                     t        |t              xr< | j                  |j                  k(  xr! | j                         |j                         k(  S r    )rK   r   r   r   r#   others     r   __eq__zEvalEnvironment.__eq__  sG    uo. @

ekk)@##%)=)=)??	
r   c                     | |k(   S r    r?   r   s     r   __ne__zEvalEnvironment.__ne__      5=  r   c                 h    t        t        | j                  t        | j	                               f      S r    )hashr   r   tupler   r:   s    r   __hash__zEvalEnvironment.__hash__  s&    _djj%8K8K8M2NOPPr   N)r   )r   r   )r9   r<   r=   __doc__r%   propertyru   rx   rz   classmethodr   r   r   r   r   r   r   r>   r?   r   r   r   r      sk    

 / /
P &0 
S E EN51
!Q Lr   c                      d} t               S NrB   _b)_as    r   r   r         	
B4Kr   c                      d} t               S r   _cr   s    r   r   r     r   r   c            	          d} t         j                         t         j                  d      t         j                  d      t         j                  dd      t         j                  d      t         j                  dd      gS )NrB   r   )r   rC   r   r   r   s    r   r   r   !  sj    	
B!""Q/"1% r   c                  :   t               \  } }}}}}d| j                  v sJ d|j                  v sJ d|j                  v sJ d|j                  v sJ d|j                  v sJ d|j                  v sJ | j                  d   dk(  sJ |j                  d   dk(  sJ |j                  d   dk(  sJ |j                  d   dk(  sJ |j                  d   dk(  sJ |j                  d   dk(  sJ |j                  d   t        u sJ |j                  d   t        u sJ dd l}|j	                  t
        t        j                  d       t        j                  |      |u sJ |j	                  t        t        j                  d       t        t        j                                y )	N&test_EvalEnvironment_capture_namespacer   rB   r   r   r   i@B g333333?)
r   ru   r   rI   rJ   r   r   r   r   r   )c0rG   b1b2a1a2rI   s          r   r   r   -  s   DB2r2r3r||CCC3q{{BBB3r||CCC3r||CCC3r||CCC3r||CCC<<""";;t!!!<<"""<<"""<<"""<<"""<<###<<###
MM*o55u=""2&",,,
MM)_44c:..01r   c                  F   d} t        t        |       j                  }|t        z  sJ d}t	        |dddd      }t
        d d d	}t        |      }t        ||       |d
   j                  d   dk(  sJ |d   j                  d   dk(  sJ d|d   j                  vsJ |d
   j                  t        z  dk(  sJ |d   j                  t        z  dk(  sJ |d   j                  t        z  dk(  sJ t	        d| d|z   dddd      }t        ||       |d
   j                  d   dk(  sJ |d   j                  d   dk(  sJ d|d   j                  vsJ |d
   j                  t        z  |k(  sJ |d   j                  t        z  dk(  sJ |d   j                  t        z  |k(  sJ y )Nbarry_as_FLUFLzdef f():
    in_f = 'hi from f'
    global RETURN_INNER, RETURN_OUTER, RETURN_INNER_FROM_OUTER
    RETURN_INNER = EvalEnvironment.capture(0)
    RETURN_OUTER = call_capture_0()
    RETURN_INNER_FROM_OUTER = call_capture_1()
f()
z<test string>execr   rB   c                  ,    t         j                  d      S r   r   r?   r   r   <lambda>z4test_EvalEnvironment_capture_flags.<locals>.<lambda>Z      /"9"9!"< r   c                  ,    t         j                  d      S r   r   r?   r   r   r   z4test_EvalEnvironment_capture_flags.<locals>.<lambda>[  r   r   )r   call_capture_0call_capture_1RETURN_INNERin_fz	hi from fRETURN_INNER_FROM_OUTERRETURN_OUTERzfrom __future__ import 
z<test string 2>)
r   r   r   rq   r{   r   r   r   ru   r   )TEST_FEATURE	test_flagsourcer]   envenv2code2s          r   "test_EvalEnvironment_capture_flagsr   H  s    $L
L1??I((((	  6?FAq9D*<<C
 9DsO~((0K???()33F;{JJJ^,66666~$$'88A===~$$'88A===()//2CCqHHH*6	8FB		E 	))&1[@@@)*44V<KKKn-77777%%(99YFFF%%(99Q>>>)*003DD	QQQr   c                     t        ddig      } | j                  d      dk(  sJ | j                  dddi      dk(  sJ dd l}|j                  t        | j                  d       d	}t         j                  d      }|j                  d      d
k(  sJ | j                  dd	d      }|j                  d      dk(  sJ |j                  d      d
k(  sJ y )NrA   rB   z2 * arC   r~      r   z2 * brD      rH   rE   )r   rz   rI   rJ   	NameErrorr   rx   )r   rI   rA   r   env3s        r   #test_EvalEnvironment_eval_namespacer   v  s    
C8*
%C88G!!!88Gc1X86!;;;
MM)SXXw/	A""1%D99W"""##"1$56D99W"""99W"""r   c                  ~   dd l } t        j                  j                  }|t        z  sJ t        ddigd      }|j                  d      dk(  sJ | j                  t        |j                  d       |j                  dg      j                  dk(  sJ |j                  dd	i      j                  dk(  sJ t        ddig|      }|j                  d      dk(  sJ | j                  t        |j                  d       |j                  dg      j                  |k(  sJ |j                  dd	i      j                  |k(  sJ y )
Nr   rA      )r   za != 0Tza <> 0rF   rH   )rI   r   r   r   rq   r   rz   rJ   SyntaxErrorr   r   rx   )rI   r   r   r   s       r   test_EvalEnvironment_eval_flagsr     s%    ))77I((((
C9+Q
/C88H%%%
MM+sxx2::se""a'''##S"I.44999S"I;i8D99X$&&&
MM+tyy(3;;u##y000$$c2Y/55BBBr   c                     t        ddiddiddig      } | j                  dg      }|j                  d      dk(  sJ dd l}|j	                  t
        |j                  d       |j	                  t
        |j                  d       | j                  ddg      }|j                  d      d	k(  sJ |j	                  t
        |j                  d       y )
NrA   rB   rF   rC   rG   rD   r   zb * cr   )r   r   rz   rI   rJ   r   )r   subset_arI   	subset_bcs       r   test_EvalEnvironment_subsetr     s    
C8c1XQx8
9Czz3% H=="""
MM)X]]C0
MM)X]]C0

C:&I>>'"a'''
MM)Y^^S1r   c                     dd l } t        j                  dk\  r| j                  d       t        j                  d      }t        j                  d      }||k(  sJ t        |      t        |      k(  sJ d } |       } |       }||k7  sJ y )Nr   )rD      ze`frame.f_locals` may return write-through proxies in Python 3.13+, breaking direct comparison by ids.c                  ,    t         j                  d      S r   r   r?   r   r   r   z)test_EvalEnvironment_eq.<locals>.<lambda>  s     7 7 : r   )rI   r   r   skipr   r   r   )rI   env1r   capture_local_envr   env4s         r   test_EvalEnvironment_eqr     s    
7"1	
 ""1%D""1%D4<<:d###:DD4<<r   zfrom patsy.builtins import *c                   T    e Zd ZddZd Zd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd ZeZy)r   Nc                 2    t        |      | _        || _        y)a/  A factor class that executes arbitrary Python code and supports
        stateful transforms.

        :arg code: A string containing a Python expression, that will be
          evaluated to produce this factor's value.

        This is the standard factor class that is used when parsing formula
        strings and implements the standard stateful transform processing. See
        :ref:`stateful-transforms` and :ref:`expert-model-specification`.

        Two EvalFactor's are considered equal (e.g., for purposes of
        redundancy detection) if they contain the same token stream. Basically
        this means that the source code must be identical except for
        whitespace::

          assert EvalFactor("a + b") == EvalFactor("a+b")
          assert EvalFactor("a + b") != EvalFactor("b + a")
        N)r
   r]   origin)r#   r]   r   s      r   r%   zEvalFactor.__init__  s    . ,D1	r   c                     | j                   S r    rl   r:   s    r   r   zEvalFactor.name  s    yyr   c                 N    | j                   j                  d| j                  dS r5   )r8   r9   r]   r:   s    r   r;   zEvalFactor.__repr__  s    >>22DII>>r   c                 X    t        |t              xr | j                  |j                  k(  S r    )rK   r   r]   r   s     r   r   zEvalFactor.__eq__  s!    %,Hejj1HHr   c                     | |k(   S r    r?   r   s     r   r   zEvalFactor.__ne__  r   r   c                 8    t        t        | j                  f      S r    )r   r   r]   r:   s    r   r   zEvalFactor.__hash__  s    Z+,,r   c                    i d<   j                  t              j                  }t        | j                        D cg c]	  }||v s| }}j                  |      d<   dgfd}t        | j                  |      }|d<   t        d   | j                        r"t        dt        dt        j                        i d<   d   D ]d  }t        ||      }	t        |	      d	k(  sJ |	d   }
|
\  }}||d
z   k(  sJ |j                  |dz         sJ |dz   |t        |      d  z   }|d   |<   f g }t        d         }|rrt               }|D ]:  }|j                  |g      }d   |   }t        ||      r*|j!                  |       < |sJ |j#                  |       |j%                  |       |rr|d<   t        |      S c c}w )N
transformsr   r   c                     j                   j                  |       }t        |d      r6dd   d| d}dxx   dz  cc<   |j                         }|d   |<   |dz   S | S )N__patsy_stateful_transform___patsy_stobjr   __rB   r   
.transform)ru   r3   hasattrr   )tokenr,   obj_nameobjr   r   states       r   new_name_makerz9EvalFactor.memorize_passes_needed.<locals>.new_name_maker  sl    &&**51Eu<=56qT5A!	88:03l#H-,..r   	eval_codez2names of this form are reserved for internal use (r7   memorize_coderB   r   r6   z.memorize_chunk	pass_bins)rx   _builtins_dictru   r`   r]   r   replace_bare_funcallshas_bare_variable_referencer   r   r   capture_obj_method_callslen
startswithrf   
differenceadddifference_updateappend)r#   r   r   env_namespacer   subset_namesr   r  r   transform_callstransform_calltransform_call_nametransform_call_coder  r  unsortedpass_bin
other_objsr   s    ``               @r   memorize_passes_neededz!EvalFactor.memorize_passes_needed  s%    !l00@ **)2499)=WAVWW??<0$j C		 *$))^D	&k 'u\':DIIFNSU  "$ol+ 	=H6xKO'1,,,,Q/N7E4!4&(\*AAAA&112E2KLLL#$%c*=&>&@AB 
 0=E/"8,	=: 	u\*+uH$ +%00(<
 %o 6x @2:}MLL*	+
 O8&&x0X&  'k9~U Xs   	GGc                 \    t        ||d   g      }t        d| |d   j                  ||      S )Nr   zError evaluating factorr   r   )r   r   rz   )r#   r]   memorize_statedatar~   s        r   _evalzEvalFactor._evalD  s=    '~l/K(LM %:&+++
 	
r   c                 P    |d   |   D ]  }| j                  |d   |   ||        y )Nr  r  r  )r#   r   
which_passr  r   s        r   memorize_chunkzEvalFactor.memorize_chunkN  s7    k*:6 	FHJJu_-h7E	Fr   c                 J    |d   |   D ]  }|d   |   j                           y )Nr  r   )memorize_finish)r#   r   r  r   s       r   r!  zEvalFactor.memorize_finishR  s1    k*:6 	<H,)99;	<r   c                 .    | j                  |d   ||      S )Nr  r  )r#   r  r  s      r   rz   zEvalFactor.evalV  s    zz.5~tLLr   r    )r9   r<   r=   r%   r   r;   r   r   r   r  r  r  r!  rz   r   r>   r?   r   r   r   r     sE    4?I!-Qf
F<M Lr   c                     t        d      } | j                  dk(  sJ | j                         dk(  sJ t        dd      }| |k(  sJ t        |       t        |      k(  sJ | j                  J |j                  dk(  sJ t        |        y )Nza+bza + bza    +basdf)r   )r   r]   r   r   r   r   )ee2s     r   test_EvalFactor_basicsr'  \  s    5A66W668w	If	-B7N77d2h8899qr   c                     ddl m}   | d       } | d       } | d       }t        d      }i }t        j	                  d      }|j                  ||      }t        |       t        |       |dk(  sJ dD ]#  }|d	   j                  |   t               |   u r#J  d
D ]  }||d	   j                  vrJ  |d   dddddk(  sJ |d   dk(  sJ |d   dddddk(  sJ |d   t        g d      t        dg      gk(  sJ y )Nr   stateful_transformc                       y)NFOO-OBJr?   r?   r   r   r   z8test_EvalFactor_memorize_passes_needed.<locals>.<lambda>l      r   c                       y)NBAR-OBJr?   r?   r   r   r   z8test_EvalFactor_memorize_passes_needed.<locals>.<lambda>m  r-  r   c                       y)NQUUX-OBJr?   r?   r   r   r   z8test_EvalFactor_memorize_passes_needed.<locals>.<lambda>n  r-  r   z!foo(x) + bar(foo(y)) + quux(z, w)rC   )foobarquuxr   )wrc   yzr%  r   r   r,  r/  r1  )_patsy_stobj0__foo___patsy_stobj1__bar___patsy_stobj2__foo___patsy_stobj3__quux__r  z_patsy_stobj0__foo__.transform(x) + _patsy_stobj1__bar__.transform(_patsy_stobj2__foo__.transform(y)) + _patsy_stobj3__quux__.transform(z, w)r  z&_patsy_stobj0__foo__.memorize_chunk(x)zF_patsy_stobj1__bar__.memorize_chunk(_patsy_stobj2__foo__.transform(y))z&_patsy_stobj2__foo__.memorize_chunk(y)z*_patsy_stobj3__quux__.memorize_chunk(z, w)r  )r8  r:  r;  r9  )
patsy.stater*  r   r   r   r  printru   localsrf   )	r*  r2  r3  r4  r%  r   r   passesr   s	            r   &test_EvalFactor_memorize_passes_neededr@  i  sr   .
.
/C
.
/C01D67AE&&q)H%%eX6F	&M	%LQ;;& CZ **40FHTNBBBC2 75,666667 ) ) )!+	#    	k 3 	3	3 ! H h H!M	&    UV#$%"   r   c                   $    e Zd Zd Zd Zd Zd Zy)_MockTransformc                 .    d| _         d| _        d| _        y r   )_sum_memorize_chunk_called_memorize_finish_calledr:   s    r   r%   z_MockTransform.__init__  s    	&'#'($r   c                 ~    | xj                   dz  c_         dd l}| xj                  |j                  |      z  c_        y )NrB   r   )rE  numpyrD  sum)r#   r  rb   s      r   r  z_MockTransform.memorize_chunk  s,    ##q(#		RVVD\!	r   c                 .    | xj                   dz  c_         y r   )rF  r:   s    r   r!  z_MockTransform.memorize_finish  s    $$)$r   c                      || j                   z
  S r    )rD  )r#   r  s     r   	transformz_MockTransform.transform  s    diir   N)r9   r<   r=   r%   r  r!  rL  r?   r   r   rB  rB    s    )
"* r   rB  c            
         ddl m}   | t              }t        d      }i }t        j                  d      }|j                  ||      }t        |       t        |       |dk(  sJ |d   j                  d   |u sJ dD ]  }||d   j                  vrJ  dd l	}|j                  |d|j                  ddg      |j                  d	d
g      d       |d   d   j                  dk(  sJ |d   d   j                  dk(  sJ |j                  |d|j                  ddg      |j                  ddg      d       |d   d   j                  dk(  sJ |d   d   j                  dk(  sJ |d   d   j                  dk(  sJ |d   d   j                  dk(  sJ |j                  |d       |d   d   j                  dk(  sJ |d   d   j                  dk(  sJ |d   d   j                  dk(  sJ |d   d   j                  dk(  sJ |j                  |d|j                  ddg      |j                  d	d
g      d       |j                  |d|j                  ddg      |j                  ddg      d       |j                  |d       |d   j                         D ]$  }|j                  dk(  sJ |j                  dk(  r$J  |j!                  |j#                  ||j                  g d      |j                  g d      d      g dk(        sJ y )Nr   r)  zfoo(x) + foo(foo(y))rC   r   r2  )rc   r6  r%  r   rB   rH   r   )rc   r6  r   r8  r:     d   rD   _patsy_stobj1__foo__)rB   rC   rN  rO  )rH   r   rP  rD   )      ic     )r<  r*  rB  r   r   r   r  r=  ru   rH  r  arrayrE  rF  r!  valuesallrz   )	r*  r2  r%  r   r   r?  r   rb   rL  s	            r   test_EvalFactor_end_to_endrX    sS   .
^
,C)*AE&&q)H%%eX6F	&M	%LQ;;&&u-444( 75,666667UARXXq!f%5BHHb"X<NOP56MMQRRRR56MMQRRRRUARXXr3i%8rxxa?QRS56MMQRRRR56MMQRRRR56NNRSSSS56NNRSSSSeQ56NNRSSSS56NNRSSSS56MMQRRRR56NNRSSSSUARXXq!f%5BHHb"X<NOPUARXXr3i%8rxxa?QRSeQ<(//1 6	//144400A5556 66	uBHH_5BHHEU<VWX	   r   c              #     K   d}t        t        |             }|D ]b  \  }}}i }| xr |t        j                  k(  |d<   |d   xr( |j	                         xr |j                         d   dk(  |d<   ||||f |dk(  }d y w)NFbare_refrB   r6   bare_funcall.)r   r   tokenizeNAMEhas_morepeek)r]   prev_was_dotit
token_typer   r   propss          r   annotated_tokensre    s     L	.	/B%' $!
E6 ,,Lx}}1Lj*G"++-GBGGIaLC4G 	n 5&%00|$s   A?Bc                     t        d      D  cg c]  \  } }}}| ||f }}}} }|t        j                  ddddft        j                  ddddft        j                  ddddft        j                  ddddft        j                  d	dddft        j                  d
dddft        j                  ddddft        j                  ddddfgk(  sJ t	        t        t        d                  dk(  sJ y c c}}}} w )Nz
a(b) + c.drA   T)rZ  r[  r6   FrF   r7   +rG   r\  r)   rc   rB   )re  r]  r^  OPr  r!   )rc  r   r   rd  tokens_without_originss        r   test_annotated_tokensrj    s    4DL3Q .Z 
UE"  "	$EF	cuEF	$FG	cuEF	cuEF	$FG	cuEF	%GH	& 	 	 	 t$S)*+q000!s   C9
c                 F    t        |      D ]  \  }}}}|d   s|| v s y y)NrZ  TF)re  )r   r]   _r   rd  s        r   r  r    s5    .t4 5!U% r   c                     g }t        |       D ],  \  }}}}|d   r|d   r ||      }|j                  ||f       . t        |      S )NrZ  r[  )re  r  r	   )r]   replacertokensrc  r   r   rd  s          r   r  r    sZ    F,<T,B +(
E65~!6UOEz5)*+ V$$r   c                      d fd}  | dd        | dd        | dd        | dd        | d	d	        | d
d       y )Nc                 ,    dddj                  | |       S )NrF   z_internal.foo.process)rA   r2  )r3   )r   s    r   	replacer1z-test_replace_bare_funcalls.<locals>.replacer1  s    !89==eUKKr   c                 j    t        |       }t        | d|       t        d|d       ||k(  sJ y )Nz -> z(wanted r7   )r  r=  )r]   rh   replacedrr  s      r   t1z&test_replace_bare_funcalls.<locals>.t1  s5    (y9D(+,x)*8###r   zfoobar()za()zb()z
foobar.a()zfoo()z_internal.foo.process()za + 1zb() + a() * x[foo(2 ** 3)]z,b() + b() * x[_internal.foo.process(2 ** 3)]r?   )ru  rr  s    @r   test_replace_bare_funcallsrv    sO    L$ z:ue|\"w)*w#%STr   c                       e Zd Zd Zd Zy)_FuncallCapturerc                 R    |g| _         ||fg| _        d| _        d| _        d| _        y )Nr   F)funcro  paren_depthstarteddone)r#   start_token_typestart_tokens      r   r%   z_FuncallCapturer.__init__  s0     M	(+67	r   c                    | j                   ry | j                  j                  ||f       |dv r| xj                  dz  c_        |dv r| xj                  dz  c_        | j                  dk\  sJ | j                  sB|dk(  rd| _        n5|t
        j                  k(  s|dk(  sJ | j                  j                  |       | j                  r| j                  dk(  rd| _         y y y )N)r6   {[rB   )r7   }]r   r6   Tr\  )r}  ro  r  r{  r|  r]  r^  rz  )r#   rc  r   s      r   	add_tokenz_FuncallCapturer.add_token&  s    99J./O#!O#!1$$$|||#!X]]2eslBB		  '<<D,,1DI 2<r   N)r9   r<   r=   r%   r  r?   r   r   rx  rx    s    r   rx  c                 6   g }t        |      D ]G  \  }}}}|D ]  }|j                  ||        |d   s'|| k(  s-|j                  t        ||             I |D cg c]2  }dj	                  |j
                        t        |j                        f4 c}S c c}w )NrZ   )re  r  r  rx  joinrz  r	   ro  )r   r]   	capturersrc  r   r   rd  capturers           r   r  r  ;  s    I,<T,B B(
E65! 	2Hz51	2(!2-j%@A	B " 
	!28??!CD  s   7Bc                      t        dd      dgk(  sJ t        dd      dgk(  sJ t        dd      ddgk(  sJ t        d	d
      dgk(  sJ y )Nr2  za + foo.baz(bar) + b.c(d))foo.bazzfoo.baz(bar)rF   )zb.czb.c(d)foo.bar(foo.baz(quux)))zfoo.barr  )r  zfoo.baz(quux)r3  zfoo[bar.baz(x(z[asdf])) ** 2])zbar.bazzbar.baz(x(z[asdf])))r  r?   r   r   test_capture_obj_method_callsr  H  s    #E+FG#L    $C)DEJ    $E+CD-$I    $E+JK*P   r   )5__all__r   r   r   r]  rS   r   patsyr   
patsy.utilr   r   r   patsy.tokensr	   r
   r   patsy.compatr   r   rq   objectr   rQ   r`   ri   rn   r   r   r   r   r   r   r   r   r   r   r  r   patsy.builtinsr   r'  r@  rB  rX  re  rj  r  r  rv  rx  r  r  r?   r   r   <module>r     s   l
+  
   
   G G T T *
 &'  F  F((5
LCf CL

	26+R\# C*2*  #R 8 R Rj
(V V  (/d
$1(%U$v <
r   