U
    ´.¬b!5  ã                   @   st   d dl Z d dlZd dlmZmZmZmZ d dlmZm	Z	m
Z
mZ G dd„ deƒZG dd„ deƒZG dd	„ d	eƒZdS )
é    N)ÚCompleteMultipartUploadTaskÚCreateMultipartUploadTaskÚSubmissionTaskÚTask)ÚChunksizeAdjusterÚcalculate_range_parameterÚget_callbacksÚget_filtered_dictc                   @   sš   e Zd ZdZdddddddd	d
dœ	Zddddddddddd	d
gZdddddddddg	Zd	d
gZdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd „ Zd!d"„ Zd#S )$ÚCopySubmissionTaskz+Task for submitting tasks to execute a copyZIfMatchZIfModifiedSinceZIfNoneMatchZIfUnmodifiedSinceZSSECustomerKeyZSSECustomerAlgorithmZSSECustomerKeyMD5ÚRequestPayerÚExpectedBucketOwner)	ÚCopySourceIfMatchÚCopySourceIfModifiedSinceÚCopySourceIfNoneMatchÚCopySourceIfUnmodifiedSinceÚCopySourceSSECustomerKeyÚCopySourceSSECustomerAlgorithmÚCopySourceSSECustomerKeyMD5r   r   r   r   r   r   r   r   r   ZMetadataDirectiveZTaggingDirectivec                 C   s¦   |j jdkrn|j j}|  |j¡}|j}| ¡ D ] \}	}
|	| jkr.|
|| j|	 < q.|jj	f |Ž}|j  
|d ¡ |j j|jk r�|  |||||¡ n|  |||||¡ dS )aÒ  
        :param client: The client associated with the transfer manager

        :type config: s3transfer.manager.TransferConfig
        :param config: The transfer config associated with the transfer
            manager

        :type osutil: s3transfer.utils.OSUtil
        :param osutil: The os utility associated to the transfer manager

        :type request_executor: s3transfer.futures.BoundedExecutor
        :param request_executor: The request executor associated with the
            transfer manager

        :type transfer_future: s3transfer.futures.TransferFuture
        :param transfer_future: The transfer future associated with the
            transfer request that tasks are being submitted for
        NZContentLength)ÚmetaÚsizeÚ	call_argsÚ)_get_head_object_request_from_copy_sourceÚcopy_sourceÚ
extra_argsÚitemsÚEXTRA_ARGS_TO_HEAD_ARGS_MAPPINGZsource_clientZhead_objectZprovide_transfer_sizeZmultipart_thresholdÚ_submit_copy_requestÚ_submit_multipart_request)ÚselfÚclientÚconfigÚosutilÚrequest_executorÚtransfer_futurer   Zhead_object_requestr   ÚparamÚvalueÚresponse© r'   ú5/tmp/pip-unpacked-wheel-hq9fdgne/s3transfer/copies.pyÚ_submitJ   sD    ÿÿ
þÿÿÿ    ÿ    ÿzCopySubmissionTask._submitc                 C   sL   |j j}t|dƒ}| j |t| j||j|j|j|j	||j j
dœdd�¡ d S )NÚprogress)r   r   ÚbucketÚkeyr   Ú	callbacksr   T)Útransfer_coordinatorÚmain_kwargsÚis_final)r   r   r   Ú_transfer_coordinatorÚsubmitÚCopyObjectTaskr   r+   r,   r   r   )r   r   r    r!   r"   r#   r   Úprogress_callbacksr'   r'   r(   r   ˆ   s"    
ù	õþz'CopySubmissionTask._submit_copy_requestc                 C   sj  |j j}i }|j ¡ D ]\}}	|| jkr|	||< q| j |t| j||j|j	|dœd�¡}
|j
}tƒ }| ||j j¡}tt |j jt|ƒ ¡ƒ}g }t|dƒ}td|d ƒD ]~}|  |j¡}t||d ||j jƒ|d< |  ||d ||j j¡}| | j |t| j||j|j|j	||||dœd|
id�¡¡ qª|  |j¡}| j |t| j||j|j	|dœ|
|d	œd
d�¡ d S )N)r   r+   r,   r   )r.   r/   r*   é   ZCopySourceRange)r   r   r+   r,   Úpart_numberr   r-   r   Ú	upload_id)r.   r/   Úpending_main_kwargs)r7   ÚpartsT)r.   r/   r8   r0   )r   r   r   r   ÚCREATE_MULTIPART_ARGS_BLACKLISTr1   r2   r   r+   r,   Zmultipart_chunksizer   Zadjust_chunksizer   ÚintÚmathÚceilÚfloatr   ÚrangeÚ_extra_upload_part_argsr   Ú_get_transfer_sizeÚappendÚCopyPartTaskr   Ú_extra_complete_multipart_argsr   )r   r   r    r!   r"   r#   r   Zcreate_multipart_extra_argsr$   ÚvalZcreate_multipart_futureÚ	part_sizeZadjusterÚ	num_partsZpart_futuresr4   r6   Zextra_part_argsr   Zcomplete_multipart_extra_argsr'   r'   r(   r   ¢   s¢    

