3 ÝPfM-ã@s¨ddlmZddlmZddlZddlZddlmZmZmZddlZddl Z ddl Z ddl m Z ddl mZddlmZddlmZdd lmZmZdd lmZmZmZdd lmZydd lmZWnek rÜdZYnXe jeƒZ d d„Z!e!eeƒZ"Gdd„de#ƒZ$Gdd„de#ƒZ%Gdd„de#ƒZ&Gdd„de&e$e%e"ƒZ'Gdd„de&e$e%eeƒZ(e j)dd„ƒZ*Gdd„de#ƒZ+Gdd„de#ƒZ,Gdd „d e#ƒZ-e j)d!d"„ƒZ.dS)#é)Úabsolute_import)ÚdivisionN)ÚsignalÚSIGINTÚdefault_int_handler)ÚWINDOWS)Ú format_size)Úget_indentation)Úsix)ÚBarÚIncrementalBar)Ú WritelnMixinÚ HIDE_CURSORÚ SHOW_CURSOR)ÚSpinner)Úcoloramac Cs€t|jddƒ}|s|St|dtjƒƒt|dtjƒƒg}|tt|dgƒƒ7}ytjƒj|ƒj|ƒWntk rv|SX|SdS)NÚencodingZ empty_fillZfillÚphases)ÚgetattrÚfiler Z text_typeÚlistÚjoinÚencodeÚUnicodeEncodeError)Z preferredZfallbackrZ characters©rú/usr/lib/python3.6/ui.pyÚ_select_progress_classsrcs4eZdZdZ‡fdd„Z‡fdd„Zdd„Z‡ZS)ÚInterruptibleMixina Helper to ensure that self.finish() gets called on keyboard interrupt. This allows downloads to be interrupted without leaving temporary state (like hidden cursors) behind. This class is similar to the progress library's existing SigIntMixin helper, but as of version 1.2, that helper has the following problems: 1. It calls sys.exit(). 2. It discards the existing SIGINT handler completely. 3. It leaves its own handler in place even after an uninterrupted finish, which will have unexpected delayed effects if the user triggers an unrelated keyboard interrupt some time after a progress-displaying download has already completed, for example. cs4tt|ƒj||Žtt|jƒ|_|jdkr0t|_dS)z= Save the original SIGINT handler for later. N)ÚsuperrÚ__init__rrÚ handle_sigintÚoriginal_handlerr)ÚselfÚargsÚkwargs)Ú __class__rrrNs zInterruptibleMixin.__init__cstt|ƒjƒtt|jƒdS)z½ Restore the original SIGINT handler after finishing. This should happen regardless of whether the progress display finishes normally, or gets interrupted. N)rrÚfinishrrr!)r")r%rrr&^szInterruptibleMixin.finishcCs|jƒ|j||ƒdS)z² Call self.finish() before delegating to the original SIGINT handler. This handler should only be in place while the progress display is active. N)r&r!)r"ZsignumÚframerrrr hsz InterruptibleMixin.handle_sigint)Ú__name__Ú __module__Ú __qualname__Ú__doc__rr&r Ú __classcell__rr)r%rr<s  rcsJeZdZ‡fdd„Zedd„ƒZedd„ƒZedd„ƒZd d d „Z‡Z S) ÚDownloadProgressMixincs,tt|ƒj||Ždtƒd|j|_dS)Nú é)rr-rr Úmessage)r"r#r$)r%rrruszDownloadProgressMixin.__init__cCs t|jƒS)N)rÚindex)r"rrrÚ downloadedysz DownloadProgressMixin.downloadedcCs |jdkrdStd|jƒdS)Ngz...éz/s)Zavgr)r"rrrÚdownload_speed}s z$DownloadProgressMixin.download_speedcCs|jrd|jSdS)Nzeta %sÚ)ZetaZeta_td)r"rrrÚ pretty_eta„s z DownloadProgressMixin.pretty_etar3ccs*x|D]}|V|j|ƒqW|jƒdS)N)Únextr&)r"ÚitÚnÚxrrrÚiterŠs zDownloadProgressMixin.iter)r3) r(r)r*rÚpropertyr2r4r6r;r,rr)r%rr-ss     r-cseZdZ‡fdd„Z‡ZS)Ú WindowsMixincs\trˆjrdˆ_ttˆƒj||ŽtrXtrXtjˆjƒˆ_‡fdd„ˆj_‡fdd„ˆj_ dS)NFcs ˆjjjƒS)N)rÚwrappedÚisattyr)r"rrÚ§sz'WindowsMixin.__init__..cs ˆjjjƒS)N)rr>Úflushr)r"rrr@«s) rZ hide_cursorrr=rrZ AnsiToWin32rr?rA)r"r#r$)r%)r"rr“s zWindowsMixin.__init__)r(r)r*rr,rr)r%rr=‘sr=c@seZdZejZdZdZdS)ÚDownloadProgressBarz %(percent)d%%z0%(downloaded)s %(download_speed)s %(pretty_eta)sN)r(r)r*ÚsysÚstdoutrr0ÚsuffixrrrrrB®srBc@s&eZdZejZdZdd„Zdd„ZdS)ÚDownloadProgressSpinnerz!%(downloaded)s %(download_speed)scCs"t|dƒstj|jƒ|_t|jƒS)NÚ_phaser)ÚhasattrÚ itertoolsÚcyclerrGr7)r"rrrÚ next_phase¼s z"DownloadProgressSpinner.next_phasecCsN|j|}|jƒ}|j|}dj||r*dnd||r6dnd|gƒ}|j|ƒdS)Nr5r.)r0rKrErZwriteln)r"r0ZphaserEÚlinerrrÚupdateÁs    zDownloadProgressSpinner.updateN) r(r)r*rCrDrrErKrMrrrrrF¶srFc csRtr dVnB|jƒ s$tjƒtjkr,dVn"|jtƒz dVWd|jtƒXdS)N) rr?ÚloggerÚgetEffectiveLevelÚloggingÚINFOÚwriterr)rrrrÚ hidden_cursorØs  rSc@s$eZdZdd„Zdd„Zdd„ZdS)Ú RateLimitercCs||_d|_dS)Nr)Ú_min_update_interval_secondsÚ _last_update)r"Úmin_update_interval_secondsrrrrìszRateLimiter.__init__cCstjƒ}||j}||jkS)N)ÚtimerVrU)r"ZnowZdeltarrrÚreadyðs zRateLimiter.readycCstjƒ|_dS)N)rXrV)r"rrrÚresetõszRateLimiter.resetN)r(r)r*rrYrZrrrrrTësrTc@s.eZdZd dd„Zdd„Zdd „Zd d „ZdS) ÚInteractiveSpinnerNú-\|/çÀ?cCs\||_|dkrtj}||_t|ƒ|_d|_tj|ƒ|_ |jj dt ƒ|jdƒd|_ dS)NFr.z ... r) Ú_messagerCrDÚ_filerTÚ _rate_limiterÚ _finishedrIrJÚ _spin_cyclerRr Ú_width)r"r0rZ spin_charsrWrrrrús  zInteractiveSpinner.__init__cCsRd|j}|jj|d|j|ƒ|jj|ƒt|ƒ|_|jjƒ|jjƒdS)Núr.)rcr_rRÚlenrAr`rZ)r"ÚstatusZbackuprrrÚ_write s     zInteractiveSpinner._writecCs,|jr dS|jjƒsdS|jt|jƒƒdS)N)rar`rYrgr7rb)r"rrrÚspins  zInteractiveSpinner.spincCs4|jr dS|j|ƒ|jjdƒ|jjƒd|_dS)NÚ T)rargr_rRrA)r"Ú final_statusrrrr&s    zInteractiveSpinner.finish)Nr\r])r(r)r*rrgrhr&rrrrr[ùs   r[c@s.eZdZd dd„Zdd„Zdd„Zdd „Zd S) ÚNonInteractiveSpinneré<cCs$||_d|_t|ƒ|_|jdƒdS)NFZstarted)r^rarTr`Ú_update)r"r0rWrrrr*s zNonInteractiveSpinner.__init__cCs|jjƒtjd|j|ƒdS)Nz%s: %s)r`rZrNÚinfor^)r"rfrrrrm0s zNonInteractiveSpinner._updatecCs&|jr dS|jjƒsdS|jdƒdS)Nzstill running...)rar`rYrm)r"rrrrh5s  zNonInteractiveSpinner.spincCs$|jr dS|jd|fƒd|_dS)Nzfinished with status '%s'T)rarm)r"rjrrrr&<szNonInteractiveSpinner.finishN)rl)r(r)r*rrmrhr&rrrrrk)s rkccs˜tjjƒr"tjƒtjkr"t|ƒ}nt|ƒ}y t tjƒ� |VWdQRXWn>t k rj|j dƒ‚Yn*t k rˆ|j dƒ‚Yn X|j dƒdS)NZcanceledÚerrorÚdone) rCrDr?rNrOrPrQr[rkrSÚKeyboardInterruptr&Ú Exception)r0ZspinnerrrrÚ open_spinnerCs    rs)/Z __future__rrrIrCrrrrXÚ contextlibrPZ pip.compatrZ pip.utilsrZpip.utils.loggingr Z pip._vendorr Zpip._vendor.progress.barr r Zpip._vendor.progress.helpersr rrZpip._vendor.progress.spinnerrrrrZ getLoggerr(rNrZ_BaseBarÚobjectrr-r=rBrFÚcontextmanagerrSrTr[rkrsrrrrÚsB          7 !0