o
    iy                     @   sJ  d 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Zddl	m
Z
 ejj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mZmZ ddlmZmZ ddlmZmZ ddl m!Z!m"Z" ddlm#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z)m*Z* dd Z+dd Z,dd Z-G dd dZ.G dd deZ/G dd de/Z0dS )z!Test the contents webservice API.    )contextmanager)partialN	normalize)
send2trash)TrashPermissionError   )GenericFileCheckpoints)Config)url_path_join
url_escape
to_os_path)NotebookTestBaseassert_http_error)write	from_dict)new_notebooknew_markdown_cell)v2)	py3compat)TemporaryDirectory)encodebytesdecodebytesc                    s   t    fdd| D S )zuniq_stable(elems) -> list

    Return from an iterable, a list of all the unique elements in the input,
    maintaining the order in which they first appear.
    c                    s"   g | ]}| vr  |s|qS  )add.0xseenr   m/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/notebook/services/contents/tests/test_contents_api.py
<listcomp>(   s   " zuniq_stable.<locals>.<listcomp>)set)elemsr   r   r    uniq_stable!   s   r$   c                 C      dd | d D S )Nc                 S      g | ]
}|d  dkr|qS )typenotebookr   )r   nbr   r   r    r!   +       z"notebooks_only.<locals>.<listcomp>contentr   	dir_modelr   r   r    notebooks_only*      r.   c                 C   r%   )Nc                 S   r&   )r'   	directoryr   r   r   r   r    r!   .   r*   zdirs_only.<locals>.<listcomp>r+   r   r,   r   r   r    	dirs_only-   r/   r1   c                   @   s   e Zd ZdZ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dZdd Zd*ddZd*ddZdd Zd*ddZdd  Zd!d" Zd#d$ Zd%d& Zd'd( ZdS )-APIzWrapper for contents API calls.c                 C   s
   || _ d S N)request)selfr4   r   r   r    __init__3   s   
