U
    ³.¬b±  ã                   @   sx  d dl Z d dlmZ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 d dlmZmZ d dlmZmZmZmZ d d	lmZ d d
lmZ d dlmZmZ d dlmZ d dlm Z  d dl!m"Z"m#Z# d dl$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/ d dlm0Z0 d dlmZ d dlm1Z1 e  2e3¡Z4eƒ Z5G dd„ dƒZ6G dd„ dƒZ7G dd„ dƒZ8G dd„ dƒZ9dd„ Z:dS )é    N)ÚwaiterÚ
xform_name)ÚClientArgsCreator)ÚAUTH_TYPE_MAPS)Úprepare_request_dict)ÚEndpointDiscoveryHandlerÚEndpointDiscoveryManagerÚ,block_endpoint_discovery_required_operations)ÚClientMethodDocstringÚPaginatorDocstring)ÚDataNotFoundErrorÚ*InvalidEndpointDiscoveryConfigurationErrorÚOperationNotPageableErrorÚUnknownSignatureVersionError)Úget_global_history_recorder)Úfirst_non_none_response)Úapply_request_checksumÚresolve_checksum_context)ÚServiceModel)Ú	Paginator)ÚadaptiveÚstandard)	ÚCachedPropertyÚEventbridgeSignerSetterÚS3ArnParamHandlerÚS3ControlArnParamHandlerÚS3ControlEndpointSetterÚS3EndpointSetterÚS3RegionRedirectorÚensure_booleanÚget_service_module_name)ÚConfig)ÚClientError)ÚUNSIGNEDc                   @   sØ   e Zd ZdZd4dd„Zd5dd„Zd6dd	„Zd
d„ Zdd„ Zd7d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+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ ZdS )8ÚClientCreatorz%Creates client objects for a service.Nc
           
      C   s:   || _ || _|| _|| _|| _|| _|| _|| _|	| _d S ©N)	Ú_loaderÚ_endpoint_resolverÚ_user_agentÚ_event_emitterÚ_retry_handler_factoryÚ_retry_config_translatorÚ_response_parser_factoryÚ_exceptions_factoryÚ_config_store)
ÚselfÚloaderÚendpoint_resolverÚ
user_agentÚevent_emitterZretry_handler_factoryZretry_config_translatorZresponse_parser_factoryÚexceptions_factoryÚconfig_store© r6   ú3/tmp/pip-unpacked-wheel-7df6wvge/botocore/client.pyÚ__init__E   s    zClientCreator.__init__Tc
                 C   sÔ   | j jd|d�}
t|
|d�}|  ||¡}|  ||¡}|  ||	¡\}}	t| j||	|j 	d¡| j
d�}|  ||||||||	|¡	}|f |Ž}|  |¡ |  |||¡ |  ||||	|¡ |  ||||	|¡ |  |||	¡ |S )Nzchoose-service-name©Úservice_name©ÚdefaultZsigningName)Úservice_signing_namer5   )r)   Úemitr   Ú_load_service_modelÚ_create_client_classÚ_normalize_fips_regionÚClientEndpointBridger'   ÚmetadataÚgetr.   Ú_get_client_argsÚ_register_retriesÚ_register_eventbridge_eventsÚ_register_s3_eventsÚ_register_s3_control_eventsÚ_register_endpoint_discovery)r/   r:   Úregion_nameÚ	is_secureÚendpoint_urlÚverifyÚcredentialsÚscoped_configÚapi_versionÚclient_configÚ	responsesÚservice_modelÚclsÚendpoint_bridgeZclient_argsZservice_clientr6   r6   r7   Úcreate_client_   sp     ÿ ÿ
û÷

  ÿûû  ÿzClientCreator.create_clientc                 C   s   |   ||¡}|  ||¡S r%   )r?   r@   )r/   r:   rQ   rT   r6   r6   r7   Úcreate_client_classž   s    z!ClientCreator.create_client_classc           	      C   sb   |   |¡}|  |¡}||d< tg}|j ¡ }| jjd| ||d� t|ƒ}tt	|ƒt
