o
    2&ßaV$  ã                   @   s  d dl Z d dlZd dlZ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„ Zdd„ Zd(d
d„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zejdd„ ƒZdd„ Zdd„ ZG dd„ deƒZd d!„ ZG d"d#„ d#eƒZG d$d%„ d%eƒZG d&d'„ d'eƒZdS ))é    N)Úsix©Úget_binary_stdout)Úget_popen_kwargs_for_pager_cmdc                    sZ   t ‡ fdd„dD ƒƒsˆ  d¡S t ‡ fdd„dD ƒƒs)ttjt ˆ ¡dd�ƒd	 S tˆ ƒS )
Nc                 3   ó   � | ]}|ˆ v V  qd S ©N© ©Ú.0Úchar©Úvaluer   ú./usr/lib/python3/dist-packages/awscli/utils.pyÚ	<genexpr>   ó   € z"split_on_commas.<locals>.<genexpr>)ú"ú\ú'ú]ú[ú,c                 3   r   r   r   r	   r   r   r   r      r   )r   r   r   r   r   ©Ú
escapecharr   )ÚanyÚsplitÚlistÚcsvÚreaderr   ÚStringIOÚ_split_with_quotesr   r   r   r   Úsplit_on_commas   s
   
r    c           	      C   s<  zt tjt | ¡dd�ƒd }W n tjy   td|  ƒ‚w t|ƒ}g }|D ]t}t|ƒ}| 	d¡}|dkrs|  	d¡dkrs|d u sH| 	|¡|krsd|v rO|}nt
| ||dƒ}t||d d… ƒ}|d |d	 … d
 |¡ }| |¡ q'|d u r}| |¡ q'| |¡dkrŽ| | |d¡¡ q't
| ||||ƒ}| |¡ q'|S )Nr   r   r   zBad csv value: %sz=[r   éÿÿÿÿé   é   r   Ú )r   r   r   r   r   ÚErrorÚ
ValueErrorÚiterÚ_find_quote_char_in_partÚfindÚ
_eat_itemsr   ÚjoinÚappendÚcountÚreplace)	r   ÚpartsÚ
iter_partsÚ	new_partsÚpartÚ
quote_charÚ
list_startÚ	new_chunkÚ
list_itemsr   r   r   r   '   s8    ÿ


r   r$   c                 C   sd   |}|  |d¡g}	 zt |¡}W n ty   t| ƒ‚w | |  |d¡¡ | |¡r,nq
d |¡S )z‡
    Eat items from an iterator, optionally replacing characters with
    a blank and stopping when the end_char has been reached.
    r$   Tr   )r.   r   Úadvance_iteratorÚStopIterationr&   r,   Úendswithr+   )r   r0   r2   Úend_charÚreplace_charÚcurrentÚchunksr   r   r   r*   R   s   ÿ
ù
r*   c                 C   s|   d| vr
d| vr
d S d }|   d¡}|   d¡}|dkr"|dkr"d}|S |dkr.|dkr.d}|S ||k r6d}|S ||k r<d}|S )Nr   r   r   r!   )r)   )r2   r3   Údouble_quoteÚsingle_quoter   r   r   r(   d   s"   

úüþr(   c                 C   sJ   |   d¡dd… }d}t|ƒdkr|d }d}t|ƒdkr!|d }||fS )z«
    Grabs the service id and the operation name from an event name.
    This is making the assumption that the event name is in the form
    event.service.operation.
    Ú.r#   Nr   )r   Úlen)Ú
event_nameÚsplit_eventÚservice_nameÚoperation_namer   r   r   Ú%find_service_and_method_in_event_nameu   s   rF   c                 C   s   t | ddƒS )z!Check if shape is a document typeÚis_document_typeF)Úgetattr)Úshaper   r   r   rG   †   s   rG   c                 C   sR   | sdS t ƒ }tƒ  | |¡ |j ¡ }t|ƒsdS |jD ]
} | jdvr& dS qdS )zúCheck if the shape is a document type or wraps document types

    This is helpful to determine if a shape purely deals with document types
    whether the shape is a document type or it is lists or maps whose base
    values are document types.
    F)r   ÚmapT)ÚShapeRecordingVisitorÚShapeWalkerÚwalkÚvisitedÚpoprG   Ú	type_name)rI   Úrecording_visitorÚ	end_shaper   r   r   Úis_document_type_container‹   s   


ÿrS   c                 C   sF   t ƒ }tƒ }| | j|¡ | | j|¡ |jD ]	}t|ƒr  dS qdS )z6Check if document types are ever used in the operationTF)rK   rL   rM   Úinput_shapeÚoutput_shaperN   rG   )Úoperation_modelrQ   ÚwalkerÚvisited_shaper   r   r   Úoperation_uses_document_typesŸ   s   
ÿrY   c                 C   s   t | tjƒr
|  ¡ S | S )z6JSON encoder that formats datetimes as ISO8601 format.)Ú
isinstanceÚdatetimeÚ	isoformat)Úobjr   r   r   Újson_encoder«   s   r^   c               
   c   s>   � t   t jt j¡} zd V  W t   t j| ¡ d S t   t j| ¡ w r   )ÚsignalÚSIGINTÚSIG_IGN)Úoriginalr   r   r   Úignore_ctrl_c³   s
   €"rc   c                 C   s   | j d|| d� d S )Nztop-level-args-parsed)Úparsed_argsÚsession)Úemit)re   Úargsr   r   r   Ú emit_top_level_args_parsed_event¼   s   
