o
    wi>                     @  sl  U 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Zd dl	m
Z
 d dlmZ d dlZd dlZd dlZd dlmZmZmZ d dlmZmZmZ d dlmZ d dlZd dlZd dlmZ d d	lmZ e e!Z"d/ddZ#G dd dZ$da%de&d< d0ddZ'd1ddZ(eG dd deZ)dd  Z*d2d#d$Z+d%d& Z,d'd( Z-d)d* Z.G d+d, d,Z/d-d. Z0dS )3    )annotationsN)	b64encode)Any)Magicsline_cell_magicmagics_class)argumentmagic_argumentsparse_argstring)urljoin)wandb_setup)
filesystemrun	wandb.Runreturnboolc                 C  s   t sdS t |  dS )zDisplay a run's page if the cell has the %%wandb cell magic.

    Args:
        run: The run to display.

    Returns:
        Whether the %%wandb cell magic was present.
    FT)_current_cell_wandb_magicdisplay_if_allowed)r    r   A/home/ubuntu/.local/lib/python3.10/site-packages/wandb/jupyter.pydisplay_if_magic_is_used   s   	
r   c                   @  s$   e Zd ZdZdddZdd
dZdS )_WandbCellMagicStatez-State for a cell with the %%wandb cell magic.heightintr   Nonec                C  s   || _ d| _dS )zInitializes the %%wandb cell magic state.

        Args:
            height: The desired height for displayed iframes.
        FN)_height_already_displayed)selfr   r   r   r   __init__/   s   
z_WandbCellMagicState.__init__r   r   c                 C  s"   | j rdS d| _ t|| jd dS )ztDisplay a run's iframe if one is not already displayed.

        Args:
            run: The run to display.
        NTr   )r   _display_wandb_runr   )r   r   r   r   r   r   8   s   z'_WandbCellMagicState.display_if_allowedN)r   r   r   r   )r   r   r   r   )__name__
__module____qualname____doc__r   r   r   r   r   r   r   ,   s    
	r   z_WandbCellMagicState | Noner   pathstrr   r   r   c                C  sh   t  }z|| }tjj|j|ddd W dS  t jy3   t	  tjjd| ddd Y dS w )zDisplay a wandb object (usually in an iframe) given its URI.

    Args:
        path: A path to a run, sweep, project, report, etc.
        height: Height of the iframe in pixels.
    r   TrawzPath z/ does not refer to a W&B object you can access.N)
wandbApi	from_pathIPythondisplaydisplay_htmlto_htmlError	traceback	print_exc)r%   r   apiobjr   r   r   _display_by_wandb_pathH   s   


r5   c                C  s   t jj| j|ddd dS )zDisplay a run (usually in an iframe).

    Args:
        run: The run to display.
        height: Height of the iframe in pixels.
    r   Tr'   N)r,   r-   r.   r/   )r   r   r   r   r   r    `   s   

r    c                	      sT   e Zd Z fddZe edddddedd	d
eddeddddZ  Z	S )WandBMagicsc                   s   t  | d S N)superr   )r   shell	__class__r   r   r   o   s   zWandBMagics.__init__r%   N?z+The path to a resource you want to display.)defaultnargshelpz-hz--heighti  z#The height of the iframe in pixels.)r=   typer?   liner&   cell
str | Noner   r   c                 C  s   t | j|}|j}|j}|rt||d d}nt j }r't||d d}nd}|du r/dS |s6t	|da
zt | W da
dS da
w )a  Display wandb resources in Jupyter.

        This can be used as a line magic:

            %wandb USERNAME/PROJECT/runs/RUN_ID

        Or as a cell magic:

            %%wandb -h 1024
            with wandb.init() as run:
                run.log({"loss": 1})
        r   TFN)r
   r)   r%   r   r5   r   	singletonmost_recent_active_runr    r   r   r,   get_ipythonrun_cell)r   rA   rB   argsr%   r   	displayedr   r   r   r   r)   r   s"   