|ƒ|ƒ}|S )NÚ_PY_TO_OP_NAMEzcreating-client-class.%s)Úclass_attributesZbase_classes)Ú_create_methodsÚ_create_name_mappingÚ
BaseClientÚ
service_idÚ	hyphenizer)   r>   r    ÚtypeÚstrÚtuple)	r/   r:   rT   rZ   Zpy_name_to_operation_nameÚbasesr^   Ú
class_namerU   r6   r6   r7   r@   ¢   s    


ýz"ClientCreator._create_client_classc                 C   s`   |d k	rX|  dd¡  dd¡}||krXtdd�}|r>| |¡}n|}t d||f ¡ |}||fS )Nzfips-Ú z-fipsT)Úuse_fips_endpointzƒtransforming region from %s to %s and setting use_fips_endpoint to true. client should not be configured with a fips psuedo region.)Úreplacer!   ÚmergeÚloggerÚwarning)r/   rK   rR   Znormalized_region_nameZconfig_use_fips_endpointr6   r6   r7   rA   ±   s&     ÿ
ÿýÿz$ClientCreator._normalize_fips_regionc                 C   s"   | j j|d|d�}t||d�}|S )Nz	service-2)rQ   r9   )r&   Úload_service_modelr   )r/   r:   rQ   Z
json_modelrT   r6   r6   r7   r?   É   s      ÿz!ClientCreator._load_service_modelc                 C   sV   |j jjd }|dkr"|  |¡ n0|dkr@|  |¡ |  |¡ n|dkrR|  |¡ d S )NÚmoder   r   Úlegacy)ÚmetaÚconfigÚretriesÚ_register_v2_standard_retriesÚ_register_v2_adaptive_retriesÚ_register_legacy_retries)r/   ÚclientÚ
retry_moder6   r6   r7   rF   Ð   s    
zClientCreator._register_retriesc                 C   s8   |j jj d¡}d|i}|d k	r(||d< tjf |Ž d S )NÚtotal_max_attemptsrt   Úmax_attempts)rn   ro   rp   rD   r   Úregister_retry_handler)r/   rt   rw   Úkwargsr6   r6   r7   rq   Ú   s
    z+ClientCreator._register_v2_standard_retriesc                 C   s   t  |¡ d S r%   )r   rx   )r/   rt   r6   r6   r7   rr   á   s    z+ClientCreator._register_v2_adaptive_retriesc           
      C   s¨   |j jj}|j jj}| ¡ }| j d¡}|s0d S |  |j jj	¡}| j
 || di ¡| di ¡|¡}t d|j jj¡ | j ||¡}d| }	|j jjd|› �||	d� d S )NZ_retryÚretryZdefinitionsz*Registering retry handlers for service: %szretry-config-%szneeds-retry.)Ú	unique_id)rn   rT   Úendpoint_prefixr^   r_   r&   Z	load_dataÚ_transform_legacy_retriesro   rp   r+   Zbuild_retry_configrD   ri   Údebugr:   r*   Zcreate_retry_handlerÚeventsÚregister)
