
    wi                     h   d dl mZ d dlmZ d dlmZmZ d dlZddlm	Z	 ddlm
Z
mZmZ  G d	 d
ee          Z ed           G d d                      Z ed           G d d                      Z	 d"dej        dee         dee         fdZdeeef         dee         fdZededeeef         defd            Zedddddedededee         deeef         dee         deeeef                  defd            Ze	 d"d edeeef         deeeef                  defd!            ZdS )#    )	dataclass)Enum)DictOptionalN   )	constants   )get_sessionhf_raise_for_statusvalidate_hf_hub_argsc                       e Zd ZdZdZdS )XetTokenTypereadwriteN)__name__
__module____qualname__READWRITE     r/var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/huggingface_hub/utils/_xet.pyr   r      s        DEEEr   r   T)frozenc                   $    e Zd ZU eed<   eed<   dS )XetFileData	file_hashrefresh_routeN)r   r   r   str__annotations__r   r   r   r   r      s'         NNNr   r   c                   .    e Zd ZU eed<   eed<   eed<   dS )XetConnectionInfoaccess_tokenexpiration_unix_epochendpointN)r   r   r   r   r   intr   r   r   r!   r!      s1         MMMMMr   r!   responser$   returnc                    | dS 	 | j         t          j                 }t          j        | j        v r| j        t          j                 d         }n| j         t          j                 }n# t          $ r Y dS w xY w||nt          j        }|                    t          j	                  rF|
                    t          j	                            d          |                    d                    }t          ||          S )aa  
    Parse XET file metadata from an HTTP response.

    This function extracts XET file metadata from the HTTP headers or HTTP links
    of a given response object. If the required metadata is not found, it returns `None`.

    Args:
        response (`requests.Response`):
            The HTTP response object containing headers dict and links dict to extract the XET metadata from.
    Returns:
        `Optional[XetFileData]`:
            An instance of `XetFileData` containing the file hash and refresh route if the metadata
            is found. Returns `None` if the required metadata is missing.
    Nurl/)r   r   )headersr   HUGGINGFACE_HEADER_X_XET_HASH$HUGGINGFACE_HEADER_LINK_XET_AUTH_KEYlinks&HUGGINGFACE_HEADER_X_XET_REFRESH_ROUTEKeyErrorENDPOINT
startswithHUGGINGFACE_CO_URL_HOMEreplacerstripr   )r&   r$   r   r   s       r   !parse_xet_file_data_from_responser6      s    " t$Y%LM	9X^KK$N9+YZ[`aMM$,Y-]^M   tt#/xxY5GH	 ABB s%--i.O.V.VWZ.[.[]e]l]lmp]q]qrr#   s   AA& &
A43A4r+   c                     	 | t           j                 }| t           j                 }t          | t           j                           }n# t
          t          t          f$ r Y dS w xY wt          |||          S )a  
    Parse XET connection info from the HTTP headers or return None if not found.
    Args:
        headers (`Dict`):
           HTTP headers to extract the XET metadata from.
    Returns:
        `XetConnectionInfo` or `None`:
            The information needed to connect to the XET storage service.
            Returns `None` if the headers do not contain the XET connection info.
    N)r$   r"   r#   )	r   !HUGGINGFACE_HEADER_X_XET_ENDPOINT%HUGGINGFACE_HEADER_X_XET_ACCESS_TOKENr%   #HUGGINGFACE_HEADER_X_XET_EXPIRATIONr0   
ValueError	TypeErrorr!   )r+   r$   r"   r#   s       r   &parse_xet_connection_info_from_headersr=   B   s    9FGyNO #GI,Y$Z [ [j),   tt !3   s   AA A! A!	file_datac                 X    | j         t          d          t          | j         |          S )a  
    Utilizes the information in the parsed metadata to request the Hub xet connection information.
    This includes the access token, expiration, and XET service URL.
    Args:
        file_data: (`XetFileData`):
            The file data needed to refresh the xet connection information.
        headers (`Dict[str, str]`):
            Headers to use for the request, including authorization headers and user agent.
    Returns:
        `XetConnectionInfo`:
            The connection information needed to make the request to the xet storage service.
    Raises:
        [`~utils.HfHubHTTPError`]
            If the Hub API returned an error.
        [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
            If the Hub API response is improperly formatted.
    Nz>The provided xet metadata does not contain a refresh endpoint.)r   r;   #_fetch_xet_connection_info_with_url)r>   r+   s     r   refresh_xet_connection_inforA   [   s/    . &YZZZ.y/FPPPr   )revisionr$   params
token_typerepo_id	repo_typerB   rC   c           	      n    ||nt           j        }| d| d| d| j         d| 	}t          |||          S )a  
    Uses the repo info to request a xet access token from Hub.
    Args:
        token_type (`XetTokenType`):
            Type of the token to request: `"read"` or `"write"`.
        repo_id (`str`):
            A namespace (user or an organization) and a repo name separated by a `/`.
        repo_type (`str`):
            Type of the repo to upload to: `"model"`, `"dataset"` or `"space"`.
        revision (`str`, `optional`):
            The revision of the repo to get the token for.
        headers (`Dict[str, str]`):
            Headers to use for the request, including authorization headers and user agent.
        endpoint (`str`, `optional`):
            The endpoint to use for the request. Defaults to the Hub endpoint.
        params (`Dict[str, str]`, `optional`):
            Additional parameters to pass with the request.
    Returns:
        `XetConnectionInfo`:
            The connection information needed to make the request to the xet storage service.
    Raises:
        [`~utils.HfHubHTTPError`]
            If the Hub API returned an error.
        [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
            If the Hub API response is improperly formatted.
    Nz/api/zs/z/xet-z-token/)r   r1   valuer@   )rD   rE   rF   rB   r+   r$   rC   r)   s           r   (fetch_xet_connection_info_from_repo_inforI   w   sW    J $/xxY5GH
Z
ZI
Z
Z
Z
Zz7G
Z
ZPX
Z
ZC.sGVDDDr   r)   c                     t                                          || |          }t          |           t          |j                  }|t          d          |S )aS  
    Requests the xet connection info from the supplied URL. This includes the
    access token, expiration time, and endpoint to use for the xet storage service.
    Args:
        url: (`str`):
            The access token endpoint URL.
        headers (`Dict[str, str]`):
            Headers to use for the request, including authorization headers and user agent.
        params (`Dict[str, str]`, `optional`):
            Additional parameters to pass with the request.
    Returns:
        `XetConnectionInfo`:
            The connection information needed to make the request to the xet storage service.
    Raises:
        [`~utils.HfHubHTTPError`]
            If the Hub API returned an error.
        [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
            If the Hub API response is improperly formatted.
    )r+   r)   rC   Nz6Xet headers have not been correctly set by the server.)r
   getr   r=   r+   r;   )r)   r+   rC   respmetadatas        r   r@   r@      sY    2 ==W#fEED5dlCCHQRRROr   )N)dataclassesr   enumr   typingr   r   requests r   r
   r   r   r   r   r   r!   Responser6   r=   rA   rI   r@   r   r   r   <module>rT      s   ! ! ! ! ! !       ! ! ! ! ! ! ! !        D D D D D D D D D D    3   
 $       
 $        <@" ""+3C="k" " " "JDcN xPaGb    2 QQ #s(^Q 	Q Q Q Q6  #"'+&E &E &E&E &E 	&E
 sm&E #s(^&E sm&E T#s(^$&E &E &E &E &ER  (, 	#s(^ T#s(^$ 	     r   