U
    
Ha&                     @   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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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-tx790h60/pip/_internal/commands/show.pyadd_options   s     zShowCommand.add_options)optionsargsr   c                 C   s8   |st 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                   @   s   e Zd ZU eed< eed< eed< ee ed< ee ed< eed< eed< ee ed< eed	< eed
< eed< eed< eed< ee ed< eee  ed< dS )_PackageInfonameversionlocationrequiresrequired_by	installermetadata_versionclassifierssummaryhomepageauthorauthor_emaillicenseentry_pointsr   N)r+   r,   r-   r1   __annotations__r   r   r   r   r   r   r3   3   s   
r3   .)entryinfor   c                 C   sV   | rD| d dkrD|r |d dkr*|d7 }n|dd }| dd } q 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   ..)rE   N   r1   pathlibPath)rC   rD   r   r   r   _covert_legacy_entryE   s    
rK   )r(   r   c                 #   s  t  }dd | D  dd | D }t fddt| |D }|rXtdd| ttt	 d fd	d
}tt
tt	  ddd}tt
tt	  ddd}|D ]}z | }W n tk
r   Y qY nX z|d}	|	jdd}
W n tk
r   g }
Y nX ||p||}|dkr(d}nt|}|j}t|jt	|j|jpNddd | D |||j|jprd|dg |dd|dd|dd|dd|dd|
|dV  qd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>i   s    z(search_packages_info.<locals>.<dictcomp>c                 S   s   g | ]}t |qS r   r   )rN   r4   r   r   r   
<listcomp>m   s     z(search_packages_info.<locals>.<listcomp>c                    s   g | ]\}}| kr|qS r   r   )rN   r4   pkg	installedr   r   rQ   o   s      zPackage(s) not found: %s, )current_distr   c                    s    fdd  D S )Nc                    s2   g | ]*} j d d | D kr|jd p,dqS )c                 S   s   h | ]}t |jqS r   )r	   r4   )rN   dr   r   r   	<setcomp>x   s    zSsearch_packages_info.<locals>._get_requiring_packages.<locals>.<listcomp>.<setcomp>NameUNKNOWN)rL   iter_dependenciesmetadatarM   rV   r   r   rQ   u   s
   
zIsearch_packages_info.<locals>._get_requiring_packages.<locals>.<listcomp>)valuesr]   rS   r]   r   _get_requiring_packagest   s    
z5search_packages_info.<locals>._get_requiring_packages)rO   r   c                 S   s>   z|  d}W n tk
r$   Y d S X dd t| D S )NRECORDc                 s   s    | ]}t t|d  V  qdS )r   NrH   )rN   rowr   r   r   	<genexpr>   s     zCsearch_packages_info.<locals>._files_from_record.<locals>.<genexpr>)	read_textFileNotFoundErrorcsvreader
splitlines)rO   textr   r   r   _files_from_record}   s
    z0search_packages_info.<locals>._files_from_recordc                    s   z|  d}W n tk
r$   Y d S X dd |jddD }| j}| j}|d ksX|d kr\|S zt|| W n tk
r   | Y S X  j	s|S  fdd|D S )Nzinstalled-files.txtc                 s   s   | ]}|r|V  qd S Nr   rN   pr   r   r   rb      s      zCsearch_packages_info.<locals>._files_from_legacy.<locals>.<genexpr>Fkeependsc                 3   s"   | ]}t t|j jV  qd S rj   )rK   rI   rJ   partsrk   Zinfo_relr   r   rb      s   )
rc   rd   rg   r6   Zinfo_directoryrI   rJ   relative_to
ValueErrorro   )rO   rh   pathsrootrD   r   rp   r   _files_from_legacy   s$    

z0search_packages_info.<locals>._files_from_legacyzentry_points.txtFrm   N c                 S   s   g | ]
}|j qS r   )r4   )rN   reqr   r   r   rQ      s     
ClassifierZSummaryz	Home-pageZAuthorzAuthor-emailZLicense)r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   r   )r   Ziter_distributionssortedzipr$   r%   joinr   r   r1   r   r   KeyErrorrc   rg   rd   r\   r3   Zraw_namer5   r6   r[   r9   r:   get_allget)r(   envZquery_namesmissingr_   ri   ru   Z
query_namerO   Zentry_points_textrA   Z
files_iterr   r\   r   rS   r   r&   `   sZ    	












r&   )distributionsr"   r#   r   c           	      C   sP  d}t | D ]<\}}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 tdd
|j |rtd|j td|j td |jD ]}td| qtd |jD ]}td|  q|rtd |jdkr.td q|jD ]}td|  q4q|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: %srU   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   r4   r5   r<   r=   r>   r?   r@   r6   r{   r7   r8   r:   r9   r;   rA   stripr   )	r   r"   r#   Zresults_printedirO   
classifierrC   liner   r   r   r'      s>    



r'   )!re   loggingrI   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   r3   r1   rK   r&   boolr'   r   r   r   r   <module>   s&   
""b