U
    „~$hú  ã                   @   st  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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ìG dd„ deƒZ&e  '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Ú	TypedDict)Úparse)ÚCommand)ÚSessionCommandMixin)ÚNO_MATCHES_FOUNDÚSUCCESS)ÚCommandError)Úget_default_environment)ÚPyPI)ÚPipXmlrpcTransport)Ú
indent_log)Úwrite_outputc                   @   s*   e Zd ZU eed< eed< ee ed< dS )ÚTransformedHitÚnameÚsummaryÚversionsN)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__r   © r   r   úA/tmp/pip-unpacked-wheel-g27rp152/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 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ƒ‚|}|  ||¡}t|ƒ}d }tj ¡ r>t ¡ 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/   ÚqueryZ	pypi_hitsÚhitsr0   r   r   r   Úrun4   s    
zSearchCommand.run)r9   r.   r    c           
   
   C   s”   |j }|  |¡}t||ƒ}tj ||¡}z| ||dœd¡}W nB tjjk
r€ } z d|j› d|j	› �}	t
|	ƒ‚W 5 d }~X Y nX t|tƒs�t‚|S )N)r   r   ÚorzXMLRPC request failed [code: z]
)r!   Úget_default_sessionr   ÚxmlrpcÚclientÚServerProxyr1   ÚFaultÚ	faultCodeÚfaultStringr   Ú
isinstanceÚlistÚAssertionError)
r,   r9   r.   Ú	index_urlÚsessionÚ	transportÚpypir:   ÚfaultÚmessager   r   r   r1   D   s    

ÿzSearchCommand.search)r   r   r   Ú__doc__ÚusageÚignore_require_venvr-   r   r   r   Úintr;   r   r1   r   r   r   r   r   !   s   r   )r:   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.
    r   r   Úversion)r   r   r   r   )r   ÚkeysÚappendÚhighest_versionrE   Úvalues)r:   ÚpackagesÚhitr   r   rQ   r   r   r   r2   V   s    ýr2   )r   Úlatestr    c              	   C   sr   t ƒ }| | ¡}|d k	rntƒ �J |j|kr8td|jƒ n,td|jƒ t|ƒjrZtd|ƒ n
td|ƒ W 5 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   rQ   r   Úparse_versionÚpre)r   rX   ÚenvÚdistr   r   r   Úprint_dist_installation_infor   s    


ýr^   )r:   Úname_column_widthr0   r    c              	   C   sæ   | sd S |d kr&t dd„ | D ƒƒd }| D ]¶}|d }|d p@d}t| ddg¡ƒ}|d k	r’|| d	 }|d
kr’t ||¡}dd|d    |¡}|› d|› d�}	|	|› ›d|› �}
zt|
ƒ t||ƒ W q* tk
rÞ   Y q*X q*d S )Nc              	   S   s.   g | ]&}t |d  ƒt t| ddg¡ƒƒ ‘qS )r   r   ú-)ÚlenrT   Úget)Ú.0rW   r   r   r   Ú
<listcomp>�   s   ÿz!print_results.<locals>.<listcomp>é   r   r   Ú r   r`   é   é
   Ú
ú é   z (ú)z - )	ÚmaxrT   rb   ÚtextwrapÚwrapÚjoinr   r^   ÚUnicodeEncodeError)r:   r_   r0   rW   r   r   rX   Ztarget_widthZsummary_linesZname_latestÚliner   r   r   r8   …   s6    þÿúÿ
r8   )r   r    c                 C   s   t | td�S )N)Úkey)rm   rZ   )r   r   r   r   rT   «   s    rT   )NN)1Úloggingr6   r3   rn   Úxmlrpc.clientr>   Úcollectionsr   Úoptparser   Útypingr   r   r   r   r   Zpip._vendor.packaging.versionr	   rZ   Úpip._internal.cli.base_commandr
   Úpip._internal.cli.req_commandr   Úpip._internal.cli.status_codesr   r   Úpip._internal.exceptionsr   Zpip._internal.metadatar   Úpip._internal.models.indexr   Zpip._internal.network.xmlrpcr   Úpip._internal.utils.loggingr   Úpip._internal.utils.miscr   r   Ú	getLoggerr   Úloggerr   r   r2   r^   rP   r8   rT   r   r   r   r   Ú<module>   s@   
5   ýü&