o
    œh›Ã  ã                   @  sÎ  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	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ZddlmZ ddlmZ ddlmZmZmZmZmZ ddlmZ ejd	krhdd
lmZ ndZzddlmZ  W n e!y~   ej Z Y nw 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*m+Z+ ddl,m-Z- ddl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z? ddl@mAZA dd„ ZBG dd„ de-ƒZCdS )z9Base class for a kernel that talks to frontends over 0MQ.é    )ÚannotationsN)Údatetime)Úpartial)ÚSIGINTÚSIGTERMÚSignalsÚdefault_int_handlerÚsignalé   )ÚCONTROL_THREAD_NAMEÚwin32)ÚSIGKILLzwindown-SIGKILL-sentinel)Úutcnow©ÚStdinNotImplementedError)ÚSession)Úioloop)ÚQueueÚ
QueueEmpty)ÚSingletonConfigurable)ÚAnyÚBoolÚDictÚFloatÚInstanceÚIntegerÚListÚSetÚUnicodeÚdefaultÚobserve)Ú	ZMQStream)Ú
json_clean)Úkernel_protocol_version)Ú	OutStreamc                 C  sb   t  | ¡j}dd„ |D ƒ}|D ]}| |¡}|o |j|j|jfv p+tdd„ | ¡ D ƒƒ||< q|S )Nc                 S  s   i | ]}|d “qS ©F© )Ú.0Úparamr&   r&   úJc:\Users\shubh\Videos\agent\nova\Lib\site-packages\ipykernel/kernelbase.pyÚ
<dictcomp>E   s    z'_accepts_parameters.<locals>.<dictcomp>c                 s  s   � | ]	}|j |jkV  qd S ©N)ÚkindÚVAR_KEYWORD)r'   Úpr&   r&   r)   Ú	<genexpr>L   s   € z&_accepts_parameters.<locals>.<genexpr>)	ÚinspectÚ	signatureÚ
parametersÚgetr,   ÚKEYWORD_ONLYÚPOSITIONAL_OR_KEYWORDÚanyÚvalues)ÚmethZparam_namesr2   Zacceptsr(   Z
param_specr&   r&   r)   Ú_accepts_parametersC   s   
þýr9   c                      s<  e Zd ZU dZedƒZi Zded< edƒdd„ ƒZ	e
edd	�Ze
d
dd	�Ze
edd	�Zedd�Zded< ded< ded< ded< edƒdd„ ƒZedƒdd„ ƒZe
edd	�Zeƒ Zeƒ Zeƒ Zeƒ Zeƒ Ze
ejdd	�Zded< edƒZe ƒ Z!edƒdd„ ƒZ"i Z#ded< eƒ Z$ded < e%dd!d�j&dd"�Z'e%dd#d�j&dd"�Z(e%d$ƒZ)e*i i d%œƒZ+d&ed'< e*d(d(d%œƒZ,e-d)d*„ ƒZ.e/d+ƒj&dd"�Z0e/d,ƒj&dd"�Z1e/d-dd.d/�Z2dZ3e*ƒ Z4e5ƒ Z6d0Z7g d1¢Z8g e8¢d2‘d3‘d4‘d5‘Z9‡ fd6d7„Z:d8d9„ Z;d:d;„ Z<d<d=„ Z=d>d?„ Z>d@dA„ Z?dBdC„ Z@dDdE„ ZAdFdG„ ZBdHdI„ ZCdJdK„ ZDdºdLdM„ZEdNdO„ ZFedPd�ZGedQƒdRdS„ ƒZHdTdU„ ZIdVdW„ ZJdXdY„ ZKdZd[„ ZLd»d\d]„ZMd^d_„ ZNd¼dadb„ZOd»dcdd„ZP				$			d½dedf„ZQdgdh„ ZRdidj„ ZSdkdl„ ZT			$d¾dddmœdndo„ZUdpdq„ ZVdrds„ ZWdtdu„ ZXd¿dwdx„ZYdydz„ ZZ						$dÀd{d|„Z[d}d~„ Z\e-dd€„ ƒZ]d�d‚„ Z^dƒd„„ Z_d…d†„ Z`d‡dˆ„ Zad‰dŠ„ Zbd‹dŒ„ Zcd�dŽ„ Zdd�d�„ Zed‘d’„ Zfd»d“d”„Zgd•d–„ Zhd—d˜„ Zid™dš„ Zjd›dœ„ Zkd�dž„ ZldŸd „ Zmd¡d¢„ Znd£d¤„ Zoe%d$ƒZpd¥d¦„ Zqd§d¨„ Zrd©dª„ ZsdÁd¬d­„ZtdÂd®d¯„ZudÃd°d±„Zvd²d³„ Zwd´dµ„ Zxd¶d·„ Zyd¸d¹„ Zz‡  Z{S )ÄÚKernelzThe base kernel class.Nzdict[str, psutil.Process]Ú	processesÚ	eventloopc                 C  s(   t j ¡ }|jdur| | j¡ dS dS )z&schedule call to eventloop from IOLoopN)r   ÚIOLoopÚcurrentÚnewÚadd_callbackÚenter_eventloop)ÚselfÚchangeÚloopr&   r&   r)   Ú_update_eventloop]   s   

ÿzKernel._update_eventloopT)Ú
allow_nonez"IPython.core.profiledir.ProfileDirz•Deprecated shell_streams alias. Use shell_stream

        .. versionchanged:: 6.0
            shell_streams is deprecated. Use shell_stream.
        )ÚhelpzList[t.Any]Úshell_streamsÚstrÚimplementationÚimplementation_versionÚbannerc                 C  s&   t jdtdd� | jd ur| jgS g S )NúLKernel.shell_streams is deprecated in ipykernel 6.0. Use Kernel.shell_streamé   ©Ú
stacklevel)ÚwarningsÚwarnÚDeprecationWarningÚshell_stream©rB   r&   r&   r)   Ú_shell_streams_defaultt   s   ý
zKernel._shell_streams_defaultc                 C  sH   t jdtdd� t|jƒdkrt jdtdd� |jr"|jd | _d S d S )NrM   rN   rO   r
   zJKernel only supports one shell stream. Additional streams will be ignored.r   )rQ   rR   rS   Úlenr?   ÚRuntimeWarningrT   )rB   rC   r&   r&   r)   Ú_shell_streams_changed   s   ýýÿzKernel._shell_streams_changedzlogging.LoggerÚlogéÿÿÿÿÚidentc                 C  s   t t ¡ ƒS r+   )rI   ÚuuidÚuuid4rU   r&   r&   r)   Ú_default_ident�   s   zKernel._default_identzdict[str, object]Úlanguage_infozList[dict[str, str]]Ú
help_linkszSSet to False if you want to debug python standard and dependent libraries.
        )ÚconfigzhWhether to use appnope for compatibility with OS X App Nap.

        Only affects OS X >= 10.9.
        F)ÚshellÚcontrolzDict[str, t.Any]Ú_parentsó    c                 C  s   t jdtdd� |  ¡ S )NzEKernel._parent_header is deprecated in ipykernel 6. Use .get_parent()rN   rO   )rQ   rR   rS   Ú
get_parentrU   r&   r&   r)   Ú_parent_headerÁ   s   ýzKernel._parent_headergü©ñÒMb@?ç{®Gáz„?ç        aŸ  time (in seconds) to wait for messages to arrive
        when aborting queued requests after an error.

        Requests that arrive within this window after an error
        will be cancelled.

        Increase in the event of unusually slow network
        causing significant delays,
        which can manifest as e.g. "Run all" in a notebook
        aborting some, but not all, messages after an error.
        )rb   rG   r   )Úexecute_requestÚcomplete_requestÚinspect_requestÚhistory_requestÚcomm_info_requestÚkernel_info_requestÚconnect_requestÚshutdown_requestÚis_complete_requestÚinterrupt_requestÚapply_requestÚclear_requestÚabort_requestÚdebug_requestÚusage_requestc                   s„   t ƒ jdi |¤Ž tj| _tj| _i | _| jD ]
}t	| |ƒ| j|< qi | _
| jD ]
}t	| |ƒ| j
|< q(tƒ | _t| jddgƒ| _dS )zInitialize the kernel.Ú	cell_metaÚcell_idNr&   )ÚsuperÚ__init__ÚsysÚstdoutZ_stdoutÚstderrÚ_stderrÚshell_handlersÚ	msg_typesÚgetattrÚcontrol_handlersÚcontrol_msg_typesr   Úcontrol_queuer9   Ú
do_executeÚ_do_exec_accepted_params)rB   ÚkwargsÚmsg_type©Ú	__class__r&   r)   r}     s   



ÿzKernel.__init__c                 C  s   | j  |¡ d S r+   )r‡   Ú
put_nowait©rB   Úmsgr&   r&   r)   Údispatch_control+  s   zKernel.dispatch_controlc                 Ã  sF   �	 | j  ¡ I d H }t|tjjtjfƒr| d ¡ q|  |¡I d H  qr+   )	r‡   r3   Ú
isinstanceÚ
concurrentÚfuturesÚFutureÚasyncioÚ
set_resultÚprocess_controlr�   r&   r&   r)   Úpoll_control_queue.  s   €
úzKernel.poll_control_queuec                 ƒ  sT   �ˆ j rˆ j j}tj ¡ ‰t ˆ¡}n	ˆ j}t ¡  ‰}‡ ‡fdd„}| |¡ |S )zDFlush the control queue, wait for processing of any pending messagesc                     s    ˆ j rˆ j  ¡  ˆ j ˆ¡ d S r+   )Úcontrol_streamÚflushr‡   Úputr&   ©rB   Ztracer_futurer&   r)   Ú_flushD  s   
z+Kernel._flush_control_queue.<locals>._flush)Úcontrol_threadÚio_loopr“   r”   r•   r–   Úwrap_futurer@   )rB   Úcontrol_loopZawaitable_futurerž   r&   r�   r)   Ú_flush_control_queue7  s   €

zKernel._flush_control_queuec                 Ã  sB  �| j sdS | j j|dd�\}}z| j j|ddd�}W n ty-   | jjddd� Y dS w | j d|¡ | j||d	d
� |  dd	¡ |d }|d }| j	 
|d¡}|du r^| j d|¡ n%z|| j||ƒ}t |¡rp|I dH  W n ty‚   | jjddd� Y nw tj ¡  tj ¡  |  dd	¡ | jrŸ| j tj¡ dS dS )zdispatch control requestsNF©ÚcopyT©Úcontentr¥   zInvalid Control Message©Úexc_infozControl received: %srd   ©ÚchannelÚbusyÚheaderr‹   z UNKNOWN CONTROL MESSAGE TYPE: %rzException in control handler:Úidle)ÚsessionÚfeed_identitiesÚdeserializeÚ	ExceptionrZ   ÚerrorÚdebugÚ
set_parentÚ_publish_statusr…   r3   rš   r0   Úisawaitabler~   r   r›   r€   ÚzmqÚPOLLOUT)rB   r�   Úidentsr­   r‹   ÚhandlerÚresultr&   r&   r)   r˜   O  s@   €þ

€ÿ

ÿzKernel.process_controlc                 C  s8   |d d }|| j v r| j  |¡ |  |||¡ dS dS )zœCheck whether a shell-channel message should be handled

        Allows subclasses to prevent handling of certain messages (e.g. aborted requests).
        r­   Úmsg_idFT)ÚabortedÚremoveÚ_send_abort_reply)rB   Ústreamr�   rº   r½   r&   r&   r)   Úshould_handleu  s   
zKernel.should_handlec                 Ã  sz  �| j sdS |  ¡ I dH  | j j|dd�\}}z| j j|ddd�}W n ty4   | jjddd� Y dS w | j||dd	� |  d
d¡ |d d }| j	rj|dkrj|  
| j||¡ |  dd¡ | jrh| j tj¡ dS | j d|¡ | j d|d ¡ |  | j||¡s„dS | j |d¡}|du r—| j d|¡ n‡| j d||¡ z|  ¡  W n ty¶   | jjddd� Y nw zMz|| j||ƒ}t |¡rÊ|I dH  W n tyÜ   | jjddd� Y n tyê   | j d¡ Y nw W z|  ¡  W n+ t�y   | jjddd� Y nw z|  ¡  W w  t�y   | jjddd� Y w w tj ¡  tj ¡  |  dd¡ | j�r;| j tj¡ dS dS )zdispatch shell requestsNFr¤   Tr¦   zInvalid Messager¨   rc   rª   r¬   r­   r‹   rk   r®   z
*** MESSAGE TYPE:%s***z   Content: %s
   --->
   r§   zUnknown message type: %rz%s: %sz%Unable to signal in pre_handler_hook:zException in message handler:z#KeyboardInterrupt caught in kernel.z&Unable to signal in post_handler_hook:)r¯   r£   r°   r±   r²   rZ   r³   rµ   r¶   Ú	_abortingrÀ   rT   r›   r¸   r¹   r´   rÂ   r‚   r3   ÚwarningÚpre_handler_hookr0   r·   ÚKeyboardInterruptÚpost_handler_hookr~   r   r€   )rB   r�   rº   r‹   r»   r¼   r&   r&   r)   Údispatch_shell‚  sx   €þÿ

€þ€ÿþÿ

ÿzKernel.dispatch_shellc                 C  s   t ttƒ| _dS )z.Hook to execute before calling message handlerN)r	   r   r   Úsaved_sigint_handlerrU   r&   r&   r)   rÅ   É  s   zKernel.pre_handler_hookc                 C  s   t t| jƒ dS )z-Hook to execute after calling message handlerN)r	   r   rÉ   rU   r&   r&   r)   rÇ   Î  s   zKernel.post_handler_hookc                   sV   ˆj  dˆj¡ ˆj‰ˆdu rˆj  d¡ dS ‡‡‡fdd„‰ ‡ ‡fdd„‰ˆƒ  dS )zenter eventloopzEntering eventloop %sNz Exiting as there is no eventloopc                   “  s�   �ˆj ˆ urˆj dˆ ¡ d S ˆj ¡ rˆj d¡ ˆƒ  d S ˆj dˆ ¡ zˆ ˆƒ W n ty;   ˆj d¡ Y nw ˆj ˆ u rFˆƒ  d S d S )Nzexiting eventloop %sz*Delaying eventloop due to waiting messageszAdvancing eventloop %sz"KeyboardInterrupt caught in kernel)r<   rZ   ÚinfoÚ	msg_queueÚqsizer´   rÆ   r³   r&   )r<   Úschedule_nextrB   r&   r)   Úadvance_eventloopÛ  s"   €

þ

þz1Kernel.enter_eventloop.<locals>.advance_eventloopc                     s&   ˆj  d¡ ˆj dtˆjˆ ƒ¡ dS )z*Schedule the next advance of the eventloopzScheduling eventloop advancegü©ñÒMbP?N)rZ   r´   r    Ú
call_laterr   Úschedule_dispatchr&   )rÎ   rB   r&   r)   rÍ   ï  s   z-Kernel.enter_eventloop.<locals>.schedule_next)rZ   rÊ   r<   rU   r&   )rÎ   r<   rÍ   rB   r)   rA   Ò  s   
zKernel.enter_eventloopc                 Ã  s(   �| j r	| j  ¡  | jdd�I dH  dS )z¨Process a single shell message

        Any pending control messages will be flushed as well

        .. versionchanged:: 5
            This is now a coroutine
        F)ÚwaitN)rT   r›   Úprocess_onerU   r&   r&   r)   Údo_one_iterationü  s   €	
zKernel.do_one_iterationc              	   Ã  s`   �|r| j  ¡ I dH \}}}nz
| j  ¡ \}}}W n tjtfy&   Y dS w ||Ž I dH  dS )zMProcess one request

        Returns None if no message was handled.
        N)rË   r3   Ú
