o
    @&ßatD  ã                   @   sª   d Z ddlZddlZddlmZ 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G dd„ deƒZG dd„ deƒZdS )aÜ  Module for parsing shorthand syntax.

This module parses any CLI options that use a "shorthand"
syntax::

    --foo A=b,C=d
         |------|
            |
            Shorthand syntax


This module provides two main classes to do this.
First, there's a ``ShorthandParser`` class.  This class works
on a purely syntactic level.  It looks only at the string value
provided to it in order to figure out how the string should be parsed.

However, because there was a pre-existing shorthand parser, we need
to remain backwards compatible with the previous parser.  One of the
things the previous parser did was use the associated JSON model to
control how the expression was parsed.

In order to accommodate this a post processing class is provided that
takes the parsed values from the ``ShorthandParser`` as well as the
corresponding JSON model for the CLI argument and makes any adjustments
necessary to maintain backwards compatibility.  This is done in the
``BackCompatVisitor`` class.

é    N)Úis_document_typec                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_NamedRegexc                 C   s   || _ t |tj¡| _d S ©N)ÚnameÚreÚcompileÚUNICODEÚregex)Úselfr   Ú	regex_str© r   ú2/usr/lib/python3/dist-packages/awscli/shorthand.pyÚ__init__3   s   z_NamedRegex.__init__c                 C   s   | j  |¡S r   )r	   Úmatch©r
   Úvaluer   r   r   r   7   s   z_NamedRegex.matchN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   2   s    r   c                   @   s   e Zd Zdd„ ZdS )ÚShorthandParseErrorc                 C   s®   | j d| j}}}d| j d | j… v r&| j d | j…  d¡}| j| d }d| j | jd … v rL| j| j | jd …  d¡ }| j d |… }| j |d … }d|d| d |f S )NÚ Ú
é   z%s
%s%sú ú^)r   ÚindexÚrindex)r
   ÚconsumedÚ	remainingÚ
num_spacesÚlast_newlineÚnext_newliner   r   r   Ú_error_location=   s   z#ShorthandParseError._error_locationN)r   r   r   r"   r   r   r   r   r   ;   s    r   c                       ó$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚShorthandParseSyntaxErrorc                    s4   || _ || _|| _|| _|  ¡ }tt| ƒ |¡ d S r   )r   ÚexpectedÚactualr   Ú_construct_msgÚsuperr$   r   )r
   r   r%   r&   r   Úmsg©Ú	__class__r   r   r   U   s   z"ShorthandParseSyntaxError.__init__c                 C   s   d| j | j|  ¡ f }|S )Nz,Expected: '%s', received: '%s' for input:
%s)r%   r&   r"   ©r
   r)   r   r   r   r'   ]   s   ýz(ShorthandParseSyntaxError._construct_msg©r   r   r   r   r'   Ú__classcell__r   r   r*   r   r$   T   s    r$   c                       r#   )ÚDuplicateKeyInObjectErrorc                    s.   || _ || _|| _|  ¡ }tt| ƒ |¡ d S r   )Úkeyr   r   r'   r(   r/   r   )r
   r0   r   r   r)   r*   r   r   r   f   s
   z"DuplicateKeyInObjectError.__init__c                 C   s   d| j |  ¡ f }|S )NzxSecond instance of key "%s" encountered for input:
%s
This is often because there is a preceding "," instead of a space.)r0   r"   r,   r   r   r   r'   m   s   üz(DuplicateKeyInObjectError._construct_msgr-   r   r   r*   r   r/   e   s    r/   c                   @   s   e Zd ZdS )ÚDocumentTypesNotSupportedErrorN)r   r   r   r   r   r   r   r1   v   s    r1   c                   @   s  e Zd ZdZeddƒZeddƒZdZdZdZ	d	Z
ed
dje
eed�ƒZeddje
ee	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dd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd>d)d*„Zd+d,„ Zd-d.„ Zd?d0d1„Zd2d3„ Zd4d5„ Z d6d7„ Z!d8d9„ Z"d:d;„ Z#d<d=„ Z$d(S )@ÚShorthandParserz—Parses shorthand syntax in the CLI.

    Note that this parser does not rely on any JSON models to control
    how to parse the shorthand syntax.

    zsingled quotedz\'(?:\\\\|\\\'|[^\'])*\'zdouble quotedz"(?:\\\\|\\"|[^"])*"u   \!\#-&\(-\+\--\<\>-Z\\-z|-ï¿¿u   \s\!\#-&\(-\+\--\\\^-\|~-ï¿¿u   \s\!\#-&\(-\+\--\<\>-ï¿¿z(\\,)ÚfirstzC({escaped_comma}|[{start_word}])({escaped_comma}|[{follow_chars}])*)Úescaped_commaÚ
