
    @f                     2   S SK Jr  S SKJr  S SKJrJr  S SKJr  S SKJr  S r	S r
S rS	 rS
 rS r  SS jr  SS jr SS jr SS jr SS jr SS jr  SS jr  SS jr  SS jr  SS jr  SS jr  SS jr  SS jr  SS jr  SS jrg)    )ClientError)create_transfer_manager)TransferConfig
S3Transfer)ProgressCallbackInvoker)utilsc                    [         R                  " U S[        5        [         R                  " U S[        5        [         R                  " U S[        5        [         R                  " U S[
        5        [         R                  " U S[        5        g Nupload_filedownload_filecopyupload_fileobjdownload_fileobj)r   inject_attributer   r   r   r   r   class_attributeskwargss     "lib/third_party/boto3/s3/inject.pyinject_s3_transfer_methodsr      sg    	+]KH	+_mL	+VT:	+-=~N	,.>@    c                 T   [         R                  " U S[        5        [         R                  " U S[        5        [         R                  " U S[        5        [         R                  " U S[
        5        [         R                  " U S[        5        [         R                  " U S[        5        g )Nloadr   r   r   r   r   )r   r   bucket_loadbucket_upload_filebucket_download_filebucket_copybucket_upload_fileobjbucket_download_fileobjr   s     r   inject_bucket_methodsr      s    	+V[A	+]<NO	/+?A	+V[A	*,AC	,.EGr   c                    [         R                  " U S[        5        [         R                  " U S[        5        [         R                  " U S[        5        [         R                  " U S[
        5        [         R                  " U S[        5        g r
   )r   r   object_upload_fileobject_download_fileobject_copyobject_upload_fileobjobject_download_fileobjr   s     r   inject_object_methodsr&   *   sp    	+]<NO	/+?A	+V[A	*,AC	,.EGr   c                 <    [         R                  " U S[        5        g )Nr   )r   r   object_summary_loadr   s     r   inject_object_summary_methodsr)   5   s    	+V5HIr   c                 `   0 U R                   l         U R                   R                  R                  5       nUS    H(  nUS   U R                  :X  d  M  X@R                   l          g   g! [
         a:  nUR                  R                  S0 5      R                  S5      S:X  d  e  SnAgSnAff = f)zQ
Calls s3.Client.list_buckets() to update the attributes of the Bucket
resource.
BucketsNameErrorCodeAccessDeniedN)metadataclientlist_bucketsnamer   responseget)selfargsr   r5   bucket_dataes         r   r   r   9   s     DIIN99##002#I.K6"dii/!,		 /  zz~~gr*..v6.H Is#   =A) A) &A) )
B-30B((B-c                     U R                   R                  R                  U R                  U R                  S9nSU;   a  UR                  S5      US'   X0R                   l        g)zU
Calls s3.Client.head_object to update the attributes of the ObjectSummary
resource.
)BucketKeyContentLengthSizeN)r0   r2   head_objectbucket_namekeypopr1   )r7   r8   r   r5   s       r   r(   r(   Q   sV    
 yy++TXX , /H("#<<8IINr   Nc           	      p    [        X5       nUR                  XUXES9sSSS5        $ ! , (       d  f       g= f)a  Upload a file to an S3 object.

Usage::

    import boto3
    s3 = boto3.resource('s3')
    s3.meta.client.upload_file('/tmp/hello.txt', 'mybucket', 'hello.txt')

Similar behavior as S3Transfer's upload_file() method,
except that parameters are capitalized. Detailed examples can be found at
:ref:`S3Transfer's Usage <ref_s3transfer_usage>`.

:type Filename: str
:param Filename: The path to the file to upload.

:type Bucket: str
:param Bucket: The name of the bucket to upload to.

:type Key: str
:param Key: The name of the key to upload to.

:type ExtraArgs: dict
:param ExtraArgs: Extra arguments that may be passed to the
    client operation.

:type Callback: function
:param Callback: A method which takes a number of bytes transferred to
    be periodically called during the upload.

:type Config: boto3.s3.transfer.TransferConfig
:param Config: The transfer configuration to be used when performing the
    transfer.
)filenamebucketrB   
extra_argscallbackN)r   r   )r7   Filenamer<   r=   	ExtraArgsCallbackConfigtransfers           r   r   r   ]   s6    F 
D	!X###  $ 5 
"	!	!   '
5c           	      p    [        X5       nUR                  XUXES9sSSS5        $ ! , (       d  f       g= f)a  Download an S3 object to a file.

Usage::

    import boto3
    s3 = boto3.resource('s3')
    s3.meta.client.download_file('mybucket', 'hello.txt', '/tmp/hello.txt')

Similar behavior as S3Transfer's download_file() method,
except that parameters are capitalized. Detailed examples can be found at
:ref:`S3Transfer's Usage <ref_s3transfer_usage>`.

:type Bucket: str
:param Bucket: The name of the bucket to download from.

:type Key: str
:param Key: The name of the key to download from.

:type Filename: str
:param Filename: The path to the file to download to.

:type ExtraArgs: dict
:param ExtraArgs: Extra arguments that may be passed to the
    client operation.

:type Callback: function
:param Callback: A method which takes a number of bytes transferred to
    be periodically called during the download.

:type Config: boto3.s3.transfer.TransferConfig
:param Config: The transfer configuration to be used when performing the
    transfer.
)rF   rB   rE   rG   rH   N)r   r   )r7   r<   r=   rI   rJ   rK   rL   rM   s           r   r   r      s6    F 
D	!X%%X  & 5 
"	!	!rN   c           	      b    U R                   R                  R                  XR                  UX4US9$ )aT  Upload a file to an S3 object.

Usage::

    import boto3
    s3 = boto3.resource('s3')
    s3.Bucket('mybucket').upload_file('/tmp/hello.txt', 'hello.txt')

Similar behavior as S3Transfer's upload_file() method,
except that parameters are capitalized. Detailed examples can be found at
:ref:`S3Transfer's Usage <ref_s3transfer_usage>`.

:type Filename: str
:param Filename: The path to the file to upload.

:type Key: str
:param Key: The name of the key to upload to.

:type ExtraArgs: dict
:param ExtraArgs: Extra arguments that may be passed to the
    client operation.

:type Callback: function
:param Callback: A method which takes a number of bytes transferred to
    be periodically called during the upload.

:type Config: boto3.s3.transfer.TransferConfig
:param Config: The transfer configuration to be used when performing the
    transfer.
rI   r<   r=   rJ   rK   rL   )r0   r2   r   r4   )r7   rI   r=   rJ   rK   rL   s         r   r   r      s5    @ 99''))v ( ? ?r   c           	      b    U R                   R                  R                  U R                  XX4US9$ )ae  Download an S3 object to a file.

Usage::

    import boto3
    s3 = boto3.resource('s3')
    s3.Bucket('mybucket').download_file('hello.txt', '/tmp/hello.txt')

Similar behavior as S3Transfer's download_file() method,
except that parameters are capitalized. Detailed examples can be found at
:ref:`S3Transfer's Usage <ref_s3transfer_usage>`.

:type Key: str
:param Key: The name of the key to download from.

:type Filename: str
:param Filename: The path to the file to download to.

:type ExtraArgs: dict
:param ExtraArgs: Extra arguments that may be passed to the
    client operation.

:type Callback: function
:param Callback: A method which takes a number of bytes transferred to
    be periodically called during the download.

:type Config: boto3.s3.transfer.TransferConfig
:param Config: The transfer configuration to be used when performing the
    transfer.
r<   r=   rI   rJ   rK   rL   )r0   r2   r   r4   )r7   r=   rI   rJ   rK   rL   s         r   r   r      s5    @ 99))yycv * ? ?r   c           	      v    U R                   R                  R                  XR                  U R                  X#US9$ )a  Upload a file to an S3 object.