zAPI.__init__Nc                 C   s$   | j |td|||d}|  |S )Napi/contents)dataparams)r4   r   raise_for_status)r5   verbpathbodyr9   responser   r   r    _req6   s   zAPI._req/c                 C      |  d|S )NGETr?   r5   r<   r   r   r    list>      zAPI.listc                 C   sD   i }|d ur
||d< |d ur||d< |dkrd|d< | j d||dS )Nr'   formatF0r+   rB   )r9   rC   )r5   r<   r'   rG   r+   r9   r   r   r    readA   s   zAPI.read.ipynbc                 C   s$   d }|rt d|i}| d||S )NextPOSTjsondumpsr?   )r5   r<   rK   r=   r   r   r    create_untitledK   s   zAPI.create_untitledc                 C      |  d|tddiS )NrL   r'   r0   r?   rN   rO   rD   r   r   r    mkdir_untitledQ      zAPI.mkdir_untitledc                 C      t d|i}| d||S )N	copy_fromrL   rM   r5   rV   r<   r=   r   r   r    copyT      zAPI.copyc                 C   rA   NPUTrC   rD   r   r   r    createX   rF   z
API.createc                 C      |  d||S rZ   rC   r5   r<   r=   r   r   r    upload[      z
API.uploadc                 C   rQ   )Nr[   r'   r0   rR   rD   r   r   r    mkdir^   rT   z	API.mkdirc                 C   rU   )NrV   r[   rM   rW   r   r   r    copy_puta   rY   zAPI.copy_putc                 C   r]   rZ   rC   r^   r   r   r    savee   r`   zAPI.savec                 C   rA   )NDELETErC   rD   r   r   r    deleteh   rF   z
API.deletec                 C   s   t d|i}| d||S )Nr<   PATCHrM   )r5   r<   new_pathr=   r   r   r    renamek   rY   z
API.renamec                 C      |  dt|dS )NrB   checkpointsr?   r   rD   r   r   r    get_checkpointso   r/   zAPI.get_checkpointsc                 C   ri   NrL   rj   rk   rD   r   r   r    new_checkpointr   r/   zAPI.new_checkpointc                 C      |  dt|d|S rm   rk   r5   r<   checkpoint_idr   r   r    restore_checkpointu      zAPI.restore_checkpointc                 C   ro   )Nrd   rj   rk   rp   r   r   r    delete_checkpointx   rs   zAPI.delete_checkpoint)NN)r@   )NNN)r@   rJ   )__name__
__module____qualname____doc__r6   r?   rE   rI   rP   rS   rX   r\   r_   ra   rb   rc   re   rh   rl   rn   rr   rt   r   r   r   r    r2   1   s(    










r2   c                   @   s  e Zd ZdZg dZddgZedd edd D Zd	d
 eD Ze	dd Z
e	dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Z d9d: Z!d;d< Z"d~d>d?Z#d@dA Z$dBdC Z%dDdE Z&dFdG Z'dHdI Z(dJdK Z)dLdM Z*dNdO Z+dPdQ Z,dRdS Z-dTdU Z.dVdW Z/dXdY Z0dZd[ Z1d\d] Z2d^d_ Z3d`da Z4dbdc Z5ddde Z6dfdg Z7dhdi Z8djdk Z9dldm Z:dndo Z;dpdq Z<drds Z=dtdu Z>dvdw Z?dxdy Z@eAdzd{ ZBd|d} ZCdS )APITestz Test the kernels web service API)) inroot)zDirectory with spaces ininspace)   unicodé
innonascii)fooa)r   b)r   zname with spaces)r   r}   )foo/barbaz)orderingA)r   r   )r   C)   å bu   ç d.hidden__pycache__c                 C   s   g | ]	\}}t |qS r   )r   cast_unicode)r   dnr   r   r    r!          zAPITest.<listcomp>   Nc                 C   s    h | ]}t d |dd qS )NFCr@   r   )r   splitr   r   r   r   r    	<setcomp>   s     zAPITest.<setcomp>c                 C   s   |  dd S )Nutf-8   )encodenamer   r   r    _blob_for_name   s   zAPITest._blob_for_namec                 C   s
   |  dS )Nz
 text filer   r   r   r   r    _txt_for_name   s   
