U
    O8c%                     @   s   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 e eZG d	d
 d
ZG dd deZG dd dZG dd dZdS )    N)
xform_name)ActionDocstring)inject_attribute   )Action)create_request_parameters)
RawHandlerResourceHandlerc                   @   s"   e Zd ZdZdddZdd ZdS )ServiceActiona  
    A class representing a callable action on a resource, for example
    ``sqs.get_queue_by_name(...)`` or ``s3.Bucket('foo').delete()``.
    The action may construct parameters from existing resource identifiers
    and may return either a raw response or a new resource instance.

    :type action_model: :py:class`~boto3.resources.model.Action`
    :param action_model: The action model.

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

    :type service_context: :py:class:`~boto3.utils.ServiceContext`
    :param service_context: Context about the AWS service
    Nc                 C   s<   || _ |j}|r,t|j||||jjd| _nt|j| _d S )N)search_pathfactoryZresource_modelservice_contextoperation_name)_action_modelresourcer	   pathrequest	operation_response_handlerr   )selfaction_modelr   r   Zresource_response_model r   :/tmp/pip-unpacked-wheel-hml_76kf/boto3/resources/action.py__init__.   s    
zServiceAction.__init__c                 O   sh   t | jjj}t|| jj}|| td|jj	|| t
|jj|||}td| | |||S )a  
        Perform the action's request operation after building operation
        parameters and build any defined resources from the response.

        :type parent: :py:class:`~boto3.resources.base.ServiceResource`
        :param parent: The resource instance to which this action is attached.
        :rtype: dict or ServiceResource or list(ServiceResource)
        :return: The response, either as a raw dict or resource instance(s).
        Calling %s:%s with %rResponse: %r)r   r   r   r   r   updateloggerdebugmetaservice_namegetattrclientr   )r   parentargskwargsr   paramsresponser   r   r   __call__?   s    

zServiceAction.__call__)NN__name__
__module____qualname____doc__r   r(   r   r   r   r   r
      s   
r
   c                   @   s   e Zd ZdZdd ZdS )BatchActiona  
    An action which operates on a batch of items in a collection, typically
    a single page of results from the collection's underlying service
    operation call. For example, this allows you to delete up to 999
    S3 objects in a single operation rather than calling ``.delete()`` on
    each one individually.

    :type action_model: :py:class`~boto3.resources.model.Action`
    :param action_model: The action model.

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

    :type service_context: :py:class:`~boto3.utils.ServiceContext`
    :param service_context: Context about the AWS service
    c                 O   s   d}d}g }t | jjj}| D ]}i }	t|D ]<\}
}|dkrJ|jj}|dkrZ|jj}t	|| jj|	|
d q2|	sx q|	
| td|||	 t||||	}td| || ||	| q"|S )a  
        Perform the batch action's operation on every page of results
        from the collection.

        :type parent:
            :py:class:`~boto3.resources.collection.ResourceCollection`
        :param parent: The collection iterator to which this action
                       is attached.
        :rtype: list(dict)
        :return: A list of low-level response dicts from each call.
        N)r&   indexr   r   )r   r   r   r   Zpages	enumerater   r    r"   r   r   r   r   r!   appendr   )r   r#   r$   r%   r    r"   	responsesr   pager&   r/   r   r'   r   r   r   r(   r   s<    
   zBatchAction.__call__N)r*   r+   r,   r-   r(   r   r   r   r   r.   _   s   r.   c                   @   s    e Zd ZdZdd Zdd ZdS )WaiterActiona/  
    A class representing a callable waiter action on a resource, for example
    ``s3.Bucket('foo').wait_until_bucket_exists()``.
    The waiter action may construct parameters from existing resource
    identifiers.

    :type waiter_model: :py:class`~boto3.resources.model.Waiter`
    :param waiter_model: The action waiter.
    :type waiter_resource_name: string
    :param waiter_resource_name: The name of the waiter action for the
                                 resource. It usually begins with a
                                 ``wait_until_``
    c                 C   s   || _ || _d S )N)_waiter_model_waiter_resource_name)r   Zwaiter_modelZwaiter_resource_namer   r   r   r      s    zWaiterAction.__init__c           	      O   sf   t | jj}t|| j}|| td|jj| j	| |jj
}||}|jf |}td| dS )z
        Perform the wait operation after building operation
        parameters.

        :type parent: :py:class:`~boto3.resources.base.ServiceResource`
        :param parent: The resource instance to which this action is attached.
        r   r   N)r   r5   Zwaiter_namer   r   r   r   r   r    r6   r"   Z
get_waiterwait)	r   r#   r$   r%   Zclient_waiter_namer&   r"   waiterr'   r   r   r   r(      s    

zWaiterAction.__call__Nr)   r   r   r   r   r4      s   r4   c                   @   s    e Zd ZdZdd Zdd ZdS )CustomModeledActionz3A custom, modeled action to inject into a resource.c                 C   s   || _ || _|| _|| _dS )a  
        :type action_name: str
        :param action_name: The name of the action to inject, e.g.
            'delete_tags'

        :type action_model: dict
        :param action_model: A JSON definition of the action, as if it were
            part of the resource model.

        :type function: function
        :param function: The function to perform when the action is called.
            The first argument should be 'self', which will be the resource
            the function is to be called on.

        :type event_emitter: :py:class:`botocore.hooks.BaseEventHooks`
        :param event_emitter: The session event emitter.
        N)namemodelfunctionemitter)r   action_namer   r<   event_emitterr   r   r   r      s    zCustomModeledAction.__init__c                 K   sV   | dd }t| j| ji }| j| j_t|| j||jdd| j_	t
|| j| j d S )N.F)resource_namer?   r   service_modelZinclude_signature)rsplitr   r:   r;   r<   r*   r   r=   rC   r-   r   )r   Zclass_attributesr   Z
event_namer%   rB   actionr   r   r   inject   s    

zCustomModeledAction.injectN)r*   r+   r,   r-   r   rF   r   r   r   r   r9      s   r9   )loggingZbotocorer   Zboto3.docs.docstringr   Zboto3.utilsr   r;   r   r&   r   r'   r   r	   	getLoggerr*   r   r
   r.   r4   r9   r   r   r   r   <module>   s   
CL1