
    W'Fg7                         S SK r S SKrS SKrS SKrS SKrSS jrSqSqSS jr " S S5      r	 " S S5      r
S rS	 r " S
 S\
5      r " S S5      rSS jrS rg)    Nc                      Sn[         R                  " U [        R                  U5      n[        R
                  " SU5      S   nU=(       d    S$ ! [         a     gf = f)zGet the real terminal width abcdefghhhhh   P   )fcntlioctltermios
TIOCGWINSZstructunpackIOError)fdbufrets      1/usr/share/virt-manager/virtinst/_progresspriv.pyterminal_widthr      sU    kk"g00#6mmFC(+yb s   AA 
AAc                 z    [         R                   " 5       n[        b  U[        -
  U:  a  [        U 5      qUq[        $ )z5Get the real terminal width, but cache it for a bit. )time_term_width_val_term_width_lastr   )r   cache_timeoutnows      r   terminal_width_cachedr   $   s8    
 ))+C3)9#9]"J(,    c                   B    \ rS rSrSrS
S jrS rSS jrSS jrS r	S	r
g)TerminalLine0   zAHelp create dynamic progress bars, uses terminal_width_cached(). Nc                 \    Uc  UnXl         [        [        X45      U5      U l        SU l        g )NF)_min_lenmaxr   llen_fin)selfmin_restbeg_lenr   r   s        r   __init__TerminalLine.__init__3   s,    ?G -b@'J		r   c                 4    U R                   U R                  -
  $ )zUsable length for elements. )r"   r    r$   s    r   __len__TerminalLine.__len__:   s    yy4==((r   c                 :    [        U R                  U-
  S5      U-  $ )zjAfter a fixed length, split the rest of the line length among