zWandBMagics.wandbr7   )rA   r&   rB   rC   r   r   )
r!   r"   r#   r   r	   r   r   r   r)   __classcell__r   r   r:   r   r6   m   s$    r6   c               
   C  s.  z(ddl m}  |  }|d ur'|jjjd}|r'tj||tj	|dW S W n
 t
y2   Y d S w t \}}|D ]V}|drEtdtjt|d dd	|d	d
id }|D ]4}t|tr|drd|v r|d d |kr|d|dt |d d |d d d    S q[q:|sd S d S )Nr   )rF   __vsc_ipynb_file__rootr%   namepasswordz%Can't query password protected kernelurlzapi/sessionstoken )paramskernelnotebookidroot_dirnotebook_dirr%   rN   )r,   rF   rT   r9   user_nsgetosr%   dirnamebasenameModuleNotFoundErrorjupyter_servers_and_kernel_id
ValueErrorrequestsr   json
isinstancedictgetcwd)rF   ipythonnotebook_pathservers	kernel_idsresnnr   r   r   4notebook_metadata_from_jupyter_servers_and_kernel_id   sN   





rm   silentdict[str, str]c                 C  s   d}z9t  }t }|dur|durd|d |d dW S tj r5t }|r5d|d d |d d dW S |r:|W S W n tyI   t| Y nw t	| i S )	zAttempt to query jupyter for the path and name of the notebook file.

    This can handle different jupyter environments, specifically:

    1. Colab
    2. Kaggle
    3. JupyterLab
    4. Notebooks
    5. Other?
    zFailed to detect the name of this notebook. You can set it manually with the WANDB_NOTEBOOK_NAME environment variable to enable code saving.Nz/contentr%   rN   rL   z/kaggle/workingmetadata)
rm   attempt_colab_load_ipynbr)   util
_is_kaggleattempt_kaggle_load_ipynb	Exceptionlogger	exception	termerror)rn   error_messagejupyter_metadataipynbr   r   r   notebook_metadata   s2   



r|   c               
   C  s   zBddl } td| j d}tjd}tjd}g }|dur,|	t
|  |dur>|	t
|  W ||fS W ||fS  tttfyR   g df Y S w )ziReturn a list of servers and the current kernel_id.

    Used to query for the name of the notebook.
    r   Nzkernel-(.*).json   zjupyter_server.serverappznotebook.notebookapp)	ipykernelresearchconnectget_connection_filegroupr)   rr   