get_nowaitr–   r   )rB   rÑ   ÚtÚdispatchÚargsr&   r&   r)   rÒ   
  s   €ÿzKernel.process_onec                 Ã  s8   �	 z	|   ¡ I dH  W n ty   | j d¡ Y nw q)zŸCoroutine to preserve order of message handling

        Ensures that only one message is processing at a time,
        even when the handler is async
        TNzError in message handler)rÒ   r²   rZ   Ú	exceptionrU   r&   r&   r)   Údispatch_queue  s   €ÿýzKernel.dispatch_queuez&Monotonic counter of messages
        Ú_message_counterc                 C  s   t  ¡ S r+   )Ú	itertoolsÚcountrU   r&   r&   r)   Ú_message_counter_default*  ó   zKernel._message_counter_defaultc                 G  s0   t | jƒ}| j |||f¡ | j dd„ ¡ dS )zschedule a message for dispatchc                   S  s   d S r+   r&   r&   r&   r&   r)   Ú<lambda>:  s    z*Kernel.schedule_dispatch.<locals>.<lambda>N)ÚnextrÚ   rË   rŽ   r    r@   )rB   rÖ   r×   Úidxr&   r&   r)   rÐ   .  s   
ýÿzKernel.schedule_dispatchc                 C  s�   t j ¡ | _tƒ | _| j | j¡ | jr| jj	| j
dd� | jr$| jjn| j}t |  ¡ |j¡ | jr@| jj	t| j| jƒdd� |  dd¡ dS )z register dispatchers for streamsFr¤   Ústartingrc   N)r   r=   r>   r    r   rË   r@   rÙ   rš   Zon_recvr‘   rŸ   r–   Úrun_coroutine_threadsafer™   Zasyncio_looprT   r   rÐ   rÈ   r¶   )rB   r¢   r&   r&   r)   Ústart<  s    þû	zKernel.startc                 C  s
   || _ dS )zËRecord the ports that this kernel is using.

        The creator of the Kernel instance must call this methods if they
        want the :meth:`connect_request` method to return the port numbers.
        N)Ú_recorded_ports)rB   Zportsr&   r&   r)   Úrecord_portsT  s   
