
    .Cc~                        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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j'        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" Z0d# Z1d$ Z2 G d% d&e          Z3d' Z4d( Z5d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       *lib/python3.11/site-packages/patsy/eval.py_all_future_flagsr      se    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__1   sQ     	 	Av   smms   
""c                 &    || j         d         |<   d S r   )r"   )r#   r(   values      r   __setitem__zVarLookupDict.__setitem__9   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.getD   s5    	9 	 	 	NNN	s   
 c                 0    | j         j        d| j        dS N())	__class____name__r"   r#   s    r   __repr__zVarLookupDict.__repr__J   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          j	                  sJ t          |           d S )
Na         rA   brF   cr   
   )r   pytestraisesr'   r*   r3   
isinstancereprsixstring_typesr   )d1d2dsrI   s       r   test_VarLookupDictrR   P   s   
qBq		B	Bx	 	 Bc7a<c7a<"9b=MMM
MM(BNC000BsGc7b=c7a<66#;;d2hh 011111rr   c              #   |  K   t           j        t           j        t           j        f}t          j        dk    r|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.
    rC      zcLambda, list/dict/set comprehension, generator expression in patsy formula not currently supported.N)astLambdaListCompGeneratorExpr   r   DictCompSetCompwalkparserK   r   Nameid)codedisallowed_ast_nodesnodes      r   	ast_namesrc   b   s        Jc6FG
6! <s{ ;;4))  d011 	U T U U U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)setrc   )	test_datar`   expecteds      r   test_ast_namesrl   t   s{    c{+u!Hc?3$tf-/I $ 5 5h9T??##s8}}444445 5r   c                  P   dd l } d }|                     t          |d           |                     t          |d           |                     t          |d           t          j        dk    r:|                     t          |d           |                     t          |d           d S d S )	Nr   c                 :    t          t          |                     S r    )r!   rc   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))rT   z{x: True for x in range(10)}z{x + 1 for x in range(10)})rI   rJ   r   r   r   )rI   rp   s     r   test_ast_names_disallowed_nodesrq   |   s    MMM% % %
MM*n.?@@@
MM*n.JKKK
MM*n.JKKK
6! Pj.2PQQQj.2NOOOOOP Pr   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   ru   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   ru   r   )r#   outer_namespaces     r   with_outer_namespacez$EvalEnvironment.with_outer_namespace   s,    
 ~~d./1BB"j* * 	*r   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   r}   r   ru   )r#   exprsource_nameinner_namespacer`   s        r   r}   zEvalEnvironment.eval   sR     t[&$*eDDD"m_,=.2.>-? @ @ A A 	Ar   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_flagsrt   )clseval_env	referencedepthframeis         r   capturezEvalEnvironment.capture   s    Z h$$ 	HO'"233 	Hy(EE G H H H$&&	519%% % % E$%CDDD38|,/@@B B 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   ru   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   )ru   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__   sM    5/22 DJ%+-D''))U-A-A-C-CC	E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__  s7    _Z4..00113 4 4 	4r   N)r   )r   r   )r9   r<   r=   __doc__r%   propertyrx   r{   r}   classmethodr   r   r   r   r   r   r   r>   r?   r   r   r   r      s            
 / / X/
