a
    ]Df,                     @  sb  d Z ddlmZ ddlZee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 ddlZddlmZ dd	lmZ d
dlmZ erddlmZ ddlZddlmZ edddddZdddddZe ej!e ej"e ej#e ej$e ej%e ej&e ej'e ej(e ej)h	Z*e+ddZ,e-d
dZ.ejj/dej0j1dZ2ee d3dd e*D dZ dZ4ddddd Z5dd!dd"d#Z6d$d%dd&d'Z7d(d%dd)d*Z8d+d%dd,d-Z9d.d/d0d1d2Z:d3dd4d5Z;d3dd6d7Z<d3dd8d9Z=d.d:d0d;d<Z>ee>j d=3d>d e*D de>_ d.d.d0d?d@Z?dAd.dBdCdDZ@dEaAe ZBdS )Fz
Functions for helping with serialization and deserialization of
Bokeh objects.

Certain NumPy array dtypes can be serialized to a binary format for
performance and efficiency. The list of supported dtypes is:

{binary_array_types}

    )annotationsN)	lru_cache)Lock)TYPE_CHECKINGAny   )ID)settings   )format_docstring)	TypeGuardz	set[type])returnc                  C  sP   dd l } tjtjtjh}|| j || j || j	 |t
| j |S )Nr   )pandasdttimedatetimenp
datetime64add	Timestamp	TimedeltaPeriodtypeNaT)pdresult r   e/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/bokeh/util/serialization.py_compute_datetime_types6   s    r   strr   )namer   c                 C  s   | dkrt  S td S )NZDATETIME_TYPES)r   AttributeError)r    r   r   r   __getattr__A   s    r"   ms)tz
c                 c  s   | ]}d | dV  qdS z* ``np.z``Nr   .0xr   r   r   	<genexpr>Y       r*   )Zbinary_array_types)array_encoding_disabledconvert_date_to_datetimeconvert_datetime_arrayconvert_datetime_typeconvert_timedelta_typeis_datetime_typeis_timedelta_type make_globally_unique_css_safe_idmake_globally_unique_idmake_idtransform_arraytransform_seriesz0TypeGuard[dt.time | dt.datetime | np.datetime64])objr   c                 C  s   t t }t| |S )z Whether an object is any date, time, or datetime type recognized by
    Bokeh.

    Args:
        obj (object) : the object to test

    Returns:
        bool : True if ``obj`` is a datetime type

    )tupler   
isinstance)r8   Z	_dt_tupler   r   r   r1   n   s    
r1   z(TypeGuard[dt.timedelta | np.timedelta64]c                 C  s   t | tjtjfS )z Whether an object is any timedelta type recognized by Bokeh.

    Args:
        obj (object) : the object to test

    Returns:
        bool : True if ``obj`` is a timedelta type

    )r:   r   	timedeltar   timedelta64r8   r   r   r   r2   }   s    
r2   zdt.datefloatc                 C  s,   t j|  dd dt jjit  d S )z Convert a date object to a datetime

    Args:
        obj (date) : the object to convert

    Returns:
        datetime

    N   tzinfo  )r   r   	timetupletimezoneutcDT_EPOCHtotal_secondsr=   r   r   r   r-      s    
r-   zdt.timedelta | np.timedelta64c                 C  sB   t | tjr|  d S t | tjr0t| t S td| dS )z Convert any recognized timedelta value to floating point absolute
    milliseconds.

    Args:
        obj (object) : the object to convert

    Returns:
        float : milliseconds

         @@zUnknown timedelta object: N)	r:   r   r;   rF   r   r<   r>   NP_MS_DELTA
ValueErrorr=   r   r   r   r0      s
    r0   zSAny | pd.Timestamp | pd.Timedelta | dt.datetime | dt.date | dt.time | np.datetime64c                 C  s  ddl }| |ju rtjS t| |jr2|  jd S t| |jrH| jd S t| |j	r^| jd S t| t