zAPITest._txt_for_namec                 C   s   t || jdS )N)root)r   notebook_dirr5   api_pathr   r   r    r      r`   zAPITest.to_os_pathc                 C   s>   |  |}zt| W dS  ty   td| Y dS w )zCreate a directory at api_pathzDirectory already exists: N)r   osmakedirsOSErrorprintr5   r   os_pathr   r   r    make_dir   s   
zAPITest.make_dirc                 C   sH   |  |}t|ddd}|| W d   dS 1 sw   Y  dS )z$Make a text file at a given api_pathwr   encodingNr   openr   )r5   r   txtr   fr   r   r    make_txt   s   
"zAPITest.make_txtc                 C   sD   |  |}t|d}|| W d   dS 1 sw   Y  dS )z&Make a binary file at a given api_pathwbNr   )r5   r   blobr   r   r   r   r    	make_blob   s   
"zAPITest.make_blobc                 C   sL   |  |}t|ddd}t||dd W d   dS 1 sw   Y  dS )z(Make a notebook file at a given api_pathr   r   r      )versionNr   )r5   r   r)   r   r   r   r   r    make_nb   s   
"zAPITest.make_nbc                 C   s   |  |}tj|dd dS )z6Delete a directory at api_path, removing any contents.T)ignore_errorsN)r   shutilrmtreer   r   r   r    
delete_dir   s   
zAPITest.delete_dirc                 C   s"   |  |rt| | dS dS )z-Delete a file at the given path if it exists.N)isfiler   unlinkr   r   r   r   r    delete_file   s   
zAPITest.delete_filec                 C      t j| |S r3   )r   r<   r   r   r   r   r   r    r      r/   zAPITest.isfilec                 C   r   r3   )r   r<   isdirr   r   r   r   r    r      r/   zAPITest.isdirc              
   C   s<   z
t | | W dS  ty } zW Y d}~dS d}~ww )z2Send a path to trash, if possible. Return success.TNF)r   r   r   )r5   r   er   r   r    can_send2trash   s   zAPITest.can_send2trashc           	      C   s   | j | j D ]}| | | t| j| q| jD ]V\}}t }| d| d}| || | t| j	| | 
|}| d| d}| || | t| j	| | |}| d| d}| || | t| j	| qt| j| _d S )Nr@   rJ   .txt.blob)dirshidden_dirsr   
addCleanupr   r   dirs_nbsr   r   r   r   r   r   r   r2   r4   api)	r5   r   r   r)   nbnamer   txtnamer   blobnamer   r   r    setUp   s"   


zAPITest.setUpc                 C   s  t | j  }| t|d | |d d d t | jd }| t|d | |d d d t | jd }| t|d | |d d d | |d d	 d
 t | jd }| t|d | |d d d | |d d	 d t | jd }| t|d dd |D }g d}dd |D }| || t | jd }dd |D }h d}| || d S )Nr   r   r   zinroot.ipynbz/Directory with spaces in/zinspace.ipynbu
   /unicodé/zinnonascii.ipynbr<      unicodé/innonascii.ipynbz	/foo/bar/z	baz.ipynbzfoo/bar/baz.ipynbr   r   c                 S      h | ]	}t d |d qS r   r   r   r   r   r   r   r    r      r   z.APITest.test_list_notebooks.<locals>.<setcomp>)a.ipynbb.ipynbzname with spaces.ipynbu   unicodé.ipynbc                 S   s   h | ]}t d |qS )r   r   )r   r   r   r   r    r      s    r   c                 S      h | ]}|d  qS r   r   r   r   r   r    r         >   A.ipynbC.ipynbr   )r.   r   rE   rN   assertEquallen)r5   nbsnbnamesexpectedr   r   r    test_list_notebooks   s0   zAPITest.test_list_notebooksc                 C   s2   t | j  }dd |D }| || j d S )Nc                 S   r   r   r   r   r   r   r    r     r   z)APITest.test_list_dirs.<locals>.<setcomp>)r1   r   rE   rN   r   top_level_dirs)r5   r   	dir_namesr   r   r    test_list_dirs  s   zAPITest.test_list_dirsc                 C   s`   | j D ]*}| jj|dd }| |d | | |d d | d| | |d d  qd S )NFr+   r<   r'   r0   r+   )r   r   rI   rN   r   assertIn)r5   r   modelr   r   r    test_get_dir_no_content  s   
zAPITest.test_get_dir_no_contentc                 C   :   t d | jd W d    d S 1 sw   Y  d S )N  nonexistant)r   r   rE   r5   r   r   r    test_list_nonexistant_dir     
"z!APITest.test_list_nonexistant_dirc                 C   s   | j D ]N\}}t||d }| j| }| |d | d | |d | | |d d | d| | |d d | d	|d  | |d d	 t qd S )
NrJ   r   r<   r'   r(   r+   rG   rN   metadata)	r   r   r   rI   rN   r   r   assertIsInstancedictr5   r   r   r<   r)   r   r   r    test_get_nb_contents  s   zAPITest.test_get_nb_contentsc                 C   s   | j D ]>\}}t||d }| jj|dd }| |d | d | |d | | |d d | d| | |d d  qd S )	NrJ   Fr   r   r<   r'   r(   r+   )r   r   r   rI   rN   r   r   r   r   r   r    test_get_nb_no_content#  s   zAPITest.test_get_nb_no_contentc                 C   s   di di dgd}d}|  |tt| | j| }| |d | | |d d | d	| | d
| | d|d
 	  d S )Nr   wrong)	cell_typer   )nbformatr   cellsu   å b/Validate tést.ipynbr<   r'   r(   r+   messagezvalidation failed)
