U
    Kvf~                     @   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_nameZfeaturemr r   ./tmp/pip-unpacked-wheel-68fdvdus/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st| d dkst|dd ksttt|t	j
stt| d S )
Na         r1   br6   cr   
   )r   AssertionErrorpytestraisesr   r"   r(   
isinstancereprsixstring_typesr   )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.
    r3      zcLambda, list/dict/set comprehension, generator expression in patsy formula not currently supported.N)astLambdaZListCompZGeneratorExpr   r   ZDictCompZSetCompwalkparser<   r   Nameid)codeZdisallowed_ast_nodesnoder   r   r   	ast_namesb   s    

rL   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)setrL   r9   )Z	test_datarJ   expectedr   r   r   test_ast_namest   s    

rS   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   rL   rJ   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:   rU   r   r   r   test_ast_names_disallowed_nodes|   s    
rV   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_FLAGSr9   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   rX   r,   r   r   r   	namespace   s    zEvalEnvironment.namespacec                 C   s   |  | j|g | 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.)r*   rX   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   rX   )r   exprZsource_nameinner_namespacerJ   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.r2   Nzcall-stack is not that deep!)r<   numbersIntegral	TypeErrorinspectcurrentframerange
ValueErrorf_backf_locals	f_globalsf_codeco_flagsrW   )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   rX   dictr   r   )r   namesZnew_nsr   rv   r   subset   s    
zEvalEnvironment.subsetc                 C   s   dd | j D S )Nc                 S   s   g | ]}t |qS r   )rI   )rt   nr   r   r   
<listcomp>   s     z2EvalEnvironment._namespace_ids.<locals>.<listcomp>)rX   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.   r/   __doc__r   propertyrZ   r[   r\   classmethodrr   rz   r}   r   r   r   r   r0   r   r   r   r   r      s   

Cc                  C   s
   d} t  S Nr2   _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 )Nr2   r   )rn   r3   r   rr   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st|jd dkst|jd dkst|jd dkst|jd dkst|jd tkst|jd tkstdd l}|ttjd t||ks"t|t	tjd t
t  d S )	N&test_EvalEnvironment_capture_namespacer   r2   r   r   r   i@B g333333?)r   rZ   r9   r   r:   r;   rf   r   rr   rb   r   )Zc0r7   Zb1Z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std|d jkst|d jt@ dkst|d jt@ dkst|d jt@ dkst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st|d jt@ |kstd S )Nr4   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   r2   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   rW   r9   r]   r   rx   r>   exec_rZ   r   )ZTEST_FEATURE	test_flagsourcerJ   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st|dd
kstd S )Nr1   r2   z2 * ar3   r_      r   z2 * br4      r8   r5   )r   r\   r9   r:   r;   	NameErrorrr   r[   )r   r:   r1   r   env3r   r   r   #test_EvalEnvironment_eval_namespace]  s    
r   c                  C   s  dd l } tjdkrt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sttddig|d}|	ddkst| 
t|j	d |dgj|kst|d	d
ij|kstnt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rdksn t|dgj|k |d	d
ij|kstd S )Nr   r   r1      )r   za != 0Tza <> 0r6   r8   za / 2   g      @)r:   r   r   r   r   r   rW   r9   r   r\   r;   SyntaxErrorrz   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st|t|jd d S )
Nr1   r2   r6   r3   r7   r4   r   zb * cr   )r   rz   r\   r9   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   rr   r9   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	   rJ   origin)r   rJ   r   r   r   r   r     s    
zEvalFactor.__init__c                 C   s   | j S r   rT   r,   r   r   r   ru     s    zEvalFactor.namec                 C   s   d| j j| jf S r)   )r*   r+   rJ   r,   r   r   r   r-     s    zEvalFactor.__repr__c                 C   s   t |to| j|jkS r   )r<   r   rJ   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   rJ   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rtd	t	f t	j
i d
< d D ]t}t||}t|dkst|d }|\}	}
|	|d kst|
|	d st|d |
t|	d   }|d
 |< qg }td }|rt }|D ]4}||g}d
 | }t||s4|| q4|stt|| || q$|d< t|S )N
transformsc                    s   g | ]}| kr|qS r   r   rs   )env_namespacer   r   r|     s    z5EvalFactor.memorize_passes_needed.<locals>.<listcomp>rm   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   r2   r   
.transform)rZ   r(   hasattrr   )tokenr#   obj_nameobj)rm   rq   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_coder2   r   (z.memorize_chunk	pass_bins)r[   _builtins_dictrZ   rL   rJ   rz   replace_bare_funcallshas_bare_variable_referencer   r   r   capture_obj_method_callslenr9   
startswithrQ   
differenceadddifference_updateappend)r   r   rm   Zsubset_namesr   r   r   Ztransform_callsZtransform_callZtransform_call_nameZtransform_call_coder   r   ZunsortedZpass_binZ
other_objsr   )r   rm   rq   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 factorrm   r   )r   r   r\   )r   rJ   memorize_statedatar_   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.   r/   r   ru   r-   r   r   r   r   r   r   r   r\   r   r0   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   rJ   r9   ru   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stq|d dddddkst|d dkst|d dddddkst|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)r3   )foobarquuxrm   )wrN   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   rr   r   printr9   rZ   localsrQ   )	r   r   r   r   r   r   rm   passesru   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 )Nr2   r   )r   numpyr   sum)r   r   rM   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.   r/   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st|d d jdkst||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st|d d jdkst|d d jdkst|d d jdkst||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std S )Nr   r   zfoo(x) + foo(foo(y))r3   rm   r   )rN   r   r   r   r2   r8   r   )rN   r   r   r   r      id   r4   Z_patsy_stobj1__foo__      ic     )r   r   r   r   r   rr   r   r   r9   rZ   r   r   arrayr   r   r   r>   
itervaluesallr\   )	r   r   r   r   rm   r   ru   rM   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_refr2   r   bare_funcall.)r   r
   tokenizeNAMEZhas_morepeek)rJ   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stttt ddkstd S )Nc                 S   s   g | ]\}}}}|||fqS r   r   )rt   r   r   r   r   r   r   r   r|     s   
z)test_annotated_tokens.<locals>.<listcomp>z
a(b) + c.dr1   T)r   r   r   Fr6   )+r7   r   r!   rN   r2   )r   r   r   OPr9   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   )ry   rJ   _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   )rJ   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 )Nr6   z_internal.foo.process)r1   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   r9   )rJ   rR   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st| j| | jr| jdkrd| _ d S )N)r   {[r2   )r   }]r   r   Tr   )	r
  r  r   r  r9   r	  r   r   r  )r   r   r   r   r   r   	add_token  s    z_FuncallCapturer.add_tokenN)r+   r.   r/   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  )rt   capturerr   r   r   r|     s   z,capture_obj_method_calls.<locals>.<listcomp>)r   r  r   r  )r   rJ   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)r6   )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   r9   r   r   r   r   test_capture_obj_method_calls  s    r  )6__all__r   r   rc   r   rD   r`   r>   Zpatsyr   Z
patsy.utilr   r   r   Zpatsy.tokensr   r	   r
   Zpatsy.compatr   r   rW   objectr   rA   rL   rS   rV   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
