U
    @vg)                     @   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 d dlmZ d d	lmZ d d
lmZ d dlmZmZmZ d dlmZ d dlmZ eeZG dd deZdd Z dd Z!dd Z"dS )    )absolute_importN)six)zip_longest)
cmdoptions)IndexGroupCommand)CommandError)PackageFinder)SelectionPreferences)make_link_collector)dist_is_editableget_installed_distributionswrite_output)get_installer)parsec                       sd   e Zd ZdZdZ fddZdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Z  ZS )ListCommandzt
    List installed packages, including editables.

    Packages are listed in a case-insensitive sorted order.
    z
      %prog [options]c                    s  t t| j|| | j}|jdddddd |jddddd	d |jd
ddddd |jdddddd | jjdddddd |t  |jddddd |jddddddd |jddddd  |jd!d"d#d$d  |jd%dd#d&d'd( ttj| j	}| j	
d)| | j	
d)| d S )*Nz-oz
--outdated
store_trueFzList outdated packages)actiondefaulthelpz-uz
--uptodatezList uptodate packagesz-ez
--editablezList editable projects.z-lz--localzSIf in a virtualenv that has global access, do not list globally-installed packages.z--useruserz,Only output packages installed in user-site.)destr   r   r   z--prezYInclude pre-release and development versions. By default, pip only finds stable versions.z--formatstorelist_formatcolumns)r   freezejsonzBSelect the output format among: columns (default), freeze, or json)r   r   r   choicesr   z--not-requirednot_requiredz>List packages that are not dependencies of installed packages.)r   r   r   z--exclude-editablestore_falseinclude_editablez%Exclude editable package from output.z--include-editablez%Include editable package from output.T)r   r   r   r   r   )superr   __init__cmd_opts
add_optionr   	list_pathmake_option_groupindex_groupparserinsert_option_group)selfargskwr"   
index_opts	__class__ ?/tmp/pip-unpacked-wheel-gw11q0wt/pip/_internal/commands/list.pyr!   (   s        
 zListCommand.__init__c                 C   s(   t ||d}td|jd}tj||dS )zK
        Create a package finder appropriate to this list command.
        )optionsF)allow_yankedallow_all_prereleases)link_collectorselection_prefs)r
   r	   prer   create)r)   r1   sessionr4   r5   r/   r/   r0   _build_package_finderx   s    z!ListCommand._build_package_finderc                 C   s   |j r|jrtdt| t|j|j|j|j	|j
