Ë
    :vžj×  ã                  ó  — 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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	lmZ dd
lmZ ddlmZ dZdd„Zdd„Zddd ee«      z
  f	 	 	 	 	 	 	 	 	 dd„Z G d„ de«      Z  G d„ deee«      Z!y)z-Tornado handlers for frontend config storage.é    )ÚannotationsN)ÚPath)ÚAny)Ú_tz)Ú
APIHandler)ÚExtensionHandlerJinjaMixinÚExtensionHandlerMixin)Úurl_path_join)Úweb)ÚLoggingConfigurablez.jupyterlab-workspacec                óx  — g }| j                  «       s|S | j                  «       D �cg c]>  }|j                  j                  |«      r!|j                  j	                  t
        «      r|‘Œ@ }}|j                  «        |D ]4  }| |z  }|j                  «       sŒt        |«      }|j                  |«       Œ6 |S c c}w )za
    Return the list of workspaces in a given directory beginning with the
    given prefix.
    )	ÚexistsÚiterdirÚnameÚ
startswithÚendswithÚWORKSPACE_EXTENSIONÚsortÚ_load_with_file_timesÚappend)Ú	directoryÚprefixÚ
workspacesÚitemÚitemsÚslugÚworkspace_pathÚ	workspaces           úu/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/jupyterlab_server/workspaces_handler.pyÚ_list_workspacesr       sº   € ð
 €JØ×ÑÔØÐð ×%Ñ%Ô'óá'ˆDØ�9‰9×Ñ Ô'¨D¯I©I×,>Ñ,>Ô?RÔ,Sò 	Ø'ð 
ð ð
 
‡J�J„LãˆØ(¨4Ñ/ˆØ× Ñ Õ"Ü-¨nÓ=ˆIØ×Ñ˜iÕ(ð	 ð Ðùòs   §AB7c                óx  — | j                  «       }| j                  d¬«      5 }t        j                  |«      }|d   j	                  t        j                  |j                  «      j                  «       t        j                  |j                  «      j                  «       ¬«       ddd«       |S # 1 sw Y   S xY w)z†
    Load workspace JSON from disk, overwriting the `created` and `last_modified`
    metadata with current file stat information
    úutf-8©ÚencodingÚmetadata)Úlast_modifiedÚcreatedN)
ÚstatÚopenÚjsonÚloadÚupdateÚtzÚutcfromtimestampÚst_mtimeÚ	isoformatÚst_ctime)r   r(   Úfidr   s       r   r   r   3   s›   € ð
 ×ÑÓ €DØ	×	Ñ	 gÐ	Ô	.°#Ü—I‘I˜c“Nˆ	Ø�*Ñ×$Ñ$Ü×-Ñ-¨d¯m©mÓ<×FÑFÓHÜ×'Ñ'¨¯©Ó6×@Ñ@ÓBð 	%ô 	
÷ 
/ð Ð÷ 
/ð Ðús   £BB/Â/B9Ú Té€   c                ó  — | j                  d«      r| nd| z   } d}|r=| dd }dt        j                  |j                  d«      «      j	                  «       dd z   }|j                  d«      r|nd|z   j                  «       }| j                  «       } d}t        t        |«      t        | «      «      }||k  r!||   | |   k(  r|dz  }||k  r||   | |   k(  rŒt        ||d | «      }t        j                  j                  |«      }t        j                  d	|«      j                  d
d«      j                  d
«      }t        j                   dd|«      j#                  «       }t        j                   dd|«      }|d|t        |«      z
   |z   S )aá  
    Use the common superset of raw and base values to build a slug shorter
    than max_length. By default, base value is an empty string.
    Convert spaces to hyphens. Remove characters that aren't alphanumerics
    underscores, or hyphens. Convert to lowercase. Strip leading and trailing
    whitespace.
    Add an optional short signature suffix to prevent collisions.
    Modified from Django utils:
    https://github.com/django/django/blob/master/django/utils/text.py
    Ú/r3   é   NÚ-r"   é   r   ÚNFKCÚasciiÚignorez[^\w\s-]z[-\s]+)r   ÚhashlibÚsha256ÚencodeÚ	hexdigestÚlowerÚminÚlenÚujoinÚurllibÚparseÚunquoteÚunicodedataÚ	normalizeÚdecodeÚreÚsubÚstrip)	ÚrawÚbaseÚsignÚ