r/   rt   r|   r^   Zservice_event_nameZoriginal_configrp   Zretry_configÚhandlerr{   r6   r6   r7   rs   ä   s6    



üþ ÿ  ÿz&ClientCreator._register_legacy_retriesc                 C   s:   |d krd S |  ¡ }d|kr6|  ¡ }| d¡d |d< |S )Nrv   é   rw   )ÚcopyÚpop)r/   rp   Zcopied_argsr6   r6   r7   r}     s    ÿz'ClientCreator._transform_legacy_retriesc                 C   s6   |j jj}|d k	r(| d¡d k	r(|d S | d¡p4dS )Nrl   ru   rm   )rn   ro   rp   rD   Úget_config_variable)r/   rt   r5   Zclient_retriesr6   r6   r7   Ú_get_retry_mode  s    
ÿþzClientCreator._get_retry_modec           
      C   s´   |d k	rd S |j jjd krd S |j j}|j jj ¡ }d}|rN|jd k	rN|j}n| jr`| j d¡}|  	|¡}|r¤|  
||¡r¤|dk}t||d�}t|ƒ}	|	 ||¡ n| dt¡ d S )NFÚendpoint_discovery_enabledT)Zalways_discoverzbefore-parameter-build)rn   rT   Zendpoint_discovery_operationr   r^   r_   r‡   r.   r…   Ú$_normalize_endpoint_discovery_configÚ_requires_endpoint_discoveryr   r   r€   r	   )
r/   rt   rM   ro   r   r^   ÚenabledZdiscoverÚmanagerr�   r6   r6   r7   rJ     s4    ÿ
 ÿþz*ClientCreator._register_endpoint_discoveryc                 C   sP   t |tƒr4| ¡  ¡ }|dkr"|S |dkrBt|ƒS nt |tƒrB|S t|d�‚dS )z?Config must either be a boolean-string or string-literal 'auto'Úauto)ÚtrueÚfalse)Zconfig_valueN)Ú
isinstancera   ÚlowerÚstripr   Úboolr   )r/   rŠ   r6   r6   r7   rˆ   6  s    


z2ClientCreator._normalize_endpoint_discovery_configc                 C   s   |dkr|j jjS |S )NrŒ   )rn   rT   Zendpoint_discovery_required)r/   rt   rŠ   r6   r6   r7   r‰   C  s    
z*ClientCreator._requires_endpoint_discoveryc                 C   s4   |j jjdkrd S t| j|j j|d� |j j¡ d S )Nr   )r1   ÚregionrM   )rn   rT   r:   r   r'   rK   r€   r   )r/   rt   rV   rM   r6   r6   r7   rG   H  s    ýüz*ClientCreator._register_eventbridge_eventsc                 C   s|   |j jjdkrd S t||ƒ ¡  tƒ  |j j¡ |j jj}t	| j
|j j|j jj||j j|d� |j j¡ |  |j ||¡ d S )NÚs3©r1   r“   Z	s3_configrM   Ú	partitionrf   )rn   rT   r:   r   r€   r   r   ro   rf   r   r'   rK   r”   r–   Ú!_set_s3_presign_signature_version©r/   rt   rV   rM   rR   rP   rf   r6   r6   r7   rH   S  s(    
úù  ÿz!ClientCreator._register_s3_eventsc                 C   s^   |j jjdkrd S |j jj}tƒ  |j j¡ t| j	|j j
|j jj||j j|d� |j j¡ d S )NZ	s3controlr•   )rn   rT   r:   ro   rf   r   r€   r   r   r'   rK   r”   r–   r˜   r6   r6   r7   rI   l  s    
úùz)ClientCreator._register_s3_control_eventsc                 C   sx   t d||ƒ}|d k	rd S | j d|j¡}|jdkr@|j|kr@d S | j d|j¡}|d }d|krdd S |j d| j¡ d S )Nr”   z
aws-globalÚsignatureVersionszchoose-signer.s3)	Ú!_get_configured_signature_versionr'   Zget_available_endpointsr–   rK   Úconstruct_endpointr   r€   Ú_default_s3_presign_to_sigv2)r/   Zclient_metarR   rP   Zprovided_signature_versionZregionsÚendpointZsignature_versionsr6   r6   r7   r—   �  s6      ÿ ÿÿþ ÿ ÿz/ClientCreator._set_s3_presign_signature_versionc                 K   s$   dD ]}|  |¡rd|   S qdS )aÔ  
        Returns the 's3' (sigv2) signer if presigning an s3 request. This is
        intended to be used to set the default signature version for the signer
        to sigv2.

        :type signature_version: str
        :param signature_version: The current client signature version.

        :type signing_name: str
        :param signing_name: The signing name of the service.

        :return: 's3' if the request is an s3 presign request, None otherwise
        )z-queryz-presign-postr”   N)Úendswith)r/   Úsignature_versionry   Úsuffixr6   r6   r7   rœ   ¬  s    
z*ClientCreator._default_s3_presign_to_sigv2c
                 C   s:   t | j| j| j| j| j| jd�}
|
 |||||||||	¡	S )N)r5   )r   r)   r(   r,   r&   r-   r.   Zget_client_args)r/   rT   rK   rL   rM   rN   rO   rP   rR   rV   Zargs_creatorr6   r6   r7   rE   ¾  s&    ú÷zClientCreator._get_client_argsc                 C   s.   i }|j D ]}t|ƒ}|  |||¡||< q
|S r%   )Úoperation_namesr   Ú_create_api_method)r/   rT   Zop_dictÚoperation_nameÚpy_operation_namer6   r6   r7   r[   Þ  s    
  ÿ
zClientCreator._create_methodsc                 C   s$   i }|j D ]}t|ƒ}|||< q
|S r%   )r¡   r   )r/   rT   Úmappingr£   r¤   r6   r6   r7   r\   ç  s
    

z"ClientCreator._create_name_mappingc                    sH   ‡ ‡fdd„}t ˆƒ|_| ˆ ¡}t|ˆ | j|jdˆ dd�}||_|S )Nc                    s   |rt ˆ› d�ƒ‚|  ˆ |¡S )Nz"() only accepts keyword arguments.)Ú	TypeErrorÚ_make_api_call)r/   Úargsry   ©r£   r¤   r6   r7   Ú	_api_calló  s
    ÿz3ClientCreator._create_api_method.<locals>._api_callzresponse = client.%sF)Úoperation_modelÚmethod_namer3   Zmethod_descriptionZexample_prefixÚinclude_signature)ra   Ú__name__r«   r
   r)   ZdocumentationÚ__doc__)r/   r¤   r£   rT   rª   r«   Z	docstringr6   r©   r7   r¢   ð  s    

úz ClientCreator._create_api_method)NNN)TNNNNNN)N)N)r®   Ú
__module__Ú__qualname__r¯   r8   rW   rX   r@   rA   r?   rF   rq   rr   rs   r}   r†   rJ   rˆ   r‰   rG   rH   rI   r—   rœ   rE   r[   r\   r¢   r6   r6   r6   r7   r$   B   sF   
   ö
       ö
?


	+ 		r$   c                   @   sˆ   e Zd ZdZdZddgZd!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dd„ Zdd„ Zdd„ Zdd„ Zdd „ ZdS )#rB   aÙ  Bridges endpoint data and client creation

    This class handles taking out the relevant arguments from the endpoint
    resolver and determining which values to use, taking into account any
    client configuration options and scope configuration options.

    This class also handles determining what, if any, region to use if no
    explicit region setting is provided. For example, Amazon S3 client will
    utilize "us-east-1" by default if no region can be resolved.z {service}.{region}.amazonaws.comr”   z
s3-controlNc                 C   s.   || _ || _|| _|| _|p | j| _|| _d S r%   )r=   r1   rP   rR   ÚDEFAULT_ENDPOINTÚdefault_endpointr5   )r/   r1   rP   rR   r³   r=   r5   r6   r6   r7   r8     s    	zClientEndpointBridge.__init__Tc                 C   sx   |   ||¡}|  |¡}|  d¡}| jj||||d�}|sN| jj||d||d�}|rd|  |||||¡S |  ||||¡S d S )Nrf   )Úuse_dualstack_endpointrf   Zaws)Zpartition_namer´   rf   )Ú_check_default_regionÚ_resolve_use_dualstack_endpointÚ$_resolve_endpoint_variant_config_varr1   r›   Ú_create_endpointÚ_assume_endpoint)r/   r:   rK   rM   rL   r´   rf   Úresolvedr6   r6   r7   Úresolve,  sF    ÿÿü	û    ÿ   ÿzClientEndpointBridge.resolvec                 C   s*   |d k	r|S | j r&| j jd k	r&| j jS d S r%   )rR   rK   )r/   r:   rK   r6   r6   r7   rµ   S  s    z*ClientEndpointBridge._check_default_regionc           
   	   C   sr   |   |||¡\}}|d krB| d| d¡¡}|  ||| dg ¡¡}|  ||¡}|  ||¡}	| j||||	|||d�S )NZsslCommonNameÚhostnameZ	protocols)r:   rK   Úsigning_regionÚsigning_namerM   rC   rŸ   )Ú_pick_region_valuesrD   Ú	_make_urlÚ_resolve_signature_versionÚ_resolve_signing_nameÚ_create_result)
r/   rº   r:   rK   rM   rL   r½   r¼   rŸ   r¾   r6   r6   r7   r¸   Z  s4      ÿ  
ÿ ÿùz%ClientEndpointBridge._create_endpointc                 C   s@   | j }d}|r&t||ƒd k	r&t||ƒS | jd k	r<| j |¡}|S )NF)rR   Úgetattrr5   r…   )r/   Z
config_varrR   Z
config_valr6   r6   r7   r·   t  s    

z9ClientEndpointBridge._resolve_endpoint_variant_config_varc                 C   s    |   |¡}|d k	r|S |  d¡S )Nr´   )Ú_is_s3_dualstack_moder·   )r/   r:   Zs3_dualstack_moder6   r6   r7   r¶   €  s    
ÿz4ClientEndpointBridge._resolve_use_dualstack_endpointc                 C   sh   || j krd S | j}|d k	r:|jd k	r:d|jkr:|jd S | jd k	rd| j di ¡ d¡}|dkrddS d S )Nr´   r”   )TÚTruer�   T)Ú_DUALSTACK_CUSTOMIZED_SERVICESrR   r”   rP   rD   )r/   r:   rR   rŠ   r6   r6   r7   rÅ   ˆ  s     
ÿþý

ÿz*ClientEndpointBridge._is_s3_dualstack_modec              	   C   s~   |d kr*| j j||d�}|  ||ddg¡}t d|› d|› d|› �¡ |  |ddgi¡}| j|i d	�}| j||||||i d
�S )N)Úservicer“   ÚhttpÚhttpszAssuming an endpoint for z, z: r™   Úv4)rº   )r:   rK   r½   r¾   rŸ   rM   rC   )r³   ÚformatrÀ   ri   r~   rÁ   rÂ   rÃ   )r/   r:   rK   rM   rL   r¼   rŸ   r¾   r6   r6   r7   r¹   ž  s6     ÿ  ÿÿ ÿùz%ClientEndpointBridge._assume_endpointc                 C   s   |||||||dœS )N)r:   rK   r½   r¾   rM   rŸ   rC   r6   )r/   r:   rK   r½   r¾   rM   rŸ   rC   r6   r6   r7   rÃ   »  s    ùz#ClientEndpointBridge._create_resultc                 C   s$   |rd|krd}nd}|› d|› �S )NrÊ   rÉ   z://r6   )r/   r¼   rL   Zsupported_protocolsÚschemer6   r6   r7   rÀ   Ï  s    zClientEndpointBridge._make_urlc                 C   s0   d|kr d|d kr |d d S | j r,| j S |S )NÚcredentialScoperÈ   )r=   )r/   r:   rº   r6   r6   r7   rÂ   Ö  s    ÿ
þz*ClientEndpointBridge._resolve_signing_namec                 C   s@   |}|d kr8|d }|}d|kr8d|d kr8|d d }||fS )NZendpointNamerÎ   r“   r6   )r/   rº   rK   rM   r½   r6   r6   r7   r¿   ã  s    ÿ
þz(ClientEndpointBridge._pick_region_valuesc                 C   sr   t || j| jƒ}|d k	r|S d|kr^|d }|dkr8dS d|krDdS |D ]}|tkrH|  S qHt| d¡d�‚d S )Nr™   r”   Zs3v4rË   )rŸ   )rš   rR   rP   r   r   rD   )r/   r:   rº   Zconfigured_versionZpotential_versionsZknownr6   r6   r7   rÁ   ù  s&      ÿ
ÿz/ClientEndpointBridge._resolve_signature_version)NNNNN)NNT)r®   r°   r±   r¯   r²   rÇ   r8   r»   rµ   r¸   r·   r¶   rÅ   r¹   rÃ   rÀ   rÂ   r¿   rÁ   r6   r6   r6   r7   rB     s0   
     ù
     ÿ
'rB   c                   @   sž   e Zd Zi Zdd„ Zdd„ Zdd„ Zdd„ Zed	d
„ ƒ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edd„ ƒZedd„ ƒZd d!„ ZdS )#r]   c                 C   s\   || _ || _|| _|| _i | _|| _|| _t|| j|j|| j	|	ƒ| _
|
| _d | _|  ¡  d S r%   )Ú_serializerÚ	_endpointZ_response_parserÚ_request_signerÚ_cacher&   Ú_client_configÚ
ClientMetaÚhostrY   rn   r-   Ú_exceptionsÚ_register_handlers)r/   Ú
serializerr�   Zresponse_parserr3   Úrequest_signerrT   r0   rR   r–   r4   r6   r6   r7   r8     s$    úzBaseClient.__init__c                 C   s\   | j j ¡ }d|› d|› �}| jjj|| d�\}}|d k	r>|S td| jj› d|› d�ƒ‚d S )Nzgetattr.Ú.)rt   ú'z' object has no attribute ')	Ú_service_modelr^   r_   rn   r   Úemit_until_responseÚAttributeErrorÚ	__class__r®   )r/   Úitemr^   Z
event_namer�   Úevent_responser6   r6   r7   Ú__getattr__;  s     ÿ
ÿzBaseClient.__getattr__c                 C   s   | j  ¡  dS )z'Closes underlying endpoint connections.N)rÐ   Úclose©r/   r6   r6   r7   rã   J  s    zBaseClient.closec                 C   s,   | j jj ¡ }| j j d|› �| jj¡ d S )Nzrequest-created.)rn   rT   r^   r_   r   r€   rÑ   r�   )r/   r^   r6   r6   r7   r×   N  s
     ÿzBaseClient._register_handlersc                 C   s   | j jS r%   )rn   rT   rä   r6   r6   r7   rÜ   U  s    zBaseClient._service_modelc                 C   s2  | j  |¡}| j j}t d|||dœ¡ |jr<t d||¡ | jj	| jj
|j|jdœ}| j|||d�}t|||ƒ | j j ¡ }| jjjdj||d�||| j|d�\}}	|	d k	r¸|	\}
}nt|ƒ |  |||¡\}
}| jjjd	j||d�|
|||d
� |
jdk�r*| di ¡ d¡}| j |¡}|||ƒ‚n|S d S )NZAPI_CALL)rÈ   Z	operationÚparamszWarning: %s.%s() is deprecated)Zclient_regionrR   Úhas_streaming_inputÚ	auth_type)Úcontextz)before-call.{service_id}.{operation_name}©r^   r£   )Úmodelrå   rÙ   rè   z(after-call.{service_id}.{operation_name})Úhttp_responseÚparsedrê   rè   i,  ÚErrorZCode)rÜ   r«   r:   Úhistory_recorderÚrecordÚ
deprecatedri   r~   rn   rK   ro   ræ   rç   Ú_convert_to_request_dictr   r^   r_   r   rÝ   rÌ   rÑ   r   Ú_make_requestr>   Ústatus_coderD   Ú
exceptionsZ	from_code)r/   r£   Ú
api_paramsr«   r:   Úrequest_contextÚrequest_dictr^   r�   rá   rÉ   Zparsed_responseZ
error_codeZerror_classr6   r6   r7   r§   Y  sx    ýþ  ÿü  ÿ ÿù


  ÿ ÿù
zBaseClient._make_api_callc              
   C   sb   z| j  ||¡W S  tk
r\ } z.| jjjdj| jj 	¡ |j
d�||d� ‚ W 5 d }~X Y nX d S )Nz.after-call-error.{service_id}.{operation_name}ré   )Ú	exceptionrè   )rÐ   Zmake_requestÚ	Exceptionrn   r   r>   rÌ   rÜ   r^   r_   Úname)r/   r«   r÷   rö   Úer6   r6   r7   rò   —  s    
þúzBaseClient._make_requestNc                 C   sL   |   |||¡}| j ||¡}| jjs0| dd ¡ t|| jj| jj	|d� |S )NÚhost_prefix)rM   r2   rè   )
Ú_emit_api_paramsrÏ   Zserialize_to_requestrÓ   Zinject_host_prefixr„   r   rÐ   rÕ   r2   )r/   rõ   r«   rè   r÷   r6   r6   r7   rñ   ¥  s$      ÿ ÿüz#BaseClient._convert_to_request_dictc                 C   sf   |j }| jj ¡ }| jjjd|› d|› �|||d�}t||d�}| jjjd|› d|› �|||d� |S )Nzprovide-client-params.rÚ   )rå   rê   rè   r;   zbefore-parameter-build.)rú   rÜ   r^   r_   rn   r   r>   r   )r/   rõ   r«   rè   r£   r^   rS   r6   r6   r7   rý   ¸  s     üüzBaseClient._emit_api_paramsc           
      C   s¤   |   |¡st|d�‚nŠ| j| }dd„ }| jd | }t|| jj| jj|dd�|_t	| jjƒ}|› d|› �}t
|tfd|iƒ}| j |¡}|t| |ƒ||ƒ}	|	S d	S )
a  Create a paginator for an operation.

        :type operation_name: string
        :param operation_name: The operation name.  This is the same name
            as the method name on the client.  For example, if the
            method name is ``create_foo``, and you'd normally invoke the
            operation as ``client.create_foo(**kwargs)``, if the
            ``create_foo`` operation can be paginated, you can use the
            call ``client.get_paginator("create_foo")``.

        :raise OperationNotPageableError: Raised if the operation is not
            pageable.  You can use the ``client.can_paginate`` method to
            check if an operation is pageable.

        :rtype: L{botocore.paginate.Paginator}
        :return: A paginator object.

        )r£   c                 [   s   t j| f|ŽS r%   )r   Úpaginate)r/   ry   r6   r6   r7   rþ   ì  s    z*BaseClient.get_paginator.<locals>.paginateÚpage_configF)Zpaginator_namer3   rT   Úpaginator_configr­   z.Paginator.rþ   N)Úcan_paginater   rY   rÒ   r   rn   r   rT   r¯   r    r`   r   rÜ   r«   rÄ   )
