o
    Jhz9                     @   s   d dl Z d dlZd dlm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mZmZ e eZd
d Zdd ZG dd dZG dd dZG dd dZG dd dZG dd dZdS )    N)partial)with_current_context)WaiterDocstring)register_feature_id)get_service_module_name   )
xform_name)ClientErrorWaiterConfigErrorWaiterErrorc           	      C   s~   | | }t|j}tt||}dd }t| |jj|jj|dd|_	t
t|jj d|  }t|tfd|i}|| ||S )a  

    :type waiter_name: str
    :param waiter_name: The name of the waiter.  The name should match
        the name (including the casing) of the key name in the waiter
        model file (typically this is CamelCasing).

    :type waiter_model: botocore.waiter.WaiterModel
    :param waiter_model: The model for the waiter configuration.

    :type client: botocore.client.BaseClient
    :param client: The botocore client associated with the service.

    :rtype: botocore.waiter.Waiter
    :return: The waiter object.

    c                 [   s   t j| fi | d S N)Waiterwait)selfkwargs r   o/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/botocore/waiter.pyr   9   s   z'create_waiter_with_client.<locals>.waitF)waiter_nameevent_emitterservice_modelservice_waiter_modelinclude_signaturez.Waiter.r   )
get_waiterr   	operationNormalizedOperationMethodgetattrr   metaeventsr   __doc__strr   typer   )	r   waiter_modelclientsingle_waiter_configoperation_nameoperation_methodr   waiter_class_namedocumented_waiter_clsr   r   r   create_waiter_with_client   s(   

	r(   c                 C   s$   |  d}t|trd|v rdS dS )NErrorCodeTF)get
isinstancedict)responseerrorr   r   r   is_valid_waiter_errorR   s   
r0   c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C   s
   || _ d S r   )_client_method)r   client_methodr   r   r   __init__Z   s   
z"NormalizedOperationMethod.__init__c              
   K   s>   z	| j di |W S  ty } z	|jW  Y d }~S d }~ww )Nr   )r1   r	   r.   )r   r   er   r   r   __call__]   s   z"NormalizedOperationMethod.__call__N)__name__
__module____qualname__r3   r5   r   r   r   r   r   Y   s    r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	WaiterModel   c                 C   s@   |d | _ |dd}| | || _tt|d  | _dS )a  

        Note that the WaiterModel takes ownership of the waiter_config.
        It may or may not mutate the waiter_config.  If this is a concern,
        it is best to make a copy of the waiter config before passing it to
        the WaiterModel.

        :type waiter_config: dict
        :param waiter_config: The loaded waiter config
            from the <service>*.waiters.json file.  This can be
            obtained from a botocore Loader object as well.

        waitersversionunknownN)_waiter_configr+   _verify_supported_versionr<   listsortedkeyswaiter_names)r   waiter_configr<   r   r   r   r3   g   s
   

zWaiterModel.__init__c                 C   s&   || j krtd| j  d| dd S )Nz7Unsupported waiter version, supported version must be: z#, but version of waiter config is: 	error_msg)SUPPORTED_VERSIONr
   )r   r<   r   r   r   r?      s   
z%WaiterModel._verify_supported_versionc                 C   s2   z
| j | }W t|S  ty   td| w )NzWaiter does not exist: )r>   KeyError
ValueErrorSingleWaiterConfig)r   r   r#   r   r   r   r      s   zWaiterModel.get_waiterN)r6   r7   r8   rG   r3   r?   r   r   r   r   r   r9   d   s
    
r9   c                   @   s$   e Zd ZdZdd Zedd ZdS )rJ   zRepresents the waiter configuration for a single waiter.

    A single waiter is considered the configuration for a single
    value associated with a named waiter (i.e TableExists).

    c                 C   s6   || _ |dd| _|d | _|d | _|d | _d S )Ndescription r   delaymaxAttempts)_configr+   rK   r   rM   max_attempts)r   r#   r   r   r   r3      s
   

zSingleWaiterConfig.__init__c                 C   s*   g }| j d D ]}t|}|| q|S )N	acceptors)rO   AcceptorConfigappend)r   rQ   acceptor_configacceptorr   r   r   rQ      s
   zSingleWaiterConfig.acceptorsN)r6   r7   r8   r   r3   propertyrQ   r   r   r   r   rJ      s
    
rJ   c                   @   sP   e Zd Zdd Zedd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd ZdS )rR   c                 C   s8   |d | _ |d | _|d | _|d| _|  | _d S )Nstatematcherexpectedargument)rW   rX   rY   r+   rZ   _create_matcher_funcmatcher_func)r   configr   r   r   r3      s
   


