U
    fJ                     @   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mZ ddlmZ d	d
lmZ dd ZG dd deZdS )z|upload_docs

Implements a Distutils 'upload_docs' subcommand (upload documentation to
sites other than PyPi such as devpi).
    )standard_b64encode)log)DistutilsOptionErrorN   )metadata)SetuptoolsDeprecationWarning   )uploadc                 C   s   |  ddS )Nzutf-8surrogateescape)encode)s r   =lib/python3.8/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 sites other than PyPi such as devpiz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   t | jd kotjdddS )Nzdistutils.commandsbuild_sphinx)groupname)bool
upload_dirr   Zentry_pointsselfr   r   r   
has_sphinx/   s    
zupload_docs.has_sphinxr   c                 C   s   t |  d | _d | _d S )N)r	   initialize_optionsr   
target_dirr   r   r   r   r   7   s    
zupload_docs.initialize_optionsc                 C   s   t d t|  | jd kr`|  rB| d}t|jd | _	qr| d}t
j|jd| _	n| d | j| _	| d| j	  d S )NzWUpload_docs command is deprecated. Use Read the Docs (https://readthedocs.org) instead.r   ZhtmlbuildZdocsr   zUsing upload directory %s)r   warnr	   finalize_optionsr   r   Zget_finalized_commanddictZbuilder_target_dirsr   ospathjoinZ
build_baseZensure_dirnameannounce)r   r   r   r   r   r   r   <   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 5 |  X d S )Nwz'no files found in upload directory '%s')zipfileZZipFilecloseZmkpathr   r    walkr   r!   r"   lenlstripsepwrite)r   filenamezip_filerootdirsfilesZtmplr   Zfullrelativedestr   r   r   create_zipfileN   s    zupload_docs.create_zipfilec              	   C   sx   t jdddd |  D ]}| | qt }| jj }t	j
|d| }z| | | | W 5 t| X d S )NzDeprecated commanda  
            upload_docs is deprecated and will be removed in a future version.
            Instead, use tools like devpi and Read the Docs; or lower level tools like
            httpie and curl to interact directly with your hosting service API.
            )i  	      )Zdue_datez%s.zip)r   emitZget_sub_commandsZrun_commandtempfileZmkdtempdistributionr   get_namer    r!   r"   shutilZrmtreer3   upload_file)r   Zcmd_nameZtmp_dirr   r-   r   r   r   run^   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_partv   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   --r?   )rD   z multipart/form-data; boundary=%s    )
r   	functoolspartialrI   mapitems	itertoolschainfrom_iterabler"   )clsdataboundaryrD   Zend_boundaryZ	end_itemsZbuilderZpart_groupspartsZ
body_itemscontent_typer   r   r   _build_multipart   s    zupload_docs._build_multipartc              
   C   sB  t |d}| }W 5 Q R X | jj}d| tj||fd}t| j	d | j
 }t|d}d| }| |\}}	d| j }
| |
tj tj| j\}}}}}}|s|s|rt|dkrtj|}n"|d	krtj|}ntd
| d}zZ|  |d| |	}|d| |dtt| |d| |  | | W n< t!k
r } z| t|tj" W Y d S d }~X Y nX |# }|j$dkrd|j$|j%f }
| |
tj nb|j$dkr|&d}|d krd|  }d| }
| |
tj nd|j$|j%f }
| |
tj" | j'r>t(d| d d S )NrbZ
doc_upload)z:actionr   content:rJ   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readr8   r   r9   r    r!   basenamer   ZusernameZpasswordr   decoderX   Z
repositoryr#   r   INFOurllibparseZurlparseAssertionErrorr\   ZclientZHTTPConnectionZHTTPSConnectionZconnectZ
putrequestZ	putheaderstrr(   Z
endheaderssendOSErrorZERRORZgetresponseZstatusreasonZ	getheaderZshow_responseprint)r   r,   frZ   metarT   ZcredentialsZauthZbodyZctmsgZschemaZnetlocZurlZparamsZqueryZ	fragmentsZconnrW   er   locationr   r   r   r;      sb    


zupload_docs.upload_fileN)__name__
__module____qualname__ZDEFAULT_REPOSITORYZdescriptionr	   Zuser_optionsZboolean_optionsr   Zsub_commandsr   r   r3   r<   staticmethodrI   classmethodrX   r;   r   r   r   r   r      s*   	


r   )__doc__base64r   	distutilsr   Zdistutils.errorsr   r    r%   r7   r:   rP   rL   Zhttp.clientr\   Zurllib.parserd   Z
_importlibr   warningsr   r	   r   r   r   r   r   r   <module>   s    