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mZ ddlmZ ddl	Z	ddl
Z
edZe
je	je
jdk Zd$d	d
dddZdd Zdd ZerejsG dd de	jjjZnG dd dZG dd dejZdddddZdddddd Zddd!d"d#ZdS )%z1Auto display statements ending with `;` on Colab.    )annotationsN)TypeVar)epy_T7TboolNone)activatereturnc                 C  s   t  sdS t }|jj}t|j trDt|j	j
 t|jj
 n
t|j | sVdS t }tr~t|jj
| t|j	j
| nt|j| t|jt| dS )a;  Activate auto display statements ending with `;` (activated by default).

  Add a trailing `;` to any statement (assignment, expression, return
  statement) to display the current line.
  This call `IPython.display.display()` for pretty display.

  Note that `;` added to the last statement of the cell still silence the
  output (`IPython` default behavior).

  ```python
  x = my_fn();  # Display `my_fn()`

  my_fn();  # Display `my_fn()`
  ```

  `;` behavior can be disabled with `ecolab.auto_display(False)`

  Args:
    activate: Allow to disable `auto_display`
  N)r   Zis_notebookIPythonget_ipythonZkernelshell_clear_transformZast_transformers_IS_LEGACY_APIZinput_transformer_managerZpython_line_transformsZinput_splitterZinput_transformers_post_RecordLines_append_transform_AddDisplayStatement)r	   ipr   lines_recorder r   ]/home/ghrups/robot-bench/.venv/lib/python3.9/site-packages/etils/ecolab/auto_display_utils.pyauto_display$   s.    

	
r   c                 C  s&   t | D ]}t|dr| | qd S )N__is_ecolab__)listhasattrremove)list_elemr   r   r   r   b   s    
r   c                 C  s   d|_ | | dS )z=Append `transform` to `list_` (with `ecolab` reload support).TN)r   append)r   Z	transformr   r   r   r   i   s    r   c                      s0   e Zd ZdZ fddZdd Zdd Z  ZS )r   Record lines.c                   s   g | _ g | _t   d S N)_lines
last_linessuper__init__self	__class__r   r   r$   t   s    _RecordLines.__init__c                 C  s   | j | |S )zAdd a line.)r!   r   r&   liner   r   r   pushy   s    z_RecordLines.pushc                 C  s8   | j r*g | _| j D ]}| j|d q| j   dS )zReset.
N)r!   r"   extendsplitclearr*   r   r   r   reset~   s    

z_RecordLines.reset)__name__
__module____qualname____doc__r$   r,   r1   __classcell__r   r   r'   r   r   q   s   r   c                   @  s(   e Zd ZdZdd ZdddddZdS )	r   r   c                 C  s
   g | _ d S r    r"   r%   r   r   r   r$      s    r)   	list[str])linesr
   c                 C  s   dd |D | _ |S )Nc                 S  s   g | ]}| d qS )r-   )rstrip).0lr   r   r   
<listcomp>       z)_RecordLines.__call__.<locals>.<listcomp>r7   )r&   r9   r   r   r   __call__   s    z_RecordLines.__call__N)r2   r3   r4   r5   r$   r?   r   r   r   r   r      s   c                      sF   e Zd ZdZdd fddZdddd	d
ZeZeZeZeZ	  Z
S )r   zDTransform the `ast` to add the `IPython.display.display` statements.r   )r   c                   s   || _ t   d S r    )r   r#   r$   )r&   r   r'   r   r   r$      s    z_AddDisplayStatement.__init__z%ast.Assign | ast.AnnAssign | ast.Exprast.AST)noder
   c              
   C  s   zRt | jj|\}}|rP|r*t|tjr*n&|jdu r6ntjtd|jgg d|_W nN t	y } z6d
| jj}td| d t|  W Y d}~n
d}~0 0 |S )z$Wrap the node in a `display()` call.Nz-ecolab.auto_display_utils._display_and_return)funcargskeywordsr-   zError for code:
-----
z
-----)_has_trailing_semicolonr   r"   
isinstanceastExprvalueCall_parse_expr	Exceptionjoinprint	tracebackprint_exception)r&   rA   has_trailingis_last_statementecoder   r   r   _maybe_display   s(    

z#_AddDisplayStatement._maybe_display)r2   r3   r4   r5   r$   rU   visit_Assignvisit_AnnAssign
visit_Exprvisit_Returnr6   r   r   r'   r   r      s   r   strr@   )rT   r
   c                 C  s   t j| ddjS )Neval)mode)rG   parsebody)rT   r   r   r   rK      s    rK   r8   ztuple[bool, bool])
code_linesrA   r
   c                 C  s   t |tjr|jdu rdS | |jd  }d}||jd D ]4}|dkrLd}q:|dkrXq:q:|dkrf qpq:d} qpq:d}| |jd D ]"}| }|r|dsd} qq|drd}||fS )	z!Check if `node` has trailing `;`.N)FF   F;T #)rF   rG   	AnnAssignrI   
end_linenoend_col_offsetstrip
startswith)r_   rA   	last_linerQ   charrR   r+   r   r   r   rE      s,    
rE   )xr
   c                 C  s   t j|  | S )zPrint `x` and return `x`.)r   display)rk   r   r   r   _display_and_return   s    rm   )T)r5   
__future__r   rG   rO   typingr   Zetilsr   r   	packagingr   versionr]   __version__r   r   r   r   TYPE_CHECKINGcoreZinputtransformerZInputTransformerr   NodeTransformerr   rK   rE   rm   r   r   r   r   <module>   s0   
>
+"