zAcceptorConfig.__init__c                 C   s   | j dkrd| j d| j dS | j dkr d| j d| j dS | j dkr0d| j d| j dS | j d	kr;d
| j S | j dkrFd| j S d| j  dS )NpathzFor expression "z" we matched expected path: ""pathAllz&" all members matched expected path: "pathAnyz" at least oncestatusz#Matched expected HTTP status code: r/   z%Matched expected service error code: z)No explanation for unknown waiter type: ")rX   rZ   rY   r   r   r   r   explanation   s"   






zAcceptorConfig.explanationc                 C   sl   | j dkr	|  S | j dkr|  S | j dkr|  S | j dkr$|  S | j dkr-|  S td| j  d)Nr^   r`   ra   rb   r/   zUnknown acceptor: rE   )rX   _create_path_matcher_create_path_all_matcher_create_path_any_matcher_create_status_matcher_create_error_matcherr
   rc   r   r   r   r[      s   
	




z#AcceptorConfig._create_matcher_funcc                    $   t | j| j  fdd}|S )Nc                    s   t | rd S |  kS r   )r0   searchr.   rY   
expressionr   r   acceptor_matches   s   z=AcceptorConfig._create_path_matcher.<locals>.acceptor_matchesjmespathcompilerZ   rY   r   ro   r   rm   r   re      s   z#AcceptorConfig._create_path_matcherc                    rj   )Nc                    sD   t | rd S | }t|tr|sdS |D ]	}| kr dS qdS NFTr0   rk   r,   r@   r.   resultelementrm   r   r   ro         
zAAcceptorConfig._create_path_all_matcher.<locals>.acceptor_matchesrp   rs   r   rm   r   rf         z'AcceptorConfig._create_path_all_matcherc                    rj   )Nc                    sD   t | rd S | }t|tr|sdS |D ]	}| kr dS qdS rt   ru   rv   rm   r   r   ro     ry   zAAcceptorConfig._create_path_any_matcher.<locals>.acceptor_matchesrp   rs   r   rm   r   rg     rz   z'AcceptorConfig._create_path_any_matcherc                       | j   fdd}|S )Nc                    s   |  di  d}| kS )NResponseMetadataHTTPStatusCoder+   )r.   status_coderY   r   r   ro     s   z?AcceptorConfig._create_status_matcher.<locals>.acceptor_matchesr   rs   r   r   r   rh     s   	z%AcceptorConfig._create_status_matcherc                    r{   )Nc                    sD    du rd| v od| d v S  du rd| vS |  di  dd kS )NTr)   r*   FrL   r~   rl   r   r   r   ro   '  s
   
z>AcceptorConfig._create_error_matcher.<locals>.acceptor_matchesr   rs   r   r   r   ri   $  s   z$AcceptorConfig._create_error_matcherN)r6   r7   r8   r3   rV   rd   r[   re   rf   rg   rh   ri   r   r   r   r   rR      s    
rR   c                   @   s*   e Zd Zdd Zeeeddd ZdS )r   c                 C   s   || _ || _|| _dS )a  

        :type name: string
        :param name: The name of the waiter

        :type config: botocore.waiter.SingleWaiterConfig
        :param config: The configuration for the waiter.

        :type operation_method: callable
        :param operation_method: A callable that accepts **kwargs
            and returns a response.  For example, this can be
            a method from a botocore client.

        N)_operation_methodnamer]   )r   r   r]   r%   r   r   r   r3   <  s   
zWaiter.__init__WAITERc              	   K   s0  t | jj}d}|di }|d| jj}|d| jj}d }d}	 | jdi |}	|d7 }|D ]}
|
|	r?|
}|
j	} nq1t
|	r\t| jd|	d	 d
d|	d	 dd|	d|dkrgtd d S |dkryd|
j }t| j||	d||kr|d u rd}nd|
j }t| j||	dt| q#)NwaitingWaiterConfigDelayMaxAttemptsr   Tr   zAn error occurred ({}): {}r)   r*   UnknownMessage)r   reasonlast_responsesuccessz3Waiting complete, waiter matched the success state.failurez-Waiter encountered a terminal failure state: zMax attempts exceededz2Max attempts exceeded. Previously accepted state: r   )r@   r]   rQ   popr+   rM   rP   r   r\   rW   r0   r   r   formatloggerdebugrd   timesleep)r   r   rQ   current_stater]   sleep_amountrP   last_matched_acceptornum_attemptsr.   rU   r   r   r   r   r   Q  sf   

zWaiter.waitN)r6   r7   r8   r3   r   r   r   r   r   r   r   r   r   ;  s    r   )loggingr   	functoolsr   rq   botocore.contextr   botocore.docs.docstringr   botocore.useragentr   botocore.utilsr   rL   r   
exceptionsr	   r
   r   	getLoggerr6   r   r(   r0   r   r9   rJ   rR   r   r   r   r   r   <module>   s&   
4- 