a
    m b†  ã                   @   s°  d 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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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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)m*Z* zddl+m,Z, W n  e-y€   ddl.m/Z, Y n0 dZ0G dd„ de e#ƒZ1G dd „ d e1ee"ƒZ2dS )!z?A contents manager that uses the local file system for storage.é    N)Údatetime)Úrun_sync)Úimport_item)Úexists)Úis_file_hidden)Ú	is_hidden)Ú
send2trash)Úweb)ÚAny)ÚBool)Údefault)Ú
TraitError)ÚUnicode)Úvalidateé   ©ÚAsyncFileCheckpoints©ÚFileCheckpoints)ÚAsyncFileManagerMixin)ÚFileManagerMixin)ÚAsyncContentsManager)ÚContentsManager)Ú_tz©ÚAuthenticatedFileHandler)Ú_i18n)Úsamefile)Úsamefile_simplec                   @   s8  e Zd ZeddZedƒdd„ ƒZedddddZe	d	ƒd
d„ ƒZ
dd„ Ze	dƒdd„ ƒZedƒdd„ ƒZeddddZeddddZedƒdd„ ƒZedƒdd„ ƒZdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd>d)d*„Zd?d+d,„Zd@d-d.„ZdAd/d0„ZdBd2d3„ZdCd4d5„Zd6d7„ Zd8d9„ Z d:d;„ Z!dDd<d=„Z"dS )EÚFileContentsManagerT)ÚconfigÚroot_dirc                 C   s*   z
| j jW S  ty$   t ¡  Y S 0 d S ©N)Úparentr!   ÚAttributeErrorÚosÚgetcwd©Úself© r)   úKlib/python3.9/site-packages/jupyter_server/services/contents/filemanager.pyÚ_default_root_dir2   s    
z%FileContentsManager._default_root_dirNa   Python callable or importstring thereof

        to be called on the path of a file just saved.

        This can be used to process the file on disk,
        such as converting the notebook to a script or HTML via nbconvert.

        It will be called as (all arguments passed by keyword)::

            hook(os_path=os_path, model=model, contents_manager=instance)

        - path: the filesystem path to the file just written
        - model: the model representing the file
        - contents_manager: this ContentsManager instance
        )r    Z
allow_noneÚhelpÚpost_save_hookc                 C   s.   |d }t |tƒrt|ƒ}t|ƒs*tdƒ‚|S )NÚvaluezpost_save_hook must be callable)Ú
isinstanceÚstrr   Úcallabler   ©r(   Zproposalr.   r)   r)   r*   Ú_validate_post_save_hookN   s    
z,FileContentsManager._validate_post_save_hookc              
   C   sv   | j rrz"| j d|¡ | j ||| d W nH typ } z0| jjd|dd t dd| ¡|‚W Y d}~n
