U
    ËAš`À-  ã                   @   sd   d 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
T ddlmZ G dd„ de	ƒZdS )	zhdistutils.command.register

Implements the Distutils 'register' command (register with the repository).
é    N)Úwarn)ÚPyPIRCCommand)Ú*)Úlogc                   @   sŽ   e Zd ZdZejddg Zejdddg Zddd	„ fgZd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zddd„ZdS ) Úregisterz7register the distribution with the Python package index)úlist-classifiersNz list the valid Trove classifiers)ÚstrictNzBWill stop the registering if the meta-data are not fully compliantÚverifyr   r   Úcheckc                 C   s   dS )NT© ©Úselfr   r   ú0/usr/lib/python3.8/distutils/command/register.pyÚ<lambda>   ó    zregister.<lambda>c                 C   s   t  | ¡ d| _d| _d S )Nr   )r   Úinitialize_optionsÚlist_classifiersr   r   r   r   r   r      s    
zregister.initialize_optionsc                 C   s*   t  | ¡ d| jfddœ}|| jjd< d S )Nr   )r   é   )r   Úrestructuredtextr
   )r   Úfinalize_optionsr   ÚdistributionZcommand_options)r   Zcheck_optionsr   r   r   r   $   s
    
ÿzregister.finalize_optionsc                 C   sT   |   ¡  |  ¡  |  ¡ D ]}|  |¡ q| jr8|  ¡  n| jrH|  ¡  n|  ¡  d S )N)	r   Ú_set_configZget_sub_commandsZrun_commandZdry_runÚverify_metadatar   ÚclassifiersÚsend_metadata)r   Zcmd_namer   r   r   Úrun+   s    

zregister.runc                 C   s8   t dtƒ | j d¡}| ¡  | j|_d|_| ¡  dS )zDeprecated API.zddistutils.command.register.check_metadata is deprecated,               use the check command insteadr
   r   N)r   ÚPendingDeprecationWarningr   Zget_command_objZensure_finalizedr   r   r   )r   r
   r   r   r   Úcheck_metadata:   s    ÿzregister.check_metadatac                 C   sz   |   ¡ }|i kr@|d | _|d | _|d | _|d | _d| _n6| jd| jfkr^td| j ƒ‚| jdkrp| j| _d| _d	S )
z: Reads the configuration file and set attributes.
        ÚusernameÚpasswordÚ
repositoryÚrealmTZpypiz%s not found in .pypircFN)Z_read_pypircr   r   r    r!   Ú
has_configZDEFAULT_REPOSITORYÚ
ValueError)r   Zconfigr   r   r   r   D   s    




zregister._set_configc                 C   s*   | j d }tj |¡}t |  |¡¡ dS )z8 Fetch the list of classifiers from the server.
        z?:action=list_classifiersN)r    ÚurllibÚrequestZurlopenr   ÚinfoÚ_read_pypi_response)r   ZurlZresponser   r   r   r   U   s    
zregister.classifiersc                 C   s&   |   |  d¡¡\}}t d||¡ dS )zF Send the metadata to the package index server to be checked.
        r	   úServer response (%s): %sN)Úpost_to_serverÚbuild_post_datar   r&   )r   ÚcodeÚresultr   r   r   r   \   s    zregister.verify_metadatac           
      C   sÜ  | j rd}| j}| j}nd}d }}d ¡ }||krd|  dtj¡ tƒ }|sRd}q,||kr,tdƒ q,|dkrl|s|tdƒ}qn|sŒt	 	d¡}q|t
j ¡ }t
j | j¡d	 }| | j|||¡ |  |  d
¡|¡\}}|  d||f tj¡ |dkrØ| j r|| j_nf|  dtj¡ |  d|  ¡  tj¡ d}| ¡ dkrNtdƒ}|s*d}q*| ¡ dkrØ|  ||¡ nl|dkrˆddi}	d |	d<  |	d< |	d< d|	d< |	d s¸tdƒ|	d< qž|	d |	d kr0|	d sæt	 	d¡|	d< qÊ|	d st	 	d¡|	d< qæ|	d |	d kr¸d|	d< d|	d< tdƒ q¸|	d sJtdƒ|	d< q0|  |	¡\}}|dkrrt d||¡ nt d¡ t d ¡ nP|d!krØdd"i}	d|	d< |	d s¼td#ƒ|	d< q¢|  |	¡\}}t d||¡ dS )$a_   Send the metadata to the package index server.

            Well, do the following:
            1. figure who the user is, and then
            2. send the data as a Basic auth'ed POST.

            First we try to read the username/password from $HOME/.pypirc,
            which is a ConfigParser-formatted file with a section
            [distutils] containing username and password entries (both
            in clear text). Eg:

                [distutils]
                index-servers =
                    pypi

                [pypi]
                username: fred
                password: sekrit

            Otherwise, to figure who the user is, we offer the user three
            choices:

             1. use existing login,
             2. register as a new user, or
             3. set the password to a random string and email the user.

        Ú1ÚxÚ z1 2 3 4zâWe need to know who you are, so please choose either:
 1. use your existing login,
 2. register as a new user,
 3. have the server generate a new password for you (and email it to you), or
 4. quit
Your selection [default 1]: z&Please choose one of the four options!z
Username: z
Password: r   Zsubmitr(   éÈ   zAI can store your PyPI login so future submissions will be faster.z (the login will be stored in %s)ÚXZynzSave your login (y/N)?ÚnÚyÚ2ú:actionÚuserÚnamer   ZemailNZconfirmz
 Confirm: z!Password and confirm don't match!z
   EMail: z"You will receive an email shortly.z7Follow the instructions in it to complete registration.Ú3Zpassword_resetzYour email address: )r"   r   r   ÚsplitÚannouncer   ÚINFOÚinputÚprintÚgetpassr$   r%   ZHTTPPasswordMgrÚparseZurlparser    Zadd_passwordr!   r)   r*   r   Z_get_rc_fileÚlowerZ_store_pypircr&   )
r   Zchoicer   r   ÚchoicesÚauthZhostr+   r,   Údatar   r   r   r   c   sš    ú



ÿÿ

ÿÿÿ








zregister.send_metadatac                 C   s   | j j}|d| ¡ | ¡ | ¡ | ¡ | ¡ | ¡ | ¡ | 	¡ | 
¡ | ¡ | ¡ | ¡ | ¡ | ¡ | ¡ dœ}|d s„|d s„|d rŒd|d< |S )Nz1.0)r5   Úmetadata_versionr7   ÚversionZsummaryZ	home_pageZauthorZauthor_emailZlicenseÚdescriptionÚkeywordsÚplatformr   Zdownload_urlÚprovidesÚrequiresÚ	obsoletesrI   rJ   rK   z1.1rD   )r   ZmetadataZget_nameZget_versionZget_descriptionZget_urlZget_contactZget_contact_emailZget_licenceZget_long_descriptionZget_keywordsZget_platformsZget_classifiersZget_download_urlZget_providesZget_requiresZget_obsoletes)r   ÚactionÚmetarC   r   r   r   r*   Ý   s,    îzregister.build_post_dataNc              
   C   sô  d|kr$|   d|d | jf tj¡ d}d| }|d }t ¡ }| ¡ D ]~\}}t|ƒtg ƒtdƒfkrn|g}|D ]R}t|ƒ}| 	|¡ | 	d| ¡ | 	d¡ | 	|¡ |rr|d	 d
krr| 	d¡ qrqH| 	|¡ | 	d¡ | 
¡  d¡}d| tt|ƒƒdœ}	tj | j||	¡}
tj tjj|d¡}d}z| |
¡}W nx tjjk
r€ } z"| jrd|j ¡ }|j|jf}W 5 d}~X Y nJ tjjk
r² } zdt|ƒf}W 5 d}~X Y nX | jrÆ|  |¡}d}| jrðd d|df¡}|   |tj¡ |S )zC Post a query to the server, and return a string response.
        r7   zRegistering %s to %sz3--------------GHSKFJDLGDS7543FJKLFHRE75642756743254z
--z--r   z*
Content-Disposition: form-data; name="%s"z

éÿÿÿÿúÚ
zutf-8z/multipart/form-data; boundary=%s; charset=utf-8)zContent-typezContent-length)Zpassword_mgrr/   Niô  )r0   ZOKzK---------------------------------------------------------------------------)r:   r    r   r;   ÚioÚStringIOÚitemsÚtypeÚstrÚwriteÚgetvalueÚencodeÚlenr$   r%   ZRequestZbuild_openerZHTTPBasicAuthHandlerÚopenÚerrorZ	HTTPErrorZshow_responseÚfpÚreadr+   ÚmsgZURLErrorr'   Újoin)r   rC   rB   ÚboundaryZsep_boundaryZend_boundaryZbodyÚkeyÚvalueZheadersZreqZopenerr,   Úer^   r   r   r   r)   ù   s^    ÿþ





þÿ

zregister.post_to_server)N)Ú__name__Ú
__module__Ú__qualname__rF   r   Zuser_optionsZboolean_optionsZsub_commandsr   r   r   r   r   r   r   r   r*   r)   r   r   r   r   r      s*   ý  ÿ
zr   )Ú__doc__r>   rQ   Zurllib.parser$   Zurllib.requestÚwarningsr   Zdistutils.corer   Zdistutils.errorsZ	distutilsr   r   r   r   r   r   Ú<module>   s   