
    J/Phx                        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( Z4dS ))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           |          }|                                }||t          j        k    r
| |j        z  } H| S Nr   )
__future__all_feature_namesgetattrgetMandatoryReleasesysversion_infocompiler_flag)flagsfeature_namefeaturemrs       J/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/patsy/eval.py_all_future_flagsr      s`    E"4 + +*l33((** :c...W**EL    c                   8    e Zd Zd Zd Zd Zd ZddZd Ze	Z
dS )	VarLookupDictc                 6    i gt          |          z   | _        d S N)list_dicts)selfdictss     r   __init__zVarLookupDict.__init__/   s    dT%[[(r   c                 h    | j         D ]}	 ||         c S # t          $ r Y w xY wt          |          r    )r"   KeyError)r#   keyds      r   __getitem__zVarLookupDict.__getitem__2   sQ     	 	Av   smms   
""c                 &    || j         d         |<   d S r   )r"   )r#   r(   values      r   __setitem__zVarLookupDict.__setitem__:   s    #Asr   c                 :    	 | |          dS # t           $ r Y dS w xY w)NTFr'   )r#   r(   s     r   __contains__zVarLookupDict.__contains__=   s;    	II 4  	 	 	55	s    
Nc                 8    	 | |         S # t           $ r |cY S w xY wr    r/   )r#   r(   defaults      r   getzVarLookupDict.getE   s5    	9 	 	 	NNN	s   
 c                 0    | j         j        d| j        dS N())	__class____name__r"   r#   s    r   __repr__zVarLookupDict.__repr__K   s    >222DKKK@@r   r    )r9   
__module____qualname__r%   r*   r-   r0   r3   r;   r   __getstate__ r   r   r   r   .   sw        ) ) )  $ $ $     A A A LLLr   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}|                    t          |j        d           d	|d<   |d         d	k    sJ | d         dk    sJ |                    d          J t          t          |          t                    sJ t          |           d S )
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<<<<"9999b====MMM
MM(BNC000BsGc7b====c7a<<<<66#;;d2hh$$$$$rr   c              #   \  K   t           j        t           j        t           j        f}|t           j        t           j        fz  }t          j        t          j        |                     D ]D}t          ||          rt          d          t          |t           j
                  r	|j        V  EdS )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        Jc6FGS\3;774))  d011 	G   dCH%% 	'MMM r   c                      dddgfddgfdddgfddgfg} | D ]4\  }}t          t          |                    t          |          k    sJ 5d S )Nz	np.log(x)npxzcenter(x + 1)centerzdt.date.dt.monthdt)setr`   )	test_datar]   expecteds      r   test_ast_namesri   y   s{    	tSk"	se	8S/*	dV$	I $ 5 5h9T??##s8}}444445 5r   c                  ,   dd l } d }|                     t          |d           |                     t          |d           |                     t          |d           |                     t          |d           |                     t          |d           d S )Nr   c                 :    t          t          |                     S r    )r!   r`   r]   s    r   list_ast_namesz7test_ast_names_disallowed_nodes.<locals>.list_ast_names   s    IdOO$$$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      s    MMM% % % MM*n.?@@@
MM*n.JKKK
MM*n.JKKK
MM*n.LMMM
MM*n.JKKKKKr   c                   |    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dS )r   z}Represents a Python execution environment.

    Encapsulates a namespace for variable lookup and set of __future__
    flags.r   c                 V    |t            z  rJ t          |          | _        || _        d S r    )_ALL_FUTURE_FLAGSr!   _namespacesr   )r#   