zKernel.record_portsc                 C  s2   | j sdS | j j| jd||dœ||  d¡d� dS )z-Publish the code request on the iopub stream.NZexecute_input)ÚcodeÚexecution_count©Úparentr\   )r¯   ÚsendÚiopub_socketÚ_topic)rB   rç   rê   rè   r&   r&   r)   Ú_publish_execute_input`  s   
ûzKernel._publish_execute_inputc                 C  s:   | j sdS | j j| jdd|i|p|  |¡|  d¡d� dS )z send status (busy/idle) on IOPubNÚstatusZexecution_stateré   ©r¯   rë   rì   rg   rí   )rB   rï   r«   rê   r&   r&   r)   r¶   l  s   
ûzKernel._publish_statusc                 C  s0   | j sd S | j j| jd||  ¡ |  d¡d� d S )NZdebug_eventré   rð   )rB   Úeventr&   r&   r)   Ú_publish_debug_eventx  s   
ûzKernel._publish_debug_eventrc   c                 C  s   || j |< || j|< dS )a  Set the current parent request

        Side effects (IOPub messages) and replies are associated with
        the request that caused them via the parent_header.

        The parent identity is used to route input_request messages
        on the stdin channel.
        N)Ú_parent_identre   )rB   r\   rê   r«   r&   r&   r)   rµ   ƒ  s   
	zKernel.set_parentc                 C  s.   |du rt  ¡ jtkrd}nd}| j |i ¡S )aR  Get the parent request associated with a channel.

        .. versionadded:: 6

        Parameters
        ----------
        channel : str
            the name of the channel ('shell' or 'control')

        Returns
        -------
        message : dict
            the parent message for the most recent request on the channel.
        Nrd   rc   )Ú	threadingÚcurrent_threadÚnamer   re   r3   )rB   r«   r&   r&   r)   rg   �  s
   zKernel.get_parentc
           
      C  s,   | j sdS | j  ||||  |	¡|||||¡	S )a  Send a response to the message we're currently processing.

        This accepts all the parameters of :meth:`jupyter_client.session.Session.send`
        except ``parent``.

        This relies on :meth:`set_parent` having been called for the current
        message.
        N)r¯   rë   rg   )
rB   rÁ   Zmsg_or_typer§   r\   ÚbuffersÚtrackr­   Úmetadatar«   r&   r&   r)   Úsend_response¨  s   ÷zKernel.send_responsec                 C  s
   dt ƒ iS )zRInitialize metadata.

        Run at the beginning of execution requests.
        Ústarted)Únow)rB   rê   r&   r&   r)   Úinit_metadataÊ  s   ÿzKernel.init_metadatac                 C  s   |S )zXFinish populating metadata.

        Run after completing an execution request.
        r&   )rB   rê   rù   Úreply_contentr&   r&   r)   Úfinish_metadataÕ  s   zKernel.finish_metadatac                 Ã  sº  �| j sdS z.|d }|d }| dd¡}| d| ¡}| di ¡}| dd¡}	| d	i ¡}
|
 d
¡}W n tyK   | j d¡ | j d|¡ Y dS w | dd¡}|  |¡}|sh|  jd7  _|  ||| j¡ |||||	dœ}| jd ry|
|d< | jd r‚||d< | j	di |¤Ž}t
 |¡r”|I dH }tj ¡  tj ¡  | jr§t | j¡ t|ƒ}|  |||¡}| j j|d||||d�}| j d|¡ |s×|d d dkrÙ|rÛ|  ¡  dS dS dS dS )zhandle an execute_requestNr§   rç   ÚsilentFÚstore_historyÚuser_expressionsÚallow_stdinrù   ZcellIdzGot bad msg: ú%sÚstop_on_errorTr
   )rç   r   r  r  r  rz   r{   Zexecute_reply)rù   r\   rï   r³   r&   )r¯   r3   r²   rZ   r³   rý   rè   rî   r‰   rˆ   r0   r·   r~   r   r›   r€   Ú_execute_sleepÚtimeÚsleepr"   rÿ   rë   r´   Ú_abort_queues)rB   rÁ   r\   rê   r§   rç   r   r  r  r  rz   r{   r  rù   Zdo_execute_argsrþ   Ú	reply_msgr&   r&   r)   rk   Ü  sj   €ý
û





ú	ÿzKernel.execute_request)rz   r{   c                C  ó   t ‚)z4Execute user code. Must be overridden by subclasses.©ÚNotImplementedError)rB   rç   r   r  r  r  rz   r{   r&   r&   r)   rˆ   '  s   zKernel.do_executec                 Ã  sd   �| j sdS |d }|d }|d }|  ||¡}t |¡r"|I dH }t|ƒ}| j  |d|||¡ dS )zHandle a completion request.Nr§   rç   Ú
cursor_posZcomplete_reply)r¯   Údo_completer0   r·   r"   rë   )rB   rÁ   r\   rê   r§   rç   r  Úmatchesr&   r&   r)   rl   5  s   €

zKernel.complete_requestc                 C  s   g ||i ddœS )ú+Override in subclasses to find completions.Úok)r  Z
cursor_endZcursor_startrù   rï   r&   )rB   rç   r  r&   r&   r)   r  D  s   ûzKernel.do_completec              
   Ã  s‚   �| j sdS |d }|  |d |d | dd¡t| dg ¡ƒ¡}t |¡r*|I dH }t|ƒ}| j  |d|||¡}| j 	d	|¡ dS )
zHandle an inspect request.Nr§   rç   r  Údetail_levelr   Úomit_sectionsZinspect_replyr  )
r¯   Ú
do_inspectr3   Úsetr0   r·   r"   rë   rZ   r´   ©rB   rÁ   r\   rê   r§   rþ   r�   r&   r&   r)   rm   N  s   €
ü

zKernel.inspect_requestr&   c                 C  s   di i ddœS )z.Override in subclasses to allow introspection.r  F)rï   Údatarù   Úfoundr&   )rB   rç   r  r  r  r&   r&   r)   r  b  s   zKernel.do_inspectc                 Ã  sf   �| j sdS |d }| jdi |¤Ž}t |¡r|I dH }t|ƒ}| j  |d|||¡}| j d|¡ dS )zHandle a history request.Nr§   Zhistory_replyr  r&   )r¯   Ú
do_historyr0   r·   r"   rë   rZ   r´   r  r&   r&   r)   rn   f  s   €

zKernel.history_requestc
           
      C  s
   dg dœS )z)Override in subclasses to access history.r  )rï   Úhistoryr&   )
rB   Zhist_access_typeÚoutputÚrawr¯   rä   ÚstopÚnÚpatternÚuniquer&   r&   r)   r  t  s   
zKernel.do_historyc                 Ã  sN   �| j sdS | jr| j ¡ ni }d|d< | j  |d|||¡}| j d|¡ dS )zHandle a connect request.Nr  rï   Zconnect_replyr  )r¯   rå   r¥   rë   rZ   r´   ©rB   rÁ   r\   rê   r§   r�   r&   r&   r)   rq   ƒ  s   €zKernel.connect_requestc                 C  s   t | j| j| j| j| jdœS )N)Zprotocol_versionrJ   rK   r`   rL   ra   )r#   rJ   rK   r`   rL   ra   rU   r&   r&   r)   Úkernel_infoŒ  s   úzKernel.kernel_infoc                 Ã  sF   �| j sdS ddi}| | j¡ | j  |d|||¡}| j d|¡ dS )zHandle a kernel info request.Nrï   r  Zkernel_info_replyr  )r¯   Úupdater#  rë   rZ   r´   r"  r&   r&   r)   rp   —  s   €zKernel.kernel_info_requestc                 ƒ  s|   �| j sdS |d }| dd¡‰ t| dƒr#‡ fdd„| jj ¡ D ƒ}ni }t|dd�}| j  |d	|||¡}| j 	d
|¡ dS )zHandle a comm info request.Nr§   Útarget_nameÚcomm_managerc                   s0   i | ]\}}|j ˆ ksˆ d u r|t|j d�“qS )N©r%  )r%  Údict)r'   ÚkÚvr'  r&   r)   r*   ©  s
    þz,Kernel.comm_info_request.<locals>.<dictcomp>r  )Úcommsrï   Zcomm_info_replyr  )
