3
yYði�  ã               @   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mZ ddlmZm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)Úsix)Úhttp_clientÚurllib)Úiter_entry_pointsé   )Úuploadc             C   s   t jr
dnd}| jd|ƒS )NÚsurrogateescapeÚstrictzutf-8)r   ÚPY3Úencode)ÚsÚerrors© r   úD/tmp/pip-build-ue6tjl93/setuptools/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]úshow-responseNú&display full response text from serverúupload-dir=údirectory to uploadc             C   s$   | j d kr xtddƒD ]}dS W d S )Nzdistutils.commandsÚbuild_sphinxT)Ú
upload_dirr   )ÚselfÚepr   r   r   Ú
has_sphinx/   s    
zupload_docs.has_sphinxr   c             C   s   t j| ƒ d | _d | _d S )N)r
   Úinitialize_optionsr   Ú
target_dir)r   r   r   r   r   6   s    
zupload_docs.initialize_optionsc             C   sˆ   t j| ƒ | jd krN| jƒ r0| jdƒ}|j| _q`| jdƒ}tjj	|j
dƒ| _n| jdƒ | j| _d| jkrttjdƒ | j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   Úget_finalized_commandZbuilder_target_dirr    ÚosÚpathÚjoinÚ
build_baseÚensure_dirnameÚ
repositoryr   ÚwarnÚannounce)r   r   r!   r   r   r   r"   ;   s    







zupload_docs.finalize_optionsc             C   s¼   t j|dƒ}z | j| jƒ xŽtj| jƒD ]~\}}}|| jkrT| rTd}t|| j ƒ‚xP|D ]H}tjj||ƒ}|t	| jƒd … j
tjjƒ}	tjj|	|ƒ}
|j||
ƒ qZW q(W W d |jƒ  X d S )NÚwz'no files found in upload directory '%s')ÚzipfileÚZipFileÚmkpathr    r$   Úwalkr   r%   r&   ÚlenÚlstripÚsepÚwriteÚclose)r   ÚfilenameÚzip_fileÚrootÚdirsÚfilesÚtmplÚnameÚfullZrelativeÚdestr   r   r   Úcreate_zipfileK   s    
zupload_docs.create_zipfilec             C   sl   x| j ƒ D ]}| j|ƒ q
W tjƒ }| jjjƒ }tjj	|d| ƒ}z| j
|ƒ | j|ƒ W d tj|ƒ X d S )Nz%s.zip)Úget_sub_commandsÚrun_commandÚtempfileÚmkdtempÚdistributionÚmetadataÚget_namer$   r%   r&   r?   Úupload_fileÚshutilÚrmtree)r   Úcmd_nameZtmp_dirr<   r7   r   r   r   Úrun[   s    
zupload_docs.runc             c   s”   | \}}d| }t |tƒs |g}xn|D ]f}t |tƒrN|d|d  7 }|d }nt|ƒ}|V  t|ƒV  dV  |V  |r&|dd … dkr&dV  q&W 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_parti   s    




zupload_docs._build_partc             C   sn   d}d| }|d }|df}t j| j|d�}t||jƒ ƒ}tjj|ƒ}tj||ƒ}	d|jdƒ }
dj	|	ƒ|
fS )	z=
        Build up the MIME payload for the POST data
        s3   --------------GHSKFJDLGDS7543FJKLFHRE75642756743254s   
--s   --rM   )rS   z multipart/form-data; boundary=%sÚasciió    )
Ú	functoolsÚpartialrX   ÚmapÚitemsÚ	itertoolsÚchainÚfrom_iterableÚdecoder&   )ÚclsÚdataÚboundaryrS   Zend_boundaryZ	end_itemsZbuilderZpart_groupsÚpartsZ
body_itemsÚcontent_typer   r   r   Ú_build_multipart}   s    zupload_docs._build_multipartc             C   sP  t |dƒ�}|jƒ }W d Q R X | jj}d|jƒ tjj|ƒ|fdœ}t| j	d | j
 ƒ}t|ƒ}tjrn|jdƒ}d| }| j|ƒ\}}	d| j }
| j|
tjƒ tjj| jƒ\}}}}}}| rÈ| rÈ| sÌt‚|dkràtj|ƒ}n |d	krôtj|ƒ}ntd
| ƒ‚d}yZ|jƒ  |jd|ƒ |	}|jd|ƒ |jdtt|ƒƒƒ |jd|ƒ |j ƒ  |j!|ƒ W n6 t"j#k
�r” } z| jt|ƒtj$ƒ d S d }~X nX |j%ƒ }|j&dk�rÊd|j&|j'f }
| j|
tjƒ nb|j&dk�r|j(dƒ}|d k�röd|jƒ  }d| }
| j|
tjƒ nd|j&|j'f }
| j|
tj$ƒ | j)�rLt*dd |jƒ dd ƒ d S )NÚrbZ
doc_upload)z:actionr<   Úcontentú:rY   zBasic zSubmitting documentation to %sÚhttpÚhttpszunsupported schema Ú ÚPOSTzContent-typezContent-lengthÚAuthorizationéÈ   zServer response (%s): %si-  ÚLocationzhttps://pythonhosted.org/%s/zUpload successful. Visit %szUpload failed (%s): %sú-éK   )+ÚopenÚreadrD   rE   rF   r$   r%   Úbasenamer   ÚusernameÚpasswordr   r   r   rb   rh   r)   r+   r   ÚINFOr   ÚparseÚurlparseÚAssertionErrorr   ÚHTTPConnectionÚHTTPSConnectionÚconnectÚ
putrequestÚ	putheaderÚstrr1   Ú
endheadersÚsendÚsocketÚerrorÚERRORÚgetresponseÚstatusÚreasonÚ	getheaderÚshow_responseÚprint)r   r6   Úfrj   Úmetard   ÚcredentialsÚauthÚbodyÚctÚmsgZschemaÚnetlocÚurlÚparamsÚqueryZ	fragmentsÚconnrg   Úer   Úlocationr   r   r   rG   �   s`    



zupload_docs.upload_file)r   Nr   )r   Nr   )Ú__name__Ú
__module__Ú__qualname__ÚDEFAULT_REPOSITORYÚdescriptionr
   Úuser_optionsÚboolean_optionsr   Úsub_commandsr   r"   r?   rK   ÚstaticmethodrX   Úclassmethodrh   rG   r   r   r   r   r      s"   
 
r   )Ú__doc__Úbase64r   Ú	distutilsr   Zdistutils.errorsr   r$   r†   r-   rB   rH   r_   r[   Zsetuptools.externr   Zsetuptools.extern.six.movesr   r   Úpkg_resourcesr   r
   r   r   r   r   r   r   Ú<module>   s    