
_%0Vc           @   s0  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 d	 e f d
     YZ d   Z d   Z d   Z d   Z d  e f d     YZ 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 d e f d     YZ) d   Z* d   Z+ d e f d     YZ, d   Z- d    Z. d!   Z/ d"   Z0 d#   Z1 d$   Z2 d% e f d&     YZ3 d'   Z4 d(   Z5 d S()   t   EvalEnvironmentt
   EvalFactoriN(   t
   PatsyError(   t   PushbackAdaptert   no_picklingt   assert_no_pickling(   t   pretty_untokenizet   normalize_token_spacingt   python_tokenize(   t   call_and_wrap_excc          C   sR   d }  xE t  j D]: } t t  |  } | j   t j k r |  | j O}  q q W|  S(   Ni    (   t
   __future__t   all_feature_namest   getattrt   getMandatoryReleaset   syst   version_infot   compiler_flag(   t   flagst   feature_namet   feature(    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   _all_future_flags   s    t   VarLookupDictc           B   sG   e  Z d    Z d   Z d   Z d   Z d d  Z d   Z e	 Z
 RS(   c         C   s   i  g t  |  |  _ d  S(   N(   t   listt   _dicts(   t   selft   dicts(    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   __init__*   s    c         C   sD   x1 |  j  D]& } y | | SWq
 t k
 r/ q
 Xq
 Wt |   d  S(   N(   R   t   KeyError(   R   t   keyt   d(    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   __getitem__-   s    c         C   s   | |  j  d | <d  S(   Ni    (   R   (   R   R   t   value(    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   __setitem__5   s    c         C   s)   y |  | Wn t  k
 r  t SXt Sd  S(   N(   R   t   Falset   True(   R   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   __contains__8   s
    c         C   s%   y |  | SWn t  k
 r  | SXd  S(   N(   R   (   R   R   t   default(    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   get@   s    c         C   s   d |  j  j |  j f S(   Ns   %s(%r)(   t	   __class__t   __name__R   (   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   __repr__F   s    N(   R'   t
   __module__R   R   R    R#   t   NoneR%   R(   R   t   __getstate__(    (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR   )   s   					c          C   s#  i d d 6}  i d d 6d d 6} t  |  | g  } | d d k sI t  | d d k s_ t  d | k sq t  d | k s t  d d l m } | t | j d  d	 | d <| d d	 k s t  |  d d k s t  | j d  d  k s t  t t	 |  t
 j  st  t |  d  S(
   Ni   t   ai   i   t   bt   ci(   t   assert_raisesi
   (   R   t   AssertionErrort
   nose.toolsR/   R   R   R%   R*   t
   isinstancet   reprt   sixt   string_typesR   (   t   d1t   d2t   dsR/   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   test_VarLookupDictL   s    
c         c   s   t  j t  j t  j f } t j d k r@ | t  j t  j f 7} n  x[ t  j t  j	 |    D]A } t
 | |  r} t d   n  t
 | t  j  rY | j VqY qY Wd S(   s~   Iterator that yields all the (ast) names in a Python expression.

    :arg code: A string containing a Python expression.
    i   i   sc   Lambda, list/dict/set comprehension, generator expression in patsy formula not currently supported.N(   i   i   (   t   astt   Lambdat   ListCompt   GeneratorExpR   R   t   DictCompt   SetCompt   walkt   parseR2   R   t   Namet   id(   t   codet   disallowed_ast_nodest   node(    (    s)   lib/python2.7/site-packages/patsy/eval.pyt	   ast_names^   s    c          C   s{   d d d g f d d g f d d d g f d d g f g }  x8 |  D]0 \ } } t  t |   t  |  k sC t  qC Wd  S(   Ns	   np.log(x)t   npt   xs   center(x + 1)t   centers   dt.date.dt.montht   dt(   t   setRG   R0   (   t	   test_dataRD   t   expected(    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   test_ast_namesp   s    c          C   s   d d l  m }  d   } |  t | d  |  t | d  |  t | d  t j d k r{ |  t | d	  |  t | d
  n  d  S(   Ni(   R/   c         S   s   t  t |    S(   N(   R   RG   (   RD   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   list_ast_namesz   s    s   lambda x: x + ys   [x + 1 for x in range(10)]s   (x + 1 for x in range(10))i   i   s   {x: True for x in range(10)}s   {x + 1 for x in range(10)}(   i   i   (   R1   R/   R   R   R   (   R/   RP   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   test_ast_names_disallowed_nodesx   s    	c           B   s   e  Z d  Z d d  Z e d    Z d   Z d i  d  Z e d d d   Z	 d   Z
 d	   Z d
   Z d   Z d   Z e Z RS(   s}   Represents a Python execution environment.

    Encapsulates a namespace for variable lookup and set of __future__
    flags.i    c         C   s.   | t  @s t  t |  |  _ | |  _ d  S(   N(   t   _ALL_FUTURE_FLAGSR0   R   t   _namespacesR   (   R   t
   namespacesR   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR      s    c         C   s   t  |  j  S(   sn   A dict-like object that can be used to look up variables accessible
        from the encapsulated environment.(   R   RS   (   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyt	   namespace   s    c         C   s   |  j  |  j | g |  j  S(   s   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&   RS   R   (   R   t   outer_namespace(    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   with_outer_namespace   s    s   <string>c         C   s;   t  | | d |  j t  } t | i  t | g |  j   S(   st  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`.
        t   eval(   t   compileR   R!   RX   R   RS   (   R   t   exprt   source_namet   inner_namespaceRD   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyRX      s    	c         C   s   t  | |   r | St  | t j  r2 | | } n t d   t j   } zf x< t | d  D]* } | d k r t d   n  | j	 } q^ W|  | j
 | j g | j j t @ SWd ~ Xd S(   s  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.
        sW   Parameter 'eval_env' must be either an integer or an instance of patsy.EvalEnvironment.i   s   call-stack is not that deep!N(   R2   t   numberst   Integralt	   TypeErrort   inspectt   currentframet   rangeR*   t
   ValueErrort   f_backt   f_localst	   f_globalst   f_codet   co_flagsRR   (   t   clst   eval_envt	   referencet   deptht   framet   i(    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   capture   s    -c            s>   t  |  j    t   f d   | D  } t | g |  j  S(   sW   Creates a new, flat EvalEnvironment that contains only
        the variables specified.c         3   s   |  ] } |   | f Vq d  S(   N(    (   t   .0t   name(   t   vld(    s)   lib/python2.7/site-packages/patsy/eval.pys	   <genexpr>   s    (   R   RS   t   dictR    R   (   R   t   namest   new_ns(    (   Rr   s)   lib/python2.7/site-packages/patsy/eval.pyt   subset   s    c         C   s    g  |  j  D] } t |  ^ q
 S(   N(   RS   RC   (   R   t   n(    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   _namespace_ids   s    c         C   s7   t  | t  o6 |  j | j k o6 |  j   | j   k S(   N(   R2   R    R   Rx   (   R   t   other(    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   __eq__   s    c         C   s   |  | k S(   N(    (   R   Ry   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   __ne__   s    c         C   s"   t  t |  j t |  j    f  S(   N(   t   hashR    R   t   tupleRx   (   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   __hash__   s    (   R'   R)   t   __doc__R   t   propertyRU   RW   RX   t   classmethodRo   Rv   Rx   Rz   R{   R~   R   R+   (    (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR       s   	C					c          C   s   d }  t    S(   Ni   (   t   _b(   t   _a(    (    s)   lib/python2.7/site-packages/patsy/eval.pyR     s    c          C   s   d }  t    S(   Ni   (   t   _c(   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR   	  s    c          C   sX   d }  t  j   t  j d  t  j d  t  j d d d t  j d  t  j d d  g S(   Ni   i    Rk   i   (   R    Ro   (   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR     s    	c          C   s  t    \ }  } } } } } d |  j k s0 t  d | j k sE t  d | j k sZ t  d | j k so t  d | j k s t  d | j 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 d k st  | j d d k s/t  | j d t k sHt  | j d t k sat  d d l m } | t t j d  t j |  | k st  | t	 t j d
  t
 t j    d  S(   Nt&   test_EvalEnvironment_capture_namespaceR   i   R   R   i(   R/   i
   i   g333333?i@B (   R   RU   R0   R   R1   R/   Rc   R    Ro   R_   R   (   t   c0R.   t   b1t   b2t   a1t   a2R/   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR     s(    c          C   s&  t  j d k r d }  n d }  t t |   j } | t @s@ t  d } t | d d d d  } i t d	 6d
   d 6d   d 6} t	 |  } t
 j | |  | 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 sEt  t d |  f | d d d d  } t
 j | |  | d j d d k st  | d j d d k st  d | d j k st  | d j t @| k st  | d j t @d k st  | d j t @| k s"t  d  S(   Ni   t   barry_as_FLUFLt   divisions   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()
s   <test string>t   execi    i   R    c           S   s   t  j d  S(   Ni    (   R    Ro   (    (    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   <lambda>B  s    t   call_capture_0c           S   s   t  j d  S(   Ni   (   R    Ro   (    (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR   C  s    t   call_capture_1t   RETURN_INNERt   in_fs	   hi from ft   RETURN_INNER_FROM_OUTERt   RETURN_OUTERs   from __future__ import %s
s   <test string 2>(   i   (   R   R   R   R
   R   RR   R0   RY   R    Rs   R4   t   exec_RU   R   (   t   TEST_FEATUREt	   test_flagt   sourceRD   t   envt   env2t   code2(    (    s)   lib/python2.7/site-packages/patsy/eval.pyt"   test_EvalEnvironment_capture_flags0  s8    	

c          C   s  t  i d d 6g  }  |  j d  d k s1 t  |  j d d i d d 6d k sY t  d d l m } | t |  j d	  d
 } t  j d  } | j d  d k s t  |  j i d d 6d
 d 6 } | j d  d k s t  | j d	  d k s t  d  S(   Ni   R,   s   2 * ai   R\   i   i(   R/   s   2 * bi   i    i   i
   R-   (   R    RX   R0   R1   R/   t	   NameErrorRo   RW   (   R   R/   R,   R   t   env3(    (    s)   lib/python2.7/site-packages/patsy/eval.pyt#   test_EvalEnvironment_eval_namespaceY  s    (c          C   s  d d l  m }  t j d k r^t j j } | t @s; t  t	 i d d 6g d d } | j
 d  t k sr t  |  t | j
 d	  | j d g  j d k s t  | j i d
 d 6 j d k s t  t	 i d d 6g d | } | j
 d	  t k st  |  t | j
 d  | j d g  j | k s6t  | j i d
 d 6 j | k st  n2t j j } | t @szt  t	 i d d 6g d d } | j
 d  d k od k n st  | j d g  j d k st  | j i d
 d 6 j d k st  t	 i d d 6g d | } | j
 d  d d k oGd k n sRt  | j d g  j | k | j i d
 d 6 j | k st  d  S(   Ni(   R/   i   i   R,   R   i    s   a != 0s   a <> 0i
   R-   s   a / 2i   i   g      ?(   i   i   g      &@(   R1   R/   R   R   R
   R   R   RR   R0   R    RX   R"   t   SyntaxErrorRv   R   RW   R   (   R/   R   R   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   test_EvalEnvironment_eval_flagsg  s0    !%!(+!%/c          C   s   t  i d d 6i d d 6i d d 6g  }  |  j d g  } | j d  d k sW t  d d l m } | t | j d  | t | j d  |  j d d g  } | j d	  d
 k s t  | t | j d  d  S(   Ni   R,   i   R-   i   R.   i(   R/   s   b * ci   (   R    Rv   RX   R0   R1   R/   R   (   R   t   subset_aR/   t	   subset_bc(    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   test_EvalEnvironment_subset  s    *c          C   s   t  j d  }  t  j d  } |  | k s0 t  t |   t |  k sN t  d   } |   } |   } | | k s{ t  d  S(   Ni    c           S   s   t  j d  S(   Ni    (   R    Ro   (    (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR     s    (   R    Ro   R0   R|   (   t   env1R   t   capture_local_envR   t   env4(    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   test_EvalEnvironment_eq  s    			s   from patsy.builtins import *c           B   st   e  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 RS(   c         C   s   t  |  |  _ | |  _ d S(   s/  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   RD   t   origin(   R   RD   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR     s    c         C   s   |  j  S(   N(   RD   (   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyRq     s    c         C   s   d |  j  j |  j f S(   Ns   %s(%r)(   R&   R'   RD   (   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR(     s    c         C   s   t  | t  o |  j | j k S(   N(   R2   R   RD   (   R   Ry   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyRz     s    c         C   s   |  | k S(   N(    (   R   Ry   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR{     s    c         C   s   t  t |  j f  S(   N(   R|   R   RD   (   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR~     s    c            s<  i   d <  j  t      j } g  t |  j  D] } | | k r2 | ^ q2 }   j |       d <d g      f d   } t |  j |  } |  d <t  d |  j  r t d t	 f t	 j
   n  i   d <x  d D] } t | |  }	 t |	  d k st  |	 d }
 |
 \ } } | | d	 k sCt  | j | d
  s\t  | d | t |  } |  d | <q Wg  } t  d  } x | r't   } xM | D]E } | j | g  }  d | } t | |  s| j |  qqW| s
t  | j |  | j |  qW|  d <t |  S(   Nt
   transformsRj   i    c            so     j  j |   } t | d  rg d  d |  f }  d c d 7<| j   } |  d | <| d S|  Sd  S(   Nt   __patsy_stateful_transform__s   _patsy_stobj%s__%s__i    i   R   s
   .transform(   RU   R%   t   hasattrR   (   t   tokenR   t   obj_namet   obj(   Rj   Rn   t   state(    s)   lib/python2.7/site-packages/patsy/eval.pyt   new_name_maker  s    t	   eval_codes5   names of this form are reserved for internal use (%s)t   memorize_codei   s
   .transformt   (s   .memorize_chunkt	   pass_bins(   RW   t   _builtins_dictRU   RG   RD   Rv   t   replace_bare_funcallst   has_bare_variable_referenceR   R   R   t   capture_obj_method_callst   lenR0   t
   startswithRL   t
   differencet   addt   difference_updatet   append(   R   R   Rj   t   env_namespaceRq   t   subset_namesR   R   R   t   transform_callst   transform_callt   transform_call_namet   transform_call_codeR   R   t   unsortedt   pass_bint
   other_objs(    (   Rj   Rn   R   s)   lib/python2.7/site-packages/patsy/eval.pyt   memorize_passes_needed  sL    
	
	


		
c         C   s6   t  | | d g  } t d |  | d j | d | S(   NR   s   Error evaluating factorRj   R\   (   R   R	   RX   (   R   RD   t   memorize_statet   dataR\   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   _eval!  s    
c         C   s8   x1 | d | D]! } |  j  | d | | |  q Wd  S(   NR   R   (   R   (   R   R   t
   which_passR   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   memorize_chunk)  s    c         C   s/   x( | d | D] } | d | j    q Wd  S(   NR   R   (   t   memorize_finish(   R   R   R   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR   /  s    c         C   s   |  j  | d | |  S(   NR   (   R   (   R   R   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyRX   3  s    N(   R'   R)   R*   R   Rq   R(   Rz   R{   R~   R   R   R   R   RX   R   R+   (    (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR     s   						N				c          C   s   t  d  }  |  j d k s! t  |  j   d k s9 t  t  d d d } |  | k s] t  t |   t |  k s{ t  |  j d  k s t  | j d k s t  t |   d  S(   Ns   a+bs   a + bs   a    +bR   t   asdf(   R   RD   R0   Rq   R|   R   R*   R   (   t   et   e2(    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   test_EvalFactor_basics:  s    c    	      C   s  d d l  m }  |  d    } |  d    } |  d    } t d  } i  } t j d  } | j | |  } | GH| GH| d k s t  x; d	 d
 d g D]* } | d j | t   | k s t  q Wx9 d d d d d d g D] } | | d j k s t  q W| d i d d 6d d 6d d 6d d 6k s8t  | d d k sNt  | d i d d 6d d 6d  d 6d! d 6k st  | d" t	 d d d g  t	 d g  g k st  d  S(#   Ni(   t   stateful_transformc           S   s   d S(   Ns   FOO-OBJ(    (    (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR   H  s    c           S   s   d S(   Ns   BAR-OBJ(    (    (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR   I  s    c           S   s   d S(   Ns   QUUX-OBJ(    (    (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR   J  s    s!   foo(x) + bar(foo(y)) + quux(z, w)i    i   t   foot   bart   quuxRj   t   wRI   t   yt   zR   R   R   s   FOO-OBJt   _patsy_stobj0__foo__s   BAR-OBJt   _patsy_stobj1__bar__t   _patsy_stobj2__foo__s   QUUX-OBJt   _patsy_stobj3__quux__R   s   _patsy_stobj0__foo__.transform(x) + _patsy_stobj1__bar__.transform(_patsy_stobj2__foo__.transform(y)) + _patsy_stobj3__quux__.transform(z, w)R   s&   _patsy_stobj0__foo__.memorize_chunk(x)sF   _patsy_stobj1__bar__.memorize_chunk(_patsy_stobj2__foo__.transform(y))s&   _patsy_stobj2__foo__.memorize_chunk(y)s*   _patsy_stobj3__quux__.memorize_chunk(z, w)R   (
   t   patsy.stateR   R   R    Ro   R   R0   RU   t   localsRL   (	   R   R   R   R   R   R   Rj   t   passesRq   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyt&   test_EvalFactor_memorize_passes_neededF  s>    (	t   _MockTransformc           B   s,   e  Z d    Z d   Z d   Z d   Z RS(   c         C   s   d |  _  d |  _ d |  _ d  S(   Ni    (   t   _sumt   _memorize_chunk_calledt   _memorize_finish_called(   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR   r  s    		c         C   s7   |  j  d 7_  d d  l } |  j | j |  7_ d  S(   Ni   i(   R   t   numpyR   t   sum(   R   R   RH   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR   w  s    c         C   s   |  j  d 7_  d  S(   Ni   (   R   (   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR   |  s    c         C   s   | |  j  S(   N(   R   (   R   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyt	   transform  s    (   R'   R)   R   R   R   R   (    (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR   p  s   			c    	   	   C   s  d d l  m }  |  t  } t d  } i  } t j d  } | j | |  } | GH| GH| d k sk t  | d j d | k s t  x3 d d	 d
 d g D] } | | d j k s t  q Wd d  l	 } | j
 | d i | j d d g  d 6| j d d g  d	 6 | d d j d k s&t  | d d j d k sCt  | j
 | d i | j d d g  d 6| j d d g  d	 6 | 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  | j | 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 szt  | j
 | d i | j d d g  d 6| j d d g  d	 6 | j
 | d i | j d d g  d 6| j d d g  d	 6 | j | d  xE t j | d  D]0 } | j d k s7t  | j d k st  qW| j | j | i | j d d d d g  d 6| j d d d d g  d	 6 d d d d g k  st  d  S(   Ni(   R   s   foo(x) + foo(foo(y))i    i   Rj   R   RI   R   R   R   i   i
   i   R   R   R   i   iid   i   t   _patsy_stobj1__foo__i   i   ic  i   (   R   R   R   R   R    Ro   R   R0   RU   R   R   t   arrayR   R   R   R4   t
   itervaluest   allRX   (	   R   R   R   R   Rj   R   Rq   RH   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   test_EvalFactor_end_to_end  sR    %%%
c         c   s   t  } t t |    } x | D]| \ } } } i  } | oG | t j k | d <| d ow | j   ow | j   d d k | d <| | | | f V| d k } q Wd  S(   Nt   bare_refi   R   t   bare_funcallt   .(   R!   R   R   t   tokenizet   NAMEt   has_moret   peek(   RD   t   prev_was_dott   itt
   token_typeR   R   t   props(    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   annotated_tokens  s    
&c          C   sV  g  t  d  D]! \ }  } } } |  | | f ^ q } | t j d i t d 6t d 6f t j d i t d 6t d 6f t j d i t d 6t d 6f t j d i t d 6t d 6f t j d i t d 6t d 6f t j d	 i t d 6t d 6f t j d
 i t d 6t d 6f t j d i t d 6t d 6f g k s.t  t t t  d    d k sRt  d  S(   Ns
   a(b) + c.dR,   R   R   R   R-   t   )t   +R.   R   R   RI   i   (	   R   R   R   R"   t   OPR!   R0   R   R   (   R   R   R   R   t   tokens_without_origins(    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   test_annotated_tokens  s    1	#c         C   sA   x: t  |  D], \ } } } } | d r | |  k r t Sq Wt S(   NR   (   R   R"   R!   (   Rt   RD   t   _R   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR     s    c         C   si   g  } xV t  |   D]H \ } } } } | d rH | d rH | |  } n  | j | | f  q Wt |  S(   NR   R   (   R   R   R   (   RD   t   replacert   tokensR   R   R   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR     s    c             sj   d       f d   }  |  d d  |  d d  |  d d  |  d d  |  d	 d	  |  d
 d  d  S(   Nc         S   s   i d d 6d d 6j  |  |   S(   NR-   R,   s   _internal.foo.processR   (   R%   (   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyt	   replacer1  s    c            s@   t  |     } d |  | f GHd | f GH| | k s< t  d  S(   Ns   %r -> %rs   (wanted %r)(   R   R0   (   RD   RN   t   replaced(   R  (    s)   lib/python2.7/site-packages/patsy/eval.pyt   t1  s    s   foobar()s   a()s   b()s
   foobar.a()s   foo()s   _internal.foo.process()s   a + 1s   b() + a() * x[foo(2 ** 3)]s,   b() + b() * x[_internal.foo.process(2 ** 3)](    (   R  (    (   R  s)   lib/python2.7/site-packages/patsy/eval.pyt   test_replace_bare_funcalls  s    	t   _FuncallCapturerc           B   s   e  Z d    Z d   Z RS(   c         C   s=   | g |  _  | | f g |  _ d |  _ t |  _ t |  _ d  S(   Ni    (   t   funcR  t   paren_depthR!   t   startedt   done(   R   t   start_token_typet   start_token(    (    s)   lib/python2.7/site-packages/patsy/eval.pyR     s
    		c         C   s   |  j  r d  S|  j j | | f  | d
 k rA |  j d 7_ n  | d k r_ |  j d 8_ n  |  j d k st t  |  j s | d k r t |  _ q | t j k s | d	 k s t  |  j	 j |  n  |  j r |  j d k r t |  _  n  d  S(   NR   t   {t   [i   R   t   }t   ]i    R   (   R   R  R  (   R   R  R  (
   R  R  R   R	  R0   R
  R"   R   R   R  (   R   R   R   (    (    s)   lib/python2.7/site-packages/patsy/eval.pyt	   add_token  s    		!(   R'   R)   R   R  (    (    (    s)   lib/python2.7/site-packages/patsy/eval.pyR    s   	c         C   s   g  } xp t  |  D]b \ } } } } x | D] } | j | |  q, W| d r | |  k r | j t | |   q q Wg  | D]' } d j | j  t | j  f ^ q S(   NR   t    (   R   R  R   R  t   joinR  R   R  (   R   RD   t	   capturersR   R   R   R   t   capturer(    (    s)   lib/python2.7/site-packages/patsy/eval.pyR     s    c           C   s   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 s{ t  d  S(   NR   s   a + foo.baz(bar) + b.c(d)s   foo.bazs   foo.baz(bar)R-   s   b.cs   b.c(d)s   foo.bar(foo.baz(quux))s   foo.bars   foo.baz(quux)R   s   foo[bar.baz(x(z[asdf])) ** 2]s   bar.bazs   bar.baz(x(z[asdf]))(   s   foo.bazs   foo.baz(bar)(   s   b.cs   b.c(d)(   s   foo.bars   foo.bar(foo.baz(quux))(   s   foo.bazs   foo.baz(quux)(   s   bar.bazs   bar.baz(x(z[asdf]))(   R   R0   (    (    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   test_capture_obj_method_calls  s    (6   t   __all__R   R
   R`   R   R:   R]   R4   t   patsyR   t
   patsy.utilR   R   R   t   patsy.tokensR   R   R   t   patsy.compatR	   R   RR   t   objectR   R9   RG   RO   RQ   R    R   R   R   R   R   R   R   R   R   R   R   t   patsy.builtinsR   R   R   R   R   R   R   R   R   R  R  R   R  (    (    (    s)   lib/python2.7/site-packages/patsy/eval.pyt   <module>   sX   		#							
		)		!				*	4						
