o
    -wiY+                     @  s  d Z ddl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Zddl	m
Z
 ddlmZmZmZ ddlmZ ddlZddlmZmZ ddlZddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZm Z m!Z! erpddl"m#Z# dZ$dZ%dZ&dZ'dZ(e$e%e&e'gZ)ej*ddG dd dZ+G dd de,Z-ed Z.e
ej/dddZ0dEddZ1dFd!d"Z2dGdHd&d'Z3				(	(	(	dIdJd5d6Z4dKd8d9Z5dLd=d>Z6	dGdMd@dAZ7dGdNdCdDZ8dS )Ozapikey util.    )annotationsN)partial)TYPE_CHECKINGCallableLiteral)urlparse)NETRC_FILESget_netrc_auth)InternalApi)term)url_registry)wandb_setup)_is_databricksisattyprompt_choices)Settingsz*Private W&B dashboard, no account requiredzCreate a W&B accountzUse an existing W&B accountzDon't visualize my resultsUnconfiguredT)frozenc                   @  s&   e Zd ZU ded< ded< ded< dS )_NetrcPermissionsboolexistsread_accesswrite_accessN)__name__
__module____qualname____annotations__ r   r   Q/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/wandb/sdk/lib/apikey.pyr   +   s   
 r   c                   @  s   e Zd ZdZdS )WriteNetrcErrorz.Raised when we cannot write to the netrc file.N)r   r   r   __doc__r   r   r   r   r   2   s    r   )allowmustneverfalsetrue)
hide_inputerrdefaultMode | Nonereturnc                 C  s   | pd}ddd}| ||S )Nr#   r!   )r%   r$   )get)r(   	anon_modemappingr   r   r   _fixup_anon_mode<   s   
r.   strc                  C  s   t jd} | rt j| S tD ]} t jd}t jt j|| r,t j||   S qt	 dkr5dnd} t jt jd| S )z"Return the path to the netrc file.NETRC~Windowsz.netrc_netrc)
osenvironr+   path
expanduserr   r   joinplatformsystem)
netrc_filehome_dirr   r   r   get_netrc_file_pathD   s   r=   app_urlreferrer
str | Nonec                 C  s"   d}|r	d| }d|  d| S )a  Generate a prompt string for API key authorization.

    Creates a URL string that directs users to the authorization page where they
    can find their API key.

    Args:
        app_url: The base URL of the W&B application.
        referrer: Optional referrer parameter to include in the URL.

    Returns:
        A formatted string with instructions and the authorization URL.
     z?ref=z0You can find your API key in your browser here: z
/authorizer   )r>   r?   refr   r   r   _api_key_prompt_strW   s   
rC   Fsettingsr   apiInternalApi | Noneinput_callbackCallable | Nonebrowser_callback
no_offliner   	no_createlocalstr | bool | Nonec                 C  sl  |pt }tj}|pt| }t| j}	| jpd}
|j}dd tD }|	dkr*|	t
 |
r/| jr1|r6|	t |
r;| jr=|rB|	t |
rXdtjv rXtj}tj|}|durX|S |	dkr_t
}n*|
skttjrnttjrnt rqt}n|rvt}nt|dkr|d	 }nt|| j|
d
}d}|
r| dn| d}|t
kr| }n|tkr|r|ddnd}|s|rd| nd}td| d|  || }nc|tkr|r| nd}|s| js|s|}dD ]}| |r|t|d }qtd| dt!"d d tt#|| || }n|tkrdS |tkr dS |
r)|r)| nd\}}|s4t$d|S )zPrompt for api key.

    Returns:
        str - if key is configured
        None - if dryrun is selected
        False - if unconfigured (notty)
    Fc                 S  s   g | ]}|qS r   r   ).0choicer   r   r   
<listcomp>   s    z"prompt_api_key.<locals>.<listcomp>r#   zgoogle.colabNr"      r   )input_timeoutjupyterz2: Paste an API key from your profile and hit enterzK: Paste an API key from your profile and hit enter, or press ctrl+c to quitT)signupz&ref=rA   zCreate an account here: z/authorize?signup=true)zhttp://zhttps://zLogging into z-. (Learn how to deploy a W&B server locally: zwandb-server))NFNo API key specified.)%getpassr   
LOG_STRINGr
   r.   	anonymous_jupyterr>   LOGIN_CHOICESremoveLOGIN_CHOICE_ANONlogin_timeoutLOGIN_CHOICE_DRYRUNLOGIN_CHOICE_NEWsysmodulesLOG_STRING_NOCOLORwandbrS   attempt_colab_loginr   stdoutstdinr   LOGIN_CHOICE_NOTTYLOGIN_CHOICE_EXISTSlenr   create_anonymous_api_keytermlogstripis_local
