U
    W¨+dO£  ã                   @   sx   d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlmZ G dd„ de	ƒZ
G dd„ de
ƒZG d	d
„ d
e
ƒZdS )é    N)ÚDeleteMarker©ÚBotoClientError)ÚInvalidUriErrorc                   @   sÐ   e Zd ZdZdZdZi Zdd„ Zdd„ Zdd„ Z	d	d
„ Z
dd„ Zdd„ Zdd„ Zd.dd„Zdd„ Zd/dd„Zd0dd„Zd1dd„Zd2dd„Zd3dd „Zd4d!d"„Zd5d#d$„Zd6d&d'„Zd7d(d)„Zd*d+„ Zd,d-„ ZdS )8Ú
StorageUrizæ
    Base class for representing storage provider-independent bucket and
    object name with a shorthand URI-like syntax.

    This is an abstract class: the constructor cannot be called (throws an
    exception if you try).
    Nc                 C   s   t dƒ‚dS )zBUncallable constructor on abstract base StorageUri class.
        z0Attempt to instantiate abstract StorageUri classNr   ©Úself© r	   ú4/tmp/pip-unpacked-wheel-dlxw5sjy/boto/storage_uri.pyÚ__init__6   s    zStorageUri.__init__c                 C   s   | j S )z%Returns string representation of URI.©Úurir   r	   r	   r
   Ú__repr__<   s    zStorageUri.__repr__c                 C   s   | j |j kS )z#Returns true if two URIs are equal.r   )r   r   r	   r	   r
   Úequals@   s    zStorageUri.equalsc                 C   s*   |d kr&t d t d||f d¡¡ƒ‚d S )NÚ
zÉAttempt to get %s for "%s" failed. This can happen if the URI refers to a non-existent object or if you meant to operate on a directory (e.g., leaving off -R option on gsutil cp, mv, or ls of a bucket)éP   )r   ÚjoinÚtextwrapÚwrap)r   ÚrespÚlevelr   r	   r	   r
   Úcheck_responseD   s    
ýüzStorageUri.check_responsec                 C   s*   t t| ƒtƒr&| js&td|| jf ƒ‚d S )Nz%s on bucket-less URI (%s))Ú
issubclassÚtypeÚBucketStorageUriÚbucket_namer   r   ©r   Úfunction_namer	   r	   r
   Ú_check_bucket_uriL   s    ÿzStorageUri._check_bucket_uric                 C   s*   t t| ƒtƒr&| js&td|| jf ƒ‚d S )Nz%s on object-less URI (%s))r   r   r   Úobject_namer   r   r   r	   r	   r
   Ú_check_object_uriQ   s    ÿzStorageUri._check_object_uric              	   K   s4   |D ]*}|| rt j d||t|| ƒf ¡ qd S )Nz$Warning: %s ignores argument: %s=%s
)ÚsysÚstderrÚwriteÚstr)r   r   ÚargsÚargr	   r	   r
   Ú_warn_about_argsV   s    ÿÿzStorageUri._warn_about_argsc           	      K   s  t | jp
dƒ}t| dƒr*d|kr*| j|d< | |¡ | js
| j| jkrX| j| j | _n²| jdkrŽddlm	} |||f|Ž| _| j| j| j< n|| jdkrÚddl
m} ddlm} |ƒ |d	< |||f|Ž| _| j| j| j< n0| jd
krüddlm} || ƒ| _ntd| j ƒ‚| j| j_| jS )aË  
        Opens a connection to appropriate provider, depending on provider
        portion of URI. Requires Credentials defined in boto config file (see
        boto/pyami/config.py).
        @type storage_uri: StorageUri
        @param storage_uri: StorageUri specifying a bucket or a bucket+object
        @rtype: L{AWSAuthConnection<boto.gs.connection.AWSAuthConnection>}
        @return: A connection to storage service provider of the given URI.
        r	   Úsuppress_consec_slashesÚs3r   )ÚS3ConnectionÚgs)ÚGSConnection)ÚOrdinaryCallingFormatZcalling_formatÚfile)ÚFileConnectionzUnrecognized scheme "%s")ÚdictÚconnection_argsÚhasattrr(   ÚupdateÚ
connectionÚschemeÚprovider_poolZboto.s3.connectionr*   Zboto.gs.connectionr,   r-   Zboto.file.connectionr/   r   Údebug)	r   Zaccess_key_idZsecret_access_keyÚkwargsr1   r*   r,   r-   r/   r	   r	   r
   Úconnect]   sH    

ÿÿ

ÿþ

ÿþ
ÿ
zStorageUri.connectc                 C   s"   t t| ƒtƒo | jd k	p | jd k	S ©N)r   r   r   Ú
version_idÚ
generationr   r	   r	   r
   Úhas_version—   s    
