U
    «ÃT_ˆ  ã                   @   s˜   d dl mZ d dlZd dl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mZ d dlmZ e e¡ZG d	d
„ d
eƒZdd„ Zddd„ZdS )é    )Úabsolute_importN)Ú
FeedParser)Úpkg_resources©Úcanonicalize_name)ÚCommand)ÚERRORÚSUCCESS)Úwrite_outputc                       s0   e Zd ZdZdZdZ‡ fdd„Zdd„ Z‡  ZS )ÚShowCommandzx
    Show information about one or more installed packages.

    The output is in RFC-compliant mail header format.
    z$
      %prog [options] <package> ...Tc                    s>   t t| ƒj||Ž | 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   )Úsuperr   Ú__init__Úcmd_optsÚ
add_optionÚparserÚinsert_option_group)ÚselfÚargsÚkw©Ú	__class__© ú?/tmp/pip-unpacked-wheel-8u7dkzi1/pip/_internal/commands/show.pyr      s     ûzShowCommand.__init__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   Úoptionsr   ÚqueryÚresultsr   r   r   Úrun*   s    
  ÿzShowCommand.run)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚusageÚignore_require_venvr   r(   Ú__classcell__r   r   r   r   r      s
   r   c                 #   sT  i ‰t jD ]}|ˆt|jƒ< q
dd„ | D ƒ}t‡fdd„t| |ƒD ƒƒ}|r^t dd |¡¡ dd„ }‡fdd„|D ƒD �]Ô‰ ˆ jˆ j	ˆ j
d	d„ ˆ  ¡ D ƒ|ˆ jƒd
œ}d}d}tˆ t jƒ�rˆ  d¡�rˆ  d¡}dd„ |D ƒ}	‡ fdd„|	D ƒ}	‡ fdd„|	D ƒ}ˆ  d¡�rnˆ  d¡}nPˆ  d¡�rXˆ  d¡}	‡ fdd„|	D ƒ}	‡ fdd„|	D ƒ}ˆ  d¡�rnˆ  d¡}ˆ  d¡�rŒˆ  d¡}
|
|d< ˆ  d¡�rÆˆ  d¡D ]"}| ¡ �r¢| ¡ |d<  �qÆ�q¢tƒ }| |¡ | ¡ }dD ]}| |¡||< �qâg }| ¡ D ](}| d¡�r| |tdƒd… ¡ �q||d< |�rHt|ƒ|d< |V  qxd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   g | ]}t |ƒ‘qS r   r   )Ú.0Únamer   r   r   Ú
<listcomp>B   s     z(search_packages_info.<locals>.<listcomp>c                    s   g | ]\}}|ˆ kr|‘qS r   r   )r0   r1   Úpkg©Ú	installedr   r   r2   D   s      zPackage(s) not found: %sú, c                    s   t | ƒ‰ ‡ fdd„tjD ƒS )Nc                    s(   g | ] }ˆ d d„ |  ¡ D ƒkr|j‘qS )c                 S   s   g | ]}t |jƒ‘qS r   )r   r1   )r0   Úrequiredr   r   r   r2   N   s     zSsearch_packages_info.<locals>.get_requiring_packages.<locals>.<listcomp>.<listcomp>)ÚrequiresÚproject_name©r0   r3   ©Úcanonical_namer   r   r2   K   s   ÿÿÿzHsearch_packages_info.<locals>.get_requiring_packages.<locals>.<listcomp>)r   r   Úworking_set)Úpackage_namer   r;   r   Úget_requiring_packagesI   s    
ÿz4search_packages_info.<locals>.get_requiring_packagesc                    s   g | ]}|ˆ krˆ | ‘qS r   r   r:   r4   r   r   r2   R   s      c                 S   s   g | ]
}|j ‘qS r   )r9   )r0   Údepr   r   r   r2   W   s     )r1   ÚversionÚlocationr8   Úrequired_byNÚRECORDc                 S   s   g | ]}|  d ¡d ‘qS )ú,r   )Úsplit)r0   Úlr   r   r   r2   `   s     c                    s   g | ]}t j ˆ j|¡‘qS r   )ÚosÚpathÚjoinrB   ©r0   Úp©Údistr   r   r2   a   s     c                    s   g | ]}t j |ˆ j¡‘qS r   ©rH   rI   ÚrelpathrB   rK   rM   r   r   r2   b   s     ÚMETADATAzinstalled-files.txtc                    s   g | ]}t j ˆ j|¡‘qS r   )rH   rI   rJ   Úegg_inforK   rM   r   r   r2   j   s     c                    s   g | ]}t j |ˆ j¡‘qS r   rO   rK   rM   r   r   r2   k   s     zPKG-INFOzentry_points.txtÚentry_pointsÚ	INSTALLERÚ	installer)úmetadata-versionÚsummaryú	home-pageÚauthorúauthor-emailÚlicensezClassifier: Úclassifiersr   )r   r=   r   r9   ÚsortedÚzipr!   r"   rJ   rA   rB   r8   Ú
isinstanceÚDistInfoDistributionÚhas_metadataÚget_metadata_linesÚget_metadataÚstripr   ÚfeedÚcloseÚgetÚ
splitlinesÚ
startswithÚappendÚlen)r&   rL   Zquery_namesÚmissingr?   ÚpackageÚ	file_listÚmetadataÚlinesÚpathsrS   ÚlineÚfeed_parserÚpkg_info_dictÚkeyr\   r   )rN   r5   r   r#   7   sl    
ÿ	û






r#   Fc           	   	   C   s¨  d}t | ƒD �]”\}}d}|dkr*tdƒ td| dd¡ƒ td| d	d¡ƒ td
| dd¡ƒ td| dd¡ƒ td| dd¡ƒ td| dd¡ƒ td| dd¡ƒ td| dd¡ƒ tdd | dg ¡¡ƒ tdd | dg ¡¡ƒ |�rdtd| dd¡ƒ td| dd¡ƒ tdƒ | d g ¡D ]}td!|ƒ �q(td"ƒ | d#g ¡D ]}td!| ¡ ƒ �qN|rtd$ƒ | d%g ¡D ]}td!| ¡ ƒ �q|d%|krtd&ƒ q|S )'zD
    Print the informations from installed distributions found.
    FTr   z---zName: %sr1   Ú zVersion: %srA   zSummary: %srW   zHome-page: %srX   z
Author: %srY   zAuthor-email: %srZ   zLicense: %sr[   zLocation: %srB   zRequires: %sr6   r8   zRequired-by: %srC   zMetadata-Version: %srV   zInstaller: %srU   zClassifiers:r\   z  %szEntry-points:rS   zFiles:r   z!Cannot locate installed-files.txt)Ú	enumerater
   rg   rJ   rd   )	Údistributionsr   r    Zresults_printedÚirN   Ú
classifierÚentryrr   r   r   r   r$   �   sB    
ÿ
r$   )FF)Ú
__future__r   ÚloggingrH   Úemail.parserr   Úpip._vendorr   Úpip._vendor.packaging.utilsr   Úpip._internal.cli.base_commandr   Úpip._internal.cli.status_codesr   r	   Úpip._internal.utils.miscr
   Ú	getLoggerr)   r!   r   r#   r$   r   r   r   r   Ú<module>   s   
#X