Ë
    „Ÿõfò&  ã                   ó    — d Z ddlZddlmZmZmZ ddlmZmZm	Z	m
Z
mZ ddlmZmZmZ ddlmZ  G d„ d	e ee«      «      Z G d
„ deee¬«      Zy)zKernel Provisioner Classesé    N)ÚABCÚABCMetaÚabstractmethod)ÚAnyÚDictÚListÚOptionalÚUnion)ÚInstanceÚLoggingConfigurableÚUnicodeé   )ÚKernelConnectionInfoc                   ó   — e Zd Zy)ÚKernelProvisionerMetaN)Ú__name__Ú
__module__Ú__qualname__© ó    úg/var/www/cvtools/html/venv/lib/python3.12/site-packages/jupyter_client/provisioning/provisioner_base.pyr   r      s   „ Ør   r   c                   ó  — e Zd ZU dZ edd¬«      Zeed<    edd¬«      Z	e
eef   ed<   i Zeed<   eed	efd
„«       «       Zed	ee   fd„«       Zed	ee   fd„«       Zeded	dfd„«       Zed#ded	dfd„«       Zed#ded	dfd„«       Zedee   ded	efd„«       Zed#ded	dfd„«       Zd#ded	dfd„Zded	eeef   fd„Zded	dfd„Zd	eeef   fd„Z ded	dfd„Z!d$de"d	e"fd„Z#d%de"d	e"fd„Z$deeef   d	dfd „Z%d!eeef   d	eeef   fd"„Z&y)&ÚKernelProvisionerBaseaã  
    Abstract base class defining methods for KernelProvisioner classes.

    A majority of methods are abstract (requiring implementations via a subclass) while
    some are optional and others provide implementations common to all instances.
    Subclasses should be aware of which methods require a call to the superclass.

    Many of these methods model those of :class:`subprocess.Popen` for parity with
    previous versions where the kernel process was managed directly.
    z$jupyter_client.kernelspec.KernelSpecT)Ú
allow_noneÚkernel_specNÚ	kernel_idÚconnection_infoÚreturnc                  ó   — y)zÙ
        Returns true if this provisioner is currently managing a process.

        This property is asserted to be True immediately following a call to
        the provisioner's :meth:`launch_kernel` method.
        Nr   ©Úselfs    r   Úhas_processz!KernelProvisionerBase.has_process$   s   € ð 	r   c              ƒ   ó   K  — y­w)zä
        Checks if kernel process is still running.

        If running, None is returned, otherwise the process's integer-valued exit code is returned.
        This method is called from :meth:`KernelManager.is_alive`.
        Nr   r    s    r   ÚpollzKernelProvisionerBase.poll/   ó   è ø€ ð 	ùó   ‚c              ƒ   ó   K  — y­w)zó
        Waits for kernel process to terminate.

        This method is called from `KernelManager.finish_shutdown()` and
        `KernelManager.kill_kernel()` when terminating a kernel gracefully or
        immediately, respectively.
        Nr   r    s    r   ÚwaitzKernelProvisionerBase.wait9   s   è ø€ ð 	ùr&   Úsignumc              ƒ   ó   K  — y­w)z»
        Sends signal identified by signum to the kernel process.

        This method is called from `KernelManager.signal_kernel()` to send the
        kernel process a signal.
        Nr   )r!   r)   s     r   Úsend_signalz!KernelProvisionerBase.send_signalD   r%   r&   Úrestartc              ƒ   ó   K  — y­w)aL  
        Kill the kernel process.

        This is typically accomplished via a SIGKILL signal, which cannot be caught.
        This method is called from `KernelManager.kill_kernel()` when terminating
        a kernel immediately.

        restart is True if this operation will precede a subsequent launch_kernel request.
        Nr   ©r!   r,   s     r   ÚkillzKernelProvisionerBase.killN   s   è ø€ ð 	ùr&   c              ƒ   ó   K  — y­w)a©  
        Terminates the kernel process.

        This is typically accomplished via a SIGTERM signal, which can be caught, allowing
        the kernel provisioner to perform possible cleanup of resources.  This method is
        called indirectly from `KernelManager.finish_shutdown()` during a kernel's
        graceful termination.

        restart is True if this operation precedes a start launch_kernel request.
        Nr   r.   s     r   Ú	terminatezKernelProvisionerBase.terminate[   s   è ø€ ð 	ùr&   ÚcmdÚkwargsc              ‹   ó   K  — y­w)zÑ
        Launch the kernel process and return its connection information.

        This method is called from `KernelManager.launch_kernel()` during the
        kernel manager's start kernel sequence.
        Nr   )r!   r2   r3   s      r   Úlaunch_kernelz#KernelProvisionerBase.launch_kerneli   r%   r&   c              ƒ   ó   K  — y­w)a"  
        Cleanup any resources allocated on behalf of the kernel provisioner.

        This method is called from `KernelManager.cleanup_resources()` as part of
        its shutdown kernel sequence.

        restart is True if this operation precedes a start launch_kernel request.
        Nr   r.   s     r   ÚcleanupzKernelProvisionerBase.cleanups   ó   è ø€ ð 	ùr&   c              ƒ   ó   K  — y­w)a‚  
        Allows the provisioner to determine if the kernel's shutdown has been requested.

        This method is called from `KernelManager.request_shutdown()` as part of
        its shutdown sequence.

        This method is optional and is primarily used in scenarios where the provisioner
        may need to perform other operations in preparation for a kernel's shutdown.
        Nr   r.   s     r   Úshutdown_requestedz(KernelProvisionerBase.shutdown_requested   r8   r&   c              ‹   óÖ   K  — |j                  dt        j                  «      j                  «       }|j	                  | j                  |«      «       | j                  |«       ||d<   |S ­w)a(  
        Perform any steps in preparation for kernel process launch.

        This includes applying additional substitutions to the kernel launch command
        and environment. It also includes preparation of launch parameters.

        NOTE: Subclass implementations are advised to call this method as it applies
        environment variable substitutions from the local environment and calls the
        provisioner's :meth:`_finalize_env()` method to allow each provisioner the
        ability to cleanup the environment variables that will be used by the kernel.

        This method is called from `KernelManager.pre_start_kernel()` as part of its
        start kernel sequence.

        Returns the (potentially updated) keyword arguments that are passed to
        :meth:`launch_kernel()`.
        Úenv)ÚpopÚosÚenvironÚcopyÚupdateÚ/_KernelProvisionerBase__apply_env_substitutionsÚ_finalize_env)r!   r3   r<   s      r   Ú
