
\c        .   @` sp  d  d l  m Z m Z m 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 d  d l m Z d  d l m Z d  d l m Z d  d l Z d  d l m Z d	 d
 l m Z m Z m Z m Z m Z m Z d	 d l m  Z  d	 d l! m" Z" e j#   Z$ e$ d k rKd Z$ n  d   Z% d   Z& d   Z' e d    Z( d   Z) e d d d   Z+ e d d   Z, e d e- d d   Z. e d    Z/ e d d   Z0 e d    Z1 d e2 f d     YZ3 e e- d e4 d   Z5 d    Z6 d d!  Z7 d d"  Z8 d#   Z9 e: e; e< e= e> e? e@ eA eB eC eD eE eF eG eH eI eJ eK eL eM eN eO eP eQ eR eS eT eU eV e- eW eX eY eZ e[ e: e\ e] e^ e_ e` ea eb ec ed ee g-  Zf e ref jg eh  n  e: ei ej ek el em en eo ep eq er es g  Zt e4 d$  Zu d% e2 f d&     YZv d'   Zw d(   Zx d)   Zy d*   Zz d d+  Z{ d,   Z| g  d d-  Z} d g  d.  Z~ d/   Z d0   Z d1   Z d2   Z d3   Z d4   Z d5   Z d6   Z d7   Z d8   Z i  Z d9 e2 f d:     YZ d; e2 f d<     YZ d= e2 f d>     YZ e   Z d? e2 f d@     YZ d d dA  Z dB   Z dC e2 f dD     YZ dE   Z dF   Z dG   Z dH   Z dI   Z i de dL 6df dN 6dg dP 6dh dR 6di dT 6dj dV 6dk dX 6dl dZ 6dm d\ 6dn d^ 6d	 d_ 6d	 d 6Z d`   e j   D Z e j da   e j   D  e j db   e j   D  dc   Z dd   Z d S(o   i    (   t   absolute_importt   divisiont   print_functionN(   t   ENOENT(   t   contextmanager(   t   import_module(   t   Integral(   t   Lock(   t   WeakValueDictionaryi   (   t   get_named_argst
   getargspect   PY3t   unicodet   bind_methodt   Iterator(   t   get_deps(   t	   key_splitt   asciis   utf-8c         G` sM   t  | d t t f  r? g  t |   D] } t |  |  ^ q& S|  |   Sd S(   s    Apply function inside nested lists

    >>> inc = lambda x: x + 1
    >>> deepmap(inc, [[1, 2], [3, 4]])
    [[2, 3], [4, 5]]

    >>> add = lambda x, y: x + y
    >>> deepmap(add, [[1, 2], [3, 4]], [[10, 20], [30, 40]])
    [[11, 22], [33, 44]]
    i    N(   t
   isinstancet   listR   t   zipt   deepmap(   t   funct   seqst   items(    (    s)   lib/python2.7/site-packages/dask/utils.pyR      s    &c         C` sP   | s
 | Sd } | } x' t  | t  r? | d 7} | d } q Wt | |  |  S(   Ni    i   (   R   R   t   ndeepmap(   R   t   seqt   nt   tmp(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   homogeneous_deepmap.   s    