r¯   r3   Úhasattrr&  r+  Úitemsr(  rë   rZ   r´   )rB   rÁ   r\   rê   r§   r+  rþ   r�   r&   r'  r)   ro      s   €


þzKernel.comm_info_requestc                 C  s‚   t jdkr| j d¡ d S t  ¡ }t  |¡}|r9||kr9tt dƒr9z	t  |t¡ W d S  t	y8   t  
|t¡ ‚ w t  
|t¡ d S )NÚntz*Interrupt message not supported on WindowsÚkillpg)Úosrö   rZ   r³   ÚgetpidÚgetpgidr,  r/  r   ÚOSErrorÚkill)rB   ÚpidZpgidr&   r&   r)   Ú_send_interrupt_children´  s   

þzKernel._send_interrupt_childrenc              
   Ã  sˆ   �| j sdS ddi}z|  ¡  W n& ty6 } zddl}d| ¡ tt|ƒjƒt|ƒdœ}W Y d}~nd}~ww | j j|d|||d� dS )	zHandle an interrupt request.Nrï   r  r   r³   )rï   Ú	tracebackZenameZevalueZinterrupt_reply©r\   )	r¯   r6  r3  r7  Úformat_stackrI   ÚtypeÚ__name__rë   )rB   rÁ   r\   rê   r§   Úerrr7  r&   r&   r)   rt   Å  s"   €ü€ý
