B
    ØÓY\  ã               @   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}|  d|¡S )NÚsurrogateescapeÚstrictzutf-8)r   ÚPY3Úencode)ÚsÚerrors© r   ú=lib/python3.7/site-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 kr xtddƒD ]}dS W 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   6   s    
zupload_docs.initialize_optionsc             C   sˆ   t  | ¡ | jd krN|  ¡ r0|  d¡}|j| _q`|  d¡}tj 	|j
d¡| _n|  d¡ | j| _d| jk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   ;   s    







zupload_docs.finalize_optionsc             C   sº   t  |d¡}zž|  | j¡ xŒt | j¡D ]|\}}}|| jkrR|sRd}t|| j ƒ‚xP|D ]H}tj ||¡}|t	| jƒd …  
tjj¡}	tj |	|¡}
| ||
¡ qXW q(W W d | ¡  X 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fullZrelativeÚdestr   r   r   Úcreate_zipfileK   s    
zupload_docs.create_zipfilec          	   C   sl   x|   ¡ D ]}|  |¡ q
W t ¡ }| jj ¡ }tj 	|d| ¡}z|  
|¡ |  |¡ W d t |¡ X d S )Nz%s.zip)Zget_sub_commandsZrun_commandÚtempfileZmkdtempÚdistributionÚmetadataÚget_namer   r   r    r3   Úupload_fileÚshutilZrmtree)r   Zcmd_nameZtmp_dirr1   r-   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|| ¡ ƒ}tj |¡}t ||¡}	d| d¡ }
d 	|	¡|
fS )	z=
        Build up the MIME payload for the POST data
        s3   --------------GHSKFJDLGDS7543FJKLFHRE75642756743254s   
--s   --r=   )rB   z multipart/form-data; boundary=%sÚasciió    )
Ú	functoolsÚpartialrG   ÚmapÚitemsÚ	itertoolsÚchainÚfrom_iterableÚdecoder    )ÚclsÚdataÚboundaryrB   Zend_boundaryZ	end_itemsZbuilderZpart_groupsÚpartsZ
body_itemsÚcontent_typer   r   r   Ú_build_multipart}   s    zupload_docs._build_multipartc          
   C   sD  t |dƒ}| ¡ }W d Q R X | jj}d| ¡ tj |¡|fdœ}t| j	d | j
 ƒ}t|ƒ}tjrn| d¡}d| }|  |¡\}}	d| j }
|  |
tj¡ tj | j¡\}}}}}}|sÂ|sÂ|rÆt‚|dkrÚt |¡}n |d	krît |¡}ntd
| ƒ‚d}yZ| ¡  | d|¡ |	}| d|¡ | dtt|ƒƒ¡ | d|¡ |  ¡  | !|¡ W n8 t"j#k
r } z|  t|ƒtj$¡ d S d }~X Y nX | %¡ }|j&dkrÆd|j&|j'f }
|  |
tj¡ nb|j&dkr
| (d¡}|d kròd| ¡  }d| }
|  |
tj¡ nd|j&|j'f }
|  |
tj$¡ | j)r@t*d| ¡ dƒ d S )NÚrbZ
doc_upload)z:actionr1   Úcontentú:rH   zBasic zSubmitting documentation to %sZ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Úreadr5   r6   r7   r   r   Úbasenamer   ZusernameZpasswordr   r   r   rQ   rW   r!   r#   r   ÚINFOr   ÚparseZurlparseÚAssertionErrorr   ZHTTPConnectionZHTTPSConnectionZconnectZ
putrequestZ	putheaderÚstrr'   Z
endheadersÚsendÚsocketÚerrorZERRORZgetresponseZstatusÚreasonZ	getheaderZshow_responseÚprint)r   r,   ÚfrY   ÚmetarS   ZcredentialsZauthZbodyZctÚmsgZschemaZnetlocZurlZparamsZqueryZ	fragmentsZconnrV   Úer   Úlocationr   r   r   r8      s`    



zupload_docs.upload_fileN)Ú__name__Ú
__module__Ú__qualname__ZDEFAULT_REPOSITORYZdescriptionr
   Zuser_optionsZboolean_optionsr   Zsub_commandsr   r   r3   r:   ÚstaticmethodrG   ÚclassmethodrW   r8   r   r   r   r   r      s    

r   )Ú__doc__Úbase64r   Z	distutilsr   Zdistutils.errorsr   r   re   r%   r4   r9   rN   rJ   Zsetuptools.externr   Zsetuptools.extern.six.movesr   r   Zpkg_resourcesr   r
   r   r   r   r   r   r   Ú<module>   s    