
    phx                        S S/r SSKrSSKrSSKrSSKrSSKrSSKrSSKJr  SSK	J
r
JrJr  SSKJrJrJr  SSKJr  S r\" 5       r " S	 S
\5      rS rS rS rS r " S S \5      rS rS rS rS rS r S r!S r"S r#S r$0 r%\&" S0 \%5        SSK'r " S S\5      r(S r)S r* " S S\5      r+S r,S  r-S! r.S" r/S# r0S$ r1 " S% S&\5      r2S' r3S( r4g))EvalEnvironment
EvalFactor    N)
PatsyError)PushbackAdapterno_picklingassert_no_pickling)pretty_untokenizenormalize_token_spacingpython_tokenize)call_and_wrap_excc                      Sn [         R                   HJ  n[        [         U5      nUR                  5       nUb  U[        R
                  :  d  M<  XR                  -  n ML     U $ Nr   )
__future__all_feature_namesgetattrgetMandatoryReleasesysversion_infocompiler_flag)flagsfeature_namefeaturemrs       bC:\Users\julio\OneDrive\Documentos\Trabajo\IdeasFrscas\Cabanna\env\Lib\site-packages\patsy/eval.py_all_future_flagsr      sZ    E"44*l3((* :c...***E 5 L    c                   @    \ rS rSrS rS rS rS rS
S jrS r	\
rS	rg)VarLookupDict.   c                 ,    0 /[        U5      -   U l        g N)list_dicts)selfdictss     r   __init__VarLookupDict.__init__/   s    dT%[(r   c                 j    U R                    H  n X!   s  $    [        U5      e! [         a     M$  f = fr!   )r#   KeyError)r$   keyds      r   __getitem__VarLookupDict.__getitem__2   s<    Av 
 sm  s   $
22c                 &    X R                   S   U'   g r   r#   )r$   r*   values      r   __setitem__VarLookupDict.__setitem__:   s    #Asr   c                 .     X     g! [          a     gf = f)NTFr)   )r$   r*   s     r   __contains__VarLookupDict.__contains__=   s%    	I   		s    
Nc                 0     X   $ ! [          a    Us $ f = fr!   r4   )r$   r*   defaults      r   getVarLookupDict.getE   s#    	9 	N	s    c                 R    U R                   R                  < SU R                  < S3$ N())	__class____name__r#   r$   s    r   __repr__VarLookupDict.__repr__K   s    >>22DKK@@r   r/   r!   )r@   
__module____qualname____firstlineno__r&   r,   r1   r5   r9   rB   r   __getstate____static_attributes__ r   r   r   r   .   s(    )$A Lr   r   c                  x   SS0n SSS.n[        X/5      nUS   S:X  d   eUS   S:X  d   eSU;   d   eSU;  d   eSS KnUR                  [        UR                  S5        S	US'   US   S	:X  d   eU S   S:X  d   eUR                  S5      b   e[        [        U5      [        5      (       d   e[        U5        g )
Na         rK   brP   cr   
   )
r   pytestraisesr)   r,   r9   
isinstancereprstrr   )d1d2dsrS   s       r   test_VarLookupDictr[   Q   s    
qBq	B	x	 Bc7a<<c7a<<"99b==
MM(BNNC0BsGc7b==c7a<<66#;d2h$$$$rr   c              #     #    [         R                  [         R                  [         R                  4nU[         R                  [         R
                  4-  n[         R                  " [         R                  " U 5      5       HM  n[        X!5      (       a  [        S5      e[        U[         R                  5      (       d  M?  UR                  v   MO     g7f)zvIterator 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parserU   r   Nameid)codedisallowed_ast_nodesnodes      r   	ast_namesrj   e   s       JJc6F6FGS\\3;;774)d11G  dCHH%%''M *s   B8C>Cc                      SSS/4SS/4SSS/4SS/4/n U  H(  u  p[        [        U5      5      [        U5      :X  a  M(   e   g )Nz	np.log(x)npxzcenter(x + 1)centerzdt.date.dt.monthdt)setrj   )	test_datarg   expecteds      r   test_ast_namesrs   y   s]    	tSk"	se	8S/*	dV$	I $9T?#s8}444 $r   c                      SS K n S nU R                  [        US5        U R                  [        US5        U R                  [        US5        U R                  [        US5        U R                  [        US5        g )Nr   c                 *    [        [        U 5      5      $ r!   )r"   rj   rg   s    r   list_ast_names7test_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)})rS   rT   r   )rS   rw   s     r   test_ast_names_disallowed_nodesry      sa    % MM*n.?@
MM*n.JK
MM*n.JK
MM*n.LM
MM*n.JKr   c                   |    \ rS rSrSrSS jr\S 5       rS rS0 4S jr	\
SS j5       rS	 rS
 rS rS rS r\rSrg)r      zuRepresents a Python execution environment.

Encapsulates a namespace for variable lookup and set of __future__
flags.c                 R    U[         ) -  (       a   e[        U5      U l        X l        g r!   )_ALL_FUTURE_FLAGSr"   _namespacesr   )r$   
namespacesr   s      r   r&   EvalEnvironment.__init__   s&    -----
+
r   c                 ,    [        U R                  5      $ )zfA dict-like object that can be used to look up variables accessible
from the encapsulated environment.)r   r~   rA   s    r   	namespaceEvalEnvironment.namespace   s     T--..r   c                 V    U R                  U R                  U/-   U R                  5      $ )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.)r?   r~   r   )r$   outer_namespaces     r   with_outer_namespace$EvalEnvironment.with_outer_namespace   s'    
 ~~d../1BBDJJOOr   z<string>c                 z    [        XSU R                  S5      n[        U0 [        U/U R                  -   5      5      $ )aD  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   r~   )r$   exprsource_nameinner_namespacerg   s        r   r   EvalEnvironment.eval   s:     t&$**eDD"m_,=@P@P,PQRRr   c                    [        X5      (       a  U$ [        U[        R                  5      (       a  X-   nO[        S5      e[        R
                  " 5       n [        US-   5       H  nUc  [        S5      eUR                  nM     U " UR                  UR                  /UR                  R                  [        -  5      A$ ! Af = f)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.rL   zcall-stack is not that deep!)rU   numbersIntegral	TypeErrorinspectcurrentframerange
ValueErrorf_backf_locals	f_globalsf_codeco_flagsr}   )clseval_env	referencedepthframeis         r   captureEvalEnvironment.capture   s    Z h$$O'"2"233(E;  $$&	519%=$%CDD & 1%%(99 s   A(C Cc                    ^ [        U R                  5      m[        U4S jU 5       5      n[        U/U R                  5      $ )zOCreates a new, flat EvalEnvironment that contains only
the variables specified.c              3   0   >#    U  H  oTU   4v   M     g 7fr!   rI   ).0namevlds     r   	<genexpr>)EvalEnvironment.subset.<locals>.<genexpr>  s     :EDSY'Es   )r   r~   dictr   r   )r$   namesnew_nsr   s      @r   subsetEvalEnvironment.subset   s8     D,,-:E::x44r   c                 X    U R                    Vs/ s H  n[        U5      PM     sn$ s  snf r!   )r~   rf   )r$   ns     r   _namespace_idsEvalEnvironment._namespace_ids  s&    #//0/!1/000s   'c                     [        U[        5      =(       aA    U R                  UR                  :H  =(       a!    U R                  5       UR                  5       :H  $ r!   )rU   r   r   r   r$   others     r   __eq__EvalEnvironment.__eq__  sG    uo. @