start_wordÚfollow_charsÚsecondc                 C   s
   g | _ d S r   )Ú_tokens©r
   r   r   r   r   ™   s   
zShorthandParser.__init__c                 C   s   || _ d| _|  ¡ S )aS  Parse shorthand syntax.

        For example::

            parser = ShorthandParser()
            parser.parse('a=b')  # {'a': 'b'}
            parser.parse('a=b,c')  # {'a': ['b', 'c']}

        :type value: str
        :param value: Any value that needs to be parsed.

        :return: Parsed value, which will be a dictionary.
        r   )Ú_input_valueÚ_indexÚ
_parameterr   r   r   r   Úparseœ   s   zShorthandParser.parsec                 C   s„   i }|   ¡ \}}|||< | j}| jt| jƒk r@| jddd� |   ¡ \}}||v r1t|| j|d ƒ‚|||< | j}| jt| jƒk s|S ©Nú,T©Úconsume_whitespacer   )Ú_keyvalr;   Úlenr:   Ú_expectr/   )r
   Úparamsr0   ÚvalÚ
last_indexr   r   r   r<   ®   s   ÿözShorthandParser._parameterc                 C   s&   |   ¡ }| jddd� |  ¡ }||fS )Nú=Tr@   )Ú_keyrD   Ú_values)r
   r0   Úvaluesr   r   r   rB   Á   s   zShorthandParser._keyvalc                 C   sR   t jt j d }| j}|  ¡ s!|  ¡ |vrn|  jd7  _|  ¡ r| j|| j… S )Nz-_.#/:r   )ÚstringÚascii_lettersÚdigitsr;   Ú_at_eofÚ_currentr:   )r
   Úvalid_charsÚstartr   r   r   rI   È   s   ýzShorthandParser._keyc                 C   s<   |   ¡ rdS |  ¡ dkr|  ¡ S |  ¡ dkr|  ¡ S |  ¡ S )Nr   ú[ú{)rO   rP   Ú_explicit_listÚ_hash_literalÚ
_csv_valuer9   r   r   r   rJ   Ò   s   zShorthandParser._valuesc                 C   sÂ   |   ¡ }|  ¡  |  ¡ s| j| j dkr|S | jddd� |g}	 z!|  ¡ }|  ¡  |  ¡ r5| |¡ W n"| jddd� | |¡ W n tyU   |  ¡ rN‚ |  	d¡ Y nw q!t
|ƒdkr_|S |S r>   )Ú_first_valueÚ_consume_whitespacerO   r:   r;   rD   Ú_second_valueÚappendr$   Ú_backtrack_torC   )r
   Úfirst_valueÚcsv_listÚcurrentr   r   r   rW   Ý   s2   
	
ô÷zShorthandParser._csv_valuec                 C   s>   | j  | j| jd … ¡}|d ur|  |¡}| dd¡ ¡ S dS )Nú\,r?   r   )Ú_FIRST_VALUEr   r:   r;   Ú_consume_matched_regexÚreplaceÚrstrip)r
   Úresultr   r   r   r   Ú_value  s
   
zShorthandParser._valuec                 C   sp   | j ddd� g }|  ¡ dkr1|  ¡ }| |¡ |  ¡  |  ¡ dkr+|   d¡ |  ¡  |  ¡ dks|   d¡ |S )NrS   Tr@   ú]r?   )rD   rP   Ú_explicit_valuesr[   rY   )r
   rK   rF   r   r   r   rU     s   

