3
ûâde€  ã               @   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-build-red6nood/pip/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__ÚusageZ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,   r/   ÚnameÚversionÚlocationr   ÚrequiresÚrequired_byÚ	installerÚmetadata_versionÚclassifiersÚsummaryÚhomepageÚauthorÚauthor_emailÚlicenseÚentry_pointsr   r   r   r   r   r   r1   6   s   
r1   .)Ú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éÿÿÿÿ)rB   rD   )r/   ÚpathlibÚPath)r@   rA   r   r   r   Ú_convert_legacy_entryH   s    
rG   )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Ð   w¨Y 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�p�d|jdg ƒ|jddƒ|jddƒ|jddƒ|jddƒ|jddƒ||d�V  q¨W 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   )rI   r2   r   r   r   ú
<listcomp>m   s    z(search_packages_info.<locals>.<listcomp>c                s   g | ]\}}|ˆ kr|‘qS r   r   )rI   r2   Úpkg)Ú	installedr   r   rL   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   r2   )rI   Údr   r   r   ú	<setcomp>y   s    zRsearch_packages_info.<locals>._get_requiring_packages.<locals>.<genexpr>.<setcomp>ÚNameÚUNKNOWNN)rH   Úiter_dependenciesÚmetadata)rI   rJ   )rO   r   r   ú	<genexpr>v   s   zHsearch_packages_info.<locals>._get_requiring_packages.<locals>.<genexpr>)Úvalues)rO   )rN   )rO   r   Ú_get_requiring_packagest   s    
z5search_packages_info.<locals>._get_requiring_packages)rJ   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)r/   rE   rF   )rI   Úrowr   r   r   rV   ‚   s    zCsearch_packages_info.<locals>._files_from_record.<locals>.<genexpr>)Ú	read_textÚFileNotFoundErrorÚcsvÚreaderÚ
splitlines)rJ   Ú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   )rI   Úpr   r   r   rV   ‰   s    zCsearch_packages_info.<locals>._files_from_legacy.<locals>.<genexpr>F)Úkeependsc             3   s"   | ]}t tj|ƒjˆ jƒV  qd S )N)rG   rE   rF   Úparts)rI   rb   )Úinfo_relr   r   rV   •   s    )
r[   r\   r_   r4   Zinfo_directoryrE   rF   Zrelative_toÚ
ValueErrorrd   )rJ   r`   ÚpathsÚrootrA   r   )re   r   Ú_files_from_legacy„   s     z0search_packages_info.<locals>._files_from_legacyc             s   s   | ]}|j V  qd S )N)r2   )rI   Úreqr   r   r   rV   ž   s    z'search_packages_info.<locals>.<genexpr>)Úkeyzentry_points.txtF)rc   NÚ Ú
ClassifierZSummaryz	Home-pageZAuthorzAuthor-emailZLicense)r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r   )r   Ziter_distributionsÚsortedÚzipr#   r$   Újoinr   r   r/   r   ÚKeyErrorrT   Úlowerr[   r_   r\   rU   r1   Zraw_namer3   r4   r7   r8   Úget_allÚget)r'   ÚenvÚquery_namesÚmissingrX   ra   ri   Z
query_namerJ   r5   r6   Zentry_points_textr?   Z
files_iterr   rU   r   )rN   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|ƒ qàW 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   r2   r3   r:   r;   r<   r=   r>   r4   rp   r5   r6   r8   r7   r9   r?   Ústripr   )	rx   r!   r"   Úresults_printedÚirJ   Ú
classifierr@   Úliner   r   r   r&   Â   s>    
r&   )!r]   ÚloggingrE   Úoptparser   Útypingr   r   r   r   r   Úpip._vendor.packaging.utilsr   Zpip._internal.cli.base_commandr	   Zpip._internal.cli.status_codesr
   r   Zpip._internal.metadatar   r   Zpip._internal.utils.miscr   Ú	getLoggerr*   r#   r   r1   r/   rG   r%   Úboolr&   r   r   r   r   Ú<module>   s$   
%"`