U
    ´.¬b)1  ã                   @   sŒ   d dl 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
 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dS )é    N)Úcollections_abc)ÚDocumentModifiedShape)ÚConditionBaseÚConditionExpressionBuilder)ÚTypeDeserializerÚTypeSerializerc                 K   s   |   dt¡ d S )Nr   )ÚinsertÚDynamoDBHighLevelResource)Zbase_classesÚkwargs© r   ú</tmp/pip-unpacked-wheel-7h_bjh9e/boto3/dynamodb/transform.pyÚregister_high_level_interface   s    r   c                 K   s
   t  | ¡S ©N)ÚcopyÚdeepcopy)Úparamsr
   r   r   r   Úcopy_dynamodb_params   s    r   c                       s   e Zd Z‡ fdd„Z‡  ZS )r	   c                    s  t ƒ j||Ž | jjjjjdtdd� tƒ | _| jjjjjd| jj	dd� | jjjjjd| jj
dd� | jjjjjd| jjdd� td	d
ddd�}tddddd�}tddddd�}| jjjjjd|jdd� | jjjjjd|jdd� | jjjjjd|jdd� d S )Nzprovide-client-params.dynamodbzdynamodb-create-params-copy)Z	unique_idzbefore-parameter-build.dynamodbzdynamodb-condition-expressionzdynamodb-attr-value-inputzafter-call.dynamodbzdynamodb-attr-value-outputÚAttributeValuezvalid DynamoDB typez€- The value of the attribute. The valid value types are listed in the :ref:`DynamoDB Reference Guide<ref_valid_dynamodb_types>`.z`'string'|123|Binary(b'bytes')|True|None|set(['string'])|set([123])|set([Binary(b'bytes')])|[]|{})Únew_typeZnew_descriptionZnew_example_valueÚKeyExpressionz?condition from :py:class:`boto3.dynamodb.conditions.Key` methodz�The condition(s) a key(s) must meet. Valid conditions are listed in the :ref:`DynamoDB Reference Guide<ref_dynamodb_conditions>`.zKey('mykey').eq('myvalue')ÚConditionExpressionz@condition from :py:class:`boto3.dynamodb.conditions.Attr` methodzˆThe condition(s) an attribute(s) must meet. Valid conditions are listed in the :ref:`DynamoDB Reference Guide<ref_dynamodb_conditions>`.z!Attr('myattribute').eq('myvalue')z"docs.*.dynamodb.*.complete-sectionzdynamodb-attr-value-docszdynamodb-key-expression-docszdynamodb-cond-expression-docs)ÚsuperÚ__init__ÚmetaÚclientÚeventsÚregisterr   ÚTransformationInjectorZ	_injectorÚinject_condition_expressionsÚinject_attribute_value_inputÚinject_attribute_value_outputr   Z(replace_documentation_for_matching_shape)ÚselfÚargsr
   Zattr_value_shape_docsZkey_expression_shape_docsZcon_expression_shape_docs©Ú	__class__r   r   r      sn    ýýýý÷õõýýýz"DynamoDBHighLevelResource.__init__)Ú__name__Ú
__module__Ú__qualname__r   Ú__classcell__r   r   r#   r   r	      s   r	   c                   @   s2   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ ZdS )r   z>Injects the transformations into the user provided parameters.Nc                 C   s\   || _ |d krtƒ | _ || _|d kr,tƒ | _|| _|d krBtƒ | _|| _|d krXtƒ | _d S r   )Ú_transformerÚParameterTransformerÚ_condition_builderr   Ú_serializerr   Ú_deserializerr   )r!   ZtransformerÚcondition_builderÚ
serializerZdeserializerr   r   r   r   „   s    zTransformationInjector.__init__c           	      K   s²   | j  ¡  i }i }t| j ||dd�}| j ||j|d¡ t| j ||dd�}| j ||j|d¡ d}d}||kr~||  |¡ n|rŠ|||< ||kr¢||  |¡ n|r®|||< dS )	a7  Injects the condition expression transformation into the parameters

        This injection includes transformations for ConditionExpression shapes
        and KeyExpression shapes. It also handles any placeholder names and
        values that are generated when transforming the condition expressions.
        F)Úplaceholder_namesÚplaceholder_valuesÚis_key_conditionr   Tr   ZExpressionAttributeNamesZExpressionAttributeValuesN)r+   ÚresetÚ!ConditionExpressionTransformationr)   Ú	transformÚinput_shapeÚupdate)	r!   r   Úmodelr
   Zgenerated_namesZgenerated_valuesÚtransformationZexpr_attr_names_inputZexpr_attr_values_inputr   r   r   r   ›   sJ    
ü   ÿü   ÿz3TransformationInjector.inject_condition_expressionsc                 K   s   | j  ||j| jjd¡ dS )z3Injects DynamoDB serialization into parameter inputr   N)r)   r5   r6   r,   Ú	serialize)r!   r   r8   r
   r   r   r   r   Í   s    üz3TransformationInjector.inject_attribute_value_inputc                 K   s&   |j dk	r"| j ||j | jjd¡ dS )z/Injects DynamoDB deserialization into responsesNr   )Zoutput_shaper)   r5   r-   Zdeserialize)r!   Úparsedr8   r
   r   r   r   r    Ö   s    
üz4TransformationInjector.inject_attribute_value_output)NNNN)r%   r&   r'   Ú__doc__r   r   r   r    r   r   r   r   r   �   s       û
2	r   c                   @   s"   e Zd ZdZddd„Zdd„ ZdS )	r4   zÄProvides a transformation for condition expressions

    The ``ParameterTransformer`` class can call this class directly
    to transform the condition expressions in the parameters provided.
    Fc                 C   s   || _ || _|| _|| _d S r   )r+   Ú_placeholder_namesÚ_placeholder_valuesÚ_is_key_condition)r!   r.   r0   r1   r2   r   r   r   r   è   s    z*ConditionExpressionTransformation.__init__c                 C   sB   t |tƒr>| jj|| jd�}| j |j¡ | j |j	¡ |j
S |S )N)r2   )Ú
isinstancer   r+   Zbuild_expressionr?   r=   r7   Zattribute_name_placeholdersr>   Zattribute_value_placeholdersZcondition_expression)r!   ÚvalueZbuilt_expressionr   r   r   Ú__call__ô   s    
 ÿÿÿz*ConditionExpressionTransformation.__call__N)F)r%   r&   r'   r<   r   rB   r   r   r   r   r4   á   s    û
r4   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )r*   z?Transforms the input to and output from botocore based on shapec                 C   s   |   ||||¡ dS )aä  Transforms the dynamodb input to or output from botocore

        It applies a specified transformation whenever a specific shape name
        is encountered while traversing the parameters in the dictionary.

        :param params: The parameters structure to transform.
        :param model: The operation model.
        :param transformation: The function to apply the parameter
        :param target_shape: The name of the shape to apply the
            transformation to
        N)Ú_transform_parameters)r!   r   r8   r9   Útarget_shaper   r   r   r5     s    zParameterTransformer.transformc                 C   s,   |j }|dkr(t| d|› �ƒ||||ƒ d S )N)Z	structureÚmapÚlistZ_transform_)Ú	type_nameÚgetattr)r!   r8   r   r9   rD   rG   r   r   r   rC     s       ÿz*ParameterTransformer._transform_parametersc                 C   sf   t |tjƒsd S |D ]L}||jkr|j| }|j}||krL||| ƒ||< q|  ||| ||¡ qd S r   )r@   r   ÚMappingÚmembersÚnamerC   )r!   r8   r   r9   rD   ÚparamÚmember_modelÚmember_shaper   r   r   Ú_transform_structure"  s    

üz)ParameterTransformer._transform_structurec           	      C   s\   t |tjƒsd S |j}|j}| ¡ D ]2\}}||krB||ƒ||< q$|  ||| ||¡ q$d S r   )r@   r   rI   rA   rK   ÚitemsrC   )	r!   r8   r   r9   rD   Zvalue_modelZvalue_shapeÚkeyrA   r   r   r   Ú_transform_map5  s       ÿz#ParameterTransformer._transform_mapc           	      C   s\   t |tjƒsd S |j}|j}t|ƒD ]2\}}||krB||ƒ||< q$|  ||| ||¡ q$d S r   )r@   r   ÚMutableSequenceÚmemberrK   Ú	enumeraterC   )	r!   r8   r   r9   rD   rM   rN   ÚiÚitemr   r   r   Ú_transform_listB  s       ÿz$ParameterTransformer._transform_listN)	r%   r&   r'   r<   r5   rC   rO   rR   rX   r   r   r   r   r*     s   	r*   )r   Zboto3.compatr   Zboto3.docs.utilsr   Zboto3.dynamodb.conditionsr   r   Zboto3.dynamodb.typesr   r   r   r   r	   r   r4   r*   r   r   r   r   Ú<module>   s   d`'