r   r   r   rN   rO   r   rI   r   r   lower)r5   r)   r<   r   r   r   r    test_get_nb_invalid-  s   zAPITest.test_get_nb_invalidc                 C   r   )Nr   zfoo/q.ipynbr   r   rI   r   r   r   r    test_get_contents_no_such_file?  s   
"z&APITest.test_get_contents_no_such_filec                 C   s   t jdkr
| d | dd | dd td | jd}W d    n1 s+w   Y  td | jd}W d    d S 1 sFw   Y  d S )Nwin32(Disabled copying hidden files on Windowsz.hidden/visible.txttest string.hidden.txtr   )sysplatformskipTestr   r   r   rI   r5   respr   r   r    test_get_404_hiddenD  s   



"zAPITest.test_get_404_hiddenc                 C   s
  | j D ]G\}}t||d }| j| }| |d | d | |d | | d| | |d d | |d d | |d | | qtd	 | jd
 W d    n1 s`w   Y  td | jjdddd W d    d S 1 s~w   Y  d S )Nr   r   r<   r+   rG   textr'   filer   	foo/q.txt  zfoo/bar/baz.blob)r'   rG   )	r   r   r   rI   rN   r   r   r   r   r5   r   r   r<   r   r   r   r    test_get_text_file_contentsN  s   

"z#APITest.test_get_text_file_contentsc                 C   s   | j D ]L\}}t||d }| j| }| |d | d | |d | | d| | |d d | |d d | t|d d	| 	| qt
d
 | jd W d    d S 1 sfw   Y  d S )Nr   r   r<   r+   rG   base64r'   r   asciir   r  )r   r   r   rI   rN   r   r   r   r   r   r   r  r   r   r    test_get_binary_file_contentsa  s   
"z%APITest.test_get_binary_file_contentsc                 C   sv   t d | jjddd W d    n1 sw   Y  t d | jjddd W d    d S 1 s4w   Y  d S )Nr  r}   r   r'   r   r0   r   r   r   r   r    test_get_bad_types  s   

"zAPITest.test_get_bad_typer(   c                 C   s   |  |jd t|jd }|  |t| jdt| | }|  |d |	ddd  |  |d | |  |d	 | |d
krE| j
n| j}||sNJ d S )N   Locationr7   r   r@   r   r<   r'   r0   )r   status_coder   str_to_unicodeheadersr   
url_prefixr   rN   rsplitr   r   )r5   r   r<   r'   location_headerrjsonisrightr   r   r    _check_createdz  s   zAPITest._check_createdc                 C   sR   | j jdd}| |d | j jdd}| |d | j jdd}| |d d S )Nr   r<   u   å b/Untitled.ipynbu   å b/Untitled1.ipynbr   zfoo/bar/Untitled.ipynb)r   rP   r  r   r   r   r    test_create_untitled  s   zAPITest.test_create_untitledc                 C   sj   | j jddd}| j|ddd | j jdd}| }| |d d | |d	 d
 | |d d d S )Nr   r   )r<   rK   zfoo/bar/untitled.txtr   r  r  r'   rG   r   r+   rz   )r   rP   r  rI   rN   r   )r5   r   r   r   r   r    test_create_untitled_txt  s   z APITest.test_create_untitled_txtc                 C   s:   t  }|dd}d}| jj|t|d}| || d S )Nr(   r+   r'      å b/Upload tést.ipynbr=   )r   r   r_   rN   rO   r  )r5   r)   nbmodelr<   r   r   r   r    test_upload  s
   
zAPITest.test_uploadc                 C   s^   | j jdd}| j|ddd | j jdd}| j|ddd | j jdd}| j|ddd d S )	Nr   r  u   å b/Untitled Folderr0   r  u   å b/Untitled Folder 1r   zfoo/bar/Untitled Folder)r   rS   r  r   r   r   r    test_mkdir_untitled  s   zAPITest.test_mkdir_untitledc                 C   s$   d}| j |}| j||dd d S )Nu   å b/New ∂irr0   r  )r   ra   r  )r5   r<   r   r   r   r    
test_mkdir  s   zAPITest.test_mkdirc                 C   s:   t d | jd}W d    d S 1 sw   Y  d S )Nr  u   å b/.hidden)r   r   ra   r   r   r   r    test_mkdir_hidden_400  r   zAPITest.test_mkdir_hidden_400c                 C   sr   d}|ddd}d}| j j|t|d}| j |}| }| |d d | |d d | |d	 | d S )
N   ünicode téxtr   r   r+   rG   r'   u   å b/Upload tést.txtr  r'   rG   r+   )r   r_   rN   rO   rI   r   r5   r=   r   r<   r   r   r   r    test_upload_txt  s   zAPITest.test_upload_txtc                 C   sf  t jdkr
| d td d}|ddd}d}| jj|t|d	}W d    n1 s.w   Y  td d}|ddd
d}d}| jj|t|d	}W d    n1 sXw   Y  td d}|ddd}d}| jj|t|d	}W d    n1 sw   Y  td d}|dddd}d}| jj|t|d	}W d    d S 1 sw   Y  d S )Nr   r   r  r!  r   r   r"  u   .hidden/Upload tést.txtr  .hidden/test.txt)r+   rG   r'   r<   u   Upload tést.txtr   )r   r   r   r   r   r_   rN   rO   r#  r   r   r    test_upload_txt_hidden  sP   







"zAPITest.test_upload_txt_hiddenc                 C   s   d}t |d}|ddd}d}| jj|t|d}| j|}| }| |d d | |d	 | | |d
 d t|d 	d}| || d S )Ns   blobr  r  r   r"  u   å b/Upload tést.blobr  r'   r<   rG   r+   )
r   decoder   r_   rN   rO   rI   r   r   r   )r5   r=   b64bodyr   r<   r   decodedr   r   r    test_upload_b64  s   zAPITest.test_upload_b64c                 C   s   t  }t  }|j| |jt jdd |dd}d}| jj|t	
|d}| || | j|}|	 }| |d d d	 d S )
Nzprint("hi"))inputr(   r  r  r  r+   r   r   )r   r   new_worksheet
worksheetsappendr   new_code_cellr   r_   rN   rO   r  rI   r   )r5   r)   wsr  r<   r   r8   r   r   r    test_upload_v2	  s   
zAPITest.test_upload_v2c                 C   8   | j dd}| |d | j dd}| |d d S N   å b/ç d.ipynbr   u   å b/ç d-Copy1.ipynbu   å b/ç d-Copy2.ipynbr   rX   r  r   r   r   r    	test_copy     zAPITest.test_copyc                 C   s8   | j dd}| |d | j dd}| |d d S r3  r5  r   r   r   r    test_copy_copy  r7  zAPITest.test_copy_copyc                 C   r2  )Nfoo/a.ipynbr   u   å b/a.ipynbu   å b/a-Copy1.ipynbr5  r   r   r   r    test_copy_path$  r7  zAPITest.test_copy_pathc                 C   s  t jdkr
| d | dd | dd | dd td | jdd}W d    n1 s2w   Y  td | jd	d}W d    n1 sMw   Y  td | jdd}W d    n1 shw   Y  td | jd	d}W d    d S 1 sw   Y  d S )
Nr   r   new.txtr   .hidden/new.txtr   r  .hidden/old.txtold.txt)r   r   r   r   r   r   rX   r   r   r   r    test_copy_400_hidden+  s"   





"zAPITest.test_copy_400_hiddenc                 C   <   t d | jdd}W d    d S 1 sw   Y  d S )Nr  r4  u   å b/cøpy.ipynb)r   r   rb   r   r   r   r    test_copy_put_400:     
"zAPITest.test_copy_put_400c                 C      t jdkr
| d td | jdd}W d    n1 s w   Y  td | jdd}W d    n1 s;w   Y  td | jdd}W d    n1 sVw   Y  td | jdd}W d    d S 1 srw   Y  d S 	Nr   r   r  r=  r;  r>  r<  r   )r   r   r   r   r   rb   r   r   r   r    test_copy_put_400_hidden>  s   





"z APITest.test_copy_put_400_hiddenc                 C   r@  )Nr  r   r   )r   r   rX   r   r   r   r    test_copy_dir_400J  s   
"zAPITest.test_copy_dir_400c                 C   s   | j D ]\}}t|d| | jt||d }| |jd q| jdg D ]}t| j	|
 }td t| t| | |g  q)d S )Nz, rJ      r@   z------)r   r   r   re   r   r   r  r   r.   rE   rN   )r5   r   r   r   r   r   r   r    test_deleteO  s   zAPITest.test_deletec                 C   sn   t | jdg tddD ]}| j| d }|D ]
}| j|d  qq| jd d }| |g  d S )Nr@   T)keyreverser+   r<   )sortedr   r   r   rE   rN   re   r   )r5   r   listingr   r   r   r    test_delete_dirs\  s   zAPITest.test_delete_dirsc              
   C   s   t jdkr
| d z| jd W n tjy0 } z|jjdkr+| 	ds+| d  d }~ww t
d | jd W d    d S 1 sGw   Y  d S )Nr   z+Disabled deleting non-empty dirs on Windowsr   r  zDir can't be sent to trashr   )r   r   r   r   re   requests	HTTPErrorr>   r  r   r   rE   r5   r   r   r   r    test_delete_non_empty_dire  s   




"z!APITest.test_delete_non_empty_dirc                 C   s   t jdkr
| d td) z| jd W n tjy. } z
|jj	dks(J |d }~ww W d    d S 1 s:w   Y  d S )Nr   (Disabled deleting hidden dirs on Windowsr  r   )
r   r   r   r   r   re   rN  rO  r>   r  rP  r   r   r    test_delete_hidden_dirt  s   


"zAPITest.test_delete_hidden_dirc                 C   s   t jdkr
| d td | jd W d    n1 sw   Y  td | jd W d    d S 1 s:w   Y  d S )Nr   rR  r  r%  r   )r   r   r   r   r   re   r   r   r   r    test_delete_hidden_file  s   



"zAPITest.test_delete_hidden_filec                 C   s   | j dd}| |jd dd d | | d d | | d d | ds0J t| j d	 }d
d |D }| 	d| | 
d| d S )Nr9  foo/z.ipynbr  r@   r  zz.ipynbr   r<   r   c                 S   r   r   r   r   r   r   r    r     r   z&APITest.test_rename.<locals>.<setcomp>r   )r   rh   r   r  r   rN   r   r.   rE   r   assertNotIn)r5   r   r   r   r   r   r    test_rename  s   zAPITest.test_renamec                 C   rC  rD  )r   r   r   r   r   rh   r   r   r   r    test_rename_400_hidden  s   





"zAPITest.test_rename_400_hiddenc           	      C   s   | j d}| j d}| }t|jd }t|}td}|j	| |dd}| j j
dt|d | j dd | | j d g  | j d }| ||g | j d | j d }| |g  d S )Nr9  r+   Created by testr(   r  r  rU  )r   rI   rn   rN   loadsr   r   r   r   r.  rc   rO   rh   r   rl   re   )	r5   origrcp1	nbcontentr)   hcellr  cpsr   r   r    test_checkpoints_follow_file  s    
z$APITest.test_checkpoints_follow_filec                 C   s<   t d | jdd W d    d S 1 sw   Y  d S )Ni  r9  zfoo/b.ipynb)r   r   rh   r   r   r   r    test_rename_existing  rB  zAPITest.test_rename_existingc                 C   s   | j d}t|jd }t|}|jtd |dd}| j j	dt
|d}| j d d }t|}| |jd jd d S )Nr9  r+   u   Created by test ³r(   r  r  r   )r   rI   rN   rZ  r   r   r   r.  r   rc   rO   r   source)r5   r   r^  r)   r  newnbr   r   r    	test_save  s   
zAPITest.test_savec           	      C   s  | j d}| j d}| |jd | }| t|ddh | |jd dd |d  t	|j
d }t|}td	}|j| |d
d}| j jdt|d}| j d }| ||g | j d d }t|}| |jd jd	 | j d|d }| |jd | j d d }t|}| |jg  | j d|d }| |jd | j d }| |g  d S )Nr9  r
  idlast_modifiedr  r@   r  r+   rY  r(   r  r  r   rG  )r   rI   rn   r   r  rN   r"   r  r   rZ  r   r   r   r   r.  rc   rO   rl   rc  rr   rt   )	r5   r   r\  r]  r^  r)   r_  r  r`  r   r   r    test_checkpoints  s4    
