U
    ½mœdœ~  ã                   @   s´  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d	„ Zeƒ ZG d
d„ deƒZdd„ Zdd„ Zdd„ Zdd„ ZG dd „ d eƒZdd„ Zdd„ Zdd„ Zdd„ Z dd„ Z!dd „ Z"d!d"„ Z#d#d$„ Z$d%d&„ Z%i Z&e 'd'i e&¡ ddl(ZG d(d„ deƒZ)d)d*„ Z*d+d,„ Z+G d-d.„ d.eƒZ,d/d0„ Z-d1d2„ Z.d3d4„ Z/d5d6„ Z0d7d8„ Z1d9d:„ Z2G d;d<„ d<eƒZ3d=d>„ Z4d?d@„ Z5dS )AÚEvalEnvironmentÚ
EvalFactoré    N)Ú
PatsyError)ÚPushbackAdapterÚno_picklingÚassert_no_pickling)Úpretty_untokenizeÚnormalize_token_spacingÚpython_tokenize)Úcall_and_wrap_excc                  C   sB   d} t jD ]2}tt |ƒ}| ¡ }|d ks2|tjkr
| |jO } q
| S ©Nr   )Ú
__future__Úall_feature_namesÚgetattrÚgetMandatoryReleaseÚsysÚversion_infoÚcompiler_flag)ÚflagsZfeature_nameÚfeatureÚmr© r   úC/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/patsy/eval.pyÚ_all_future_flags   s    

r   c                   @   sB   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zdd
d„Zdd„ Ze	Z
d	S )ÚVarLookupDictc                 C   s   i gt |ƒ | _d S ©N)ÚlistÚ_dicts)ÚselfZdictsr   r   r   Ú__init__.   s    zVarLookupDict.__init__c              	   C   s<   | j D ](}z|| W   S  tk
r,   Y qX qt|ƒ‚d S r   )r   ÚKeyError)r   ÚkeyÚdr   r   r   Ú__getitem__1   s    
zVarLookupDict.__getitem__c                 C   s   || j d |< d S r   )r   )r   r!   Úvaluer   r   r   Ú__setitem__9   s    zVarLookupDict.__setitem__c                 C   s,   z| |  W n t k
r"   Y dS X dS d S )NFT©r    )r   r!   r   r   r   Ú__contains__<   s
    zVarLookupDict.__contains__Nc                 C   s(   z
| | W S  t k
r"   | Y S X d S r   r&   )r   r!   Údefaultr   r   r   ÚgetD   s    
zVarLookupDict.getc                 C   s   d| j j| jf S ©Nz%s(%r))Ú	__class__Ú__name__r   ©r   r   r   r   Ú__repr__J   s    zVarLookupDict.__repr__)N)r,   Ú
__module__Ú__qualname__r   r#   r%   r'   r)   r.   r   Ú__getstate__r   r   r   r   r   -   s   
r   c                  C   sÈ   ddi} dddœ}t | |gƒ}|d dks.t‚|d dks>t‚d|ksJt‚d|ksVt‚dd l}| t|jd¡ d	|d< |d d	ks†t‚| d dks–t‚| d¡d ks¨t‚tt|ƒt	j
ƒs¼t‚t|ƒ d S )
NÚaé   é   é   ©r2   Úbr7   Úcr   é
   )r   ÚAssertionErrorÚpytestÚraisesr    r#   r)   Ú
isinstanceÚreprÚsixÚstring_typesr   )Zd1Zd2Zdsr;   r   r   r   Útest_VarLookupDictP   s    
rA   c                 c   sj   t jt jt jf}tjdkr*|t jt jf7 }t  t  	| ¡¡D ]*}t
||ƒrPtdƒ‚t
|t jƒr:|jV  q:dS )z~Iterator that yields all the (ast) names in a Python expression.

    :arg code: A string containing a Python expression.
    ©r4   é   zcLambda, list/dict/set comprehension, generator expression in patsy formula not currently supported.N)ÚastÚLambdaÚListCompÚGeneratorExpr   r   ÚDictCompÚSetCompÚwalkÚparser=   r   ÚNameÚid)ÚcodeZdisallowed_ast_nodesÚnoder   r   r   Ú	ast_namesb   s    

