3
ûâdeA  ã               @   s|  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mZmZ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rôd dl
m%Z% G dd„ de%ƒZ&e j'e(ƒZ)G dd„ deeƒZ*eee+e+f  ed dœdd„Z,e+e+ddœdd„Z-d ed ee. ee. ddœdd„Z/ee+ e+dœdd„Z0dS )!é    N)ÚOrderedDict)ÚValues)ÚTYPE_CHECKINGÚDictÚListÚOptional)Úparse)ÚCommand)ÚSessionCommandMixin)ÚNO_MATCHES_FOUNDÚSUCCESS)ÚCommandError)Úget_default_environment)ÚPyPI)ÚPipXmlrpcTransport)Ú
indent_log)Úwrite_output)Ú	TypedDictc               @   s   e Zd ZU eeee dS )ÚTransformedHitN)Ú__name__Ú
__module__Ú__qualname__ÚstrÚnameÚsummaryr   Úversions© r   r   ú</tmp/pip-build-red6nood/pip/pip/_internal/commands/search.pyr      s   
r   c               @   s^   e Zd ZdZdZdZddœdd„Zeee	 e
dœd	d
„Zee	 eeee	e	f  dœdd„ZdS )ÚSearchCommandz@Search for PyPI packages whose name or summary contains <query>.z
      %prog [options] <query>TN)Úreturnc             C   s.   | j jddddtjdd� | jjd| j ƒ d S )Nz-iz--indexÚindexÚURLz3Base URL of Python Package Index (default %default))ÚdestÚmetavarÚdefaultÚhelpr   )Úcmd_optsÚ
add_optionr   Úpypi_urlÚparserÚinsert_option_group)Úselfr   r   r   Úadd_options)   s    zSearchCommand.add_options)ÚoptionsÚargsr   c             C   sV   |st dƒ‚|}| j||ƒ}t|ƒ}d }tjjƒ r>tjƒ d }t||d� |rRt	S t
S )Nz)Missing required argument (search query).r   )Úterminal_width)r   ÚsearchÚtransform_hitsÚsysÚstdoutÚisattyÚshutilÚget_terminal_sizeÚprint_resultsr   r   )r+   r-   r.   ÚqueryÚ	pypi_hitsÚhitsr/   r   r   r   Úrun5   s    
zSearchCommand.run)r8   r-   r   c       
      C   s’   |j }| j|ƒ}t||ƒ}tjj||ƒ}y|j||dœdƒ}W n@ tjjk
r~ } z dj|j	|j
d�}	t|	ƒ‚W Y d d }~X nX t|tƒsŽt‚|S )N)r   r   Úorz-XMLRPC request failed [code: {code}]
{string})ÚcodeÚstring)r    Zget_default_sessionr   ÚxmlrpcÚclientÚServerProxyr0   ÚFaultÚformatÚ	faultCodeÚfaultStringr   Ú
isinstanceÚlistÚAssertionError)
r+   r8   r-   Ú	index_urlÚsessionÚ	transportÚpypir:   ÚfaultÚmessager   r   r   r0   E   s    


zSearchCommand.search)r   r   r   Ú__doc__ÚusageZignore_require_venvr,   r   r   r   Úintr;   r   r0   r   r   r   r   r   "   s   r   )r:   r   c             C   sŠ   t ƒ }xv| D ]n}|d }|d }|d }||jƒ krH|||gdœ||< q|| d j|ƒ |t|| d ƒkr||| d< qW t|jƒ ƒ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.
    r   r   Úversion)r   r   r   r   )r   ÚkeysÚappendÚhighest_versionrG   Úvalues)r:   ÚpackagesÚhitr   r   rR   r   r   r   r1   X   s    
r1   )r   Úlatestr   c          
   C   sr   t ƒ }|j| ƒ}|d k	rntƒ �J |j|kr8td|jƒ n,td|jƒ t|ƒjrZtd|ƒ n
td|ƒ W d Q R X d S )NzINSTALLED: %s (latest)zINSTALLED: %sz=LATEST:    %s (pre-release; install with `pip install --pre`)zLATEST:    %s)r   Úget_distributionr   rR   r   Úparse_versionÚpre)r   rY   ÚenvÚdistr   r   r   Úprint_dist_installation_infot   s    


r_   )r:   Úname_column_widthr/   r   c             C   sê   | sd S |d kr&t dd„ | D ƒƒd }x¾| D ]¶}|d }|d pBd}t|jddgƒƒ}|d k	r”|| d	 }|d
kr”tj||ƒ}dd|d   j|ƒ}|› d|› d�}	|	|› ›d|› �}
yt|
ƒ t||ƒ W q, tk
rà   Y q,X q,W d S )Nc             S   s.   g | ]&}t |d  ƒt t|jddgƒƒƒ ‘qS )r   r   ú-)ÚlenrU   Úget)Ú.0rX   r   r   r   ú
<listcomp>’   s   z!print_results.<locals>.<listcomp>é   r   r   Ú r   ra   é   é
   Ú
ú é   z (ú)z - )	ÚmaxrU   rc   ÚtextwrapÚwrapÚjoinr   r_   ÚUnicodeEncodeError)r:   r`   r/   rX   r   r   rY   Útarget_widthZsummary_linesZname_latestÚliner   r   r   r7   ‡   s.    
r7   )r   r   c             C   s   t | td�S )N)Úkey)rn   r[   )r   r   r   r   rU   ­   s    rU   )NN)1Úloggingr5   r2   ro   Zxmlrpc.clientr?   Úcollectionsr   Úoptparser   Útypingr   r   r   r   Zpip._vendor.packaging.versionr   r[   Zpip._internal.cli.base_commandr	   Zpip._internal.cli.req_commandr
   Zpip._internal.cli.status_codesr   r   Zpip._internal.exceptionsr   Zpip._internal.metadatar   Zpip._internal.models.indexr   Zpip._internal.network.xmlrpcr   Zpip._internal.utils.loggingr   Zpip._internal.utils.miscr   r   r   Ú	getLoggerr   Úloggerr   r   r1   r_   rQ   r7   rU   r   r   r   r   Ú<module>   s8   
6  "