zAPITest.test_checkpointsc                 C   s^  d}| j |}t|jd }| j |}| |jd | }| t|ddh | |j	d 
dd |d  |d	 }|d
dd}| j j|t|d}| j | }| ||g | j | d }	| |	| | j ||d }| |jd | j | d }
| |
| | j ||d }| |jd | j | }| |g  dS )z;
        Test checkpointing of non-notebook files.
        z	foo/a.txtr+   r
  rf  rg  r  r@   r  z
second liner   r   )r+   r'   rG   r  rG  N)r   rI   rN   rZ  r   rn   r   r  r"   r  r   rc   rO   rl   rr   rt   )r5   filenamer   orig_contentr\  r]  new_contentr   r`  r+   restored_contentr   r   r    test_file_checkpoints  s4    zAPITest.test_file_checkpointsc                 c   s4    | j jj}|j}||_z	dV  W ||_dS ||_w )zK
        Temporarily patch the root dir of our checkpoint manager.
        N)r(   contents_managerrj   root_dir)r5   dirnamecpmold_dirnamer   r   r    patch_cp_root)  s   
zAPITest.patch_cp_rootc              	   C   s   t  !}| | |   W d   n1 sw   Y  W d   n1 s'w   Y  t  *}| | |   W d   n1 sDw   Y  W d   dS W d   dS 1 s\w   Y  dS )aR  
        Test that FileCheckpoints functions correctly even when it's
        using a different root dir from FileContentsManager.  This also keeps
        the implementation honest for use with ContentsManagers that don't map
        models to the filesystem

        Override this method to a no-op when testing other managers.
        N)r   rs  rh  rm  )r5   tdr   r   r    test_checkpoints_separate_root6  s   	

