
§|jk  ã               @   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 Gd 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-5c7ija6t/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 SWd  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 d ƒ t j |  ƒ |  j d  k r€ |  j ƒ  rS |  j d ƒ } | j |  _ q™ |  j d ƒ } t	 j
 j | j d ƒ |  _ n |  j d ƒ |  j |  _ |  j d |  j ƒ d  S)Nz3Upload_docs command is deprecated. Use RTD instead.r   ÚbuildZdocsr   zUsing upload directory %s)r   Úwarnr
   Úfinalize_optionsr   r   Úget_finalized_commandZbuilder_target_dirr    ÚosÚpathÚjoinÚ
build_baseÚensure_dirnameÚ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 rp | rp t d |  j ƒ ‚ xp | D]h } t j j | | ƒ } | t	 |  j ƒ d  … j
 t j j ƒ } t j j | | ƒ }	 | j | |	 ƒ qw Wq8 WWd  | j ƒ  Xd  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ÚnameÚfullZrelativeÚdestr   r   r   Úcreate_zipfileJ   s    "(zupload_docs.create_zipfilec             C   sŽ   x! |  j  ƒ  D] } |  j | ƒ q Wt j ƒ  } |  j j j ƒ  } t j j	 | d | ƒ } z |  j
 | ƒ |  j | ƒ Wd  t j | ƒ Xd  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:   r6   r   r   r   Úrun[   s    zupload_docs.runc             c   s¸   |  \ } } d | } t  | t ƒ s. | g } xƒ | D]{ } t  | t ƒ ri | d | d 7} | d } n t | ƒ } | Vt | ƒ Vd V| V| r5 | d d  … d k r5 d Vq5 Wd  S)	Nz*
Content-Disposition: form-data; name="%s"z; filename="%s"r   r	   s   

s   s   
éÿÿÿÿ)Ú
isinstanceÚlistÚtupler   )ÚitemÚsep_boundaryÚkeyÚvaluesÚtitleÚvaluer   r   r   Ú_build_parti   s    
	zupload_docs._build_partc             C   s”   d } d | } | d } | d f } t  j |  j d | ƒ} t | | j ƒ  ƒ } t j j | ƒ } t j | | ƒ }	 d | }
 d j |	 ƒ |
 f S)z=
        Build up the MIME payload for the POST data
        s3   --------------GHSKFJDLGDS7543FJKLFHRE75642756743254s   
--s   --s   
rO   z multipart/form-data; boundary=%só    )	Ú	functoolsÚpartialrT   ÚmapÚitemsÚ	itertoolsÚchainÚfrom_iterabler'   )ÚclsÚdataÚboundaryrO   Zend_boundaryZ	end_itemsZbuilderZpart_groupsÚpartsZ
body_itemsÚcontent_typer   r   r   Ú_build_multipart}   s    

		
zupload_docs._build_multipartc             C   s  t  | d ƒ � } | j ƒ  } Wd  QRX|  j j } d d d | j ƒ  d t j j | ƒ | f i } t |  j	 d |  j
 ƒ } t | ƒ } t j rŸ | j d ƒ } d | } |  j | ƒ \ } }	 |  j d	 |  j t j ƒ t j j |  j ƒ \ }
 } } } } } | r| r| st ‚ |
 d
 k r8t j | ƒ } n. |
 d k rVt j | ƒ } n t d |
 ƒ ‚ d } yw | j ƒ  | j d | ƒ |	 } | j d | ƒ | j d t t | ƒ ƒ ƒ | j d | ƒ | j  ƒ  | j! | ƒ WnE t" j# k
 r*} z" |  j t | ƒ t j$ ƒ d  SWYd  d  } ~ Xn X| j% ƒ  } | j& d k rl|  j d | j& | j' f t j ƒ nw | j& d k rÀ| j( d ƒ } | d  k r¦d | j ƒ  } |  j d | t j ƒ n# |  j d | j& | j' f t j$ ƒ |  j) r
t* d d | j ƒ  d d ƒ d  S)NÚrbz:actionZ
doc_uploadr:   Úcontentú:Úasciiz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ÚreadrB   rC   rD   r%   r&   Úbasenamer   ÚusernameÚpasswordr   r   r   Údecoderb   r*   Ú
repositoryr   ÚINFOr   ÚparseÚurlparseÚAssertionErrorr   ÚHTTPConnectionÚHTTPSConnectionÚconnectÚ
putrequestÚ	putheaderÚstrr0   Ú
endheadersÚsendÚsocketÚerrorÚERRORÚgetresponseÚstatusÚreasonÚ	getheaderÚshow_responseÚprint)r   r5   Úfrd   Úmetar^   ÚcredentialsÚauthÚbodyÚctZschemaÚnetlocÚurlÚparamsÚqueryZ	fragmentsÚconnra   Úer   Úlocationr   r   r   rE   �   s`    	

'


	zupload_docs.upload_file)r   Nr   )r   Nr   )Ú__name__Ú
__module__Ú__qualname__ÚDEFAULT_REPOSITORYÚdescriptionr
   Úuser_optionsÚboolean_optionsr   Úsub_commandsr   r#   r=   rI   ÚstaticmethodrT   Úclassmethodrb   rE   r   r   r   r   r      s"    		r   )Ú__doc__Úbase64r   Ú	distutilsr   Zdistutils.errorsr   r%   rƒ   r,   r@   rF   rZ   rV   Zsetuptools.externr   Zsetuptools.extern.six.movesr   r   Úpkg_resourcesr   r
   r   r   r   r   r   r   Ú<module>   s    