rP   c                  C   sR   dddgfddgfdddgfddgfg} | D ] \}}t t|ƒƒt |ƒks,t‚q,d S )Nz	np.log(x)ÚnpÚxzcenter(x + 1)Úcenterzdt.date.dt.monthÚdt)ÚsetrP   r:   )Z	test_datarN   Úexpectedr   r   r   Útest_ast_namest   s    

ýrW   c                  C   sd   dd l } dd„ }|  t|d¡ |  t|d¡ |  t|d¡ tjdkr`|  t|d¡ |  t|d	¡ d S )
Nr   c                 S   s   t t| ƒƒS r   )r   rP   ©rN   r   r   r   Úlist_ast_names~   s    z7test_ast_names_disallowed_nodes.<locals>.list_ast_nameszlambda x: x + yz[x + 1 for x in range(10)]z(x + 1 for x in range(10))rB   z{x: True for x in range(10)}z{x + 1 for x in range(10)})r;   r<   r   r   r   )r;   rY   r   r   r   Útest_ast_names_disallowed_nodes|   s    
rZ   c                   @   sv   e Zd ZdZddd„Zedd„ ƒZdd„ Zd	i fd
d„Ze	ddd„ƒZ
dd„ Zdd„ Zdd„ Zdd„ Zd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                 C   s"   |t  @ rt‚t|ƒ| _|| _d S r   )Ú_ALL_FUTURE_FLAGSr:   r   Ú_namespacesr   )r   Ú
namespacesr   r   r   r   r   Œ   s    
zEvalEnvironment.__init__c                 C   s
   t | jƒS )znA dict-like object that can be used to look up variables accessible
        from the encapsulated environment.)r   r\   r-   r   r   r   Ú	namespace‘   s    zEvalEnvironment.namespacec                 C   s   |   | j|g | j¡S )zÉReturn 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   Zouter_namespacer   r   r   Úwith_outer_namespace—   s    ÿz$EvalEnvironment.with_outer_namespacez<string>c                 C   s*   t ||d| jdƒ}t|i t|g| j ƒƒ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   r\   )r   ÚexprZsource_nameÚinner_namespacerN   r   r   r   r`   Ÿ   s    	ÿzEvalEnvironment.evalc                 C   s„   t || ƒr|S t |tjƒr$|| }ntdƒ‚t ¡ }zFt|d ƒD ]}|dkrVtdƒ‚|j}qB| |j	|j
g|jjt@ ƒW ¢S ~X dS )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.r3   Nzcall-stack is not that deep!)r=   ÚnumbersÚIntegralÚ	TypeErrorÚinspectÚcurrentframeÚrangeÚ
ValueErrorÚf_backÚf_localsÚ	f_globalsÚf_codeÚco_flagsr[   )ÚclsÚeval_envÚ	referenceÚdepthÚframeÚir   r   r   Úcapture¬   s    -


ÿzEvalEnvironment.capturec                    s.   t | jƒ‰ t‡ fdd„|D ƒƒ}t|g| jƒS )zWCreates a new, flat EvalEnvironment that contains only
        the variables specified.c                 3   s   | ]}|ˆ | fV  qd S r   r   ©Ú.0Úname©Zvldr   r   Ú	<genexpr>ô   s     z)EvalEnvironment.subset.<locals>.<genexpr>)r   r\   Údictr   r   )r   ÚnamesZnew_nsr   rz   r   Úsubsetð   s    
zEvalEnvironment.subsetc                 C   s   dd„ | j D ƒS )Nc                 S   s   g | ]}t |ƒ‘qS r   )rM   )rx   Únr   r   r   Ú
<listcomp>ø   s     z2EvalEnvironment._namespace_ids.<locals>.<listcomp>)r\   r-   r   r   r   Ú_namespace_ids÷   s    zEvalEnvironment._namespace_idsc                 C   s&   t |tƒo$| j|jko$|  ¡ | ¡ kS r   )r=   r   r   r�   ©r   Úotherr   r   r   Ú__eq__ú   s
    