ekk)@##%)=)=)??	
r   c                     X:X  + $ r!   rI   r   s     r   __ne__EvalEnvironment.__ne__        r   c                 h    [        [        U R                  [        U R	                  5       5      45      $ r!   )hashr   r   tupler   rA   s    r   __hash__EvalEnvironment.__hash__  s&    _djj%8K8K8M2NOPPr   )r~   r   N)r   )r   r   )r@   rD   rE   rF   __doc__r&   propertyr   r   r   classmethodr   r   r   r   r   r   r   rG   rH   rI   r   r   r   r      sk    

 / /
P &0 
S E EN51
!Q Lr   c                      Sn [        5       $ NrL   _b)_as    r   r   r         	
B4Kr   c                      Sn [        5       $ r   _cr   s    r   r   r     r   r   c            	          Sn [         R                  5       [         R                  S5      [         R                  S5      [         R                  SSS9[         R                  S5      [         R                  SS5      /$ )NrL   r   )r   rM   r   r   r   s    r   r   r   !  sj    	
B!""Q/"1% r   c                  ^   [        5       u  pp#pESU R                  ;   d   eSUR                  ;   d   eSUR                  ;   d   eSUR                  ;   d   eSUR                  ;   d   eSUR                  ;   d   eU R                  S   S:X  d   eUR                  S   S:X  d   eUR                  S   S:X  d   eUR                  S   S:X  d   eUR                  S   S:X  d   eUR                  S   S:X  d   eUR                  S   [        L d   eUR                  S   [        L d   eSS KnUR	                  [
        [        R                  S5        [        R                  U5      UL d   eUR	                  [        [        R                  S5        [        [        R                  5       5        g )	N&test_EvalEnvironment_capture_namespacer   rL   r   r   r   i@B g333333?)
r   r   r   rS   rT   r   r   r   r   r   )c0rQ   b1b2a1a2rS   s          r   r   r   -  s   DB22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                  j   Sn [        [        U 5      R                  nU[        -  (       d   eSn[	        USSSS5      n[
        S S S	.n[        U5      n[        X45        US
   R                  S   S:X  d   eUS   R                  S   S:X  d   eSUS   R                  ;  d   eUS
   R                  [        -  S:X  d   eUS   R                  [        -  S:X  d   eUS   R                  [        -  S:X  d   e[	        SU < S3U-   SSSS5      n[        Xe5        US
   R                  S   S:X  d   eUS   R                  S   S:X  d   eSUS   R                  ;  d   eUS
   R                  [        -  U:X  d   eUS   R                  [        -  S:X  d   eUS   R                  [        -  U:X  d   eg )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   rL   c                  ,    [         R                  S5      $ r   r   rI   r   r   <lambda>4test_EvalEnvironment_capture_flags.<locals>.<lambda>Z      /"9"9!"<r   c                  ,    [         R                  S5      $ r   r   rI   r   r   r   r   [  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   r   r   r   r   r   )TEST_FEATURE	test_flagsourcerg   envenv2code2s          r   "test_EvalEnvironment_capture_flagsr   H  s    $L
L1??I((((	  6?FAq9D*<<C
 9DO~((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                     [        SS0/5      n U R                  S5      S:X  d   eU R                  SSS0S9S:X  d   eSS KnUR                  [        U R                  S5        S	n[         R                  S5      nUR                  S5      S
:X  d   eU R                  SS	S.5      nUR                  S5      S:X  d   eUR                  S5      S
:X  d   eg )NrK   rL   z2 * arM   r      r   z2 * brN      rR   rO   )r   r   rS   rT   	NameErrorr   r   )r   rS   rK   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                     SS K n [        R                  R                  nU[        -  (       d   e[        SS0/SS9nUR                  S5      S:X  d   eU R                  [        UR                  S5        UR                  S/5      R                  S:X  d   eUR                  SS	05      R                  S:X  d   e[        SS0/US9nUR                  S5      S:X  d   eU R                  [        UR                  S5        UR                  S/5      R                  U:X  d   eUR                  SS	05      R                  U:X  d   eg )
Nr   rK      )r   za != 0Tza <> 0rP   rR   )rS   r   r   r   r}   r   r   rT   SyntaxErrorr   r   r   )rS   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                     [        SS0SS0SS0/5      n U R                  S/5      nUR                  S5      S:X  d   eSS KnUR	                  [
        UR                  S5        UR	                  [
        UR                  S5        U R                  SS/5      nUR                  S5      S	:X  d   eUR	                  [
        UR                  S5        g )
NrK   rL   rP   rM   rQ   rN   r   zb * cr   )r   r   r   rS   rT   r   )r   subset_arS   	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                     SS K n [        R                  S:  a  U R                  S5        [        R                  S5      n[        R                  S5      nX:X  d   e[        U5      [        U5      :X  d   eS nU" 5       nU" 5       nXE:w  d   eg )Nr   )rN      ze`frame.f_locals` may return write-through proxies in Python 3.13+, breaking direct comparison by ids.c                  ,    [         R                  S5      $ r   r   rI   r   r   r   )test_EvalEnvironment_eq.<locals>.<lambda>  s     7 7 :r   )rS   r   r   skipr   r   r   )rS   env1r   capture_local_envr   env4s         r   test_EvalEnvironment_eqr    s    
7"1	
 ""1%D""1%D<<:d###:DD<<r   zfrom patsy.builtins import *c                   ^    \ rS rSrSS jrS rS rS rS rS r	S	 r
S
 rS rS rS r\rSrg)r   i  Nc                 0    [        U5      U l        X l        g)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
   rg   origin)r$   rg   r  s      r   r&   EvalFactor.__init__  s    . ,D1	r   c                     U R                   $ r!   rv   rA   s    r   r   EvalFactor.name  s    yyr   c                 R    U R                   R                  < SU R                  < S3$ r<   )r?   r@   rg   rA   s    r   rB   EvalFactor.__repr__  s    >>22DII>>r   c                 b    [        U[        5      =(       a    U R                  UR                  :H  $ r!   )rU   r   rg   r   s     r   r   EvalFactor.__eq__  s!    %,Hejj1HHr   c                     X:X  + $ r!   rI   r   s     r   r   EvalFactor.__ne__  r   r   c                 8    [        [        U R                  45      $ r!   )r   r   rg   rA   s    r   r   EvalFactor.__hash__  s    Z+,,r   c                   ^^^ 0 TS'   TR                  [        5      mTR                  n[        U R                  5       Vs/ s H  oDU;   d  M
  UPM     nnTR                  U5      mTTS'   S/mUUU4S jn[        U R                  U5      nUTS'   [        TS   U R                  5      (       a#  [        S[        < S3[        R                  5      e0 TS'   TS    Hi  n[        X5      n	[        U	5      S	:X  d   eU	S   n
U
u  pXS
-   :X  d   eUR                  US-   5      (       d   eUS-   U[        U5      S  -   nUTS   U'   Mk     / n[        TS   5      nU(       a  [        5       nU HA  nUR                  U/5      nTS   U   n[        UU5      (       a  M0  UR!                  U5        MC     U(       d   eUR#                  U5        UR%                  U5        U(       a  M  UTS'   [        U5      $ s  snf )N
transformsr   r   c                    > TR                   R                  U 5      n[        US5      (       a8  STS   < SU < S3nTS==   S-  ss'   UR                  5       nUTS   U'   US-   $ U $ )N__patsy_stateful_transform___patsy_stobjr   __rL   r  
.transform)r   r9   hasattrr  )tokenr0   obj_nameobjr   r   states       r   new_name_maker9EvalFactor.memorize_passes_needed.<locals>.new_name_maker  so    &&**51Eu<==56qT5A!	88:03l#H-,..r   	eval_codez2names of this form are reserved for internal use (r>   memorize_coderL   r  r=   z.memorize_chunk	pass_bins)r   _builtins_dictr   rj   rg   r   replace_bare_funcallshas_bare_variable_referencer   r  r  capture_obj_method_callslen
startswithrp   
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_needed!EvalFactor.memorize_passes_needed  s     !l00@ **)2499)=W)=AV)=W??<0$j C		 *$))^D	&k 'u\':DIIFFNSU  "$ol+H6xKO'1,,,,Q/N7E4&\*AAAA&112E2KLLLL#$%c*=&>&@AB 
 0=E/"8, ,: 	u\*+uH$%00(<
 %o 6x @2:}MMLL*	 %
 O8&&x0X& h 'k9~U Xs   	G6G6c                 T    [        X2S   /5      n[        SU US   R                  UUS9$ )Nr  zError evaluating factorr   r   )r   r   r   )r$   rg   memorize_statedatar   s        r   _evalEvalFactor._evalD  s;    'l/K(LM %:&+++
 	
r   c                 R    US   U    H  nU R                  US   U   X5        M     g )Nr#  r"  r<  )r$   r  
which_passr;  r  s        r   memorize_chunkEvalFactor.memorize_chunkN  s.    k*:6HJJu_-h7E 7r   c                 N    US   U    H  nUS   U   R                  5         M     g )Nr#  r  )memorize_finish)r$   r  r@  r  s       r   rD  EvalFactor.memorize_finishR  s,    k*:6H,)99; 7r   c                 ,    U R                  US   X5      $ )Nr!  r?  )r$   r:  r;  s      r   r   EvalFactor.evalV  s    zz.5~LLr   )rg   r  r!   )r@   rD   rE   rF   r&   r   rB   r   r   r   r7  r<  rA  rD  r   r   rG   rH   rI   r   r   r   r     sE    4?I!-Qf
F<M Lr   c                     [        S5      n U R                  S:X  d   eU R                  5       S:X  d   e[        SSS9nX:X  d   e[        U 5      [        U5      :X  d   eU R                  b   eUR                  S:X  d   e[        U 5        g )Nza+bza + bza    +basdf)r  )r   rg   r   r   r  r   )ee2s     r   test_EvalFactor_basicsrL  \  s    5A66W668w	If	-B7N77d2h8899qr   c                     SSK Jn   U " S 5      nU " S 5      nU " S 5      n[        S5      n0 n[        R	                  S5      nUR                  XV5      n[        U5        [        U5        US:X  d   eS H%  nUS	   R                  U   [        5       U   L a  M%   e   S
 H  nXS	   R                  ;  a  M   e   US   SSSSS.:X  d   eUS   S:X  d   eUS   SSSSS.:X  d   eUS   [        / SQ5      [        S/5      /:X  d   eg )Nr   stateful_transformc                      g)NFOO-OBJrI   rI   r   r   r   8test_EvalFactor_memorize_passes_needed.<locals>.<lambda>l      Yr   c                      g)NBAR-OBJrI   rI   r   r   r   rR  m  rS  r   c                      g)NQUUX-OBJrI   rI   r   r   r   rR  n  s    jr   z!foo(x) + bar(foo(y)) + quux(z, w)rM   )foobarquuxr   )wrm   yzrJ  r  r  rQ  rU  rW  )_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`  ra  r_  )
patsy.staterO  r   r   r   r7  printr   localsrp   )	rO  rX  rY  rZ  rJ  r  r   passesr   s	            r   &test_EvalFactor_memorize_passes_neededrf  i  sb   .
.
/C
.
/C01D67AE&&q)H%%e6F	&M	%LQ;;&Z **40FHTNBBB '2,66666 3 ) ) )!+	#    	k 3 	3	3 ! H h H!M	&    UV#$%"   r   c                   ,    \ rS rSrS rS rS rS rSrg)_MockTransformi  c                 .    SU l         SU l        SU l        g r   )_sum_memorize_chunk_called_memorize_finish_calledrA   s    r   r&   _MockTransform.__init__  s    	&'#'($r   c                 ~    U =R                   S-  sl         SS KnU =R                  UR                  U5      -  sl        g )NrL   r   )rk  numpyrj  sum)r$   r;  rl   s      r   rA  _MockTransform.memorize_chunk  s,    ##q(#		RVVD\!	r   c                 .    U =R                   S-  sl         g r   )rl  rA   s    r   rD  _MockTransform.memorize_finish  s    $$)$r   c                     XR                   -
  $ r!   )rj  )r$   r;  s     r   	transform_MockTransform.transform  s    iir   )rk  rl  rj  N)	r@   rD   rE   rF   r&   rA  rD  ru  rH   rI   r   r   rh  rh    s    )
"* r   rh  c            
      @   SSK Jn   U " [        5      n[        S5      n0 n[        R                  S5      nUR                  X45      n[        U5        [        U5        US:X  d   eUS   R                  S   UL d   eS H  nXcS   R                  ;  a  M   e   SS K	nUR                  USUR                  SS/5      UR                  S	S
/5      S.5        US   S   R                  S:X  d   eUS   S   R                  S:X  d   eUR                  USUR                  SS/5      UR                  SS/5      S.5        US   S   R                  S:X  d   eUS   S   R                  S:X  d   eUS   S   R                  S:X  d   eUS   S   R                  S:X  d   eUR                  US5        US   S   R                  S:X  d   eUS   S   R                  S:X  d   eUS   S   R                  S:X  d   eUS   S   R                  S:X  d   eUR                  USUR                  SS/5      UR                  S	S
/5      S.5        UR                  USUR                  SS/5      UR                  SS/5      S.5        UR                  US5        US   R                  5        H'  nUR                  S:X  d   eUR                  S:X  a  M'   e   UR!                  UR#                  X7R                  / SQ5      UR                  / SQ5      S.5      / SQ:H  5      (       d   eg )Nr   rN  zfoo(x) + foo(foo(y))rM   r   rX  )rm   r\  rJ  r  rL   rR   r   )rm   r\  r  r^  r`     d   rN   _patsy_stobj1__foo__)rL   rM   rx  ry  )rR   r   rz  rN   )      ic     )rb  rO  rh  r   r   r   r7  rc  r   ro  rA  arrayrk  rl  rD  valuesallr   )	rO  rX  rJ  r  r   re  r   rl   ru  s	            r   test_EvalFactor_end_to_endr    sH   .
^
,C)*AE&&q)H%%e6F	&M	%LQ;;&&u-444(,66666 )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	//144400A555 2 66	uHH_5BHHEU<VWX	    r   c              #   *  #    Sn[        [        U 5      5      nU Hs  u  p4n0 nU(       + =(       a    U[        R                  :H  US'   US   =(       a-    UR	                  5       =(       a    UR                  5       S   S:H  US'   X4XV4v   US:H  nMu     g 7f)NFbare_refrL   r=   bare_funcall.)r   r   tokenizeNAMEhas_morepeek)rg   prev_was_dotit
token_typer  r  propss          r   annotated_tokensr    s     L	.	/B%'!
6 ,,Lx}}1Lj*G"++-GBGGIaLC4G 	n &00| &(s   BBc                     [        S5       V VVVs/ s H
  u  pp#XU4PM     nnnn nU[        R                  SSSS.4[        R                  SSSS.4[        R                  SSSS.4[        R                  SSSS.4[        R                  S	SSS.4[        R                  S
SSS.4[        R                  SSSS.4[        R                  SSSS.4/:X  d   e[	        [        [        S5      5      5      S:X  d   eg s  snnnn f )Nz
a(b) + c.drK   T)r  r  r=   FrP   r>   +rQ   r  r+   rm   rL   )r  r  r  OPr(  r"   )r  r  r  r  tokens_without_originss        r   test_annotated_tokensr    s
    4DL3Q3Q.Z 
E"3Q   "	$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   C;
c                 T    [        U5       H  u  p#p$US   (       d  M  X0;   d  M    g   g)Nr  TF)r  )r   rg   _r  r  s        r   r&  r&    s-    .t4! 5 r   c                     / n[        U 5       H4  u  p4pVUS   (       a  US   (       a  U" U5      nUR                  X445        M6     [        U5      $ )Nr  r  )r  r-  r	   )rg   replacertokensr  r  r  r  s          r   r%  r%    sP    F,<T,B(
6~!6UOEz)* -C V$$r   c                     ^ S mU4S jn U " SS5        U " SS5        U " SS5        U " SS5        U " S	S	5        U " S
S5        g )Nc                 *    SSS.R                  X 5      $ )NrP   z_internal.foo.process)rK   rX  )r9   )r  s    r   	replacer1-test_replace_bare_funcalls.<locals>.replacer1  s    !89==eKKr   c                 p   > [        U T5      n[        U < SU< 35        [        SU< S35        X!:X  d   eg )Nz -> z(wanted r>   )r%  rc  )rg   rr   replacedr  s      r   t1&test_replace_bare_funcalls.<locals>.t1  s3    (y9D(+,x)*###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)]rI   )r  r  s    @r   test_replace_bare_funcallsr    sO    L$ z:ue|\"w)*w#%STr   c                        \ rS rSrS rS rSrg)_FuncallCaptureri  c                 P    U/U l         X4/U l        SU l        SU l        SU l        g )Nr   F)funcr  paren_depthstarteddone)r$   start_token_typestart_tokens      r   r&   _FuncallCapturer.__init__  s.     M	(67	r   c                    U R                   (       a  g U R                  R                  X45        US;   a  U =R                  S-  sl        US;   a  U =R                  S-  sl        U R                  S:  d   eU R                  (       dE  US:X  a  SU l        O7U[
        R                  :X  d  US:X  d   eU R                  R                  U5        U R                  (       a  U R                  S:X  a  SU l         g g g )N)r=   {[rL   )r>   }]r   r=   Tr  )r  r  r-  r  r  r  r  r  )r$   r  r  s      r   	add_token_FuncallCapturer.add_token&  s    99J./O#!O#!1$$$|||#!X]]2eslBB		  '<<D,,1DI 2<r   )r  r  r  r  r  N)r@   rD   rE   rF   r&   r  rH   rI   r   r   r  r    s    r   r  c                 J   / n[        U5       HM  u  p4pVU H  nUR                  X45        M     US   (       d  M,  X@:X  d  M3  UR                  [        X45      5        MO     U Vs/ s H3  nSR	                  UR
                  5      [        UR                  5      4PM5     sn$ s  snf )Nr   )r  r  r-  r  joinr  r	   r  )r  rg   	capturersr  r  r  r  capturers           r   r'  r'  ;  s    I,<T,B(
6!Hz1 "!2-j@A	 -C "!H 
	!28??!CD!  s   #:B c                      [        SS5      S/:X  d   e[        SS5      S/:X  d   e[        SS5      SS/:X  d   e[        S	S
5      S/:X  d   eg )NrX  za + foo.baz(bar) + b.c(d))foo.bazzfoo.baz(bar)rP   )zb.czb.c(d)foo.bar(foo.baz(quux)))zfoo.barr  )r  zfoo.baz(quux)rY  zfoo[bar.baz(x(z[asdf])) ** 2])zbar.bazzbar.baz(x(z[asdf])))r'  rI   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  r]   r   patsyr   
patsy.utilr   r   r   patsy.tokensr	   r
   r   patsy.compatr   r   r}   objectr   r[   rj   rs   ry   r   r   r   r   r   r   r   r   r   r  r$  r   patsy.builtinsr   rL  rf  rh  r  r  r  r&  r%  r  r  r'  r  rI   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   