a oeJ@sdZddlmZddlmZddlmZddlZddlZddl Z ddl Z ddl Z ddl Z ddl ZddlZddlmZddlmZd d lmZd d ZGd ddeZdS)z|upload_docs Implements a Distutils 'upload_docs' subcommand (upload documentation to sites other than PyPi such as devpi). )standard_b64encode)log)DistutilsOptionErrorN)metadata)SetuptoolsDeprecationWarning)uploadcCs |ddS)Nzutf-8surrogateescape)encode)sr ?C:\Program Files\Certbot\pkgs\setuptools\command\upload_docs.py_encodesrc@seZdZdZdZdddejfddgZejZdd Zd efgZ d d Z d dZ ddZ ddZ eddZeddZddZdS) upload_docszhttps://pypi.python.org/pypi/z;Upload documentation to sites other than PyPi such as devpiz repository=rzurl of repository [default: %s])z show-responseNz&display full response text from server)z upload-dir=Nzdirectory to uploadcCst|jduotjdddS)Nzdistutils.commands build_sphinx)groupname)bool upload_dirrZ entry_pointsselfr r r has_sphinx/s  zupload_docs.has_sphinxrcCst|d|_d|_dS)N)r initialize_optionsr target_dirrr r rr7s zupload_docs.initialize_optionscCstdt||jdur`|rB|d}t|jd|_ qr|d}t j |j d|_ n|d|j|_ |d|j dS)NzWUpload_docs command is deprecated. Use Read the Docs (https://readthedocs.org) instead.rZhtmlbuildZdocsrzUsing upload directory %s)rwarnr finalize_optionsrrZget_finalized_commanddictZbuilder_target_dirsrospathjoinZ build_baseZensure_dirnameannounce)rrrr r rr<s     zupload_docs.finalize_optionsc Cst|d}z||jt|jD]x\}}}||jkrP|sPd}t||j|D]H}tj||}|t |jd tjj } tj| |} | || qTq&W| n | 0dS)Nwz'no files found in upload directory '%s')zipfileZipFileZmkpathrr walkrr!r"lenlstripsepwriteclose) rfilenamezip_filerootdirsfilesZtmplrZfullrelativedestr r rcreate_zipfileNs  zupload_docs.create_zipfilec Cstjdddd|D]}||qt}|jj}t j |d|}z"| || |Wt|n t|0dS)NzDeprecated commanda upload_docs is deprecated and will be removed in a future version. Instead, use tools like devpi and Read the Docs; or lower level tools like httpie and curl to interact directly with your hosting service API. )i )Zdue_datez%s.zip)remitZget_sub_commandsZ run_commandtempfileZmkdtemp distributionrget_namer r!r"r4 upload_fileshutilrmtree)rZcmd_nameZtmp_dirrr.r r rrun^s     zupload_docs.runccs|\}}d|}t|ts |g}|D]f}t|trL|d|d7}|d}nt|}|Vt|VdV|V|r$|dddkr$dVq$dS) Nz* Content-Disposition: form-data; name="%s"z; filename="%s"rrs   ) isinstancelisttupler)item sep_boundarykeyvaluestitlevaluer r r _build_partvs    zupload_docs._build_partc Csnd}d|d}|d}|df}tj|j|d}t||}tj|}t||} d|} d | | fS) z= Build up the MIME payload for the POST data z3--------------GHSKFJDLGDS7543FJKLFHRE75642756743254s --asciis--rA)rFz multipart/form-data; boundary=%s) r functoolspartialrKmapitems itertoolschain from_iterabler") clsdataboundaryrFZ end_boundaryZ end_itemsZbuilderZ part_groupspartsZ body_items content_typer r r_build_multiparts  zupload_docs._build_multipartc CsTt|d}|}Wdn1s(0Y|jj}d|tj||fd}t|j d|j }t | d}d|}| |\}} d|j} || tjtj|j\} } } }}}|s|s|rJ| dkrtj| }n"| d krtj| }n td | d }zZ||d | | }|d ||dtt||d||| |Wn:t!y}z |t|tj"WYd}~dSd}~00|#}|j$dkrd|j$|j%f} || tjnb|j$dkr|&d}|durd|}d|} || tjnd|j$|j%f} || tj"|j'rPt(d|ddS)NrbZ doc_upload)z:actionrcontent:rLzBasic zSubmitting documentation to %shttphttpszunsupported schema ZPOSTz Content-typezContent-lengthZ AuthorizationzServer response (%s): %si-ZLocationzhttps://pythonhosted.org/%s/zUpload successful. Visit %szUpload failed (%s): %szK---------------------------------------------------------------------------))openreadr9rr:r r!basenamerusernamepasswordrdecoderZZ repositoryr#rINFOurllibparseurlparser^ZclientZHTTPConnectionZHTTPSConnectionAssertionErrorZconnectZ putrequestZ putheaderstrr(Z endheaderssendOSErrorZERRORZ getresponsestatusreasonZ getheaderZ show_responseprint)rr-fr\metarVZ credentialsZauthbodyZctmsgZschemanetlocurlparamsqueryZ fragmentsZconnrYerlocationr r rr;sb &          zupload_docs.upload_fileN)__name__ __module__ __qualname__ZDEFAULT_REPOSITORY descriptionr Z user_optionsZboolean_optionsrZ sub_commandsrrr4r> staticmethodrK classmethodrZr;r r r rrs*    r)__doc__base64rZ distutilsrZdistutils.errorsrr r%r8r<rRrNZ http.clientr^ urllib.parseriZ _importlibrwarningsrr rrr r r rs