U
    O8c-                     @   sZ   d dl Z d dlmZ ddlmZ dd ZdddZd	d
 ZG dd dZG dd dZ	dS )    N)
xform_name   )get_data_memberc                 C   s   | D ]}|dkr dS qdS )z
    Return True if all elements of the iterable are not None (or if the
    iterable is empty). This is like the built-in ``all``, except checks
    against None, so 0 and False are allowable values.
    NFT )iterableelementr   r   </tmp/pip-unpacked-wheel-hml_76kf/boto3/resources/response.pyall_not_none   s    r	   c           	      C   s   g }| D ]}|j }|j}|dkr0t|j|}nb|dkrHt|j|}nJ|dkrbt|t|j}n0|dkrxt||j}n|dkrqnt	d| |
t||f q|S )a  
    Builds a mapping of identifier names to values based on the
    identifier source location, type, and target. Identifier
    values may be scalars or lists depending on the source type
    and location.

    :type identifiers: list
    :param identifiers: List of :py:class:`~boto3.resources.model.Parameter`
                        definitions
    :type parent: ServiceResource
    :param parent: The resource instance to which this action is attached.
    :type params: dict
    :param params: Request parameters sent to the service.
    :type raw_response: dict
    :param raw_response: Low-level operation response.
    :rtype: list
    :return: An ordered list of ``(name, value)`` identifier tuples.
    responseZrequestParameter
identifierdatainputzUnsupported source type: )sourcetargetjmespathsearchpathgetattrr   namer   NotImplementedErrorappend)	identifiersparentparamsraw_responseresultsr   r   r   valuer   r   r   build_identifiers    s"    r   c                 C   s   d}| |}|j}| rl| dD ]H}|d}|jdkrF|j| }q"|jdkrX|j}q"td|j|q"|jdkr|i }n|jdkrg }n|jdkri }|S )a  
    Creates an appropriate empty response for the type that is expected,
    based on the service model's shape type. For example, a value that
    is normally a list would then return an empty list. A structure would
    return an empty dict, and a number would return None.

    :type search_path: string
    :param search_path: JMESPath expression to search in the response
    :type operation_name: string
    :param operation_name: Name of the underlying service operation.
    :type service_model: :ref:`botocore.model.ServiceModel`
    :param service_model: The Botocore service model
    :rtype: dict, list, or None
    :return: An appropriate empty value
    N.z[0123456789]$Z	structurelistz&Search path hits shape type {} from {}map)	operation_modelZoutput_shapesplitstrip	type_namemembersmemberr   format)search_pathoperation_nameservice_modelr
   r!   shapeitemr   r   r   build_empty_responseN   s.    



 


r-   c                   @   s    e Zd ZdZdd Zdd ZdS )
RawHandleraG  
    A raw action response handler. This passed through the response
    dictionary, optionally after performing a JMESPath search if one
    has been defined for the action.

    :type search_path: string
    :param search_path: JMESPath expression to search in the response
    :rtype: dict
    :return: Service response
    c                 C   s
   || _ d S N)r(   )selfr(   r   r   r   __init__   s    zRawHandler.__init__c                 C   s"   | j r| j dkrt| j |}|S ),  
        :type parent: ServiceResource
        :param parent: The resource instance to which this action is attached.
        :type params: dict
        :param params: Request parameters sent to the service.
        :type response: dict
        :param response: Low-level operation response.
        $)r(   r   r   )r0   r   r   r
   r   r   r   __call__   s    
zRawHandler.__call__N)__name__
__module____qualname____doc__r1   r4   r   r   r   r   r.      s   r.   c                   @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
ResourceHandleraf  
    Creates a new resource or list of new resources from the low-level
    response based on the given response resource definition.

    :type search_path: string
    :param search_path: JMESPath expression to search in the response

    :type factory: ResourceFactory
    :param factory: The factory that created the resource class to which
                    this action is attached.

    :type resource_model: :py:class:`~boto3.resources.model.ResponseResource`
    :param resource_model: Response resource model.

    :type service_context: :py:class:`~boto3.utils.ServiceContext`
    :param service_context: Context about the AWS service

    :type operation_name: string
    :param operation_name: Name of the underlying service operation, if it
                           exists.

    :rtype: ServiceResource or list
    :return: New resource instance(s).
    Nc                 C   s"   || _ || _|| _|| _|| _d S r/   )r(   factoryresource_modelr)   service_context)r0   r(   r:   r;   r<   r)   r   r   r   r1      s
    zResourceHandler.__init__c              	   C   s   | j j}| jj|}| jj||| jd}|}d}| jrFt	| j|}t
t| j j|||}	dd |	 D }
|
rg }tt|
d D ]*}d}|r|| }|| |||	| qn@t|	 r| |||	|}n"d}| jdk	rt| j| j| jj}|S )r2   )resource_nameZsingle_resource_json_definitionr<   Nc                 S   s   g | ]}t |tr|qS r   )
isinstancer   ).0vr   r   r   
<listcomp>   s     
 z,ResourceHandler.__call__.<locals>.<listcomp>r   )r;   typer<   Zresource_json_definitionsgetr:   Zload_from_definitionr(   r   r   dictr   r   valuesrangelenr   handle_response_itemr	   r)   r-   r*   )r0   r   r   r
   r=   Zjson_definitionresource_clsr   Zsearch_responser   pluraliZresponse_itemr   r   r   r4      sf    	         
zResourceHandler.__call__c           	      C   sX   d|j ji}| D ]$\}}t|tr0|d}|||< q|f |}|dk	rT||j _|S )a  
        Handles the creation of a single response item by setting
        parameters and creating the appropriate resource instance.

        :type resource_cls: ServiceResource subclass
        :param resource_cls: The resource class to instantiate.
        :type parent: ServiceResource
        :param parent: The resource instance to which this action is attached.
        :type identifiers: dict
        :param identifiers: Map of identifier names to value or values.
        :type resource_data: dict or None
        :param resource_data: Data for resource attributes.
        :rtype: ServiceResource
        :return: New resource instance.
        clientr   N)metarL   itemsr>   r   popr   )	r0   rI   r   r   Zresource_datakwargsr   r   resourcer   r   r   rH     s     



z$ResourceHandler.handle_response_item)N)r5   r6   r7   r8   r1   r4   rH   r   r   r   r   r9      s
    
Tr9   )NN)
r   Zbotocorer   r   r   r	   r   r-   r.   r9   r   r   r   r   <module>   s   
.3