3
Ug                 @   s  d dl Z d dlZd dl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mZ d dlmZmZ d dlmZ ejeZG d	d
 d
eZG dd deZe
edf e
edf edddZee ee dddZee eeedddZ dS )    N)Values)IteratorList
NamedTupleOptionalTuple)canonicalize_name)Command)ERRORSUCCESS)BaseDistributionget_default_environment)write_outputc               @   s<   e Zd ZdZdZdZddddZeee	 e
dd	d
ZdS )ShowCommandzx
    Show information about one or more installed packages.

    The output is in RFC-compliant mail header format.
    z$
      %prog [options] <package> ...TN)returnc             C   s,   | j jddddddd | jjd| j  d S )	Nz-fz--filesfiles
store_trueFz7Show the full list of installed files for each package.)destactiondefaulthelpr   )cmd_opts
add_optionparserinsert_option_group)self r   ?/tmp/pip-unpacked-wheel-0ht26j5g/pip/_internal/commands/show.pyadd_options   s    zShowCommand.add_options)optionsargsr   c             C   s8   |st jd tS |}t|}t||j|jds4tS tS )Nz.ERROR: Please provide a package name or names.)
list_filesverbose)loggerwarningr
   search_packages_infoprint_resultsr   r"   r   )r   r   r    queryresultsr   r   r   run(   s    
zShowCommand.run)__name__
__module____qualname____doc__usageignore_require_venvr   r   r   strintr)   r   r   r   r   r      s
   r   c               @   sb   e Zd ZU eeeee ee 	e
eee eeeeeee eee  dS )_PackageInfoN)r*   r+   r,   r0   nameversionlocationr   requiresrequired_by	installermetadata_versionclassifierssummaryhomepageauthorauthor_emaillicenseentry_pointsr   r   r   r   r   r   r2   6   s   
r2   .)entryinfor   c             C   s\   xH| rH| d dkrH| s$|d dkr.|d7 }n|dd }| dd } qW t tj||  S )a  Convert a legacy installed-files.txt path into modern RECORD path.

    The legacy format stores paths relative to the info directory, while the
    modern format stores paths relative to the package root, e.g. the
    site-packages directory.

    :param entry: Path parts of the installed-files.txt entry.
    :param info: Path parts of the egg-info directory relative to package root.
    :returns: The converted entry.

    For best compatibility with symlinks, this does not use ``abspath()`` or
    ``Path.resolve()``, but tries to work with path parts:

    1. While ``entry`` starts with ``..``, remove the equal amounts of parts
       from ``info``; if ``info`` is empty, start appending ``..`` instead.
    2. Join the two directly.
    r   ..   N)rC   rE   )r0   pathlibPath)rA   rB   r   r   r   _convert_legacy_entryH   s    
rH   )r'   r   c          "   #   s  t  }dd |j D  dd | D }t fddt| |D }|rXtjddj| ttt	 d fd	d
}tt
tt	  ddd}tt
tt	  ddd}x8|D ].}y | }W n tk
r   wY nX tdd |j D t	jd}	t||t	jd}
y|jd}|jdd}W n tk
r4   g }Y nX ||pF||}|dkrXd}nt|}|j}t|jt	|j|jp~d|	|
|j|jpd|jdg |jdd|jdd|jdd|jdd|jdd||dV  qW dS )z
    Gather details from installed distributions. Print distribution name,
    version, location, and installed files. Installed files requires a
    pip generated 'installed-files.txt' in the distributions '.egg-info'
    directory.
    c             S   s   i | ]}||j qS r   )canonical_name).0distr   r   r   