r/   r£   Úactual_operation_namerþ   r   Zservice_module_nameZpaginator_class_nameZdocumented_paginator_clsr«   Z	paginatorr6   r6   r7   Úget_paginatorÑ  sB    

ÿû	ÿÿ  ÿÿýzBaseClient.get_paginatorc                 C   sl   d| j krTz*| j | jjd| jj¡d }|| j d< W n tk
rR   i | j d< Y nX | j| }|| j d kS )aM  Check if an operation can be paginated.

        :type operation_name: string
        :param operation_name: The operation name.  This is the same name
            as the method name on the client.  For example, if the
            method name is ``create_foo``, and you'd normally invoke the
            operation as ``client.create_foo(**kwargs)``, if the
            ``create_foo`` operation can be paginated, you can use the
            call ``client.get_paginator("create_foo")``.

        :return: ``True`` if the operation can be paginated,
            ``False`` otherwise.

        rÿ   zpaginators-1Z
pagination)rÒ   r&   rk   rÜ   r:   rQ   r   rY   )r/   r£   rÿ   r  r6   r6   r7   r    s    
ýü
zBaseClient.can_paginatec                 C   sZ   d| j krPz&| j | jjd| jj¡}|| j d< W n tk
rN   i | j d< Y nX | j d S )NÚwaiter_configz	waiters-2)rÒ   r&   rk   rÜ   r:   rQ   r   )r/   r  r6   r6   r7   Ú_get_waiter_config.  s    
ýzBaseClient._get_waiter_configc                 C   sd   |   ¡ }|std| ƒ‚t |¡}i }|jD ]}||t|ƒ< q,||krRtd| ƒ‚t || || ¡S )aG  Returns an object that can wait for some condition.

        :type waiter_name: str
        :param waiter_name: The name of the waiter to get. See the waiters
            section of the service docs for a list of available waiters.

        :returns: The specified waiter object.
        :rtype: botocore.waiter.Waiter
        zWaiter does not exist: %s)r  Ú
