ó
àÆSc           @  sh  d  d l  m Z d g Z d  d l Z d  d l Z d  d l m Z d  d l m	 Z	 d  d l
 m Z d  d l m Z m Z m Z m Z d  d l m Z m Z d  d	 l m Z d
 d d d g Z d „  Z d „  Z d „  Z d „  Z e d d d ƒ Z e e d d d ƒ e d d d ƒ e d d d ƒ e d d d ƒ e d d d ƒ e d d d ƒ e d d d ƒ e d d d ƒ e d d d ƒ g
 Z g  d  „ Z i d d! g d" 6d d! g d# 6d d! g d$ 6d d! g d! 6d d% g d% 6d d% d& g d' 6d d% d& g d( 6d d% d& g d) 6d d% d d& g g d* 6d d d d% d& g d+ g g d, 6d d d d% d d& d+ g g d- g g d. 6d d d% d/ g g d0 6d d d% d/ g g d1 6d d d% d& g d d+ d- g g d2 6d d d% d d& d+ g g g d3 6d d d d% d4 g g g d5 6d d d d% d& g g g d6 6d d d% d d& d+ g g g d7 6d d d d% d& g d+ g g d8 6d d d% d d& d+ g g g d9 6d d d% d d& d+ g g g d: 6d d% g d; 6d d d! g g d< 6Z d= „  Z d> „  Z  d? „  Z! d@ „  Z" dA dB dC dD dE dF dG dH dI dJ dK dL dM dN dO dP dQ dR dS dT dU g Z# dV „  Z$ g  dW „ Z% i d dX d% d& g g dY 6d d d% dX d& d+ g g g dZ 6Z& d[ „  Z' d S(\   iÿÿÿÿ(   t   print_functiont   parse_formulaN(   t	   cStringIO(   t
   PatsyError(   t   Origin(   t   Tokent   Operatort   infix_parset	   ParseNode(   t   python_tokenizet   pretty_untokenize(   t   PushbackAdaptert   PYTHON_EXPRt   ZEROt   ONEt   NUMBERc         C  s+   y |  | ƒ Wn t  k
 r" t SXt Sd  S(   N(   t
   ValueErrort   Falset   True(   t   ft   v(    (    s2   lib/python2.7/site-packages/patsy/parse_formula.pyt   _is_a   s
    c         C  s  g  } g  } g  } d } xÒ |  D]Ê \ } } } | d k s@ t  ‚ | d k rr | | k rr |  j | | | f ƒ Pn  | d k r‹ | d 7} n  | d k r¤ | d 8} n  | d k  rÂ t d	 | ƒ ‚ n  | j | ƒ | j | ƒ | j | ƒ q W| d k rt t | | ƒ ƒ }	 |	 d
 k r#d }
 nB |	 d k r8d }
 n- t t |	 ƒ sVt t |	 ƒ r_d }
 n d }
 t	 |
 t
 j | ƒ d |	 ƒSt d t
 j | ƒ ƒ ‚ d  S(   Ni    t   (t   [t   {i   t   )t   ]t   }s   unmatched close brackett   0R   t   1R   R   R   t   extras.   unclosed bracket in embedded Python expression(   R   R   R   (   R   R   R   (   t   AssertionErrort	   push_backR   t   appendR
   t   zipR   t   intt   floatR   R   t   combine(   t   itt
   end_tokenst   pytypest   token_stringst   originst   bracket_levelt   pytypet   token_stringt   origint	   expr_textt
   token_type(    (    s2   lib/python2.7/site-packages/patsy/parse_formula.pyt   _read_python_expr%   s<    			c   	      c  sç   d | k s t  ‚ d | k s$ t  ‚ i t j d 6t j d 6} x | D] } | | | <qE Wt | ƒ } | j d ƒ t t |  ƒ ƒ } x\ | D]T \ } } } | | k r» t | | | ƒ Vq‹ | j | | | f ƒ t	 | | ƒ Vq‹ Wd  S(   NR   R   (
   R   R   t   LPARENt   RPARENt   sett   removeR   R	   R    R1   (	   t   codet   operator_stringst   magic_token_typest   operator_stringR'   R&   R,   R-   R.   (    (    s2   lib/python2.7/site-packages/patsy/parse_formula.pyt   _tokenize_formulaK   s    c          C  s  d }  t  t |  d d d g ƒ ƒ } d t |  d d ƒ d f d t |  d	 d
 ƒ d  f d t |  d d ƒ d f d t |  d d ƒ d  f t j t |  d d ƒ d  f d t |  d d ƒ d f t j t |  d d ƒ d  f d t |  d d ƒ d  f d t |  d d ƒ d  f d t |  d d ƒ d f d t |  d d ƒ d  f d t |  d d  ƒ d! f d t |  d" d# ƒ d  f d$ t |  d% d& ƒ d' f g } x} t | | ƒ D]l \ } } t | t ƒ s±t	 ‚ | j
 | d k sÊt	 ‚ | j | d k sãt	 ‚ | j | d	 k st	 ‚ qWd  S((   Ns&   y ~ a + (foo(b,c +   2)) + -1 + 0 + 10t   +t   -t   ~R   i    i   t   yi   i   i   i   t   ai   i   i   i	   i   s   foo(b, c + 2)i   i   i   i   i   R   i   R   i   i   R   i    i!   R   i"   i#   R   i$   i&   t   10(   t   listR:   R   t   NoneR   R2   R3   R"   t
   isinstanceR   t   typeR.   R   (   R6   t   tokenst	   expectedst   gott   expected(    (    s2   lib/python2.7/site-packages/patsy/parse_formula.pyt   test__tokenize_formula`   s*    R=   i   iœÿÿÿi   R;   id   R<   t   *iÈ   t   /t   :i,  s   **iô  c         C  sÆ   |  j  ƒ  s d }  n  x, | D]$ } | j d k  r t d ƒ ‚ q q Wt | } g  | D] } | j ^ qU } t t |  | ƒ | t ƒ } t | t	 ƒ s¤ | j
 d k rÂ t	 d d  | g | j ƒ } n  | S(   Ns   ~ 1i    s'   all operators must have precedence >= 0R=   (   t   stript
   precedenceR   t   _default_opsR0   R   R:   t   _atomic_token_typesRC   R   RD   RB   R.   (   R6   t   extra_operatorst   opt	   operatorsR7   t   tree(    (    s2   lib/python2.7/site-packages/patsy/parse_formula.pyR   ˆ   s    	
	R   t    t    s    
 R?   t   bs   a ~ bs   (a ~ b)s   a ~ ((((b))))s   a ~ ((((+b))))t   cs	   a + b + ct   ds   a + (b ~ c) + ds   np.log(a, base=10)s   a + np.log(a, base=10)s   a + np . log(a , base = 10)s   a + b ~ c * ds	   a + b * ct   2s   -a**2s   -a:bs   a + b:cs	   (a + b):cs   a*b:cs   a+b / cs   ~ as   -1c         C  sŸ   t  |  t ƒ s t ‚ |  j rn |  j | d k s7 t ‚ xa t |  j | d ƒ D] \ } } t | | ƒ qN Wn- |  j t k sƒ t ‚ |  j j	 | k s› t ‚ d  S(   Ni    i   (
   RC   R   R   t   argsRD   R"   t   _compare_treesRP   t   tokenR   (   RG   RH   t   argt   expected_arg(    (    s2   lib/python2.7/site-packages/patsy/parse_formula.pyR\   ¾   s    	#c         C  sf   x_ t  j |  ƒ D]N \ } } t | d | ƒ} t t | ƒ t | ƒ ƒ t | ƒ t | | ƒ q Wd  S(   NRQ   (   t   sixt	   iteritemsR   t   printt   reprR\   (   t
   test_casesRQ   R6   RH   t   actual(    (    s2   lib/python2.7/site-packages/patsy/parse_formula.pyt   _do_parse_testÈ   s
    
c           C  s   t  t g  ƒ d  S(   N(   Rf   t   _parser_tests(    (    (    s2   lib/python2.7/site-packages/patsy/parse_formula.pyt   test_parse_formulaÏ   s    c          C  s.  t  d ƒ }  |  j t d d d ƒ k s- t ‚ |  j j t d d d ƒ k sQ t ‚ |  j d j t d d d ƒ k sy t ‚ |  j d j t d d d ƒ k s¡ t ‚ |  j d j j t d d d	 ƒ k sÌ t ‚ |  j d j d j t d d d
 ƒ k sû t ‚ |  j d j d j t d d d ƒ k s*t ‚ d  S(   Ns	   a ~ b + ci    i	   i   i   i   i   i   i   i   i   (   R   R.   R   R   R]   R[   (   RT   (    (    s2   lib/python2.7/site-packages/patsy/parse_formula.pyt   test_parse_originÒ   s    !$((+/s   a <+>s   a + <(>s   a + b <# asdf>s   <)>s   a + <)>s   <*> as   a + <*>s   a + <foo[bar>s   a + <foo{bar>s   a + <foo(bar>s
   a + <[bar>s
   a + <{bar>s   a + <{bar[]>s   a + foo<]>bars   a + foo[]<]>bars   a + foo{}<}>bars   a + foo<)>bars   a + b<)>s   (a) <.>s   <(>a + bs
   a +< >'fooc   	      C  sP  xI| D]A} g  } d  } d  } xQ | D]I } | d k rG t | ƒ } q& | d k rb t | ƒ } q& | j | ƒ q& Wd j | ƒ } | d  k	 rš | d  k	 s  t ‚ t | ƒ t t | ƒ | | ƒ y |  | ƒ Wne t k
 r5} t | ƒ | j j	 | k st ‚ | j j
 | k st ‚ | j j | k sHt ‚ q Xt s t d ƒ ‚ q Wd  S(   Nt   <t   >RU   s!   parser failed to report an error!(   RB   t   lenR!   t   joinR   Rb   Rc   R   R.   R6   t   startt   endR   (	   t   parse_fnt   error_descst
   error_desct   lettersRn   Ro   t   lettert   bad_codet   e(    (    s2   lib/python2.7/site-packages/patsy/parse_formula.pyt   _parsing_error_test   s,    

c           s    ‡  f d †  } t  | t ƒ d  S(   Nc           s   t  |  d ˆ  ƒS(   NRQ   (   R   (   R6   (   RQ   (    s2   lib/python2.7/site-packages/patsy/parse_formula.pyRp     s    (   Rw   t   _parser_error_tests(   RQ   Rp   (    (   RQ   s2   lib/python2.7/site-packages/patsy/parse_formula.pyt   test_parse_errors  s    t   |s   a | bs   a * b|cc          C  sF   t  d d d ƒ g }  t t d |  ƒt t d |  ƒt d |  ƒ d  S(   NRz   i   iú   RQ   (   R   Rf   Rg   t   _extra_op_parser_testsRy   (   RQ   (    (    s2   lib/python2.7/site-packages/patsy/parse_formula.pyt   test_parse_extra_op$  s    		((   t
   __future__R    t   __all__t   tokenizeR`   t	   six.movesR   t   StringIOt   patsyR   t   patsy.originR   t   patsy.infix_parserR   R   R   R   t   patsy.tokensR	   R
   t
   patsy.utilR   RP   R   R1   R:   RI   t   _unary_tildeRO   R   Rg   R\   Rf   Rh   Ri   Rx   Rw   Ry   R{   R|   (    (    (    s2   lib/python2.7/site-packages/patsy/parse_formula.pyt   <module>
   s¢   	"			&		("	
					"