ú
zShorthandParser._explicit_listc                 C   ó0   |   ¡ dkr
|  ¡ S |   ¡ dkr|  ¡ S |  ¡ S )NrS   rT   )rP   rU   rV   rX   r9   r   r   r   rh   "  s
   z ShorthandParser._explicit_valuesc                 C   s„   | j ddd� i }|  ¡ dkr;|  ¡ }| j ddd� |  ¡ }|  ¡  |  ¡ dkr1|   d¡ |  ¡  |||< |  ¡ dks|   d¡ |S )NrT   Tr@   ú}rH   r?   )rD   rP   rI   rh   rY   )r
   Úkeyvalsr0   Úvr   r   r   rV   +  s   
ø
	zShorthandParser._hash_literalc                 C   ri   )Nú'ú")rP   Ú_single_quoted_valueÚ_double_quoted_valuerf   r9   r   r   r   rX   :  s
   zShorthandParser._first_valuec                 C   ó   | j | jdd�S )Nrm   ©Úescaped_char)Ú_consume_quotedÚ_SINGLE_QUOTEDr9   r   r   r   ro   B  s   z$ShorthandParser._single_quoted_valueNc                 C   s:   |   |¡dd… }|d ur| d| |¡}| dd¡}|S )Nr   éÿÿÿÿz\%sz\\ú\)Ú_must_consume_regexrc   )r
   r	   rs   r   r   r   r   rt   H  s
   zShorthandParser._consume_quotedc                 C   rq   )Nrn   rr   )rt   Ú_DOUBLE_QUOTEDr9   r   r   r   rp   O  ó   z$ShorthandParser._double_quoted_valuec                 C   sD   |   ¡ dkr
