Ë
    ÁvžjJ'  ã                   ó€  — d Z ddlZddlZddlZddlmc 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 ddlmZ dd	lmZ dd
lmZmZ ddlmZ dZdZdZ de!fd„Z" ed¬«       G d„ d«      «       Z# G d„ dejH                  «      Z% G d„ de%«      Z& G d„ de%«      Z' G d„ de«      Z( G d„ de«      Z)dZ*d Z+y)!z%Announcements handler for JupyterLab.é    N)Ú	Awaitable)ÚasdictÚ	dataclassÚfield)ÚdatetimeÚtimezone)ÚOptionalÚUnion)Ú
APIHandler)Ú
translator)Úparse)Ú
httpclientÚweb)Ú__version__z%Y-%m-%dT%H:%M:%S%zz%https://pypi.org/pypi/jupyterlab/jsonz7https://github.com/jupyterlab/jupyterlab/releases/tag/vÚdt_strc                 óN   — t        j                  | «      j                  «       dz  S )Niè  )r   ÚfromisoformatÚ	timestamp)r   s    úr/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/jupyterlab/handlers/announcements.pyÚformat_datetimer      s!   € Ü×!Ñ! &Ó)×3Ñ3Ó5¸Ñ<Ð<ó    T)Úfrozenc                   ó€   — e Zd ZU dZeed<   eed<   eed<   dZeed<    ee	¬«      Z
e	eef   ed<    ee¬«      Zeed	<   y
)ÚNotificationuK  Notification

    Attributes:
        createdAt: Creation date
        message: Notification message
        modifiedAt: Modification date
        type: Notification type â€” ["default", "error", "info", "success", "warning"]
        link: Notification link button as a tuple (label, URL)
        options: Notification options
    Ú	createdAtÚmessageÚ
modifiedAtÚdefaultÚtype)Údefault_factoryÚlinkÚoptionsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚfloatÚ__annotations__Ústrr   r   Útupler!   Údictr"   © r   r   r   r      sJ   … ñ	ð ÓØƒLØÓØ€Dˆ#ÓÙ!°%Ô8€Dˆ%��S�‰/Ó8Ù¨$Ô/€GˆTÔ/r   r   c                   óp   — e Zd ZdZdeddfd„Zej                  dee	dee
ee
eef   f   f      fd„«       Zy)ÚCheckForUpdateABCzÑAbstract class to check for update.

    Args:
        version: Current JupyterLab version

    Attributes:
        version - str: Current JupyterLab version
        logger - logging.Logger: Server logger
    ÚversionÚreturnNc                 ó   — || _         y ©N)r/   )Úselfr/   s     r   Ú__init__zCheckForUpdateABC.__init__?   s	   € Øˆ�r   c              ƒ   ó$   K  — d}t        |«      ‚­w)a  Get the notification message if a new version is available.

        Returns:
            None if there is not update.
            or the notification message
            or the notification message and a tuple(label, URL link) for the user to get more information
        z-CheckForUpdateABC.__call__ is not implemented)ÚNotImplementedError)r3   Úmsgs     r   Ú__call__zCheckForUpdateABC.__call__B   s   è ø€ ð >ˆÜ! #Ó&Ð&ùs   ‚)r#   r$   r%   r&   r)   r4   ÚabcÚabstractmethodr   r
   r*   r8   r,   r   r   r.   r.   4   s_   „ ñð ð ¨ó ð 	×Ñð	' 	¨%°°c¸5ÀÀeÈCÐQTÈHÁoÐAUÑ;VÐ0VÑ*WÑ Xò 	'ó ñ	'r   r.   c                   ó6   — e Zd ZdZdeeeeeef   f      fd„Zy)ÚCheckForUpdatezÐDefault class to check for update.

    Args:
        version: Current JupyterLab version

    Attributes:
        version - str: Current JupyterLab version
        logger - logging.Logger: Server logger
    r0   c              ƒ   ó  K  — t        j                  «       }	 |j                  t        ddi¬«      ƒ d{  –—† }t	        j
                  |j                  «      j                  d«      }|d   }t        | j                  «      t        |«      k  rEt        j                  d«      }|j                  d|› d	�«      |j                  d