þzStorageUri.has_versionFc                 C   s(   |   d¡ |  ||¡}| | j|||¡S )NÚ
delete_key)r    Ú
get_bucketr>   r   ©r   ÚvalidateÚheadersr;   Z	mfa_tokenÚbucketr	   r	   r
   r>   œ   s
    
ÿzStorageUri.delete_keyÚ c                 C   sH   |   d¡ | j|d}|r4dd„ |j|||dD ƒS |j|||dS d S )NÚlist_bucket©rB   c                 s   s   | ]}t |tƒs|V  qd S r:   )Ú
isinstancer   )Ú.0Úvr	   r	   r
   Ú	<genexpr>¨   s    
þz)StorageUri.list_bucket.<locals>.<genexpr>)ÚprefixÚ	delimiterrB   )r   r?   Zlist_versionsÚlist)r   rK   rL   rB   Zall_versionsrC   r	   r	   r
   rE   £   s    

  ÿ
ÿzStorageUri.list_bucketc                 C   s   |   ||¡}| |¡S r:   )r?   Úget_all_keys)r   rA   rB   rK   rC   r	   r	   r
   rN   ¯   s    zStorageUri.get_all_keysc                 C   s6   |   d¡ |  ¡ }| | j||¡}|  |d| j¡ |S )Nr?   rC   )r   r9   r?   r   r   r   )r   rA   rB   ÚconnrC   r	   r	   r
   r?   ³   s
    
zStorageUri.get_bucketc                 C   s:   |   d¡ |  ||¡}| | j||¡}|  |d| j¡ |S )NÚget_keyÚkey)r    r?   rP   r   r   r   ©r   rA   rB   r;   rC   rQ   r	   r	   r
   rP   º   s
    
zStorageUri.get_keyc                 C   s"   |   d¡ |  ||¡}| | j¡S )NÚnew_key)r    r?   rS   r   ©r   rA   rB   rC   r	   r	   r
   rS   Á   s    
zStorageUri.new_keyc                 C   sD   |   d¡ | jddd |  d |¡}|  |d| j¡ |j|||dS )NrP   F)rA   rQ   ©r;   )r    r'   rP   r   r   Úget_contents_to_file)r   ÚfprB   r;   rQ   r	   r	   r
   Úget_contents_to_streamÆ   s
    
z!StorageUri.get_contents_to_streamé
   c
                 C   sd   |   d¡ |  d |¡}
|  |
d| j¡ |	rH|
j|||||||||	d	 n|
 ||||||||¡ d S )NrV   rQ   )Ú	hash_algs)r    rP   r   r   rV   )r   rW   rB   ÚcbÚnum_cbÚtorrentr;   Zres_download_handlerÚresponse_headersrZ   rQ   r	   r	   r
   rV   Í   s    
 ý þzStorageUri.get_contents_to_filec                 C   s8   |   d¡ |  ||¡}|  |d| j¡ | |||||¡S )NÚget_contents_as_stringrQ   )r    rP   r   r   r_   )r   rA   rB   r[   r\   r]   r;   rQ   r	   r	   r
   r_   Þ   s    
ÿz!StorageUri.get_contents_as_stringc                 C   s$   |   ¡ }|jj}|  |d| j¡ |S )NÚ	acl_class)r9   Úproviderr`   r   r   )r   rO   r`   r	   r	   r
   r`   æ   s    zStorageUri.acl_classc                 C   s$   |   ¡ }|jj}|  |d| j¡ |S )NÚcanned_acls)r9   ra   rb   r   r   )r   rO   rb   r	   r	   r
   rb   ì   s    zStorageUri.canned_acls)NN)FNNN)rD   rD   NF)FNN)FN)FNN)FN)NN)NNrY   FNNNN)FNNrY   FN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r4   r1   r6   r   r   r   r   r   r    r'   r9   r=   r>   rE   rN   r?   rP   rS   rX   rV   r_   r`   rb   r	   r	   r	   r
   r       sL   
:  ÿ
  ÿ





        ý
      ÿ