ÿþzEvalEnvironment.__eq__c                 C   s
   | |k S r   r   r‚   r   r   r   Ú__ne__ÿ   s    zEvalEnvironment.__ne__c                 C   s   t t| jt|  ¡ ƒfƒS r   )Úhashr   r   Útupler�   r-   r   r   r   Ú__hash__  s    
þzEvalEnvironment.__hash__N)r   )r   r   )r,   r/   r0   Ú__doc__r   Úpropertyr^   r_   r`   Úclassmethodrv   r~   r�   r„   r…   rˆ   r   r1   r   r   r   r   r   ‡   s   

Cc                  C   s
   d} t ƒ S ©Nr3   ©Ú_b)Ú_ar   r   r   r�   	  s    r�   c                  C   s
   d} t ƒ S rŒ   ©Ú_cr�   r   r   r   rŽ     s    rŽ   c               	   C   s<   d} t  ¡ t  d¡t  d¡t jddd�t  d¡t  dd¡gS )Nr3   r   )rr   r4   ©r   rv   r�   r   r   r   r‘     s    
ûr‘   c                  C   sB  t ƒ \} }}}}}d| jks t‚d|jks.t‚d|jks<t‚d|jksJt‚d|jksXt‚d|jksft‚| jd dksxt‚|jd dksŠt‚|jd dksœt‚|jd dks®t‚|jd dksÀt‚|jd dksÒt‚|jd tksät‚|jd tksöt‚dd l}| ttjd¡ t |¡|k�s"t‚| t	tjd¡ t
t ¡ ƒ d S )	NÚ&test_EvalEnvironment_capture_namespacer‘   r3   rŽ   r�   r   i@B g333333ó?)r�   r^   r:   r‘   r;   r<   rj   r   rv   rf   r   )Zc0r8   Úb1Úb2Za1Za2r;   r   r   r   r“     s(    r“   c                  C   sž  t jdkrd} nd} tt| ƒj}|t@ s,t‚d}t|ddddƒ}td	d
„ dd
„ dœ}t	|ƒ}t
 ||¡ |d jd dks~t‚|d jd dks”t‚d|d jks¦t‚|d jt@ dks¼t‚|d jt@ dksÒt‚|d jt@ dksèt‚td| f | ddddƒ}t
 ||¡ |d jd dk�s&t‚|d jd dk�s>t‚d|d jk�sRt‚|d jt@ |k�sjt‚|d jt@ dk�s‚t‚|d jt@ |k�sšt‚d S )N©r5   Úbarry_as_FLUFLÚdivisionzädef 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   r3   c                   S   s
   t  d¡S r   r’   r   r   r   r   Ú<lambda>F  ó    z4test_EvalEnvironment_capture_flags.<locals>.<lambda>c                   S   s
   t  d¡S rŒ   r’   r   r   r   r   rš   G  r›   )r   Zcall_capture_0Zcall_capture_1ZRETURN_INNERZin_fz	hi from fZRETURN_INNER_FROM_OUTERZRETURN_OUTERzfrom __future__ import %s
z<test string 2>)r   r   r   r   r   r[   r:   ra   r   r|   r?   Úexec_r^   r   )ZTEST_FEATUREÚ	test_flagÚsourcerN   ÚenvÚenv2Úcode2r   r   r   Ú"test_EvalEnvironment_capture_flags4  sD    
þ
ÿ   þr¢   c                  C   sª   t ddigƒ} |  d¡dks t‚| jdddid�dks:t‚dd l}| t| jd¡ d	}t  d¡}| d¡d
ksrt‚|  dd	dœ¡}| d¡dks”t‚| d¡d
ks¦t‚d S )Nr2   r3   z2 * ar4   ©rc   é   r   z2 * br5   é   r9   r6   )r   r`   r:   r;   r<   Ú	NameErrorrv   r_   )rŸ   r;   r2   r    Úenv3r   r   r   Ú#test_EvalEnvironment_eval_namespace]  s    
r¨   c                  C   sÐ  dd l } tjdkrìtjj}|t@ s&t‚tddigdd�}| 	d¡dksJt‚|  
t|j	d¡ | dg¡jdkspt‚| d	d
i¡jdksˆt‚tddig|d�}| 	d¡dks¬t‚|  
t|j	d¡ | dg¡j|ksÒt‚| d	d
i¡j|ksêt‚nàtjj}|t@ �st‚tddigdd�}| 	d¡d  k�r2dk�s8n t‚| dg¡jdk�sPt‚| d	d
i¡jdk�sjt‚tddig|d�}| 	d¡d  k�ršdk�s n t‚| dg¡j|k | d	d
i¡j|k�sÌt‚d S )Nr   r–   r2   é   )r   za != 0Tza <> 0r7   r9   za / 2é   g      @)r;   r   r   r   r—   r   r[   r:   r   r`   r<   ÚSyntaxErrorr~   r   r_   r˜   )r;   r�   rŸ   r    r   r   r   Útest_EvalEnvironment_eval_flagsk  s0    
$$r¬   c                  C   s”   t ddiddiddigƒ} |  dg¡}| d¡dks8t‚dd l}| t|jd¡ | t|jd¡ |  ddg¡}| d¡d	ks€t‚| t|jd¡ d S )
Nr2   r3   r7   r4   r8   r5   r   zb * cr¥   )r   r~   r`   r:   r;   r<   r¦   )rŸ   Zsubset_ar;   Z	subset_bcr   r   r   Útest_EvalEnvironment_subsetŒ  s    r­   c                  C   sX   t  d¡} t  d¡}| |ks t‚t| ƒt|ƒks4t‚dd„ }|ƒ }|ƒ }||ksTt‚d S )Nr   c                   S   s
   t  d¡S r   r’   r   r   r   r   rš      r›   z)test_EvalEnvironment_eq.<locals>.<lambda>)r   rv   r:   r†   )Zenv1r    Zcapture_local_envr§   Zenv4r   r   r   Útest_EvalEnvironment_eq™  s    