zKernel.interrupt_requestc                 Ã  s¼   �| j sdS |  |d d ¡}t |¡r|I dH }| j j|d|||d� | j  d||¡| _|  ¡ I dH  | j 	d¡ | j
rG| j
j}| |j¡ | j 	d¡ | jr\| jj}| |j¡ dS dS )zHandle a shutdown request.Nr§   ÚrestartZshutdown_replyr8  zStopping control ioloopzStopping shell ioloop)r¯   Údo_shutdownr0   r·   rë   r�   Ú_shutdown_messageÚ_at_shutdownrZ   r´   rš   r    r@   r  rT   )rB   rÁ   r\   rê   r§   Zcontrol_io_loopZshell_io_loopr&   r&   r)   rr   Ù  s$   €

þzKernel.shutdown_requestc                 C  s
   d|dœS )z]Override in subclasses to do things when the frontend shuts down the
        kernel.
        r  )rï   r=  r&   )rB   r=  r&   r&   r)   r>  ð  s   
zKernel.do_shutdownc                 Ã  sh   �| j sdS |d }|d }|  |¡}t |¡r|I dH }t|ƒ}| j  |d|||¡}| j d|¡ dS )zHandle an is_complete request.Nr§   rç   Zis_complete_replyr  )r¯   Údo_is_completer0   r·   r"   rë   rZ   r´   )rB   rÁ   r\   rê   r§   rç   rþ   r
  r&   r&   r)   rs   ö  s   €