d}|jrL| ||}|j r`| ||}n|jrr| ||}| || d S )Nz5Options --outdated and --uptodate cannot be combined.)
local_only	user_onlyeditables_onlyinclude_editablespaths)outdatedZuptodater   r   check_list_path_optionr   localr   editabler   pathr   get_not_requiredget_outdatedget_uptodateoutput_package_listing)r)   r1   r*   packagesr/   r/   r0   run   s&    
zListCommand.runc                 C   s   dd |  ||D S )Nc                 S   s,   g | ]$}t t|jt t|jkr|qS r/   r   strlatest_versionparsed_version.0distr/   r/   r0   
<listcomp>   s   z,ListCommand.get_outdated.<locals>.<listcomp>iter_packages_latest_infosr)   rH   r1   r/   r/   r0   rE      s    
zListCommand.get_outdatedc                 C   s   dd |  ||D S )Nc                 S   s,   g | ]$}t t|jt t|jkr|qS r/   rJ   rN   r/   r/   r0   rQ      s   z,ListCommand.get_uptodate.<locals>.<listcomp>rR   rT   r/   r/   r0   rF      s    
zListCommand.get_uptodatec                    s:   t   |D ]} dd | D  q
 fdd|D S )Nc                 s   s   | ]}|j V  qd S Nkey)rO   requirementr/   r/   r0   	<genexpr>   s     z/ListCommand.get_not_required.<locals>.<genexpr>c                    s   h | ]}|j  kr|qS r/   rV   )rO   pkgZdep_keysr/   r0   	<setcomp>   s     
 z/ListCommand.get_not_required.<locals>.<setcomp>)setupdaterequires)r)   rH   r1   rP   r/   r[   r0   rD      s    zListCommand.get_not_requiredc              	   c   s   |  |}| ||}|D ]t}d}||j}|jsDdd |D }|j|jd}||}	|	d krfq|	j}
|	j	j
rzd}nd}|
|_||_|V  qW 5 Q R X d S )Nunknownc                 S   s   g | ]}|j js|qS r/   )versionis_prerelease)rO   	candidater/   r/   r0   rQ      s    z:ListCommand.iter_packages_latest_infos.<locals>.<listcomp>)project_namewheelsdist)_build_sessionr9   find_all_candidatesrW   r6   make_candidate_evaluatorrd   sort_best_candidatera   linkis_wheelrL   latest_filetype)r)   rH   r1   r8   finderrP   typZall_candidatesZ	evaluatorbest_candidateremote_versionr/   r/   r0   rS      s(    
z&ListCommand.iter_packages_latest_infosc                 C   s   t |dd d}|jdkr:|r:t||\}}| || n^|jdkr|D ]4}|jdkrltd|j|j|j qHtd|j|j qHn|jd	krtt	|| d S )
Nc                 S   s
   | j  S rU   )rd   lower)rP   r/   r/   r0   <lambda>       z4ListCommand.output_package_listing.<locals>.<lambda>rV   r   r      z%s==%s (%s)z%s==%sr   )
sortedr   format_for_columnsoutput_package_listing_columnsverboser   rd   ra   locationformat_for_json)r)   rH   r1   dataheaderrP   r/   r/   r0   rG      s"    

 
z"ListCommand.output_package_listingc                 C   sb   t |dkr|d| t|\}}t |dkrL|ddtdd | |D ]}t| qPd S )Nr   ru    c                 S   s   d|  S )N-r/   )xr/   r/   r0   rs      rt   z<ListCommand.output_package_listing_columns.<locals>.<lambda>)leninserttabulatejoinmapr   )r)   r|   r}   Zpkg_stringssizesvalr/   r/   r0   rx      s    z*ListCommand.output_package_listing_columns)__name__
__module____qualname____doc__usager!   r9   rI   rE   rF   rD   rS   rG   rx   __classcell__r/   r/   r-   r0   r      s   Pr   c                 C   s   t | dkstdgtdd | D  }| D ]}dd t||D }q,g }| D ](}ddd t||D }|| qN||fS )Nr   c                 s   s   | ]}t |V  qd S rU   )r   rO   r   r/   r/   r0   rY      s     ztabulate.<locals>.<genexpr>c                 S   s"   g | ]\}}t |tt|qS r/   )maxr   rK   rO   scr/   r/   r0   rQ      s     ztabulate.<locals>.<listcomp>r~   c                 S   s*   g | ]"\}}|d k	r"t ||ndqS )N )rK   ljustr   r/   r/   r0   rQ     s   )r   AssertionErrorr   r   r   append)valsr   rowresultZdisplayr/   r/   r0   r      s    
r   c                 C   s   |j }|rddddg}nddg}g }|jdks@tdd | D rJ|d |jdkr^|d	 | D ]l}|j|jg}|r||j ||j |jdkst|r||j	 |jdkr|t
| || qb||fS )
z_
    Convert the package data into something usable
    by output_package_listing_columns.
    PackageVersionZLatestTyperu   c                 s   s   | ]}t |V  qd S rU   )r   r   r/   r/   r0   rY     s     z%format_for_columns.<locals>.<genexpr>ZLocationZ	Installer)r?   ry   anyr   rd   ra   rL   rm   r   rz   r   )pkgsr1   Zrunning_outdatedr}   r|   Zprojr   r/   r/   r0   rw     s(    



rw   c                 C   sv   g }| D ]b}|j t|jd}|jdkr@|j|d< t||d< |jr`t|j|d< |j	|d< |
| qt|S )N)namera   ru   rz   	installerrL   rm   )rd   r   	text_typera   ry   rz   r   r?   rL   rm   r   r   dumps)rH   r1   r|   rP   infor/   r/   r0   r{   -  s    



r{   )#
__future__r   r   loggingpip._vendorr   Zpip._vendor.six.movesr   Zpip._internal.clir   pip._internal.cli.req_commandr   pip._internal.exceptionsr   "pip._internal.index.package_finderr   $pip._internal.models.selection_prefsr	   !pip._internal.self_outdated_checkr
   pip._internal.utils.miscr   r   r   pip._internal.utils.packagingr   Zpip._vendor.packaging.versionr   	getLoggerr   loggerr   r   rw   r{   r/   r/   r/   r0   <module>   s&   
 Y%