pre_launchz KernelProvisionerBase.pre_launch‹   sX   è ø€ ð$ j‰j˜¤§
¡
Ó+×0Ñ0Ó2ˆØ
‰
4×1Ñ1°#Ó6Ô7Ø×Ñ˜3ÔØˆˆu‰àˆùs   ‚A'A)c              ‹   ó   K  — y­w)z¾
        Perform any steps following the kernel process launch.

        This method is called from `KernelManager.post_start_kernel()` as part of its
        start kernel sequence.
        Nr   )r!   r3   s     r   Úpost_launchz!KernelProvisionerBase.post_launch¤   s   è ø€ ð 	ùr&   c              ƒ   óN   K  — i }| j                   |d<   | j                  |d<   |S ­w)aÞ  
        Captures the base information necessary for persistence relative to this instance.

        This enables applications that subclass `KernelManager` to persist a kernel provisioner's
        relevant information to accomplish functionality like disaster recovery or high availability
        by calling this method via the kernel manager's `provisioner` attribute.

        NOTE: The superclass method must always be called first to ensure proper serialization.
        r   r   ©r   r   ©r!   Úprovisioner_infos     r   Úget_provisioner_infoz*KernelProvisionerBase.get_provisioner_info­   s5   è ø€ ð ,.ÐØ(,¯©Ð˜Ñ%Ø.2×.BÑ.BÐÐ*Ñ+ØÐùs   ‚#%rJ   c              ƒ   ó4   K  — |d   | _         |d   | _        y­w)aç  
        Loads the base information necessary for persistence relative to this instance.

        The inverse of `get_provisioner_info()`, this enables applications that subclass
        `KernelManager` to re-establish communication with a provisioner that is managing
        a (presumably) remote kernel from an entirely different process that the original
        provisioner.

        NOTE: The superclass method must always be called first to ensure proper deserialization.
        r   r   NrH   rI   s     r   Úload_provisioner_infoz+KernelProvisionerBase.load_provisioner_info¼   s"   è ø€ ð *¨+Ñ6ˆŒØ/Ð0AÑBˆÕùs   ‚Úrecommendedc                 ó   — |S )aE  
        Returns the time allowed for a complete shutdown. This may vary by provisioner.

        This method is called from `KernelManager.finish_shutdown()` during the graceful
        phase of its kernel shutdown sequence.

        The recommended value will typically be what is configured in the kernel manager.
        r   ©r!   rN   s     r   Úget_shutdown_wait_timez,KernelProvisionerBase.get_shutdown_wait_timeÊ   s
   € ð Ðr   c                 ó   — |S )zÚ
        Returns the expected upper bound for a kernel (re-)start to complete.
        This may vary by provisioner.

        The recommended value will typically be what is configured in the kernel restarter.
        r   rP   s     r   Úget_stable_start_timez+KernelProvisionerBase.get_stable_start_timeÕ   s
   € ð Ðr   r<   c                 ó¾   — | j                   j                  rG| j                   j                  j                  «       j                  d«      r|j	                  dd«       yyy)zþ
        Ensures env is appropriate prior to launch.

        This method is called from `KernelProvisionerBase.pre_launch()` during the kernel's
        start sequence.

        NOTE: Subclasses should be sure to call super()._finalize_env(env)
        ÚpythonÚPYTHONEXECUTABLEN)r   ÚlanguageÚlowerÚ
