B
    Y                 @   s   d Z ddlmZmZ ddlZ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mZ ddlmZ G dd deZG dd	 d	eZdd
dZdS )zTalking to the Anaconda server.    )absolute_importprint_functionN)BinstarErrorUnauthorized)SimpleStatusc               @   s`   e Zd ZdddZdd 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S )_ClientNc             C   sB   t tdstd|d kr tj}tj|||d| _d | _|| _d S )Nget_server_apizPlease upgrade anaconda-client)sitetoken	log_level)	hasattrbinstar_utilsAssertionErrorloggingINFOr   _api
_user_info_force_username)selfr	   usernamer
   r    r   6lib/python3.7/site-packages/anaconda_project/client.py__init__   s    z_Client.__init__c             C   sP   | j dkr| jj| jd| _ | j dk	s*t| j dd}|dkrHt n|S dS )zEGet username to upload to; raise Unauthorized if we aren't logged in.N)loginr   )r   r   userr   r   getr   )r   r   r   r   r   	_username!   s    
z_Client._username      c             C   s   | j j|t|d d S )N)allowed)r   _check_responselist)r   resr    r   r   r   r!   ,   s    z_Client._check_responsec             C   s.   d | jj|  |}| jj|}|jdkS )Nz{}/apps/{}/projects/{}r   )formatr   domainr   sessionr   status_code)r   project_nameurlr#   r   r   r   _exists2   s    z_Client._existsc             C   s\   d | jj|  }|d dd|d id}t|\}}| jjj|||d}| | |S )Nz{}/apps/{}/projectsnameZpublicdescription)r+   accessZprofile)dataheaders)	r$   r   r%   r   r   jencoder&   postr!   )r   project_infor)   jsonr.   r/   r#   r   r   r   create7   s    
z_Client.createc          
   C   s~   x:dD ]2}|  |rt|d}t| S Q R X qW |  drjt|d}t| S Q R X dszt	d| d S )N)z.tarz.tar.gzz.tar.bz2rz.zipFzunsupported archive filename %s)
lowerendswithtarfileopenlenZgetnameszipfileZZipFileZnamelistr   )r   archive_filenamesuffixZtfZzfr   r   r   _file_countA   s    
z_Client._file_countc             C   s   d | jj|  |d }| }tj||d< | |}|d k	rL||d< ||d}t	
|\}}	| jjj|||	d}
| |
 |
S )Nz{}/apps/{}/projects/{}/stager+   sizeZnum_of_files)basenameZconfiguration)r.   r/   )r$   r   r%   r   copyospathgetsizer>   r   r0   r&   r1   r!   )r   r2   r<   uploaded_basenamer)   ZconfigZ
file_countr3   r.   r/   r#   r   r   r   stageK   s    


z_Client.stagec             C   sH   d | jj|  ||}ti \}}| jjj|||d}| | |S )Nz {}/apps/{}/projects/{}/commit/{})r.   r/   )	r$   r   r%   r   r   r0   r&   r1   r!   )r   r(   dist_idr)   r.   r/   r#   r   r   r   commitX   s
    
z_Client.commitc          	   C   s   t |d"}tj|tj|d\}}}W d Q R X | }||d< ||d< t |dD}	tj|d||	fid\}
}t	j
||
| jjjd|d}| | W d Q R X |S )	Nrb)r?   zContent-LengthzContent-MD5file)filesi  )r.   verifyZtimeoutr/   )r9   r   Zcompute_hashrB   rC   rD   rA   binstar_requests_extZstream_multipartrequestsr1   r   r&   rL   r!   )r   r<   rE   r)   s3datafZ_hexmd5Zb64md5r?   Zarchive_file_objectZdata_streamr/   r#   r   r   r   
_put_on_s3`   s     &z_Client._put_on_s3c             C   s   |  |d s(| j|d}|jdks(t| j|||d}|jdksFt| }d|ksZtd|ksftd|ksrt| j|||d |d d}|jdkst| |d |d }|jdkst| S )	zDUpload archive_filename created from project, throwing BinstarError.r+   )r2   )r   r   )r2   r<   rE   Zpost_urlZ	form_datarG   )r)   rO   )r*   r4   r'   r   rF   r3   rQ   rH   )r   r2   r<   rE   r#   Z
stage_infor   r   r   uploadu   s&    z_Client.upload)NNNN)r   )__name__
__module____qualname__r   r   r!   r*   r4   r>   rF   rH   rQ   rR   r   r   r   r   r      s   



r   c                   s   e Zd Z fddZ  ZS )_UploadedStatusc                sF   | dd | _g }| jd k	r,|d| j  tt| jdd|d d S )Nr)   zProject is at %sTzUpload successful.)successr,   logs)r   r)   appendsuperrV   r   )r   r3   rX   )	__class__r   r   r      s
    
z_UploadedStatus.__init__)rS   rT   rU   r   __classcell__r   r   )r[   r   rV      s   rV   c       
   
   C   s   | j r
tt||||d}y||  ||}t|S  tk
rb }	 ztdddgdS d }	~	X Y n2 tk
r }	 ztddt	|	gdS d }	~	X Y nX d S )N)r	   r   r
   r   Fz0Please log in with the "anaconda login" command.zNot logged in.)rW   r,   errorszUpload failed.)
Zproblemsr   r   rR   Zpublication_inforV   r   r   r   str)
Zprojectr<   rE   r	   r   r
   r   Zclientr3   er   r   r   _upload   s    
r`   )NNNN)__doc__Z
__future__r   r   r   rB   r8   r;   rN   Zbinstar_client.utilsZutilsr   Zbinstar_client.requests_extZrequests_extrM   Zbinstar_client.errorsr   r   Z'anaconda_project.internal.simple_statusr   objectr   rV   r`   r   r   r   r   <module>   s   z