namespacesr   s      r   r%   zEvalEnvironment.__init__   s2    ------
++


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                 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BDJO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D"m_,=@P,PQQRRRr   c                 h   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   Nz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33 	y(EE;   $&&	519%% % %=$%CDDD31%(99  IIIIs   AB. .B1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V  d S r    r?   ).0namevlds     r   	<genexpr>z)EvalEnvironment.subset.<locals>.<genexpr>  s,      ::DtSY'::::::r   )r   rr   dictr   r   )r#   namesnew_nsr   s      @r   subsetzEvalEnvironment.subset   sK     D,--::::E:::::x444r   c                 $    d | j         D             S )Nc                 ,    g | ]}t          |          S r?   )r\   )r   ns     r   
<listcomp>z2EvalEnvironment._namespace_ids.<locals>.<listcomp>  s    000!1000r   )rr   r:   s    r   _namespace_idszEvalEnvironment._namespace_ids  s    00t/0000r   c                     t          |t                    o9| j        |j        k    o)|                                 |                                k    S r    )rK   r   r   r   r#   others     r   __eq__zEvalEnvironment.__eq__  sL    uo.. @
ek)@##%%)=)=)?)??	
r   c                     | |k     S r    r?   r   s     r   __ne__zEvalEnvironment.__ne__      5=  r   c                 x    t          t          | j        t          |                                           f          S r    )hashr   r   tupler   r:   s    r   __hash__zEvalEnvironment.__hash__  s-    _dj%8K8K8M8M2N2NOP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      s         
   
 / / X/
P P P &0 
S 
S 
S 
S E E E [EN5 5 51 1 1
 
 
! ! !Q Q Q LLLr   c                  "    d} t                      S NrB   _b)_as    r   r   r         	
B44Kr   c                  "    d} t                      S r   _cr   s    r   r   r     r   r   c            	      :   d} t                                           t                               d          t                               d          t                               dd          t                               d          t                               dd          gS )NrB   r   )r   rC   r   r   r   s    r   r   r   !  s|    	
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}|                    t
          t          j        d           t                              |          |u sJ |                    t          t          j        d           t          t                                                     d S )	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   DDB2r2r3r|CCCC3q{BBBB3r|CCCC3r|CCCC3r|CCCC3r|CCCC<"""";t!!!!<""""<""""<""""<""""<####<####MMM
MM*o5u===""2&&",,,,
MM)_4c:::..0011111r   c                  |   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 d S )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                  6    t                               d          S r   r   r?   r   r   <lambda>z4test_EvalEnvironment_capture_flags.<locals>.<lambda>Z      /"9"9!"<"< r   c                  6    t                               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1?I(((((	  6?FAq99D*<<<< C
 99DsOOO~(0K????()3F;{JJJJ^,66666~$'88A====~$'88A====()/2CCqHHHHG*6,,	8FB		 E 	)&1[@@@@)*4V<KKKKn-77777%(99YFFFF%(99Q>>>>)*03DD	QQQQQQr   c                     t          ddig          } |                     d          dk    sJ |                     dddi          dk    sJ dd l}|                    t          | j        d           d	}t                               d          }|                    d          d
k    sJ |                     dd	d          }|                    d          dk    sJ |                    d          d
k    sJ d S )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6!;;;;MMM
MM)SXw///	A""1%%D99W""""##"1$5$566D99W""""99W""""""r   c                     dd l } t          j        j        }|t          z  sJ t          ddigd          }|                    d          dk    sJ |                     t          |j        d           |	                    dg          j
        dk    sJ |                    dd	i          j
        dk    sJ t          ddig|          }|                    d          dk    sJ |                     t          |j        d           |	                    dg          j
        |k    sJ |                    dd	i          j
        |k    sJ d S )
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     sZ   MMM )7I(((((
C9+Q
/
/
/C88H%%%%
MM+sx222::se"a''''##S"I..49999S"I;i888D99X$&&&&
MM+ty(333;;u#y0000$$c2Y//5BBBBBBr   c                     t          ddiddiddig          } |                     dg          }|                    d          dk    sJ dd l}|                    t
          |j        d           |                    t
          |j        d           |                     ddg          }|                    d          d	k    sJ |                    t
          |j        d           d S )
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
9
9Czz3%  H==""""MMM
MM)X]C000
MM)X]C000

