a h@sdZddlmZddlmZddlmZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlmZddlmZd d ZGd d d eZdS) zpupload_docs Implements a Distutils 'upload_docs' subcommand (upload documentation to PyPI's pythonhosted.org). )standard_b64encode)log)DistutilsOptionErrorN)iter_entry_points)uploadcCs |ddS)Nzutf-8surrogateescape)encode)sr B/usr/lib/python3.9/site-packages/setuptools/command/upload_docs.py_encodesr c@seZdZdZdZdddejfddgZejZdd Zd efgZ d d Z d dZ ddZ ddZ eddZeddZddZdS) upload_docszhttps://pypi.python.org/pypi/zUpload documentation to PyPIz repository=rzurl of repository [default: %s])z show-responseNz&display full response text from server)z upload-dir=Nzdirectory to uploadcCs"|jdurtddD]}dSdS)Nzdistutils.commands build_sphinxT) upload_dirr)selfZepr r r has_sphinx-s zupload_docs.has_sphinxrcCst|d|_d|_dS)N)rinitialize_optionsr target_dir)rr r r r4s zupload_docs.initialize_optionscCst||jdurN|r0|d}|j|_q`|d}tj |j d|_n| d|j|_d|j vrtt d|d|jdS)NrbuildZdocsrzpypi.python.orgz3Upload_docs command is deprecated. Use RTD instead.zUsing upload directory %s)rfinalize_optionsrrZget_finalized_commandZbuilder_target_dirrospathjoinZ build_baseZensure_dirname repositoryrwarnannounce)rrrr r r r9s        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')zipfileZipFileZmkpathrrwalkrrrlenlstripsepwriteclose) rfilenamezip_filerootdirsfilesZtmplnameZfullrelativedestr r r create_zipfileIs  zupload_docs.create_zipfilec Csr|D]}||qt}|jj}tj |d|}z"| || |Wt |n t |0dS)Nz%s.zip)Zget_sub_commandsZ run_commandtempfileZmkdtemp distributionmetadataget_namerrrr/ upload_fileshutilrmtree)rZcmd_nameZtmp_dirr,r(r r r runYs     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_partgs    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--r:)r?z multipart/form-data; boundary=%s) r functoolspartialrDmapitems itertoolschain from_iterabler) clsdataboundaryr?Z end_boundaryZ end_itemsZbuilderZ part_groupspartsZ body_items content_typer r r _build_multipart{s  zupload_docs._build_multipartc CsFt|d}|}Wdn1s(0Y|jj}d|tj||fd}t|j d|j }t | d}d|}| |\}} d|j} || tjtj|j\} } } }}}| dkrtj| }n"| d krtj| }n td | d }zZ||d | | }|d ||dtt||d||| |Wn<t!j"y}z |t|tj#WYd}~dSd}~00|$}|j%dkrd|j%|j&f} || tjnb|j%dkr |'d}|durd|}d|} || tjnd|j%|j&f} || tj#|j(rBt)d|ddS)NrbZ doc_upload)z:actionr,content:rEzBasic zSubmitting documentation to %shttphttpszunsupported schema ZPOSTz Content-typezContent-lengthZ AuthorizationzServer response (%s): %si-ZLocationzhttps://pythonhosted.org/%s/zUpload successful. Visit %szUpload failed (%s): %szK---------------------------------------------------------------------------)*openreadr1r2r3rrbasenamer usernamepasswordrdecoderSrrrINFOurllibparseurlparserWZclientZHTTPConnectionZHTTPSConnectionAssertionErrorZconnectZ putrequestZ putheaderstrr"Z endheaderssendsocketerrorZERRORZ getresponsestatusreasonZ getheaderZ show_responseprint)rr'frUmetarOZ credentialsZauthbodyZctmsgZschemanetlocurlparamsqueryZ fragmentsZconnrRerlocationr r r r4s^ &           zupload_docs.upload_fileN)__name__ __module__ __qualname__ZDEFAULT_REPOSITORY descriptionrZ user_optionsZboolean_optionsrZ sub_commandsrrr/r7 staticmethodrD classmethodrSr4r r r r rs(   r)__doc__base64rZ distutilsrZdistutils.errorsrrrhrr0r5rKrGZ http.clientrW urllib.parserbZ pkg_resourcesrrr rr r r r s