zKernel.is_complete_requestc                 C  s   ddiS )r  rï   Úunknownr&   )rB   rç   r&   r&   r)   rA    rÞ   zKernel.do_is_completec                 Ã  s`   �| j sdS |d }|  |¡}t |¡r|I dH }t|ƒ}| j  |d|||¡}| j d|¡ dS )zHandle a debug request.Nr§   Zdebug_replyr  )r¯   Údo_debug_requestr0   r·   r"   rë   rZ   r´   )rB   rÁ   r\   rê   r§   rþ   r
  r&   r&   r)   rx     s   €


zKernel.debug_requestc                 C  s<   zt ||ƒƒ }|durt ||ƒW S |W S  ty   Y dS w )zGet the process metric value.Nr   )r„   ÚBaseException)rB   Úprocessrö   Ú	attributeZmetric_valuer&   r&   r)   Úget_process_metric_value  s   ÿzKernel.get_process_metric_valuec           	      ƒ  s  �ˆj sdS t ¡ t ¡ dœ}t ¡ }|g|jdd�¢}‡fdd„|D ƒˆ_t	‡fdd„ˆj 
¡ D ƒƒ|d	< t| ¡ d
ƒr?d
nd‰ t	‡ ‡fdd„ˆj 
¡ D ƒƒ|d< t ¡ }|durb|dkrb||d< tjdd�|d< tt ¡  ¡ ƒ|d< ˆj  |d|||¡}ˆj d|¡ dS )zHandle a usage request.N)Úhostnamer5  T©Ú	recursivec                   s    i | ]}|j ˆ j |j |¡“qS r&   )r5  r;   r3   ©r'   rE  rU   r&   r)   r*   *  s    ÿÿz(Kernel.usage_request.<locals>.<dictcomp>c                   s   g | ]	}ˆ   |d d¡‘qS )Úcpu_percentN©rG  rK  rU   r&   r)   Ú
<listcomp>/  ó    ÿÿz(Kernel.usage_request.<locals>.<listcomp>Z
kernel_cpuZpssZrssc                   s   g | ]	}ˆ  |d ˆ ¡‘qS )Úmemory_full_inforM  rK  ©Zmem_info_typerB   r&   r)   rN  6  rO  Zkernel_memoryrj   Zhost_cpu_percent)ZlogicalÚ	cpu_countZhost_virtual_memoryZusage_replyr  )r¯   ÚsocketÚgethostnamer0  r1  ÚpsutilÚProcessÚchildrenr;   Úsumr7   r,  rP  rL  rR  r(  Zvirtual_memoryÚ_asdictrë   rZ   r´   )	rB   rÁ   r\   rê   rþ   Úcurrent_processZall_processesrL  r
  r&   rQ  r)   ry   !  s6   €
þ
þÿþÿzKernel.usage_requestc                 Ã  s   �t ‚r+   r  r�   r&   r&   r)   rC  E  s   €zKernel.do_debug_requestc           
   	   Ã  s¾   �| j  d¡ z|d }|d }|d d }W n ty*   | j jd|dd� Y d	S w |  |¡}|  ||||¡\}}	tj ¡  tj	 ¡  |  
|||¡}| jsPd	S | jj|d
||||	|d� d	S )zHandle an apply request.zBapply_request is deprecated in kernel_base, moving to ipyparallel.r§   r÷   r­   r½   zGot bad msg: %sTr¨   NZapply_reply)rê   r\   r÷   rù   )rZ   rÄ   r²   r³   rý   Údo_applyr~   r   r›   r€   rÿ   r¯   rë   )
rB   rÁ   r\   rê   r§   Úbufsr½   Úmdrþ   Z
result_bufr&   r&   r)   ru   L  s4   €þ



ùzKernel.apply_requestc                 C  r  )Z
DEPRECATEDr  )rB   r§   r\  r½   Zreply_metadatar&   r&   r)   r[  l  ó   zKernel.do_applyc                 Ã  s�   �| j  d¡ |d  dd¡}t|tƒr|g}|s|  ¡  |D ]
}| j t|ƒ¡ qtdd�}| j	s4dS | j	j
|d|||d�}| j  d	|¡ dS )
zabort a specific msg by idzOabort_request is deprecated in kernel_base. It is only part of IPython parallelr§   Úmsg_idsNr  )rï   Zabort_reply)r§   rê   r\   r  )rZ   rÄ   r3   r’   rI   r	  r¾   Úaddr(  r¯   rë   r´   )rB   rÁ   r\   rê   r_  Úmidr§   r
  r&   r&   r)   rw   t  s$   €ÿ


ÿzKernel.abort_requestc                 Ã  s:   �| j  d¡ |  ¡ }| jr| jj|d|||d� dS dS )zClear our namespace.zOclear_request is deprecated in kernel_base. It is only part of IPython parallelZclear_reply)r\   rê   r§   N)rZ   rÄ   Údo_clearr¯   rë   )rB   rÁ   rº   rê   r§   r&   r&   r)   rv   ‰  s   €ÿÿzKernel.clear_requestc                 C  r  )zDEPRECATED since 4.0.3r  rU   r&   r&   r)   rb  ’  r^  zKernel.do_clearc                 C  s   d| j  }|› d|› � ¡ S )z!prefixed topic for IOPub messagesz	kernel.%sÚ.)r\   Úencode)rB   ZtopicÚbaser&   r&   r)   rí   š  s   
zKernel._topicc                   sŽ   dˆ _ ˆ j d¡ ˆ jrˆ j ¡  ‡ fdd„}tˆ j|ƒ}ˆ jrBˆ j 	ˆ j|¡ ˆ j
d ur>tˆ j
dƒr@ˆ j
 ˆ jd ¡ d S d S d S |ƒ  d S )NTzAborting queuec                   “  s   �ˆ j  d¡ dˆ _d S )NzFinishing abortF)rZ   rÊ   rÃ   r&   rU   r&   r)   Ústop_aborting¯  s   €
z+Kernel._abort_queues.<locals>.stop_abortingÚ_schedule_exitri   )rÃ   rZ   rÊ   rT   r›   r   rÐ   Ústop_on_error_timeoutr    rÏ   r<   r,  rg  )rB   rf  Zschedule_stop_abortingr&   rU   r)   r	  ¢  s   
ÿ
zKernel._abort_queuesc                 C  sŒ   | j sdS | j d|d d |d d ¡ |d d  dd¡d d	 }d
di}|  |¡}|  |||¡}| |¡ | j j||||||d� dS )z"Send a reply to an aborted requestNzAborting %s: %sr­   r½   r‹   Ú_r
   r   Z_replyrï   r¾   )rù   r§   rê   r\   )r¯   rZ   rÊ   Úrsplitrý   rÿ   r$  rë   )rB   rÁ   r�   rº   Z
reply_typerï   r]  r&   r&   r)   rÀ   Å  s     


úzKernel._send_abort_replyc                 C  s   d}t |ƒ‚)zPRaise StdinNotImplementedError if active frontend doesn't support
        stdin.z?raw_input was called, but this frontend does not support stdin.r   r�   r&   r&   r)   Ú_no_raw_inputÙ  s   zKernel._no_raw_inputÚ c                 C  sP   | j s	d}t|ƒ‚|durddl}|jdtdd� | j|| jd |  d¡dd	�S )
z�Forward getpass to frontends

        Raises
        ------
        StdinNotImplementedError if active frontend doesn't support stdin.
        zFgetpass was called, but this frontend does not support input requests.Nr   zTThe `stream` parameter of `getpass.getpass` will have no effect when using ipykernelrN   rO   rc   T©Úpassword)Ú_allow_stdinr   rQ   rR   ÚUserWarningÚ_input_requestró   rg   )rB   ÚpromptrÁ   r�   rQ   r&   r&   r)   Úgetpassß  s    ýüzKernel.getpassc                 C  s4   | j s	d}t|ƒ‚| jt|ƒ| jd |  d¡dd�S )z‘Forward raw_input to frontends

        Raises
        ------
        StdinNotImplementedError if active frontend doesn't support stdin.
        zHraw_input was called, but this frontend does not support input requests.rc   Frm  )ro  r   rq  rI   ró   rg   )rB   rr  r�   r&   r&   r)   Ú	raw_inputø  s   üzKernel.raw_inputc              
   C  sj  t j ¡  t j ¡  	 z	| j tj¡ W n tjy. } z|j	tj
kr)W Y d }~n‚ d }~ww q| jd us7J ‚tt||d�ƒ}| jj| jd|||d� 	 z&t | jgg | jgd¡\}}}	|s`|	rq| j | j¡\}}
||
fdkrqW n!W n ty€   d}t|ƒd ‚ ty�   | jjddd	� Y nw qLz|
d
 d }W n ty¬   | j d|¡ d}Y nw |dkr³t‚|S )NT)rr  rn  Zinput_requestr8  ri   )NNzInterrupted by userzInvalid Message:r¨   r§   ÚvaluezBad input_reply: %srl  ú)r~   r€   r›   r   Ústdin_socketZrecv_multipartr¸   ZNOBLOCKZZMQErrorÚerrnoÚEAGAINr¯   r"   r(  rë   ÚselectÚrecvrÆ   r²   rZ   rÄ   r³   ÚEOFError)rB   rr  r\   rê   rn  Úer§   Zrlistri  ZxlistZreplyr�   ru  r&   r&   r)   rq  	  sN   

