U
    /e                     @  sB  d Z ddlmZ ddlZee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mZmZmZmZmZmZ ddlmZ dZG d	d
 d
ee ZddddddZd)ddddddddZd*ddddddddZd+dddddddZd,ddddddd Z ed!d"d#d$d%Z!ej"#d&Z$ej%e$d'd( dS )-zE Provide functions for manipulating files and directories in tests.

    )annotationsN)contextmanager)TracebackType)IO	AwaitableCallableContextManagerDictIteratorType)PathLike)TmpDirwith_directory_contentswith_temporary_file
WorkingDirc                   @  sB   e Zd ZdZdddddZddd	dd
ddZddddZdS )r   

    strNone)prefixreturnc                 C  s   t j|td| _d S )N)r   dir)tempfilemkdtemp
_LOCAL_TMP_dir)selfr    r   B/tmp/pip-unpacked-wheel-f5fndrjf/bokeh/_testing/util/filesystem.py__init__?   s    zTmpDir.__init__zType[BaseException] | NonezBaseException | NonezTracebackType | None)typevalue	tracebackr   c              
   C  s   zt j| jd W nl tk
r~ } zN|d krNtd| j d| tjd |n td| j d| tjd |W 5 d }~X Y nX d S )N)pathzException cleaning up TmpDir z: )filezFailed to clean up TmpDir )shutilrmtreer   	Exceptionprintsysstderr)r   r   r    r!   er   r   r   __exit__B   s    zTmpDir.__exit__)r   c                 C  s   | j S N)r   )r   r   r   r   	__enter__N   s    zTmpDir.__enter__N)__name__
__module____qualname____doc__r   r+   r-   r   r   r   r   r   :   s   r   zDict[PathLike, str | None]zCallable[[str], None]r   )contentsfuncr   c                 C  s   t dd}|  D ]h\}}tj||}|dkrBtj|dd qtjtj|dd t|ddd}|| W 5 Q R X q|tj	| W 5 Q R X dS )	r   ztest-)r   NTexist_okwzutf-8)encoding)
r   itemsosr"   joinmakedirsdirnameopenwriterealpath)r2   r3   r<   filenameZfile_contentr"   fr   r   r   r   Q   s    r    r   zPathLike | None)r2   r3   r   suffixr   c                   s(   ddd fdd}t |||d dS )r   	IO[bytes]r   rA   r   c                   s.   |   d |   |   | j d S NzUTF-8r>   encodeflushclosenamerA   r2   r3   r   r   with_file_objectd   s    z,with_file_contents.<locals>.with_file_objectr   rC   N)r   r2   r3   r   rC   rN   r   rM   r   with_file_contents`   s    rQ   z Callable[[str], Awaitable[None]]c                   s.   ddd fdd}t |||dI dH  dS )r   rD   r   rE   c                   s4   |   d |   |   | jI d H  d S rF   rG   rL   rM   r   r   rN   r   s    z2with_file_contents_async.<locals>.with_file_objectrO   N)with_temporary_file_asyncrP   r   rM   r   with_file_contents_asyncn   s    rS   zCallable[[IO[bytes]], None])r3   r   rC   r   c              	   C  sD   |dkrt }tj|d|d}z| | W 5 |  t|j X dS r   NF)r   deleterC   r   r   NamedTemporaryFilerJ   r9   removerK   r3   r   rC   rA   r   r   r   r   |   s    r   z&Callable[[IO[bytes]], Awaitable[None]]c              	     sJ   |dkrt }tj|d|d}z| |I dH  W 5 |  t|j X dS rT   rV   rY   r   r   r   rR      s    rR   r   zIterator[PathLike])newr   c                 c  s&   t  }t |  | V  t | d S r,   )r9   getcwdchdir)rZ   oldr   r   r   r      s    
r   z./build/tmpTr4   )NrB   )NrB   )NrB   )NrB   )&r1   
__future__r   logging	getLoggerr.   logr9   r$   r(   r   
contextlibr   typesr   typingr   r   r   r   r	   r
   r   Zbokeh.core.typesr   __all__r   r   r   rQ   rS   r   rR   r   r"   abspathr   r;   r   r   r   r   <module>   s,   
$