
    5pjk/                       % S r SSKJr  SSKrSSKrSSKJrJr  SSKJ	r	  SSK
Jr  SSKJrJrJrJrJrJrJrJrJrJr  SS	KJrJr  S
rSrSr\\\4rS\S'   SS jr\" SS9 " S S5      5       r Sq!S\S'   SS jr"SS jr#/ SQr$g)ay  Runtime configuration for the ModelScope Hub SDK.

Configuration values follow a clear precedence chain:

1. Explicit constructor argument
2. Process environment variable
3. Persisted file on disk (token only)
4. Sensible default

This separation keeps the SDK trivially testable: tests can supply a
:class:`HubConfig` instance with overrides and never touch real credentials.
    )annotationsN)	dataclassfield)Path)Any   )
CONFIG_DIR_NAMECOOKIES_FILE_NAMECREDENTIALS_DIR_NAMEDEFAULT_CACHE_DIR_NAMEDEFAULT_ENDPOINT	ENV_CACHEENV_MODELSCOPE_DOMAINGIT_TOKEN_FILE_NAMESESSION_FILE_NAMEUSER_INFO_FILE_NAME)
CacheErrorInvalidParameterMODELSCOPE_ENDPOINTMODELSCOPE_API_TOKENMODELSCOPE_HOMEztuple[str, ...]_CREDENTIAL_FILE_NAMESc                P    [        U 5      R                  5       R                  5       $ N)r   
expanduserresolve)paths    Q/var/www/html/pdf-tiff/venv/lib/python3.13/site-packages/modelscope_hub/config.py_expandr   2   s    :  "**,,    T)slotsc                  J   \ rS rSr% SrSrS\S'   \" S S9rS\S	'   \" S
 S9r	S\S'   Sr
S\S'   \" SSSS9rS\S'   \" SSSS9rS\S'   \" SSSS9rS\S'   S!S jr\S"S j5       r\S#S j5       rS!S jrS$S jrS%S jrS!S jrS&S jrS'S jrS(S jrS)S jrS%S jrS*S jrS rg)+	HubConfig6   zCentralised runtime configuration object.

