B
    2d8                 @   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 ddl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dd Zdd Zdd Zdd Zdd ZdS )z%Utilities to manipulate JSON objects.    N)
b2a_base64)Iterable)datetime)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   d/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/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_date7   s    
r   c             C   sj   t | tr6i }x |  D ]\}}t|||< qW |} n0t | ttfrTdd | D } nt | trft| } | S )z(extract ISO8601 dates from unpacked JSONc             S   s   g | ]}t |qS r   )extract_dates).0or   r   r   
<listcomp>O   s    z!extract_dates.<locals>.<listcomp>)
isinstancedictitemsr   listtuplestrr   )objZnew_objkvr   r   r   r   G   s    

r   c             C   sj   t | tr6t| } xR|  D ]\}}t|| |< qW n0t | ttfrTdd | D } nt | trf|  } | S )z,squash datetime objects into ISO8601 stringsc             S   s   g | ]}t |qS r   )squash_dates)r   r   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*   U   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_defaultb   s    r.   c             C   s   t | tr"t| } |  ddS t | tr:t| dS t | trLt	| S t | t
jr`t| S t | t
jrtt| S td|  dS )z-default function for packing objects in JSON.z+00:00Zasciiz%r is not JSON serializableN)r!   r   r   r+   r   bytesr   decoder   r$   numbersIntegralintRealfloat	TypeError)r'   r   r   r   r-   l   s    


r-   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S t| |st| drt| trt| } t| trdd | D S t| tr6t| }tttt | }||krtdi }x&|  D ]\}}t||t |< qW |S t| trL| tS td|  d S )Nr0   __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!   boolr3   r4   r5   r6   mathisnanisinfreprr7   r1   r   r2   hasattrnext_attr_namer$   r"   lenmap
ValueErrorr#   r:   r   strftimeISO8601)r'   Z	atomic_okZcontainer_to_listZnkeysZnkeys_collapsedoutr(   r)   r   r   r   r:      s@    






r:   ) __doc__rA   r3   rer>   r   binasciir   collections.abcr   r   typingr   r   Zdateutil.parserr   r   Zdateutil.tzr   rF   rK   compiler   strptimer   r&   r   r   r*   r.   r-   r:   r   r   r   r   <module>   s0    