"z&APITest.test_checkpoints_separate_root)r(   )Dru   rv   rw   rx   r   r   r$   r   r   staticmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r	  r  r  r  r  r  r  r   r$  r&  r*  r1  r6  r8  r:  r?  rA  rE  rF  rH  rM  rQ  rS  rT  rW  rX  ra  rb  re  rh  rm  r   rs  ru  r   r   r   r    ry   {   s    





-	 &+
ry   c                   @   s&   e Zd ZdZe Zeej_dd Z	dS )GenericFileCheckpointsAPITestzA
    Run the tests from APITest with GenericFileCheckpoints.
    c                 C   s   |  | jjjt d S r3   )r   r(   rn  rj   r	   r   r   r   r    test_config_did_somethingO  s   z7GenericFileCheckpointsAPITest.test_config_did_somethingN)
ru   rv   rw   rx   r
   configr	   FileContentsManagercheckpoints_classrx  r   r   r   r    rw  H  s
    rw  )1rx   
contextlibr   	functoolsr   rN   r   r   r   unicodedatar   r<   joinpjoinrN  r   send2trash.exceptionsr   filecheckpointsr	   traitlets.configr
   notebook.utilsr   r   r   notebook.tests.launchnotebookr   r   r   r   r   nbformat.v4r   r   r   ipython_genutilsr   ipython_genutils.tempdirr   r  r   r   r$   r.   r1   r2   ry   rw  r   r   r   r    <module>   sB    	J     R