a number of different elements (default=2). r   )r!   r"   )r$   fixedelementss      r   
rest_splitTerminalLine.rest_split>   s     499u$a(H44r   c                     Uc  [        U5      n[        U 5      U:  a  SU l        U R                  (       a  gU =R                  [        U5      -  sl        U$ )z~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 )lenr#   r"   )r$   elementfull_lens      r   addTerminalLine.addC   sG     7|Ht9xDI99		S\!	r   c                     U R                   $ )z@Current rest of line, same as .rest_split(fixed=0, elements=1). )r"   r*   s    r   restTerminalLine.restQ   s    yyr   )r#   r    r"   )r   Nr         ?)   N)__name__
__module____qualname____firstlineno____doc__r'   r+   r0   r7   r:   __static_attributes__ r   r   r   r   0   s    L)5
r   r   c                   8    \ rS rSrS rS rS rS rS rS r	Sr
g	)
	BaseMeterV   c                 v    SU l         S U l        S U l        S U l        SU l        S U l        [        5       U l        g )Ng333333?r   )update_periodtextsize
start_timelast_amount_readlast_update_timeRateEstimatorrer*   s    r   r'   BaseMeter.__init__W   s8     		 ! $/r   c                     Xl         X l        [        U5      [        [        S 5      4;   d   eU R                   c   e[        R                  " 5       nX0l        U R                  R                  X#5        SU l        X0l	        g Nr   )
rK   rL   typeintr   rM   rQ   startrN   rO   )r$   rK   rL   r   s       r   rW   BaseMeter.starta   se    		Dzc4:....yy$$$iikd  ! #r   c                 "   [        U5      [        L d   e[        R                  " 5       nXl        U R                  R                  X5        U R                  (       a  X R                  U R                  -   :  a  X l        U R                  U5        g g r>   )	rU   rV   r   rN   rQ   updaterO   rJ   
_do_update)r$   amount_readr   s      r   rZ   BaseMeter.updatem   sp     K C'''iik +{(%%--0B0BBB$'!OOK( Cr   c                     g r>   rE   )r$   r\   s     r   r[   BaseMeter._do_updatez       r   c                 $    U R                  5         g r>   )_do_endr*   s    r   endBaseMeter.end}   s    r   c                     g r>   rE   r*   s    r   rb   BaseMeter._do_end   r`   r   )rN   rO   rQ   rL   rM   rK   rJ   N)r?   r@   rA   rB   r'   rW   rZ   r[   rc   rb   rD   rE   r   r   rG   rG   V   s     "
$)r   rG   c                 p    X-  n[        U5      nSU-  nX4-
  S:  a  US-  nU R                  SXU4-  5      $ )N=g      ?-z	 [%-*.*s])rV   r7   )tlbar_max_lengthpcbar_lenibar_lenprogressbars         r   _term_add_barrp      sS    !G7|H.Ks"s66+!,!. . / /r   c                     U(       a0  X!:  a  U R                  S5      S4$ X!:w  a  U R                  S5      S4$ U R                  S5      S4$ )Nz !!! Tz ...      F)r7   )rj   osizerL   s      r   _term_add_endrt      sH    <66'?D((]66'?D((66'?E!!r   c                   @    \ rS rSr\R
                  4S jrS rS rSr	g)	TextMeter   c                 :    [         R                  U 5        Xl        g r>   )rG   r'   output)r$   ry   s     r   r'   TextMeter.__init__   s    4 r   c           
      2   U R                   R                  5       n[        U5      n[        U R                   R                  5       5      n[	        SS5      n[        UR                  S:  5      nUR                  SU-  5      nU R                  cs  UR                  S[        X&5      -  5      nUR                  S5      n	UR                  SU-  5      n
SUR                  5       UR                  5       U R                  XX4-  nOU R                   R                  5       n[        X5      nU R                   R                  5       nUR                  SU-  5      nUR                  S	5      n	UR                  S
US-  -  5      nUR                  SU-  5      n
SUR                  S5      -   n[        UUU5      nSUR                  5       UR                  5       U R                  UUXX4	-  nU R                   R#                  U5        U R                   R%                  5         g )N      r    | %5sB  %srr   z %5sB/sz%-*.*s%s%s%s%sz ETA z %2i%%d         z%-*.*s%s%s%s%s%s%s)rQ   elapsed_timeformat_numberaverage_rater   boolr"   r7   rL   format_timer:   rK   remaining_timefraction_readr0   rp   ry   writeflush)r$   r\   etimefreadave_dlrj   	use_hoursui_sizeui_timeui_endui_rateoutrtimefrtimefracui_pcblenui_bars                     r   r[   TextMeter._do_update   s   $$&k*tww3356 !Y'2&	&&U*+99ffVk%&CCDGVVG_FffY/0G$	2779dii(/'(K KC GG**,E 2F77((*DffVf_-GVVG_FFF8tcz23EffY/0Gr}}Y//D"2tT2F*	2779diiv'. C 	#r   c                 J   U R                   n[        U5      n[        S5      n[        UR                  S:  5      nUR                  S[        U R                  R                  5       U5      -  5      n[        X0R                  U5      u  pgU(       d  US:X  a  UR                  SS-  5      nOUR                  SU-  5      nSUR                  5       UR                  5       U R                  XU4-  n	U R                  R                  U	5        U R                  R                  5         g )	Nr|   r   r   r   z | %5s  r~   z%-*.*s%s%s%s
)rN   r   r   r   r"   r7   r   rQ   r   rt   rL   r:   rK   ry   r   r   )
r$   r\   
total_sizerj   r   r   r   not_doner   r   s
             r   rb   TextMeter._do_end   s    ++";/
!_2&	&&+dgg.B.B.D.7#9 9 :(YYDK1,ffY_-GffY34G BGGIrwwy$))$+f$> >#r   )ry   N)
r?   r@   rA   rB   sysstderrr'   r[   rb   rD   rE   r   r   rv   rv      s    !jj %Nr   rv   c                   N    \ rS rSrSS jrS rS rS rS rS r	S r
S	 rS
 rSrg)rP   i  c                 V    Xl         S U l        S U l        S U l        SU l        S U l        g rT   )	timescaletotalrM   rO   rN   ave_rate)r$   r   s     r   r'   RateEstimator.__init__  s,    "
 $ !r   c                 D    Xl         X l        X l        SU l        S U l        g rT   )r   rM   rO   rN   r   )r$   r   r   s      r   rW   RateEstimator.start  s!    
 # !r   c                     US:X  d  XR                   :  a  X l        Xl         S U l        g X R                  -
  nXR                   -
  nU R                   (       a2  X l        U R                  X4U R                  U R                  5      U l        Xl         g rT   )rN   rO   r   _temporal_rolling_aver   )r$   r\   r   	time_diff	read_diffs        r   rZ   RateEstimator.update  s~    !{-B-BB$'!$/! DM///	"7"77	  $'! 66dmmT^^EDM +r   c                     U R                   $ )z/get the average transfer rate (in bytes/second))r   r*   s    r   r   RateEstimator.average_rate/  s    }}r   c                 4    U R                   U R                  -
  $ )zEthe time between the start of the transfer and the most recent update)rO   rM   r*   s    r   r   RateEstimator.elapsed_time3  s    $$t66r   c                     U R                   (       a  U R                  (       d  gU R                  U R                  -
  U R                   -  $ )zestimated time remainingN)r   r   rN   r*   s    r   r   RateEstimator.remaining_time7  s0    }}DJJ

T222dmmCCr   c                     U R                   c  gU R                   S:X  a  g[        U R                  5      U R                   -  $ )zSthe fraction of the data that has been read
(can be None for unknown transfer size)Nr   r<   )r   floatrN   r*   s    r   r   RateEstimator.fraction_read=  s9     ::::?T**+djj88r   c                 B    [        X-  S5      nU R                  XX55      $ )aI  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.r<   )min_rolling_ave)r$   r   r   last_aver   epsilons         r   r   #RateEstimator._temporal_rolling_aveH  s&     i+S1  xIIr   c                 ^     X!-  nUc  U$ Uc  U$ XE-  SU-
  U-  -   $ ! [          a    Sn N%f = f)a+  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.Nr   )ZeroDivisionError)r$   r   r   r   r   recent_rates         r   r   RateEstimator._rolling_aveS  sW    	#/K O $Gx'??? ! 	K	s    ,,)r   rN   rO   rM   r   r   N)g      @)r?   r@   rA   rB   r'   rW   rZ   r   r   r   r   r   r   rD   rE   r   r   rP   rP     s2    ,&7D9	J@r   rP   c                     U b  U S:  a	  U(       a  ggU [        S5      :X  a  g[        U 5      n U S-  nU S-  n U(       a  US-  nUS-  nSX2U 4-  $ SX 4-  $ )	Nr   z--:--:--z--:--infInfinite<   z%02i:%02i:%02iz	%02i:%02i)r   rV   )secondsr   minuteshourss       r   r   r   g  ss    'A+	E%L	 g,R-B,rMElG#uw&???'!333r   c                    / SQnSnSnSn[        U5      S-
  nU =(       d    Sn X:  a  XE:  a  US-   nX-  n X:  a  XE:  a  M  [        U [        5      (       a  SnOU S:  a  SnOS	nU[        U =(       d    S5      S
X   4-  $ )z4Turn numbers into human-readable metric-like numbers)	r3   kMGTPEZYg      @i  r   r   z%i%s%sgfffff#@z%.1f%s%sz%.0f%s%sr   )r4   
isinstancerV   r   )numbersymbolsstepthreshdepth	max_depthfmts          r   r   r   {  s    G DFEGq I[qF
 /e/	 /e/ &# 	$ %!$c7>:::r   )r   )r   r<   )r   )r   r   r   r
   r   r   r   r   r   r   rG   rp   rt   rv   rP   r   r   rE   r   r   <module>r      ss      
    	# #L+ +|/"?	 ?JX@ X@v4($;r   