r®   zfrom patsy.builtins import *c                   @   sj   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZeZdS )r   Nc                 C   s   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	   rN   Úorigin)r   rN   r¯   r   r   r   r   ­  s    
zEvalFactor.__init__c                 C   s   | j S r   rX   r-   r   r   r   ry   Ç  s    zEvalFactor.namec                 C   s   d| j j| jf S r*   )r+   r,   rN   r-   r   r   r   r.   Ê  s    zEvalFactor.__repr__c                 C   s   t |tƒo| j|jkS r   )r=   r   rN   r‚   r   r   r   r„   Í  s    

ÿzEvalFactor.__eq__c                 C   s
   | |k S r   r   r‚   r   r   r   r…   Ñ  s    zEvalFactor.__ne__c                 C   s   t t| jfƒS r   )r†   r   rN   r-   r   r   r   rˆ   Ô  s    zEvalFactor.__hash__c                    sœ  i ˆd< ˆ  t¡‰ˆj‰ ‡ fdd„t| jƒD ƒ}ˆ |¡‰ˆˆd< dg‰‡‡‡fdd„}t| j|ƒ}|ˆd< tˆd | jƒrŽtd	t	f t	j
ƒ‚i ˆd
< ˆd D ]t}t||ƒ}t|ƒdks¼t‚|d }|\}	}
|	|d ksÜt‚|
 |	d ¡sît‚|d |
t|	ƒd …  }|ˆd
 |< qžg }tˆd ƒ}|�rŒtƒ }|D ]4}| |g¡}ˆd
 | }t||ƒ�s4| |¡ �q4|�stt‚| |¡ | |¡ �q$|ˆd< t|ƒS )NÚ