startswithr=   )r!   r<   s     r   rC   z#KernelProvisionerBase._finalize_envÞ   sP   € ð ×Ñ×$Ò$¨×)9Ñ)9×)BÑ)B×)HÑ)HÓ)J×)UÑ)UÐV^Ô)_ð G‰GÐ&¨Õ-ð *`Ð$r   Úsubstitution_valuesc                 óÚ   — i }| j                   r\ddlm} | j                   j                  }|j	                  «       D ]-  \  }}|j                  | ||«      j                  |«      i«       Œ/ |S )aq  
        Walks entries in the kernelspec's env stanza and applies substitutions from current env.

        This method is called from `KernelProvisionerBase.pre_launch()` during the kernel's
        start sequence.

        Returns the substituted list of env entries.

        NOTE: This method is private and is not intended to be overridden by provisioners.
        r   )ÚTemplate)r   Ústringr\   r<   ÚitemsrA   Úsafe_substitute)r!   rZ   Úsubstituted_envr\   Útemplated_envÚkÚvs          r   Ú__apply_env_substitutionsz/KernelProvisionerBase.__apply_env_substitutionsì   so   € ð ˆØ×ÒÝ'ð
 !×,Ñ,×0Ñ0ˆMØ%×+Ñ+Ó-ò ^‘1Ø×&Ñ&¨©8°A«;×+FÑ+FÐGZÓ+[Ð'\Õ]ð^àÐr   )F)g      @)g      $@)'r   r   r   Ú__doc__r   r   r   Ú__annotations__r   r   r
   Ústrr   r   Úpropertyr   Úboolr"   r	   Úintr$   r(   r+   r/   r1   r   r5   r7   r:   r   rD   rF   rK   rM   ÚfloatrQ   rS   rC   rB   r   r   r   r   r      s*  … ñ	ñ  Ð FÐSWÔX€KÓXÙ%,¨T¸dÔ%C€IˆuS˜'\Ñ"ÓCØ,.€OÐ)Ó.àØð˜Tò ó ó ðð ð˜H S™Mò ó ðð ð˜H S™Mò ó ðð ð¨ð °ò ó ðð ñ
 $ð 
°4ò 
ó ð
ð ñ tð ¸ò ó ðð ð t¨C¡yð ¸Cð ÐDXò ó ðð ñ	 Tð 	°dò 	ó ð	ñ
°ð 
Àó 
ð¨ð °°c¸3°h±ó ð2¨#ð °$ó ð ¨D°°c°©Nó  ðC¸Dð CÀTó Cñ	°%ð 	À%ó 	ñ°ð À%ó ð.  c¨3 h¡ð .°Dó .ð¸TÀ#ÀsÀ(¹^ð ÐPTÐUXÐZ]ÐU]ÑP^ô r   r   )Ú	metaclass)re   r>   Úabcr   r   r   Útypingr   r   r   r	   r
   Útraitlets.configr   r   r   Úconnectr   Útyper   r   r   r   r   ú<module>rr      sK   ðÙ  ó 
ß ,Ñ ,ß 3Õ 3ç CÑ Cå *ô	˜G¡TÐ*=Ó%>ô 	ôpØÐ	Ð(=öpr   