ValueErrorr   ÚWaiterModelÚwaiter_namesr   Zcreate_waiter_with_client)r/   Zwaiter_namero   rê   r¥   rú   r6   r6   r7   Ú
get_waiter;  s    


  ÿzBaseClient.get_waiterc                 C   s*   |   ¡ }|sg S t |¡}dd„ |jD ƒS )z(Returns a list of all available waiters.c                 S   s   g | ]}t |ƒ‘qS r6   )r   )Ú.0rú   r6   r6   r7   Ú
<listcomp>\  s     z+BaseClient.waiter_names.<locals>.<listcomp>)r  r   r  r  )r/   ro   rê   r6   r6   r7   r  S  s
    
zBaseClient.waiter_namesc                 C   s   | j d kr|  ¡ | _ | j S r%   )rÖ   Ú_load_exceptionsrä   r6   r6   r7   rô   ^  s    

zBaseClient.exceptionsc                 C   s   | j  | j¡S r%   )r-   Zcreate_client_exceptionsrÜ   rä   r6   r6   r7   r  d  s    ÿzBaseClient._load_exceptions)N)r®   r°   r±   rY   r8   râ   rã   r×   ÚpropertyrÜ   r§   rò   rñ   rý   r  r  r  r	  r   r  rô   r  r6   r6   r6   r7   r]     s*    
> ÿ
A