r   c                	   @   s^  e Zd ZdZdZeg ƒZd„dd„Zd	d
„ Zdd„ Z	dd„ Z
d…dd„Zd†dd„Zdd„ Zdd„ Zd‡dd„Zdˆdd„Zd‰dd„ZdŠdd„Zd‹dd „ZdŒd!d"„Zdd#d$„ZdŽd%d&„Zdd'd(„Zdd)d*„Zd‘d+d,„Zd’d-d.„Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Z d;d<„ Z!d=d>„ Z"d?d@„ Z#dAdB„ Z$d“dDdE„Z%d”dFdG„Z&d•dHdI„Z'dJdK„ Z(d–dLdM„Z)d—dNdO„Z*d˜dPdQ„Z+d™dRdS„Z,dšdTdU„Z-d›dVdW„Z.dœdXdY„Z/dd[d\„Z0džd]d^„Z1dŸd_d`„Z2d dbdc„Z3d¡ddde„Z4d¢dfdg„Z5d£dhdi„Z6d¤djdk„Z7d¥dldm„Z8d¦dndo„Z9d§dpdq„Z:d¨drds„Z;d©dtdu„Z<dªdvdw„Z=d«dxdy„Z>d¬dzd{„Z?d­d|d}„Z@d®d~d„ZAd¯d€d„ZBd°d‚dƒ„ZCdS )±r   z
    StorageUri subclass that handles bucket storage providers.
    Callers should instantiate this class by calling boto.storage_uri().
    ú/Nr   TFc
           
      C   sb   || _ || _|| _|| _|r"|| _|| _|| _|o8t|ƒ| _|	| _	t
| jƒpRt
|ƒ| _|  ¡  dS )aÐ  Instantiate a BucketStorageUri from scheme,bucket,object tuple.

        @type scheme: string
        @param scheme: URI scheme naming the storage provider (gs, s3, etc.)
        @type bucket_name: string
        @param bucket_name: bucket name
        @type object_name: string
        @param object_name: object name, excluding generation/version.
        @type debug: int
        @param debug: debug level to pass in to connection (range 0..2)
        @type connection_args: map
        @param connection_args: optional map containing args to be
            passed to {S3,GS}Connection constructor (e.g., to override
            https_connection_factory).
        @param suppress_consec_slashes: If provided, controls whether
            consecutive slashes will be suppressed in key paths.
        @param version_id: Object version id (S3-specific).
        @param generation: Object generation number (GCS-specific).
        @param is_latest: boolean indicating that a versioned object is the
            current version

        After instantiation the components are available in the following
        fields: scheme, bucket_name, object_name, version_id, generation,
        is_latest, versionless_uri, version_specific_uri, uri.
        Note: If instantiated without version info, the string representation
        for a URI stays versionless; similarly, if instantiated with version
        info, the string representation for a URI stays version-specific. If you
        call one of the uri.set_contents_from_xyz() methods, a specific object
        version will be created, and its version-specific URI string can be
        retrieved from version_specific_uri even if the URI was instantiated
        without version info.
        N)r5   r   r   r7   r1   r(   r;   Úintr<   Ú	is_latestÚboolÚis_version_specificÚ_build_uri_strings)
r   r5   r   r   r7   r1   r(   r;   r<   ri   r	   r	   r
   r   ü   s    $zBucketStorageUri.__init__c                 C   s˜   | j rn| jrnd| j| j | jf | _| jr<d| j| jf | _n| jrTd| j| jf | _| jrd| j| _q”| j| _n&| j rˆd| j| j f | _nd| j | _d S )Nz
%s://%s/%sz%s#%sz%s://%s/z%s://)	r   r   r5   Zversionless_urir<   Zversion_specific_urir;   rk   r   r   r	   r	   r
   rl   -  s&    
ÿÿ
 ÿ

z#BucketStorageUri._build_uri_stringsc              	   C   s4   |   t|dd ƒt|dd ƒt|dd ƒt|dd ƒ¡ d S )Nr;   r<   ri   Úmd5)Ú_update_from_valuesÚgetattr)r   rQ   r	   r	   r
   Ú_update_from_key@  s    



üz!BucketStorageUri._update_from_keyc                 C   s$   || _ || _|| _|  ¡  || _d S r:   )r;   r<   ri   rl   rm   )r   r;   r<   ri   rm   r	   r	   r
   rn   G  s
    z$BucketStorageUri._update_from_valuesc                 C   st   |   d¡ |  ||¡}|  ¡ jdkr>|j| j||p6| jd}n"|  ¡ jdkr`|j| j|| jd}|  |d| j	¡ |S )NrP   ÚawsrU   Úgoogle©r<   rQ   )
r    r?   Úget_providerÚnamerP   r   r;   r<   r   r   rR   r	   r	   r
   rP   N  s    

ÿ
ÿzBucketStorageUri.get_keyc                 C   sf   |   d¡ |  ||¡}|  ¡ jdkr@|p,| j}| | j|||¡S |  ¡ jdkrb|j| j|| jdS d S )Nr>   rq   rr   rs   )r    r?   rt   ru   r;   r>   r   r<   r@   r	   r	   r
   r>   Z  s    

