U
    &c                     @   s   d dl Z d dlZd dlmZ d dlmZmZmZmZ d dl	Z	d dl
m
Z
 dZG dd dZG dd	 d	ZG d
d dZG dd dZG dd dZG dd dZG dd dZdS )    N)
expanduser)DictListOptionalTuple)tqdmzhttps://huggingface.coc                   @   s$   e Zd ZdZeeeedddZdS )S3ObjzN
    Data structure that represents a file belonging to the current user.
    filenameLastModifiedETagSizec                 K   s   || _ || _|| _|| _d S Nr	   )selfr
   r   r   r   kwargs r   7/tmp/pip-unpacked-wheel-ymerj3tt/transformers/hf_api.py__init__"   s    zS3Obj.__init__N__name__
__module____qualname____doc__strintr   r   r   r   r   r      s   r   c                   @   s   e Zd ZeeedddZdS )PresignedUrlwriteaccesstypec                 K   s   || _ || _|| _d S r   r   )r   r   r   r   r   r   r   r   r   *   s    zPresignedUrl.__init__N)r   r   r   r   r   r   r   r   r   r   )   s   r   c                   @   s&   e Zd ZdZeeeeedddZdS )S3ObjectzL
    Data structure that represents a public file accessible on our S3.
    keyetaglastModifiedsize	rfilenamec                 K   s"   || _ || _|| _|| _|| _d S r   r!   )r   r"   r#   r$   r%   r&   r   r   r   r   r   5   s
    	zS3Object.__init__Nr   r   r   r   r   r    0   s   r    c                   @   sB   e Zd ZdZddg g feeee ee ee ee dddZ	dS )	ModelInfoz;
    Info about a public model accessible from our S3.
    NmodelIdr"   author	downloadstagssiblingsc                 K   s2   || _ || _|| _|| _|| _dd |D | _d S )Nc                 S   s   g | ]}t f |qS r   )r    .0xr   r   r   
<listcomp>Y   s     z&ModelInfo.__init__.<locals>.<listcomp>r(   )r   r)   r"   r*   r+   r,   r-   r   r   r   r   r   J   s    
zModelInfo.__init__)
r   r   r   r   r   r   r   r   r   r   r   r   r   r   r'   E   s   r'   c                   @   s   e Zd ZdddZeeedddZeeeee f ddd	Zeddd
dZ	deee
e edddZdeeee
e edddZdee
e ee dddZdeee
e dddZee dddZdS ) HfApiNc                 C   s   |d k	r|nt | _d S r   )ENDPOINTendpoint)r   r4   r   r   r   r   ]   s    zHfApi.__init__)usernamepasswordreturnc                 C   s8   d | j}tj|||dd}|  | }|d S )z
        Call HF API to sign in a user and get a token if credentials are valid.

        Outputs:
            token if credentials are valid

        Throws:
            requests.exceptions.HTTPError if credentials are invalid
        z{}/api/login)r5   r6   )jsontoken)formatr4   requestspostraise_for_statusr8   )r   r5   r6   pathrdr   r   r   login`   s
    
zHfApi.login)r9   r7   c                 C   sD   d | j}tj|dd |id}|  | }|d |d fS )z.
        Call HF API to know "whoami"
        z{}/api/whoamiauthorization	Bearer {}headersuserZorgsr:   r4   r;   getr=   r8   )r   r9   r>   r?   r@   r   r   r   whoamip   s
    zHfApi.whoamic                 C   s0   d | j}tj|dd |id}|  dS )z)
        Call HF API to log out.
        z{}/api/logoutrB   rC   rD   N)r:   r4   r;   r<   r=   )r   r9   r>   r?   r   r   r   logoutz   s    zHfApi.logout)r9   r
   organizationr7   c                 C   sF   d | j}tj|dd |i||dd}|  | }tf |S )zP
        Call HF API to get a presigned url to upload `filename` to S3.
        z{}/api/presignrB   rC   r
   rK   rE   r8   )r:   r4   r;   r<   r=   r8   r   )r   r9   r
   rK   r>   r?   r@   r   r   r   presign   s    zHfApi.presign)r9   r
   filepathrK   r7   c           
   	   C   sn   | j |||d}t|dH}t|}|jdkr2|nd}tj|j|d|jid}	|	  |	  W 5 Q R X |j
S )z
        Get a presigned url, then upload file to S3.

        Outputs:
            url: Read-only url for the stored file on S3.
        rL   rbr    zcontent-type)datarE   )rN   openTqdmProgressFileReader
total_sizer;   putr   r   r=   closer   )
r   r9   r
   rO   rK   urlsfpfrR   r?   r   r   r   presign_and_upload   s    zHfApi.presign_and_upload)r9   rK   r7   c                 C   sX   d | j}|dk	rd|ind}tj||dd |id}|  | }dd |D S )	z`
        Call HF API to list all stored files for user (or one of their organizations).
        z{}/api/listObjsNrK   rB   rC   )paramsrE   c                 S   s   g | ]}t f |qS r   )r   r.   r   r   r   r1      s     z#HfApi.list_objs.<locals>.<listcomp>rG   )r   r9   rK   r>   r\   r?   r@   r   r   r   	list_objs   s    zHfApi.list_objs)r9   r
   rK   c                 C   s8   d | j}tj|dd |i||dd}|  dS )z=
        Call HF API to delete a file stored by user
        z{}/api/deleteObjrB   rC   rL   rM   N)r:   r4   r;   deleter=   )r   r9   r
   rK   r>   r?   r   r   r   
