B ݁[0@sddlZddlZddlZddlmZddlmZddlmZm Z m Z ddl m Z e eZddZGd d d eZGd d d eZGd ddeZGdddeZGdddeZdS)N)get_service_module_name)WaiterDocstring) WaiterError ClientErrorWaiterConfigError) xform_namec Cs|||}t|j}tt||}dd}t||jj|jj|dd|_ t dt |jj|f}t |t fd|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[stj|f|dS)N)Waiterwait)selfkwargsr P/Users/kashii/Desktop/Projects/Workshops/worker-safety/lambda/botocore/waiter.pyr 4sz'create_waiter_with_client..waitF) waiter_name event_emitter service_modelservice_waiter_modelinclude_signaturez %s.Waiter.%sr ) get_waiterr operationNormalizedOperationMethodgetattrrmetaeventsr__doc__strrtyper ) rZ waiter_modelclientsingle_waiter_configoperation_nameoperation_methodr Zwaiter_class_nameZdocumented_waiter_clsr r rcreate_waiter_with_clients$      r!c@seZdZddZddZdS)rcCs ||_dS)N)_client_method)r Z client_methodr r r__init__Osz"NormalizedOperationMethod.__init__c Ks6y |jf|Stk r0}z|jSd}~XYnXdS)N)r"rresponse)r r er r r__call__Rs z"NormalizedOperationMethod.__call__N)__name__ __module__ __qualname__r#r&r r r rrNsrc@s(eZdZdZddZddZddZdS) WaiterModelcCs@|d|_|dd}||||_tt|d|_dS)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 *.waiters.json file. This can be obtained from a botocore Loader object as well. waitersversionunknownN)_waiter_configget_verify_supported_versionr-listsortedkeys waiter_names)r waiter_configr-r r rr#\s    zWaiterModel.__init__cCs"||jkrtd|j|fddS)Nz^Unsupported waiter version, supported version must be: %s, but version of waiter config is: %s) error_msg)SUPPORTED_VERSIONr)r r-r r rr1ts  z%WaiterModel._verify_supported_versioncCs8y|j|}Wn tk r.td|YnXt|S)NzWaiter does not exist: %s)r/KeyError ValueErrorSingleWaiterConfig)r rrr r rr|s zWaiterModel.get_waiterN)r'r(r)r8r#r1rr r r rr*Ysr*c@s$eZdZdZddZeddZdS)r;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). cCs6||_|dd|_|d|_|d|_|d|_dS)N descriptionrdelayZ maxAttempts)_configr0r<rr> max_attempts)r rr r rr#s   zSingleWaiterConfig.__init__cCs.g}x$|jdD]}t|}||qW|S)N acceptors)r?AcceptorConfigappend)r rAZacceptor_configacceptorr r rrAs zSingleWaiterConfig.acceptorsN)r'r(r)rr#propertyrAr r r rr;s r;c@sDeZdZddZddZddZddZd d Zd d Zd dZ dS)rBcCs8|d|_|d|_|d|_|d|_||_dS)Nstatematcherexpectedargument)rFrGrHr0rI_create_matcher_func matcher_func)r configr r rr#s     zAcceptorConfig.__init__cCsn|jdkr|S|jdkr$|S|jdkr6|S|jdkrH|S|jdkrZ|Std|jddS)NpathZpathAllZpathAnystatuserrorzUnknown acceptor: %s)r7)rG_create_path_matcher_create_path_all_matcher_create_path_any_matcher_create_status_matcher_create_error_matcherr)r r r rrJs     z#AcceptorConfig._create_matcher_funccs$t|j|jfdd}|S)Ncsd|kr dS|kS)NError)search)r$)rH expressionr racceptor_matchessz=AcceptorConfig._create_path_matcher..acceptor_matches)jmespathcompilerIrH)r rXr )rHrWrrPs z#AcceptorConfig._create_path_matchercs$t|j|jfdd}|S)NcsFd|kr dS|}t|tr$|s(dSx|D]}|kr.dSq.WdS)NrUFT)rV isinstancer2)r$resultelement)rHrWr rrXs  zAAcceptorConfig._create_path_all_matcher..acceptor_matches)rYrZrIrH)r rXr )rHrWrrQs z'AcceptorConfig._create_path_all_matchercs$t|j|jfdd}|S)NcsFd|kr dS|}t|tr$|s(dSx|D]}|kr.dSq.WdS)NrUFT)rVr[r2)r$r\r])rHrWr rrXs  zAAcceptorConfig._create_path_any_matcher..acceptor_matches)rYrZrIrH)r rXr )rHrWrrRs z'AcceptorConfig._create_path_any_matchercs|jfdd}|S)Ncs|did}|kS)NResponseMetadataZHTTPStatusCode)r0)r$ status_code)rHr rrXs z?AcceptorConfig._create_status_matcher..acceptor_matches)rH)r rXr )rHrrSs z%AcceptorConfig._create_status_matchercs|jfdd}|S)Ncs|diddkS)NrUCoder=)r0)r$)rHr rrXsz>AcceptorConfig._create_error_matcher..acceptor_matches)rH)r rXr )rHrrTs z$AcceptorConfig._create_error_matcherN) r'r(r)r#rJrPrQrRrSrTr r r rrBs  rBc@seZdZddZddZdS)r cCs||_||_||_dS)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_methodnamerL)r rbrLr r r rr# szWaiter.__init__c Kst|jj}d}|di}|d|jj}|d|jj}d}x|jf|}|d7}xB|D]} | |r\| j }Pq\Wd|krt |j |ddd |d |d krt d dS|d krt |j d|d ||krt |j d|d t|qBWdS)NZwaitingZ WaiterConfigZDelayZ MaxAttemptsrrrUMessageUnknown)rbreason last_responseZsuccessz3Waiting complete, waiter matched the success state.Zfailurez+Waiter encountered a terminal failure statezMax attempts exceeded)r2rLrApopr0r>r@rarKrFrrbloggerdebugtimesleep) r r rAZ current_staterLZ sleep_amountr@ num_attemptsr$rDr r rr s@      z Waiter.waitN)r'r(r)r#r r r r rr sr )rYloggingrjbotocore.utilsrbotocore.docs.docstringr exceptionsrrrr=r getLoggerr'rhr!objectrr*r;rBr r r r r s    4 +k