* * * &0 A A A A A A A [AF5 5 51 1 1E E E
! ! !4 4 4
 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##%%##A&&##A&&##A#33##A&&##Aq)) 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   rx   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5w???""2&&",,,,
MM)_4c:::..0011111r   c                     t           j        dk    rd} nd} t          t          |           j        }|t
          z  sJ d}t          |dddd          }t          d	 d
 d}t          |          }t          j
        ||           |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          j
        ||           |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rD   barry_as_FLUFLdivisionzdef 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>F      _%<%<Q%?%? r   c                  6    t                               d          S r   r   r?   r   r   r   z4test_EvalEnvironment_capture_flags.<locals>.<lambda>G  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   r   r   rt   r~   r   r   rM   exec_rx   r   )TEST_FEATURE	test_flagsourcer`   envenv2code2s          r   "test_EvalEnvironment_capture_flagsr   4  sI   
4 " (!
L11?I(((((F 6?FAq99D-???? C 99DIdC~(0K????()3F;{JJJJ^,66666~$'88A====~$'88A====()/2CCqHHHHGlllD%vq!5 5E IeT)&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   r}   rI   rJ   	NameErrorr   r{   )r   rI   rA   r   env3s        r   #test_EvalEnvironment_eval_namespacer   ]  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        dk    rEt          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 t          j        j        }|t          z  sJ t          ddigd          }|                    d          dcxk    rdk    sn J |                    dg          j        dk    sJ |                    d	d
i          j        dk    sJ t          ddig|          }|                    d          dcxk    rdk    sn J |                    dg          j        |k     |                    d	d
i          j        |k    sJ d S )Nr   r   rA      )r   za != 0Tza <> 0rF   rH   za / 2   g      @)rI   r   r   r   r   r   rt   r   r}   rJ   SyntaxErrorr   r   r{   r   )rI   r   r   r   s       r   test_EvalEnvironment_eval_flagsr   k  s   MMM
4 G -;	,,,,,Ryk333xx!!T))))k38X666zz3%  &!++++''b	228A====b	{)<<<yy""d****k49h777{{C5!!'94444((#r339YFFFFFF'5	,,,,,Ryk333xx  G0000q000000zz3%  &!++++''b	228A====b	{)<<<yy!![5555A555555SE I--((#r339YFFFFFFr   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   r}   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                      t                               d          } t                               d          }| |k    sJ t          |           t          |          k    sJ d } |            } |            }||k    sJ d S )Nr   c                  6    t                               d          S r   r   r?   r   r   r   z)test_EvalEnvironment_eq.<locals>.<lambda>  s     7 7 : : r   )r   r   r   )env1r   capture_local_envr   env4s        r   test_EvalEnvironment_eqr     s     ""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    ro   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%    5*-- ,I+	-r   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>  s2     2 2 2=02 2 2 2r   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)rx   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)r{   _builtins_dictrx   rc   r`   r   replace_bare_funcallshas_bare_variable_referencer   r  r   capture_obj_method_callslen
startswithri   
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@@ *2 2 2 249)=)= 2 2 2??<00$j C		 		 		 		 		 		 		 *$)^DD	&k 'u\':DIFF 	N*7<uu?@EN N N "$ol+ 
	= 
	=H6xKKO''1,,,,,Q/N7E4!4&(\*AAAAA&112E2KLLLLL%01237J3K3K3L3LMNM 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   r}   )r#   r`   memorize_statedatar   s        r   _evalzEvalFactor._eval%  sK    '~l/K(LMM !:!%!/
!;!@!%1@	B B B 	Br   c                 n    |d         |         D ]%}|                      |d         |         ||           &d S )Nr  r  r#  )r#   r  
which_passr"  r  s        r   memorize_chunkzEvalFactor.memorize_chunk-  sR    k*:6 	 	HJJu_-h7   	 	r   c                 h    |d         |         D ]"}|d         |                                           #d S )Nr  r   )memorize_finish)r#   r  r&  r  s       r   r)  zEvalFactor.memorize_finish3  sD    k*:6 	< 	<H,)99;;;;	< 	<r   c                 <    |                      |d         ||          S )Nr
  r%  )r#   r!  r"  s      r   r}   zEvalFactor.eval7  s%    zz.5(    	 r   r    )r9   r<   r=   r%   r   r;   r   r   r   r  r#  r'  r)  r}   r   r>   r?   r   r   r   r     s           4  ? ? ?- - -! ! !- - -L L L\B B B  < < <     
 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7NNN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  r5  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   )wrf   yzr-  r  r   r4  r7  r9  )_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@  rB  rC  rA  )
patsy.stater2  r   r   r   r  printrx   localsri   )	r2  r:  r;  r<  r-  r  r   passesr   s	            r   &test_EvalFactor_memorize_passes_neededrH  J  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9;D;D<F#H #H H H H H +:: ; ; ; /"<\<@ 	 	 	 	 # '@ '@ '@ #A #A #&'=&>"?"?"A A A A A A A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__v  s    	&'#'($$$r   c                 t    | xj         dz  c_         dd l}| xj        |                    |          z  c_        d S )NrB   r   )rM  numpyrL  sum)r#   r"  re   s      r   r'  z_MockTransform.memorize_chunk{  s@    ##q(##		RVVD\\!				r   c                 &    | xj         dz  c_         d S r   )rN  r:   s    r   r)  z_MockTransform.memorize_finish  s    $$)$$$$r   c                     || j         z
  S r    )rL  )r#   r"  s     r   	transformz_MockTransform.transform  s    dir   N)r9   r<   r=   r%   r'  r)  rT  r?   r   r   rJ  rJ  t  sP        ) ) )
