a
    –Î`ï  ã                   @   s¤   d Z ddlmZ ddlmZ ddlmZ ddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlmZ ddlmZ d	d
„ ZG dd„ deƒZdS )zpupload_docs

Implements a Distutils 'upload_docs' subcommand (upload documentation to
PyPI's pythonhosted.org).
é    )Ústandard_b64encode)Úlog)ÚDistutilsOptionErrorN)Úiter_entry_pointsé   )Úuploadc                 C   s   |   dd¡S )Nzutf-8Úsurrogateescape)Úencode)Ús© r   ú@/usr/lib/python3/dist-packages/setuptools/command/upload_docs.pyÚ_encode   s    r   c                   @   s‚   e Zd ZdZdZdddej fddgZejZdd	„ Zd
efgZ	dd„ Z
dd„ Zdd„ Zdd„ Zedd„ ƒZedd„ ƒZdd„ ZdS )Úupload_docszhttps://pypi.python.org/pypi/zUpload documentation to PyPIzrepository=Úrzurl of repository [default: %s])zshow-responseNz&display full response text from server)zupload-dir=Nzdirectory to uploadc                 C   s"   | j d u rtddƒD ]} dS d S )Nzdistutils.commandsÚbuild_sphinxT)Ú
upload_dirr   )ÚselfZepr   r   r   Ú
has_sphinx-   s    
zupload_docs.has_sphinxr   c                 C   s   t  | ¡ d | _d | _d S )N)r   Úinitialize_optionsr   Ú
target_dir)r   r   r   r   r   4   s    
zupload_docs.initialize_optionsc                 C   sˆ   t  | ¡ | jd u rN|  ¡ r0|  d¡}|j| _q`|  d¡}tj 	|j
d¡| _n|  d¡ | j| _d| jv rtt d¡ |  d| j ¡ d S )Nr   ÚbuildZdocsr   zpypi.python.orgz3Upload_docs command is deprecated. Use RTD instead.zUsing upload directory %s)r   Úfinalize_optionsr   r   Zget_finalized_commandZbuilder_target_dirr   ÚosÚpathÚjoinZ
build_baseZensure_dirnameÚ
repositoryr   ÚwarnÚannounce)r   r   r   r   r   r   r   9   s    







zupload_docs.finalize_optionsc                 C   sº   t  |d¡}zž|  | j¡ t | j¡D ]x\}}}|| jkrP|sPd}t|| j ƒ‚|D ]H}tj ||¡}|t	| jƒd …  
tjj¡}	tj |	|¡}
| ||
¡ qTq&W | ¡  n
| ¡  0 d S )NÚwz'no files found in upload directory '%s')ÚzipfileZZipFileZmkpathr   r   Úwalkr   r   r   ÚlenÚlstripÚsepÚwriteÚclose)r   ÚfilenameÚzip_fileÚrootÚdirsÚfilesZtmplÚnameZfullÚrelativeÚdestr   r   r   Úcreate_zipfileI   s    zupload_docs.create_zipfilec              	   C   sr   |   ¡ D ]}|  |¡ qt ¡ }| jj ¡ }tj 	|d| ¡}z"|  
|¡ |  |¡ W t |¡ nt |¡ 0 d S )Nz%s.zip)Zget_sub_commandsZrun_commandÚtempfileZmkdtempÚdistributionÚmetadataÚget_namer   r   r   r.   Úupload_fileÚshutilZrmtree)r   Zcmd_nameZtmp_dirr+   r'   r   r   r   ÚrunY   s    
zupload_docs.runc                 c   s   | \}}d| }t |tƒs |g}|D ]f}t |tƒrL|d|d  7 }|d }nt|ƒ}|V  t|ƒV  dV  |V  |r$|dd … dkr$dV  q$d S )	Nz*
Content-Disposition: form-data; name="%s"z; filename="%s"r   r   s   

éÿÿÿÿó   ó   
)Ú
isinstanceÚlistÚtupler   )ÚitemÚsep_boundaryÚkeyÚvaluesÚtitleÚvaluer   r   r   Ú_build_partg   s    



zupload_docs._build_partc                 C   sn   d}d|  d¡ }|d }|df}tj| j|d}t|| ¡ ƒ}tj |¡}t ||¡}	d| }
d 	|	¡|
fS )	z=
        Build up the MIME payload for the POST data
        z3--------------GHSKFJDLGDS7543FJKLFHRE75642756743254s   
--Úasciis   --r8   )r=   z multipart/form-data; boundary=%só    )
r	   Ú	functoolsÚpartialrB   ÚmapÚitemsÚ	itertoolsÚchainÚfrom_iterabler   )ÚclsÚdataÚboundaryr=   Zend_boundaryZ	end_itemsZbuilderZpart_groupsÚpartsZ
body_itemsÚcontent_typer   r   r   Ú_build_multipart{   s    þzupload_docs._build_multipartc              
   C   sV  t |dƒ}| ¡ }W d   ƒ n1 s(0    Y  | jj}d| ¡ tj |¡|fdœ}t| j	d | j
 ƒ}t|ƒ d¡}d| }|  |¡\}}	d| j }
|  |
tj¡ tj | j¡\}}}}}}|sÌ|sÌ|rÐJ ‚|dkrætj |¡}n"|d	krütj |¡}ntd
| ƒ‚d}zZ| ¡  | d|¡ |	}| d|¡ | dtt|ƒƒ¡ | d|¡ | ¡  |  |¡ W n< t!j"y¢ } z |  t|ƒtj#¡ W Y d }~d S d }~0 0 | $¡ }|j%dkrØd|j%|j&f }
|  |
tj¡ nb|j%dkr| 'd¡}|d u rd| ¡  }d| }
|  |
tj¡ nd|j%|j&f }
|  |
tj#¡ | j(rRt)d| ¡ dƒ d S )NÚrbZ
doc_upload)z:actionr+   Úcontentú:rC   zBasic zSubmitting documentation to %sÚhttpZhttpszunsupported schema Ú ZPOSTzContent-typezContent-lengthZAuthorizationéÈ   zServer response (%s): %si-  ZLocationzhttps://pythonhosted.org/%s/zUpload successful. Visit %szUpload failed (%s): %szK---------------------------------------------------------------------------)*ÚopenÚreadr0   r1   r2   r   r   Úbasenamer   ZusernameZpasswordr   ÚdecoderQ   r   r   r   ÚINFOÚurllibÚparseZurlparserU   ZclientZHTTPConnectionZHTTPSConnectionÚAssertionErrorZconnectZ
putrequestZ	putheaderÚstrr!   Z
endheadersÚsendÚsocketÚerrorZERRORZgetresponseZstatusÚreasonZ	getheaderZshow_responseÚprint)r   r&   ÚfrS   ÚmetarM   ZcredentialsZauthÚbodyZctÚmsgZschemaZnetlocZurlÚparamsZqueryZ	fragmentsZconnrP   Úer   Úlocationr   r   r   r3   Ž   s`    &ý
ÿ

zupload_docs.upload_fileN)Ú__name__Ú
__module__Ú__qualname__ZDEFAULT_REPOSITORYZdescriptionr   Zuser_optionsZboolean_optionsr   Zsub_commandsr   r   r.   r5   ÚstaticmethodrB   ÚclassmethodrQ   r3   r   r   r   r   r      s(   ÿû


r   )Ú__doc__Úbase64r   Z	distutilsr   Zdistutils.errorsr   r   rb   r   r/   r4   rI   rE   Zhttp.clientrU   Zurllib.parser]   Zpkg_resourcesr   r   r   r   r   r   r   r   Ú<module>   s    