U
    h                     @   st  d dl Z d dlZd dlmZmZ d dlmZ d dlmZ d dlm	Z	m
Z
mZmZmZmZmZmZmZ dd Ze Zdd	 Zd
d ZG dd deZe Zefeeeedf ef eeedf ef dddZ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d  Z!d!d" Z"d#d$ Z#d%d& Z$d'd( Z%d)d* Z&e'd+d,d-Z(d.d/ Z)e*d0d1d2Z+ed3e
d4Z,dS )5    N)datetimetimezone)Counter)is_dataclass)	
CollectionMappingOptionalTypeVarAnyTypeTupleUnioncastc                 C   s   t jjdkrz
| j}W nH tk
r^   z
| j}W n tk
rH   | }Y nX |dkrV| n|}Y qX z|dkrp| jn|}W q tk
r   | }Y qX n| j}|S )z$More spaghetti logic for 3.6 vs. 3.7   N)sysversion_infominor	__extra__AttributeError
__origin__)type_Zcons r   :/tmp/pip-unpacked-wheel-kdi5hv8g/dataclasses_json/utils.py_get_type_cons
   s    


r   c                 C   sz   z
| j }W n tk
r"   t}Y nX tjjdkrjz
| j}W n tk
rR   | }Y qvX |dtfkrd| n|}n|tkrv| }|S )zYSome spaghetti logic to accommodate differences between 3.6 and 3.7 in
    the typing apir   N)r   r   _NO_TYPE_ORIGINr   r   r   r   )r   originr   r   r   _get_type_origin#   s    



r   c                    s^   zt  fdd|D }W n: tk
r0   Y dS  tk
rT    jd krNY dS  Y nX |S d S )Nc                 3   s   | ]}| j kV  qd S N)__args__).0argr   r   r   	<genexpr>;   s     z_hasargs.<locals>.<genexpr>F)allr   	TypeErrorr   )r   argsresr   r!   r   _hasargs9   s    
r'   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
_NoArgsc                 C   s   dS NFr   selfr   r   r   __bool__H   s    z_NoArgs.__bool__c                 C   s   dS )Nr   r   r*   r   r   r   __len__K   s    z_NoArgs.__len__c                 C   s   | S r   r   r*   r   r   r   __iter__N   s    z_NoArgs.__iter__c                 C   s   t d S r   )StopIterationr*   r   r   r   __next__Q   s    z_NoArgs.__next__N)__name__
__module____qualname__r,   r-   r.   r0   r   r   r   r   r(   G   s   r(   .)tpdefaultreturnc                 C   s   t | dr| jd k	r| jS |S )Nr   )hasattrr   )r4   r5   r   r   r   _get_type_argsX   s    

r8   )r4   indexr6   c              
   C   sH   t | }|tk	rDztttdf || W S  tttfk
rB   Y nX tS )N.)r8   _NO_ARGSr   r   r   r$   
IndexErrorNotImplementedError)r4   r9   _argsr   r   r   _get_type_arg_param`   s    r>   c                 C   s.   zt | |}W n tk
r$   Y dS X |S d S r)   )
isinstance	Exception)otresultr   r   r   _isinstance_safek   s
    rD   c                 C   s<   zt | |W S  tk
r6   t| r.t| |nd Y S X d S r)   )
issubclassr@   _is_new_type_is_new_type_subclass_safe)cls	classinfor   r   r   _issubclass_safet   s    rJ   c                 C   sB   t | dd }|rt||S zt| |W S  tk
r<   Y dS X d S )N__supertype__F)getattrrG   rE   r@   )rH   rI   Z
super_typer   r   r   rG   }   s    
rG   c                 C   s   t | ot| dS )NrK   )inspect
isfunctionr7   r!   r   r   r   rF      s    rF   c                 C   s    t | tpt| td p| tkS r   )rJ   r   r'   typer
   r!   r   r   r   _is_optional   s
    
rP   c                 C   s   t t| tS r   )rJ   r   r   r!   r   r   r   _is_counter   s    rQ   c                 C   s   t t| tS r   )rJ   r   r   r!   r   r   r   _is_mapping   s    rR   c                 C   s   t t| tS r   )rJ   r   r   r!   r   r   r   _is_collection   s    rS   c                 C   s   t t| tS r   )rJ   r   r   r!   r   r   r   	_is_tuple   s    rT   c                 C   s   t t| tot | t S r   )rJ   r   r   strr!   r   r   r   _is_nonstr_collection   s    
rV   c                 C   s   t t| S r   )r   r   r!   r   r   r   _is_generic_dataclass   s    rW   )	timestampc                 C   s$   t tj j}t j| |d}|S )N)tz)r   nowr   utc
astimezonetzinfofromtimestamp)rX   rY   dtr   r   r   _timestamp_to_dt_aware   s    r`   c              	   C   sT   z| j d krW d S | j d }W n ttfk
r8   Y d S X |d ksL|jd krPd S |S )NZ	undefined)Zdataclass_json_configr   KeyErrorvalue)rH   Zaction_enumr   r   r    _undefined_parameter_action_safe   s    
rc   )usagec                 C   s   t | }| }|dkr*|dkr$|S | jS |dkrB|jj| |dS |dkrZ|jj| |dS |dkrp|jj| dS |dkr|jj| dS td	| d
dS )zd
    Checks if an undefined parameters action is defined and performs the
    according action.
    Ninitfrom)rH   kvsto)objrg   dump)ri   z=usage must be one of ['to', 'from', 'dump', 'init'], but is '')	rc   lower__init__rb   Zhandle_from_dictZhandle_to_dictZhandle_dumpZcreate_init
ValueError)rH   rg   rd   Zundefined_parameter_actionr   r   r   !_handle_undefined_parameters_safe   s&    
ro   CatchAllVar)bound)-rM   r   r   r   collectionsr   Zdataclassesr   typingr   r   r   r	   r
   r   r   r   r   r   objectr   r   r'   r(   r:   r8   intr>   rD   rJ   rG   rF   rP   rQ   rR   rS   rT   rV   rW   floatr`   rc   rU   ro   rp   r   r   r   r   <module>   s<   ,		