Usage::

    import boto3
    s3 = boto3.resource('s3')
    s3.Object('mybucket', 'hello.txt').upload_file('/tmp/hello.txt')

Similar behavior as S3Transfer's upload_file() method,
except that parameters are capitalized. Detailed examples can be found at
:ref:`S3Transfer's Usage <ref_s3transfer_usage>`.

:type Filename: str
:param Filename: The path to the file to upload.

:type ExtraArgs: dict
:param ExtraArgs: Extra arguments that may be passed to the
    client operation.

:type Callback: function
:param Callback: A method which takes a number of bytes transferred to
    be periodically called during the upload.

:type Config: boto3.s3.transfer.TransferConfig
:param Config: The transfer configuration to be used when performing the
    transfer.
rQ   )r0   r2   r   rA   rB   r7   rI   rJ   rK   rL   s        r   r!   r!      s:    : 99''"2"2v ( ? ?r   c           	      x    U R                   R                  R                  U R                  U R                  UX#US9$ )a#  Download an S3 object to a file.

Usage::

    import boto3
    s3 = boto3.resource('s3')
    s3.Object('mybucket', 'hello.txt').download_file('/tmp/hello.txt')

Similar behavior as S3Transfer's download_file() method,
except that parameters are capitalized. Detailed examples can be found at
:ref:`S3Transfer's Usage <ref_s3transfer_usage>`.

:type Filename: str
:param Filename: The path to the file to download to.

:type ExtraArgs: dict
:param ExtraArgs: Extra arguments that may be passed to the
    client operation.

:type Callback: function
:param Callback: A method which takes a number of bytes transferred to
    be periodically called during the download.

:type Config: boto3.s3.transfer.TransferConfig
:param Config: The transfer configuration to be used when performing the
    transfer.
rS   )r0   r2   r   rA   rB   rU   s        r   r"   r"     s<    : 99))TXXv * ? ?r   c           
          SnUb  [        U5      /nUn	U	c
  [        5       n	[        X	5       n
U
R                  XUXHUS9nUR	                  5       sSSS5        $ ! , (       d  f       g= f)a  Copy an object from one S3 location to another.

This is a managed transfer which will perform a multipart copy in
multiple threads if necessary.

Usage::

    import boto3
    s3 = boto3.resource('s3')
    copy_source = {
        'Bucket': 'mybucket',
        'Key': 'mykey'
    }
    s3.meta.client.copy(copy_source, 'otherbucket', 'otherkey')

:type CopySource: dict
:param CopySource: The name of the source bucket, key name of the
    source object, and optional version ID of the source object. The
    dictionary format is:
    ``{'Bucket': 'bucket', 'Key': 'key', 'VersionId': 'id'}``. Note
    that the ``VersionId`` key is optional and may be omitted.

:type Bucket: str
:param Bucket: The name of the bucket to copy to

:type Key: str
:param Key: The name of the key to copy to

:type ExtraArgs: dict
:param ExtraArgs: Extra arguments that may be passed to the
    client operation

:type Callback: function
:param Callback: A method which takes a number of bytes transferred to
    be periodically called during the copy.

:type SourceClient: botocore or boto3 Client
:param SourceClient: The client to be used for operation that
    may happen at the source object. For example, this client is
    used for the head_object that determines the size of the copy.
    If no client is provided, the current client is used as the client
    for the source object.

:type Config: boto3.s3.transfer.TransferConfig
:param Config: The transfer configuration to be used when performing the
    copy.
N)copy_sourcerF   rB   rG   subscriberssource_client)r   r   r   r   result)r7   
CopySourcer<   r=   rJ   rK   SourceClientrL   rY   configmanagerfutures               r   r   r   =  sn    b K.x89F~!	 	.'"s &  ( }} 
/	.	.s   "A
A&c           
      b    U R                   R                  R                  XR                  X#XEUS9$ )a  Copy an object from one S3 location to an object in this bucket.