<dictcomp>l   s    z(search_packages_info.<locals>.<dictcomp>c             S   s   g | ]}t |qS r   )r   )rJ   r3   r   r   r   
<listcomp>m   s    z(search_packages_info.<locals>.<listcomp>c                s   g | ]\}}| kr|qS r   r   )rJ   r3   pkg)	installedr   r   rM   o   s    zPackage(s) not found: %sz, )current_distr   c                s    fddj  D S )Nc             3   s4   | ],} j d d |j D kr|jd p*dV  qdS )c             S   s   h | ]}t |jqS r   )r   r3   )rJ   dr   r   r   	<setcomp>y   s    zRsearch_packages_info.<locals>._get_requiring_packages.<locals>.<genexpr>.<setcomp>NameUNKNOWNN)rI   iter_dependenciesmetadata)rJ   rK   )rP   r   r   	<genexpr>v   s   zHsearch_packages_info.<locals>._get_requiring_packages.<locals>.<genexpr>)values)rP   )rO   )rP   r   _get_requiring_packagest   s    
z5search_packages_info.<locals>._get_requiring_packages)rK   r   c             S   s<   y| j d}W n tk
r"   d S X dd tj|j D S )NRECORDc             s   s    | ]}t tj|d  V  qdS )r   N)r0   rF   rG   )rJ   rowr   r   r   rW      s    zCsearch_packages_info.<locals>._files_from_record.<locals>.<genexpr>)	read_textFileNotFoundErrorcsvreader
splitlines)rK   textr   r   r   _files_from_record|   s
    z0search_packages_info.<locals>._files_from_recordc                s   y| j d}W n tk
r"   d S X dd |jddD }| j}| j}|d ksV|d krZ|S ytj|j| W n tk
r   |S X  j	s|S  fdd|D S )Nzinstalled-files.txtc             s   s   | ]}|r|V  qd S )Nr   )rJ   pr   r   r   rW      s    zCsearch_packages_info.<locals>._files_from_legacy.<locals>.<genexpr>F)keependsc             3   s"   | ]}t tj|j jV  qd S )N)rH   rF   rG   parts)rJ   rc   )info_relr   r   rW      s    )
r\   r]   r`   r5   Zinfo_directoryrF   rG   relative_to
ValueErrorre   )rK   ra   pathsrootrB   r   )rf   r   _files_from_legacy   s     z0search_packages_info.<locals>._files_from_legacyc             s   s   | ]}|j V  qd S )N)r3   )rJ   reqr   r   r   rW      s    z'search_packages_info.<locals>.<genexpr>)keyzentry_points.txtF)rd   N 
ClassifierZSummaryz	Home-pageZAuthorzAuthor-emailZLicense)r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   r   )r   Ziter_distributionssortedzipr#   r$   joinr   r   r0   r   KeyErrorrU   lowerr\   r`   r]   rV   r2   Zraw_namer4   r5   r8   r9   get_allget)r'   envZquery_namesmissingrY   rb   rk   Z
query_namerK   r6   r7   Zentry_points_textr@   Z
files_iterr   rV   r   )rO   r   r%   c   sV    










r%   )distributionsr!   r"   r   c       	      C   sd  d}xXt | D ]J\}}d}|dkr.td td|j td|j td|j td|j td	|j td
|j td|j td|j	 tddj
|j tddj
|j |rtd|j td|j td x|jD ]}td| qW td x|jD ]}td|j  qW |rtd |jdkr<td qx|jD ]}td|j  qDW qW |S )zC
    Print the information from installed distributions found.
    FTr   z---zName: %szVersion: %szSummary: %szHome-page: %sz
Author: %szAuthor-email: %szLicense: %szLocation: %szRequires: %sz, zRequired-by: %szMetadata-Version: %szInstaller: %szClassifiers:z  %szEntry-points:zFiles:Nz+Cannot locate RECORD or installed-files.txt)	enumerater   r3   r4   r;   r<   r=   r>   r?   r5   rr   r6   r7   r9   r8   r:   r@   stripr   )	ry   r!   r"   Zresults_printedirK   
classifierrA   liner   r   r   r&      s>    
r&   )!r^   loggingrF   optparser   typingr   r   r   r   r   pip._vendor.packaging.utilsr   pip._internal.cli.base_commandr	   pip._internal.cli.status_codesr
   r   Zpip._internal.metadatar   r   pip._internal.utils.miscr   	getLoggerr*   r#   r   r2   r0   rH   r%   boolr&   r   r   r   r   <module>   s$   
%"`