Ńņ
ė{½Jc        7   @   s  d  Z  d d k Z d d k Z d d k Z d d k Z d d k Z d d k Z d d k Z d d k Z d d k	 l
 Z
 l Z d d k l Z l Z l Z l Z d d k l Z d d k l Z l Z d d k Z d d k l Z d d k l Z d d	 k l Z d d
  Z d d  Z d e  f d     YZ! d e! f d     YZ" e" Z# d   Z$ d e% f d     YZ& d   Z' d   Z( d d  Z) d   Z* d   Z+ d   Z, d   Z- d d  Z. d d  Z/ d d  Z0 d d  Z1 d   Z2 d    Z3 d!   Z4 d d"  Z5 d d#  Z6 d$   Z7 d%   Z8 d&   Z9 d'   Z: d d d(  Z; d)   Z< d*   Z= d+   Z> d,   Z? d-   Z@ d.   ZA d/   ZB d0 iC eD d1   eE eF eG d2     ZH d3   ZI d4   ZJ d d5  ZK e  d6 d7 d8 d7 d9 d: d; d: d< d= d> d?  ZL d@   ZM dA   ZN dB   ZO eP dC  ZQ dD   ZR eS e dE  o eS e dF  o dG   ZT n# d d kU ZU eU iV dH ZW dI   ZT dJ   ZX dK   ZY dL   ZZ d d dM dN d dO dP dQ dR dS dT dU dV dW dX dY dZ d[ d\ d] d^ d_ d` da db dc dd de df dg dh di dj dk dl dm dn do g& Z[ d S(p   s   The TurboGears utility module.i’’’’N(   t
   getargspect   getargvalues(   t   izipt   islicet   chaint   imap(   t   isSequenceType(   t   quotet   unquote(   t   request(   t	   decorator(   t   configc            s%     f d     |    _  t   _   S(   sŻ   Decorator which can be used to mark functions as deprecated.

    It will result in a warning being emmitted when the function is used.

    Inspired by http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/391367

    c            s_    i  p d   i  _  n    f d   }   i | _   i | _ | i i   i  | S(   Ns   Call to deprecated function %s.c             s@     i  p) t i   i d t d d t   _  n  |  |   S(   Nt   categoryt
   stackleveli   (   t   warnedt   warningst   warnt   messaget   DeprecationWarningt   True(   t   argst   kwargs(   t   decoratet   func(    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   newFunc$   s
    
(   R   t   __name__t   __doc__t   __dict__t   update(   R   R   (   R   (   R   sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyR       s    
(   R   t   FalseR   (   R   (    (   R   sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt
   deprecated   s    		c         C   s#   d } |  o d |  | } n | S(   Ns  Before you can run this command, you need to install all the project's
dependencies by running "python setup.py develop" in the project directory, or
you can install the application with "python setup.py install", or build an egg
with "python setup.py bdist_egg" and install it with "easy_install dist/<egg>".

If you are stuck, visit http://docs.turbogears.org/GettingHelp for support.sA   This project requires the %s package but it could not be found.

(    (   t   namet   msg(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   missing_dependency_error2   s
    t   Bunchc           B   s2   e  Z d  Z d   Z d   Z e i Z d   Z RS(   s5   Simple but handy collector of a bunch of named stuff.c         C   sb   |  i    } | i   d i g  } | D] } | d | |  | f q' ~  } d |  i i | f S(   Ns   , s   %s=%rs   %s(%s)(   t   keyst   sortt   joint	   __class__R   (   t   selfR#   t   _[1]t   keyR   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   __repr__B   s    
8c         C   s2   y |  | SWn t  j
 o t |   n Xd  S(   N(   t   KeyErrort   AttributeError(   R'   R   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   __getattr__H   s    c         C   s1   y |  | =Wn t  j
 o t |   n Xd  S(   N(   R+   R,   (   R'   R   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   __delattr__P   s    (	   R   t
   __module__R   R*   R-   t   dictt   __setitem__t   __setattr__R.   (    (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyR"   ?   s
   			t   DictObjc           B   s   e  Z e d   d    Z RS(   s-   Use Bunch instead of DictObj and DictWrapper.c         O   s   t  t |   i | |   d  S(   N(   t   superR3   t   __init__(   R'   R   t   kw(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyR5   Y   s    (   R   R/   R   R5   (    (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyR3   W   s   c             sĆ   d t  f   f d     Y} |    d t  f      f d     Y} t   d   d g t    x@ t   D]2 \ } } | |  } t | | |  |  | <q} Wt     S(   s«   True immutable symbolic enumeration with qualified value access.

    Written by Zoran Isailovski:
    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/413486

    t	   EnumClassc              sY   e  Z   Z  f d    Z  f d   Z  f d   Z   f d   Z  f d   Z RS(   c            s
   t     S(   N(   t   iter(   R'   (   t	   constants(    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   __iter__m   s    c            s
   t     S(   N(   t   len(   R'   (   R9   (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   __len__o   s    c            s     | S(   N(    (   R'   t   i(   R9   (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   __getitem__q   s    c            s   d t     S(   Nt   Enum(   t   str(   R'   (   t   names(    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyR*   s   s    c            s   d t     S(   Ns   enum (   R@   (   R'   (   R9   (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   __str__u   s    (   R   R/   t	   __slots__R:   R<   R>   R*   RB   (    (   RA   R9   (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyR7   k   s   t	   EnumValuec              sw   e  Z d  Z d   Z e d    Z e  f d    Z d   Z d   Z   f d   Z	 d   Z
   f d   Z RS(	   t   __valuec         S   s   | |  _  d  S(   N(   t   _EnumValue__value(   R'   t   value(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyR5   |   s    c         S   s   |  i  S(    (   RF   (   R'   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   <lambda>~   s    c            s     S(    (    (   R'   (   t   enumType(    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyRH      s    c         S   s   t  |  i  S(   N(   t   hashRF   (   R'   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   __hash__   s    c         S   s0   |  i  | i  j p
 t d  t |  i | i  S(   Ns-   Only values from the same enum are comparable(   t   EnumTypet   AssertionErrort   cmpRF   (   R'   t   other(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   __cmp__   s    c            s      |  i  S(   N(   RF   (   R'   (   t   maximumR9   (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt
   __invert__   s    c         S   s   t  |  i  S(   N(   t   boolRF   (   R'   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   __nonzero__   s    c            s   t    |  i  S(   N(   R@   RF   (   R'   (   RA   (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyR*      s    (   R   R/   RC   R5   t   propertyt   ValueRL   RK   RP   RR   RT   R*   (    (   RA   RQ   R9   RI   (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyRD   z   s   				i   N(   t   objectR;   t   Nonet	   enumeratet   setattrt   tuple(   RA   R7   RD   R=   t   eacht   val(    (   RQ   RA   R9   RI   sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyR?   `   s    	% t   setlikec           B   s    e  Z d  Z d   Z d   Z RS(   s   Set preserving item order.c         C   s"   | |  j o |  i  |  n d  S(   N(   t   append(   R'   t   item(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   add   s    c         C   s"   x | D] } |  i  |  q Wd  S(   N(   Ra   (   R'   t   iterableR`   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   add_all    s     (   R   R/   R   Ra   Rc   (    (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyR^      s   	c         C   sN   xG t  i d  D]6 } | i   i d  o t  i i | |   } | Sq Wd S(   s8   Get egg-info file with that name in the current project.s   ./s   egg-infoN(   t   ost   listdirt   lowert   endswitht   pathR%   (   R   t   dirnamet   fname(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   get_project_meta„   s
     c           C   s   t  i i d  o d p d S(   s5   Try to select appropriate project configuration file.s   setup.pys   dev.cfgs   prod.cfg(   Rd   Rh   t   exists(    (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   get_project_config­   s    c         C   sz   |  d j o t   }  n t i i |   p& d t i i |   f GHt i   n t   } t	 i
 d |  d | d  d S(   s   Try to update the project settings from the config file specified.

    If configfile is C{None}, uses L{get_project_config} to locate one.

    s*   Config file %s not found or is not a file.t
   configfilet
   modulenames   .configN(   RX   Rm   Rd   Rh   t   isfilet   abspatht   syst   exitt   get_package_nameR   t   update_config(   Rn   t   package(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   load_project_config²   s    	c          C   sŚ   t  i d  }  |  o |  St t d  oO d t i j o? t i t i i d  d } t i |  } | i d  } n' t	 d  } | o t
 |  p g  } x3 | D]+ }  |  i   }  |  o |  d j o |  Sq§ Wd S(   s:   Try to find out the package name of the current directory.Rv   t   argvs   --eggi   s   top_level.txtt   localesN(   R   t   gett   hasattrRr   Rx   t   indext   pkg_resourcest   get_distributiont   _get_metadataRk   t   opent   rstrip(   Rv   t   projectnamet   eggt	   top_levelRj   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyRt   Ć   s      c          C   s?   t  d  }  |  o( t t |    d d d !} | i   Sd  S(   Ns   PKG-INFOi   i   i’’’’(   Rk   t   listR   t   strip(   t   pkg_infoR   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   get_project_nameÕ   s    c          C   sI   t    }  |  p d  St |  h  h  d g  } t | d  o | i Sd  S(   Nt   model(   Rt   RX   t
   __import__R{   R   (   t   package_nameRv   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt	   get_modelÜ   s    	c         C   s/   |  d j o g  St |   o |  S|  g Sd S(   s!   Construct a sequence from object.N(   RX   R   (   t   obj(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   ensure_sequenceå   s
    i    c   	      C   s   t  |   d d d  \ } } t |  } t t | | t |  t |   |  } x | D] \ } } | | | <q] W| t |  t |  | | f S(   s6   Convert all applicable arguments to keyword arguments.Ni   (   R    R   R   R   R;   (	   R   R   R6   t   startt   argnamest   defaultst   kv_pairst   kt   v(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   to_kwļ   s    ( c   	      C   s   t  |   d d d  \ } } t |  } g  } t | | t |  t |   D]' } | | j o | | i |  qR qR ~ } | i |  | | f S(   s:   Extract named positional arguments from keyword arguments.Ni   (   R    R   R   R;   t   popt   extend(	   R   R   R6   R   R   R   R(   R   t   newargs(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   from_kwś   s    Gc         C   s  t  |   \ } } } } t |  } | | 4| d j oC t | g  } | i   D] }	 |	 | j o | |	 qO qO ~  n | d j o | t |  t |   } n\ t |  t |  }
 t t t | |
  t	 | i
 t | |
 d   t | |
 d    } | | f S(   s   Remove excess arguments.t   _decorator__kwargst   _decorator__varargsN(   NR   (   NR   (   R    R   RX   t   remove_keyst   iterkeysR;   R[   R   R   R   R   (   R   R   R6   R   R   t   varargsR   R   R(   R)   t   pivot(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt
   adapt_call  s    C'c      
   C   sŹ   y t  i | d  } Wn t j
 o t SXx | i o | i } | i i |  j oj t |  d } xW | i   D]A } y | | | | j o Pn Wqt t	 t
 f j
 o Pqt Xqt Wt Sq1 q1 Wt S(   s9   Check if a call to function matching pattern is on stack.i   i   (   Rr   t	   _getframet
   ValueErrorR   t   f_backt   f_codet   co_nameR   R   R+   t	   TypeErrorR   (   t	   func_nameR6   R   t   frameR   R)   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   call_on_stack  s$     
	 	
c         C   s%   x | D] } |  i  | d  q W|  S(   s!   Gracefully remove keys from dict.N(   R   RX   (   t   dict_t   seqR)   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyR   -  s     c         C   s   | t  |   d j S(   s$   Check whether function has argument.i    (   R    (   R   t   argname(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   has_arg4  s    c         C   s6   t  |   d } t |  |  o | i |  Sd Sd S(   s6   Find index of argument as declared for given function.i    N(   R    R­   R|   RX   (   R   R¬   R   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt	   arg_index9  s    c   	      C   sŗ   t  |   d d d  \ } } t |  } t |  |  } | d j p! | t |  t |  d j o | | | <n; | | 8} t t t | |  | f t | | d    } | | f S(   s   Insert argument into call.Ni   i   (   R    R   R®   RX   R;   R[   R   R   (	   R   R¬   t   argvalR   R6   R   R   R   t   pos(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt
   inject_argB  s    .
c         C   sH   x; | i    D]- \ } } t |  | | | | |  \ } } q W| | f S(   s   Insert arguments into call.(   t	   iteritemsR±   (   R   t
   injectionsR   R6   R   R¬   RÆ   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   inject_argsP  s     %c         O   s(   t  |  | | |  \ } } |  | |   S(   s   Insert arguments and call.(   R“   (   R   R³   R   R6   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   inject_callW  s    c         C   sF   y |  i  } Wn t j
 o t   } n X| i |  | |  _  d S(   s9   Add hint for special arguments that shall not be removed.N(   t   _tg_argsR,   t   setR   (   R   R   t   tg_args(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   add_tg_args]  s    c             s%     f d       f d   } | S(   s.   Call with arguments set to a predefined value.c            s     f d   S(   Nc            s   t  |    | |  S(    (   Rµ   (   R   R   R6   (   Ra   (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyRH   j  s    (    (   R   (   Ra   (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   entaglei  s    c   	   
      sÅ   t  |   \ } } } } t t |   } g  } | D]6 } | t |  | i |   j o | | q5 q5 ~ } g  } | D] } |  j o | | q q ~ } t   | | | | f  |   S(   N(   R    R   R   R;   R|   R
   (	   R   R   R   R   R   R(   t   dt   _[2]t   arg(   Rŗ   Ra   (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   make_decoratorl  s    92(    (   Ra   R¾   (    (   Ra   Rŗ   sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt	   bind_argsg  s    c         C   sd   x] | i    D]O \ } } t | t  o) t |  | t  o t |  | |  q | |  | <q W|  S(   sC   Recursively update all dicts in to_dict with values from from_dict.(   R²   t
   isinstanceR0   t   recursive_update(   t   to_dictt	   from_dictR   R   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyRĮ   w  s     $c         C   s¤   h  } h  } |  d j o
 g  }  n | d j	 o9 |  i g  } | D] } | t i | d  qA ~  n x. |  D]& } | i | i  | i | i  qp W| | f S(   s-   Combine contexts (globals, locals) of frames.i   N(   RX   R   Rr   R”   R   t   f_localst	   f_globals(   t   framest   deptht   locals_t   globals_R(   R»   RØ   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   combine_contexts  s    
9 c           C   s3   y t  t d t  t SWn t j
 o t SXd S(   s'   Check if cherrypy.request is available.t   tg_dumb_attributeN(   RZ   R	   R   R,   R   (    (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   request_available  s
    c         c   sX   xQ |  D]I } t  |  o1 t | t  o  x" t |  D] } | Vq8 Wq | Vq Wd S(   s   Flatten sequence.N(   R   RĄ   t
   basestringt   flatten_sequence(   R«   R`   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyRĪ     s      c         C   sź   |  d j	 p
 t d  |  i d  } d i | d   } | d } yr y" t | t   t   | g  } WnI t j
 o= | p/ t t i d  d t   t   | g  } q“ n XWn% t	 j
 o t
 i d |   d SXt | |  S(   s÷   Load a class from a module in dotted-path notation.

    E.g.: load_class("package.module.class").

    Based on recipe 16.3 from Python Cookbook, 2ed., by Alex Martelli,
    Anna Martelli Ravenscroft, and David Ascher (O'Reilly Media, 2005)

    s   dottedpath must not be Nonet   .i’’’’i    s7   tg.utils: Could not import %s because exception occuredN(   RX   RM   t   splitR%   R   t   globalst   localsR¢   R   t   ImportErrort   loggingt	   exceptiont   getattr(   t
   dottedpatht   splitted_pathRo   t	   classnamet   module(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt
   load_class£  s     	
"%	c      
   C   sv  |  d	 j o g  Sg  } x%|  i d  D]} | i d  } xĒ t | d  D]Æ \ } } | i d d  } | d i   d j oz y< t | d  } d | j  o
 d j n p
 t  n Wn t t f j
 o d } n Xd i | | d   } PqN qN Wd } | o. | i   } | o | i | | f  q<q( q( W| i	 d d    g  } | D] } | | d q^~ S(
   s)  Parse an HTTP Accept header (RFC 2616) into a sorted list.

    The quality factors in the header determine the sort order.
    The values can include possible media-range parameters.
    This function can also be used for the Accept-Charset,
    Accept-Encoding and Accept-Language headers.

    t   ,t   ;i   t   =i    t   qR)   c         S   s	   |  d  S(   i   (    (   R`   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyRH   ą  s    N(
   RX   RŠ   RY   R   t   floatR¢   t
   IndexErrorR%   R_   R$   (   t   acceptt   itemsR`   t   paramsR=   t   paramRß   R(   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   parse_http_accept_headerĄ  s2    	  	c         C   sC  |  d j o d S|  } d } x|  i d  D]} | i d  } | i d  } x  | D] } | i d d  } | d i   d j oc y< t | d  } d | j  o
 d j n p
 t  n Wn t t f j
 o d } n XPqY qY Wd } | | j o9 | i   } | o" | } | d j o Pn | } q;q. q. W| S(   s  Parse an HTTP Accept header (RFC 2616) into a preferred value.

    The quality factors in the header determine the preference.
    Possible media-range parameters are allowed, but will be ignored.
    This function can also be used for the Accept-Charset,
    Accept-Encoding and Accept-Language headers.

    This is similar to parse_http_accept_header(accept)[0], but faster.

    i    RÜ   RŻ   RŽ   i   Rß   N(   RX   RŠ   R   R   Rą   R¢   Rį   (   Rā   t	   best_itemt   best_qR`   Rä   Rå   Rß   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   simplify_http_accept_headerä  s8      	c         C   sz   t  |  t  of y t |   }  Wqv t j
 oC y t |  t    }  Wqr t j
 o t d |    qr Xqv Xn |  S(   s¬   Convert encoded string to unicode string.

    Uses get_template_encoding_default() to guess source string encoding.
    Handles turbogears.i18n.lazystring correctly.

    s   Non-unicode string: %r(   RĄ   R@   t   unicodet   UnicodeDecodeErrort   get_template_encoding_defaultR¢   (   RG   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt
   to_unicode  s    c         C   s[   t  |  t  o n! t |  d  o t |   }  n t  |  t  o |  i d  }  n |  S(   s   Convert a unicode string to utf-8 encoded plain string.

    Handles turbogears.i18n.lazystring correctly.

    Does nothing to already encoded string.

    t   __unicode__s   utf-8(   RĄ   R@   R{   Rź   t   encode(   RG   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   to_utf8!  s    t    c         C   s   |  t  |   j o
 |  d  j S(   s	   $,; 	
(   R   (   t   c(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyRH   2  s   i   c         C   s   t  |  t  S(   sB   Escape chars in value that should not be put directly in a cookie.(   R   t   _safe_for_cookie(   RG   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   quote_cookie5  s    c         C   s
   t  |   S(   sE   Unescape chars in a cookie value, the reverse of quote_cookie(value).(   R   (   RG   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   unquote_cookie:  s    c         C   s7   |  d j o t i d d  }  n t i d |  d  S(   s?   Return default encoding for template files (Kid, Genshi, etc.).s   tg.defaultviewt   kids   %s.encodings   utf-8N(   RX   R   Rz   (   t   engine_name(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyRģ   ?  s    t   plains
   text/plaint   textt   htmls	   text/htmlt   xhtmlt   xmls   text/xmlt   jsons   application/jsonc         C   s<   t  i d h   i |   } | p t i |  d  } n | S(   s  Return default MIME media type for a template format.

    Note: By default we are serving xhtml as "text/html" instead of the more
    correct "application/xhtml+xml", since many browsers, particularly MSIE,
    do not support this. We are assuming that xhtml means XHTML 1.0 here,
    where this approach is possible. It would be possible to use some kind
    of content negotiation to deliver a customized content type, but we avoid
    this because it causes more harm (e.g. with proxies involved) than good.

    If you want to serve the proper content type (e.g. for XHTML 1.1),
    set tg.format_mime_types= {'xhtml': 'application/xhtml+xml'}.
    You can also set a particular content type per controller using the
    content_type parameter of the expose decorator.

    For detailed information about this issues, see here:
    http://www.smackthemouse.com/xhtmlxml, http://schneegans.de/web/xhtml/.

    s   tg.format_mime_typess	   text/html(   R   Rz   t   _format_mime_types(   t   formatt	   mime_type(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   get_mime_type_for_formatK  s    c         C   ss   |  p t  S|  i d  o t S|  i d  o> |  i d  p |  i d  o t S|  i d  o t Sn t  S(   sĻ   Return whether the MIME media type supports a charset parameter.

    Note: According to RFC4627, we do not output a charset parameter
    for "application/json" (this type always uses a UTF encoding).

    s   text/s   application/s   /xmls   +xmls   /javascript(   R   t
   startswithR   Rg   (   R   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   mime_type_has_charsetd  s     	c         C   sE   d } y t  |   i d  \ } } Wn t j
 o n Xt |  S(   s$  Find precision of some arbitrary value.

    The main intention for this function is to use it together with
    turbogears.i18n.format.format_decimal() where one has to inform
    the precision wanted. So, use it like this:

    format_decimal(some_number, find_precision(some_number))

    Rń   RĻ   (   R@   RŠ   R¢   R;   (   RG   t   decimalst   stub(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   find_precisionw  s    
c         C   sg   t  |  t  o t } |  i   }  n( t  |  t  o t } |  }  n t } | o |  | f S|  Sd S(   s±   Make a copy of the value if it is mutable.

    Returns the value. If feedback is set to true, also returns
    whether value was mutable as the second element of a tuple.

    N(   RĄ   R0   R   t   copyR   R   (   RG   t   feedbackt   mutable(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   copy_if_mutable  s    c         C   s   d   } t  i d | |   S(   sv   Replace HTML character entities with numerical references.

    Note: This won't handle CDATA sections properly.

    c         S   s{   t  i i |  i d  i    } | p |  i d  St |  d j o* | d j o |  i d  Sd t |  S| Sd  S(   Ni   i    s   &<>'"s   &#%d;(   t   htmlentitydefst
   entitydefsRz   t   groupRf   R;   t   ord(   t   matchobjt   entity(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   repl¤  s    !s   &(\w+);?(   t   ret   sub(   t   htmltextR  (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   fixentities  s    	
t	   inet_ptont   AF_INET6c         C   s   t  i t  i |   S(   s1   Convert IP6 standard hex notation to IP6 address.(   t   socketR  R  (   t   addr(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt
   inet6_aton³  s    s   :.c         C   s  |  i  t  } | o t d | d   n |  i d  } | i d  } d | d j o d p d } t |  | j p | d	 j o t d
   n | d	 j o d S| o{ d g | t |  | } |  i d  o | | d *q.|  i d  o | | d )q.| i d  } | | | | d +n t |  | j o t d
   n | d j oz | i	   } | i d  d	 j o t d
   n g  } | D] }	 | t
 |	 d  q~ } t i d |  t i |  Sg  }
 | D] }	 |
 t
 |	 d  qć~
 } t i d |  Sd S(   sr   Convert IPv6 standard hex notation to IPv6 address.

        Inspired by http://twistedmatrix.com/trac/.

        s&   Illegal character '%c' in IPv6 addressi    t   :Rń   RĻ   i’’’’i   i   i   s"   Syntactically invalid IPv6 addresst    i   t   0s   ::i   iž’’’i   s   !6Hs   !8HNt                   (   t   lstript   _inet6_charsR¢   RŠ   t   countR;   R  Rg   R|   R   t   intt   structt   packR  t	   inet_aton(   R  t   faultyt   partst   elidedt   extensot   zerost   idxt   ipv4R(   t   xR¼   (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyR  ¼  s8     **c         C   s<   d |  j o t  |   St i d d d  t i |   Sd S(   s.   Convert IPv4 or IPv6 notation to IPv6 address.R  s   !QLi    i’’  N(   R  R#  R$  R  R%  (   R  (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyR%  ā  s    c         C   s(   t  i d |   \ } } | d >| B| ?S(   s7   Remove the number of masked bits from the IPV6 address.s   !QQi@   (   R#  t   unpack(   R  t   maskedt   hit   lo(    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   _inet_prefixź  s    c         C   s   d |  j o@ |  i  d d  \ }  } d |  j o d p d t |  } n d } t |   }  t |  } | o" t |  |  }  t | |  } n | |  j S(   s7   Check whether IP address matches CIDR IP address block.t   /i   R  i   i    N(   RŠ   R"  RX   R%  R2  (   t   cidrt   ipt   prefixR/  (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   match_ipš  s    (t   DictWrapperR?   Rt   R   Rw   R   R­   R   R   R    R©   R   R®   R±   R“   R¹   Ræ   RĮ   RŹ   RĢ   RĪ   RŪ   Rę   Ré   Rķ   Rš   Rō   Rõ   Rģ   R  R  R  R
  R7  R   (\   R   Rd   Rr   R  RŌ   R   R  R  R#  t   inspectR    R   t	   itertoolsR   R   R   R   t   operatorR   t   urllibR   R   R}   t   cherrypyR	   t   turbogears.decoratorR
   t
   turbogearsR   RX   R   R!   R0   R"   R3   R8  R?   R   R^   Rk   Rm   Rw   Rt   R   R   R   R   R   R    R©   R   R­   R®   R±   R“   Rµ   R¹   Ræ   RĮ   RŹ   RĢ   RĪ   RŪ   Rę   Ré   Rķ   Rš   R%   t   filtert   mapt   chrt   xrangeRó   Rō   Rõ   Rģ   Rž   R  R  R  R   R
  R  R{   R  t   stringt	   hexdigitsR   R%  R2  R7  t   __all__(    (    (    sm   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/util.pyt   <module>   sŖ   "	9							

						
					
		$	(								 	&							