This is a managed transfer which will perform a multipart copy in
multiple threads if necessary.

Usage::

    import boto3
    s3 = boto3.resource('s3')
    copy_source = {
        'Bucket': 'mybucket',
        'Key': 'mykey'
    }
    bucket = s3.Bucket('otherbucket')
    bucket.copy(copy_source, 'otherkey')

:type CopySource: dict
:param CopySource: The name of the source bucket, key name of the
    source object, and optional version ID of the source object. The
    dictionary format is:
    ``{'Bucket': 'bucket', 'Key': 'key', 'VersionId': 'id'}``. Note
    that the ``VersionId`` key is optional and may be omitted.

:type Key: str
:param Key: The name of the key to copy to

:type ExtraArgs: dict
:param ExtraArgs: Extra arguments that may be passed to the
    client operation

:type Callback: function
:param Callback: A method which takes a number of bytes transferred to
    be periodically called during the copy.

:type SourceClient: botocore or boto3 Client
:param SourceClient: The client to be used for operation that
    may happen at the source object. For example, this client is
    used for the head_object that determines the size of the copy.
    If no client is provided, the current client is used as the client
    for the source object.

:type Config: boto3.s3.transfer.TransferConfig
:param Config: The transfer configuration to be used when performing the
    copy.
r\   r<   r=   rJ   rK   r]   rL   )r0   r2   r   r4   )r7   r\   r=   rJ   rK   r]   rL   s          r   r   r   ~  s7    ^ 99  iiSV ! E Er   c           
      x    U R                   R                  R                  XR                  U R                  X#UUS9$ )a  Copy an object from one S3 location to this object.

This is a managed transfer which will perform a multipart copy in
multiple threads if necessary.

Usage::

    import boto3
    s3 = boto3.resource('s3')
    copy_source = {
        'Bucket': 'mybucket',
        'Key': 'mykey'
    }
    bucket = s3.Bucket('otherbucket')
    obj = bucket.Object('otherkey')
    obj.copy(copy_source)

