3
b~                 @   s  d dl mZmZ d dlZd dlZd dlZddlmZmZm	Z	 ddl
mZ ejdkZG dd deZG d	d
 d
eZG dd deZG dd deZG dd deZedkredZedee ede edej edej  edej  e  edZedee ede edej edej  e  edZedee ede edej edej  e  edZedee ede edej edej  e  edZedee ede edej edej  e  dS )    )absolute_importprint_functionN   )	unicodisedeunicodisecheck_bucket_name_dns_support)Config   c               @   sD   e Zd ZdZdZdd Zdd Zdd Zdd	 Zd
d Z	dd Z
dS )S3UriNc             C   s   | j sfg | _ tjt j}xL|D ]D}t|| t| k	r8qt|| | r|| | kr| j j||  qW x>| j D ]4}ytj	|}|j
| |S  tk
r   wnY qnX qnW td| d S )Nz%s: not a recognized URI)_subclassessysmodules__name____dict__type
issubclassappendobject__new____init__
ValueError)selfstringdictZ	somethingsubclassinstance r   H/oak/stanford/groups/akundaje/marinovg/programs/s3cmd-master/S3/S3Uri.pyr      s     


zS3Uri.__new__c             C   s   t r| j S t| j S d S )N)PY3urir   )r   r   r   r   __str__,   s    zS3Uri.__str__c             C   s   | j  S )N)r   )r   r   r   r   __unicode__2   s    zS3Uri.__unicode__c             C   s   t d| jj| j f S )Nz<%s: %s>)repr	__class__r   r!   )r   r   r   r   __repr__5   s    zS3Uri.__repr__c             C   s   t dd S )Nz6This S3 URI does not have Anonymous URL representation)r   )r   r   r   r   
public_url8   s    zS3Uri.public_urlc             C   s   | j  jdd S )N/r   )r!   split)r   r   r   r   basename;   s    zS3Uri.basename)r   
__module____qualname__r   r   r   r    r!   r$   r%   r)   r   r   r   r   r
      s   r
   c               @   s   e Zd ZdZejdejejB 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edddZedd ZdS )S3UriS3s3z^s3:///*([^/]*)/?(.*)c             C   s<   | j j|}|std| |j }|d | _|d | _d S )Nz%s: not a S3 URIr   r   )_rematchr   groups_bucket_object)r   r   r/   r0   r   r   r   r   A   s    
zS3UriS3.__init__c             C   s   | j S )N)r1   )r   r   r   r   bucketI   s    zS3UriS3.bucketc             C   s   | j S )N)r2   )r   r   r   r   r   L   s    zS3UriS3.objectc             C   s
   t | jS )N)boolr1   )r   r   r   r   
has_bucketO   s    zS3UriS3.has_bucketc             C   s
   t | jS )N)r4   r2   )r   r   r   r   
has_objectR   s    zS3UriS3.has_objectc             C   s   dj d| j| jgS )Nr&   zs3:/)joinr1   r2   )r   r   r   r   r   U   s    zS3UriS3.uric             C   s   t tj j| jS )N)r   r   host_bucketr1   )r   r   r   r   is_dns_compatibleX   s    zS3UriS3.is_dns_compatiblec             C   sR   d}t j  jrd}| j r4d|| jt j  j| jf S d|t j  j| j| jf S d S )Nhttphttpsz%s://%s.%s/%sz%s://%s/%s/%s)r   public_url_use_httpsr9   r1   	host_baser2   )r   Zpublic_url_protocolr   r   r   r%   [   s    
zS3UriS3.public_urlc             C   s   | j  rd| j S dS d S )Nz%s.s3.amazonaws.comzs3.amazonaws.com)r9   r1   )r   r   r   r   	host_named   s    
zS3UriS3.host_name c             C   s   d| |f S )Nz
s3://%s/%sr   )r3   r   r   r   r   compose_urij   s    zS3UriS3.compose_uric             C   s   t jd| t jt jB }|j dd  \}}|j }|dkrd|jddkrR|}d}q|jdd\}}n*|jdr|d t	d  }nt
d|  td	||d
 S )Nz(https?://)?([^/]+)/?(.*)r   zs3.amazonaws.comr&   r   r?   z.s3.amazonaws.comzUnable to parse URL: %szs3://%(bucket)s/%(object)s)r3   r   )rer/   
IGNORECASEUNICODEr0   lowercountr(   endswithlenr   r
   )Zhttp_urlmhostnamer   r3   r   r   r   httpurl_to_s3urin   s    
zS3UriS3.httpurl_to_s3uriN)r?   )r   r*   r+   r   rA   compilerB   rC   r.   r   r3   r   r5   r6   r   r9   r%   r>   staticmethodr@   rJ   r   r   r   r   r,   >   s   	r,   c               @   sD   e Zd ZdZejdejejB Zdd Z	dd Z
dd Zd	d
 ZdS )	S3UriS3FSZs3fsz^s3fs:///*([^/]*)/?(.*)c             C   sB   | j j|}|std| |j }|d | _|d jd| _d S )Nz%s: not a S3fs URIr   r   r&   )r.   r/   r   r0   _fsnamer(   _path)r   r   r/   r0   r   r   r   r      s    