d}~0 0 dS )	z1Run the post-save hook if defined, and log errorszRunning post-save hook on %s)Úos_pathÚmodelZcontents_managerzPost-save hook failed o-n %sT©Úexc_infoéô  z1Unexpected error while running post hook save: %sN)r-   ÚlogÚdebugÚ	ExceptionÚerrorr	   Ú	HTTPError)r(   r5   r4   Úer)   r)   r*   Úrun_post_save_hookW   s    ÿþz&FileContentsManager.run_post_save_hookc                 C   s<   |d }t j |¡s t j |¡}t j |¡s8td| ƒ‚|S )z'Do a bit of validation of the root_dir.r.   z%r is not a directory)r%   ÚpathÚisabsÚabspathÚisdirr   r2   r)   r)   r*   Ú_validate_root_dirc   s    z&FileContentsManager._validate_root_dirÚcheckpoints_classc                 C   s   t S r"   r   r'   r)   r)   r*   Ú_checkpoints_class_defaultn   s    z.FileContentsManager._checkpoints_class_defaultz°If True (default), deleting files will send them to the
        platform's trash/recycle bin, where they can be recovered. If False,
        deleting files really deletes them.)r    r,   Fa¥  If True, deleting a non-empty directory will always be allowed.
        WARNING this may result in files being permanently removed; e.g. on Windows,
        if the data size is too big for the trash/recycle bin the directory will be permanently
        deleted. If False (default), the non-empty directory will be sent to the trash only
        if safe. And if ``delete_to_trash`` is True, the directory won't be deleted.Zfiles_handler_classc                 C   s   t S r"   r   r'   r)   r)   r*   Ú_files_handler_class_default„   s    z0FileContentsManager._files_handler_class_defaultZfiles_handler_paramsc                 C   s
   d| j iS )Nr@   )r!   r'   r)   r)   r*   Ú_files_handler_params_defaultˆ   s    z1FileContentsManager._files_handler_params_defaultc                 C   s"   |  d¡}| j|d}t|| jƒS )aW  Does the API style path correspond to a hidden directory or file?

        Parameters
        ----------
        path : string
            The path to check. This is an API path (`/` separated,
            relative to root_dir).

        Returns
        -------
        hidden : bool
            Whether the path exists and is hidden.
        ú/©r@   )ÚstripÚ_get_os_pathr   r!   ©r(   r@   r4   r)   r)   r*   r   Œ   s    
zFileContentsManager.is_hiddenc                 C   sN   |  d¡}| j|d}zt |tj¡W S  tyH   | j d|¡ Y dS 0 dS )a[  Does the API style path correspond to a writable directory or file?

        Parameters
        ----------
        path : string
            The path to check. This is an API path (`/` separated,
            relative to root_dir).

        Returns
        -------
        hidden : bool
            Whether the path exists and is writable.
        rI   rJ   z'Failed to check write permissions on %sFN)rK   rL   r%   ÚaccessÚW_OKÚOSErrorr9   r<   rM   r)   r)   r*   Úis_writablež   s    
zFileContentsManager.is_writablec                 C   s    |  d¡}|  |¡}tj |¡S )aF  Returns True if the file exists, else returns False.

        API-style wrapper for os.path.isfile

        Parameters
        ----------
        path : string
            The relative path to the file (with '/' as separator)

        Returns
        -------
        exists : bool
            Whether the file exists.
        rI   )rK   rL   r%   r@   ÚisfilerM   r)   r)   r*   Úfile_exists´   s    

zFileContentsManager.file_existsc                 C   s"   |  d¡}| j|d}tj |¡S )ay  Does the API-style path refer to an extant directory?

        API-style wrapper for os.path.isdir

        Parameters
        ----------
        path : string
            The path to check. This is an API path (`/` separated,
            relative to root_dir).

        Returns
        -------
        exists : bool
            Whether the path is indeed a directory.
        rI   rJ   )rK   rL   r%   r@   rC   rM   r)   r)   r*   Ú
dir_existsÇ   s    
zFileContentsManager.dir_existsc                 C   s   |  d¡}| j|d}t|ƒS )aC  Returns True if the path exists, else returns False.

        API-style wrapper for os.path.exists

        Parameters
        ----------
        path : string
            The API path to the file (with '/' as separator)

        Returns
        -------
        exists : bool
            Whether the target exists.
        rI   rJ   )rK   rL   r   rM   r)   r)   r*   r   Û   s    
zFileContentsManager.existsc                 C   sH  |   |¡}t |¡}z
|j}W n& ttfyD   | j d¡ d}Y n0 zt 	|j
¡}W n> ttfy”   | j d|j
|¡ tdddddtjd}Y n0 zt 	|j¡}W n> ttfyä   | j d|j|¡ tdddddtjd}Y n0 i }| d	d¡d
 |d< ||d< ||d< ||d< d|d< d|d< d|d< ||d< |  |¡|d< |S )z)Build the common base of a contents modelzUnable to get size.NzInvalid mtime %s for %si²  r   r   )ZtzinfozInvalid ctime %s for %srI   éÿÿÿÿÚnamer@   Úlast_modifiedÚcreatedÚcontentÚformatÚmimetypeÚsizeÚwritable)rL   r%   ÚlstatÚst_sizeÚ