:type CopySource: dict
:param CopySource: The name of the source bucket, key name of the
    source object, and optional version ID of the source object. The
    dictionary format is:
    ``{'Bucket': 'bucket', 'Key': 'key', 'VersionId': 'id'}``. Note
    that the ``VersionId`` key is optional and may be omitted.

:type ExtraArgs: dict
:param ExtraArgs: Extra arguments that may be passed to the
    client operation

:type Callback: function
:param Callback: A method which takes a number of bytes transferred to
    be periodically called during the copy.

:type SourceClient: botocore or boto3 Client
:param SourceClient: The client to be used for operation that
    may happen at the source object. For example, this client is
    used for the head_object that determines the size of the copy.
    If no client is provided, the current client is used as the client
    for the source object.

:type Config: boto3.s3.transfer.TransferConfig
:param Config: The transfer configuration to be used when performing the
    copy.
rb   )r0   r2   r   rA   rB   )r7   r\   rJ   rK   r]   rL   s         r   r#   r#     s>    Z 99  &6&6DHH\ !  r   c           	         [        US5      (       d  [        S5      eSnUb  [        U5      /nUnUc
  [        5       n[	        X5       n	U	R                  XUXGS9n
U
R                  5       sSSS5        $ ! , (       d  f       g= f)a  Upload a file-like object to S3.

The file-like object must be in binary mode.

This is a managed transfer which will perform a multipart upload in
multiple threads if necessary.

Usage::

    import boto3
    s3 = boto3.client('s3')

    with open('filename', 'rb') as data:
        s3.upload_fileobj(data, 'mybucket', 'mykey')

:type Fileobj: a file-like object
:param Fileobj: A file-like object to upload. At a minimum, it must
    implement the `read` method, and must return bytes.

:type Bucket: str
:param Bucket: The name of the bucket to upload to.

:type Key: str
:param Key: The name of the key to upload to.

:type ExtraArgs: dict
:param ExtraArgs: Extra arguments that may be passed to the
    client operation.

:type Callback: function
:param Callback: A method which takes a number of bytes transferred to
    be periodically called during the upload.

:type Config: boto3.s3.transfer.TransferConfig
:param Config: The transfer configuration to be used when performing the
    upload.
readzFileobj must implement readN)fileobjrF   rB   rG   rY   )hasattr
ValueErrorr   r   r   uploadr[   )r7   Fileobjr<   r=   rJ   rK   rL   rY   r^   r_   r`   s              r   r   r     s    N 7F##677K.x89F~!	 	.'    ; }}	 
/	.	.   !A33
Bc           	      `    U R                   R                  R                  XR                  X#XES9$ )a  Upload a file-like object to this bucket.

The file-like object must be in binary mode.

This is a managed transfer which will perform a multipart upload in
multiple threads if necessary.

Usage::

    import boto3
    s3 = boto3.resource('s3')
    bucket = s3.Bucket('mybucket')

    with open('filename', 'rb') as data:
        bucket.upload_fileobj(data, 'mykey')

:type Fileobj: a file-like object
:param Fileobj: A file-like object to upload. At a minimum, it must
    implement the `read` method, and must return bytes.

:type Key: str
:param Key: The name of the key to upload to.

:type ExtraArgs: dict
:param ExtraArgs: Extra arguments that may be passed to the
    client operation.

:type Callback: function
:param Callback: A method which takes a number of bytes transferred to
    be periodically called during the upload.

:type Config: boto3.s3.transfer.TransferConfig
:param Config: The transfer configuration to be used when performing the
    upload.
rj   r<   r=   rJ   rK   rL   )r0   r2   r   r4   )r7   rj   r=   rJ   rK   rL   s         r   r   r     s3    J 99**		s + * *r   c           	      v    U R                   R                  R                  XR                  U R                  X#US9$ )a  Upload a file-like object to this object.

The file-like object must be in binary mode.

This is a managed transfer which will perform a multipart upload in
multiple threads if necessary.

Usage::

    import boto3
    s3 = boto3.resource('s3')
    bucket = s3.Bucket('mybucket')
    obj = bucket.Object('mykey')

    with open('filename', 'rb') as data:
        obj.upload_fileobj(data)

:type Fileobj: a file-like object
:param Fileobj: A file-like object to upload. At a minimum, it must
    implement the `read` method, and must return bytes.

:type ExtraArgs: dict
:param ExtraArgs: Extra arguments that may be passed to the
    client operation.

:type Callback: function
:param Callback: A method which takes a number of bytes transferred to
    be periodically called during the upload.