ÿrh   c               
   C   s:   z	t  tj ¡ ¡W S  ty }  zW Y d } ~ dS d } ~ ww )NF)ÚosÚisattyÚsysÚstdoutÚfilenoÚ	Exception)Úer   r   r   Úis_a_ttyÁ   s   €ÿrp   c                   @   s<   e Zd Zd
dd„Zejd
dd„ƒZejdd„ ƒZdd	„ ZdS )ÚOutputStreamFactoryNc                 C   s   || _ |d u rtj| _ d S d S r   )Ú_popenÚ
subprocessÚPopen)ÚselfÚpopenr   r   r   Ú__init__É   s   ÿzOutputStreamFactory.__init__c                 c   sd   � |   |¡}z&z| jdi |¤Ž}|jV  W n	 ty   Y nw W | ¡  d S W | ¡  d S | ¡  w )Nr   )Ú_get_process_pager_kwargsrr   ÚstdinÚIOErrorÚcommunicate)ru   Úpreferred_pagerÚpopen_kwargsÚprocessr   r   r   Úget_pager_streamÎ   s   €
ýÿþz$OutputStreamFactory.get_pager_streamc                 c   s   � t ƒ V  d S r   r   ©ru   r   r   r   Úget_stdout_streamÛ   s   €z%OutputStreamFactory.get_stdout_streamc                 C   s   t |ƒ}tj|d< |S )Nry   )r   rs   ÚPIPE)ru   Ú	pager_cmdÚkwargsr   r   r   rx   ß   s   
z-OutputStreamFactory._get_process_pager_kwargsr   )	Ú__name__Ú
__module__Ú__qualname__rw   Ú
contextlibÚcontextmanagerr   r�   rx   r   r   r   r   rq   È   s    

rq   c                 C   s(   |  d¡ |  t | ¡¡ |  d¡ d S )NÚ
)Úwriter   Ú	text_type)ÚexÚoutfiler   r   r   Úwrite_exceptionå   s   
r�   c                   @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )rL   c                 C   s   |du rdS g }|   |||¡S )zñWalk through and visit shapes for introspection

        :type shape: botocore.model.Shape
        :param shape: Shape to walk

        :type visitor: BaseShapeVisitor
        :param visitor: The visitor to call when walking a shape
        N)Ú_walk©ru   rI   ÚvisitorÚstackr   r   r   rM   ì   s   
zShapeWalker.walkc                 C   sB   |j |v rd S | |j ¡ t| d|j | jƒ|||ƒ | ¡  d S )Nz_walk_%s)Únamer,   rH   rP   Ú_default_scalar_walkrO   r‘   r   r   r   r�   û   s   
ÿzShapeWalker._walkc                 C   s2   |   ||¡ |j ¡ D ]\}}|  |||¡ qd S r   )Ú_do_shape_visitÚmembersÚitemsr�   )ru   rI   r’   r“   Ú_Úmember_shaper   r   r   Ú_walk_structure  s   ÿzShapeWalker._walk_structurec                 C   ó    |   ||¡ |  |j||¡ d S r   )r–   r�   Úmemberr‘   r   r   r   Ú
_walk_list	  ó   zShapeWalker._walk_listc                 C   rœ   r   )r–   r�   r   r‘   r   r   r   Ú	_walk_map  rŸ   zShapeWalker._walk_mapc                 C   s   |   ||¡ d S r   )r–   r‘   r   r   r   r•     ó   z ShapeWalker._default_scalar_walkc                 C   s   |  |¡ d S r   )Úvisit_shape)ru   rI   r’   r   r   r   r–     s   zShapeWalker._do_shape_visitN)
r…   r†   r‡   rM   r�   r›   rž   r    r•   r–   r   r   r   r   rL   ë   s    	rL   c                   @   s   e Zd ZdZdd„ ZdS )ÚBaseShapeVisitorz&Visit shape encountered by ShapeWalkerc                 C   s   d S r   r   ©ru   rI   r   r   r   r¢     s   zBaseShapeVisitor.visit_shapeN)r…   r†   r‡   Ú__doc__r¢   r   r   r   r   r£     s    r£   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )rK   z$Record shapes visited by ShapeWalkerc                 C   s
   g | _ d S r   )rN   r€   r   r   r   rw      s   
zShapeRecordingVisitor.__init__c                 C   s   | j  |¡ d S r   )rN   r,   r¤   r   r   r   r¢   #  r¡   z!ShapeRecordingVisitor.visit_shapeN)r…   r†   r‡   r¥   rw   r¢   r   r   r   r   rK     s    rK   )r$   )r   r_   r[   rˆ   ri   rk   rs   Úawscli.compatr   r   r   r    r   r*   r(   rF   rG   rS   rY   r^   r‰   rc   rh   rp   Úobjectrq   r�   rL   r£   rK   r   r   r   r   Ú<module>   s8   
+
-