o
    @&ßaÏ+  ã                   @   s¾   d dl Z d dl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 e  e¡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G dd„ deƒZG dd„ deƒZdS )é    N)Úraw_config_parse©Úcompat_shell_quote)Ú
CLICommand)Ú emit_top_level_args_parsed_eventc                   @   s   e Zd ZdS )ÚInvalidAliasExceptionN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú./usr/lib/python3/dist-packages/awscli/alias.pyr      s    r   c                   @   sN   e Zd Zej ej dddd¡¡fdd„Zdd„ Zd	d
„ Z	dd„ Z
dd„ ZdS )ÚAliasLoaderú~z.awsÚcliÚaliasc                 C   s   || _ d| _dS )z´Interface for loading and interacting with alias file

        :param alias_filename: The name of the file to load aliases from.
            This file must be an INI file.
        N)Ú	_filenameÚ_aliases)ÚselfÚalias_filenamer   r   r   Ú__init__!   s   
zAliasLoader.__init__c                 C   s"   |   ¡ | _|  | j di ¡¡ d S ©NÚtoplevel)Ú_load_aliasesr   Ú_cleanup_alias_valuesÚget©r   r   r   r   Ú_build_aliases,   s   
zAliasLoader._build_aliasesc                 C   s$   t j | j¡rt| jdd�S di iS )NF)Úparse_subsectionsr   )ÚosÚpathÚexistsr   r   r   r   r   r   r   0   s
   ÿzAliasLoader._load_aliasesc                 C   s   |D ]
}||   ¡ ||< qd S ©N)Ústrip)r   Úaliasesr   r   r   r   r   6   s   ýz!AliasLoader._cleanup_alias_valuesc                 C   s    | j d u r	|  ¡  | j  di ¡S r   )r   r   r   r   r   r   r   Úget_aliases<   s   
zAliasLoader.get_aliasesN)r   r	   r
   r   r   Ú
expanduserÚjoinr   r   r   r   r$   r   r   r   r   r       s    ÿ
ÿr   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚAliasCommandInjectorc                 C   ó   || _ || _dS )züInjects alias commands for a command table

        :type session: botocore.session.Session
        :param session: The botocore session

        :type alias_loader: awscli.alias.AliasLoader
        :param alias_loader: The alias loader to use
        N)Ú_sessionÚ_alias_loader)r   ÚsessionÚalias_loaderr   r   r   r   C   s   	
zAliasCommandInjector.__init__c                 C   sh   | j  ¡  ¡ D ]*\}}| d¡rt||ƒ}n||| j||g}||v r)| || ¡ t|Ž }|||< qd S )Nú!)r*   r$   ÚitemsÚ
startswithÚExternalAliasCommandr)   ÚappendÚServiceAliasCommand)r   Úcommand_tableÚparserÚ
alias_nameÚalias_valueÚ	alias_cmdÚservice_alias_cmd_argsr   r   r   Úinject_aliasesO   s   
ÿ

þÿ
ïz#AliasCommandInjector.inject_aliasesN)r   r	   r
   r   r9   r   r   r   r   r'   B   s    r'   c                   @   s:   e Zd ZdZdd„ Zdd„ Zedd„ ƒZejdd„ ƒZd	S )
ÚBaseAliasCommandTc                 C   r(   )a%  Base class for alias command

        :type alias_name: string
        :param alias_name: The name of the alias

        :type alias_value: string
        :param alias_value: The parsed value of the alias. This can be
            retrieved from `AliasLoader.get_aliases()[alias_name]`
        N)Ú_alias_nameÚ_alias_value)r   r5   r6   r   r   r   r   g   s   

zBaseAliasCommand.__init__c                 C   s   t dƒ‚)NÚ__call__)ÚNotImplementedError)r   ÚargsÚparsed_argsr   r   r   r=   t   s   zBaseAliasCommand.__call__c                 C   s   | j S r!   ©r;   r   r   r   r   Únamew   s   zBaseAliasCommand.namec                 C   s
   || _ d S r!   rA   )r   Úvaluer   r   r   rB   {   s   
N)	r   r	   r
   Ú_UNDOCUMENTEDr   r=   ÚpropertyrB   Úsetterr   r   r   r   r:   d   s    
r:   c                       sH   e Zd ZddgZ	d‡ fdd„	Zdd„ Zdd	„ Zd
d„ Zdd„ Z‡  Z	S )r2   ÚdebugÚprofileNc                    s.   t t| ƒ ||¡ || _|| _|| _|| _dS )aû  Command for a `toplevel` subcommand alias

        :type alias_name: string
        :param alias_name: The name of the alias

        :type alias_value: string
        :param alias_value: The parsed value of the alias. This can be
            retrieved from `AliasLoader.get_aliases()[alias_name]`

        :type session: botocore.session.Session
        :param session: The botocore session

        :type command_table: dict
        :param command_table: The command table containing all of the
            possible service command objects that a particular alias could
            redirect to.

        :type parser: awscli.argparser.MainArgParser
        :param parser: The parser to parse commands provided at the top level
            of a CLI command which includes service commands and global
            parameters. This is used to parse the service command and any
            global parameters from the alias's value.

        :type shadow_proxy_command: CLICommand
        :param shadow_proxy_command: A built-in command that
            potentially shadows the alias in name. If the alias
            references this command in its value, the alias should proxy
            to this command as oppposed to proxy to itself in the command
            table
        N)Úsuperr2   r   r)   Ú_command_tableÚ_parserÚ_shadow_proxy_command)r   r5   r6   r+   r3   r4   Úshadow_proxy_command©Ú	__class__r   r   r   †   s
    