transformsc                    s   g | ]}|ˆ kr|‘qS r   r   rw   )Úenv_namespacer   r   r€   Þ  s    ÿz5EvalFactor.memorize_passes_needed.<locals>.<listcomp>rq   r   c                    sZ   ˆ j  | ¡}t|dƒrRdˆd | f }ˆd  d7  < | ¡ }|ˆd |< |d S | S d S )NÚ__patsy_stateful_transform__z_patsy_stobj%s__%s__r   r3   r°   ú
.transform)r^   r)   Úhasattrr²   )Útokenr$   Úobj_nameÚobj)rq   ru   Ústater   r   Únew_name_makerå  s    
z9EvalFactor.memorize_passes_needed.<locals>.new_name_makerÚ	eval_codez5names of this form are reserved for internal use (%s)Úmemorize_coder3   r³   ú(z.memorize_chunkÚ	pass_bins)r_   Ú_builtins_dictr^   rP   rN   r~   Úreplace_bare_funcallsÚhas_bare_variable_referencer   rµ   r¯   Úcapture_obj_method_callsÚlenr:   Ú
startswithrU   Ú
differenceÚaddÚdifference_updateÚappend)r   r¸   rq   Zsubset_namesr¹   rº   r¶   Ztransform_callsZtransform_callZtransform_call_nameZtransform_call_coder»   r½   ZunsortedZpass_binZ
other_objsr   )r±   rq   ru   r¸   r   Úmemorize_passes_needed×  sX    

ÿÿ
ÿþ

z!EvalFactor.memorize_passes_neededc                 C   s(   t ||d gƒ}td| |d j||d�S )Nr°   zError evaluating factorrq   r£   )r   r   r`   )r   rN   Úmemorize_stateÚdatarc   r   r   r   Ú_eval%  s    üzEvalFactor._evalc                 C   s,   |d | D ]}|   |d | ||¡ qd S )Nr½   r»   ©rË   )r   r¸   Ú
which_passrÊ   r¶   r   r   r   Úmemorize_chunk-  s
    þzEvalFactor.memorize_chunkc                 C   s&   |d | D ]}|d |   ¡  qd S )Nr½   r°   )Úmemorize_finish)r   r¸   rÍ   r¶   r   r   r   rÏ   3  s    zEvalFactor.memorize_finishc                 C   s   |   |d ||¡S )Nrº   rÌ   )r   rÉ   rÊ   r   r   r   r`   7  s    
þzEvalFactor.eval)N)r,   r/   r0   r   ry   r.   r„   r…   rˆ   rÈ   rË   rÎ   rÏ   r`   r   r1   r   r   r   r   r   ¬  s   
Nc                  C   sz   t dƒ} | jdkst‚|  ¡ dks&t‚t ddd�}| |ks>t‚t| ƒt|ƒksRt‚| jd ks`t‚|jdksnt‚t| ƒ d S )Nza+bza + bza    +bZasdf)r¯   )r   rN   r:   ry   r†   r¯   r   )ÚeÚe2r   r   r   Útest_EvalFactor_basics>  s    rÒ   c            	      C   s  ddl m}  | dd„ ƒ}| dd„ ƒ}| dd„ ƒ}tdƒ}i }t d¡}| ||¡}t|ƒ t|ƒ |dksnt‚d	D ] }|d
 j| t	ƒ | ksrt‚qrdD ]}||d
 jks˜t‚q˜|d dddddœksÊt‚|d dksÚt‚|d dddddœksôt‚|d t
