3 \�-�@sddZddlZddlZddlZddlZddlmZddlm Z ddl Tddl m Z Gdd�de �Z dS) zhdistutils.command.register Implements the Distutils 'register' command (register with the repository). �N)�warn)� PyPIRCCommand)�*)�logc@s�eZdZdZejdd gZejdddgZdd d �fgZd d �Zd d�Z dd�Z dd�Z dd�Z dd�Z dd�Zdd�Zdd�Zd!dd�ZdS)"�registerz7register the distribution with the Python package index�list-classifiersN� list the valid Trove classifiers�strict�BWill stop the registering if the meta-data are not fully compliant�verify�checkcCsdS)NT�)�selfr r �2/usr/lib64/python3.6/distutils/command/register.py�szregister.cCstj|�d|_d|_dS)Nr)r�initialize_options�list_classifiersr )rr r rrs zregister.initialize_optionscCs*tj|�d|jfdd�}||jjd<dS)Nr�)r �restructuredtextr )rr)r�finalize_optionsr � distributionZcommand_options)rZ check_optionsr r rr$s zregister.finalize_optionscCsX|j�|j�x|j�D]}|j|�qW|jr<|j�n|jrL|j�n|j�dS)N) r� _set_configZget_sub_commandsZ run_commandZdry_run�verify_metadatar� classifiers� send_metadata)rZcmd_namer r r�run+s  z register.runcCs8tdt�|jjd�}|j�|j|_d|_|j�dS)zDeprecated API.zddistutils.command.register.check_metadata is deprecated, use the check command insteadr rN)r�PendingDeprecationWarningrZget_command_objZensure_finalizedr rr)rr r r r�check_metadata:s zregister.check_metadatacCsz|j�}|ikr@|d|_|d|_|d|_|d|_d|_n6|jd|jfkr^td|j��|jdkrp|j|_d|_d S) z: Reads the configuration file and set attributes. �username�password� repository�realmTZpypiz%s not found in .pypircFN)Z _read_pypircrrr r!� has_configZDEFAULT_REPOSITORY� ValueError)r�configr r rrDs     zregister._set_configcCs*|jd}tjj|�}tj|j|��dS)z8 Fetch the list of classifiers from the server. z?:action=list_classifiersN)r �urllib�requestZurlopenr�info�_read_pypi_response)rZurlZresponser r rrUs  zregister.classifierscCs&|j|jd��\}}tjd||�dS)zF Send the metadata to the package index server to be checked. r zServer response (%s): %sN)�post_to_server�build_post_datarr')r�code�resultr r rr\szregister.verify_metadatac Cs|jrd}|j}|j}n d}d}}dj�}x:||krf|jdtj�t�}|sTd}q.||kr.td�q.W|dk�r|x|s�td�}qtWx|s�t j d�}q�Wt j j �}t j j|j�d }|j|j|||�|j|jd �|�\}}|jd ||ftj�|d k�r|j�r||j_nj|jd tj�|jd|j�tj�d}x&|j�dk�r\td�}|�s8d}�q8W|j�dk�r|j||��n�|dk�r�ddi} d| d<| d<| d<d| d<x| d�s�td�| d<�q�Wx�| d| dk�rNx| d�s�t j d�| d<�q�Wx| d�st j d�| d<�qW| d| dk�r�d| d<d| d<td��q�Wx| d�sltd�| d<�qRW|j| �\}}|d k�r�tjd ||�ntjd�tjd �nT|d!k�rdd"i} d| d<x| d�s�td#�| d<�q�W|j| �\}}tjd ||�dS)$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�z1 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: rZsubmitzServer response (%s): %s��zAI can store your PyPI login so future submissions will be faster.z (the login will be stored in %s)�XZynzSave your login (y/N)?�n�y�2z:action�user�namerZemailNZconfirmz 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.�3Zpassword_resetzYour email address: )r"rr�split�announcer�INFO�input�print�getpassr%r&ZHTTPPasswordMgr�parseZurlparser Z add_passwordr!r)r*rZ _get_rc_file�lowerZ _store_pypircr') rZchoicerr�choices�auth�hostr+r,�datar r rrcs�                     zregister.send_metadatacCs�|jj}|d|j�|j�|j�|j�|j�|j�|j�|j �|j �|j �|j �|j �|j�|j�|j�d�}|ds�|ds�|dr�d|d<|S)Nz1.0)z:action�metadata_versionr6�versionZsummaryZ home_pageZauthorZ author_email�license� description�keywords�platformrZ download_url�provides�requires� obsoletesrJrKrLz1.1rD)rZmetadataZget_nameZ get_versionZget_descriptionZget_urlZ get_contactZget_contact_emailZ get_licenceZget_long_descriptionZ get_keywordsZ get_platformsZget_classifiersZget_download_urlZ get_providesZ get_requiresZ get_obsoletes)r�action�metarCr r rr*�s* zregister.build_post_datacCsd|kr$|jd|d|jftj�d}d|}|d}tj�}x�|j�D]�\}}t|�tg�tf�fkrp|g}xZ|D]R}t|�}|j |�|j d|�|j d�|j |�|rv|dd krv|j d �qvWqJW|j |�|j d �|j �j d �}d |tt |��d �} t jj|j|| �} t jjt jj|d��} d}y| j| �} Wnxt jjk �r�} z$|j�rl| jj�}| j| jf} WYdd} ~ XnJt jjk �r�} zdt| �f} WYdd} ~ XnX|j�r�|j| �}d} |j�rd jdd|ddf�}|j|tj�| S)zC Post a query to the server, and return a string response. r6zRegistering %s to %sz3--------------GHSKFJDLGDS7543FJKLFHRE75642756743254z --z--z* Content-Disposition: form-data; name="%s"z r� � zutf-8z/multipart/form-data; boundary=%s; charset=utf-8)z Content-typezContent-length)Z password_mgrr/Ni�r0�OK�-�K�����)r0rQ)r9r rr:�io�StringIO�items�type�str�write�getvalue�encode�lenr%r&ZRequestZ build_openerZHTTPBasicAuthHandler�open�errorZ HTTPErrorZ show_response�fp�readr+�msgZURLErrorr(�join)rrCrA�boundaryZ sep_boundaryZ end_boundaryZbody�key�valueZheadersZreq�openerr,�erbr r rr)�sV         zregister.post_to_server)rNr)r Nr )N)�__name__� __module__� __qualname__rGrZ user_optionsZboolean_optionsZ sub_commandsrrrrrrrrr*r)r r r rrs&  zr)�__doc__r=rUZ urllib.parser%Zurllib.request�warningsrZdistutils.corerZdistutils.errorsZ distutilsrrr r r r�s