ÿ
ÿzBucketStorageUri.delete_keyc                 C   s$   |   d¡ t| j| j|| j| jdS )zºInstantiate a BucketStorageUri from the current BucketStorageUri,
        but replacing the object_name.

        @type new_name: string
        @param new_name: new object name
        Úclone_replace_name)r   r   r7   r(   )r   r   r5   r   r7   r(   ©r   Únew_namer	   r	   r
   rv   f  s    
  ýz#BucketStorageUri.clone_replace_namec              
   C   sn   |   d¡ d}d}d}t|dƒr&|j}t|dƒr6|j}t|dƒrF|j}t|j ¡ |jj	|j	| j
| j|||dS )a)  Instantiate a BucketStorageUri from the current BucketStorageUri, by
        replacing the object name with the object name and other metadata found
        in the given Key object (including generation).

        @type key: Key
        @param key: key for the new StorageUri to represent
        Úclone_replace_keyNFr;   r<   ri   )r   r   r7   r(   r;   r<   ri   )r   r2   r;   r<   ri   r   ra   Zget_provider_namerC   ru   r7   r(   )r   rQ   r;   r<   ri   r	   r	   r
   ry   s  s(    



øz"BucketStorageUri.clone_replace_keyc                 C   sn   |   d¡ |  ||¡}| jpd}|  ¡ jdkrH|p6| j}| |||¡}n|j||| jd}|  |d| j	¡ |S )zreturns a bucket's aclÚget_aclrD   rq   rs   Úacl)
r   r?   r   rt   ru   r;   rz   r<   r   r   )r   rA   rB   r;   rC   Úkey_namer{   r	   r	   r
   rz     s    


zBucketStorageUri.get_aclc                 C   s4   |   d¡ |  ||¡}| |¡}|  |d| j¡ |S )z%returns a bucket's default object aclÚget_def_aclr{   )r   r?   r}   r   r   )r   rA   rB   rC   r{   r	   r	   r
   r}   Ÿ  s
    

zBucketStorageUri.get_def_aclc                 C   s4   |   d¡ |  ||¡}| |¡}|  |d| j¡ |S )zreturns a bucket's CORS XMLÚget_corsÚcors)r   r?   r~   r   r   )r   rA   rB   rC   r   r	   r	   r
   r~   §  s
    

zBucketStorageUri.get_corsc                 C   sB   |   d¡ |  ||¡}| jdkr.| ||¡ n| | ¡ |¡ dS )z#sets or updates a bucket's CORS XMLz	set_cors r)   N)r   r?   r5   Úset_corsZto_xml)r   r   rA   rB   rC   r	   r	   r
   r€   ¯  s
    

zBucketStorageUri.set_corsc                 C   s    |   d¡ |  ||¡}| |¡S )NÚget_location)r   r?   r   rT   r	   r	   r
   r   ¸  s    
zBucketStorageUri.get_locationc                 C   s8   |   d¡ | jdkr"td| j ƒ‚|  ||¡}| |¡S )NÚget_storage_classr+   z.get_storage_class() not supported for %s URIs.)r   r5   Ú
ValueErrorr?   r‚   rT   r	   r	   r
   r‚   ½  s    

ÿz"BucketStorageUri.get_storage_classc                 C   s>   |   d¡ | jdkr"td| j ƒ‚|  ||¡}| ||¡ dS )z!Updates a bucket's storage class.Úset_storage_classr+   z.set_storage_class() not supported for %s URIs.N)r   r5   rƒ   r?   r„   )r   Ústorage_classrA   rB   rC   r	   r	   r
   r„   Ç  s    

ÿz"BucketStorageUri.set_storage_classc                 C   s(   |   d¡ |  ||¡}| || j||¡S )NÚget_subresource)r   r?   r†   r   )r   ÚsubresourcerA   rB   r;   rC   r	   r	   r
   r†   Ò  s
    
ÿz BucketStorageUri.get_subresourcec                 C   s–   |   d¡ | jdkr"td| j ƒ‚| jr`|r4tdƒ‚|  ||¡}|  |d| j¡ | |||¡ n2| jr„|  	||¡}| ||||¡ nt
d| j ƒ‚d S )NÚadd_group_email_grantr+   z2add_group_email_grant() not supported for %s URIs.zDadd_group_email_grant() on key-ful URI cannot specify recursive=TruerQ   z-add_group_email_grant() on bucket-less URI %s)r   r5   rƒ   r   rP   r   r   rˆ   r   r?   r   )r   Ú
permissionÚemail_addressÚ	recursiverA   rB   rQ   rC   r	   r	   r
   rˆ   Ù  s&    

ÿ
ÿÿz&BucketStorageUri.add_group_email_grantc                 C   sZ   |   d¡ | js.|  ||¡}| ||||¡ n(|  ||¡}|  |d| j¡ | ||¡ d S )NÚadd_email_grantrQ   )r   r   r?   rŒ   rP   r   r   )r   r‰   rŠ   r‹   rA   rB   rC   rQ   r	   r	   r
   rŒ   î  s    