üþþ ÿÿ
ÿüüø ÿôþÿÿüþôþz,CopySubmissionTask._submit_multipart_requestc                 C   s,   t |tƒrt |¡S td|t|ƒf ƒ‚d S )NzZExpecting dictionary formatted: {"Bucket": bucket_name, "Key": key} but got %s or type %s.)Ú
isinstanceÚdictÚcopyÚ	TypeErrorÚtype)r   r   r'   r'   r(   r     s    


þÿz<CopySubmissionTask._get_head_object_request_from_copy_sourcec                 C   s   t || jƒS ©N)r	   ÚUPLOAD_PART_COPY_ARGS©r   r   r'   r'   r(   r@     s    z*CopySubmissionTask._extra_upload_part_argsc                 C   s   t || jƒS rM   )r	   ÚCOMPLETE_MULTIPART_ARGSrO   r'   r'   r(   rD     s    z1CopySubmissionTask._extra_complete_multipart_argsc                 C   s   ||d kr|||  S |S )Nr5   r'   )r   rF   Z
part_indexrG   Ztotal_transfer_sizer'   r'   r(   rA     s    z%CopySubmissionTask._get_transfer_sizeN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rN   r:   rP   r)   r   r   r   r@   rD   rA   r'   r'   r'   r(   r
      sT   ÷ô÷>i
r
   c                   @   s   e Zd ZdZdd„ ZdS )r3   zTask to do a nonmultipart copyc           	      C   s0   |j f |||dœ|—Ž |D ]}||d� qdS )aÿ  
        :param client: The client to use when calling PutObject
        :param copy_source: The CopySource parameter to use
        :param bucket: The name of the bucket to copy to
        :param key: The name of the key to copy to
        :param extra_args: A dictionary of any extra arguments that may be
            used in the upload.
        :param callbacks: List of callbacks to call after copy
        :param size: The size of the transfer. This value is passed into
            the callbacks

        )Ú
CopySourceÚBucketÚKey©Zbytes_transferredN)Zcopy_object)	r   r   r   r+   r,   r   r-   r   Úcallbackr'   r'   r(   Ú_main*  s      ÿÿzCopyObjectTask._mainN©rQ   rR   rS   rT   rZ   r'   r'   r'   r(   r3   '  s   r3   c                   @   s   e Zd ZdZdd„ ZdS )rC   z)Task to upload a part in a multipart copyc
                 C   sF   |j f |||||dœ|—Ž}
|D ]}||	d� q |
d d }||dœS )aŠ  
        :param client: The client to use when calling PutObject
        :param copy_source: The CopySource parameter to use
        :param bucket: The name of the bucket to upload to
        :param key: The name of the key to upload to
        :param upload_id: The id of the upload
        :param part_number: The number representing the part of the multipart
            upload
        :param extra_args: A dictionary of any extra arguments that may be
            used in the upload.
        :param callbacks: List of callbacks to call after copy part
        :param size: The size of the transfer. This value is passed into
            the callbacks

        :rtype: dict
        :returns: A dictionary representing a part::

            {'Etag': etag_value, 'PartNumber': part_number}

            This value can be appended to a list to be used to complete
            the multipart upload.
        )rU   rV   rW   ZUploadIdÚ
PartNumberrX   ZCopyPartResultÚETag)r]   r\   )Zupload_part_copy)r   r   r   r+   r,   r7   r6   r   r-   r   r&   rY   Úetagr'   r'   r(   rZ   C  s    "ûúzCopyPartTask._mainNr[   r'   r'   r'   r(   rC   @  s   rC   )rJ   r<   Zs3transfer.tasksr   r   r   r   Zs3transfer.utilsr   r   r   r	   r
   r3   rC   r'   r'   r'   r(   Ú<module>   s     