get_moduleextendlistlist_running_serversAttributeErrorr`   ImportError)r~   ri   	serverappnotebookapprh   r   r   r   r_   
  s(   
r_   c                  C  s4   t jd} | r| jjddd}|r|d S d S d S )Nzgoogle.colab	get_ipynb   )timeout_secr{   )r)   rr   r   _messageblocking_request)colabresponser   r   r   rq   #  s   rq   c                  C  sj   t jd} | s
d S z|  }t| d }d|d d< W |S  ty4   t d t	
d Y d S w )Nkaggle_sessionsourcezkaggle.ipynbrp   rN   zUnable to load kaggle notebook.)r)   rr   r   UserSessionClientrb   loadsget_exportable_ipynbru   rx   rv   rw   )kaggleclientparsedr   r   r   rt   ,  s   

rt   c                   @  sD   e Zd ZdddZdd Zd	d
 ZdddZdddZdddZdS )Notebooksettingswandb.Settingsr   r   c                 C  s   i | _ || _t | _d S r7   )outputsr   r,   rF   r9   )r   r   r   r   r   r   ?  s   zNotebook.__init__c                 C  sv   | j |g | j |< |d }i }|D ]}|| }t|tr't|d||< q|||< q| j | ||d d d S )Ndatautf-8rp   )r   rp   )r   rZ   rc   bytesr   decodeappend)r   	exc_countdata_with_metadatar   b64_datakeyvalr   r   r   save_displayD  s   


zNotebook.save_displayc                 C  s~   | j j}|r'tj|r't|}t|}|W  d   S 1 s"w   Y  t }|r.|S t	 }|r=t
|d dkr=|S dS )z Return notebook as dict or None.Ncellsr   )r   x_jupyter_pathr[   r%   existsopenrb   loadrq   rt   len)r   relpath	json_filer   colab_ipynbkaggle_ipynbr   r   r   probe_ipynbV  s   

 zNotebook.probe_ipynbr   c                 C  sR   | j jstd dS d}z|  }W |S  ty(   td td Y |S w )Nznot saving jupyter notebookFzFailed to save notebook.zProblem saving notebook.)	r   	save_coderv   info_save_ipynbru   r)   rx   rw   )r   retr   r   r   
save_ipynbh  s   


zNotebook.save_ipynbc              	   C  sZ  | j j}td| |r%tj|r%t|tj	| j j
tj| dS t }|rqz	t }|d }W n ty>   d}Y nw |dsH|d7 }ttj	| j j
|ddd}|t| W d    dS 1 sjw   Y  dS t }|rt|d	 d
krttj	| j j
|d d ddd}|t| W d    dS 1 sw   Y  dS dS )Nzlooking for notebook: %sTrN   zcolab.ipynbz.ipynbwr   encodingr   r   rp   F)r   r   rv   r   r[   r%   r   shutilcopyjoin_tmp_code_dirr]   rq   rm   ru   endswithr   writerb   dumpsrt   r   )r   r   r   rz   nb_namefr   r   r   r   r   t  sb   

		
zNotebook._save_ipynbr   r   c              	   C  sx  zddl m}m}m} W n ty   td Y dS w | jdu r#dS g }t| jj	j
dd}t|dks9| jjs@td dS z|D ]C\}}}	|	d rX|jd	d
|	d dg}
ng }
| j|ry| j| D ]}|
|jd|d |d pti d qe||j||	d |
d qCt| jdr| jjj}ndtjd}tdt| |j|dtjd  dtjd  dd|dd}tjdd}|d| t !tj| jj"d t#tj| jj$dddd}|||dd  W d   n1 sw   Y  t#tj| jj"|ddd}|||dd  W d   W dS 1 sw   Y  W dS  t%|j&fy;   td! t'd! Y dS w )"zHThis saves all cell executions in the current session as a new notebook.r   )v4	validatorr   zLThe nbformat package was not found. It is required to save notebook history.NT)outputr}   znot saving jupyter historystreamstdout)output_typerN   textdisplay_datar   rp   )r   r   rp   )execution_countr   r   rT   python)rN   versionz)saving %i cells to _session_history.ipynbzPython )display_namerN   language)
kernelspeclanguage_info)r   rp   codez_session_history.ipynbsession_historyr   r   r      )r   z(Unable to save notebook session history.)(nbformatr   r   r   r   r)   rx   r9   r   history_manager	get_ranger   r   r   rv   r   
new_outputr   rZ   r   new_code_cellhasattrrT   r   sysr   new_notebookversion_infor[   r%   r   _set_config_wandbr   mkdir_exists_ok	files_dirr   r   OSErrorNotebookValidationErrorrw   )r   r   r   r   r   r   hist_r   excr   outr   nb
state_pathr   r   r   r   save_history  s   



(
zNotebook.save_historyN)r   r   r   r   )r   r   )r   r   )	r!   r"   r#   r   r   r   r   r   r   r   r   r   r   r   >  s    


/r   c                 C  s@   | du rdS z|  t W dS  ty   tjddd Y dS w )zABest-effort auto-registration of W&B magics in notebook contexts.Nz"Failed to register IPython magics.T)exc_info)register_magicsr6   ru   rv   debug)rf   r   r   r   _load_ipython_extension  s   r   )r   r   r   r   )r%   r&   r   r   r   r   )r   r   r   r   r   r   )rn   r   r   ro   )1
__future__r   rb   loggingr[   r   r   r   r1   base64r   typingr   r,   IPython.displayra   IPython.core.magicr   r   r   IPython.core.magic_argumentsr   r	   r
   requests.compatr   r)   
wandb.util	wandb.sdkr   wandb.sdk.libr   	getLoggerr!   rv   r   r   r   __annotations__r5   r    r6   rm   r|   r_   rq   rt   r   r   r   r   r   r   <module>   sH    



=
.1	 3