|  ¡ S |   ¡ dkr|  ¡ S |  | j¡}| dd¡ ¡ S )Nrm   rn   r`   r?   )rP   ro   rp   rx   Ú_SECOND_VALUErc   rd   )r
   r   r   r   r   rZ   R  s   zShorthandParser._second_valueFc                 C   sv   |r|   ¡  | jt| jƒkrt| j|d| jƒ‚| j| j }||kr*t| j||| jƒ‚|  jd7  _|r9|   ¡  d S d S )NÚEOFr   )rY   r;   rC   r:   r$   )r
   ÚcharrA   r&   r   r   r   rD   [  s   ÿÿÿzShorthandParser._expectc                 C   s@   |  | j| jd … ¡}|d ur|  |¡S t| jd|j d| jƒ‚)Nz<%s>z<none>)r   r:   r;   rb   r$   r   )r
   r	   re   r   r   r   rx   i  s   
ÿz#ShorthandParser._must_consume_regexc                 C   s<   |  ¡ \}}| j| j| | j| … }|  j|| 7  _|S r   )Úspanr:   r;   )r
   re   rR   Úendrl   r   r   r   rb   p  s   z&ShorthandParser._consume_matched_regexc                 C   s    | j t| jƒk r| j| j  S tS r   )r;   rC   r:   Ú_EOFr9   r   r   r   rP   v  s   zShorthandParser._currentc                 C   s   | j t| jƒkS r   )r;   rC   r:   r9   r   r   r   rO   }  rz   zShorthandParser._at_eofc                 C   sR   | j dkr#| j| j  |kr'|  j d8  _ | j dkr%| j| j  |ksd S d S d S d S )Nr   r   )r;   r:   )r
   r}   r   r   r   r\   €  ó   *ÿzShorthandParser._backtrack_toc                 C   sR   |   ¡ tkr#|   ¡ tjv r'|  jd7  _|   ¡ tkr%|   ¡ tjv sd S d S d S d S )Nr   )rP   r€   rL   Ú
whitespacer;   r9   r   r   r   rY   „  r�   z#ShorthandParser._consume_whitespacer   )F)%r   r   r   Ú__doc__r   ru   ry   Ú_START_WORDÚ_FIRST_FOLLOW_CHARSÚ_SECOND_FOLLOW_CHARSÚ_ESCAPED_COMMAÚformatra   r{   r   r=   r<   rB   rI   rJ   rW   rf   rU   rh   rV   rX   ro   rt   rp   rZ   rD   rx   rb   rP   rO   r\   rY   r   r   r   r   r2   z   sb    

üþüþ	
0	

	r2   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚModelVisitorc                 C   s   |   i |d|¡ d S )Nr   )Ú_visit)r
   rE   Úmodelr   r   r   ÚvisitŠ  s   zModelVisitor.visitc                 C   s&   t | d|j | jƒ}|||||ƒ d S )Nz	_visit_%s)ÚgetattrÚ	type_nameÚ_visit_scalar)r
   ÚparentÚshaper   r   Úmethodr   r   r   rŠ   �  s   ÿzModelVisitor._visitc              	   C   s<   t |tƒsd S |j ¡ D ]\}}|  |||| |¡¡ qd S r   )Ú
isinstanceÚdictÚmembersÚitemsrŠ   Úget©r
   r�   r‘   r   r   Úmember_nameÚmember_shaper   r   r   Ú_visit_structure’  s   

ÿÿzModelVisitor._visit_structurec                 C   s6   t |tƒsd S t|ƒD ]\}}|  ||j||¡ qd S r   )r“   ÚlistÚ	enumeraterŠ   Úmember)r
   r�   r‘   r   r   ÚiÚelementr   r   r   Ú_visit_list™  s
   
ÿzModelVisitor._visit_listc                 C   s:   t |tƒsd S |j}| ¡ D ]\}}|  ||||¡ qd S r   )r“   r”   r   r–   rŠ   )r
   r�   r‘   r   r   Úvalue_shapeÚkrl   r   r   r   Ú
_visit_mapŸ  s   
ÿzModelVisitor._visit_mapc                 C   s   d S r   r   ©r
   r�   r‘   r   r   r   r   r   r�   ¦  s   zModelVisitor._visit_scalarN)	r   r   r   rŒ   rŠ   r›   r¡   r¤   r�   r   r   r   r   r‰   ‰  s    r‰   c                       s4   e Zd Zdd„ Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )	ÚBackCompatVisitorc              	   C   sf   |   ||¡ t|tƒsd S |j ¡ D ]\}}z|  |||| |¡¡ W q ty0   td| ƒ‚w d S )NzwShorthand syntax does not support document types. Use JSON input for top-level argument to specify nested parameter: %s)	Ú_raise_if_document_type_foundr“   r”   r•   r–   rŠ   r—   r1   r   r˜   r   r   r   r›   «  s    

ÿþÿûüz"BackCompatVisitor._visit_structurec                    s:   t |tƒs|d ur|g||< d S d S tt| ƒ ||||¡S r   )r“   rœ   r(   r¦   r¡   r¥   r*   r   r   r¡   ¾  s   
ÿ
ÿzBackCompatVisitor._visit_listc                 C   s‚   |d u rd S |j }|dv rt|ƒ||< d S |dv r!t|ƒ||< d S |dkr=| ¡ dkr1d||< d S | ¡ dkr?d||< d S d S d S )N)ÚintegerÚlong)ÚdoubleÚfloatÚbooleanÚtrueTÚfalseF)rŽ   Úintr«   Úlower)r
   r�   r‘   r   r   rŽ   r   r   r   r�   È  s   úzBackCompatVisitor._visit_scalarc                 C   s   |d urt |ƒrtƒ ‚d S d S r   )r   r1   )r
   r   rš   r   r   r   r§   Ø  s   ÿz/BackCompatVisitor._raise_if_document_type_found)r   r   r   r›   r¡   r�   r§   r.   r   r   r*   r   r¦   ª  s
    
r¦   )rƒ   r   rL   Úawscli.utilsr   Úobjectr€   r   Ú	Exceptionr   r$   r/   r1   r2   r‰   r¦   r   r   r   r   Ú<module>   s   	  !