B
    `d'                 @   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mZmZmZ d dlmZ eeZG dd de	Zdd Zdd ZdS )    )absolute_importN)six)
cmdoptions)IndexGroupCommand)CommandError)PackageFinder)SelectionPreferences)make_link_collector)dist_is_editableget_installed_distributionstabulatewrite_output)get_installerc                   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-hu9qqap1/pip/_internal/commands/list.pyr    &   sz    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(   r/   sessionr2   r3   r-   r-   r.   _build_package_finderv   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(   r/   r)   packagesr-   r-   r.   run   s"    

zListCommand.runc             C   s   dd |  ||D S )Nc             S   s   g | ]}|j |jkr|qS r-   )latest_versionparsed_version).0distr-   r-   r.   
<listcomp>   s    z,ListCommand.get_outdated.<locals>.<listcomp>)iter_packages_latest_infos)r(   rF   r/   r-   r-   r.   rC      s    zListCommand.get_outdatedc             C   s   dd |  ||D S )Nc             S   s   g | ]}|j |jkr|qS r-   )rH   rI   )rJ   rK   r-   r-   r.   rL      s    z,ListCommand.get_uptodate.<locals>.<listcomp>)rM   )r(   rF   r/   r-   r-   r.   rD      s    zListCommand.get_uptodatec                s>   t   x$|D ]} dd | D  qW  fdd|D S )Nc             s   s   | ]}|j V  qd S )N)key)rJ   requirementr-   r-   r.   	<genexpr>   s    z/ListCommand.get_not_required.<locals>.<genexpr>c                s   h | ]}|j  kr|qS r-   )rN   )rJ   pkg)dep_keysr-   r.   	<setcomp>   s    z/ListCommand.get_not_required.<locals>.<setcomp>)setupdaterequires)r(   rF   r/   rK   r-   )rR   r.   rB      s    
zListCommand.get_not_requiredc          	   #   sV   |  B}| |  fdd}x t||D ]}|d k	r2|V  q2W W d Q R X d S )Nc                sp   d}  | j}js$dd |D } j| jd}||}|d krHd S |j}|jjr\d}nd}|| _	|| _
| S )Nunknownc             S   s   g | ]}|j js|qS r-   )versionis_prerelease)rJ   	candidater-   r-   r.   rL      s    zOListCommand.iter_packages_latest_infos.<locals>.latest_info.<locals>.<listcomp>)project_namewheelsdist)find_all_candidatesrN   r4   make_candidate_evaluatorr[   sort_best_candidaterX   linkis_wheelrH   latest_filetype)rK   typZall_candidatesZ	evaluatorbest_candidateremote_version)finderr/   r-   r.   latest_info   s     

z;ListCommand.iter_packages_latest_infos.<locals>.latest_info)_build_sessionr7   map)r(   rF   r/   r6   rh   rK   r-   )rg   r/   r.   rM      s    z&ListCommand.iter_packages_latest_infosc             C   s   t |dd d}|jdkr:|r:t||\}}| || nb|jdkrxV|D ]4}|jdkrntd|j|j|j qJtd|j|j qJW n|jd	krtt	|| d S )
Nc             S   s
   | j  S )N)r[   lower)rK   r-   r-   r.   <lambda>       z4ListCommand.output_package_listing.<locals>.<lambda>)rN   r   r      z%s==%s (%s)z%s==%sr   )
sortedr   format_for_columnsoutput_package_listing_columnsverboser   r[   rX   locationformat_for_json)r(   rF   r/   dataheaderrK   r-   r-   r.   rE      s    



z"ListCommand.output_package_listingc             C   sf   t |dkr|d| t|\}}t |dkrL|ddtdd | x|D ]}t| qRW d S )Nr   rn    c             S   s   d|  S )N-r-   )xr-   r-   r.   rl      rm   z<ListCommand.output_package_listing_columns.<locals>.<lambda>)leninsertr   joinrj   r   )r(   ru   rv   Zpkg_stringssizesvalr-   r-   r.   rq      s    
z*ListCommand.output_package_listing_columns)__name__
__module____qualname____doc__usager    r7   rG   rC   rD   rB   rM   rE   rq   __classcell__r-   r-   )r,   r.   r      s   P!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	 xt| D ]l}|j|jg}|r||j ||j |jdkst|r||j	 |jdkr|t
| || qdW ||fS )
z_
    Convert the package data into something usable
    by output_package_listing_columns.
    PackageVersionZLatestTypern   c             s   s   | ]}t |V  qd S )N)r
   )rJ   ry   r-   r-   r.   rP     s    z%format_for_columns.<locals>.<genexpr>ZLocationZ	Installer)r=   rr   anyappendr[   rX   rH   rc   r
   rs   r   )pkgsr/   Zrunning_outdatedrv   ru   Zprojrowr-   r-   r.   rp      s(    




rp   c             C   sz   g }xj| D ]b}|j t|jd}|jdkrB|j|d< t||d< |jrbt|j|d< |j	|d< |
| q
W t|S )N)namerX   rn   rs   	installerrH   rc   )r[   r   	text_typerX   rr   rs   r   r=   rH   rc   r   r   dumps)rF   r/   ru   rK   infor-   r-   r.   rt     s    



rt   )
__future__r   r   loggingpip._vendorr   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   r   pip._internal.utils.packagingr   	getLoggerr   loggerr   rp   rt   r-   r-   r-   r.   <module>   s    
 ]%