a
    ij                     @  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	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 dd	lmZ dd
lmZ ddlZejddG dd dZG dd dZdddddZdddddZdS )zCell auto-reload.    )annotationsN)Iterator)mock)epath)adhoc_imports)colab_utils)ip_utils)module_utilsT)frozenc                   @  s   e Zd ZU ded< ded< dS )_ModuleInfostrnameztypes.ModuleTypeinstanceN)__name__
__module____qualname____annotations__ r   r   Z/home/ghrups/robot-bench/.venv/lib/python3.9/site-packages/etils/ecolab/cell_autoreload.pyr   %   s   
r   c                   @  s|   e Zd ZdZdd ZejddddZddd	d
Ze	ddddZ
ddddZejddddZddddZdS )ModuleReloaderzModule reloader.c                 K  s   || _ d| _i | _d S )Nr   )adhoc_kwargs_last_update_globals_to_update)selfr   r   r   r   __init__.   s    zModuleReloader.__init__tuple[str, ...])returnc                 C  s   t | jd S )Nreload)tupler   r   r   r   r   r   3   s    zModuleReloader.reloadboolc                 G  s   | j rt|  d S )N)verboseprint)r   txtr   r   r   r"   7   s    zModuleReloader.printc                 C  s
   | j d S )Nr!   )r   r   r   r   r   r!   ;   s    zModuleReloader.verboseNonec                 C  s:   | j stdt| j | _tdtt| j	| d d S )Nz/`cell_autoreload=True` require to set `reload=`Zpre_run_cellZis_cell_auto_reload)
r   
ValueError_get_last_modules_updater   r   Zregister_once	functoolspartialtype_pre_run_cell_maybe_reloadr   r   r   r   register?   s    zModuleReloader.registerzIterator[None]c                 c  s   t  }dV  t|jjj}| D ]j\}}t|tj	s:q$|j
dd| jsRq$td|r`q$| d| d|j d t|j|d| j|< q$dS )	zRecord the imported modules.Nr    z_+(\d+)?zRegistering z for autoreload ())r   r   )IPythonget_ipythondictkernelshelluser_nsitems
isinstancetypes
ModuleType__dict__get
startswithr   re	fullmatchr"   r   r   r   )r   ipZnew_globalsr   valuer   r   r   track_globalsQ   s    zModuleReloader.track_globalsc              	   G  s^  ~t | j}|| jkrdS || _t }| jrT|td |t	t
j t| j}tjf i | j$ |D ]}t| qxW d   n1 s0    Y  t }|jjj}| j D ]v\}}	t||t|	jkr&t
j|	j }
| d| d|	j  |
||< t j!|	|
d| j|< q| d| d qW d   n1 sP0    Y  dS )z?Check if workspace is modified, then eventually reload modules.Nzmodule reloadedzOverwrting z to new module )r   z	Ignoring z (was overwritten))"r&   r   r   
contextlib	ExitStackr!   enter_contextr   Zcollapseredirect_stderrsysstdoutr	   get_module_namesr   Zadhocr   	importlibimport_moduler.   r/   r1   r2   r3   r   r4   idr9   r   modulesr   r"   dataclassesreplace)r   args	max_mtimestackZimported_modulesmoduler=   Zkernel_globalsr   infoZreloaded_moduler   r   r   r*   s   s0    

*
z)ModuleReloader._pre_run_cell_maybe_reloadN)r   r   r   __doc__r   r'   cached_propertyr   r"   propertyr!   r+   r@   contextmanagerr?   r*   r   r   r   r   r   +   s   !r   r   int)rJ   r   c                 C  s4   d}t | D ] }t|}|du r$qt||}q|S )z$Get the last update for all modules.r   N)r	   rF   _get_last_module_updatemax)rJ   rN   rP   mtimer   r   r   r&      s    r&   r   z
int | None)module_namer   c                 C  sl   t j| d}|du rdS |jdkr(dS t|dd}|s<dS t|}z| jW S  t	yf   Y dS 0 dS )z#Get the last update for one module.N__main____file__)
rD   rJ   r9   r   getattrr   PathstatrY   OSError)rZ   rP   Zmodule_filer   r   r   rW      s    

rW   )rR   
__future__r   r@   rK   r'   rG   r;   rD   r6   typingr   Zunittestr   Zetilsr   Zetils.ecolabr   r   r   r	   r.   	dataclassr   r   r&   rW   r   r   r   r   <module>   s*   
s