zServiceAliasCommand.__init__c                 C   sˆ   |   ¡ }| j |¡\}}|  ||¡ | |¡ t d| j||j¡ | j	|j }| j
r?| j
j}||jkr?t d| j
| j¡ | j
}|||ƒS )Nz/Alias %r passing on arguments: %r to %r commandz/Using shadowed command object: %s for alias: %s)Ú_get_alias_argsrK   Úparse_known_argsÚ_update_parsed_globalsÚextendÚLOGrG   r;   ÚcommandrJ   rL   rB   )r   r?   Úparsed_globalsÚ
alias_argsÚparsed_alias_argsÚ	remainingrU   Úshadow_namer   r   r   r=   ¬   s*   ÿ

þ
ý
zServiceAliasCommand.__call__c              
   C   sf   zt  | j¡}W n ty } ztd| j|| jf ƒ‚d }~ww dd„ |D ƒ}t d| j| j|¡ |S )NzLValue of alias "%s" could not be parsed. Received error: %s when parsing:
%sc                 S   s   g | ]}|  tj¡‘qS r   )r"   r   Úlinesep)Ú.0Úargr   r   r   Ú
<listcomp>Ò   s    z7ServiceAliasCommand._get_alias_args.<locals>.<listcomp>z2Expanded subcommand alias %r with value: %r to: %r)ÚshlexÚsplitr<   Ú
ValueErrorr   r;   rT   rG   )r   rW   Úer   r   r   rP   È   s"   
ÿÿÿ€ÿ
þz#ServiceAliasCommand._get_alias_argsc                 C   s:   |   |¡}t| j|ƒ |D ]}t||ƒ}t|||ƒ qd S r!   )Ú _get_global_parameters_to_updater   r)   ÚgetattrÚsetattr)r   rX   rV   Úglobal_params_to_updateÚ
param_nameÚupdated_param_valuer   r   r   rR   Ù   s   ÿ
þz*ServiceAliasCommand._update_parsed_globalsc                 C   sT   g }t |ƒ ¡ D ]\}}| j |¡|kr'|| jv r"td|| jf ƒ‚| |¡ q|S )NzZGlobal parameter "--%s" detected in alias "%s" which is not support in subcommand aliases.)Úvarsr.   rK   Úget_defaultÚUNSUPPORTED_GLOBAL_PARAMETERSr   r;   r1   )r   rX   rf   Úparsed_paramrC   r   r   r   rc   æ   s   
ÿÿÿ
€z4ServiceAliasCommand._get_global_parameters_to_updater!   )
r   r	   r
   rk   r   r=   rP   rR   rc   Ú__classcell__r   r   rN   r   r2   €   s    þÿ&r2   c                   @   s"   e Zd Zejfdd„Zdd„ ZdS )r0   c                 C   s   || _ || _|| _dS )a0  Command for external aliases

        Executes command external of CLI as opposed to being a proxy
        to another command.

        :type alias_name: string
        :param alias_name: The name of the alias

        :type alias_value: string
        :param alias_value: The parsed value of the alias. This can be
            retrieved from `AliasLoader.get_aliases()[alias_name]`

        :type invoker: callable
        :param invoker: Callable to run arguments of external alias. The
            signature should match that of ``subprocess.call``
        N)r;   r<   Ú_invoker)r   r5   r6   Úinvokerr   r   r   r   ý   s   
zExternalAliasCommand.__init__c                 C   sP   | j dd … g}| dd„ |D ƒ¡ d |¡}t d| j| j |¡ | j|dd�S )Né   c                 s   s   � | ]}t |ƒV  qd S r!   r   )r\   Úar   r   r   Ú	<genexpr>  s   € z0ExternalAliasCommand.__call__.<locals>.<genexpr>ú z1Using external alias %r with value: %r to run: %rT)Úshell)r<   rS   r&   rT   rG   r;   rn   )r   r?   rV   Úcommand_componentsrU   r   r   r   r=     s   ÿ

þzExternalAliasCommand.__call__N)r   r	   r
   Ú
subprocessÚcallr   r=   r   r   r   r   r0   ü   s    r0   )Úloggingr   r_   rv   Úbotocore.configloaderr   Úawscli.compatr   Úawscli.commandsr   Úawscli.utilsr   Ú	getLoggerr   rT   Ú	Exceptionr   Úobjectr   r'   r:   r2   r0   r   r   r   r   Ú<module>   s   
""|