3 Ävh�ã@s°dZddlmZddlmZddlmZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlmZddlmZmZddlmZd d lmZd d „ZGd d„deƒZdS)zpupload_docs Implements a Distutils 'upload_docs' subcommand (upload documentation to PyPI's pythonhosted.org). é)Ústandard_b64encode)Úlog)ÚDistutilsOptionErrorN)Úsix)Ú http_clientÚurllib)Úiter_entry_pointsé)ÚuploadcCstjr dnd}|jd|ƒS)NÚsurrogateescapeÚstrictzutf-8)rÚPY3Úencode)ÚsÚerrors©rú!/usr/lib/python3.6/upload_docs.pyÚ_encodesrc@s‚eZdZdZdZdddejfddgZejZd d „Zd efgZ dd„Z dd„Z dd„Z dd„Z edd„ƒZedd„ƒZdd„ZdS)Ú upload_docszhttps://pypi.python.org/pypi/zUpload documentation to PyPIz repository=Úrzurl of repository [default: %s]ú show-responseNú&display full response text from serverú upload-dir=údirectory to uploadcCs$|jdkr xtddƒD]}dSWdS)Nzdistutils.commandsÚ build_sphinxT)Ú upload_dirr)ÚselfZeprrrÚ has_sphinx/s zupload_docs.has_sphinxrcCstj|ƒd|_d|_dS)N)r Úinitialize_optionsrÚ target_dir)rrrrr6s zupload_docs.initialize_optionscCsˆtj|ƒ|jdkrN|jƒr0|jdƒ}|j|_q`|jdƒ}tjj |j dƒ|_n|j dƒ|j|_d|j krtt jdƒ|jd|jƒdS)NrÚbuildZdocsrzpypi.python.orgz3Upload_docs command is deprecated. Use RTD instead.zUsing upload directory %s)r Úfinalize_optionsrrZget_finalized_commandZbuilder_target_dirrÚosÚpathÚjoinZ build_baseZensure_dirnameÚ repositoryrÚwarnÚannounce)rrr rrrr!;s        zupload_docs.finalize_optionsc Cs¼tj|dƒ}z |j|jƒxŽtj|jƒD]~\}}}||jkrT| rTd}t||jƒ‚xP|D]H}tjj||ƒ}|t |jƒd…j tjj ƒ} tjj| |ƒ} |j || ƒqZWq(WWd|j ƒXdS)NÚwz'no files found in upload directory '%s')ÚzipfileZZipFileZmkpathrr"Úwalkrr#r$ÚlenÚlstripÚsepÚwriteÚclose) rÚfilenameÚzip_fileÚrootÚdirsÚfilesZtmplÚnameZfullZrelativeÚdestrrrÚcreate_zipfileKs   zupload_docs.create_zipfilec Cslx|jƒD]}|j|ƒq Wtjƒ}|jjjƒ}tjj |d|ƒ}z|j |ƒ|j |ƒWdt j |ƒXdS)Nz%s.zip)Zget_sub_commandsZ run_commandÚtempfileZmkdtempÚ distributionÚmetadataÚget_namer"r#r$r7Ú upload_fileÚshutilZrmtree)rZcmd_nameZtmp_dirr5r1rrrÚrun[s  zupload_docs.runccs”|\}}d|}t|tƒs |g}xn|D]f}t|tƒrN|d|d7}|d}nt|ƒ}|Vt|ƒVdV|V|r&|dd…dkr&dVq&WdS) Nz* Content-Disposition: form-data; name="%s"z; filename="%s"rr s ó ó éÿÿÿÿ)Ú isinstanceÚlistÚtupler)ÚitemÚ sep_boundaryÚkeyÚvaluesÚtitleÚvaluerrrÚ _build_partis     zupload_docs._build_partc Csnd}d|}|d}|df}tj|j|d�}t||jƒƒ}tjj|ƒ}tj||ƒ} d|jdƒ} dj | ƒ| fS) z= Build up the MIME payload for the POST data s3--------------GHSKFJDLGDS7543FJKLFHRE75642756743254s --s--r@)rFz multipart/form-data; boundary=%sÚasciió) Ú functoolsÚpartialrKÚmapÚitemsÚ itertoolsÚchainÚ from_iterableÚdecoder$) ÚclsÚdataÚboundaryrFZ end_boundaryZ end_itemsZbuilderZ part_groupsÚpartsZ body_itemsÚ content_typerrrÚ_build_multipart}s  zupload_docs._build_multipartcCsPt|dƒ�}|jƒ}WdQRX|jj}d|jƒtjj|ƒ|fdœ}t|j d|j ƒ}t |ƒ}t j rn|jdƒ}d|}|j|ƒ\}} d|j} |j| tjƒtjj|jƒ\} } } }}}| rÈ| rÈ| sÌt‚| dkràtj| ƒ}n | d krôtj| ƒ}n td | ƒ‚d }yZ|jƒ|jd | ƒ| }|jd |ƒ|jdtt|ƒƒƒ|jd|ƒ|j ƒ|j!|ƒWn6t"j#k �r”}z|jt|ƒtj$ƒdSd}~XnX|j%ƒ}|j&dk�rÊd|j&|j'f} |j| tjƒnb|j&dk�r|j(dƒ}|dk�röd|jƒ}d|} |j| tjƒnd|j&|j'f} |j| tj$ƒ|j)�rLt*dd|jƒddƒdS)NÚrbZ doc_upload)z:actionr5Úcontentú:rLzBasic zSubmitting documentation to %sZhttpZhttpszunsupported schema ÚZPOSTz Content-typezContent-lengthZ AuthorizationéÈzServer response (%s): %si-ZLocationzhttps://pythonhosted.org/%s/zUpload successful. Visit %szUpload failed (%s): %sú-éK)+ÚopenÚreadr9r:r;r"r#ÚbasenamerZusernameZpasswordrrr rUr[r%r'rÚINFOrÚparseZurlparseÚAssertionErrorrZHTTPConnectionZHTTPSConnectionZconnectZ putrequestZ putheaderÚstrr+Z endheadersÚsendÚsocketÚerrorZERRORZ getresponseZstatusÚreasonZ getheaderZ show_responseÚprint)rr0Úfr]ÚmetarWZ credentialsZauthZbodyZctÚmsgZschemaZnetlocZurlZparamsZqueryZ fragmentsZconnrZÚerÚlocationrrrr<�s`              zupload_docs.upload_file)rNr)rNr)Ú__name__Ú __module__Ú __qualname__ZDEFAULT_REPOSITORYÚ descriptionr Z user_optionsZboolean_optionsrZ sub_commandsrr!r7r>Ú staticmethodrKÚ classmethodr[r<rrrrrs"    r)Ú__doc__Úbase64rZ distutilsrZdistutils.errorsrr"rkr)r8r=rRrNZsetuptools.externrZsetuptools.extern.six.movesrrZ pkg_resourcesrr rrrrrrÚs