ValueErrorrP   r9   ÚwarningÚtzZutcfromtimestampÚst_mtimer   ZUTCÚst_ctimeÚrsplitrQ   )r(   r@   r4   Úinfor\   rW   rX   r5   r)   r)   r*   Ú_base_modelî   s8    



zFileContentsManager._base_modelc                 C   sH  |   |¡}d| }tj |¡s,t d|¡‚n,t|| jƒrX| jsX| j	 
d|¡ t d|¡‚|  |¡}d|d< d|d< |rDg  |d< }|   |¡}t |¡D ] }ztj ||¡}W n@ tyð }	 z(| j	 d	||	¡ W Y d}	~	q˜W Y d}	~	n
d}	~	0 0 zt |¡}
W nn tyn }	 zT|	jtjkr0| j	 d
|¡ n|	jtjkrN| j	 d||	¡ W Y d}	~	q˜W Y d}	~	n
d}	~	0 0 t |
j¡sªt |
j¡sªt |
j¡sª| j	 d|¡ q˜zB|  |¡rê| jsÎt||
dsê| | jd||f dd¡ W q˜ ty8 }	 z2|	jtjtjfvr$| j	jd|dd W Y d}	~	q˜d}	~	0 0 q˜d|d< |S ©zpBuild a model for a directory

        if content is requested, will include a listing of the directory
        zdirectory does not exist: %ré”  z4Refusing to serve hidden directory %r, via 404 ErrorÚ	directoryÚtypeNr\   rY   z"failed to decode filename '%s': %sz%s doesn't existzError stat-ing %s: %sz%s not a regular file)Zstat_resz%s/%sF)r@   rY   z+Unknown error checking if file %r is hiddenTr6   ÚjsonrZ   ) rL   r%   r@   rC   r	   r=   r   r!   Úallow_hiddenr9   rf   rg   ÚlistdirÚjoinÚUnicodeDecodeErrorra   r^   rP   ÚerrnoÚENOENTÚEACCESÚstatÚS_ISLNKÚst_modeÚS_ISREGÚS_ISDIRr:   Úshould_listr   ÚappendÚgetÚELOOP)r(   r@   rY   r4   Úfour_o_fourr5   ÚcontentsÚos_dirrV   r>   Ústr)   r)   r*   Ú