max_lengthÚ	signatureÚdataÚcommonÚlimitÚvalues	            r   ÚslugifyrW   B   sm  € ð —‘ Ô$‰#¨#°©)€CØ€IÙØ�1�2ˆwˆØœ'Ÿ.™.¨¯©°WÓ)=Ó>×HÑHÓJÈ2ÈAÐNÑNˆ	Ø—O‘O CÔ(‰D¨c°D©j×?Ñ?ÓA€DØ
�)‰)‹+€CØ€FÜ”�D“	œ3˜s›8Ó$€EØ
�5Š.˜T &™\¨S°©[Ò8Ø�!‰ˆð �5Š.˜T &™\¨S°©[Ó8ä�$�v�w�- Ó%€EÜ�L‰L× Ñ  Ó'€EÜ×!Ñ! &¨%Ó0×7Ñ7¸ÀÓJ×QÑQÐRYÓZ€EÜ�F‰F�;  EÓ*×0Ñ0Ó2€EÜ�F‰F�9˜c 5Ó)€EØÐ.�:¤ I£Ñ.Ð/°)Ñ;Ð;ó    c                  óD   ‡ — e Zd ZdZdˆ fd„Zdd„Zd	d„Zd
d„Zdd„Zˆ xZ	S )ÚWorkspacesManagerzA manager for workspaces.c                óX   •— t        «        |sd}t        |«      ‚t        |«      | _        y)z9Initialize a workspaces manager with content in ``path``.zWorkspaces directory is not setN)ÚsuperÚ
ValueErrorr   Úworkspaces_dir)ÚselfÚpathÚmsgÚ	__class__s      €r   Ú__init__zWorkspacesManager.__init__e   s&   ø€ äŒÙØ3ˆCÜ˜S“/Ð!Ü" 4›jˆÕrX   c                ó®   — t        |«      }| j                  |t        z   z  }|j                  «       sd|›d|›d�}t	        |«      ‚|j                  «        y)z"Remove a workspace ``space_name``.z
Workspace z (z) not foundN)rW   r^   r   r   ÚFileNotFoundErrorÚunlink)r_   Ú
space_namer   r   ra   s        r   ÚdeletezWorkspacesManager.deletem   s[   € ä�zÓ"ˆØ×,Ñ,°Ô7JÑ0JÑKˆà×$Ñ$Ô&Ø˜z˜n¨B¨t¨h°kÐBˆCÜ# CÓ(Ð(ð 	×ÑÕrX   c                óH   — t        dd¬«      }t        | j                  |«      S )zList all available workspaces.r3   F)rP   )rW   r    r^   )r_   r   s     r   Úlist_workspacesz!WorkspacesManager.list_workspacesy   s!   € ä˜ %Ô(ˆÜ × 3Ñ 3°VÓ<Ð<rX   c                óè   — t        |«      }| j                  |t        z   z  }|j                  «       rt	        |«      S |j                  d«      r|nd|z   }t        t        «       t        |¬«      ¬«      S )z"Load the workspace ``space_name``.r6   )Úid)rS   r%   )rW   r^   r   r   r   r   Údict)r_   rg   r   r   Ú_ids        r   r+   zWorkspacesManager.load~   se   € ä�zÓ"ˆØ×,Ñ,°Ô7JÑ0JÑKˆà× Ñ Ô"ä(¨Ó8Ð8Ø&×1Ñ1°#Ô6‰j¸CÀ*Ñ<LˆÜœ›¬$°#¬,Ô7Ð7rX   c                ó*  — | j                   j                  «       s| j                   j                  d¬«       i }	 t        j                  «       }|j                  |«      }|d   d   }|j                  d«      r|nd|z   }t        j                  j                  |«      }|d|z   k7  rd|›d|›�}t        |«      ‚t        |«      }| j                   |t        z   z  }	|	j                  |d	¬
«       |	S # t        $ r}t        t        |«      «      |‚d}~ww xY w)z2Save the ``raw`` data as workspace ``space_name``.T)ÚparentsNr%   rl   r6   z)Workspace metadata ID mismatch: expected z got r"   r#   )r^   r   Úmkdirr*   ÚJSONDecoderrJ   Ú	Exceptionr]   Ústrr   rE   rF   rG   rW   r   Ú
write_text)
r_   rg   rN   r   ÚdecoderÚeÚmetadata_idÚmessager   r   s
             r   ÚsavezWorkspacesManager.save‰   s  € à×"Ñ"×)Ñ)Ô+Ø×Ñ×%Ñ%¨dÐ%Ô3àˆ	ð	,Ü×&Ñ&Ó(ˆGØŸ™ sÓ+ˆIð   
Ñ+¨DÑ1ˆØ%0×%;Ñ%;¸CÔ%@‘kÀcÈKÑFWˆÜ—l‘l×*Ñ*¨;Ó7ˆØ˜# 
Ñ*Ò*ØAÀ*ÀÈuÐU`ÐTcÐdˆGÜ˜WÓ%Ð%ä�zÓ"ˆØ×,Ñ,°Ô7JÑ0JÑKˆð 	×!Ñ! #°Ð!Ô8àÐøô% ò 	,ÜœS ›VÓ$¨!Ð+ûð	,ús   º%C/ Ã/	DÃ8DÄD)r`   rt   ÚreturnÚNone©rg   rt   r{   r|   )r{   Úlist)rg   rt   r{   rm   )rg   rt   rN   rt   r{   r   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__rc   rh   rj   r+   rz   Ú__classcell__©rb   s   @r   rZ   rZ   b   s   ø„ Ù#õ)ó
 ó=ó
	8÷rX   rZ   c                  óš   ‡ — e Zd ZdZdˆ fd„Zej                  dd„«       Zej                  dd	d„«       Zej                  ddd„«       Z	ˆ xZ
S )
ÚWorkspacesHandlerzA workspaces API handler.c                ó2   •— t         ‰| �  |«       || _        y)zInitialize the handler.N)r\   Ú
initializeÚmanager)r_   r   r‰   Úkwargsrb   s       €r   rˆ   zWorkspacesHandler.initialize¬   s   ø€ ä‰Ñ˜4Ô Øˆ�rX   c                óF  — |st        j                  dd«      ‚	 | j                  j                  |«       | j	                  d«      S # t
        $ r%}t        j                  dt        |«      «      |‚d}~wt        $ r%}t        j                  dt        |«      «      |‚d}~ww xY w)zRemove a workspaceé�  z%Workspace name is required for DELETEéÌ   i”  Néô  )r   Ú	HTTPErrorr‰   rh   Ú