«      t        › |› �ffS y7 Œž# t        $ r'}| j                  j!                  d|¬«       Y d}~yd}~ww xY w­w)á  Get the notification message if a new version is available.

        Returns:
            None if there is no update.
            or the notification message
            or the notification message and a tuple(label, URL link) for the user to get more information
        úContent-Typezapplication/json©ÚheadersNÚinfor/   Ú
jupyterlabzA newer version (z) of JupyterLab is available.u   Read moreâ€¦zFailed to get latest version©Úexc_info)r   ÚAsyncHTTPClientÚfetchÚJUPYTERLAB_LAST_RELEASE_URLÚjsonÚloadsÚbodyÚgetr   r/   r   ÚloadÚ__ÚJUPYTERLAB_RELEASE_URLÚ	ExceptionÚloggerÚdebug)r3   Úhttp_clientÚresponseÚdataÚlast_versionÚtransÚes          r   r8   zCheckForUpdate.__call__Z   s  è ø€ ô !×0Ñ0Ó2ˆð	Ø(×.Ñ.Ü+Ø'Ð);Ð<ð /ó ÷ ˆHô —:‘:˜hŸm™mÓ,×0Ñ0°Ó8ˆDØ 	™?ˆLô
 �T—\‘\Ó"¤U¨<Ó%8Ò8Ü"Ÿ™¨Ó5�à—H‘HÐ0°°Ð>[Ð\Ó]Ø—X‘X˜nÓ-Ô2HÐ1IÈ,ÈÐ/XÐYðð ð
 ð#ùô ò 	Ø�K‰K×ÑÐ<ÀqÐÔIÜûð	üs?   ‚D˜C ´Cµ7C Á,A'DÃC Ã	DÃD Ã;DÄ DÄDN)r#   r$   r%   r&   r   r*   r)   r8   r,   r   r   r<   r<   O   s*   „ ñð 	¨%°°U¸3À¸8±_Ð0DÑ*EÑ Fô r   r<   c                   ó"   — e Zd ZdZded   fd„Zy)ÚNeverCheckForUpdatea7  Check update version that does nothing.

    This is provided for administrators that want to
    turn off requesting external resources.

    Args:
        version: Current JupyterLab version

    Attributes:
        version - str: Current JupyterLab version
        logger - logging.Logger: Server logger
    r0   Nc              ƒ   ó   K  — y­w)r>   Nr,   )r3   s    r   r8   zNeverCheckForUpdate.__call__†   s   è ø€ ð ùs   ‚)r#   r$   r%   r&   r   r8   r,   r   r   rZ   rZ   x   s   „ ñð 	¨$¡ô r   rZ   c                   óZ   ‡ — e Zd ZdZ	 ddee   ddfˆ fd„Zej                  d„ «       Z	ˆ xZ
S )ÚCheckForUpdateHandlerziCheck for Updates API handler.

    Args:
        update_check: The class checking for a new version
    NÚupdate_checkerr0   c                 óˆ   •— t         ‰| �  «        |€t        t        «      n|| _        | j
                  | j                  _        y r2   )ÚsuperÚ
initializerZ   r   r^   ÚlogrQ   )r3   r^   Ú	__class__s     €r   ra   z CheckForUpdateHandler.initialize˜   s<   ø€ ô 	‰ÑÔà0>Ð0FÔ¤Ô,ÈNð 	Ôð &*§X¡Xˆ×ÑÕ"r   c              ƒ   óü  K  — d}| j                  «       ƒ d{  –—† }|r–t        |t        «      r|dfn|\  }}t        j                  t
        j                  ¬«      j                  «       dz  }t        j                  |j                  «       «      j                  «       }t        |||d|d|dgdœi¬	«      }| j                  d
«       | j                  t        j                   d|€dn
t#        |«      i«      «       y7 Œá­w)z€Check for updates.
        Response:
            {
                "notification": Optional[Notification]
            }
        Nr,   )Útzg     @�@rB   rU   Úupdate©ÚidÚtags©r   r   r   r   r!   r"   éÈ   Únotification)r^   Ú