jr| jt
jjdt }| d S t| t
jrt| S t| tjr| t }t|t S t| t
jr| jd | jd  | j d | jd  S td	| dS )
z Convert any recognized date, time, or datetime value to floating point
    milliseconds since epoch.

    Args:
        obj (object) : the object to convert

    Returns:
        float : milliseconds

    r   Ng    .A)r@   rA   i  <   rG   zunknown datetime object: )r   r   r   nanr:   r   to_timestampvaluer   r   r   r   replacerC   rD   rE   rF   dater-   r   NP_EPOCHr>   rH   r   hourminutesecondmicrosecondrI   )r8   r   diffZepoch_deltar   r   r   r/      s(    


(r/   npt.NDArray[Any]znpt.NDArray[np.floating[Any]]arrayr   c                 C  s   ddddd}| j jdkr*|| dS | j jdkrD|| dS | j jd	krt| d
krt| d
 tjrz|| dW S  ty   Y n0 | S )a   Convert NumPy datetime arrays to arrays to milliseconds since epoch.

    Args:
        array : (obj)
            A NumPy array of datetime to convert

            If the value passed in is not a NumPy array, it will be returned as-is.

    Returns:
        array

    rV   rW   c                 S  s    t t | t j| dd S )Nint64rG   )r   whereZisnatrK   astyperX   r   r   r   convert   s    z'convert_datetime_array.<locals>.convertMzdatetime64[us]mztimedelta64[us]Or   )dtypekindr[   lenr:   r   rO   	Exception)rX   r]   r   r   r   r.      s    (r.   r   c                   C  sN   t  rDt& td7 atdt W  d   S 1 s80    Y  nt S dS )a   Return a new unique ID for a Bokeh object.

    Normally this function will return simple monotonically increasing integer
    IDs (as strings) for identifying Bokeh objects within a Document. However,
    if it is desirable to have globally unique for every object, this behavior
    can be overridden by setting the environment variable ``BOKEH_SIMPLE_IDS=no``.

    Returns:
        str

    r
   pN)r	   Z
simple_ids_simple_id_lock
_simple_idr   r4   r   r   r   r   r5      s
    .r5   c                   C  s   t tt S )z Return a globally unique UUID.

    Some situations, e.g. id'ing dynamically created Divs in HTML documents,
    always require globally unique IDs.

    Returns:
        str

    )r   r   uuiduuid4r   r   r   r   r4     s    
r4   c                  C  s>   d} t d| D ]}t }|d  r|  S qtdt  S )a   Return a globally unique CSS-safe UUID.

    Some situations, e.g. id'ing dynamically created Divs in HTML documents,
    always require globally unique IDs. ID generated with this function can
    be used in APIs like ``document.querySelector("#id")``.

    Returns:
        str

    d   r   zbk-)ranger4   isalphar   )Zmax_iterZ_iidr   r   r   r3     s    
r3   boolc                 C  s
   | j tvS )z Determine whether an array may be binary encoded.

    The NumPy array dtypes that can be encoded are:

    {binary_array_types}

    Args:
        array (np.ndarray) : the array to check

    Returns:
        bool

    )ra   BINARY_ARRAY_TYPESr\   r   r   r   r,   .  s    r,   z
    c                 c  s   | ]}d | dV  qdS r&   r   r'   r   r   r   r*   B  r+   c                 C  s   t | } dddddd}| jttjkr:|| tj} n| jttjkrX|| tj} t| tjj	rr| 
tj} | jd st| } | S )z Transform a ndarray into a serializable ndarray.

    Converts un-serializable dtypes and returns JSON serializable
    format

    Args:
        array (np.ndarray) : a NumPy array to be transformed

    Returns:
        ndarray

    rV   z	type[Any])rX   ra   r   c                 S  s:   t |}t | |jk |j| k B r(| S | j|ddS d S )Nunsafe)Zcasting)r   Ziinfoanyminmaxr[   )rX   ra   infor   r   r   _cast_if_canW  s    
z%transform_array.<locals>._cast_if_canZC_CONTIGUOUS)r.   ra   r   rY   int32Zuint64uint32r:   maZMaskedArrayZfilledrK   flagsZascontiguousarray)rX   ru   r   r   r   r6   E  s    

r6   zApd.Series[Any] | pd.Index[Any] | pd.api.extensions.ExtensionArray)seriesr   c                 C  s,   ddl }t| |jr |  j}n|  }|S )z Transforms a Pandas series into serialized form

    Args:
        series (pd.Series) : the Pandas series to transform

    Returns:
        ndarray

    r   N)r   r:   ZPeriodIndexrL   valuesZto_numpy)rz   r   valsr   r   r   r7   k  s
    
r7   i  )C__doc__
__future__r   logging	getLogger__name__logr   r   rh   	functoolsr   	threadingr   typingr   r   numpyr   Z
core.typesr   r	   stringsr   Znumpy.typingZnptr   r   Ztyping_extensionsr   r   r"   ra   Zbool_Zuint8Zint8Zuint16int16rw   rv   float32float64ro   r   rP   r<   rH   fromtimestamprC   rD   rE   join__all__r1   r2   r-   r0   r/   r.   r5   r4   r3   r,   r6   r7   rg   rf   r   r   r   r   <module>   sh   










3&