o
    a                     @   s   d dl mZmZmZmZ d dlZd dlZddlmZm	Z	 dd Z
G dd deZeejZG d	d
 d
eZG dd deZG dd deZG dd deZdS )    )absolute_importdivisionprint_functionunicode_literalsN   )strsys_encodingc                  O   s6   zt j| i |t W S  t jy   g  Y S w N)
subprocesscheck_outputdecoder   
splitlinesCalledProcessError)argskwargs r   ?/tmp/google-cloud-sdk/lib/third_party/argcomplete/completers.py_call
   s
   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )ChoicesCompleterc                 C   s
   || _ d S r	   choices)selfr   r   r   r   __init__   s   
zChoicesCompleter.__init__c                 C   s*   t |tr
|t}t |tst|}|S r	   )
isinstancebytesr   r   r   )r   choicer   r   r   _convert   s
   


zChoicesCompleter._convertc                    s    fdd j D S )Nc                 3   s    | ]}  |V  qd S r	   )r   ).0cr   r   r   	<genexpr>   s    z,ChoicesCompleter.__call__.<locals>.<genexpr>r   )r   r   r   r   r   __call__   s   zChoicesCompleter.__call__N)__name__
__module____qualname__r   r   r!   r   r   r   r   r      s    r   c                   @   s"   e Zd ZdZd	ddZdd ZdS )
FilesCompleterzM
    File completer class, optionally takes a list of allowed extensions
    r   Tc                 C   s.   t |ttfr
|g}dd |D | _|| _d S )Nc                 S   s   g | ]
}| d  dqS )*.)lstrip)r   xr   r   r   
<listcomp>*   s    z+FilesCompleter.__init__.<locals>.<listcomp>)r   r   r   allowednamesdirectories)r   r+   r,   r   r   r   r   %   s   
zFilesCompleter.__init__c              	   K   s   g }| j r2| jrtdddj|dg}|dd |D 7 }| j D ]}|tdddj||dg7 }q|S |tdddj|dg7 }tdddj|dg}tt|t| }| jr`|d	d |D 7 }|S )
Nbashz-czcompgen -A directory -- '{p}')pc                 S      g | ]}|d  qS /r   r   fr   r   r   r*   2       z+FilesCompleter.__call__.<locals>.<listcomp>z$compgen -A file -X '!*.{0}' -- '{p}'zcompgen -A file -- '{p}'c                 S   r/   r0   r   r2   r   r   r   r*   ;   r4   )r+   r,   r   formatlistset)r   prefixr   
completionfilesr)   anticompr   r   r   r!   -   s   
zFilesCompleter.__call__N)r   T)r"   r#   r$   __doc__r   r!   r   r   r   r   r%       s    
r%   c                   @   s   e Zd Zdd Zdd ZdS )_FilteredFilesCompleterc                 C   s   |sJ d|| _ dS )z
        Create the completer

        A predicate accepts as its only argument a candidate path and either
        accepts it or rejects it.
        zExpected a callable predicateN	predicate)r   r?   r   r   r   r   ?   s   
z _FilteredFilesCompleter.__init__c                 k   s    t j|}z	t |pd}W n   Y dS t j|}|D ]"}||s'qt j||}| |s4qt j|r>|d n|V  qdS )z/
        Provide completions on prefix
        r'   Nr1   )	ospathdirnamelistdirbasename
startswithjoinr?   isdir)r   r8   r   
target_dirnamesincomplete_partname	candidater   r   r   r!   I   s   

z _FilteredFilesCompleter.__call__N)r"   r#   r$   r   r!   r   r   r   r   r=   >   s    
r=   c                   @   s   e Zd Zdd ZdS )DirectoriesCompleterc                 C   s   t j| tjjd d S )Nr>   )r=   r   r@   rA   rG   r   r   r   r   r   ]   s   zDirectoriesCompleter.__init__N)r"   r#   r$   r   r   r   r   r   rM   \   s    rM   c                   @   s    e Zd ZdZdd Zdd ZdS )SuppressCompleterzK
    A completer used to suppress the completion of specific arguments
    c                 C   s   d S r	   r   r   r   r   r   r   e   s   zSuppressCompleter.__init__c                 C   s   dS )z?
        Decide if the completion should be suppressed
        Tr   r   r   r   r   suppressh   s   zSuppressCompleter.suppressN)r"   r#   r$   r<   r   rO   r   r   r   r   rN   `   s    rN   )
__future__r   r   r   r   r@   r
   compatr   r   r   objectr   environEnvironCompleterr%   r=   rM   rN   r   r   r   r   <module>   s   
