ó
ÅfERc           @   sÃ  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 „ Z d a	 d a
 d d d „ Z d dG d „  ƒ  YZ d dH d	 „  ƒ  YZ d
 a d
 a d
 d „ Z d „  Z d „  Z d e f d „  ƒ  YZ e Z d e f d „  ƒ  YZ d dI d „  ƒ  YZ d dJ d „  ƒ  YZ d e f d „  ƒ  YZ d dK d „  ƒ  YZ d
 d „ Z d
 d d „ Z d „  Z d „  Z e d k r¿e e  j  ƒ d  k r-e  j  d d! k r-e dL dM dN f dO dP dQ ƒ e dR dS dT f dU dV dW ƒ e dX dY dZ f d[ d\ d] ƒ e d^ d_ d` f da db dc ƒ e  j! d
 ƒ n  e e  j  ƒ d  k rbe  j  d d1 k rbe dl ƒ n  e d" d d. d
 d# dm dn do ƒ e d$ d  d. d
 d' dp dq dr ds ƒ	 e d& d3 d. d% d' dt du dv dw ƒ	 e d4 d5 d. d
 d2 dx dy dz ƒ e d6 d7 d. d8 d2 d{ d| d} ƒ e d9 d: d. d; d2 d~ d d€ ƒ e d< d= d. d
 d' d ƒ e d> d? d. d@ d' d‚ ƒ e dA dB d. dC d' dƒ ƒ e dD d. d. d
 d2 d„ d… d† d‡ dˆ d‰ dŠ d‹ dŒ d dŽ d d d‘ d’ d“ d” d• d– ƒ n  d S(—   iÿÿÿÿNi   c         C   s[   yL d } t  j |  t j | ƒ } t j d | ƒ d } | d k rG d S| SWn d SXd S(   s    Get the real terminal width t   abcdefght   hhhhi   i    iP   N(   t   fcntlt   ioctlt   termiost
   TIOCGWINSZt   structt   unpack(   t   fdt   buft   ret(    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt   terminal_width   s    g      ð?c         C   sA   t  j  ƒ  } t d k s( | t | k r= t |  ƒ a | a n  t S(   s6    Get the real terminal width, but cache it for a bit. N(   t   timet   _term_width_valt   Nonet   _term_width_lastR   (   R   t   cache_timeoutt   now(    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt   terminal_width_cached-   s
    	t   TerminalLinec           B   sM   e  Z d  Z d d
 d d d „ Z d „  Z d d „ Z d
 d „ Z d	 „  Z RS(   sB    Help create dynamic progress bars, uses terminal_width_cached(). i    i   g      ð?c         C   sX   | d  k r | } n  | |  _ t | | ƒ |  _ |  j | k  rK | |  _ n  t |  _ d  S(   N(   R   t   _min_lenR   t   _llent   Falset   _fin(   t   selft   min_restt   beg_lenR   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt   __init__;   s    		c         C   s   |  j  |  j S(   s    Usable length for elements. (   R   R   (   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt   __len__D   s    i   c         C   s"   |  j  | k  r d S|  j  | | S(   sw    After a fixed length, split the rest of the line length among
            a number of different elements (default=2). i    (   R   (   R   t   fixedt   elements(    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt
   rest_splitH   s    c         C   s_   | d k r t | ƒ } n  t |  ƒ | k  r9 t |  _ n  |  j rF d S|  j t | ƒ 8_ | S(   s‹    If there is room left in the line, above min_len, add element.
            Note that as soon as one add fails all the rest will fail too. t    N(   R   t   lent   TrueR   R   (   R   t   elementt   full_len(    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt   addO   s    	c         C   s   |  j  S(   sA    Current rest of line, same as .rest_split(fixed=0, elements=1). (   R   (   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt   rest]   s    N(	   t   __name__t
   __module__t   __doc__R   R   R   R   R%   R&   (    (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR   8   s   		t	   BaseMeterc           B   sh   e  Z d  „  Z d d d d d d d „ Z d d „ Z d d „ Z d d „ Z d d „ Z d d „ Z	 RS(   c         C   sa   d |  _  d  |  _ d  |  _ d  |  _ d  |  _ d  |  _ d  |  _ d |  _ d  |  _	 t
 ƒ  |  _ d  S(   Ng333333Ó?i    (   t   update_periodR   t   filenamet   urlt   basenamet   textt   sizet
   start_timet   last_amount_readt   last_update_timet   RateEstimatort   re(   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR   b   s    									c         C   s©   | |  _  | |  _ | |  _ | |  _ | |  _ | d  k	 rO t | ƒ d |  _ n  | d  k rj t j ƒ  } n  | |  _	 |  j
 j | | ƒ d |  _ | |  _ |  j | ƒ d  S(   Nt   Bi    (   R,   R-   R.   R/   R0   R   t   format_numbert   fsizeR   R1   R5   t   startR2   R3   t	   _do_start(   R   R,   R-   R.   R0   R   R/   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR9   o   s    					  			c         C   s   d  S(   N(    (   R   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR:      s    c         C   sw   | d  k r t j ƒ  } n  |  j s; | |  j |  j k rs |  j j | | ƒ | |  _ | |  _ |  j | | ƒ n  d  S(   N(   R   R   R3   R+   R5   t   updateR2   t
   _do_update(   R   t   amount_readR   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR;   „   s     
		c         C   s   d  S(   N(    (   R   R=   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR<      s    c         C   sT   | d  k r t j ƒ  } n  |  j j | | ƒ | |  _ | |  _ |  j | | ƒ d  S(   N(   R   R   R5   R;   R2   R3   t   _do_end(   R   R=   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt   end’   s     		c         C   s   d  S(   N(    (   R   R=   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR>   ™   s    N(
   R'   R(   R   R   R9   R:   R;   R<   R?   R>   (    (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR*   a   s   		i    c         C   s   |  a  | a d  S(   N(   t   _text_meter_total_sizet   _text_meter_sofar_size(   R0   t
   downloaded(    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt   text_meter_total_size¡   s    c         C   s_   | } d t  | | ƒ } | | t  | | ƒ d k rE | d 7} n  |  j d | | | f ƒ S(   Nt   =g      à?t   -s	    [%-*.*s](   t   intR%   (   t   tlt   bar_max_lengtht   pct   blent   bar(    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt   _term_add_barÖ   s
    c         C   sZ   | rG | | k r% |  j  d ƒ t f S| | k rG |  j  d ƒ t f Sn  |  j  d ƒ t f S(   Ns    !!! s    ... t    i   s        (   R%   R"   R   (   RG   t   osizeR0   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt   _term_add_endÝ   s    t	   TextMeterc           B   s/   e  Z e j d  „ Z d d „ Z d d „ Z RS(   c         C   s   t  j |  ƒ | |  _ d  S(   N(   R*   R   t   fo(   R   RQ   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR   æ   s    c         C   s]  |  j  j ƒ  } t | ƒ } |  j d  k	 r6 |  j } n	 |  j } t |  j  j ƒ  ƒ } d  } t r{ t | } | d t } n  t	 d d ƒ }	 |	 j
 d k r¢ t }
 n t }
 |	 j d | ƒ } |  j d  k r6|	 j d t | |
 ƒ ƒ } |	 j d ƒ } |	 j d	 | ƒ } d
 |	 j ƒ  |	 j ƒ  | | | | | f } n|  j  j ƒ  } t | |
 ƒ } |  j  j ƒ  } |	 j d | ƒ } |	 j d ƒ } | d  k ršd } n |	 j d | d t d ƒ ƒ} |	 j d | d ƒ } |	 j d	 | ƒ } d |	 j d ƒ } t |	 | | ƒ } d |	 j ƒ  |	 j ƒ  | | | | | | | | f
 } |  j j | ƒ |  j j ƒ  d  S(   Nid   i   i   iP   s    | %5sBs    %9sRM   i   s    %5sB/ss   %-*.*s%s%s%s%ss    ETA R    s    (%i%%)R$   s    (100%)s    %2i%%i   s   %-*.*s%s%s%s%s%s%s%si	   i   s        i   i   (   R5   t   elapsed_timeR7   R/   R   R.   t   average_rateR@   RA   R   R   R"   R   R%   R0   t   format_timeR&   t   remaining_timet   fraction_readR!   R   RL   RQ   t   writet   flush(   R   R=   R   t   etimet   freadR/   t   ave_dlt
   sofar_sizet   sofar_pcRG   t	   use_hourst   ui_sizet   ui_timet   ui_endt   ui_ratet   outt   rtimet   frtimet   fract   ui_sofar_pct   ui_pcRJ   t   ui_bar(    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR<   ê   sN    	
			c         C   s.  t  | ƒ } |  j d  k	 r' |  j } n	 |  j } t d ƒ } | j d k rT t } n t } | j d | ƒ } | j d t	 |  j
 j ƒ  | ƒ ƒ } t | |  j | ƒ \ }	 }
 d | j ƒ  | j ƒ  | | | |	 f } |  j j | ƒ |  j j ƒ  |
 rü d  St rt | 7a n  t t k r*d a d a n  d  S(   Ni   iP   s    | %5sBs    %9ss   %-*.*s%s%s%s
i    (   R7   R/   R   R.   R   R   R"   R   R%   RT   R5   RR   RO   R0   R&   RQ   RW   RX   R@   RA   (   R   R=   R   t
   total_sizeR/   RG   R^   R_   R`   Ra   t   not_doneRc   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR>      s,    		%N(   R'   R(   t   syst   stderrR   R   R<   R>   (    (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyRP   å   s   6t   MultiFileHelperc           B   sA   e  Z d  „  Z d „  Z d „  Z d „  Z d d „ Z d „  Z RS(   c         C   s   t  j |  ƒ | |  _ d  S(   N(   R*   R   t   master(   R   Ro   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR   E  s    c         C   s   |  j  j |  | ƒ d  S(   N(   Ro   t   start_meter(   R   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR:   I  s    c         C   s   |  j  j |  | ƒ d  S(   N(   Ro   t   update_meter(   R   R=   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR<   L  s    c         C   s?   t  | |  j ƒ |  _ t |  j ƒ |  _ |  j j |  | ƒ d  S(   N(   RT   R1   t   ftotal_timeR7   R2   t   ftotal_sizeRo   t	   end_meter(   R   R=   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR>   P  s    c         C   s   |  j  j |  | | ƒ d  S(   N(   Ro   t   failure_meter(   R   t   messageR   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt   failureU  s    c         C   s   |  j  j |  | ƒ d  S(   N(   Ro   t   message_meter(   R   Rv   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyRv   X  s    N(	   R'   R(   R   R:   R<   R>   R   Rw   Rv   (    (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyRn   D  s   				t	   _FakeLockc           B   s   e  Z d  „  Z d „  Z RS(   c         C   s   d  S(   N(    (   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt   acquire\  s    c         C   s   d  S(   N(    (   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt   release^  s    (   R'   R(   Rz   R{   (    (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyRy   [  s   	t   MultiFileMeterc           B   sÈ   e  Z e Z e d  „ Z d d d d „ Z d „  Z d d „ Z	 d „  Z
 d „  Z d „  Z d „  Z d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   s    g  |  _  g  |  _ | r* t j ƒ  |  _ n t ƒ  |  _ d |  _ d  |  _ d |  _	 d |  _
 d |  _ d  |  _ d |  _ d  |  _ d |  _ d  |  _ t ƒ  |  _ d  S(   Ng333333Ó?i    (   t   meterst   in_progress_meterst   threadt   allocate_lockt   _lockRy   R+   R   t   numfilest   finished_filest   failed_filest
   open_filesRj   t   failed_sizeR1   t   finished_file_sizeR3   R4   R5   (   R   t   threaded(    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR   c  s     												c         C   s   | d  k r t j ƒ  } n  | |  _ d |  _ d |  _ d |  _ | |  _ d |  _ | |  _ d |  _	 | |  _
 |  j j | | ƒ |  j | ƒ d  S(   Ni    (   R   R   R‚   Rƒ   R„   R…   Rj   R†   R1   R‡   R3   R5   R9   R:   (   R   R‚   Rj   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR9   w  s     									c         C   s   d  S(   N(    (   R   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR:   …  s    c         C   sE   | d  k r t j ƒ  } n  |  j j |  j ƒ  | ƒ |  j | ƒ d  S(   N(   R   R   R5   R;   t   _amount_readR>   (   R   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR?   ˆ  s     c         C   s   d  S(   N(    (   R   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR>     s    c         C   s   |  j  j ƒ  d  S(   N(   R   Rz   (   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt   lock  s    c         C   s   |  j  j ƒ  d  S(   N(   R   R{   (   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt   unlock‘  s    c         C   s#   |  j  |  ƒ } |  j j | ƒ | S(   N(   t   helperclassR}   t   append(   R   t   newmeter(    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt   newMeter•  s    c         C   s   |  j  j | ƒ d  S(   N(   R}   t   remove(   R   t   meter(    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt   removeMeterš  s    c         C   s…   | |  j  k r t d ƒ ‚ n  |  j j ƒ  z5 | |  j k r_ |  j j | ƒ |  j d 7_ n  Wd  |  j j ƒ  X|  j | | ƒ d  S(   Ns   attempt to use orphaned meteri   (	   R}   t
   ValueErrorR   Rz   R~   R   R…   R{   t   _do_start_meter(   R   R‘   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyRp   Ÿ  s    c         C   s   d  S(   N(    (   R   R‘   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR”   «  s    c         C   sw   | |  j  k r t d ƒ ‚ n  |  j s> | |  j |  j k rs |  j j |  j ƒ  | ƒ | |  _ |  j | | ƒ n  d  S(   Ns   attempt to use orphaned meter(   R}   R“   R3   R+   R5   R;   R‰   t   _do_update_meter(   R   R‘   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyRq   ®  s    
	c         C   s   d  S(   N(    (   R   R‘   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR•   ·  s    c         C   s¬   | |  j  k r t d ƒ ‚ n  |  j j ƒ  z\ y |  j j | ƒ Wn t k
 rU n X|  j d 8_ |  j d 7_ |  j | j	 7_ Wd  |  j j
 ƒ  X|  j | | ƒ d  S(   Ns   attempt to use orphaned meteri   (   R}   R“   R   Rz   R~   R   R…   Rƒ   R‡   R2   R{   t   _do_end_meter(   R   R‘   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyRt   º  s      c         C   s   d  S(   N(    (   R   R‘   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR–   È  s    c         C   sÓ   | |  j  k r t d ƒ ‚ n  |  j j ƒ  z€ y |  j j | ƒ Wn t k
 rU n X|  j d 8_ |  j d 7_ | j r¡ |  j	 d  k	 r¡ |  j	 | j 7_	 n	 d  |  _	 Wd  |  j j ƒ  X|  j | | | ƒ d  S(   Ns   attempt to use orphaned meteri   (   R}   R“   R   Rz   R~   R   R…   R„   R0   R†   R   R{   t   _do_failure_meter(   R   R‘   Rv   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyRu   Ë  s      c         C   s   d  S(   N(    (   R   R‘   Rv   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR—   Ü  s    c         C   s   d  S(   N(    (   R   R‘   Rv   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyRx   ß  s    c         C   s.   |  j  } x |  j D] } | | j 7} q W| S(   N(   R‡   R~   R2   (   R   t   tott   m(    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR‰   ä  s    	N(   R'   R(   Rn   RŒ   R"   R   R   R9   R:   R?   R>   RŠ   R‹   R   R’   Rp   R”   Rq   R•   Rt   R–   Ru   R—   Rx   R‰   (    (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR|   a  s(   																t   TextMultiFileMeterc           B   s>   e  Z e j e d  „ Z d „  Z d „  Z d „  Z d „  Z	 RS(   c         C   s-   | |  _  t j |  | ƒ d |  _ |  _ d  S(   Ni    (   RQ   R|   R   t
   index_timet   index(   R   RQ   Rˆ   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR   ì  s    	c         C   s  |  j  j ƒ  zê|  j } |  j p% d } |  j j } |  j j } d |  j j ƒ  pU d d } |  j j ƒ  } |  j j	 ƒ  }	 |  j j ƒ  p d }
 d |
 } t
 |  j j ƒ  ƒ } | |  j k rÝ | d |  _ |  j d 7_ n  |  j t |  j ƒ k rd |  _ n  |  j |  j } | j p | j } | d k rPd | d |  j | | f } n  t d d ƒ } | j d k r}t } d	 } n t } d
 } | j d t
 | ƒ ƒ } |  j j s | j d | t | | ƒ f ƒ } | j d ƒ } | j d | ƒ } d | j ƒ  | j ƒ  | | | | | f } n¹ | j d | t |	 | ƒ f ƒ } | j d ƒ } | j d | d t d ƒ ƒ} | j d | ƒ } d | j d ƒ } t | | |
 ƒ } d | j ƒ  | j ƒ  | | | | | | | f	 } |  j j | ƒ |  j j ƒ  Wd  |  j  j ƒ  Xd  S(   Ni   id   i    g\Âõ(\ß?g      ð?s   (%u/%u): %si   iP   i	   i   s    | %5sBs    %*sRM   i   s    %5sB/ss   %-*.*s%s%s%s%ss    ETA s    %i%%R$   s    (100%)i   s   %-*.*s%s%s%s%s%s%si	   i   s        i   i   (   R   Rz   Rƒ   R‚   R5   R2   t   totalRV   RR   RU   R7   RS   R›   Rœ   R!   R}   R/   R.   R   R   R"   R   R%   RT   R&   R   RL   RQ   RW   RX   R{   (   R   R‘   R   t   dft   tft   ddt   tdt   pdt   dtt   rtRf   t   pfR[   R/   RG   R^   t   time_lenR_   R`   Ra   Rb   Rc   Rg   RJ   Ri   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR•      s`    	
!	""	
c         C   s–  |  j  j ƒ  ztd } | j p% | j } | j } t | ƒ d } | j j ƒ  } t | o` | | ƒ d } |  j }	 |  j	 p d }
 t | ƒ } | j p | j } |
 d k rÂ d |	 |
 | f } n  t
 d ƒ } | j d k rì t } d } n t } d	 } | j d
 | ƒ } | j d | t | | ƒ f ƒ } t | | j | ƒ \ } } d | j ƒ  | j ƒ  | | | | f } |  j j | ƒ Wd  |  j  j ƒ  Xd  S(   Ns    %-30.30s %6.6s    %8.8s    %9.9sR6   s   B/si   s   (%u/%u): %si   iP   i	   i   s    | %5sBs    %*ss   %-*.*s%s%s%s
(   R   Rz   R/   R.   R2   R7   R5   RR   Rƒ   R‚   R   R   R"   R   R%   RT   RO   R0   R&   RQ   RW   R{   (   R   R‘   R   t   formatt   fnR0   R8   t   ett   frateRž   RŸ   Rj   R/   RG   R^   R¦   R_   R`   Ra   Rk   Rc   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR–   A  s6    			"c         C   sù   |  j  j ƒ  zÔ d } | j p% | j } t | ƒ t d ƒ t d ƒ f k r[ | j ƒ  } n  | sm d g } n  d | | d | d p† d f } |  j j d | d ƒ x* | d	 D] } |  j j d
 | d ƒ q± W|  j  j ƒ  Wd  |  j	 | | ƒ Xd  S(   Ns   %-30.30s %6.6s %sR    u    s   %-79st   FAILEDi    s   s   
i   s     (
   R   Rz   R/   R.   t   typet
   splitlinesRQ   RW   R{   R•   (   R   R‘   Rv   R   R§   R¨   Rc   R™   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR—   b  s    $ ! c         C   s&   |  j  j ƒ  z Wd  |  j  j ƒ  Xd  S(   N(   R   Rz   R{   (   R   R‘   Rv   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyRx   q  s    (
   R'   R(   Rl   Rm   R"   R   R•   R–   R—   Rx   (    (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyRš   ë  s
   	A	!	R4   c           B   sq   e  Z d  d „ Z d d d „ Z d d „ Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z d
 d „ Z RS(   g      @c         C   s   | |  _  d  S(   N(   t	   timescale(   R   R®   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR   |  s    c         C   sL   | d  k r t j ƒ  } n  | |  _ | |  _ | |  _ d |  _ d  |  _ d  S(   Ni    (   R   R   R   R1   R3   R2   t   ave_rate(   R   R   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR9     s     				c         C   s²   | d  k r t j ƒ  } n  | d k s6 | |  j k  rU | |  _ | |  _ d  |  _ d  S| |  j } | |  j } |  j r¥ | |  _ |  j | | |  j |  j ƒ |  _ n  | |  _ d  S(   Ni    (   R   R   R2   R3   R¯   t   _temporal_rolling_aveR®   (   R   R=   R   t	   time_difft	   read_diff(    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR;   ‡  s     					c         C   s   |  j  S(   s/   get the average transfer rate (in bytes/second)(   R¯   (   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyRS   ¡  s    c         C   s   |  j  |  j S(   sE   the time between the start of the transfer and the most recent update(   R3   R1   (   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyRR   ¥  s    c         C   s-   |  j  s |  j r d S|  j |  j |  j  S(   s   estimated time remainingN(   R¯   R   R   R2   (   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyRU   ©  s     c         C   s>   |  j  d k r d S|  j  d k r& d St |  j ƒ |  j  Sd S(   s[   the fraction of the data that has been read
        (can be None for unknown transfer size)i    g      ð?N(   R   R   t   floatR2   (   R   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyRV   ®  s
      c         C   s5   | | } | d k r d } n  |  j  | | | | ƒ S(   sq  a temporal rolling average performs smooth averaging even when
        updates come at irregular intervals.  This is performed by scaling
        the "epsilon" according to the time since the last update.
        Specifically, epsilon = time_diff / timescale

        As a general rule, the average will take on a completely new value
        after 'timescale' seconds.i   g      ð?(   t   _rolling_ave(   R   R±   R²   t   last_aveR®   t   epsilon(    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR°   ·  s    
 	c         C   s\   y | | } Wn t  k
 r' d } n X| d k r8 | S| d k rH | S| | d | | S(   sK  perform a "rolling average" iteration
        a rolling average "folds" new data into an existing average with
        some weight, epsilon.  epsilon must be between 0.0 and 1.0 (inclusive)
        a value of 0.0 means only the old value (initial value) counts,
        and a value of 1.0 means only the newest value is considered.i   N(   t   ZeroDivisionErrorR   (   R   R±   R²   Rµ   R¶   t   recent_rate(    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR´   Ã  s    
  g      .@c         C   sj   | d k  r d St  t j | | ƒ t j d ƒ ƒ } t  | ƒ } | d k rR | St t  | ƒ | ?| >ƒ S(   s—  round the remaining time, depending on its size
        If rt is between n*start_time and (n+1)*start_time round downward
        to the nearest multiple of n (for any counting number n).
        If rt < start_time, round down to the nearest 1.
        For example (for start_time = 15.0):
         2.7  -> 2.0
         25.2 -> 25.0
         26.4 -> 26.0
         35.3 -> 34.0
         63.6 -> 60.0
        i    g        i   (   RF   t   matht   logR³   (   R   R¤   R1   t   shift(    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt   _round_remaining_timeÔ  s     & N(   R'   R(   R   R   R9   R;   RS   RR   RU   RV   R°   R´   R¼   (    (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR4   {  s   							c         C   sœ   |  d  k s |  d k  r) | r" d Sd Sno |  t d ƒ k r? d St |  ƒ }  |  d } |  d }  | rŠ | d } | d } d | | |  f Sd | |  f Sd  S(	   Ni    s   --:--:--s   --:--t   inft   Infinitei<   s   %02i:%02i:%02is	   %02i:%02i(   R   R³   RF   (   t   secondsR^   t   minutest   hours(    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyRT   è  s     



RM   c   	   	   C   sú   d d d d d d d d d	 g	 } | r0 d
 } n d } d } d } t  | ƒ d } x0 |  | k r„ | | k  r„ | d } |  | }  qU Wt |  ƒ t d ƒ k sµ t |  ƒ t d ƒ k r¾ d } n |  d k  rÓ d } n d } | t |  pè d ƒ | | | f S(   s4   Turn numbers into human-readable metric-like numbersR    t   kt   Mt   Gt   Tt   Pt   Et   Zt   Yg     @@g      @iç  i    i   l    s   %i%s%sgfffffæ#@s   %.1f%s%ss   %.0f%s%s(   R!   R¬   R³   (	   t   numbert   SIt   spacet   symbolst   stept   thresht   deptht	   max_depthR§   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyR7   ù  s0    	 	
0		c         G   s¿   t  ƒ  } d | | |  f } | j |  d |  |  | d | ƒ| } d }	 xc | D][ \ }
 } |	 d 7}	 xB | | |	 t | ƒ k  r© | |
 7} | j | ƒ t j | ƒ qh WqO W| j | ƒ d  S(   Ns   (%d/%d): %ss"   http://www.example.com/path/to/fn/R/   i    i   (   RP   R9   R!   R;   R   t   sleepR?   (   R¨   t   curR˜   t   begR0   t   argst   tmR/   t   numt   offt   inct   delay(    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt   _tst   s    	 

c         G   sõ  d d GHt  d t ƒ } i  } d } d } d } xæ |  D]Þ } d  } t | ƒ d k rj | \ }	 }
 |
 } n  t | ƒ d k rŽ | \ }	 }
 } n  | j ƒ  } | j |	 d |	 |	 |
 d |	 ƒ| d	 7} | d  k	 sÖ t ‚ | | 7} | | | <|
 d  k s| d  k rd  } q7 | |
 7} q7 W| j | | ƒ d } d } x© | D]¡ \ } } | d	 7} xˆ | | | t | ƒ k  rÜ| | 7} xP | j D]D } | | | k r»| j | | ƒ | j	 | ƒ q„| j
 | ƒ q„Wt j | ƒ qUWq<W| j sñt ‚ d  S(
   NRE   iO   Rˆ   i    i   i   s"   http://www.example.com/path/to/fn/R/   i   (   Rš   R   R   R!   R   R9   t   AssertionErrorR}   R?   R’   R;   R   RÒ   (   t   datasRÕ   RÖ   t   dl_sizesR×   Rj   t   dl_total_sizet   datat   dl_sizeR¨   R0   t   nmRØ   RÙ   RÚ   (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt   _mtst.  sJ    		


	

t   __main__i   t   multis   sm-1.0.0-1.fc8.i386.rpmiè  s   s-1.0.1-1.fc8.i386.rpmiˆ  s   m-1.0.1-2.fc8.i386.rpmi'  id   g…ëQ¸Õ?iô  g      Ð?gš™™™™™¹?i %& i
   gš™™™™™É?i2   R   i@B i   s1   large-file-name-Foo-11.8.7-4.5.6.1.fc8.x86_64.rpmi   s2   large-file-name-Foo2-11.8.7-4.5.6.2.fc8.x86_64.rpmi   i!¡ s2   large-file-name-Foo3-11.8.7-4.5.6.3.fc8.x86_64.rpmi   i²q s2   large-file-name-Foo4-10.8.7-4.5.6.1.fc8.x86_64.rpmi   s2   large-file-name-Foo5-10.8.7-4.5.6.2.fc8.x86_64.rpmi   i‰  s2   large-file-name-Foo6-10.8.7-4.5.6.3.fc8.x86_64.rpmi	   iN  s1   large-file-name-Foox-9.8.7-4.5.6.1.fc8.x86_64.rpmg      à?i † (    (    (    (    (    (   s   sm-1.0.0-1.fc8.i386.rpmiè  (   s   s-1.0.1-1.fc8.i386.rpmiˆ  (   s   m-1.0.1-2.fc8.i386.rpmi'  (   id   g…ëQ¸Õ?(   iô  g      Ð?(   iè  gš™™™™™¹?(   s   sm-1.0.0-1.fc8.i386.rpmiè  (   s   s-1.0.1-1.fc8.i386.rpmiˆ  (   s   m-1.0.1-2.fc8.i386.rpmNi'  (   id   g…ëQ¸Õ?(   iô  g      Ð?(   iè  gš™™™™™¹?(   s   sm-1.0.0-1.fc8.i386.rpmiè  (   s   s-1.0.1-1.fc8.i386.rpmi %& (   s   m-1.0.1-2.fc8.i386.rpmi'  (   i
   gš™™™™™É?(   i2   gš™™™™™¹?(   iè  gš™™™™™¹?(   s   sm-1.0.0-1.fc8.i386.rpmiè  (   s   s-1.0.1-1.fc8.i386.rpmNi %& (   s   m-1.0.1-2.fc8.i386.rpmNi'  (   i
   gš™™™™™É?(   i2   gš™™™™™¹?(   iè  gš™™™™™¹?iø*  iR  iH” iˆÖ iÈ. iØ?. ièf. iø. i8Ð= (   i
   gš™™™™™É?(   i
   gš™™™™™¹?(   id   g      Ð?(   i
   gš™™™™™É?(   id   gš™™™™™¹?(   id   gš™™™™™¹?(   id   g      Ð?(   i
   gš™™™™™É?(   id   gš™™™™™¹?(   id   gš™™™™™¹?(   id   g      Ð?(   iè  gš™™™™™É?(   iè  gš™™™™™¹?(   i'  gš™™™™™¹?(   iè  gš™™™™™É?(   iè  gš™™™™™¹?(   i'  gš™™™™™¹?(   iè  gš™™™™™É?(   iè  gš™™™™™¹?(   i'  gš™™™™™¹?(   id   gš™™™™™¹?(   id   gš™™™™™¹?(   i   gš™™™™™¹?(   i
   g      à?(   i † gš™™™™™¹?(   i'  gš™™™™™¹?(   i'  gš™™™™™¹?(   i'  gš™™™™™¹?(   i † gš™™™™™¹?(   i'  gš™™™™™¹?(   i'  gš™™™™™¹?(   i'  gš™™™™™¹?(   i † gš™™™™™¹?(   i'  gš™™™™™¹?(   i'  gš™™™™™¹?(   i'  gš™™™™™¹?(   i † gš™™™™™¹?(   i'  gš™™™™™¹?(   i'  gš™™™™™¹?(   i'  gš™™™™™¹?(   i † gš™™™™™¹?(   i   gš™™™™™¹?("   Rl   R   R¹   R   R   R   R   R   R   R   R   R   R   R*   R@   RA   RC   RL   RO   RP   t   text_progress_meterRn   Ry   R|   Rš   R4   RT   R7   RÛ   Rã   R'   R!   t   argvt   exit(    (    (    s7   /usr/lib/python2.7/site-packages/urlgrabber/progress.pyt   <module>   s–   )>5		]Šm'		,((
	