o
    œh´  ã                   @   sø   d Z ddlZddlZddlmZ zddlmZmZmZm	Z	m
Z
mZmZ ddlmZ W n eyG   ddlmZmZmZmZm	Z	m
Z
mZmZ Y nw ddlmZmZ ejded	d
� efdd„Zdd„ Zeefdd„Zddd„Zeefdd„Zddd„ZdS )z*serialization utilities for apply messagesé    N)Úchain)ÚCannedObjectÚcanÚcan_sequenceÚistypeÚsequence_typesÚuncanÚuncan_sequence)ÚPICKLE_PROTOCOL)r
   r   r   r   r   r   r   r	   )Ú	MAX_BYTESÚ	MAX_ITEMSzHipykernel.serialize is deprecated. It has moved to ipyparallel.serializeé   )Ú
stacklevelc                 C   sf   g }t | tƒr1| jr1t| jƒD ]!\}}t|ƒ|kr$d| j|< | |¡ qt |tƒr0| ¡ | j|< q|S )z/extract buffers larger than a certain thresholdN)Ú
isinstancer   ÚbuffersÚ	enumerateÚlenÚappendÚ
memoryviewÚtobytes)ÚobjÚ	thresholdr   ÚiÚbuf© r   úIc:\Users\shubh\Videos\agent\nova\Lib\site-packages\ipykernel/serialize.pyÚ_extract_buffers0   s   

€r   c                 C   sH   t | tƒr| jr t| jƒD ]\}}|du r| d¡| j|< qdS dS dS )zrestore buffers extracted byNr   )r   r   r   r   Úpop)r   r   r   r   r   r   r   Ú_restore_buffers@   s   €ýr   c                 C   s¼   g }t | tƒrt| ƒ|k rt| ƒ}|D ]
}| t||ƒ¡ qn3t | tƒrFt| ƒ|k rFi }t| ƒD ]}t| | ƒ}| t||ƒ¡ |||< q0nt| ƒ}| t||ƒ¡ | 	dt
 |t¡¡ |S )a   Serialize an object into a list of sendable buffers.

    Parameters
    ----------
    obj : object
        The object to be serialized
    buffer_threshold : int
        The threshold (in bytes) for pulling out data buffers
        to avoid pickling them.
    item_threshold : int
        The maximum number of items over which canning will iterate.
        Containers (lists, dicts) larger than this will be pickled without
        introspection.

    Returns
    -------
    [bufs] : list of buffers representing the serialized object.
    r   )r   r   r   r   Úextendr   ÚdictÚsortedr   ÚinsertÚpickleÚdumpsr
   )r   Úbuffer_thresholdÚitem_thresholdr   ZcobjÚcÚkr   r   r   Úserialize_objectH   s"   ÿ
ýr)   c                 C   sÄ   t | ƒ}| d¡}t |¡}t|tƒr,t|ƒtk r,|D ]}t||ƒ qt	||ƒ}||fS t|t
ƒrTt|ƒtk rTi }t|ƒD ]}|| }t||ƒ t||ƒ||< q=||fS t||ƒ t||ƒ}||fS )a"  reconstruct an object serialized by serialize_object from data buffers.

    Parameters
    ----------
    buffers : list of buffers/bytes
    g : globals to be used when uncanning

    Returns
    -------
    (newobj, bufs) : unpacked object, and the list of remaining unused buffers.
    r   )Úlistr   r#   Úloadsr   r   r   r   r   r	   r    r!   r   )r   ÚgÚbufsZpobjZcannedr'   Znewobjr(   r   r   r   Údeserialize_objectn   s$   


ö

ý
r.   c           
         sœ   t t ‡ ‡fdd„|D ƒ¡ƒ}tˆ ¡ ƒ}t t ‡ ‡‡fdd„|D ƒ¡ƒ}tt|ƒt|ƒ|d�}t t	| ƒt
¡g}	|	 t |t
¡¡ |	 |¡ |	 |¡ |	S )aò  pack up a function, args, and kwargs to be sent over the wire

    Each element of args/kwargs will be canned for special treatment,
    but inspection will not go any deeper than that.

    Any object whose data is larger than `threshold`  will not have their data copied
    (only numpy arrays and bytes/buffers support zero-copy)

    Message will be a list of bytes/buffers of the format:

    [ cf, pinfo, <arg_bufs>, <kwarg_bufs> ]

    With length at least two + len(args) + len(kwargs)
    c                 3   s   � | ]	}t |ˆ ˆƒV  qd S ©N©r)   )Ú.0Úarg)r%   r&   r   r   Ú	<genexpr>Ÿ   s   € z%pack_apply_message.<locals>.<genexpr>c                 3   s    � | ]}t ˆ| ˆ ˆƒV  qd S r/   r0   )r1   Úkey©r%   r&   Úkwargsr   r   r3   ¤   s   € 
ÿ)ÚnargsÚ	narg_bufsÚkw_keys)r*   r   Úfrom_iterabler!   Úkeysr    r   r#   r$   r   r
   r   r   )
ÚfÚargsr6   r%   r&   Úarg_bufsr9   Ú
kwarg_bufsÚinfoÚmsgr   r5   r   Úpack_apply_messageŽ   s   ÿÿÿ

rB   Tc                 C   sì   t | ƒ} t| ƒdksJ dƒ‚|  d¡}tt |¡|ƒ}|  d¡}t |¡}| d|d … | |d d… }}g }	t|d ƒD ]}
t||ƒ\}}|	 |¡ q>t	|	ƒ}|rWJ dƒ‚i }|d D ]}t||ƒ\}}|||< q]|rqJ d	ƒ‚|||fS )
zdunpack f,args,kwargs from buffers packed by pack_apply_message()
    Returns: original f,args,kwargsr   znot enough buffers!r   Nr8   r7   z#Shouldn't be any arg bufs left overr9   z%Shouldn't be any kwarg bufs left over)
r*   r   r   r   r#   r+   Úranger.   r   Útuple)r-   r,   ÚcopyÚpfr<   Zpinfor@   r>   r?   Z	args_listÚ_r2   r=   r6   r4   Úkwargr   r   r   Úunpack_apply_message³   s&   


"

rI   r/   )NT)Ú__doc__r#   ÚwarningsÚ	itertoolsr   Zipyparallel.serialize.canningr   r   r   r   r   r   r	   Zipyparallel.serialize.serializer
   ÚImportErrorZipykernel.pickleutilZjupyter_client.sessionr   r   ÚwarnÚDeprecationWarningr   r   r)   r.   rB   rI   r   r   r   r   Ú<module>   s,    $	,þý
& %