3
UgA                 @   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rd 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   A/tmp/pip-unpacked-wheel-0ht26j5g/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.   queryZ	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st|S )N)r   r   orz-XMLRPC request failed [code: {code}]
{string})codestring)r    get_default_sessionr   xmlrpcclientServerProxyr0   Faultformat	faultCodefaultStringr   
isinstancelistAssertionError)
r+   r8   r-   	index_urlsession	transportpypir9   faultmessager   r   r   r0   E   s    


zSearchCommand.search)r   r   r   __doc__usageignore_require_venvr,   r   r   r   intr:   r   r0   r   r   r   r   r   "   s   r   )r9   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)r9   packageshitr   r   rS   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   rS   r   parse_versionpre)r   rZ   envdistr   r   r   print_dist_installation_infot   s    


r`   )r9   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rt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   -)lenrV   get).0rY   r   r   r   
<listcomp>   s   z!print_results.<locals>.<listcomp>   r   r    r   rb      
   
    z ()z - )	maxrV   rd   textwrapwrapjoinr   r`   UnicodeEncodeError)r9   ra   r/   rY   r   r   rZ   Ztarget_widthZsummary_linesZname_latestliner   r   r   r7      s.    
r7   )r   r   c             C   s   t | tdS )N)key)ro   r\   )r   r   r   r   rV      s    rV   )NN)1loggingr5   r2   rp   xmlrpc.clientr?   collectionsr   optparser   typingr   r   r   r   Zpip._vendor.packaging.versionr   r\   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   r   	getLoggerr   loggerr   r   r1   r`   rR   r7   rV   r   r   r   r   <module>   s8   
6  "