ÿz BucketStorageUri.add_email_grantc                 C   sZ   |   d¡ | js.|  ||¡}| ||||¡ n(|  ||¡}|  |d| j¡ | ||¡ d S )NÚadd_user_grantrQ   )r   r   r?   r   rP   r   r   )r   r‰   Zuser_idr‹   rA   rB   rC   rQ   r	   r	   r
   r   ú  s    
zBucketStorageUri.add_user_grantc                 C   s   |   d¡ |  |¡}| |¡S )Nzlist_grants )r   r?   Úlist_grants©r   rB   rC   r	   r	   r
   rŽ     s    

zBucketStorageUri.list_grantsc                 C   s   dS )ú3Returns True if this URI names a file or directory.Fr	   r   r	   r	   r
   Úis_file_uri
  s    zBucketStorageUri.is_file_uric                 C   s   dS )ú2Returns True if this URI names a bucket or object.Tr	   r   r	   r	   r
   Úis_cloud_uri  s    zBucketStorageUri.is_cloud_uric                 C   s   t | j ƒS )zÒ
        Returns True if this URI names a directory or bucket. Will return
        False for bucket subdirs; providing bucket subdir semantics needs to
        be done by the caller (like gsutil does).
        ©rj   r   r   r	   r	   r
   Únames_container  s    z BucketStorageUri.names_containerc                 C   s
   t | jƒS )z0Returns True if this URI names a file or object.r”   r   r	   r	   r
   Únames_singleton  s    z BucketStorageUri.names_singletonc                 C   s   dS ©z+Returns True if this URI names a directory.Fr	   r   r	   r	   r
   Únames_directory  s    z BucketStorageUri.names_directoryc                 C   s   t | j ƒS )ú*Returns True if this URI names a provider.)rj   r   r   r	   r	   r
   Únames_provider"  s    zBucketStorageUri.names_providerc                 C   s   t | jƒot | j ƒS )ú(Returns True if this URI names a bucket.)rj   r   r   r   r	   r	   r
   Únames_bucket&  s    zBucketStorageUri.names_bucketc                 C   s   dS )ú&Returns True if this URI names a file.Fr	   r   r	   r	   r
   Ú
names_file*  s    zBucketStorageUri.names_filec                 C   s   |   ¡ S )ú)Returns True if this URI names an object.©r–   r   r	   r	   r
   Únames_object.  s    zBucketStorageUri.names_objectc                 C   s   dS )z8Returns True if this URI represents input/output stream.Fr	   r   r	   r	   r
   Ú	is_stream2  s    zBucketStorageUri.is_streamrD   c                 C   sF   |   d¡ |  ¡ }| jdkr0| | j||||¡S | | j|||¡S d S )Nzcreate_bucket r+   )r   r9   r5   Úcreate_bucketr   )r   rB   ÚlocationÚpolicyr…   rO   r	   r	   r
   r£   6  s    

ÿzBucketStorageUri.create_bucketc                 C   s    |   d¡ |  ¡ }| | j|¡S )NÚdelete_bucket)r   r9   r¦   r   ©r   rB   rO   r	   r	   r
   r¦   B  s    
zBucketStorageUri.delete_bucketc                 C   s   |   ¡ }| |¡S r:   )r9   Úget_all_bucketsr§   r	   r	   r
   r¨   G  s    z BucketStorageUri.get_all_bucketsc                 C   s"   |   ¡ }|j}|  |d| j¡ |S )Nra   )r9   ra   r   r   )r   rO   ra   r	   r	   r
   rt   K  s    zBucketStorageUri.get_providerc           	      C   sb   |   d¡ |p| jpd}|  ||¡}| jrD|j|||| j||d n|pL| j}| ||||¡ dS )zSets or updates a bucket's ACL.Úset_aclrD   ©r<   Úif_generationÚif_metagenerationN)r   r   r?   r<   r©   r;   )	r   Ú
acl_or_strr|   rA   rB   r;   r«   r¬   rC   r	   r	   r
   r©   Q  s    
    þ
zBucketStorageUri.set_aclc           	      C   sd   |   d¡ |p| jpd}|  ||¡}| jrD|j|||| j||d n|pL| j}|j||||d dS )z2Sets or updates a bucket's ACL with an XML string.Úset_xml_aclrD   rª   rU   N)r   r   r?   r<   r®   r;   )	r   Ú	xmlstringr|   rA   rB   r;   r«   r¬   rC   r	   r	   r
   r®   _  s     
    þ

ÿzBucketStorageUri.set_xml_aclc                 C   s"   |   d¡ |  ||¡ ||¡ dS )zASets or updates a bucket's default object ACL with an XML string.Úset_def_xml_aclN)r   r?   r°   )r   r¯   rA   rB   r	   r	   r
   r°   n  s    