c         C` s   |  d k r) g  | D] } | |  ^ q S|  d k r\ g  | D] } t  |  d | |  ^ q< St | t  ry | | d  S| |  Sd S(   s    Call a function on every element within a nested container

    >>> def inc(x):
    ...     return x + 1
    >>> L = [[1, 2], [3, 4, 5]]
    >>> ndeepmap(2, inc, L)
    [[2, 3], [4, 5, 6]]
    i   i    N(   R   R   R   (   R   R   R   t   item(    (    s)   lib/python2.7/site-packages/dask/utils.pyR   :   s    	'c          g` s!   y	 d  VWn |  k
 r n Xd  S(   N(    (   t
   exceptions(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   ignoringM   s    	c         C` s2   y t  |   SWn t k
 r- t |   n Xd S(   sr   Attempt to import a required dependency.

    Raises a RuntimeError if the requested module is not available.
    N(   R   t   ImportErrort   RuntimeError(   t   mod_namet	   error_msg(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   import_requiredU   s    t    c      	   c` s   d |  j  d  }  t j |  d | \ } } t j |  t j |  z	 | VWd  t j j |  r t j j |  r t	 j
 |  q t t   t j |  Wd  QXn  Xd  S(   Nt   .t   dir(   t   lstript   tempfilet   mkstempt   ost   closet   removet   patht   existst   isdirt   shutilt   rmtreeR    t   OSError(   t	   extensionR(   t   handlet   filename(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   tmpfile`   s    	c      	   c` s   t  j d |   } z	 | VWd  t j j |  r t j j |  re t t   t j	 |  Wd  QXq t t   t j
 |  Wd  QXn  Xd  S(   NR(   (   R*   t   mkdtempR,   R/   R0   R1   R    R4   R2   R3   R.   (   R(   t   dirname(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   tmpdirr   s    	t   wc         c` sj   t  d |  U } | | d | } z | j |   Wd  y | j   Wn t k
 rY n XX| VWd  QXd  S(   NR5   t   mode(   R8   t   writeR-   t   AttributeError(   t   textR5   t   openR=   R7   t   f(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   filetext   s    c         c` s7   t  j   } t  j |   z	 d  VWd  t  j |  Xd  S(   N(   R,   t   getcwdt   chdir(   t   new_cwdt   old_cwd(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   changed_cwd   s
    	c      	   c` s1   t  |    } t |  
 | VWd  QXWd  QXd  S(   N(   R;   RH   (   R(   R:   (    (    s)   lib/python2.7/site-packages/dask/utils.pyt   tmp_cwd   s    c           c` s	   d  Vd  S(   N(    (    (    (    s)   lib/python2.7/site-packages/dask/utils.pyt   noop_context   s    t   IndexCallablec           B` s&   e  Z d  Z d Z d   Z d   Z RS(   s    Provide getitem syntax for functions

    >>> def inc(x):
    ...     return x + 1

    >>> I = IndexCallable(inc)
    >>> I[3]
    4
    t   fnc         C` s   | |  _  d  S(   N(   RL   (   t   selfRL   (    (    s)   lib/python2.7/site-packages/dask/utils.pyt   __init__   s    c         C` s   |  j  |  S(   N(   RL   (   RM   t   key(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   __getitem__   s    (   RL   (   t   __name__t
   __module__t   __doc__t	   __slots__RN   RP   (    (    (    s)   lib/python2.7/site-packages/dask/utils.pyRK      s   		t   tc         c` s  | r t    n t    x |  j   D] \ } } y t j t j j |   Wn t k
 rb n X| | d |  } z | j |  Wd y | j	   Wn t
 k
 r n XXq& Wt |   VxC |  D]; } t j j |  r t t   t j |  Wd QXq q WWd QXd S(   s6   Dumps a number of textfiles to disk

    d - dict
        a mapping from filename to text like {'a.csv': '1,1
2,2'}

    Since this is meant for use in tests, this context manager will
    automatically switch to a temporary current directory, to avoid
    race conditions when running tests in parallel.
    R<   N(   RI   RJ   R   R,   t   makedirsR/   R:   R4   R>   R-   R?   R   R0   R    R.   (   t   dRA   R=   t
   use_tmpdirR7   R@   RB   (    (    s)   lib/python2.7/site-packages/dask/utils.pyt	   filetexts   s$    	c         C` sO   t  |  t  r t |   }  n  t  |  t t f  rK t t t |    }  n  |  S(   s    Make nested iterators concrete lists

    >>> data = [[1, 2], [3, 4]]
    >>> seq = iter(map(iter, data))
    >>> concrete(seq)
    [[1, 2], [3, 4]]
    (   R   R   R   t   tuplet   mapt   concrete(   R   (    (    s)   lib/python2.7/site-packages/dask/utils.pyR\      s
    c   
      C` s  d d l  } t |  } | j d g |  } | j d | d  sJ t  t |  d k  sb t  t | | j j  s | j j |  } n  | j	 |   } | j
 |  d d } xK t t | d  | d   D], \ } \ } }	 | | | | k | |	 k  @<q W| S(   s    Pseudorandom array of integer indexes

    >>> pseudorandom(5, [0.5, 0.5], random_state=123)
    array([1, 0, 0, 1, 1], dtype=int8)

    >>> pseudorandom(10, [0.5, 0.2, 0.2, 0.1], random_state=5)
    array([0, 2, 0, 3, 0, 1, 2, 1, 0, 0], dtype=int8)
    i    Ni   ii   t   dtypet   i1(   t   numpyR   t   cumsumt   allcloset   AssertionErrort   lenR   t   randomt   RandomStatet   random_samplet   emptyt	   enumerateR   (
   R   t   pt   random_statet   npt   cpt   xt   outt   it   lowt   high(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   pseudorandom   s    	0c         ` s   d d l  } t   f d   d d d d g D  sI | j j      n    j d |  d	  } t | j | d
 | j j |  d f   } t	 |  |  k s t
  | S(   s  Return a list of arrays that can initialize
    ``np.random.RandomState``.

    Parameters
    ----------
    n : int
        Number of arrays to return.
    random_state : int or np.random.RandomState, optional
        If an int, is used to seed a new ``RandomState``.
    i    Nc         3` s   |  ] } t    |  Vq d  S(   N(   t   hasattr(   t   .0t   attr(   Rj   (    s)   lib/python2.7/site-packages/dask/utils.pys	   <genexpr>  s    t   normalt   betat   bytest   uniformip  i   R]   i(   R_   t   allRd   Re   Rx   R   t
   frombuffert   uint32t   reshapeRc   Rb   (   R   Rj   Rk   t   random_datat   l(    (   Rj   s)   lib/python2.7/site-packages/dask/utils.pyt   random_state_data  s    (-c         C` s(   t  |  t  p' t  |  t  o' |  j   S(   sj   
    >>> is_integer(6)
    True
    >>> is_integer(42.0)
    True
    >>> is_integer('abc')
    False
    (   R   R   t   floatt
   is_integer(   Ro   (    (    s)   lib/python2.7/site-packages/dask/utils.pyR     s    	c         C` s   |  t  k r t S|  t k r  t Sy t |   } Wn t k
 rD t SXy& | j d d k og t |  t  } Wn t k
 r t } n X| r | j	 r t S| j
 d k r d n t | j
  } t | j  | | d k S(   s   Does this function take multiple arguments?

    >>> def f(x, y): pass
    >>> takes_multiple_arguments(f)
    True

    >>> def f(x): pass
    >>> takes_multiple_arguments(f)
    False

    >>> def f(x, y=None): pass
    >>> takes_multiple_arguments(f)
    False

    >>> def f(*args): pass
    >>> takes_multiple_arguments(f)
    True

    >>> class Thing(object):
    ...     def __init__(self, a): pass
    >>> takes_multiple_arguments(Thing)
    False

    i    RM   i   N(   t   ONE_ARITY_BUILTINSt   Falset   MULTI_ARITY_BUILTINSt   TrueR
   t	   Exceptiont   argsR   t   typet   varargst   defaultst   NoneRc   (   R   R   t   spect   is_constructort	   ndefaults(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   takes_multiple_arguments4  s     &
$t   Dispatchc           B` sS   e  Z d  Z d d  Z d d  Z d d  Z d   Z d   Z e	 d    Z RS(   s   Simple single dispatch.c         C` s(   i  |  _  i  |  _ | r$ | |  _ n  d  S(   N(   t   _lookupt   _lazyRQ   (   RM   t   name(    (    s)   lib/python2.7/site-packages/dask/utils.pyRN   e  s    		c         ` s,      f d   } | d k	 r( | |  S| S(   s7   Register dispatch of `func` on arguments of type `type`c         ` sD   t   t  r3 x.  D] }   j | |   q Wn |    j  <|  S(   N(   R   RZ   t   registerR   (   R   RU   (   RM   R   (    s)   lib/python2.7/site-packages/dask/utils.pyt   wrapperm  s
    N(   R   (   RM   R   R   R   (    (   RM   R   s)   lib/python2.7/site-packages/dask/utils.pyR   k  s    c         ` s,      f d   } | d k	 r( | |  S| S(   s   
        Register a registration function which will be called if the
        *toplevel* module (e.g. 'pandas') is ever loaded.
        c         ` s   |    j   <|  S(   N(   R   (   R   (   RM   t   toplevel(    s)   lib/python2.7/site-packages/dask/utils.pyR   |  s    N(   R   (   RM   R   R   R   (    (   RM   R   s)   lib/python2.7/site-packages/dask/utils.pyt   register_lazyw  s    c         C` s   |  j  } y | | } Wn t k
 r* n X| S| j j d  \ } } } y |  j j |  } Wn t k
 rs n X|   |  j |  Sx= t j |  d D]( } | | k r | | | | <| | Sq Wt	 d j
 |    d S(   s8   Return the function implementation for the given ``cls``R'   i   s   No dispatch for {0}N(   R   t   KeyErrorRR   t	   partitionR   t   popt   dispatcht   inspectt   getmrot	   TypeErrort   format(   RM   t   clst   lkt   implR   t   _R   t   cls2(    (    s)   lib/python2.7/site-packages/dask/utils.pyR     s$    	c         O` s%   |  j  t |   } | | | |  S(   sJ   
        Call the corresponding method based on type of argument.
        (   R   R   (   RM   t   argR   t   kwargst   meth(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   __call__  s    c         C` s:   y |  j  t  } | j SWn t k
 r5 d |  j SXd  S(   Ns   Single Dispatch for %s(   R   t   objectRS   R   RQ   (   RM   R   (    (    s)   lib/python2.7/site-packages/dask/utils.pyRS     s
    N(
   RQ   RR   RS   R   RN   R   R   R   R   t   property(    (    (    s)   lib/python2.7/site-packages/dask/utils.pyR   c  s   		c         C` s@   y t  j |   Wn( t k
 r; } | j t k r<   q< n Xd S(   s,   
    Ensure that a file does not exist.
    N(   R,   t   unlinkR4   t   errnoR   (   R7   t   e(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   ensure_not_exists  s
    c         C` sj   |  j    } | d k s' | j d  r+ | Sd | k rb d | k rb d |  k rW |  d S|  d Sn |  Sd  S(   Ns   >>>s   >>> #s   +SKIPs
   # doctest:s   , +SKIPs     # doctest: +SKIP(   t   stript
   startswith(   t   linet   stripped(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   _skip_doctest  s    c         C` s?   |  d  k r d Sd j g  |  j d  D] } t |  ^ q&  S(   NR&   s   
(   R   t   joint   splitR   (   t   docR   (    (    s)   lib/python2.7/site-packages/dask/utils.pyt   skip_doctest  s    c         ` s   |  j  d      f d   t t    d  D } t   } x t | j    D] \ } } | | k r d | }   | j | |    | <  | d j d t |  d t |     | d <qQ | j |  qQ Wd j    S(   Ns   
c         ` sU   i  |  ]K }   | d  r t  d     | d  j   D  r   | j   |  q S(   i   c         s` s   |  ] } | d  k Vq d S(   t   -N(    (   Rt   t   c(    (    s)   lib/python2.7/site-packages/dask/utils.pys	   <genexpr>  s    (   Rz   R   (   Rt   Ro   (   t   lines(    s)   lib/python2.7/site-packages/dask/utils.pys
   <dictcomp>  s   	 i   s   Extra R   (	   R   t   rangeRc   t   sett   sortedR   t   replacet   addR   (   R   t   titlest   seenRo   t   titlet	   new_title(    (   R   s)   lib/python2.7/site-packages/dask/utils.pyt   extra_titles  s    &	
c         C` s   d | j  | j | f } d } |  j d  } | d k r |  | d  } |  | d } t j d |  j d  }	 | r |	 | j d  d g }
 n g  }
 | |	 | |	 | d g |
 | g } d	 j |  }  n  |  S(
   s4   Expand docstring by adding disclaimer and extra texts+   This docstring was copied from %s.%s.%s. 

s5   Some inconsistencies with the Dask version may exist.s   

ii   s   \s*i    s   
R&   (   RR   RQ   t   findt   ret   matcht   groupt   rstripR   (   R   R   R   t   extrat   l1t   l2Ro   t   headt   tailt   indentt   moret   bits(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   ignore_warning  s    #c         C` s   |  j  d  } x | D]} } g  t |  D]2 \ } } t j d | d |  r) | | f ^ q) } t |  d k r | \ \ } } | d | | <q q Wd j |  S(   s.    Mark unsupported arguments with a disclaimer s   
s   ^\s*s    ?:i   s     (Not supported in Dask)(   R   Rh   R   R   Rc   R   (   R   R   R   R   Ro   R   t   subset(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   unsupported_arguments  s    Ec   
      C` s1  t  |  | j  } | j } | d k r0 d } n  | rT t | |  | j d | } n  | rt | | j d  d 7} n  yA t |  } t |  } g  | D] } | | k r | ^ q }	 Wn t k
 r g  }	 n Xt |  d k r |	 j	 |  n  t |	  d k rt
 | |	  } n  t |  } t |  } | S(   s2    Helper function for derived_from to ease testing R&   R   s   
s   

i    N(   t   getattrRQ   RS   R   R   R   R	   t
   ValueErrorRc   t   extendR   R   R   (
   R   t   methodt   ua_argsR   t   original_methodR   t   method_argst   original_argst   mt   not_supported(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   _derived_from  s*    		)
c         ` s       f d   } | S(   s  Decorator to attach original class's docstring to the wrapped method.

    The output structure will be: top line of docstring, disclaimer about this
    being auto-derived, any extra text associated with the method being patched,
    the body of the docstring and finally, the list of keywords that exist in
    the original method but not in the dask version.

    Parameters
    ----------
    original_klass: type
        Original class which the method is derived from
    version : str
        Original package version which supports the wrapped method
    ua_args : list
        List of keywords which Dask doesn't support. Keywords existing in
        original but not in Dask will automatically be added.
    c         ` s   y> t    d d   p d } t    d  d |   _   SWnL t k
 r  j j d  d  t j        f d    } | SXd  S(   NRS   R&   R   R   R'   i    c          ` sM   d j    j  }  d  k	 r= d } | | j     7} n  t |   d  S(   Ns#   Base package doesn't support '{0}'.s)    Use {0} {1} or later to use this method.(   R   RQ   R   t   NotImplementedError(   R   R   t   msgt   msg2(   R   t   module_namet   version(    s)   lib/python2.7/site-packages/dask/utils.pyt   wrappedA  s
    (	   R   R   R   RS   R?   RR   R   t	   functoolst   wraps(   R   R   R   (   t   original_klassR   R   (   R   R   s)   lib/python2.7/site-packages/dask/utils.pyR   6  s    $(    (   R   R   R   R   (    (   R   R   R   s)   lib/python2.7/site-packages/dask/utils.pyt   derived_from$  s    c         C` s   t  |  t j  r t |  j  St  |  t  r5 |  j St |  d d
  pJ d } t t	 |   d d
  ph d } d | k r d | k r |  j
 Sd | k r d | k r |  j Sy! |  j } | d k r d	 S| SWn t k
 r t |   SXd
 S(   s   Get the name of a function.RR   R&   RQ   t   toolzt   curryt   multipledispatcht
   Dispatchers   <lambda>t   lambdaN(   R   R   t   partialt   funcnameR   t   methodcallerR   R   R   R   t	   func_nameR   RQ   R?   t   str(   R   R   t	   type_nameR   (    (    s)   lib/python2.7/site-packages/dask/utils.pyR   L  s"    	c         C` s6   |  j  s |  j  d k r  |  j S|  j  d |  j Sd S(   s   
    Return the name of a type

    Examples
    --------
    >>> typename(int)
    'int'

    >>> from dask.core import literal
    >>> typename(literal)
    'dask.core.literal'
    t   builtinsR'   N(   RR   RQ   (   t   typ(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   typenamei  s    c         C` sF   t  |  t  r |  St |  d  r, |  j   Sd } t | |    d S(   s    Turn string or bytes to bytes

    >>> ensure_bytes(u'123')
    b'123'
    >>> ensure_bytes('123')
    b'123'
    >>> ensure_bytes(b'123')
    b'123'
    t   encodes<   Object %s is neither a bytes object nor has an encode methodN(   R   Rx   Rs   R   R   (   t   sR   (    (    s)   lib/python2.7/site-packages/dask/utils.pyt   ensure_bytes|  s    

c         C` sF   t  |  t  r |  St |  d  r, |  j   Sd } t | |    d S(   s    Turn string or bytes to bytes

    >>> ensure_unicode(u'123')
    '123'
    >>> ensure_unicode('123')
    '123'
    >>> ensure_unicode(b'123')
    '123'
    t   decodes<   Object %s is neither a bytes object nor has an encode methodN(   R   R   Rs   R   R   (   R   R   (    (    s)   lib/python2.7/site-packages/dask/utils.pyt   ensure_unicode  s    

c         C` s   |  | | | S(   s   

    >>> digit(1234, 0, 10)
    4
    >>> digit(1234, 1, 10)
    3
    >>> digit(1234, 2, 10)
    2
    >>> digit(1234, 3, 10)
    1
    (    (   R   t   kt   base(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   digit  s    c         C` s    t  |   } | | | <t |  S(   sB   

    >>> insert(('a', 'b', 'c'), 0, 'x')
    ('x', 'b', 'c')
    (   R   RZ   (   t   tupt   loct   valt   L(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   insert  s    
c         ` sY   d d  l  } t |   \   } | j    f d     t  f d     j   D  S(   Ni    c         ` s6     |  s d Sd t   f d     |  D  } | S(   Ni   c         3` s   |  ] }   |  Vq d  S(   N(    (   Rt   t   dep_key(   t   max_depth_by_deps(    s)   lib/python2.7/site-packages/dask/utils.pys	   <genexpr>  s    (   t   max(   RO   RW   (   t   depsR  (    s)   lib/python2.7/site-packages/dask/utils.pyR    s    
$c         3` s   |  ] }   |  Vq d  S(   N(    (   Rt   R  (   R  (    s)   lib/python2.7/site-packages/dask/utils.pys	   <genexpr>  s    (   R   R   t   memoizeR  t   keys(   t   dskR   R   (    (   R	  R  s)   lib/python2.7/site-packages/dask/utils.pyt   dependency_depth  s    c         C` sH   xA d d d d d g D]* } |  d k  r6 d |  | f S|  d }  q Wd  S(   NRx   t   KBt   MBt   GBt   TBg      @s   %3.1f %s(    (   t   numRm   (    (    s)   lib/python2.7/site-packages/dask/utils.pyt   memory_repr  s    c         ` s   g  | D] } t  d   | D  ^ q } t  d   |  D  }  t  d   t t |   |   D  } d d t |   |     t  |   } d d j d   | D  } d	 j   f d
   | D  } d	 j | | | | | g  S(   s   Formats an ascii table for given columns and rows.

    Parameters
    ----------
    columns : list
        The column names
    rows : list of tuples
        The rows in the table. Each tuple must be the same length as
        ``columns``.
    c         s` s   |  ] } t  |  Vq d  S(   N(   R   (   Rt   Ro   (    (    s)   lib/python2.7/site-packages/dask/utils.pys	   <genexpr>  s    c         s` s   |  ] } t  |  Vq d  S(   N(   R   (   Rt   Ro   (    (    s)   lib/python2.7/site-packages/dask/utils.pys	   <genexpr>  s    c         s` s9   |  ]/ \ } } t  t  t t |   t |   Vq d  S(   N(   R  R[   Rc   (   Rt   Rm   R   (    (    s)   lib/python2.7/site-packages/dask/utils.pys	   <genexpr>  s   t   |s	    %%-%ds |s   +%s+t   +c         s` s   |  ] } d  | d Vq d S(   R   i   N(    (   Rt   R<   (    (    s)   lib/python2.7/site-packages/dask/utils.pys	   <genexpr>  s    s   
c         3` s   |  ] }   | Vq d  S(   N(    (   Rt   t   r(   t   row_template(    s)   lib/python2.7/site-packages/dask/utils.pys	   <genexpr>  s    (   RZ   R   Rc   R   (   t   columnst   rowsR  t   widthst   headert   bart   data(    (   R  s)   lib/python2.7/site-packages/dask/utils.pyt
   asciitable  s    )	c         C` sR   t  d   | D  r8 g  | D] } t |  ^ q } n  |  j d j |   d  S(   Nc         s` s   |  ] } t  | t  Vq d  S(   N(   R   R   (   Rt   Rm   (    (    s)   lib/python2.7/site-packages/dask/utils.pys	   <genexpr>  s    s   
(   t   anyR   R>   R   (   t   bufR   Rm   (    (    s)   lib/python2.7/site-packages/dask/utils.pyt	   put_lines  s    "R   c           B` sM   e  Z d  Z d Z e d    Z d   Z d   Z d   Z d   Z	 e	 Z
 RS(   s   
    Return a callable object that calls the given method on its operand.

    Unlike the builtin `operator.methodcaller`, instances of this class are
    serializable
    R   c         C` s   |  j  S(   N(   R   (   RM   (    (    s)   lib/python2.7/site-packages/dask/utils.pyt   <lambda>  R&   c         C` s:   | t  k r t  | St j |   } | | _ | t  | <| S(   N(   t   _method_cacheR   t   __new__R   (   R   R   RM   (    (    s)   lib/python2.7/site-packages/dask/utils.pyR$    s    	
c         O` s   t  | |  j  | |   S(   N(   R   R   (   RM   t   objR   R   (    (    s)   lib/python2.7/site-packages/dask/utils.pyR     s    c         C` s   t  |  j f f S(   N(   R   R   (   RM   (    (    s)   lib/python2.7/site-packages/dask/utils.pyt
   __reduce__  s    c         C` s   d |  j  j |  j f S(   Ns   <%s: %s>(   t	   __class__RQ   R   (   RM   (    (    s)   lib/python2.7/site-packages/dask/utils.pyt   __str__	  s    (   R   (   RQ   RR   RS   RT   R   R   R$  R   R&  R(  t   __repr__(    (    (    s)   lib/python2.7/site-packages/dask/utils.pyR     s   				t
   itemgetterc           B` s8   e  Z d  Z d Z d   Z d   Z d   Z d   Z RS(   s   
    Return a callable object that gets an item from the operand

    Unlike the builtin `operator.itemgetter`, instances of this class are
    serializable
    t   indexc         C` s   | |  _  d  S(   N(   R+  (   RM   R+  (    (    s)   lib/python2.7/site-packages/dask/utils.pyRN     s    c         C` s   | |  j  S(   N(   R+  (   RM   Rm   (    (    s)   lib/python2.7/site-packages/dask/utils.pyR     s    c         C` s   t  |  j f f S(   N(   R*  R+  (   RM   (    (    s)   lib/python2.7/site-packages/dask/utils.pyR&    s    c         C` s(   t  |   t  |  k o' |  j | j k S(   N(   R   R+  (   RM   t   other(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   __eq__!  s    (   R+  (   RQ   RR   RS   RT   RN   R   R&  R-  (    (    (    s)   lib/python2.7/site-packages/dask/utils.pyR*    s   			t   MethodCachec           B` s#   e  Z d  Z e e  Z d   Z RS(   s   Attribute access on this object returns a methodcaller for that
    attribute.

    Examples
    --------
    >>> a = [1, 3, 3]
    >>> M.count(a, 3) == a.count(3)
    True
    c         C` s
   t  t  S(   N(   R   R#  (   RM   (    (    s)   lib/python2.7/site-packages/dask/utils.pyR"  0  R&   (   RQ   RR   RS   t   staticmethodR   t   __getattr__t   __dir__(    (    (    s)   lib/python2.7/site-packages/dask/utils.pyR.  %  s   	t   SerializableLockc           B` sk   e  Z e   Z d	 d   Z d   Z d   Z d   Z d   Z	 d   Z
 d   Z d   Z d   Z e Z RS(
   c         C` sf   | p t  t j    |  _ |  j t j k rC t j |  j |  _ n t   |  _ |  j t j |  j <d  S(   N(   R   t   uuidt   uuid4t   tokenR2  t   _lockst   lockR   (   RM   R5  (    (    s)   lib/python2.7/site-packages/dask/utils.pyRN   R  s
    c         O` s   |  j  j | |   S(   N(   R7  t   acquire(   RM   R   R   (    (    s)   lib/python2.7/site-packages/dask/utils.pyR8  Z  s    c         O` s   |  j  j | |   S(   N(   R7  t   release(   RM   R   R   (    (    s)   lib/python2.7/site-packages/dask/utils.pyR9  ]  s    c         C` s   |  j  j   d  S(   N(   R7  t	   __enter__(   RM   (    (    s)   lib/python2.7/site-packages/dask/utils.pyR:  `  s    c         G` s   |  j  j |   d  S(   N(   R7  t   __exit__(   RM   R   (    (    s)   lib/python2.7/site-packages/dask/utils.pyR;  c  s    c         C` s   |  j  j   S(   N(   R7  t   locked(   RM   (    (    s)   lib/python2.7/site-packages/dask/utils.pyR<  f  s    c         C` s   |  j  S(   N(   R5  (   RM   (    (    s)   lib/python2.7/site-packages/dask/utils.pyt   __getstate__i  s    c         C` s   |  j  |  d  S(   N(   RN   (   RM   R5  (    (    s)   lib/python2.7/site-packages/dask/utils.pyt   __setstate__l  s    c         C` s   d |  j  j |  j f S(   Ns   <%s: %s>(   R'  RQ   R5  (   RM   (    (    s)   lib/python2.7/site-packages/dask/utils.pyR(  o  s    N(   RQ   RR   R   R6  R   RN   R8  R9  R:  R;  R<  R=  R>  R(  R)  (    (    (    s)   lib/python2.7/site-packages/dask/utils.pyR2  6  s   									c         C` sd   d d l  m } d d l m } | d |  g d |  } | | j k r] | j   j   j   St   S(   s_   Get an instance of the appropriate lock for a certain situation based on
       scheduler used.i   (   t   multiprocessing(   t   get_schedulert   collectionst	   scheduler(	   R&   R?  R   R@  t   gett   get_contextt   ManagerR   R2  (   t
   collectionRB  R?  R@  t
   actual_get(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   get_scheduler_locku  s    	c         C` s`   t  |   t k r |  St |  d  rV i  } x$ |  j j   D] } | j |  q; W| St |   S(   Nt   dicts(   R   t   dictRs   RI  t   valuest   update(   RW   t   resultt   dd(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   ensure_dict  s    t   OperatorMethodMixinc           B` s>   e  Z d  Z e d    Z e d    Z e e d   Z RS(   s.   A mixin for dynamically implementing operatorsc         C` s   | j  } | j d  r% | d  } n | d k r: d } n  d j |  } | d k rq t |  | |  j |   nW t |  | |  j |   | d k r d Sd j |  } t |  | |  j | d t  d S(   s    bind operator to this class R   it   invt   inverts   __{0}__t   abst   negt   post   eqt   gtt   get   ltt   let   net   getitemNs   __r{0}__(   RS  RR  RT  RU  (   RV  RW  RX  RY  RZ  R[  R\  (   RQ   t   endswithR   R   t   _get_unary_operatort   _get_binary_operatorR   (   R   t   opR   R   t   rmeth(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   _bind_operator  s    		c         C` s
   t   d S(   s-    Must return a method used by unary operator N(   R   (   R   R`  (    (    s)   lib/python2.7/site-packages/dask/utils.pyR^    s    c         C` s
   t   d S(   s.    Must return a method used by binary operator N(   R   (   R   R`  RQ  (    (    s)   lib/python2.7/site-packages/dask/utils.pyR_    s    (   RQ   RR   RS   t   classmethodRb  R^  R   R_  (    (    (    s)   lib/python2.7/site-packages/dask/utils.pyRP    s
   c          O` s^   | j  d  } | j  d  } t |   } x$ | D] \ } } | j | |  q1 W| | |   S(   si   

    >>> from operator import add
    >>> partial_by_order(5, function=add, other=[(1, 10)])
    15
    t   functionR,  (   R   R   R  (   R   R   Rd  R,  t   args2Ro   R   (    (    s)   lib/python2.7/site-packages/dask/utils.pyt   partial_by_order  s    c         ` sU   d d l  m   t |  d  oT |  j oT t |  d  oT t   f d   |  j D  S(   s    Is this object a numpy array or something similar?

    Examples
    --------
    >>> import numpy as np
    >>> x = np.ones(5)
    >>> is_arraylike(x)
    True
    >>> is_arraylike(5)
    False
    >>> is_arraylike('cat')
    False
    i   (   t   is_dask_collectiont   shapeR]   c         3` s   |  ] }   |  Vq d  S(   N(    (   Rt   R   (   Rg  (    s)   lib/python2.7/site-packages/dask/utils.pys	   <genexpr>  s    (   R   Rg  Rs   Rh  R  (   Rm   (    (   Rg  s)   lib/python2.7/site-packages/dask/utils.pyt   is_arraylike  s    c         C` s;   g  t  j d |   D]$ } | j   r1 t |  n | ^ q S(   s  
    Sorting `key` function for performing a natural sort on a collection of
    strings

    See https://en.wikipedia.org/wiki/Natural_sort_order

    Parameters
    ----------
    s : str
        A string that is an element of the collection being sorted

    Returns
    -------
    tuple[str or int]
        Tuple of the parts of the input string where each part is either a
        string or an integer

    Examples
    --------
    >>> a = ['f0', 'f1', 'f2', 'f8', 'f9', 'f10', 'f11', 'f19', 'f20', 'f21']
    >>> sorted(a)
    ['f0', 'f1', 'f10', 'f11', 'f19', 'f2', 'f20', 'f21', 'f8', 'f9']
    >>> sorted(a, key=natural_sort_key)
    ['f0', 'f1', 'f2', 'f8', 'f9', 'f10', 'f11', 'f19', 'f20', 'f21']
    s   (\d+)(   R   R   t   isdigitt   int(   R   t   part(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   natural_sort_key  s    c         ` sK     f d   t  d t t   d  d   D } t t j t j |   S(   sV    Return the factors of an integer

    https://stackoverflow.com/a/6800214/616616
    c         3` s/   |  ]% }   | d  k r |   | g Vq d S(   i    N(    (   Rt   Ro   (   R   (    s)   lib/python2.7/site-packages/dask/utils.pys	   <genexpr>  s    i   g      ?(   R   Rk  t   powR   R   t   reduceR   t   __add__(   R   R   (    (   R   s)   lib/python2.7/site-packages/dask/utils.pyt   factors  s    2c         C` s  |  j  d d  }  |  d j   s/ d |  }  n  x8 t t |   d d d  D] } |  | j   sL PqL qL W| d } |  |  } |  | } y t |  } Wn! t k
 r t d |   n Xy t | j   } Wn! t	 k
 r t d |   n X| | } t
 |  S(	   s   Parse byte string to numbers

    >>> parse_bytes('100')
    100
    >>> parse_bytes('100 MB')
    100000000
    >>> parse_bytes('100M')
    100000000
    >>> parse_bytes('5kB')
    5000
    >>> parse_bytes('5.4 kB')
    5400
    >>> parse_bytes('1kiB')
    1024
    >>> parse_bytes('1e6')
    1000000
    >>> parse_bytes('1e6 kB')
    1000000000
    >>> parse_bytes('MB')
    1000000
    >>> parse_bytes('5 foos')  # doctest: +SKIP
    ValueError: Could not interpret 'foos' as a byte unit
    t    R&   i    t   1i   is$   Could not interpret '%s' as a numbers'   Could not interpret '%s' as a byte unit(   R   Rj  R   Rc   t   isalphaR   R   t
   byte_sizest   lowerR   Rk  (   R   Ro   R+  t   prefixt   suffixR   t
   multiplierRM  (    (    s)   lib/python2.7/site-packages/dask/utils.pyt   parse_bytes  s&    #



i
   i   t   kBi   R  i	   R  i   R  i   t   PBi   t   KiBi   t   MiBi   t   GiBi(   t   TiBi2   t   PiBt   Bc         C` s%   i  |  ] \ } } | | j     q S(    (   Rv  (   Rt   R   t   v(    (    s)   lib/python2.7/site-packages/dask/utils.pys
   <dictcomp>A  s   	 c         C` s5   i  |  ]+ \ } } | r d  | k r | | d  q S(   Ro   i    (    (   Rt   R   R  (    (    s)   lib/python2.7/site-packages/dask/utils.pys
   <dictcomp>B  s   	 c         C` s5   i  |  ]+ \ } } | r d  | k r | | d   q S(   Ro   i(    (   Rt   R   R  (    (    s)   lib/python2.7/site-packages/dask/utils.pys
   <dictcomp>C  s   	 c         C` sz   ya t  r | t j |   j k St |  t j  rJ | t j |  j  j	 k S| t j |   j	 k SWn t
 k
 ru t SXd  S(   N(   R   R   t	   signaturet
   parametersR   R   R   R
   R   R   R   R   (   R   t   keyword(    (    s)   lib/python2.7/site-packages/dask/utils.pyt   has_keywordF  s    c         C` s9   t  |  t t f  s d S|  s# d Sd t |  d  Sd  S(   Ni    i   (   R   R   RZ   t   ndimlist(   R   (    (    s)   lib/python2.7/site-packages/dask/utils.pyR  S  s
    i  i@B i ʚ;I    I Ƥ~ i   i   i   @I       I       (   t
   __future__R    R   R   R   R   R,   R2   t   sysR*   R   R   R   t
   contextlibR   t	   importlibR   t   numbersR   t	   threadingR   R3  t   weakrefR   t   compatibilityR	   R
   R   R   R   R   t   coreR   t   optimizationR   t   getdefaultencodingt   system_encodingR   R   R   R    R%   R   R8   R;   RA   RC   RH   RI   RJ   R   RK   R   RY   R\   Rr   R   R   R   RS  Rz   R  t   boolt	   bytearrayRx   t   callablet   chrRc  t   complexRJ  R(   Rh   t   evalR   R   t	   frozensett   hasht   hext   idRk  t   iterRc   R   R  t   mint   nextt   octt   ordR   t   reprt   reversedt   roundt   sliceR   R/  R   t   sumRZ   R   t   varsR   t
   memoryviewR   R   R   t   compilet   delattrt   divmodt   filterR   Rs   R   t
   issubclassR[   Rn  t   setattrR   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   MR2  RH  RO  RP  Rf  Ri  Rm  Rq  Rz  Ru  R   RL  R  R  (    (    (    s)   lib/python2.7/site-packages/dask/utils.pyt   <module>   s   .					
!		/I					!(											?	&						2
	