€ýý	€
ÿïþzKernel._input_requestc              	   C  sr   t |ƒ›}|  ¡ D ]-}| j d||¡ z|tkr| ¡  n|tkr&| ¡  n| |¡ W q	 t	j
y6   Y q	w dS )z“
        Send a signal to all our children

        Like `killpg`, but does not include the current process
        (or possible parents).
        zSending %s to subprocess %sN)r   Ú_process_childrenrZ   r´   r   Ú	terminater   r4  Úsend_signalrU  ZNoSuchProcess)rB   ÚsignumZsig_repr.   r&   r&   r)   Ú_signal_children;  s   



€ÿ÷zKernel._signal_childrenc              	   C  sr   t  ¡ }|jdd�}tjdkr|S t ¡ }g }|D ]}zt |j¡}W n	 ty,   Y qw ||kr6| 	|¡ q|S )zÇRetrieve child processes in the kernel's process group

        Avoids:
        - including parents and self with killpg
        - including all children that may have forked-off a new group
        TrI  r.  )
rU  rV  rW  r0  rö   Zgetpgrpr2  r5  r3  Úappend)rB   Zkernel_processZall_childrenZkernel_pgidZprocess_group_childrenÚchildZ
child_pgidr&   r&   r)   r~  O  s    
ÿ
€zKernel._process_childrenc                 Ã  s„   �d}|   ¡ s| j d¡ d S ttfD ],}|D ]'}|   ¡ }|s)| j d¡   d S |  |¡ | j d||¡ t |¡I d H  qqd S )N)ri   g¸…ëQ¸ž?gš™™™™™¹?g333333Ó?r
   é   é
   zKernel has no children.z.No more children, continuing shutdown routine.z?Will sleep %s sec before checking for children and retrying. %s)r~  rZ   r´   r   r   r‚  r–   r  )rB   Zsleepsr�  ÚdelayrW  r&   r&   r)   Ú%_progressively_terminate_all_childrenf  s(   €
ýôÿz,Kernel._progressively_terminate_all_childrenc                 Ã  sø   �zPz	|   ¡ I dH  W n ty$ } z| j d|¡ W Y d}~nd}~ww W | jdurD| jrD| jj| j| j|  d¡d� | j 	d| j¡ | j
rP| j
 tj¡ dS dS | jdurp| jrp| jj| j| j|  d¡d� | j 	d| j¡ | j