dddgƒt
dgƒgk�st‚d S )Nr   ©Ústateful_transformc                   S   s   dS )NúFOO-OBJr   r   r   r   r   rš   L  r›   z8test_EvalFactor_memorize_passes_needed.<locals>.<lambda>c                   S   s   dS )NúBAR-OBJr   r   r   r   r   rš   M  r›   c                   S   s   dS )NúQUUX-OBJr   r   r   r   r   rš   N  r›   z!foo(x) + bar(foo(y)) + quux(z, w)r4   )ÚfooÚbarÚquuxrq   )ÚwrR   ÚyÚzrÐ   r¸   r°   rÕ   rÖ   r×   )Ú_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   rv   rÈ   Úprintr:   r^   ÚlocalsrU   )	rÔ   rØ   rÙ   rÚ   rÐ   r¸   rq   Úpassesry   r   r   r   Ú&test_EvalFactor_memorize_passes_neededJ  sH    
ýÿùÿ

þýræ   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú_MockTransformc                 C   s   d| _ d| _d| _d S r   )Ú_sumÚ_memorize_chunk_calledÚ_memorize_finish_calledr-   r   r   r   r   v  s    z_MockTransform.__init__c                 C   s.   |  j d7  _ dd l}|  j| |¡7  _d S )Nr3   r   )ré   Únumpyrè   Úsum)r   rÊ   rQ   r   r   r   rÎ   {  s    z_MockTransform.memorize_chunkc                 C   s   |  j d7  _ d S rŒ   )rê   r-   r   r   r   rÏ   €  s    z_MockTransform.memorize_finishc                 C   s
   || j  S r   )rè   )r   rÊ   r   r   r   Ú	transformƒ  s    z_MockTransform.transformN)r,   r/   r0   r   rÎ   rÏ   rí   r   r   r   r   rç   t  s   rç   c            	      C   s°  ddl m}  | tƒ}tdƒ}i }t d¡}| ||¡}t|ƒ t|ƒ |dksRt‚|d j	d |ksht‚dD ]}||d j	kslt‚qldd l
}| |d| ddg¡| d	d
g¡dœ¡ |d d jdksÊt‚|d d jdksàt‚| |d| ddg¡| ddg¡dœ¡ |d d jdk�s t‚|d d jdk�s8t‚|d d jdk�sPt‚|d d jdk�sht‚| |d¡ |d d jdk�sŒt‚|d d jdk�s¤t‚|d d jdk�s¼t‚|d d jdk�sÔt‚| |d| ddg¡| d	d
g¡dœ¡ | |d| ddg¡| ddg¡dœ¡ | |d¡ t |d ¡D ]&}|jdk�sRt‚|jdk�s>t‚�q>| | || ddddg¡| d	d
ddg¡dœ¡ddddgk¡�s¬t‚d S )Nr   rÓ   zfoo(x) + foo(foo(y))r4   rq   rØ   )rR   rÜ   rÐ   r¸   r3   r9   r©   )rR   rÜ   r°   rÞ   rà   é   iöÿÿÿéd   r5   Z_patsy_stobj1__foo__éþ   é   ic  éì   )râ   rÔ   rç   r   r   rv   rÈ   rã   r:   r^   rë   rÎ   Úarrayré   rê   rÏ   r?   Ú
itervaluesÚallr`   )	rÔ   rØ   rÐ   r¸   rq   rå   ry   rQ   rí   r   r   r   Útest_EvalFactor_end_to_end†  sb    
ÿÿÿÿÿ

ÿÿ
ýrö   c                 c   sv   d}t t| ƒƒ}|D ]\\}}}i }| o0|tjk|d< |d oT| ¡ oT| ¡ d dk|d< ||||fV  |dk}qd S )NFÚbare_refr3   r¼   Úbare_funcallÚ.)r   r
   ÚtokenizeÚNAMEZhas_moreÚpeek)rN   Zprev_was_dotÚitÚ
token_typerµ   r¯   Úpropsr   r   r   Úannotated_tokensº  s    ÿÿr   c                  C   sº   d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žt‚ttt dƒƒƒdks¶t‚d S )Nc                 S   s   g | ]\}}}}|||f‘qS r   r   )rx   rþ   rµ   r¯   rÿ   r   r   r   r€   Æ  s   
ÿz)test_annotated_tokens.<locals>.<listcomp>z
a(b) + c.dr2   T)r÷   rø   r¼   Fr7   ú)ú+r8   rù   r"   rR   r3   )r   rú   rû   ÚOPr:   rÂ   r   )Ztokens_without_originsr   r   r   Útest_annotated_tokensÅ  s"    þÿùÿr  c                 C   s0   t |ƒD ]"\}}}}|d r|| kr dS qdS )Nr÷   TF)r   )r}   rN   Ú_rµ   rÿ   r   r   r   rÀ   Ø  s    rÀ   c                 C   sH   g }t | ƒD ]2\}}}}|d r0|d r0||ƒ}| ||f¡ qt|ƒS )Nr÷   rø   )r   rÇ   r   )rN   ÚreplacerÚtokensrþ   rµ   r¯   rÿ   r   r   r   r¿   Þ  s    r¿   c                     sT   dd„ ‰ ‡ fdd„} | ddƒ | ddƒ | ddƒ | d	d
ƒ | ddƒ | ddƒ d S )Nc                 S   s   dddœ  | | ¡S )Nr7   z_internal.foo.process)r2   rØ   )r)   )rµ   r   r   r   Ú	replacer1ç  s    z-test_replace_bare_funcalls.<locals>.replacer1c                    s8   t | ˆ ƒ}td| |f ƒ td|f ƒ ||ks4t‚d S )Nz%r -> %rz(wanted %r))r¿   rã   r:   )rN   rV   Zreplaced©r  r   r   Út1é  s    
z&test_replace_bare_funcalls.<locals>.t1z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   r	  r   Útest_replace_bare_funcallsæ  s    




ÿr  c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_FuncallCapturerc                 C   s*   |g| _ ||fg| _d| _d| _d| _d S )Nr   F)Úfuncr  Úparen_depthÚstartedÚdone)r   Zstart_token_typeZstart_tokenr   r   r   r   ø  s
    z_FuncallCapturer.__init__c                 C   s¦   | j r
d S | j ||f¡ |dkr0|  jd7  _|dkrF|  jd8  _| jdksTt‚| jsŒ|dkrjd| _n"|tjks€|dks€t‚| j |¡ | jr¢| jdkr¢d| _ d S )N)r¼   Ú{ú[r3   )r  Ú}ú]r   r¼   Trù   )	r  r  rÇ   r  r:   r  rú   rû   r  )r   rþ   rµ   r   r   r   Ú	add_tokenÿ  s    z_FuncallCapturer.add_tokenN)r,   r/   r0   r   r  r   r   r   r   r  ö  s   r  c                 C   s^   g }t |ƒD ]B\}}}}|D ]}| ||¡ q|d r|| kr| t||ƒ¡ qdd„ |D ƒS )Nr÷   c                 S   s"   g | ]}d   |j¡t|jƒf‘qS )Ú )Újoinr  r   r  )rx   Úcapturerr   r   r   r€     s   ÿz,capture_obj_method_calls.<locals>.<listcomp>)r   r  rÇ   r  )r¶   rN   Z	capturersrþ   rµ   r¯   rÿ   r  r   r   r   rÁ     s    ÿrÁ   c                   C   sV   t ddƒdgkst‚t ddƒdgks(t‚t ddƒddgks>t‚t d	d
ƒdgksRt‚d S )NrØ   za + foo.baz(bar) + b.c(d))úfoo.bazzfoo.baz(bar)r7   )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   r   r   Útest_capture_obj_method_calls  s    ÿÿÿÿÿr  )6Ú__all__r   r   rg   rú   rD   rd   r?   Zpatsyr   Z
patsy.utilr   r   r   Zpatsy.tokensr   r	   r
   Zpatsy.compatr   r   r[   Úobjectr   rA   rP   rW   rZ   r   r�   rŽ   r‘   r“   r¢   r¨   r¬   r­   r®   r¾   rœ   Zpatsy.builtinsr   rÒ   ræ   rç   rö   r   r  rÀ   r¿   r  r  rÁ   r  r   r   r   r   Ú<module>   s\   # 
)! *4
