U
    «ÃT_  ã                   @   sþ   d dl m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lmZ d dlm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lmZ d dlmZ d dlmZ d dlm Z  e !e"¡Z#G dd„ deeƒZ$dd„ Z%ddd„Z&dd„ Z'dS )é    )Úabsolute_importN)ÚOrderedDict)Úpkg_resources)Úparse)Úxmlrpc_client)ÚCommand)ÚSessionCommandMixin)ÚNO_MATCHES_FOUNDÚSUCCESS)ÚCommandError)ÚPyPI)ÚPipXmlrpcTransport)Úget_terminal_size)Ú
indent_log)Úwrite_outputc                       s8   e Zd ZdZdZdZ‡ fdd„Zdd„ Zdd	„ Z‡  Z	S )
ÚSearchCommandz@Search for PyPI packages whose name or summary contains <query>.z
      %prog [options] <query>Tc                    s@   t t| ƒj||Ž | jjddddtjdd� | j d| j¡ d S )Nz-iz--indexÚindexÚURLz3Base URL of Python Package Index (default %default))ÚdestÚmetavarÚdefaultÚhelpr   )	Úsuperr   Ú__init__Úcmd_optsÚ
add_optionr   Úpypi_urlÚparserÚinsert_option_group)ÚselfÚargsÚkw©Ú	__class__© úA/tmp/pip-unpacked-wheel-8u7dkzi1/pip/_internal/commands/search.pyr   %   s     ûzSearchCommand.__init__c                 C   sT   |st dƒ‚|}|  ||¡}t|ƒ}d }tj ¡ r<tƒ d }t||d� |rPtS t	S )Nz)Missing required argument (search query).r   )Úterminal_width)
r   ÚsearchÚtransform_hitsÚsysÚstdoutÚisattyr   Úprint_resultsr
   r	   )r   Úoptionsr    ÚqueryZ	pypi_hitsÚhitsr&   r$   r$   r%   Úrun0   s    

zSearchCommand.runc                 C   s<   |j }|  |¡}t||ƒ}t ||¡}| ||dœd¡}|S )N)ÚnameÚsummaryÚor)r   Úget_default_sessionr   r   ÚServerProxyr'   )r   r.   r-   Ú	index_urlÚsessionÚ	transportÚpypir/   r$   r$   r%   r'   @   s    

zSearchCommand.search)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚusageÚignore_require_venvr   r0   r'   Ú__classcell__r$   r$   r"   r%   r      s   r   c                 C   s†   t ƒ }| D ]n}|d }|d }|d }|| ¡ krF|||gdœ||< q
|| d  |¡ |t|| d ƒkr
||| d< q
t| ¡ ƒS )z¼
    The list from pypi is really a list of versions. We want a list of
    packages with the list of versions stored inline. This converts the
    list from pypi into one we can use.
    r1   r2   Úversion)r1   r2   ÚversionsrB   )r   ÚkeysÚappendÚhighest_versionÚlistÚvalues)r/   ÚpackagesÚhitr1   r2   rA   r$   r$   r%   r(   K   s    ýr(   c              
   C   sP  | sd S |d kr&t dd„ | D ƒƒd }dd„ tjD ƒ}| D �]}|d }|d pRd}t| dd	g¡ƒ}|d k	r¤|| d
 }|dkr¤t ||¡}dd|d    |¡}d|d||f |f }	zxt|	ƒ ||k�r0t 	|¡}
t
ƒ �L |
j|krøtd|
jƒ n.td|
jƒ t|ƒj�rtd|ƒ n
td|ƒ W 5 Q R X W q: tk
�rH   Y q:X q:d S )Nc              	   S   s.   g | ]&}t |d  ƒt t| ddg¡ƒƒ ‘qS )r1   rB   ú-)ÚlenrE   Úget)Ú.0rI   r$   r$   r%   Ú
<listcomp>k   s   ÿz!print_results.<locals>.<listcomp>é   c                 S   s   g | ]
}|j ‘qS r$   )Úproject_name)rM   Úpr$   r$   r%   rN   p   s     r1   r2   Ú rB   rJ   é   é
   Ú
ú é   z	%-*s - %sz%s (%s)zINSTALLED: %s (latest)zINSTALLED: %sz=LATEST:    %s (pre-release; install with "pip install --pre")zLATEST:    %s)Úmaxr   Úworking_setrE   rL   ÚtextwrapÚwrapÚjoinr   Úget_distributionr   rA   Úparse_versionÚpreÚUnicodeEncodeError)r/   Zname_column_widthr&   Zinstalled_packagesrI   r1   r2   ZlatestZtarget_widthÚlineÚdistr$   r$   r%   r,   g   sJ    þý

 ÿ


ÿr,   c                 C   s   t | td�S )N)Úkey)rX   r^   )rB   r$   r$   r%   rE   �   s    rE   )NN)(Ú
__future__r   Úloggingr)   rZ   Úcollectionsr   Úpip._vendorr   Zpip._vendor.packaging.versionr   r^   Zpip._vendor.six.movesr   Úpip._internal.cli.base_commandr   Úpip._internal.cli.req_commandr   Úpip._internal.cli.status_codesr	   r
   Úpip._internal.exceptionsr   Úpip._internal.models.indexr   Zpip._internal.network.xmlrpcr   Úpip._internal.utils.compatr   Úpip._internal.utils.loggingr   Úpip._internal.utils.miscr   Ú	getLoggerr:   Úloggerr   r(   r,   rE   r$   r$   r$   r%   Ú<module>   s*   
-
)