U
    luf                     @   s  d 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
 ddlmZmZmZ ddlmZ ddlmZ d	Zd
ZedZe
dd e
e
dddZee eeee
f  dddZeedddZeedddZeedddZeedddZeedddZ dS )z%Utilities to manipulate JSON objects.    N)
b2a_base64)Iterable)datetime)AnyOptionalUnion)parse)tzlocal__next__z%Y-%m-%dT%H:%M:%S.%fzL^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})(\.\d{1,6})?(Z|([\+\-]\d{2}:?\d{2}))?$1z%d)dtreturnc                 C   s,   | j s(tjd|  tdd | jt d} | S )zREnsure a datetime object has tzinfo

    If no tzinfo is present, add tzlocal
    zPInterpreting naive datetime as local %s. Please add timezone info to timestamps.   
stacklevel)tzinfo)r   warningswarnDeprecationWarningreplacer	   )r    r   ;/tmp/pip-unpacked-wheel-naub1w99/jupyter_client/jsonutil.py_ensure_tzinfo&   s    r   )sr   c                 C   s.   | dkr| S t | }|r*t| }t|S | S )zparse an ISO8601 date string

    If it is None or not a valid ISO8601 timestamp,
    it will be returned unmodified.
    Otherwise, it will return a datetime object.
    N)ISO8601_PATmatch_dateutil_parser   )r   mr   r   r   r   
parse_date6   s    
r   )objr   c                 C   sf   t | tr2i }|  D ]\}}t|||< q|} n0t | ttfrPdd | D } nt | trbt| } | S )z(extract ISO8601 dates from unpacked JSONc                 S   s   g | ]}t |qS r   )extract_dates.0or   r   r   
<listcomp>N   s     z!extract_dates.<locals>.<listcomp>)
isinstancedictitemsr    listtuplestrr   )r   Znew_objkvr   r   r   r    F   s    

r    c                 C   sf   t | tr2t| } |  D ]\}}t|| |< qn0t | ttfrPdd | D } nt | trb|  } | S )z,squash datetime objects into ISO8601 stringsc                 S   s   g | ]}t |qS r   )squash_datesr!   r   r   r   r$   [   s     z squash_dates.<locals>.<listcomp>)r%   r&   r'   r-   r(   r)   r   	isoformat)r   r+   r,   r   r   r   r-   T   s    

r-   c                 C   s   t jddd t| S )z4DEPRECATED: Use jupyter_client.jsonutil.json_defaultz`date_default is deprecated since jupyter_client 7.0.0. Use jupyter_client.jsonutil.json_default.   r   )r   r   json_defaultr   r   r   r   date_defaulta   s
    r2   c                 C   s   t | tr"t| } |  ddS t | tr>t| dddS t | trPt	| S t | t
jrdt| S t | t
jrxt| S td|  dS )z-default function for packing objects in JSON.z+00:00ZFnewlineasciiz%r is not JSON serializableN)r%   r   r   r.   r   bytesr   decoder   r(   numbersIntegralintRealfloat	TypeErrorr1   r   r   r   r0   k   s    


r0   c           	      C   s`  t td f}tttjf}t| tr&| S t| tj	r:t
| S t| tjrjt| sZt| rbt| S t| S t| |rx| S t| trt| dddS t| |st| drt| trt| } t| trdd | D S t| tr:t| }tttt | }||krd}t|i }|  D ]\}}t||t |< q|S t| trP| tS td|  d S )	NFr4   r6   __iter__c                 S   s   g | ]}t |qS r   )
json_clean)r"   xr   r   r   r$      s     zjson_clean.<locals>.<listcomp>zSdict cannot be safely converted to JSON: key collision would lead to dropped valueszCan't clean for JSON: %r) r*   typer)   settypesGeneratorTyper%   boolr9   r:   r;   r<   mathisnanisinfreprr=   r7   r   r8   hasattrnext_attr_namer(   r&   lenmap
ValueErrorr'   r@   r   strftimeISO8601)	r   Z	atomic_okZcontainer_to_listZnkeysZnkeys_collapsedmsgoutr+   r,   r   r   r   r@      sH    






r@   )!__doc__rG   r9   rerD   r   binasciir   collections.abcr   r   typingr   r   r   Zdateutil.parserr   r   Zdateutil.tzr	   rL   rQ   compiler   strptimer   r*   r   r    r-   r2   r0   r@   r   r   r   r   <module>   s0    