The dataclass form makes it cheap to copy/override in tests via
:func:`dataclasses.replace`, and keeps fields explicit and discoverable.
N
str | Noneendpointc                     [        [        R                  R                  [        5      =(       d    [
        R                  " 5       S-  [        -  5      $ )Nz.cache)r   osenvirongetr   r   homer    r    r   <lambda>HubConfig.<lambda>@   s-    

y(A(tTYY[S[E[^tEt ur    )default_factoryr   	cache_dirc                     [        [        R                  R                  [        5      =(       d    [
        R                  " 5       [        -  5      $ r   )r   r(   r)   r*   ENV_HOMEr   r+   r	   r,   r    r   r-   r.   B   s+    WRZZ^^H=U=vY]YbYbYdgvYv5wr    
config_dirtokenF)defaultinitreprbool_logged_out_endpoint_overridden_token_overriddenc                $   U R                   b  SU l        O[        R                  R	                  [
        5      (       a0  [        R                  R	                  [
        5      U l         SU l        O[        R                  R	                  [        S5      R                  5       nU(       aY  [        R                  " S[        SS9  UR                  S5      (       d  UR                  S5      (       d  SU 3nXl         SU l        O[        U l         U R                  U R                   5      U l         U R                  b  SU l        g [         [        R                  ;   a$  [        R                  [            U l        SU l        g U R#                  5       U l        g )NT zVEnvironment variable MODELSCOPE_DOMAIN is deprecated, use MODELSCOPE_ENDPOINT instead.   )
stacklevelhttp://https://)r&   r:   r(   r)   r*   ENV_ENDPOINTr   stripwarningswarnFutureWarning
startswithr   normalize_endpointr4   r;   	ENV_TOKEN
load_token)selfdomains     r   __post_init__HubConfig.__post_init__K   s   ==$(,D%ZZ^^L))JJNN<8DM(,D%ZZ^^$92>DDFFl! 
 ((33F<M<Mj<Y<Y'x0F &,0) 0//>
 ::!%)D""**$I.DJ%)D"*DJr    c                    U =(       d    SR                  5       =(       d    [        nUR                  5       R                  S5      (       d  SU 3nUR	                  S5      $ )a   Return *endpoint* with a scheme guaranteed and no trailing slash.

Bare domains such as ``modelscope.ai`` are common input, especially from
the CLI. Without a scheme every request built from them fails deep in
the transport layer instead of surfacing a usable error, so the
normalisation lives here and is reused by every entry point that
accepts an endpoint.

Scheme detection is case-insensitive because URI schemes are, so an
input like ``HTTPS://host`` is recognised instead of being prefixed a
second time.
r=   )r@   rA   rA   /)rC   r   lowerrG   rstrip)r&   values     r   rH   HubConfig.normalize_endpointm   sO     R&&(<,<{{}''(?@@ug&E||C  r    c                (    U R                   [        -  $ r   )r3   r   )rK   s    r   credentials_dirHubConfig.credentials_dir   s    !555r    c                     U R                   R                  SSS9  U R                  R                  SSS9  U R                  R                  SSS9  g! [         a  n[        SU 35      UeSnAff = f)z=Create the config and cache directories if they do not exist.T)parentsexist_okz"Failed to create SDK directories: N)r3   mkdirr0   rV   OSErrorr   )rK   excs     r   ensure_dirsHubConfig.ensure_dirs   sv    	ROO!!$!>NN   =  &&td&C 	RA#GHcQ	Rs   AA 
A/A**A/c                   U(       a  UR                  5       (       d  [        S5      eSSKnSSKJn  SSKJn  SSKJn  UR                  5       nU" U R                  =(       d    [        5      R                  =(       d    Sn[        UR                  5       5      S-   nU" 5       nUR                  U" S0 S	S_S
S_SU_SS_SS_SU_SS_SS_SS_SS_SS_SU_SS_SS_SS_S0 _SS_65        U R                  U5        Xl        SU l        g)zPersist token as ``m_session_id`` cookie in ``credentials/cookies``.

Creates a :class:`~requests.cookies.RequestsCookieJar` with a 30-day
expiry, matching the old SDK convention where the API token lives
exclusively inside the pickled cookie jar.
z token must be a non-empty stringr   N)Cookie)urlparse)RequestsCookieJarzmodelscope.cni ' versionnamem_session_idrS   portport_specifiedFrL   domain_specifiedTdomain_initial_dotr   rP   path_specifiedsecureexpiresdiscardcommentcomment_urlrestrfc2109r,   )rC   r   timehttp.cookiejarra   urllib.parserb   requests.cookiesrc   r&   r   hostnameint
set_cookiesave_cookiesr4   r9   )	rK   r4   rs   ra   rb   rc   rL   rm   jars	            r   
save_tokenHubConfig.save_token   sG    EKKMM"#EFF))6$--;+;<EEXdiik"^3! #  	
  %  "& $)   $      !  !" #	
* 	#
 r    c                    U R                   (       a  gU R                  5       nU(       a'  U H!  nUR                  S:X  d  M  UR                  s  $    g)a  Load the API token from ``~/.modelscope/credentials/cookies``.

Reads the pickled cookie jar and extracts the ``m_session_id`` value.
Returns ``None`` if:
- no cookies file exists
- the ``m_session_id`` cookie has expired
- :meth:`clear_token` was called (explicit logout)
Nrf   )r9   load_cookiesre   rS   )rK   cookiescookies      r   rJ   HubConfig.load_token   sF     ##%!;;.0!<<' " r    c                    SU l         SU l        [         H   n U R                  U-  R	                  SS9  M"     g! [
         a     M2  f = f)zRemove every persisted credential artefact.

All login artefacts are dropped together. Removing only the session
cookie would leave the git token and the cached identity behind, a
half-logged-out state that later reads can still pick up.
NT)
missing_ok)r4   r9   r   rV   unlinkr\   )rK   re   s     r   clear_tokenHubConfig.clear_token   sR     
*D%%,444E +  s   :
AAc                   SSK nSSKnU R                  5         U R                  [        -  n[        US5       nUR                  X5        SSS5        UR                  UR                  UR                  -  5        g! , (       d  f       N7= f)z8Pickle cookies to ``~/.modelscope/credentials/cookies``.r   Nwb)
picklestatr^   rV   r
   opendumpchmodS_IRUSRS_IWUSR)rK   r   r   r   r   fs         r   rz   HubConfig.save_cookies   sd    ##&77$KK# 

4<<$,,./ s   A;;
B	c                |   SSK nU R                  [        -  nUR                  5       (       d  g [	        US5       nUR                  U5      nSSS5        W(       d  gU H,  nUR                  S:X  d  M  UR                  5       (       d  M,    g   U$ ! , (       d  f       NJ= f! [        UR                  4 a     gf = f)z8Load saved cookies, returning None if absent or expired.r   Nrbrf   )
r   rV   r
   is_filer   loadr\   UnpicklingErrorre   
is_expired)rK   r   r   r   r   r   s         r   r   HubConfig.load_cookies   s    ##&77||~~	dD!Q ++a. " F{{n,1B1B1D1D   "!//0 		s.   B" BB" 
BB" B" "B;:B;c                t    U R                  5         U R                  [        -  nUR                  U SU 3SS9  g)z>Save ``username:email`` to ``~/.modelscope/credentials/user``.:utf-8encodingN)r^   rV   r   
write_text)rK   usernameemailr   s       r   save_user_infoHubConfig.save_user_info  s:    ##&998*AeW-@r    c                    SSK nU R                  5         U R                  [        -  nUR	                  USS9  UR                  UR                  UR                  -  5        g)z:Save git token to ``~/.modelscope/credentials/git_token``.r   Nr   r   )r   r^   rV   r   r   r   r   r   )rK   	git_tokenr   r   s       r   save_git_tokenHubConfig.save_git_token
  sK    ##&99	G4

4<<$,,./r    c                    U R                   [        -  nUR                  5       (       a'   UR                  SS9R	                  5       =(       d    S$ g! [
         a     gf = f)z<Read git token from ``~/.modelscope/credentials/git_token``.r   r   N)rV   r   r   	read_textrC   r\   )rK   r   s     r   load_git_tokenHubConfig.load_git_token  s[    ##&99<<>>~~w~7==?G4G   s   %A 
AAc                R   SSK nU R                  [        -  nUR                  5       (       a0   UR	                  SS9R                  5       n[        U5      S:X  a  U$  UR                  5       R                  nU R                  5         UR                  USS9  U$ ! [         a     NHf = f)zReturn a stable SDK session UUID, auto-generating if absent.

The session ID is persisted to ``~/.modelscope/credentials/session``
and included in the User-Agent header for telemetry.
r   Nr   r       )uuidrV   r   r   r   rC   lenr\   uuid4hexr^   r   )rK   _uuidr   sids       r   get_session_idHubConfig.get_session_id  s     	##&77<<>>nngn6<<>s8r>J " kkmg.
  s   -B 
B&%B&)r:   r9   r;   r&   r4   )returnNone)r&   r%   r   str)r   r   )r4   r   r   r   )r   r%   )r   objectr   r   )r   r   )r   r   r   r   r   r   )r   r   r   r   )r   r   )__name__
__module____qualname____firstlineno____doc__r&   __annotations__r   r0   r3   r4   r9   r:   r;   rM   staticmethodrH   propertyrV   r^   r|   rJ   r   rz   r   r   r   r   r   __static_attributes__r,   r    r   r#   r#   6   s      HjuIt  -wxJxE:e%eDKD!&u5u!M$M#EEJtJ
 +D ! !* 6 6R,!\&$	0&A0r    r#   HubConfig | None_default_configc                 0    [         c
  [        5       q [         $ )zBReturn the lazily-instantiated process-wide default configuration.)r   r#   r,   r    r   get_default_configr   7  s     #+r    c                    U q g)z;Override (or clear) the process-wide default configuration.N)r   )configs    r   set_default_configr   ?  s	     Or    )r   rB   r2   rI   r#   r   r   )r   zstr | os.PathLike[str]r   r   )r   r#   )r   r   r   r   )%r   
__future__r   r(   rD   dataclassesr   r   pathlibr   typingr   	constantsr	   r
   r   r   r   r   r   r   r   r   errorsr   r   rB   rI   r2   r   r   r   r#   r   r   r   __all__r,   r    r   <module>r      s    # 	  (     1 %"	
 +  - y y yz %)! (r    