z BucketStorageUri.set_def_xml_aclc                 C   s"   |   d¡ |  ||¡ ||¡ dS )z.Sets or updates a bucket's default object ACL.Úset_def_aclN)r   r?   r±   )r   r­   rA   rB   r;   r	   r	   r
   r±   s  s    
zBucketStorageUri.set_def_aclc                 C   sD   |   d¡ | jd|d |  ||¡}|  |d| j¡ | ||¡ dS )z>Sets or updates a bucket's acl to a predefined (canned) value.Úset_canned_aclrU   rQ   N)r    r'   rP   r   r   r²   ©r   Zacl_strrA   rB   r;   rQ   r	   r	   r
   r²   y  s
    
zBucketStorageUri.set_canned_aclc                 C   s8   |   d¡ |  ||¡}|  |d| j¡ | |||¡ dS )zXSets or updates a bucket's default object acl to a predefined
           (canned) value.zset_def_canned_acl rQ   N)r   rP   r   r   Úset_def_canned_aclr³   r	   r	   r
   r´   ‚  s    
z#BucketStorageUri.set_def_canned_aclc                 C   s.   |   d¡ |  ||¡}| ||| j||¡ d S )NÚset_subresource)r   r?   rµ   r   )r   r‡   ÚvaluerA   rB   r;   rC   r	   r	   r
   rµ   ‹  s
    
ÿz BucketStorageUri.set_subresourcerY   c	              
   C   sn   |   d¡ | j|d}	| jdkrH|r0tj d¡ |	 |||||||¡}
n|	 ||||||||¡}
|  |	¡ |
S )NÚset_contents_from_stringrF   r+   z^Warning: GCS does not support reduced_redundancy; argument ignored by set_contents_from_string)r    rS   r5   r!   r"   r#   r·   rp   )r   ÚsrB   Úreplacer[   r\   r¥   rm   Úreduced_redundancyrQ   Úresultr	   r	   r
   r·   ’  s4    

      ÿ      þ
z)BucketStorageUri.set_contents_from_stringc                 C   sŽ   |   d¡ | j|d}| jdkrV|j|||||||||	|
d
}|
r€|  d |
jd |¡ n*| jd|
d |j|||||||||	d	}|  |¡ |S )NÚset_contents_from_filerF   r+   )ÚsizeÚrewindÚres_upload_handler)r¿   )r½   r¾   )r    rS   r5   r¼   rn   r<   r'   rp   )r   rW   rB   r¹   r[   r\   r¥   rm   r½   r¾   r¿   rQ   r»   r	   r	   r
   r¼   ¥  sH    

        þ
 ÿÿ       þ
z'BucketStorageUri.set_contents_from_filec           	      C   s:   |   d¡ |  d|¡}|j||||||d}|  |¡ |S )NÚset_contents_from_streamF)r¥   rº   )r    rS   rÀ   rp   )	r   rW   rB   r¹   r[   r¥   rº   Zdst_keyr»   r	   r	   r
   rÀ   º  s    
    þ