set_statusre   rt   rs   )r_   rg   rw   s      r   rh   zWorkspacesHandler.delete±   s†   € ñ Ü—-‘- Ð%LÓMÐMð	4Ø�L‰L×Ñ 
Ô+Ø—?‘? 3Ó'Ð'øÜ ò 	4Ü—-‘- ¤S¨£VÓ,°!Ð3ûÜò 	4Ü—-‘- ¤S¨£VÓ,°!Ð3ûð	4ús#   š+A Á	B Á A/Á/B Á; BÂB c              ƒ  óÜ  K  — 	 |sv| j                   j                  «       }g }g }|D ]*  }|j                  |d   d   «       |j                  |«       Œ, | j                  t	        j
                  d||dœi«      «      S | j                   j                  |«      }| j                  t	        j
                  |«      «      S # t        $ r%}t        j                  dt        |«      «      |‚d}~ww xY w­w)zGet workspace(s) datar%   rl   r   )ÚidsÚvaluesrŽ   N)r‰   rj   r   Úfinishr*   Údumpsr+   rs   r   r�   rt   )r_   rg   r   r’   r“   r   rw   s          r   ÚgetzWorkspacesHandler.get¿   sÍ   è ø€ ð	4ÙØ!Ÿ\™\×9Ñ9Ó;�
Ø�Ø�Û!+�IØ—J‘J˜y¨Ñ4°TÑ:Ô;Ø—M‘M )Õ,ð ",ð —{‘{¤4§:¡:¨|ÀSÐTZÑ=[Ð.\Ó#]Ó^Ð^àŸ™×)Ñ)¨*Ó5ˆIØ—;‘;œtŸz™z¨)Ó4Ó5Ð5øÜò 	4Ü—-‘- ¤S¨£VÓ,°!Ð3ûð	4üs5   ‚C,„A7B; Á;C,Á<>B; Â:C,Â;	C)Ã C$Ã$C)Ã)C,c                ó°  — |st        j                  dd«      ‚| j                  j                  j	                  «       j                  d«      }	 | j                  j                  ||«       | j                  d«       y# t        $ r%}t        j                  dt        |«      «      |‚d}~wt        $ r%}t        j                  dt        |«      «      |‚d}~ww xY w)zUpdate workspace datarŒ   z#Workspace name is required for PUT.r"   NrŽ   r�   )r   r�   ÚrequestÚbodyrM   rJ   r‰   rz   r]   rt   rs   r�   )r_   rg   rN   rw   s       r   ÚputzWorkspacesHandler.putÒ   s¬   € ñ Ü—-‘- Ð%JÓKÐKà�l‰l×Ñ×%Ñ%Ó'×.Ñ.¨wÓ7ˆð	4Ø�L‰L×Ñ˜j¨#Ô.ð 	�‰˜Õøô ò 	4Ü—-‘- ¤S¨£VÓ,°!Ð3ûÜò 	4Ü—-‘- ¤S¨£VÓ,°!Ð3ûð	4ús$   ÁA; Á;	CÂ B$Â$CÂ0 CÃC)r   rt   r‰   rZ   rŠ   r   r{   r|   r}   )r3   )rg   rt   r{   r   )r   r€   r�   r‚   rˆ   r   Úauthenticatedrh   r–   rš   rƒ   r„   s   @r   r†   r†   ©   sY   ø„ Ù#õð
 	×Ñò4ó ð4ð 	×Ñó4ó ð4ð$ 	×Ñóó ôrX   r†   )r   r   r   rt   r{   zlist[dict[str, Any]])r   r   r{   rm   )
rN   rt   rO   rt   rP   ÚboolrQ   Úintr{   rt   )"r‚   Ú
__future__r   r=   r*   rK   rH   rE   Úpathlibr   Útypingr   Újupyter_serverr   r-   Újupyter_server.base.handlersr   Ú jupyter_server.extension.handlerr   r	   Újupyter_server.utilsr
   rD   Útornador   Útraitlets.configr   r   r    r   rC   rW   rZ   r†   © rX   r   Ú<module>r¨      sª   ðÙ 3õ #ã Û Û 	Û Û Ý Ý å $Ý 3ß ^Ý 7Ý Ý 0ð .Ð óó2ð  ¨4À3ÉÐM`ÓIaÑCað<Ø	ð<Øð<Ø$(ð<Ø=@ð<àó<ô@DÐ+ô DôN9Ð-Ð/IÈ:õ 9rX   