U
    &c#                     @   s   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	 d dl
mZ d dlmZmZ dZG d	d
 d
eZG dd dZG dd d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G dd deZdS )    N)ArgumentParser)getpass)ListUnion)	HTTPError)BaseTransformersCLICommand)HfApiHfFolder   c                   @   s   e Zd ZeedddZdS )UserCommands)parserc           	      C   s,  | j ddd}|jdd d | j ddd}|jd	d d | j d
dd}|jdd d | j ddd}|jdd}| d}|jdtdd |jdd d | d}|jdtdd |jdtdd |jdd d | j ddd}|jdtdd |jdtdd |jdtd dd |jd d d d S )!Nloginz6Log in using the same credentials as on huggingface.co)helpc                 S   s   t | S N)LoginCommandargs r   >/tmp/pip-unpacked-wheel-ymerj3tt/transformers/commands/user.py<lambda>       z2UserCommands.register_subcommand.<locals>.<lambda>)funcwhoamiz;Find out which huggingface.co account you are logged in as.c                 S   s   t | S r   )WhoamiCommandr   r   r   r   r      r   logoutzLog outc                 S   s   t | S r   )LogoutCommandr   r   r   r   r      r   Zs3z>{ls, rm} Commands to interact with the files you upload on S3.zs3 related commandsZlsz--organizationz!Optional: organization namespace.)typer   c                 S   s   t | S r   )ListObjsCommandr   r   r   r   r      r   Zrmfilenamez-individual object filename to delete from S3.c                 S   s   t | S r   )DeleteObjCommandr   r   r   r   r   "   r   uploadzUpload a model to S3.pathz<Local path of the model folder or individual file to upload.z
--filenamez4Optional: override individual object filename on S3.)r   defaultr   c                 S   s   t | S r   )UploadCommandr   r   r   r   r   ,   r   )
add_parserset_defaultsadd_subparsersadd_argumentstr)	r   Zlogin_parserZwhoami_parserZlogout_parserZ	s3_parserZs3_subparsersZ	ls_parserZ	rm_parserZupload_parserr   r   r   register_subcommand   s:    

     z UserCommands.register_subcommandN)__name__
__module____qualname__staticmethodr   r)   r   r   r   r   r      s   r   c                   @   s4   e Zd ZdZdZdZdZedd Zedd Z	d	S )
ANSIz;
    Helper for en.wikipedia.org/wiki/ANSI_escape_code
    z[1mz[31mz[0mc                 C   s   d | j|| jS Nz{}{}{})format_bold_resetclssr   r   r   bold8   s    z	ANSI.boldc                 C   s   d | j| j || jS r/   )r0   r1   _redr2   r3   r   r   r   red<   s    zANSI.redN)
r*   r+   r,   __doc__r1   r7   r2   classmethodr6   r8   r   r   r   r   r.   /   s   
r.   c                   @   s   e Zd Zdd ZdS )BaseUserCommandc                 C   s   || _ t | _d S r   )r   r   _api)selfr   r   r   r   __init__B   s    zBaseUserCommand.__init__N)r*   r+   r,   r>   r   r   r   r   r;   A   s   r;   c                   @   s   e Zd Zdd ZdS )r   c              
   C   s   t d td}t }z| j||}W nD tk
rl } z&t | t t|jj	 t
d W 5 d }~X Y nX t| t d t d|d t dtj d S )NaY  
        _|    _|  _|    _|    _|_|_|    _|_|_|  _|_|_|  _|      _|    _|_|_|      _|_|_|_|    _|_|      _|_|_|  _|_|_|_|
        _|    _|  _|    _|  _|        _|          _|    _|_|    _|  _|            _|        _|    _|  _|        _|
        _|_|_|_|  _|    _|  _|  _|_|  _|  _|_|    _|    _|  _|  _|  _|  _|_|      _|_|_|    _|_|_|_|  _|        _|_|_|
        _|    _|  _|    _|  _|    _|  _|    _|    _|    _|    _|_|  _|    _|      _|        _|    _|  _|        _|
        _|    _|    _|_|      _|_|_|    _|_|_|  _|_|_|  _|      _|    _|_|_|      _|        _|    _|    _|_|_|  _|_|_|_|

        z
Username:    zLogin successfulzYour token:
zYour token has been saved to)printinputr   r<   r   r   r.   r8   responsetextexitr	   Z
save_tokenZ
path_token)r=   usernamepasswordtokener   r   r   runH   s    

zLoginCommand.runNr*   r+   r,   rJ   r   r   r   r   r   G   s   r   c                   @   s   e Zd Zdd ZdS )r   c              
   C   s   t  }|d krtd t  z6| j|\}}t| |rRttdd| W nD t	k