isinstancer)   r   Únowr   Úutcr   ÚhashlibÚsha1ÚencodeÚ	hexdigestr   Ú
set_statusÚfinishrI   Údumpsr   )r3   rl   Úoutr   r!   rn   Úhash_s          r   rL   zCheckForUpdateHandler.get¢   sÜ   è ø€ ð ˆØ×'Ñ'Ó)×)ˆÙÜ)3°C¼Ô)=˜S "™IÀ3‰MˆG�TÜ—,‘,¤(§,¡,Ô/×9Ñ9Ó;¸fÑDˆCÜ—L‘L §¡Ó!1Ó2×<Ñ<Ó>ˆEÜ'ØØØØØØ¨¸°zÑ!BÐCôˆLð 	�‰˜ÔØ�‰Ü�J‰J˜°Ð0D©Ì&ÐQ]ÓJ^Ð_Ó`õ	
ð *ús   ‚C<˜C:™C"C<r2   )r#   r$   r%   r&   r	   r<   ra   r   ÚauthenticatedrL   Ú__classcell__©rc   s   @r   r]   r]   ‘   sC   ø„ ñð 48ñ.à  Ñ0ð.ð 
õ.ð 	×Ññ
ó ô
r   r]   c                   óZ   ‡ — e Zd ZdZ	 ddee   ddfˆ fd„Zej                  d„ «       Z	ˆ xZ
S )ÚNewsHandlerzSNews API handler.

    Args:
        news_url: The Atom feed to fetch for news
    NÚnews_urlr0   c                 ó0   •— t         ‰| �  «        || _        y r2   )r`   ra   r~   )r3   r~   rc   s     €r   ra   zNewsHandler.initializeÆ   s   ø€ ô 	‰ÑÔØ ˆ�r   c              ƒ   óö  ‡
‡K  — g }t        j                  «       }| j                  �Át        j                  d«      Š
ddiŠ‰j                  «       D ]  \  }}t        j                  ||«       Œ 	 |j                  | j                  ddi¬«      ƒ d{  –—† }t        j                  |j                  «      }ˆ
ˆfd„}t        ||j                  d	‰«      «      }|j                  |«       | j#                  d«       | j%                  t'        j(                  dt+        t        t,        |«      «      i«      «       y7 Œ¥# t        $ r4}	| j                  j!                  d
| j                  › �|	¬«       Y d}	~	Œ‰d}	~	ww xY w­w)zpGet the news.

        Response:
            {
                "news": List[Notification]
            }
        NrC   Úatomzhttp://www.w3.org/2005/Atomr?   zapplication/atom+xmlr@   c                 ó.  •‡ — ddt         dt        t            dt         fˆ ˆfd„} |d«      } |d«      } |d«      } |d|«      } |d	d
¬«      }‰ j                  d‰«      }t        |«      dkD  r#t	        t        d„ |«      «      }|r|d   n|d   }	nt        |«      dk(  r|d   nd }	|	�|	j                  d«      nd }
|rdj                  ||g«      n|}t        |«      }t        |«      }t        |||d|
€d n‰j                  d«      |
fd|dgdœi¬«      }|S )NÚattrr   r0   c                 ór   •— ‰j                  d| › �‰«      }|�|j                  S |�|S d| › �}t        |«      ‚)Nzatom:z7atom feed entry does not contain a required attribute: )ÚfindÚtextÚKeyError)rƒ   r   Ú	node_itemÚerror_mÚnodeÚxml_namespacess       €€r   Úget_xml_textz:NewsHandler.get.<locals>.build_entry.<locals>.get_xml_textê   sU   ø€ Ø$(§I¡I°°d°V¨n¸nÓ$M˜	Ø$Ð0Ø#,§>¡>Ð1Ø$Ð0Ø#*˜Nð #ZÐZ^ÐY_Ð `ð $ô #+¨7Ó"3Ð3r   Útitlerh   ÚupdatedÚ	publishedÚsummaryÚ )r   z	atom:linké   c                 ó*   — | j                  d«      dk(  S )NÚrelÚ	alternate)rL   )Úelems    r   Ú<lambda>z6NewsHandler.get.<locals>.build_entry.<locals>.<lambda>ý   s   € ¸T¿X¹XÀe»_ÐP[Ò=[r   r   ÚhrefÚ
rB   zOpen full postrU   Únewsrg   rj   r2   )r)   r	   ÚfindallÚlenÚlistÚfilterrL   Újoinr   r   rN   )rŠ   rŒ   Úentry_titleÚentry_idÚentry_updatedÚentry_publishedÚentry_summaryÚlinksr•   Ú	link_nodeÚ
entry_linkr   Úmodified_atÚ
created_atrl   rW   r‹   s   `              €€r   Úbuild_entryz$NewsHandler.get.<locals>.build_entryé   sP  ù€ ñ
4¬3ð 
4¼Ä#¹ð 
4ÔRUö 
4ñ #/¨wÓ"7�KÙ+¨DÓ1�HÙ$0°Ó$;�MÙ&2°;ÀÓ&N�OÙ$0°ÀBÔ$G�MØ ŸL™L¨°nÓE�EÜ˜5“z A’~Ü$(¬Ñ0[Ð]bÓ)cÓ$d˜	Ù4= I¨a¢LÀ5ÈÁ8™	ä03°E³
¸a² E¨!¢HÀT˜	Ø:CÐ:O §¡¨vÔ!6ÐUY�Jñ DQ˜Ÿ	™	 ;°Ð">Ô?ÐVað ô #2°-Ó"@�KÜ!0°Ó!A�JÜ#/Ø 'Ø",Ø#.Ø#à%Ð-ñ "ð "ŸH™HÐ%5Ó6Ø&ðð
 #Ø&.Ø)/¨ñ%ð!ô$�Lð$ (Ð'r   z
atom:entryz,Failed to get announcements from Atom feed: rD   rk   rš   )r   rF   r~   r   rM   ÚitemsÚETÚregister_namespacerG   Ú
fromstringrK   Úmapr›   ÚextendrP   rb   rR   rt   ru   rI   rv   r�   r   )r3   rš   rS   ÚkeyÚspecrT   Útreerª   ÚentriesrX   rW   r‹   s             @@r   rL   zNewsHandler.getÍ   sN  ùè ø€ ð ˆä ×0Ñ0Ó2ˆà�=‰=Ð$Ü—O‘O LÓ1ˆEð %Ð&CÐDˆNØ+×1Ñ1Ö3‘	��TÜ×%Ñ% c¨4Õ0ð 4ð@Ø!,×!2Ñ!2Ø—M‘MØ+Ð-CÐDð "3ó "÷ �ô —}‘} X§]¡]Ó3�õ1(ôf ˜k¨4¯<©<¸ÀnÓ+UÓV�Ø—‘˜GÔ$ð 	�‰˜ÔØ�‰”D—J‘J ¬¬S´¸Ó->Ó(?Ð@ÓAÕBðEùôv ò Ø—‘—‘ØBÀ4Ç=Á=À/ÐRØð ÷ ñ ûðüsD   „A*E9Á/"D9 ÂD7ÂAD9 Ã(AE9Ä7D9 Ä9	E6Å*E1Å,E9Å1E6Å6E9r2   )r#   r$   r%   r&   r	   r)   ra   r   ry   rL   rz   r{   s   @r   r}   r}   ¿   sF   ø„ ñð #'ñ!à˜3‘-ð!ð 
õ!ð 	×ÑñWCó ôWCr   r}   z/lab/api/newsz/lab/api/update),r&   r9   rp   rI   Úxml.etree.ElementTreeÚetreeÚElementTreer¬   Úcollections.abcr   Údataclassesr   r   r   r   r   Útypingr	   r
   Újupyter_server.base.handlersr   Ú#jupyterlab_server.translation_utilsr   Úpackaging.versionr   Útornador   r   Újupyterlab._versionr   ÚISO8601_FORMATrH   rO   r)   r   r   ÚABCr.   r<   rZ   r]   r}   Únews_handler_pathÚcheck_update_handler_pathr,   r   r   Ú<module>rÄ      sÉ   ðÙ +ó
 Û Û ß "Ð "Ý %ß 0Ñ 0ß 'ß "å 3Ý :Ý #ß #å +à&€ØEÐ ØRÐ ð=˜Có =ñ �$Ô÷0ð 0ó ð0ô('˜Ÿ™ô 'ô6&Ð&ô &ôRÐ+ô ô2+
˜Jô +
ô\fC�*ô fCðR %Ð Ø.Ñ r   