r]   c                   @   s`   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZedd	„ ƒZed
d„ ƒZ	edd„ ƒZ
edd„ ƒZdS )rÔ   a~  Holds additional client methods.

    This class holds additional information for clients.  It exists for
    two reasons:

        * To give advanced functionality to clients
        * To namespace additional client attributes from the operation
          names which are mapped to methods at runtime.  This avoids
          ever running into collisions with operation names.

    c                 C   s(   || _ || _|| _|| _|| _|| _d S r%   )r   rÓ   Ú_endpoint_urlrÜ   Ú_method_to_api_mappingÚ
_partition)r/   r   rR   rM   rT   Úmethod_to_api_mappingr–   r6   r6   r7   r8   w  s    	zClientMeta.__init__c                 C   s   | j S r%   )rÜ   rä   r6   r6   r7   rT   ‡  s    zClientMeta.service_modelc                 C   s   | j jS r%   )rÓ   rK   rä   r6   r6   r7   rK   ‹  s    zClientMeta.region_namec                 C   s   | j S r%   )r  rä   r6   r6   r7   rM   �  s    zClientMeta.endpoint_urlc                 C   s   | j S r%   )rÓ   rä   r6   r6   r7   ro   “  s    zClientMeta.configc                 C   s   | j S r%   )r  rä   r6   r6   r7   r  —  s    z ClientMeta.method_to_api_mappingc                 C   s   | j S r%   )r  rä   r6   r6   r7   r–   ›  s    zClientMeta.partitionN)r®   r°   r±   r¯   r8   r  rT   rK   rM   ro   r  r–   r6   r6   r6   r7   rÔ   j  s   




rÔ   c                 C   s\   |r|j dk	r|j S |dk	rX| | ¡}|dk	rXt|tƒrX| d¡}|rXt d| |¡ |S dS )z«
    Gets the manually configured signature version.

    :returns: the customer configured signature version, or None if no
        signature version was configured.
    NrŸ   zWSwitching signature version for service %s to version %s based on config file override.)rŸ   rD   r�   Údictri   r~   )r:   rR   rP   Zservice_configÚversionr6   r6   r7   rš      s    


ürš   );ÚloggingZbotocorer   r   Zbotocore.argsr   Zbotocore.authr   Zbotocore.awsrequestr   Zbotocore.discoveryr   r   r	   Zbotocore.docs.docstringr
   r   Zbotocore.exceptionsr   r   r   r   Zbotocore.historyr   Zbotocore.hooksr   Zbotocore.httpchecksumr   r   Zbotocore.modelr   Zbotocore.paginater   Zbotocore.retriesr   r   Zbotocore.utilsr   r   r   r   r   r   r   r   r    Zbotocore.configr!   r"   r#   Ú	getLoggerr®   ri   rî   r$   rB   r]   rÔ   rš   r6   r6   r6   r7   Ú<module>   s@   ,
   O    [6