z)BucketStorageUri.set_contents_from_streamÚSTANDARDc                 C   s`   |   d¡ | jd|d}|
r<|j| j||||||||	|
d
S |j| j|||||||||	d
S dS )zReturns newly created key.Úcopy_keyF)rA   rB   )
Únew_key_nameÚsrc_bucket_nameÚsrc_key_nameÚmetadatar…   Úpreserve_aclÚencrypt_keyrB   Ú
query_argsÚsrc_generation)
rÃ   rÄ   rÅ   rÆ   Úsrc_version_idr…   rÇ   rÈ   rB   rÉ   N)r    r?   rÂ   r   )r   rÄ   rÅ   rÆ   rË   r…   rÇ   rÈ   rB   rÉ   rÊ   Z
dst_bucketr	   r	   r
   rÂ   Ä  s6    
    ú     ûzBucketStorageUri.copy_keyc                 C   s*   |   d¡ |  ||¡}|j|||d d S )NÚenable_loggingrF   )r   r?   rÌ   )r   Ztarget_bucketZtarget_prefixrA   rB   r;   rC   r	   r	   r
   rÌ   Û  s    
zBucketStorageUri.enable_loggingc                 C   s&   |   d¡ |  ||¡}|j|d d S )NÚdisable_loggingrF   )r   r?   rÍ   ©r   rA   rB   r;   rC   r	   r	   r
   rÍ   á  s    
z BucketStorageUri.disable_loggingc                 C   s"   |   d¡ |  ||¡}|j|dS )NÚget_logging_configrF   )r   r?   rÏ   rÎ   r	   r	   r
   rÏ   æ  s    
z#BucketStorageUri.get_logging_configc                 C   s<   |   d¡ |  ||¡}|s*|s*| |¡ n| |||¡ d S )NÚset_website_config)r   r?   Zdelete_website_configurationZconfigure_website)r   Zmain_page_suffixZ	error_keyrA   rB   rC   r	   r	   r
   rÐ   ë  s
    
z#BucketStorageUri.set_website_configc                 C   s    |   d¡ |  ||¡}| |¡S )NÚget_website_config)r   r?   Zget_website_configurationrT   r	   r	   r
   rÑ   ô  s    
z#BucketStorageUri.get_website_configc                 C   s    |   d¡ |  d|¡}| |¡S )NÚget_versioning_configF)r   r?   Zget_versioning_statusr   r	   r	   r
   rÒ   ù  s    
z&BucketStorageUri.get_versioning_configc                 C   s"   |   d¡ |  d|¡}| ||¡S )NÚconfigure_versioningF)r   r?   rÓ   )r   ZenabledrB   rC   r	   r	   r
   rÓ   þ  s    
z%BucketStorageUri.configure_versioningc                 C   s   |   d¡j||||dS )NFrF   )rP   Zset_remote_metadata)r   Zmetadata_plusZmetadata_minusrÇ   rB   r	   r	   r
   Úset_metadata  s
    ýzBucketStorageUri.set_metadatac                 C   sT   |   d¡ g }|D ]}| | ¡ ¡ |j|d _q|  ¡ j|||d| _|  ¡  | S )NÚcomposeéÿÿÿÿ)Úcontent_typerB   )r    ÚappendrS   r<   rÕ   rl   )r   Ú
componentsr×   rB   Zcomponent_keysZsurir	   r	   r
   rÕ   
  s    
  ÿzBucketStorageUri.composec                 C   s4   |   d¡ |  ||¡}| |¡}|  |d| j¡ |S )z+Returns a bucket's lifecycle configuration.Úget_lifecycle_configZ	lifecycle)r   r?   rÚ   r   r   )r   rA   rB   rC   Úlifecycle_configr	   r	   r
   rÚ     s
    

z%BucketStorageUri.get_lifecycle_configc                 C   s&   |   d¡ |  ||¡}| ||¡ dS )z3Sets or updates a bucket's lifecycle configuration.Úconfigure_lifecycleN)r   r?   rÜ   )r   rÛ   rA   rB   rC   r	   r	   r
   rÜ     s    
z$BucketStorageUri.configure_lifecyclec                 C   s8   |   d¡ | jdkr"td| j ƒ‚|  d|¡}| |¡S )NÚget_billing_configr+   z/get_billing_config() not supported for %s URIs.F)r   r5   rƒ   r?   rÝ   r   r	   r	   r
   rÝ   $  s    

ÿz#BucketStorageUri.get_billing_configc                 C   s@   |   d¡ | jdkr"td| j ƒ‚|  ||¡}|j||d dS )z1Sets or updates a bucket's billing configuration.Úconfigure_billingr+   z.configure_billing() not supported for %s URIs.)Úrequester_paysrB   N)r   r5   rƒ   r?   rÞ   )r   rß   rA   rB   rC   r	   r	   r
   rÞ   -  s    

ÿz"BucketStorageUri.configure_billingc                 C   s:   |   d¡ | jdkr"td| j ƒ‚|  ||¡}|j|dS )z0Returns a GCS bucket's encryption configuration.Úget_encryption_configr+   z2get_encryption_config() not supported for %s URIs.rF   )r   r5   rƒ   r?   rà   rT   r	   r	   r
   rà   8  s    

ÿz&BucketStorageUri.get_encryption_configc                 C   s(   |   d¡ |  ||¡}|j||d dS )z-Sets a GCS bucket's encryption configuration.Úset_encryption_config)Údefault_kms_key_namerB   N)r   r?   rá   )r   râ   rA   rB   rC   r	   r	   r
   rá   C  s
    
ÿz&BucketStorageUri.set_encryption_configc                 C   s6   | j std| j ƒ‚|  |¡}|j| j |d}t|ƒS )z8Returns True if the object exists or False if it doesn'tzexists on object-less URI (%s)rF   )r   r   r   r?   rP   rj   )r   rB   rC   rQ   r	   r	   r
   ÚexistsK  s
    
zBucketStorageUri.exists)NNr   NTNNF)FNN)FNNN)FNN)FN)FN)FN)FN)FN)FN)FNN)FFN)FFN)FFN)N)NrD   NN)N)N)rD   FNNNN)rD   FNNNN)FN)FNN)FNN)FNN)FNN)NTNrY   NNF)	NTNrY   NNNFN)NTNNF)NNrÁ   FFNNN)NFNN)FNN)FNN)NNFN)FN)N)N)N)NN)FN)FN)N)FFN)FN)NFN)N)Drc   rd   re   rf   ÚdelimÚsetZcapabilitiesr   rl   rp   rn   rP   r>   rv   ry   rz   r}   r~   r€   r   r‚   r„   r†   rˆ   rŒ   r   rŽ   r‘   r“   r•   r–   r˜   rš   rœ   rž   r¡   r¢   r£   r¦   r¨   rt   r©   r®   r°   r±   r²   r´   rµ   r·   r¼   rÀ   rÂ   rÌ   rÍ   rÏ   rÐ   rÑ   rÒ   rÓ   rÔ   rÕ   rÚ   rÜ   rÝ   rÞ   rà   rá   rã   r	   r	   r	   r
   r   ó   s             þ
1
  ÿ




	



  ÿ
    ÿ
    ÿ
    ÿ

  ÿ


      ÿ
      ÿ

  ÿ
  ÿ
	  ÿ
	  ÿ
         þ
           þ
    ÿ

            ý
    ÿ


    ÿ
	


 ÿ


  ÿ

	  ÿ

  ÿ
r   c                   @   sŠ   e Zd ZdZejZd dd„Zdd„ Zdd„ Z	d	d
„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd!dd„ZdS )"ÚFileStorageUrizã
    StorageUri subclass that handles files in the local file system.
    Callers should instantiate this class by calling boto.storage_uri().

    See file/README about how we map StorageUri operations onto a file system.
    Fc                 C   s,   d| _ d| _|| _d| | _|| _|| _dS )a™  Instantiate a FileStorageUri from a path name.

        @type object_name: string
        @param object_name: object name
        @type debug: boolean
        @param debug: whether to enable debugging on this StorageUri

        After instantiation the components are available in the following
        fields: uri, scheme, bucket_name (always blank for this "anonymous"
        bucket), object_name.
        r.   rD   zfile://N)r5   r   r   r   r7   Ústream)r   r   r7   r¢   r	   r	   r
   r   ^  s    
zFileStorageUri.__init__c                 C   s   t || j| jƒS )z¶Instantiate a FileStorageUri from the current FileStorageUri,
        but replacing the object_name.

        @type new_name: string
        @param new_name: new object name
        )ræ   r7   rç   rw   r	   r	   r
   rv   r  s    z!FileStorageUri.clone_replace_namec                 C   s   dS )r   Tr	   r   r	   r	   r
   r‘   {  s    zFileStorageUri.is_file_uric                 C   s   dS )r’   Fr	   r   r	   r	   r
   r“     s    zFileStorageUri.is_cloud_uric                 C   s   |   ¡ S )z5Returns True if this URI names a directory or bucket.)r˜   r   r	   r	   r
   r•   ƒ  s    zFileStorageUri.names_containerc                 C   s
   |   ¡  S )z<Returns True if this URI names a file (or stream) or object.)r•   r   r	   r	   r
   r–   ‡  s    zFileStorageUri.names_singletonc                 C   s   | j r
dS tj | j¡S r—   )rç   ÚosÚpathÚisdirr   r   r	   r	   r
   r˜   ‹  s    zFileStorageUri.names_directoryc                 C   s   dS )r™   Fr	   r   r	   r	   r
   rš   ‘  s    zFileStorageUri.names_providerc                 C   s   dS )r›   Fr	   r   r	   r	   r
   rœ   •  s    zFileStorageUri.names_bucketc                 C   s   |   ¡ S )r   r    r   r	   r	   r
   rž   ™  s    zFileStorageUri.names_filec                 C   s   dS )rŸ   Fr	   r   r	   r	   r
   r¡     s    zFileStorageUri.names_objectc                 C   s
   t | jƒS )zAReturns True if this URI represents input/output stream.
        )rj   rç   r   r	   r	   r
   r¢   ¡  s    zFileStorageUri.is_streamc                 C   s   |   ¡  ¡  dS )z$Closes the underlying file.
        N)rP   Úcloser   r	   r	   r
   rë   ¦  s    zFileStorageUri.closeNc                 C   s   t j | j¡S )z6Returns True if the file exists or False if it doesn't)rè   ré   rã   r   )r   Z_headers_not_usedr	   r	   r
   rã   «  s    zFileStorageUri.exists)F)N)rc   rd   re   rf   rè   Úseprä   r   rv   r‘   r“   r•   r–   r˜   rš   rœ   rž   r¡   r¢   rë   rã   r	   r	   r	   r
   ræ   T  s    
	ræ   )Zbotorè   r!   r   Zboto.s3.deletemarkerr   Zboto.exceptionr   r   Úobjectr   r   ræ   r	   r	   r	   r
   Ú<module>   s    T    e