0{YL @sddlZddlZddlZddlZddlZddlZyddlmZWn"ek rddl mZYnXddl m Z ddl m Z mZmZmZmZmZddlmZmZmZejeZdZdZGd d d eZdS) N)Thread)DistlibException)HTTPBasicAuthHandlerRequestHTTPPasswordMgrurlparse build_opener string_types)cached_propertyzip_dir ServerProxyzhttps://pypi.python.org/pypipypic@seZdZdZdZdddZddZdd Zd d Zd d Z ddZ ddZ ddZ dddZ ddZddddddZddZddZd d!Zddd"d#Zd$d%Zd&d'Zdd(d)ZdS)* PackageIndexzc This class represents a package index compatible with PyPI, the Python Package Index. s.----------ThIs_Is_tHe_distlib_index_bouNdaRY_$Nc Cs|p t|_|jt|j\}}}}}}|sX|sX|sX|d krntd|jnd|_d|_d|_d|_d|_ t t j dk}xad D]Y} y>t j| dgd |d |} | d kr| |_PnWqtk rYqXqWWdQXdS)z Initialise an instance. :param url: The URL of the index. If not specified, the URL for PyPI is used. httphttpszinvalid repository: %sNwgpg2gpgz --versionstdoutstderrr)zhttpzhttps)rzgpg) DEFAULT_INDEXurlread_configurationrrpassword_handler ssl_verifierrgpg_home rpc_proxyopenosdevnull subprocess check_callOSError) selfrschemenetlocpathparamsqueryfragZsinksrcr-4/tmp/pip-ok8sy_ze-build/pip/_vendor/distlib/index.py__init__$s( !          zPackageIndex.__init__cCs3ddlm}ddlm}|}||S)zs Get the distutils command for interacting with PyPI configurations. :return: the command. r) Distribution) PyPIRCCommand)distutils.corer0distutils.configr1)r$r0r1dr-r-r._get_pypirc_command@s z PackageIndex._get_pypirc_commandcCsy|j}|j|_|j}|jd|_|jd|_|jdd|_|jd|j|_dS)z Read the PyPI access configuration as supported by distutils, getting PyPI to do the acutal work. This populates ``username``, ``password``, ``realm`` and ``url`` attributes from the configuration. usernamepasswordrealmr repositoryN)r5rr9 _read_pypircgetr6r7r8)r$ccfgr-r-r.rJs   zPackageIndex.read_configurationcCs0|j|j}|j|j|jdS)z Save the PyPI access configuration. You must have set ``username`` and ``password`` attributes before calling this method. Again, distutils is used to do the actual work. N)check_credentialsr5 _store_pypircr6r7)r$r<r-r-r.save_configurationYs  zPackageIndex.save_configurationcCs|jdks|jdkr-tdnt}t|j\}}}}}}|j|j||j|jt||_ dS)zp Check that ``username`` and ``password`` have been set, and raise an exception if not. Nz!username and password must be set) r6r7rrrr add_passwordr8rr)r$Zpm_r&r-r-r.r>es  !zPackageIndex.check_credentialscCs|j|j|j}d|d<|j|jg}|j|}d|d<|j|jg}|j|S)aq Register a distribution on PyPI, using the provided metadata. :param metadata: A :class:`Metadata` instance defining at least a name and version number for the distribution to be registered. :return: The HTTP response received from PyPI upon submission of the request. verifyz:actionZsubmit)r>validatetodictencode_requestitems send_request)r$metadatar4requestresponser-r-r.registerqs     zPackageIndex.registercCsdxS|j}|sPn|jdj}|j|tjd||fqW|jdS)ar Thread runner for reading lines of from a subprocess into a buffer. :param name: The logical name of the stream (used for logging only). :param stream: The stream to read from. This will typically a pipe connected to the output stream of a subprocess. :param outbuf: The list to append the read lines to. zutf-8z%s: %sN)readlinedecoderstripappendloggerdebugclose)r$namestreamZoutbufr+r-r-r._readers   zPackageIndex._readercCs|jdddg}|jr7|jd|jgn|dk r\|jdddgntj}tjj|tjj|d }|jd d d |d ||gt j ddj|||fS)a Return a suitable command for signing a file. :param filename: The pathname to the file to be signed. :param signer: The identifier of the signer of the file. :param sign_password: The passphrase for the signer's private key used for signing. :return: The signing command as a list suitable to be passed to :class:`subprocess.Popen`. z --status-fd2z--no-ttyz --homedirNz--batchz--passphrase-fd0z.ascz --detach-signz--armorz --local-userz--outputz invoking: %s ) rrextendtempfilemkdtemprr'joinbasenamerQrR)r$filenamesigner sign_passwordcmdtdZsfr-r-r.get_sign_commands    %zPackageIndex.get_sign_commandc Cs itjd6tjd6}|dk r6tj|drr'existsrrDrErrQwarningrurreadhashlibmd5 hexdigestsha256updater^rPshutilrmtreedirnamerFrGrH)r$rIr_r`rarzr{r4rtfZ file_datar|r}filesZsig_datarJr-r-r. upload_files<       zPackageIndex.upload_filec Cs|jtjj|s/td|ntjj|d}tjj|sitd|n|j|j|j }}t |j }d d|fd|fg}d||fg}|j ||} |j | S) a2 Upload documentation to the index. :param metadata: A :class:`Metadata` instance defining at least a name and version number for the documentation to be uploaded. :param doc_dir: The pathname of the directory which contains the documentation. This should be the directory that contains the ``index.html`` for the documentation. :return: The HTTP response received from PyPI upon submission of the request. znot a directory: %rz index.htmlz not found: %r:action doc_uploadrTversionr~)rr)r>rr'isdirrr]rrDrTrr getvaluerFrH) r$rIZdoc_dirfnrTrzip_datafieldsrrJr-r-r.upload_documentations  z!PackageIndex.upload_documentationcCsj|jdddg}|jr7|jd|jgn|jd||gtjddj||S)a Return a suitable command for verifying a file. :param signature_filename: The pathname to the file containing the signature. :param data_filename: The pathname to the file containing the signed data. :return: The verifying command as a list suitable to be passed to :class:`subprocess.Popen`. z --status-fdrWz--no-ttyz --homedirz--verifyz invoking: %srY)rrrZrQrRr])r$signature_filename data_filenamerbr-r-r.get_verify_command5s  zPackageIndex.get_verify_commandcCsk|jstdn|j||}|j|\}}}|dkratd|n|dkS)a\ Verify a signature for a file. :param signature_filename: The pathname to the file containing the signature. :param data_filename: The pathname to the file containing the signed data. :return: True if the signature was verified, else False. z0verification unavailable because gpg unavailablerrz(verify command failed with error code %s)rr)rrrrr)r$rrrbr,rrr-r-r.verify_signatureGs   zPackageIndex.verify_signaturecCs|dkr"d}tjdnMt|ttfrF|\}}nd}tt|}tjd|t|d}|jt |}z|j } d} d} d} d} d | krt | d } n|r|| | | nxs|j | }|sPn| t |7} |j||rD|j|n| d7} |r|| | | qqWWd|jXWdQX| dkr| | krtd | | fn|r|j}||krtd ||||fntjd |ndS)a This is a convenience method for downloading a file from an URL. Normally, this will be a file from the index, though currently no check is made for this (i.e. a file can be downloaded from anywhere). The method is just like the :func:`urlretrieve` function in the standard library, except that it allows digest computation to be done during download and checking that the downloaded data matched any expected value. :param url: The URL of the file to be downloaded (assumed to be available via an HTTP GET request). :param destfile: The pathname where the downloaded file is to be saved. :param digest: If specified, this must be a (hasher, value) tuple, where hasher is the algorithm used (e.g. ``'md5'``) and ``value`` is the expected value. :param reporthook: The same as for :func:`urlretrieve` in the standard library. NzNo digest specifiedrzDigest specified: %swbi rrzcontent-lengthzContent-Lengthz1retrieval incomplete: got only %d out of %d bytesz.%s digest mismatch for %s: expected %s, got %szDigest verified: %s)rQrR isinstancelisttuplegetattrrrrHrinfointrlenrkrrSrr)r$rdestfiledigest reporthookZdigesterZhasherZdfpZsfpheaders blocksizesizerblocknumblockactualr-r-r. download_file[sV       zPackageIndex.download_filecCsWg}|jr"|j|jn|jr>|j|jnt|}|j|S)z Send a standard library :class:`Request` to PyPI and return its response. :param req: The request to send. :return: The HTTP response from PyPI (a standard library HTTPResponse). )rrPrr r)r$reqhandlersopenerr-r-r.rHs   zPackageIndex.send_requestcCs<g}|j}xy|D]q\}}t|ttfsC|g}nxA|D]9}|jd|d|jdd|jdfqJWqWxG|D]?\}} } |jd|d|| fjdd| fqW|jd|ddfdj|} d|} i| d6tt| d 6} t |j | | S) a& Encode fields and files for posting to an HTTP server. :param fields: The fields to send as a list of (fieldname, value) tuples. :param files: The files to send as a list of (fieldname, filename, file_bytes) tuple. s--z)Content-Disposition: form-data; name="%s"zutf-8z8Content-Disposition: form-data; name="%s"; filename="%s"s smultipart/form-data; boundary=z Content-typezContent-length) boundaryrrrrZrsr]strrrr)r$rrpartsrkvaluesvkeyr_valuebodyctrr-r-r.rFs4      zPackageIndex.encode_requestcCsbt|tri|d6}n|jdkrIt|jdd|_n|jj||p^dS)NrTtimeoutg@and)rr rr rsearch)r$Ztermsoperatorr-r-r.rs zPackageIndex.search)__name__ __module__ __qualname____doc__rr/r5rr@r>rLrVrdrrrurrrrrrHrFrr-r-r-r.rs*     # 4   M  +r)rloggingrrr!r[ threadingr ImportErrordummy_threadingrcompatrrrrr r utilr r r getLoggerrrQr DEFAULT_REALMobjectrr-r-r-r.s       .