:type Config: boto3.s3.transfer.TransferConfig
:param Config: The transfer configuration to be used when performing the
    upload.
rm   )r0   r2   r   rA   rB   r7   rj   rJ   rK   rL   s        r   r$   r$   H  s;    F 99** 0 0dhhv + ? ?r   c           	         [        US5      (       d  [        S5      eSnUb  [        U5      /nUnUc
  [        5       n[	        X5       n	U	R                  XUXGS9n
U
R                  5       sSSS5        $ ! , (       d  f       g= f)a  Download an object from S3 to a file-like object.

The file-like object must be in binary mode.

This is a managed transfer which will perform a multipart download in
multiple threads if necessary.

Usage::

    import boto3
    s3 = boto3.client('s3')

    with open('filename', 'wb') as data:
        s3.download_fileobj('mybucket', 'mykey', data)

:type Fileobj: a file-like object
:param Fileobj: A file-like object to download into. At a minimum, it must
    implement the `write` method and must accept bytes.

:type Bucket: str
:param Bucket: The name of the bucket to download from.

:type Key: str
:param Key: The name of the key to download from.

:type ExtraArgs: dict
:param ExtraArgs: Extra arguments that may be passed to the
    client operation.

:type Callback: function
:param Callback: A method which takes a number of bytes transferred to
    be periodically called during the download.

:type Config: boto3.s3.transfer.TransferConfig
:param Config: The transfer configuration to be used when performing the
    download.
writezFileobj must implement writeN)rF   rB   rf   rG   rY   )rg   rh   r   r   r   downloadr[   )r7   r<   r=   rj   rJ   rK   rL   rY   r^   r_   r`   s              r   r   r   p  s    N 7G$$788K.x89F~!	 	.'!!G  " ; }}	 
/	.	.rk   c           	      b    U R                   R                  R                  U R                  XUXES9$ )a  Download an object from this bucket to a file-like-object.

The file-like object must be in binary mode.

This is a managed transfer which will perform a multipart download in
multiple threads if necessary.

Usage::

    import boto3
    s3 = boto3.resource('s3')
    bucket = s3.Bucket('mybucket')

    with open('filename', 'wb') as data:
        bucket.download_fileobj('mykey', data)

:type Fileobj: a file-like object
:param Fileobj: A file-like object to download into. At a minimum, it must
    implement the `write` method and must accept bytes.

:type Key: str
:param Key: The name of the key to download from.

:type ExtraArgs: dict
:param ExtraArgs: Extra arguments that may be passed to the
    client operation.

:type Callback: function
:param Callback: A method which takes a number of bytes transferred to
    be periodically called during the download.

:type Config: boto3.s3.transfer.TransferConfig
:param Config: The transfer configuration to be used when performing the
    download.
r<   r=   rj   rJ   rK   rL   )r0   r2   r   r4   )r7   r=   rj   rJ   rK   rL   s         r   r   r     s5    J 99,,yyci - * *r   c           	      x    U R                   R                  R                  U R                  U R                  UX#US9$ )a  Download this object from S3 to a file-like object.

The file-like object must be in binary mode.

This is a managed transfer which will perform a multipart download in
multiple threads if necessary.

Usage::

    import boto3
    s3 = boto3.resource('s3')
    bucket = s3.Bucket('mybucket')
    obj = bucket.Object('mykey')

    with open('filename', 'wb') as data:
        obj.download_fileobj(data)

:type Fileobj: a file-like object
:param Fileobj: A file-like object to download into. At a minimum, it must
    implement the `write` method and must accept bytes.

:type ExtraArgs: dict
:param ExtraArgs: Extra arguments that may be passed to the
    client operation.

:type Callback: function
:param Callback: A method which takes a number of bytes transferred to
    be periodically called during the download.

:type Config: boto3.s3.transfer.TransferConfig
:param Config: The transfer configuration to be used when performing the
    download.
rt   )r0   r2   r   rA   rB   ro   s        r   r%   r%     s=    F 99,,TXXwv - ? ?r   )NNN)NNNN)botocore.exceptionsr   boto3.s3.transferr   r   r   r   boto3r   r   r   r&   r)   r   r(   r   r   r   r   r!   r"   r   r   r#   r   r   r$   r   r   r%    r   r   <module>rz      s   , 5 8 5 @	GGJ0	 8<&*&5R :>(,&5T >B"?L @D"?L >B?F @D?D BF#'>B AE*.1Eh <@*.0f :>)-6r 9=04'*T CG!%%?P <@+/6r ;?26'*T EI#'%?r   