delete_obj   s    zHfApi.delete_obj)r7   c                 C   s4   d | j}t|}|  | }dd |D S )zf
        Get the public list of all the models on huggingface, including the community models
        z{}/api/modelsc                 S   s   g | ]}t f |qS r   )r'   r.   r   r   r   r1      s     z$HfApi.model_list.<locals>.<listcomp>rG   )r   r>   r?   r@   r   r   r   
model_list   s
    
zHfApi.model_list)N)N)N)N)N)r   r   r   r   r   rA   r   r   rI   rJ   r   r   rN   r[   r   r]   r_   r'   r`   r   r   r   r   r2   \   s   

r2   c                   @   s2   e Zd ZdZejdddZdddZdd	 Zd
S )rT   u   
    Wrap an io.BufferedReader `f` (such as the output of `open(…, "rb")`)
    and override `f.read()` so as to display a tqdm progress bar.

    see github.com/huggingface/transformers/pull/2078#discussion_r354739608
    for implementation details.
    )rY   c                 C   s<   || _ t| j| _t| jdd| _|j| _| j	|_d S )NF)totalZleave)
rY   osfstatfilenost_sizerU   r   pbarread_read)r   rY   r   r   r   r      s
    zTqdmProgressFileReader.__init__c                 C   s   | j | | |S r   )rf   updaterg   )r   nr   r   r   rh      s    zTqdmProgressFileReader._readc                 C   s   | j   d S r   )rf   rW   )r   r   r   r   rW      s    zTqdmProgressFileReader.closeN)ri   )	r   r   r   r   ioBufferedReaderr   rh   rW   r   r   r   r   rT      s   
rT   c                   @   s8   e Zd ZedZedd Zedd Zedd ZdS )	HfFolderz~/.huggingface/tokenc              	   C   s>   t jt j| jdd t| jd}|| W 5 Q R X dS )z8
        Save token, creating folder as needed.
        T)exist_okzw+N)rb   makedirsr>   dirname
path_tokenrS   r   )clsr9   rY   r   r   r   
save_token   s    zHfFolder.save_tokenc              
   C   sH   z.t | jd}| W  5 Q R  W S Q R X W n tk
rB   Y nX dS )z4
        Get token or None if not existent.
        r?   N)rS   rr   rg   FileNotFoundError)rs   rY   r   r   r   	get_token   s
     zHfFolder.get_tokenc                 C   s*   zt | j W n tk
r$   Y nX dS )zL
        Delete token.
        Do not fail if token does not exist.
        N)rb   removerr   ru   )rs   r   r   r   delete_token   s    zHfFolder.delete_tokenN)	r   r   r   r   rr   classmethodrt   rv   rx   r   r   r   r   rn      s   


rn   )rl   rb   os.pathr   typingr   r   r   r   r;   r   r3   r   r   r    r'   r2   rT   rn   r   r   r   r   <module>   s   l