zS3UriS3FS.__init__c             C   s   | j S )N)rN   )r   r   r   r   fsname   s    zS3UriS3FS.fsnamec             C   s   dj | jS )Nr&   )r7   rO   )r   r   r   r   path   s    zS3UriS3FS.pathc             C   s   dj d| j| j gS )Nr&   zs3fs:/)r7   rN   rQ   )r   r   r   r   r      s    zS3UriS3FS.uriN)r   r*   r+   r   rA   rK   rB   rC   r.   r   rP   rQ   r   r   r   r   r   rM      s   rM   c               @   sN   e Zd ZdZejdejZdd Zdd Z	dd Z
d	d
 Zdd Zdd ZdS )	S3UriFilefilez^(\w+://)?(.*)c             C   s`   | j j|}|j }|d dkr,td| |d d krL|d jtj| _n|d jd| _d S )Nr   file://z%s: not a file:// URIr   r&   )NrT   )r.   r/   r0   r   r(   osseprO   )r   r   r/   r0   r   r   r   r      s    zS3UriFile.__init__c             C   s   t jj| jS )N)rU   rV   r7   rO   )r   r   r   r   rQ      s    zS3UriFile.pathc             C   s   dj dg| j S )Nr&   zfile:/)r7   rO   )r   r   r   r   r      s    zS3UriFile.uric             C   s   t jjt| j S )N)rU   rQ   isdirr   )r   r   r   r   rW      s    zS3UriFile.isdirc             C   s   t tjjt| j S )N)r   rU   rQ   dirnamer   )r   r   r   r   rX      s    zS3UriFile.dirnamec             C   s   t tjjt| j S )N)r   rU   rQ   r)   r   )r   r   r   r   r)      s    zS3UriFile.basenameN)r   r*   r+   r   rA   rK   rC   r.   r   rQ   r   rW   rX   r)   r   r   r   r   rR      s   
rR   c               @   sD   e Zd ZdZejdejejB Zdd Z	dd Z
dd Zd	d
 ZdS )S3UriCloudFrontcfz^cf://([^/]*)/*(.*)c             C   sL   | j j|}|std| |j }|d | _|d dkrB|d pDd | _d S )Nz%s: not a CloudFront URIr   r   r&   )r.   r/   r   r0   _dist_id_request_id)r   r   r/   r0   r   r   r   r      s    
zS3UriCloudFront.__init__c             C   s   | j S )N)r[   )r   r   r   r   dist_id   s    zS3UriCloudFront.dist_idc             C   s   | j S )N)r\   )r   r   r   r   
request_id   s    zS3UriCloudFront.request_idc             C   s(   d| j   }| j r$|d| j  7 }|S )Nzcf://r&   )r]   r^   )r   r   r   r   r   r      s    zS3UriCloudFront.uriN)r   r*   r+   r   rA   rK   rB   rC   r.   r   r]   r^   r   r   r   r   r   rY      s   rY   __main__zs3://bucket/objectz	type()  =z	uri     =z	uri.type=z	bucket  =z	object  =zs3://bucketz*s3fs://filesystem1/path/to/remote/file.txtz	path    =z/path/to/local/file.txtzcf://1234567890ABCD/z	dist_id =)r	   r   )
__future__r   r   rU   rA   r   Utilsr   r   r   r?   r   version_infor   r   r
   r,   rM   rR   rY   r   r   printr   r3   rQ   r]   r   r   r   r   <module>	   sV   
)G





