3 Bu_@sddlZddlmZddlZddlZddlmZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZy ddlZWnek rdZYnXddlZddlZddlZddlZddlZy ddlZWnek rddlZYnXddlZddlmZddlmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0e j1e2Z3e j4dZ5e j4dZ6e j4d Z7e j4d Z8e j4d Z9e j4d Z:e j4d Z;e j4dZddZ?ddZ@ddZAdddZBddZCddZDdd ZEejFd!d"ZGejFd#d$ZHejFdd&d'ZIGd(d)d)eJZKd*d+ZLGd,d-d-eJZMd.d/ZNGd0d1d1eJZOe j4d2e jPZQd3d4ZRdd5d6ZSd7d8ZTd9d:ZUd;d<ZVd=d>ZWd?d@ZXe j4dAe jYZZe j4dBZ[ddCdDZ\e j4dEZ]dFdGZ^dHdIZ_dJdKZ`dLZadMdNZbdOdPZcGdQdRdReJZdGdSdTdTeJZeGdUdVdVeJZfdZgdd_d`ZhdadbZidZjGdidjdjeJZke j4dkZle j4dlZme j4dmZndndoZdpdqZoerddrlmpZqmrZrmsZsGdsdtdte$jtZtGdudvdveqZpGdwdxdxepe'ZuejvddyZwewdkrGd{d|d|e$jxZxerGd}d~d~e$jyZyGddde%jzZzerBGddde%j{Z{Gddde%j|Z|ddZ}GdddeJZ~Gddde~ZGddde~ZGddde(ZGdddeJZddZdS)N)deque)iglob)DistlibException) string_types text_typeshutil raw_inputStringIOcache_from_sourceurlopenurljoinhttplib xmlrpclib splittype HTTPHandlerBaseConfigurator valid_ident Container configparserURLErrorZipFilefsdecodeunquoteurlparsez^([\w\.-]+)\s*z^([\w\.*+-]+)\s*z^(<=?|>=?|={2,3}|[~!]=)\s*z*^((<=?)|(>=?)|={2,3}|[~!]=|in|not\s+in)\s*z^or\b\s*z ^and\b\s*z(\S+)\s*z(([\s\w\.{}()*+#:;,/?!~`@$%^&=|<>\[\]-]+)cs6ddfddfddfdd|S) ae Parse a marker string and return a dictionary containing a marker expression. The dictionary will contain keys "op", "lhs" and "rhs" for non-terminals in the expression grammar, or strings. A string contained in quotes is to be interpreted as a literal string, and a string not contained in quotes is a variable (such as os_name). cSs2tj|}|r.|jd}||jd}n|s.marker_varcs|rR|ddkrR|ddj\}}|ddkr@td||ddj}n^|\}}xL|rtj|}|stP|jd}||jd}|\}}|||d}q`W|}||fS)Nr(r)zunterminated parenthesis: %s)oplhsrhs)r%r MARKER_OPrrr)r&r(r3r'r2r4)markerr/r-r. marker_expres       z!parse_marker..marker_exprcsV|\}}x@|rLtj|}|s"P||jd}|\}}d||d}qW||fS)Nand)r2r3r4)ANDrr)r&r3r'r4)r7r-r. marker_andxs   z parse_marker..marker_andcsV|\}}x@|rLtj|}|s"P||jd}|\}}d||d}qW||fS)Nor)r2r3r4)ORrr)r&r3r'r4)r:r-r.r6s   zparse_marker..markerr-) marker_stringr-)r6r:r7r/r. parse_marker8s $ r>cCs2|j}| s|jdrdStj|}|s6td||jd}||jd}d}}}}|op|ddkr<|jdd}|dkrtd||d|} ||ddj}g}xx| r0tj| }|std | |j |jd| |jd} | sP| dd krtd | | ddj} qW|s.get_versionsr0r1zunterminated parenthesis: %szinvalid constraint: %sz~=;zinvalid requirement: %szunexpected trailing data: %sz%s %sz, cSsg|] }d|qS)z%s %sr-).0conr-r-r. sz%parse_requirement..)nameextras constraintsr6url requirement)strip startswithrrr rrfindr%r" NON_SPACErschemenetlocrDrEr>r$r)reqr&r'distnamerO mark_exprrGuriir,trI_rHrsr-r-r.parse_requirements                          racCsdd}i}x|D]\}}}tjj||}xt|D]t}tjj||} x`t| D]T} ||| } |dkrt|j| dqP||| } |jtjjdjd} | d| || <qPWq4WqW|S)z%Find destinations for resources filescSsD|jtjjd}|jtjjd}|j|s.t|t|djdS)N/)r!ospathseprTAssertionErrorlenr%)rootrdr-r-r. get_rel_path sz)get_resources_dests..get_rel_pathNrb)rcrdr$rpopr!rerstrip)resources_rootrulesri destinationsbasesuffixdestprefixabs_baseabs_globabs_path resource_filerel_pathrel_destr-r-r.get_resources_dests s  rycCs(ttdrd}ntjttdtjk}|S)N real_prefixT base_prefix)hasattrsysrrgetattr)r(r-r-r.in_venv$s rcCs$tjjtj}t|ts t|}|S)N)rcrdnormcaser} executable isinstancerr)r(r-r-r.get_executable.s  rcCsT|}xJt|}|}| r |r |}|r|dj}||kr:P|rd|||f}qW|S)Nrz %c: %s %s)r lower)prompt allowed_chars error_promptdefaultpr,cr-r-r.proceed>s  rcCs<t|tr|j}i}x |D]}||kr||||<qW|S)N)rrsplit)dkeysr(keyr-r-r.extract_by_keyNs  rcCstjddkrtjd|}|j}t|}yrtj|}|ddd}xR|jD]F\}}x<|jD]0\}}d||f}t |} | dk st | ||<qdWqRW|St k r|j ddYnXdd } t j} y| | |Wn<t jk r|jtj|}t|}| | |YnXi}xb| jD]V} i|| <}xB| j| D]4\} }d| |f}t |} | dk spt | || <qFWq*W|S) Nrzutf-8 extensionszpython.exportsexportsz%s = %scSs$t|dr|j|n |j|dS)N read_file)r|rreadfp)cpstreamr-r-r. read_streamks  z!read_exports..read_stream)r} version_infocodecs getreaderreadr jsonloaditemsget_export_entryrf Exceptionseekr ConfigParserMissingSectionHeaderErrorclosetextwrapdedentsections)rdatajdatar(groupentrieskrHr,entryrrrrNvaluer-r-r. read_exportsWsD      rcCstjddkrtjd|}tj}x||jD]p\}}|j|x\|jD]P}|j dkr`|j }nd|j |j f}|j rd|dj |j f}|j ||j|qJWq.W|j|dS)Nrrzutf-8z%s:%sz%s [%s]z, )r}rr getwriterrrr add_sectionvaluesrprrflagsr$setrNwrite)rrrrrHrr,r-r-r. write_exportss  rc cs$tj}z |VWdtj|XdS)N)tempfilemkdtemprrmtree)tdr-r-r.tempdirs rc cs.tj}ztj|dVWdtj|XdS)N)rcgetcwdchdir)rcwdr-r-r.rs   rc cs.tj}ztj|dVWdtj|XdS)N)socketgetdefaulttimeoutsetdefaulttimeout)secondsctor-r-r.socket_timeouts   rc@seZdZddZdddZdS)cached_propertycCs ||_dS)N)func)selfrr-r-r.__init__szcached_property.__init__NcCs,|dkr |S|j|}tj||jj||S)N)robject __setattr____name__)robjclsrr-r-r.__get__s  zcached_property.__get__)N)r __module__ __qualname__rrr-r-r-r.rsrcCstjdkr|S|s|S|ddkr.td||ddkrFtd||jd}xtj|krj|jtjqRW|svtjStjj|S)aReturn 'pathname' as a name that will work on the native filesystem. The path is split on '/' and put back together again using the current directory separator. Needed because filenames in the setup script are always supplied in Unix style, and have to be converted to the local convention before we can actually use them in the filesystem. Raises ValueError on non-Unix-ish systems if 'pathname' either starts or ends with a slash. rbrzpath '%s' cannot be absoluterzpath '%s' cannot end with '/')rcre ValueErrorrcurdirremoverdr$)pathnamepathsr-r-r. convert_paths       rc@seZdZd$ddZddZddZdd Zd%d d Zd&ddZddZ ddZ ddZ ddZ ddZ d'ddZddZddZd d!Zd"d#Zd S)( FileOperatorFcCs||_t|_|jdS)N)dry_runrensured _init_record)rrr-r-r.rszFileOperator.__init__cCsd|_t|_t|_dS)NF)recordr files_written dirs_created)rr-r-r.rszFileOperator._init_recordcCs|jr|jj|dS)N)rradd)rrdr-r-r.record_as_writtenszFileOperator.record_as_writtencCsHtjj|s tdtjj|tjj|s0dStj|jtj|jkS)aTell if the target is newer than the source. Returns true if 'source' exists and is more recently modified than 'target', or if 'source' exists and 'target' doesn't. Returns false if both exist and 'target' is the same age or younger than 'source'. Raise PackagingFileError if 'source' does not exist. Note that this test is not very accurate: files created in the same second will have the same "age". zfile '%r' does not existT)rcrdexistsrabspathstatst_mtime)rsourcetargetr-r-r.newers  zFileOperator.newerTcCs|jtjj|tjd|||jsd}|rftjj|rDd|}n"tjj|rftjj | rfd|}|rvt |dt j |||j |dS)z8Copy a file respecting dry-run and force flags. zCopying %s to %sNz%s is a symlinkz%s is a non-regular filez which would be overwritten) ensure_dirrcrddirnameloggerinforislinkrisfilerrcopyfiler)rinfileoutfilecheckmsgr-r-r. copy_files    zFileOperator.copy_fileNc Cstjj| st|jtjj|tjd|||jsx|dkrLt |d}nt j |d|d}zt j ||Wd|j X|j|dS)NzCopying stream %s to %swbw)encoding)rcrdisdirrfrrrrropenrr copyfileobjrr)rinstreamrr outstreamr-r-r. copy_streams  zFileOperator.copy_streamc Cs\|jtjj||jsNtjj|r.tj|t|d}|j|WdQRX|j |dS)Nr) rrcrdrrrrrrr)rrdrfr-r-r.write_binary_file!s   zFileOperator.write_binary_filecCs|j||j|dS)N)rencode)rrdrrr-r-r.write_text_file*szFileOperator.write_text_filecCsrtjdkstjdkrntjdkrnxN|D]F}|jr9szFileOperator.cCs~tjj|}||jkrztjj| rz|jj|tjj|\}}|j|tj d||j shtj ||j rz|j j|dS)Nz Creating %s)rcrdrrrrrrrrrmkdirrr)rrdrrr-r-r.r;s    zFileOperator.ensure_dirc Cst|| }tjd|||js|s0|j||rX|s:d}n|j|sHt|t|d}i}|rvtt drvt j j |d<t j |||df||j ||S)NzByte-compiling %s to %sPycInvalidationModeinvalidation_modeT)r rrrrrTrfrgr| py_compiler CHECKED_HASHcompiler) rrdoptimizeforcerrhashed_invalidationdpathdiagpathcompile_kwargsr-r-r. byte_compileGs   zFileOperator.byte_compilecCstjj|rtjj|r`tjj| r`tjd||jsBtj ||j r||j kr|j j |nPtjj|rrd}nd}tjd|||jstj ||j r||j kr|j j |dS)NzRemoving directory tree at %slinkfilezRemoving %s %s)rcrdrrrrdebugrrrrrrr)rrdr,r-r-r.ensure_removedXs"       zFileOperator.ensure_removedcCsHd}x>|sBtjj|r&tj|tj}Ptjj|}||kr)rNrrrpr)rr-r-r.__repr__s zExportEntry.__repr__cCsDt|tsd}n0|j|jko>|j|jko>|j|jko>|j|jk}|S)NF)rr6rNrrrpr)rotherr(r-r-r.__eq__s     zExportEntry.__eq__N) rrrrrrr7r9r__hash__r-r-r-r.r6s   r6z(?P(\w|[-.+])+) \s*=\s*(?P(\w+)([:\.]\w+)*) \s*(\[\s*(?P[\w-]+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? c Cstj|}|s0d}d|ks"d|krtd|n|j}|d}|d}|jd}|dkrf|d}}n"|dkrztd||jd\}}|d } | dkrd|ksd|krtd|g} nd d | jd D} t|||| }|S) Nr@rAzInvalid specification '%s'rNcallable:rrrcSsg|] }|jqSr-)rS)rKrr-r-r.rMsz$get_export_entry..rB)ENTRY_REsearchr groupdictcountrr6) specificationr'r(rrNrdcolonsrrrprr-r-r.rs2    rc Cs|dkr d}tjdkr.dtjkr.tjjd}n tjjd}tjj|rftj|tj}|st j d|n|jdd\}}d|kr.|}n|jdd\}}|rJt|}|rVt|}|||fS)NrCrr<)rsplitrr)rXusernamepasswordrrr-r-r.parse_credentials$srVcCstjd}tj||S)N)rcumask)r(r-r-r.get_process_umask3s  rYcCs>d}d}x$t|D]\}}t|tsd}PqW|dk s:t|S)NTF) enumeraterrrf)seqr(r]r,r-r-r.is_string_sequence8s  r\z3([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-([a-z0-9_.+-]+)z -py(\d\.?\d?)cCsd}d}t|jdd}tj|}|r@|jd}|d|j}|rt|t|dkrtjtj |d|}|r|j }|d|||dd|f}|dkrt j|}|r|jd|jd|f}|S)zw Extract name, version, python version from a filename (no extension) Return name, version, pyver or None N -rz\br) rr!PYTHON_VERSIONr>rstartrgrerescaperPROJECT_NAME_AND_VERSION)filename project_namer(pyverr'nr-r-r.split_filenameGs"   rhz-(?P[\w .-]+)\s*\(\s*(?P[^\s)]+)\)$cCs:tj|}|std||j}|djj|dfS)z A utility method used to get name and version from a string. From e.g. a Provides-Dist value. :param p: A value in a form 'foo (1.0)' :return: The name and version as a tuple. z$Ill-formed name/version string: '%s'rNver)NAME_VERSION_RErrr?rSr)rr'rr-r-r.parse_name_and_versioncs  rkcCst}t|pg}t|pg}d|kr8|jd||O}x|D]x}|dkrV|j|q>|jdr|dd}||krtjd|||kr|j|q>||krtjd||j|q>W|S)N*r^rzundeclared extra: %s)rrrrTrrJ) requested availabler(runwantedr-r-r. get_extrasrs&        rqcCsi}yNt|}|j}|jd}|jds8tjd|ntjd|}tj |}Wn0t k r}ztj d||WYdd}~XnX|S)Nz Content-Typezapplication/jsonz(Unexpected response for JSON request: %szutf-8z&Failed to get external data for %s: %s) r rgetrTrrrrrrr exception)rQr(respheadersctreaderer-r-r._get_external_datas   ryz'https://www.red-dove.com/pypi/projects/cCs*d|dj|f}tt|}t|}|S)Nz%s/%s/project.jsonr)upperr _external_data_base_urlry)rNrQr(r-r-r.get_project_datas r|cCs(d|dj||f}tt|}t|S)Nz%s/%s/package-%s.jsonr)rzr r{ry)rNversionrQr-r-r.get_package_datas r~c@s(eZdZdZddZddZddZdS) Cachez A class implementing a cache for resources that need to live in the file system e.g. shared libraries. This class was moved from resources to here because it could be used by other modules, e.g. the wheel module. cCsPtjj|stj|tj|jd@dkr6tjd|tjjtjj ||_ dS)zu Initialise an instance. :param base: The base directory where the cache should be located. ?rzDirectory '%s' is not privateN) rcrdrrKrrrrJrnormpathro)rror-r-r.rs    zCache.__init__cCst|S)zN Converts a resource prefix to a directory name in the cache. )rP)rrrr-r-r. prefix_to_dirszCache.prefix_to_dirc Csg}xtj|jD]r}tjj|j|}y>tjj|s@tjj|rLtj|ntjj|rbt j |Wqt k r|j |YqXqW|S)z" Clear the cache. ) rcr(rordr$rrrrrrrr")r not_removedfnr-r-r.clears  z Cache.clearN)rrr__doc__rrrr-r-r-r.rsrc@s:eZdZdZddZdddZddZd d Zd d Zd S) EventMixinz1 A very simple publish/subscribe system. cCs i|_dS)N) _subscribers)rr-r-r.rszEventMixin.__init__TcCsD|j}||krt|g||<n"||}|r6|j|n |j|dS)a` Add a subscriber for an event. :param event: The name of an event. :param subscriber: The subscriber to be added (and called when the event is published). :param append: Whether to append or prepend the subscriber to an existing subscriber list for the event. N)rrr" appendleft)revent subscriberr"subssqr-r-r.rs  zEventMixin.addcCs,|j}||krtd|||j|dS)z Remove a subscriber for an event. :param event: The name of an event. :param subscriber: The subscriber to be removed. zNo subscribers: %rN)rrr)rrrrr-r-r.rs zEventMixin.removecCst|jj|fS)z Return an iterator for the subscribers for an event. :param event: The event to return subscribers for. )iterrrr)rrr-r-r.get_subscribersszEventMixin.get_subscribersc Ospg}xT|j|D]F}y||f||}Wn"tk rJtjdd}YnX|j|qWtjd|||||S)a^ Publish a event and return a list of values returned by its subscribers. :param event: The event to publish. :param args: The positional arguments to pass to the event's subscribers. :param kwargs: The keyword arguments to pass to the event's subscribers. z"Exception during event publicationNz/publish %s: args = %s, kwargs = %s, result = %s)rrrrsr"r)rrargskwargsr(rrr-r-r.publishs    zEventMixin.publishN)T) rrrrrrrrrr-r-r-r.rs   rc@s^eZdZddZddZdddZdd Zd d Zd d ZddZ e ddZ e ddZ dS) SequencercCsi|_i|_t|_dS)N)_preds_succsr_nodes)rr-r-r.r"szSequencer.__init__cCs|jj|dS)N)rr)rnoder-r-r.add_node'szSequencer.add_nodeFcCs||jkr|jj||rx&t|jj|fD]}|j||q.Wx&t|jj|fD]}|j||qVWx&t|jjD]\}}|sz|j|=qzWx&t|jjD]\}}|s|j|=qWdS)N)rrrrrrrr&r)rredgesrr,rrHr-r-r. remove_node*s   zSequencer.remove_nodecCs<||ks t|jj|tj||jj|tj|dS)N)rfr setdefaultrrr)rpredsuccr-r-r.r:s z Sequencer.addcCs||ks ty|j|}|j|}Wn tk rDtd|YnXy|j||j|Wn$tk rtd||fYnXdS)Nz%r not a successor of anythingz%r not a successor of %r)rfrrKeyErrorrr)rrrpredssuccsr-r-r.r?s   zSequencer.removecCs||jkp||jkp||jkS)N)rrr)rstepr-r-r.is_stepLszSequencer.is_stepcCs|j|std|g}g}t}|j|xd|r|jd}||krd||kr|j||j|q0|j||j||jj|f}|j |q0Wt |S)Nz Unknown: %rr) rrrr"rjrrrrrextendreversed)rfinalr(todoseenrrr-r-r. get_stepsPs"        zSequencer.get_stepscsVdggiig|jfddxD]}|kr:|q:WS)Nrc sd|<d|<dd7<j|y |}Wntk rVg}YnXxR|D]J}|kr|t|||<q^|kr^t|||<q^W||krg}x j}|j|||krPqWt|}j|dS)Nrr)r"rminrjtuple)r successors successorconnected_component component)graphindex index_counterlowlinksr(stack strongconnectr-r.rts.       z3Sequencer.strong_connections..strongconnect)r)rrr-)rrrrr(rrr.strong_connectionsis"  zSequencer.strong_connectionscCsrdg}x8|jD].}|j|}x|D]}|jd||fq"WqWx|jD]}|jd|qHW|jddj|S)Nz digraph G {z %s -> %s;z %s;} )rr"rr$)rr(rrrrr-r-r.dots     z Sequencer.dotN)F) rrrrrrrrrrpropertyrrr-r-r-r.r!s   3r.tar.gz.tar.bz2.tar.zip.tgz.tbz.whlTc sXfdd}tjjtd}|dkr|jdr>d}nH|jdrRd}d }n4|jdrfd }d }n |jdrzd}d}n td|z|dkrt|d}|r|j}xD|D] }||qWn.tj ||}|r|j }x|D] }||qW|dkr6t j ddkr6x.|j D]"} t| jts| jjd| _qW|jWd|rR|jXdS)NcsTt|ts|jd}tjjtjj|}|j sD|tjkrPt d|dS)Nzutf-8zpath outside destination: %r) rrdecodercrdrr$rTrer)rdr)dest_dirplenr-r. check_paths   zunarchive..check_path.zip.whlzip.tar.gz.tgztgzzr:gz.tar.bz2.tbztbzzr:bz2z.tartarrozUnknown format for %rrrzutf-8)rr)rr)rr)rcrdrrgrQrrnamelisttarfilergetnamesr}r getmembersrrNrr extractallr) archive_filenamerformatrrarchiver namesrNtarinfor-)rrr. unarchivesH           rc Cstj}t|}t|db}xZtj|D]L\}}}x@|D]8}tjj||}||d} tjj| |} |j|| q8Wq(WWdQRX|S)z*zip a directory tree into a BytesIO objectrN) ioBytesIOrgrrcwalkrdr$r) directoryr(dlenzfrhr*r rNfullrelrqr-r-r.zip_dirs   rrKMGTPc@sreZdZdZdddZddZdd Zd d Zd d Ze ddZ e ddZ ddZ e ddZ e ddZdS)ProgressUNKNOWNrdcCs<|dks||kst||_|_||_d|_d|_d|_dS)NrF)rfrcurmaxstartedelapseddone)rminvalmaxvalr-r-r.rs  zProgress.__init__cCsV|j|kst|jdks&||jks&t||_tj}|jdkrF||_n ||j|_dS)N)rrfrrtimerr)rcurvalnowr-r-r.updates zProgress.updatecCs |dks t|j|j|dS)Nr)rfrr)rincrr-r-r. increments zProgress.incrementcCs|j|j|S)N)rr)rr-r-r.r`s zProgress.startcCs |jdk r|j|jd|_dS)NT)rrr)rr-r-r.stops  z Progress.stopcCs|jdkr|jS|jS)N)runknown)rr-r-r.maximumszProgress.maximumcCsD|jr d}n4|jdkrd}n$d|j|j|j|j}d|}|S)Nz100 %z ?? %gY@z%3d %%)rrrr)rr(rHr-r-r. percentages zProgress.percentagecCs:|dkr|jdks|j|jkr$d}ntjdtj|}|S)Nrz??:??:??z%H:%M:%S)rrrrstrftimegmtime)rdurationr(r-r-r.format_duration*szProgress.format_durationcCs|jrd}|j}n^d}|jdkr&d}nJ|jdks<|j|jkrBd}n.t|j|j}||j|j}|d|j}d||j|fS)NDonezETA rrz%s: %sr)rrrrrfloatr)rrrr^r-r-r.ETA3s z Progress.ETAcCsN|jdkrd}n|j|j|j}xtD]}|dkr6P|d}q(Wd||fS)Nrgig@@z%d %sB/s)rrrUNITS)rr(unitr-r-r.speedFs   zProgress.speedN)rr)rrrrrrrr`rrrrrrrr-r-r-r.rs     rz \{([^}]*)\}z[^/\\,{]\*\*|\*\*[^/\\,}]z^[^{]*\}|\{[^}]*$cCs<tj|rd}t||tj|r4d}t||t|S)zAExtended globbing function that supports ** and {opt1,opt2,opt3}.z7invalid glob %r: recursive glob "**" must be used alonez2invalid glob %r: mismatching set marker '{' or '}')_CHECK_RECURSIVE_GLOBr>r_CHECK_MISMATCH_SET_iglob) path_globrr-r-r.r[s    rc cstj|d}t|dkrpt|dks,t||\}}}x|jdD](}x"tdj|||fD] }|Vq\WqBWnd|krxt|D] }|VqWn|jdd\}}|dkrd}|dkrd}n|jd}|jd }xHtj |D]:\}}} tj j |}x"ttj j||D] } | VqWqWdS) NrrrBrz**r/rlrb\) RICH_GLOBrrgrfrr$ std_iglobr%rcrrdr) r rich_path_globrrrrpitemrdradicaldirr rr-r-r.rfs*       r) HTTPSHandlermatch_hostnameCertificateErrorc@seZdZdZdZddZdS)HTTPSConnectionNTc CsZtj|j|jf|j}t|ddr0||_|jtt dsp|j rHt j }nt j }t j ||j|j|t j|j d|_nt jt j}tt dr|jt jO_|jr|j|j|ji}|j rt j |_|j|j dtt ddr|j|d<|j |f||_|j o|jrVy$t|jj|jtjd |jWn0tk rT|jjtj|jjYnXdS) N _tunnel_hostF SSLContext) cert_reqs ssl_versionca_certs OP_NO_SSLv2)cafileHAS_SNIserver_hostnamezHost verified: %s) rcreate_connectionhostporttimeoutr~sock_tunnelr|sslr CERT_REQUIRED CERT_NONE wrap_socketkey_file cert_filePROTOCOL_SSLv23roptionsrload_cert_chain verify_modeload_verify_locations check_domainr getpeercertrrrshutdown SHUT_RDWRr)rr"rcontextrr-r-r.connects@       zHTTPSConnection.connect)rrrrr/r4r-r-r-r.rsrc@s&eZdZd ddZddZddZdS) rTcCstj|||_||_dS)N)BaseHTTPSHandlerrrr/)rrr/r-r-r.rs zHTTPSHandler.__init__cOs$t||}|jr |j|_|j|_|S)a This is called to create a connection instance. Normally you'd pass a connection class to do_open, but it doesn't actually check for a class, and just expects a callable. As long as we behave just as a constructor would have, we should be OK. If it ever changes so that we *must* pass a class, we'll create an UnsafeHTTPSConnection class which just sets check_domain to False in the class definition, and choose which one to pass to do_open. )rrr/)rrrr(r-r-r. _conn_makers zHTTPSHandler._conn_makercCsVy|j|j|Stk rP}z&dt|jkr>td|jnWYdd}~XnXdS)Nzcertificate verify failedz*Unable to verify server certificate for %s)do_openr6rstrreasonrr)rrYrxr-r-r. https_opens zHTTPSHandler.https_openN)T)rrrrr6r:r-r-r-r.rs rc@seZdZddZdS)HTTPSOnlyHandlercCstd|dS)NzAUnexpected HTTP request on what should be a secure connection: %s)r)rrYr-r-r. http_openszHTTPSOnlyHandler.http_openN)rrrr<r-r-r-r.r;sr;c@seZdZdddZdS)HTTPrNcKs&|dkr d}|j|j||f|dS)Nr)_setup_connection_class)rrr rr-r-r.rsz HTTP.__init__)rN)rrrrr-r-r-r.r?sr?c@seZdZdddZdS)HTTPSrNcKs&|dkr d}|j|j||f|dS)Nr)r@rA)rrr rr-r-r.rszHTTPS.__init__)rN)rrrrr-r-r-r.rBsrBc@seZdZdddZddZdS) TransportrcCs||_tjj||dS)N)r!rrCr)rr! use_datetimer-r-r.rszTransport.__init__cCsb|j|\}}}tdkr(t||jd}n6|j s>||jdkrT||_|tj|f|_|jd}|S)Nr=r>)r!rr)r=r>) get_host_info _ver_infor?r! _connection_extra_headersrHTTPConnection)rrhehx509r(r-r-r.make_connections zTransport.make_connectionN)r)rrrrrMr-r-r-r.rCs rCc@seZdZdddZddZdS) SafeTransportrcCs||_tjj||dS)N)r!rrNr)rr!rDr-r-r.r szSafeTransport.__init__cCsz|j|\}}}|si}|j|d<tdkr:t|df|}n<|j sP||jdkrl||_|tj|df|f|_|jd}|S)Nr!r=r>rr)r=r>)rEr!rFrBrGrHrr)rrrJrKrr(r-r-r.rMs    zSafeTransport.make_connectionN)r)rrrrrMr-r-r-r.rN s rNc@seZdZddZdS) ServerProxyc Kst|jdd|_}|dk r^t|\}}|jdd}|dkr@t}nt}|||d|d<}||_tjj ||f|dS)Nr!rDrhttps)rD transport) rjr!rrrrNrCrQrrOr) rr\rr!rWr_rDtclsr^r-r-r.r s  zServerProxy.__init__N)rrrrr-r-r-r.rOsrOcKs6tjddkr|d7}nd|d<d|d<t||f|S)Nrrbrnewlinezutf-8r)r}rr)rr rr-r-r. _csv_open4s  rUc@s4eZdZedededdZddZddZd S) CSVBaserB"r) delimiter quotecharlineterminatorcCs|S)Nr-)rr-r-r. __enter__FszCSVBase.__enter__cGs|jjdS)N)rr)rrFr-r-r.__exit__IszCSVBase.__exit__N)rrrr8defaultsr[r\r-r-r-r.rV?s  rVc@s(eZdZddZddZddZeZdS) CSVReadercKs\d|kr4|d}tjddkr,tjd|}||_nt|dd|_tj|jf|j|_dS)Nrrrzutf-8rdro) r}rrrrrUcsvrwr])rrrr-r-r.rNszCSVReader.__init__cCs|S)Nr-)rr-r-r.__iter__YszCSVReader.__iter__cCsJt|j}tjddkrFx,t|D] \}}t|ts"|jd||<q"W|S)Nrrzutf-8)nextrwr}rrZrrr)rr(r]rr-r-r.ra\s   zCSVReader.nextN)rrrrr`ra__next__r-r-r-r.r^Ms r^c@seZdZddZddZdS) CSVWritercKs$t|d|_tj|jf|j|_dS)Nr)rUrr_writerr])rrrr-r-r.rgs zCSVWriter.__init__cCsRtjddkrBg}x*|D]"}t|tr0|jd}|j|qW|}|jj|dS)Nrrzutf-8)r}rrrrr"rdwriterow)rrowrorr-r-r.reks   zCSVWriter.writerowN)rrrrrer-r-r-r.rcfsrccsHeZdZeejZded<d fdd ZddZdd Zd d Z Z S) Configurator inc_convertincNcs"tt|j||ptj|_dS)N)superrgrrcrro)rconfigro) __class__r-r.r~szConfigurator.__init__c sfddjd}t|s*j|}jdd}jdf}|r\tfdd|D}fddD}t|}|||}|rx$|jD]\}} t||| qW|S) Ncszt|ttfr*t|fdd|D}nLt|trld|krHj|}qvi}x(|D]}||||<qRWn j|}|S)Ncsg|] }|qSr-r-)rKr])convertr-r.rMszBConfigurator.configure_custom..convert..z())rr&rtypedictconfigure_customrm)or(r)rmrr-r.rms    z.Configurator.configure_custom..convertz()r/z[]csg|] }|qSr-r-)rKrq)rmr-r.rMsz1Configurator.configure_custom..cs$g|]}t|r||fqSr-)r)rKr)rkrmr-r.rMs)rjr;r5rrorsetattr) rrkrpropsrrrr(rgrHr-)rkrmrr.rps     zConfigurator.configure_customcCs4|j|}t|tr0d|kr0|j||j|<}|S)Nz())rkrrorp)rrr(r-r-r. __getitem__s zConfigurator.__getitem__c CsFtjj|stjj|j|}tj|ddd}tj|}WdQRX|S)z*Default converter for the inc:// protocol.rozutf-8)rN) rcrdisabsr$rorrrr)rrrr(r-r-r.rhs  zConfigurator.inc_convert)N) rrrrorvalue_convertersrrprtrh __classcell__r-r-)rlr.rgys  rgc@s*eZdZdZd ddZddZdd ZdS) SubprocessMixinzC Mixin for running subprocesses and capturing their output FNcCs||_||_dS)N)verboseprogress)rryrzr-r-r.rszSubprocessMixin.__init__cCsn|j}|j}xT|j}|sP|dk r0|||q|sBtjjdntjj|jdtjjqW|jdS)z Read lines from a subprocess' output stream and either pass to a progress callable (if specified) or write progress information to sys.stderr. Nr/zutf-8) rzryreadliner}stderrrrflushr)rrr3rzryr,r-r-r.rws zSubprocessMixin.readercKstj|ftjtjd|}tj|j|jdfd}|jtj|j|jdfd}|j|j |j |j |j dk r|j ddn|j rt jjd|S)N)stdoutr|r~)rrr|zdone.mainzdone. ) subprocessPopenPIPE threadingThreadrwr~r`r|waitr$rzryr}r)rcmdrrt1t2r-r-r. run_commands   zSubprocessMixin.run_command)FN)rrrrrrwrr-r-r-r.rxs rxcCstjdd|jS)z,Normalize a python package name a la PEP 503z[-_.]+r^)rasubr)rNr-r-r.normalize_namesr)NN)r)N)N)rrrrrrr)NT)rrrrrr)r=r>)r collectionsr contextlibr_globrr rrloggingrcrrarr$ ImportErrorrr}rrrrdummy_threadingrrrcompatrrrr r r r r rrrrrrrrrrrrr getLoggerrrrrrErDr5r<r9rVr#r>raryrrrrrrcontextmanagerrrrrrrrr5r6VERBOSEr=rrNrPrRrVrYr\Ircr_rhrjrkrqryr{r|r~rrrARCHIVE_EXTENSIONSrrrrr rrrrr5rrrr;rrFr?rBrCrNrOrUrVr^rcrgrxrr-r-r-r.s      \         Yy   /  8  )    ,H  6]    +)   7.