startswithr   urlrC   
ValueError)rD   rE   rG   rI   rJ   rK   rL   r?   
log_stringr,   rS   r>   choiceskeyresultapi_askrB   hostprefixrY   r   r   r   prompt_api_keyj   s   










ry   
netrc_pathc              
   C  s   d}d}d}zt | }d}t|jtj@ }t|jtj@ }W n) ty,   d}d}Y n tyH } zt	d|  d|  W Y d}~nd}~ww t
|||dS )z1Check if we can read and write to the netrc file.FTzUnable to read permissions for z, N)r   r   r   )r4   statr   st_modeS_IWUSRS_IRUSRFileNotFoundErrorOSErrorrd   	termerrorr   )rz   file_existsr   r   ster   r   r   check_netrc_access   s(   
"r   rw   entityrt   c              
   C  s  d|v r
| ddnd|f\}}t|dkr#td| dt| dt| j}t }t|}|jr5|js=t	d| d	d
| }d}	zt
|}
|
   d}	W d   n1 s]w   Y  W n! tyq   td Y n ty } zt	d| |d}~ww z^t
|dD}
|	rd}|	D ]}|d
ks||v rd}q|r|d8 }q|
| d qtd| d|  |
tdj|||d W d   n1 sw   Y  t|tjtjB  W dS  ty } zt	d| |d}~ww )zAdd our host and key to .netrc.-rQ   rA   (   z,API-key must be exactly 40 characters long: z (z chars)Cannot access z. In order to persist your API key, grant read and write permissions for your user to the file or specify a different file with the environment variable "NETRC=<new_netrc_path>".zmachine N
z"No netrc file found, creating one.zUnable to read wr      zAppending key for z to your netrc file: z                    machine {host}
                      login {entity}
                      password {key}
                    )rw   r   rt   zUnable to write )splitrj   rq   r   netlocr=   r   r   r   r   openreadrm   r   rd   rl   r   writetextwrapdedentformatr4   chmodr{   r~   r}   )rw   r   rt   _
key_suffixnormalized_hostrz   netrc_accessmachine_line
orig_linesfr   skipliner   r   r   write_netrc   sf    




r   Nonec                 C  sf   |st d|p
t }d|v r|ddnd|f\}}t|dkr*t dt| t| jd| d S )NrV   r   rQ   rA   r   z.API key must be 40 characters long, yours was user)rq   r
   r   rj   r   base_url)rD   rt   rE   r   suffixr   r   r   	write_key)  s   
 r   Settings | Nonec                 C  sl   | d u r	t  j} | jr| jS tt }|jr&|js&t	dt  d d S |jr4t
| j}|r4|d S d S )Nr   .)r   	singletonrD   api_keyr   r=   r   r   rd   termwarnr	   r   )rD   r   authr   r   r   r   >  s   


r   )r(   r)   r*   r)   )r*   r/   )N)r>   r/   r?   r@   r*   r/   )NNNFFFN)rD   r   rE   rF   rG   rH   rI   rH   rJ   r   rK   r   rL   r   r?   r@   r*   rM   )rz   r/   r*   r   )rw   r/   r   r/   rt   r/   )rD   r   rt   r@   rE   rF   r*   r   )rD   r   r*   r@   )9r    
__future__r   dataclassesr4   r9   r{   ra   r   	functoolsr   typingr   r   r   urllib.parser   clickrequests.utilsr   r	   rd   
wandb.apisr
   wandb.errorsr   wandb.errors.linksr   	wandb.sdkr   
wandb.utilr   r   r   wandb.sdk.wandb_settingsr   r]   r`   ri   r_   rh   r[   	dataclassr   	Exceptionr   ModepromptrW   r.   r=   rC   ry   r   r   r   r   r   r   r   r   <module>   sh    



h
@