r } z&t| tt
|jj td W 5 d }~X Y nX d S )NNot logged inzorgs: ,r?   )r	   	get_tokenrA   rE   r<   r   r.   r6   joinr   r8   rC   rD   )r=   rH   userZorgsrI   r   r   r   rJ   c   s    zWhoamiCommand.runNrK   r   r   r   r   r   b   s   r   c                   @   s   e Zd Zdd ZdS )r   c                 C   s>   t  }|d krtd t  t   | j| td d S )NrL   zSuccessfully logged out.)r	   rN   rA   rE   Zdelete_tokenr<   r   )r=   rH   r   r   r   rJ   t   s    zLogoutCommand.runNrK   r   r   r   r   r   s   s   r   c                   @   s:   e Zd Zeeeeef   ee edddZdd ZdS )r   )rowsheadersreturnc                 C   s|   dd t ||f D }dt| j| }g }||j|  ||jdd |D   |D ]}||j|  q\d|S )z
        Inspired by:
        stackoverflow.com/a/8356620/593036
        stackoverflow.com/questions/9535954/printing-lists-as-tabular-data
        c                 S   s   g | ]}t d d |D qS )c                 s   s   | ]}t t|V  qd S r   )lenr(   ).0xr   r   r   	<genexpr>   s     z6ListObjsCommand.tabulate.<locals>.<listcomp>.<genexpr>)max)rU   colr   r   r   
<listcomp>   s     z,ListObjsCommand.tabulate.<locals>.<listcomp>z{{:{}}} c                 S   s   g | ]}d | qS )-r   )rU   wr   r   r   rZ      s     r@   )ziprT   r0   appendrO   )r=   rQ   rR   Z
col_widthsZ
row_formatlinesrowr   r   r   tabulate   s    zListObjsCommand.tabulatec              
   C   s   t  }|d kr td td z| jj|| jjd}W nD tk
r| } z&t| tt	
|jj td W 5 d }~X Y nX t|dkrtd t  dd |D }t| j|dd	d
dgd d S )NrL   r?   )organizationr   zNo shared file yetc                 S   s    g | ]}|j |j|j|jgqS r   )r   LastModifiedETagSize)rU   objr   r   r   rZ      s     z'ListObjsCommand.run.<locals>.<listcomp>ZFilenamerc   rd   re   )rR   )r	   rN   rA   rE   r<   Z	list_objsr   rb   r   r.   r8   rC   rD   rT   ra   )r=   rH   objsrI   rQ   r   r   r   rJ      s    zListObjsCommand.runN)	r*   r+   r,   r   r   r(   intra   rJ   r   r   r   r   r   ~   s   &r   c                   @   s   e Zd Zdd ZdS )r   c              
   C   s   t  }|d kr td td z| jj|| jj| jjd W nD t	k
r } z&t| tt
|jj td W 5 d }~X Y nX td d S )NrL   r?   )r   rb   Done)r	   rN   rA   rE   r<   Z
delete_objr   r   rb   r   r.   r8   rC   rD   )r=   rH   rI   r   r   r   rJ      s    zDeleteObjCommand.runNrK   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd Zdd ZdS )r#   c                 C   sB   t t|}dd |D }|D ]}| r || |j7 }q |S )z9
        Recursively list all files in a folder.
        c                 S   s.   g | ]&}|  rtjt |j|jfqS r   )is_fileosr!   rO   getcwd)rU   fr   r   r   rZ      s      z*UploadCommand.walk_dir.<locals>.<listcomp>)listrk   scandiris_dirwalk_dirr!   )r=   rel_pathentriesfilesrm   r   r   r   rq      s    zUploadCommand.walk_dirc                 C   s  t  }|d kr td td tj| jj}tj|rh| jj	d k	rPt
dtj|}| |}nFtj|r| jj	d k	r| jj	n
tj|}||fg}nt
d|tjdkrdd |D }t|tkrtdtt| td | j|\}}| jjd k	r| jjn|}|D ].\}	}td	t|	t|t| q td
 }
|
dks|
dks|
dkstd t  ttd |D ]~\}	}z| jj|||	| jjd}W nF tk
r } z&t| tt|jj td W 5 d }~X Y nX td t| qd S )NrL   r?   z;Cannot specify a filename override when uploading a folder.z!Not a valid file or directory: {}win32c                 S   s"   g | ]\}}|| tjd fqS )/)replacerk   sep)rU   filepathr   r   r   r   rZ      s     z%UploadCommand.run.<locals>.<listcomp>z]About to upload {} files to S3. This is probably wrong. Please filter files before uploading.z@About to upload file {} to S3 under filename {} and namespace {}zProceed? [Y/n]  yyesZAbortz7Uploading... This might take a while if files are large)rH   r   ry   rb   zYour file now lives at:)r	   rN   rA   rE   rk   r!   abspathr   isdirr   
ValueErrorbasenamerq   isfiler0   sysplatformrT   UPLOAD_MAX_FILESr.   r6   r<   r   rb   rB   lowerZpresign_and_uploadr   r8   rC   rD   )r=   rH   
local_pathrr   rt   r   rP   _	namespacery   choiceZ
access_urlrI   r   r   r   rJ      sh     
     
zUploadCommand.runN)r*   r+   r,   rq   rJ   r   r   r   r   r#      s   r#   )rk   r   argparser   r   typingr   r   Zrequests.exceptionsr   Ztransformers.commandsr   Ztransformers.hf_apir   r	   r   r   r.   r;   r   r   r   r   r   r#   r   r   r   r   <module>   s"   "