_dir_model  s`    


""
ÿ
þ
ý ýzFileContentsManager._dir_modelc                 C   sv   |   |¡}d|d< |  |¡}t |¡d |d< |rr|  ||¡\}}|d du rddddœ| }||d< |j||d	 |S ©
a@  Build a model for a file

        if content is requested, include the file contents.

        format:
          If 'text', the contents will be decoded as UTF-8.
          If 'base64', the raw bytes contents will be encoded as base64.
          If not specified, try to decode as UTF-8, and fall back to base64
        Úfilerk   r   r[   Nz
text/plainzapplication/octet-stream)ÚtextÚbase64©rY   rZ   ©rg   rL   Ú	mimetypesZ
guess_typeZ
_read_fileÚupdate©r(   r@   rY   rZ   r5   r4   Zdefault_mimer)   r)   r*   Ú_file_modelW  s$    


þýþzFileContentsManager._file_modelc                 C   sX   |   |¡}d|d< |  |¡}|rT| j|dd}|  ||¡ ||d< d|d< |  |¡ |S )úœBuild a notebook model

        if content is requested, the notebook content will be populated
        as a JSON structure (not double-serialized)
        Únotebookrk   é   ©Z
as_versionrY   rl   rZ   ©rg   rL   Z_read_notebookZmark_trusted_cellsÚvalidate_notebook_model©r(   r@   rY   r5   r4   Únbr)   r)   r*   Ú_notebook_modelw  s    


z#FileContentsManager._notebook_modelc                 C   sÄ   |  d¡}|  |¡s$t dd| ¡‚|  |¡}tj |¡rj|dvrZtjdd||f dd‚| j||d	}nV|d
ks„|du r”| 	d¡r”| j
||d	}n,|dkr°tjdd| dd‚| j|||d}|S )á  Takes a path for an entity and returns its model

        Parameters
        ----------
        path : str
            the API path that describes the relative path for the target
        content : bool
            Whether to include the contents in the reply
        type : str, optional
            The requested type - 'file', 'notebook', or 'directory'.
            Will raise HTTPError 400 if the content doesn't match.
        format : str, optional
            The requested format for file contents. 'text' or 'base64'.
            Ignored if this returns a notebook or directory model.

        Returns
        -------
        model : dict
            the contents model. If content=True, returns the contents
            of the file or directory as well.
        rI   ri   úNo such file or directory: %s©Nrj   é  ú%s is a directory, not a %súbad type©Úreason©rY   r   Nú.ipynbrj   ú%s is not a directoryr†   ©rK   r   r	   r=   rL   r%   r@   rC   r   Úendswithr”   r‹   ©r(   r@   rY   rk   rZ   r4   r5   r)   r)   r*   r{   Š  s$    



ýzFileContentsManager.getÚ c                 C   s’   t || jƒr"| js"t dd| ¡‚tj |¡sb|  ¡  t 	|¡ W d  ƒ qŽ1 sV0    Y  n,tj 
|¡s€t dd| ¡‚n| j d|¡ dS ©zcreate a directoryr˜   z!Cannot create hidden directory %rNzNot a directory: %szDirectory %r already exists)r   r!   rm   r	   r=   r%   r@   r   Úperm_to_403ÚmkdirrC   r9   r:   ©r(   r4   r5   r@   r)   r)   r*   Ú_save_directory¶  s    
*z#FileContentsManager._save_directoryc              
   C   sÆ  |  d¡}| j||d d|vr,t dd¡‚d|vrL|d dkrLt dd¡‚|  |¡}| j d	|¡ z¤|d d
kr°t |d ¡}|  	||¡ |  
||¡ | j |¡s®|  |¡ nV|d dkrÖ|  ||d | d¡¡ n0|d dkrò|  |||¡ nt dd|d  ¡‚W nf tjy    ‚ Y nP tyn } z6| jjd||dd t dd||f ¡|‚W Y d}~n
d}~0 0 d}|d d
kr˜|  |¡ | dd¡}| j|dd}|r´||d< | j||d |S )ú9Save the file model and return the model with no content.rI   ©r5   r@   rk   r˜   úNo file type providedrY   rj   úNo file content providedú	Saving %sr   rƒ   rZ   úUnhandled contents type: %súError while saving file: %s %sTr6   r8   ú)Unexpected error while saving file: %s %sNÚmessageFr   ©r5   r4   )rK   Úrun_pre_save_hookr	   r=   rL   r9   r:   ÚnbformatÚ	from_dictÚcheck_and_signÚ_save_notebookÚcheckpointsÚlist_checkpointsÚcreate_checkpointÚ
_save_filer{   r¨   r;   r<   r‘   r?   ©r(   r5   r@   r4   r“   r>   Zvalidation_messager)   r)   r*   ÚsaveÂ  sL    

ÿþ
zFileContentsManager.savec                    sv  |  d¡}ˆ  |¡}tj}tj |¡s6t dd| ¡‚dd„ }‡ fdd„}ˆ jrÂˆ j	sxt
jdkrx||ƒrxt d	d
| ¡‚||ƒr´ˆ  |¡sšt dd| ¡‚ˆ j d|¡ t|ƒ dS ˆ j d|¡ tj |¡r2ˆ j	sî||ƒrît d	d
| ¡‚ˆ j d|¡ ˆ  ¡  t |¡ W d  ƒ n1 s&0    Y  n@ˆ j d|¡ ˆ  ¡  ||ƒ W d  ƒ n1 sh0    Y  dS )úDelete file at path.rI   ri   ú$File or directory does not exist: %sc                 S   s6   t jdv rdS t | ¡j}t tj d¡¡j}||kS ©N>   Úwin32ÚdarwinTú~)ÚsysÚplatformr%   rt   Úst_devr@   Ú
expanduser©r4   Zfile_devZhome_devr)   r)   r*   Ú_check_trashü  s
    
z5FileContentsManager.delete_file.<locals>._check_trashc                    s6   t j | ¡r2tˆ jdd ƒ}tt  | ¡ƒ|h r2dS dS ©NZcheckpoint_dirTF)r%   r@   rC   Úgetattrr¸   Úsetrn   )r4   Úcp_dirr'   r)   r*   Úis_non_empty_dir  s
    z9FileContentsManager.delete_file.<locals>.is_non_empty_dirrÁ   r˜   úDirectory %s not emptyé“  úPermission denied: %súSending %s to trashNú<Skipping trash for %s, on different device to home directoryúRemoving directory %súUnlinking file %s)rK   rL   r%   Úunlinkr@   r   r	   r=   Údelete_to_trashÚalways_delete_dirrÄ   rÅ   rQ   r9   r:   r   ra   rC   r¥   ÚshutilÚrmtree©r(   r@   r4   ZrmrÉ   rÎ   r)   r'   r*   Údelete_fileô  s:    



þ
,
zFileContentsManager.delete_filec              
   C   sæ   |  d¡}|  d¡}||kr dS |  |¡}|  |¡}tj |¡rZt||ƒsZt dd| ¡‚z8|  ¡  t	 
||¡ W d  ƒ n1 s†0    Y  W nN tjy¨   ‚ Y n: tyà } z"t dd||f ¡|‚W Y d}~n
d}~0 0 dS ©zRename a file.rI   Ni™  zFile already exists: %sr8   z"Unknown error renaming file: %s %s)rK   rL   r%   r@   r   r   r	   r=   r¥   rÙ   Úmover;   ©r(   Zold_pathÚnew_pathZnew_os_pathZold_os_pathr>   r)   r)   r*   Úrename_file1  s    




.zFileContentsManager.rename_filec                 C   s   t dƒ| j S )Nz*Serving notebooks from local directory: %s)r   r!   r'   r)   r)   r*   Úinfo_stringH  s    zFileContentsManager.info_stringc                 C   s0   |   |¡r|S d|v r(| dd¡d }nd}|S )zIReturn the initial API path of  a kernel associated with a given notebookrI   r   r   r£   )rT   re   )r(   r@   r5   Z
parent_dirr)   r)   r*   Úget_kernel_pathK  s    
z#FileContentsManager.get_kernel_path)T)TN)T)TNN)r£   )r£   )N)#Ú__name__Ú
__module__Ú__qualname__r   r!   r   r+   r
   r-   r   r3   r?   rD   rF   r   r×   rØ   rG   rH   r   rQ   rS   rT   r   rg   r   r‹   r”   r{   r¨   r½   rÜ   rá   râ   rã   r)   r)   r)   r*   r   .   s\   

ü



ýý


*
?
 

,

2=r   c                   @   sh   e Zd Zedƒdd„ ƒZddd„Zddd	„Zdd
d„Zddd„Zddd„Z	ddd„Z
dd„ Zdd„ ZdS )ÚAsyncFileContentsManagerrE   c                 C   s   t S r"   r   r'   r)   r)   r*   rF   W  s    z3AsyncFileContentsManager._checkpoints_class_defaultTc                 Ã   sb  |   |¡}d| }tj |¡s,t d|¡‚n,t|| jƒrX| jsX| j	 
d|¡ t d|¡‚|  |¡}d|d< d|d< |r^g  |d< }|   |¡}ttj|ƒI dH }|D ]®}	ztj ||	¡}W n@ tyü }
 z(| j	 d	|	|
¡ W Y d}
~
q¤W Y d}
~
n
d}
~
0 0 zttj|ƒI dH }W nn ty‚ }
 zT|
jtjkrD| j	 d
|¡ n|
jtjkrb| j	 d||
¡ W Y d}
~
q¤W Y d}
~
n
d}
~
0 0 t |j¡s¾t |j¡s¾t |j¡s¾| j	 d|¡ q¤zH|  |	¡r| jsât||ds| | jd||	f ddI dH ¡ W q¤ tyR }
 z2|
jtj tjfvr>| j	jd|dd W Y d}
~
q¤d}
~
0 0 q¤d|d< |S rh   )!rL   r%   r@   rC   r	   r=   r   r!   rm   r9   rf   rg   r   rn   ro   rp   ra   r^   rP   rq   rr   rs   rt   ru   rv   rw   rx   r:   ry   r   rz   r{   r|   )r(   r@   rY   r4   r}   r5   r~   r   Údir_contentsrV   r>   r€   r)   r)   r*   r   [  sf    



""
ÿ
þ
ýÿýz#AsyncFileContentsManager._dir_modelNc                 Ã   s|   |   |¡}d|d< |  |¡}t |¡d |d< |rx|  ||¡I dH \}}|d du rjdddœ| }||d< |j||d	 |S r‚   r‡   rŠ   r)   r)   r*   r‹     s$    


þýþz$AsyncFileContentsManager._file_modelc                 Ã   s^   |   |¡}d|d< |  |¡}|rZ| j|ddI dH }|  ||¡ ||d< d|d< |  |¡ |S )	rŒ   r   rk   rŽ   r   NrY   rl   rZ   r   r’   r)   r)   r*   r”   ½  s    


z(AsyncFileContentsManager._notebook_modelc                 Ã   sÖ   |  d¡}|  |¡s$t dd| ¡‚|  |¡}tj |¡rp|dvrZtjdd||f dd‚| j||d	I d
H }nb|dksŠ|d
u r | 	d¡r | j
||d	I d
H }n2|dkr¼tjdd| dd‚| j|||dI d
H }|S )r•   rI   ri   r–   r—   r˜   r™   rš   r›   r   Nr   rž   rj   rŸ   r†   r    r¢   r)   r)   r*   r{   Ð  s$    



ýzAsyncFileContentsManager.getr£   c                 Ã   sš   t || jƒr"| js"t dd| ¡‚tj |¡sj|  ¡ " t	tj
|ƒI dH  W d  ƒ q–1 s^0    Y  n,tj |¡sˆt dd| ¡‚n| j d|¡ dS r¤   )r   r!   rm   r	   r=   r%   r@   r   r¥   r   r¦   rC   r9   r:   r§   r)   r)   r*   r¨   ü  s    
2z(AsyncFileContentsManager._save_directoryc              
   Ã   sì  |  d¡}|  |¡}| j d|¡ | j||d d|vrDt dd¡‚d|vrd|d dkrdt dd	¡‚zÄ|d d
krÂt |d ¡}|  	||¡ |  
||¡I dH  | j |¡I dH sÀ|  |¡I dH  nd|d dkrî|  ||d | d¡¡I dH  n8|d dkr|  |||¡I dH  nt dd|d  ¡‚W nf tjy@   ‚ Y nP tyŽ } z6| jjd||dd t dd||f ¡|‚W Y d}~n
d}~0 0 d}|d d
kr¸|  |¡ | dd¡}| j|ddI dH }|rÚ||d< | j||d |S )r©   rI   r­   rª   rk   r˜   r«   rY   rj   r¬   r   Nrƒ   rZ   r®   r¯   Tr6   r8   r°   r±   Fr   r²   )rK   rL   r9   r:   r³   r	   r=   r´   rµ   r¶   r·   r¸   r¹   rº   r»   r{   r¨   r;   r<   r‘   r?   r¼   r)   r)   r*   r½     sL    

 ÿþ
zAsyncFileContentsManager.savec                 ƒ   sœ  |  d¡}ˆ  |¡}tj}tj |¡s6t dd| ¡‚dd„ }‡ fdd„}ˆ jrÎˆ j	s~t
jdkr~||ƒI d	H r~t d
d| ¡‚||ƒI d	H rÀˆ  |¡s¦t dd| ¡‚ˆ j d|¡ t|ƒ d	S ˆ j d|¡ tj |¡rPˆ j	s||ƒI d	H rt d
d| ¡‚ˆ j d|¡ ˆ  ¡ " ttj|ƒI d	H  W d	  ƒ n1 sD0    Y  nHˆ j d|¡ ˆ  ¡   t||ƒI d	H  W d	  ƒ n1 sŽ0    Y  d	S )r¾   rI   ri   r¿   c                 Ó   sF   t jdv rdS ttj| ƒI d H j}ttjtj d¡ƒI d H j}||kS rÀ   )rÄ   rÅ   r   r%   rt   rÆ   r@   rÇ   rÈ   r)   r)   r*   rÉ   A  s
    
z:AsyncFileContentsManager.delete_file.<locals>._check_trashc                 “   sB   t j | ¡r>tˆ jdd ƒ}ttt j| ƒI d H ƒ}||h r>dS dS rÊ   )r%   r@   rC   rË   r¸   rÌ   r   rn   )r4   rÍ   rè   r'   r)   r*   rÎ   L  s    
z>AsyncFileContentsManager.delete_file.<locals>.is_non_empty_dirrÁ   Nr˜   rÏ   rÐ   rÑ   rÒ   rÓ   rÔ   rÕ   )rK   rL   r%   rÖ   r@   r   r	   r=   r×   rØ   rÄ   rÅ   rQ   r9   r:   r   ra   rC   r¥   r   rÙ   rÚ   rÛ   r)   r'   r*   rÜ   9  sD    

ÿþý
þ
4
z$AsyncFileContentsManager.delete_filec              
   Ã   sî   |  d¡}|  d¡}||kr dS |  |¡}|  |¡}tj |¡rZt||ƒsZt dd| ¡‚z@|  ¡ $ t	t
j||ƒI dH  W d  ƒ n1 sŽ0    Y  W nN tjy°   ‚ Y n: tyè } z"t dd||f ¡|‚W Y d}~n
d}~0 0 dS rÝ   )rK   rL   r%   r@   r   r   r	   r=   r¥   r   rÙ   rÞ   r;   rß   r)   r)   r*   rá   {  s    




6z$AsyncFileContentsManager.rename_file)T)TN)T)TNN)r£   )r£   )rä   rå   ræ   r   rF   r   r‹   r”   r{   r¨   r½   rÜ   rá   r)   r)   r)   r*   rç   V  s   

B
 

,

1Brç   )3Ú__doc__rq   rˆ   r%   rÙ   rt   rÄ   r   r´   Zanyio.to_threadr   Zipython_genutils.importstringr   Zjupyter_core.pathsr   r   r   r   Ztornador	   Z	traitletsr
   r   r   r   r   r   Zfilecheckpointsr   r   Zfileior   r   Zmanagerr   r   Zjupyter_serverr   rb   Zjupyter_server.base.handlersr   Zjupyter_server.transutilsr   Zos.pathr   ÚImportErrorZjupyter_server.utilsr   Z_script_exporterr   rç   r)   r)   r)   r*   Ú<module>   sR       ,