abc@sddlZddlZddlZddlZddlZddlZyddlmZWn!ek rddl mZnXddl m Z ddl m Z mZmZmZmZmZddlmZmZmZejeZdZdZd efd YZdS( iN(tThreadi(tDistlibException(tHTTPBasicAuthHandlertRequesttHTTPPasswordMgrturlparset build_openert string_types(tcached_propertytzip_dirt ServerProxyshttps://pypi.python.org/pypitpypit PackageIndexcBseZdZdZddZdZdZdZdZ dZ dZ dd Z dd Z dd Zddd d ddZdZddZddZdddZdZdZddZRS(sc This class represents a package index compatible with PyPI, the Python Package Index. s.----------ThIs_Is_tHe_distlib_index_bouNdaRY_$c Cs|p t|_|jt|j\}}}}}}|sX|sX|sX|d krntd|jnd |_d |_d |_d |_ d |_ t t j dj}x`d D]X} y>tj| dgd|d |} | d kr| |_PnWqtk rqXqWWd QXd S(s Initialise an instance. :param url: The URL of the index. If not specified, the URL for PyPI is used. thttpthttpssinvalid repository: %stwtgpgtgpg2s --versiontstdouttstderriN(R R(RR(t DEFAULT_INDEXturltread_configurationRRtNonetpassword_handlert ssl_verifierRtgpg_homet rpc_proxytopentostdevnullt subprocesst check_calltOSError( tselfRtschemetnetloctpathtparamstquerytfragtsinktstrc((s=/usr/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyt__init__$s( !          cCs3ddlm}ddlm}|}||S(ss Get the distutils command for interacting with PyPI configurations. :return: the command. i(t Distribution(t PyPIRCCommand(tdistutils.coreR-tdistutils.configR.(R"R-R.td((s=/usr/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyt_get_pypirc_commandBs cCsy|j}|j|_|j}|jd|_|jd|_|jdd|_|jd|j|_dS(s Read the PyPI access configuration as supported by distutils, getting PyPI to do the actual work. This populates ``username``, ``password``, ``realm`` and ``url`` attributes from the configuration. tusernametpasswordtrealmR t repositoryN(R2RR6t _read_pypirctgetR3R4R5(R"tctcfg((s=/usr/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyRLs   cCs0|j|j}|j|j|jdS(s 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(tcheck_credentialsR2t _store_pypircR3R4(R"R9((s=/usr/lib/python2.7/site-packages/pip/_vendor/distlib/index.pytsave_configuration[s  cCs|jdks|jdkr-tdnt}t|j\}}}}}}|j|j||j|jt ||_ dS(sp Check that ``username`` and ``password`` have been set, and raise an exception if not. s!username and password must be setN( R3RR4RRRRt add_passwordR5RR(R"tpmt_R$((s=/usr/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyR;gs  !cCs|j|j|j}d|d<|j|jg}|j|}d|d<|j|jg}|j|S(sq 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. tverifys:actiontsubmit(R;tvalidatettodicttencode_requesttitemst send_request(R"tmetadataR1trequesttresponse((s=/usr/lib/python2.7/site-packages/pip/_vendor/distlib/index.pytregisterss     cCsjxYtr[|j}|sPn|jdj}|j|tjd||fqW|jdS(sr 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. sutf-8s%s: %sN(tTruetreadlinetdecodetrstriptappendtloggertdebugtclose(R"tnametstreamtoutbufR*((s=/usr/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyt_readers   cCs|jdddg}|dkr-|j}n|rI|jd|gn|dk rn|jdddgntj}tjj|tjj |d}|jd d d |d ||gt j d dj|||fS(s 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. :param keystore: The path to a directory which contains the keys used in verification. If not specified, the instance's ``gpg_home`` attribute is used instead. :return: The signing command as a list suitable to be passed to :class:`subprocess.Popen`. s --status-fdt2s--no-ttys --homedirs--batchs--passphrase-fdt0s.ascs --detach-signs--armors --local-users--outputs invoking: %st N( RRRtextendttempfiletmkdtempRR%tjointbasenameRQRR(R"tfilenametsignert sign_passwordtkeystoretcmdttdtsf((s=/usr/lib/python2.7/site-packages/pip/_vendor/distlib/index.pytget_sign_commands    %c Cs itjd6tjd6}|dk r6tj|d        c Cs|jtjj|s/td|ntjj|d}tjj|sitd|n|j|j|j }}t |j }d d|fd|fg}d||fg}|j ||} |j | S( s2 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. snot a directory: %rs index.htmls not found: %rs:actiont doc_uploadRTtversionR(s:actionR(R;RR%tisdirRR^RRCRTRR tgetvalueRERG( R"RHtdoc_dirtfnRTRtzip_datatfieldsRRI((s=/usr/lib/python2.7/site-packages/pip/_vendor/distlib/index.pytupload_documentation)s  cCs||jdddg}|dkr-|j}n|rI|jd|gn|jd||gtjddj||S( s| 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. :param keystore: The path to a directory which contains the keys used in verification. If not specified, the instance's ``gpg_home`` attribute is used instead. :return: The verifying command as a list suitable to be passed to :class:`subprocess.Popen`. s --status-fdRXs--no-ttys --homedirs--verifys invoking: %sRZN(RRRR[RQRRR^(R"tsignature_filenamet data_filenameRcRd((s=/usr/lib/python2.7/site-packages/pip/_vendor/distlib/index.pytget_verify_commandEs  cCsn|jstdn|j|||}|j|\}}}|dkrdtd|n|dkS(s6 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. :param keystore: The path to a directory which contains the keys used in verification. If not specified, the instance's ``gpg_home`` attribute is used instead. :return: True if the signature was verified, else False. s0verification unavailable because gpg unavailableiis(verify command failed with error code %s(ii(RRRRv(R"RRRcRdR+RR((s=/usr/lib/python2.7/site-packages/pip/_vendor/distlib/index.pytverify_signature]s     cCs |d kr"d }tjdnMt|ttfrF|\}}nd}tt|}tjd|t|d}|j t |}z|j } d} d} d} d} d| krt | d } n|r|| | | nxyt rp|j| }|sPn| t|7} |j||rJ|j|n| d 7} |r|| | | qqWWd |jXWd QX| dkr| | krtd | | fn|r|j}||krtd ||||fntjd|nd S(s 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. sNo digest specifiedRsDigest specified: %stwbi iiscontent-lengthsContent-LengthiNs1retrieval incomplete: got only %d out of %d bytess.%s digest mismatch for %s: expected %s, got %ssDigest verified: %s(RRQRRt isinstancetlistttupletgetattrRRRGRtinfotintRLRtlenRnRRSRR(R"Rtdestfiletdigestt reporthooktdigesterthashertdfptsfptheaderst blocksizetsizeRtblocknumtblocktactual((s=/usr/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyt download_filevsV        cCsWg}|jr"|j|jn|jr>|j|jnt|}|j|S(s 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). (RRPRRR(R"treqthandlerstopener((s=/usr/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyRGs   cCs<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( s& 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--s)Content-Disposition: form-data; name="%s"sutf-8ts8Content-Disposition: form-data; name="%s"; filename="%s"s smultipart/form-data; boundary=s Content-typesContent-length( tboundaryRRRR[RwR^tstrRRR(R"RRtpartsRtktvaluestvtkeyR`tvaluetbodytctR((s=/usr/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyREs4      cCsbt|tri|d6}n|jdkrIt|jdd|_n|jj||p^dS(NRTttimeoutg@tand(RRRRR Rtsearch(R"ttermstoperator((s=/usr/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyRs N(t__name__t __module__t__doc__RRR,R2RR=R;RKRWRgRvRyRRRRRRGRER(((s=/usr/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyR s*      # 8   M  +(RtloggingRRRR\t threadingRt ImportErrortdummy_threadingRRtcompatRRRRRRtutilRR R t getLoggerRRQRt DEFAULT_REALMtobjectR (((s=/usr/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyts       .