C:&&I>>'""a''''
MM)Y^S11111r   c                  R   dd l } t          j        dk    r|                     d           t                              d          }t                              d          }||k    sJ t          |          t          |          k    sJ d } |            } |            }||k    sJ d S )Nr   )rD      ze`frame.f_locals` may return write-through proxies in Python 3.13+, breaking direct comparison by ids.c                  6    t                               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    MMM
7""1	
 	
 	
 ""1%%D""1%%D4<<<<::d####::DD4<<<<<<r   zfrom patsy.builtins import *c                   V    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dS )r   Nc                 <    t          |          | _        || _        dS )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1	r   c                     | j         S r    rl   r:   s    r   r   zEvalFactor.name  s
    yr   c                 0    | j         j        d| j        dS r5   )r8   r9   r]   r:   s    r   r;   zEvalFactor.__repr__  s    >222DIII>>r   c                 L    t          |t                    o| j        |j        k    S r    )rK   r   r]   r   s     r   r   zEvalFactor.__eq__  s     %,,Hej1H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<                        t                    j        fdt          | j                  D             }                    |          d<   dgfd}t          | j        |          }|d<   t          d         | j                  r#t          dt          dt          j
                  i d	<   d         D ]}t          ||          }t          |          d
k    sJ |d         }|\  }	}
|	|dz   k    sJ |
                    |	dz             sJ |dz   |
t          |	          d          z   }|d	         |<   g }t          d                   }|rt                      }|D ]K}|                    |g          }d	         |         }t          ||          s|                    |           L|sJ |                    |           |                    |           ||d<   t          |          S )N
transformsc                     g | ]}|v |	S r?   r?   )r   r   env_namespaces     r   r   z5EvalFactor.memorize_passes_needed.<locals>.<listcomp>  s#    WWWAVAVAVAVAVr   r   r   c                     j                             |           }t          |d          rCdd         d| d}dxx         dz  cc<   |                                }|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  s    &**511Eu<==  56qTTT555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   subset_namesr  r  r  transform_callstransform_calltransform_call_nametransform_call_coder  r  unsortedpass_bin
other_objsr   r   s    ``             @@r   memorize_passes_neededz!EvalFactor.memorize_passes_needed  s    !l00@@ *WWWW49)=)=WWW??<00$j C		 		 		 		 		 		 		 *$)^DD	&k 'u\':DIFF 	*NSeeU   "$ol+ 	= 	=H6xKKO''1,,,,,Q/N7E4!4&(\*AAAAA&112E2KLLLLL#$%c*=&>&>&@&@AB 
 0=E/"8,," 	u\*++ 		'uuH$ + +%00(<<
 %o 6x @2:}MM +LL***OOO&&x000X&&&  		' 'k9~~r   c                 n    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  sG    '~l/K(LMM %:&++
 
 
 	
r   c                 n    |d         |         D ]%}|                      |d         |         ||           &d S )Nr  r  r  )r#   r  
which_passr  r  s        r   memorize_chunkzEvalFactor.memorize_chunkN  sL    k*:6 	F 	FHJJu_-h7EEEE	F 	Fr   c                 h    |d         |         D ]"}|d         |                                           #d S )Nr  r   )memorize_finish)r#   r  r!  r  s       r   r$  zEvalFactor.memorize_finishR  sD    k*:6 	< 	<H,)99;;;;	< 	<r   c                 <    |                      |d         ||          S )Nr  r   )r#   r  r  s      r   rz   zEvalFactor.evalV  s    zz.5~tLLLr   r    )r9   r<   r=   r%   r   r;   r   r   r   r  r  r"  r$  rz   r   r>   r?   r   r   r   r     s           4  ? ? ?I I I! ! !- - -Q Q Qf
 
 
F F F< < <M M M LLLr   c                  2   t          d          } | j        dk    sJ |                                 dk    sJ t          dd          }| |k    sJ t          |           t          |          k    sJ | j        J |j        dk    sJ t          |            d S )Nza+bza + bza    +basdf)r   )r   r]   r   r   r   r   )ee2s     r   test_EvalFactor_basicsr*  \  s    5A6W6688w	If	-	-	-B777777d2hh89qr   c                  r   ddl m}   | d           } | d           } | d           }t          d          }i }t                              d          }|                    ||          }t          |           t          |           |dk    sJ dD ]+}|d	         j        |         t                      |         u sJ ,d
D ]}||d	         j        vs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 d S )Nr   stateful_transformc                      dS )NFOO-OBJr?   r?   r   r   r   z8test_EvalFactor_memorize_passes_needed.<locals>.<lambda>l      Y r   c                      dS )NBAR-OBJr?   r?   r   r   r   z8test_EvalFactor_memorize_passes_needed.<locals>.<lambda>m  r0  r   c                      dS )NQUUX-OBJr?   r?   r   r   r   z8test_EvalFactor_memorize_passes_needed.<locals>.<lambda>n  s    j r   z!foo(x) + bar(foo(y)) + quux(z, w)rC   )foobarquuxr   )wrc   yzr(  r  r   r/  r2  r4  )_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  )r;  r=  r>  r<  )
patsy.stater-  r   r   r   r  printru   localsrf   )	r-  r5  r6  r7  r(  r  r   passesr   s	            r   &test_EvalFactor_memorize_passes_neededrC  i  s   ......

..
/
/C

..
/
/C0011D677AE&&q))H%%eX66F	&MMM	%LLLQ;;;;& C CZ *40FHHTNBBBBB2 7 75,666666 ) ) )!+	# #     	k 3 	3 	3 	3 	3 ! H h H!M	& &     UUUVV#$%%"      r   c                   &    e Zd Zd Zd Zd Zd ZdS )_MockTransformc                 0    d| _         d| _        d| _        d S r   )_sum_memorize_chunk_called_memorize_finish_calledr:   s    r   r%   z_MockTransform.__init__  s    	&'#'($$$r   c                 t    | xj         dz  c_         dd l}| xj        |                    |          z  c_        d S )NrB   r   )rH  numpyrG  sum)r#   r  rb   s      r   r"  z_MockTransform.memorize_chunk  s@    ##q(##		RVVD\\!				r   c                 &    | xj         dz  c_         d S r   )rI  r:   s    r   r$  z_MockTransform.memorize_finish  s    $$)$$$$r   c                     || j         z
  S r    )rG  )r#   r  s     r   	transformz_MockTransform.transform  s    dir   N)r9   r<   r=   r%   r"  r$  rO  r?   r   r   rE  rE    sP        ) ) )
" " "* * *         r   rE  c            
         ddl m}   | t                    }t          d          }i }t                              d          }|                    ||          }t          |           t          |           |dk    sJ |d         j        d         |u sJ dD ]}||d         j        vsJ dd l	}|
                    |d|                    ddg          |                    d	d
g          d           |d         d         j        dk    sJ |d         d         j        dk    sJ |
                    |d|                    ddg          |                    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 |                    |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 |
                    |d|                    ddg          |                    d	d
g          d           |
                    |d|                    ddg          |                    ddg          d           |                    |d           |d                                         D ]}|j        dk    sJ |j        dk    sJ |                    |                    ||                    g d          |                    g d          d          g dk              sJ d S )Nr   r,  zfoo(x) + foo(foo(y))rC   r   r5  )rc   r9  r(  r  rB   rH   r   )rc   r9  r   r;  r=     d   rD   _patsy_stobj1__foo__)rB   rC   rQ  rR  )rH   r   rS  rD   )      ic     )r?  r-  rE  r   r   r   r  r@  ru   rK  r"  arrayrH  rI  r$  valuesallrz   )	r-  r5  r(  r  r   rB  r   rb   rO  s	            r   test_EvalFactor_end_to_endr[    s   ......

^
,
,C)**AE&&q))H%%eX66F	&MMM	%LLLQ;;;;&u-4444( 7 75,666666UARXXq!f%5%5BHHb"X<N<NOOPPP56MQRRRRR56MQRRRRRUARXXr3i%8%8rxxa?Q?QRRSSS56MQRRRRR56MQRRRRR56NRSSSSS56NRSSSSSeQ56NRSSSSS56NRSSSSS56MQRRRRR56NRSSSSSUARXXq!f%5%5BHHb"X<N<NOOPPPUARXXr3i%8%8rxxa?Q?QRRSSSeQ<(//11 6 6	/144440A55555 66	uBHH___55BHHEUEUEU<V<VWWXX	       r   c              #     K   d}t          t          |                     }|D ]i\  }}}i }| o|t          j        k    |d<   |d         o1|                                o|                                d         dk    |d<   ||||fV  |dk    }jd S )NFbare_refrB   r6   bare_funcall.)r   r   tokenizeNAMEhas_morepeek)r]   prev_was_dotit
token_typer   r   propss          r   annotated_tokensrh    s      L	..	/	/B%' $ $!
E6 ,,Lx}1Lj*G"++--GBGGIIaLC4G 	n 5&%0000|$ $r   c                     d t          d          D             } | 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 d S )Nc                 "    g | ]\  }}}}|||fS r?   r?   )r   rf  r   r   rg  s        r   r   z)test_annotated_tokens.<locals>.<listcomp>  s7       .Z 
UE"  r   z
a(b) + c.drA   T)r]  r^  r6   FrF   r7   +rG   r_  r)   rc   rB   )rh  r`  ra  OPr  r!   )tokens_without_originss    r   test_annotated_tokensrn    s    3CL3Q3Q   "	$EEF	cuEEF	$FFG	cuEEF	cuEEF	$FFG	cuEEF	%GGH	& 	 	 	 	 t$S))**++q000000r   c                 R    t          |          D ]\  }}}}|d         r|| v r dS dS )Nr]  TF)rh  )r   r]   _r   rg  s        r   r
  r
    sD    .t44  5!U 	%445r   c                     g }t          |           D ]9\  }}}}|d         r|d         r ||          }|                    ||f           :t          |          S )Nr]  r^  )rh  r  r	   )r]   replacertokensrf  r   r   rg  s          r   r	  r	    su    F,<T,B,B + +(
E65 	$~!6 	$HUOOEz5)****V$$$r   c                      d fd}  | dd            | dd            | dd            | dd            | d	d	            | d
d           d S )Nc                 4    ddd                     | |           S )NrF   z_internal.foo.process)rA   r5  )r3   )r   s    r   	replacer1z-test_replace_bare_funcalls.<locals>.replacer1  s!    !899==eUKKKr   c                     t          |           }t          | d|           t          d|d           ||k    sJ d S )Nz -> z(wanted r7   )r	  r@  )r]   rh   replacedrv  s      r   t1z&test_replace_bare_funcalls.<locals>.t1  sY    (y99DDD((+,,,xxx)***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?   )ry  rv  s    @r   test_replace_bare_funcallsrz    s    L L L$ $ $ $ $ Bz:BueB|\"""Bw)***BwB#%STTTTTr   c                       e Zd Zd Zd ZdS )_FuncallCapturerc                 T    |g| _         ||fg| _        d| _        d| _        d| _        d S )Nr   F)funcrs  paren_depthstarteddone)r#   start_token_typestart_tokens      r   r%   z_FuncallCapturer.__init__  s4     M	(+67			r   c                    | j         rd S | j                            ||f           |dv r| xj        dz  c_        |dv r| xj        dz  c_        | j        dk    sJ | j        s@|dk    rd| _        n2|t
          j        k    s|dk    sJ | j                            |           | j        r| j        dk    rd| _         d S d S d S )N)r6   {[rB   )r7   }]r   r6   Tr_  )r  rs  r  r  r  r`  ra  r~  )r#   rf  r   s      r   	add_tokenz_FuncallCapturer.add_token&  s    9 	FJ.///O##!O##!1$$$$| 	(||#!X]22esllll	  '''< 	D,11DIII	 	11r   N)r9   r<   r=   r%   r  r?   r   r   r|  r|    s2              r   r|  c                     g }t          |          D ]S\  }}}}|D ]}|                    ||           |d         r)|| k    r#|                    t          ||                     Td |D             S )Nr]  c                 j    g | ]0}d                      |j                  t          |j                  f1S ) )joinr~  r	   rs  )r   capturers     r   r   z,capture_obj_method_calls.<locals>.<listcomp>B  sF        
		!28?!C!CD  r   )rh  r  r  r|  )r  r]   	capturersrf  r   r   rg  r  s           r   r  r  ;  s    I,<T,B,B B B(
E65! 	2 	2Hz51111 	B(!2!2-j%@@AAA !   r   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 d S )Nr5  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)r6  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G#L     $C)DEEJ     $E+CDD-$I     $E+JK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*  rC  rE  r[  rh  rn  r
  r	  rz  r|  r  r  r?   r   r   <module>r     sK   l
+     



   



        G G G G G G G G G G T T T T T T T T T T * * * * * *
 
 
 &%''          F      F  (  (5 5 5
L 
L 
LC C C C Cf C C CL  
  
	 	 	2 2 26+R +R +R\# # # C C C*2 2 2  *  #R 8 8 8    R R R R R R R Rj
 
 
( ( (V         V      (/ / /d
$ 
$ 
$1 1 1(  % % %U U U$    v   <
 
 
    r   