r{| j
 tj¡ w w )zCActions taken at shutdown by the kernel, called by python's atexit.Nz,Exception during subprocesses termination %sÚshutdownr8  r  )rˆ  r²   rZ   rØ   r?  r¯   rë   rì   rí   r´   rš   r›   r¸   r¹   )rB   r}  r&   r&   r)   r@  {  s8   €€ÿ€ýÿùýÿzKernel._at_shutdown)Tr+   )rc   )NNNFNNN)TNF)r   r&   )NNNNNF)rl  N)rl  r%   )|r;  Ú
__module__Ú__qualname__Ú__doc__r   r<   r;   Ú__annotations__r    rE   r   r   r¯   Zprofile_dirr!   rT   r   rH   r   rV   rY   rš   Zdebug_shell_socketrŸ   rì   Ziopub_threadrw  ÚloggingÚLoggerrZ   r   Zint_idr   r\   r_   r`   ra   r   ÚtagZdebug_just_my_codeZ_darwin_app_napro  r   re   ró   Úpropertyrh   r   r  Z_poll_intervalrh  r?  rå   r   r¾   rè   rƒ   r†   r}   r‘   r™   r£   r˜   rÂ   rÈ   rÅ   rÇ   rA   rÓ   rÒ   rÙ   rÚ   rÝ   rÐ   rä   ræ   rî   r¶   rò   rµ   rg   rú   rý   rÿ   rk   rˆ   rl   r  rm   r  rn   r  rq   r#  rp   ro   r6  rt   rr   r>  rs   rA  rx   rG  ry   rC  ru   r[  rw   rv   rb  rí   rÃ   r	  rÀ   rk  rs  rt  rq  r‚  r~  rˆ  r@  Ú__classcell__r&   r&   rŒ   r)   r:   Q   s@  
 
ÿ



þü	þú	
ýÿþýüû	&G*
ÿ




ö"Oú÷


ö	

	
$ 	#


2r:   )DrŒ  Ú
__future__r   r–   Úconcurrent.futuresr“   r0   rÛ   rŽ  r0  rS  r~   rô   r  ÚtypingrÕ   r]   rQ   r   Ú	functoolsr   r	   r   r   r   r   rd   r   Úplatformr   Zjupyter_client.sessionr   rü   ÚImportErrorrU  r¸   ZIPython.core.errorr   r   Útornador   Ztornado.queuesr   r   Ztraitlets.config.configurabler   Ztraitlets.traitletsr   r   r   r   r   r   r   r   r   r   r    Zzmq.eventloop.zmqstreamr!   Zipykernel.jsonutilr"   Ú_versionr#   Ziostreamr$   r9   r:   r&   r&   r&   r)   Ú<module>   sR    

þ4