" " "
* * *         r   rJ  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           t          j        |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   r1  zfoo(x) + foo(foo(y))rC   r   r:  )rf   r>  r-  r  rB   rH   r   )rf   r>  r   r@  rB     d   rD   _patsy_stobj1__foo__)rB   rC   rV  rW  )rH   r   rX  rD   )      ic     )rD  r2  rJ  r   r   r   r  rE  rx   rP  r'  arrayrM  rN  r)  rM   
itervaluesallr}   )	r2  r:  r-  r  r   rG  r   re   rT  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UA88QF++88RH--/ /0 0 0 56MQRRRRR56MQRRRRRUARXXr3i%8%8%'XXsAh%7%7 9  9 : : :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%5%'XXr2h%7%7 9  9 : : :UARXXr3i%8%8%'XXsAh%7%7 9  9 : : :eQ^E,$788 6 6	/144440A55555 66!&&!xx88!xx(8(8(899; ;< < *))* + + + + + + +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_tokensrm    s      L	..	/	/B') & &#UF!--M*2Mj!&z!2 "K%'[[]]"K79wwyy|s7J 	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   rk  r  r   rl  s        r   r   z)test_annotated_tokens.<locals>.<listcomp>  s=     C C C"D:ufe  *5%8 C C Cr   z
a(b) + c.drA   T)rb  rc  r6   FrF   r7   +rG   rd  r)   rf   rB   )rm  re  rf  OPr  r!   )tokens_without_originss    r   test_annotated_tokensrs    s"   C C"2<"@"@C C C #$%M%MNcu#M#MN$%N%NOcu#M#MNcu#M#MN$%N%NOcu#M#MN!&>>@	
 
 
 
 t$S))**++q000000r   c                 R    t          |          D ]\  }}}}|d         r|| v r dS dS )Nrb  TF)rm  )r   r`   _r  rl  s        r   r  r    sG     0 6 6  E1e 	% 	445r   c                     g }t          |           D ]9\  }}}}|d         r|d         r ||          }|                    ||f           :t          |          S )Nrb  rc  )rm  r  r	   )r`   replacertokensrk  r  r   rl  s          r   r  r    su    F.>t.D.D + +*UFE 	$~!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   r:  )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  rE  )r`   rk   replacedr{  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?   )r~  r{  s    @r   test_replace_bare_funcallsr    s    L L L$ $ $ $ $
 Bz:BueB|\"""Bw)***BwB#57 7 7 7 7r   c                       e Zd Zd Zd ZdS )_FuncallCapturerc                 T    |g| _         ||fg| _        d| _        d| _        d| _        d S )Nr   F)funcrx  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   Trd  )r  rx  r  r  r  re  rf  r  )r#   rk  r  s      r   	add_tokenz_FuncallCapturer.add_token  s   9 	FJ.///O# 	"!O# 	"!1$$$$| 	(| (#!X]2BeslBBB	  '''< 	D,1 	DIII	 	 	 	r   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 )Nrb  c                 j    g | ]0}d                      |j                  t          |j                  f1S ) )joinr  r	   rx  )r   capturers     r   r   z,capture_obj_method_calls.<locals>.<listcomp>  sF     ' ' ' WWX]##%6x%G%GH ' ' 'r   )rm  r  r  r  )r  r`   	capturersrk  r  r   rl  r  s           r   r  r    s    I.>t.D.D B B*UFE! 	2 	2Hz51111 	B(!2 	B-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 )Nr:  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)r;  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    s    $U,GHH+,- . . .$S*EFF!"# $ $ $$U,DEE5,.. / / / %U,KLL234 5 5 5 5 5r   )6__all__r   r   r   re  rV   r   rM   patsyr   
patsy.utilr   r   r   patsy.tokensr	   r
   r   patsy.compatr   r   rt   objectr   rR   rc   rl   rq   r   r   r   r   r   r   r   r   r   r   r  r   patsy.builtinsr   r/  rH  rJ  r`  rm  rs  r  r  r  r  r  r  r?   r   r   <module>r     sk   l
+ 



       



  



       G G G G G G G G G G. . . . . . . . . . * * * * * *
 
 
 &%'' 
         F      F  $  $5 5 5	P 	P 	P@ @ @ @ @f @ @ @D      2 2 22'R 'R 'RR# # #G G GB2 2 2
 
 
  		
("n = = =    P P P P P P P Pd
 
 
(A (A (AT         V      $2+ 2+ 2+h	& 	& 	&1 1 1&  % % %7 7 7     v   :' ' '	5 	5 	5 	5 	5r   