B
    u9a|                 @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZdddddddd	d
dddgZ	G dd de
ZG dd dZe ZG dd dZe Zei ZG dd dZedZedZedZdZdZdZe dZG dd deZG dd dedZG d d dZG d!d" d"Zeed#d#dd#dd$d%dZ d&d' Z!d(d) Z"dded*d+d,Z#d-d. Z$d/d0 Z%d1d2 Z&d3d4 Z'd5d6 Z(d7d8 Z)d9d: Z*d;d< Z+d=d> Z,d?d@ Z-dAdB Z.dCdD Z/dEdF Z0dGdH Z1dIdJ Z2dKdL Z3dddde1de2de2e3e2e3e2e3e2e3dMZ4dNdO Z5dcd#d#d#dPdPdPdQdRdZ6dSd Z7dTdU Z8dVd Z9e:dWdXd	Z;dYdZ Z<e=d[d\d
Z>d]d^ Z?d_dd#d#d#dPdPdPd`dadZ@dbd ZAdS )d    N	dataclassfieldFieldFrozenInstanceErrorInitVarMISSINGfieldsasdictastuplemake_dataclassreplaceis_dataclassc               @   s   e Zd ZdS )r   N)__name__
__module____qualname__ r   r   !/usr/lib/python3.7/dataclasses.pyr      s    c               @   s   e Zd Zdd ZdS )_HAS_DEFAULT_FACTORY_CLASSc             C   s   dS )Nz	<factory>r   )selfr   r   r   __repr__   s    z#_HAS_DEFAULT_FACTORY_CLASS.__repr__N)r   r   r   r   r   r   r   r   r      s   r   c               @   s   e Zd ZdS )_MISSING_TYPEN)r   r   r   r   r   r   r   r      s   r   c               @   s   e Zd Zdd Zdd ZdS )_FIELD_BASEc             C   s
   || _ d S )N)name)r   r   r   r   r   __init__   s    z_FIELD_BASE.__init__c             C   s   | j S )N)r   )r   r   r   r   r      s    z_FIELD_BASE.__repr__N)r   r   r   r   r   r   r   r   r   r      s   r   _FIELD_FIELD_CLASSVAR_FIELD_INITVARZ__dataclass_fields__Z__dataclass_params__Z__post_init__z^(?:\s*(\w+)\s*\.)?\s*(\w+)c               @   s   e Zd Zdd ZdS )_InitVarMetac             C   s   | S )Nr   )r   paramsr   r   r   __getitem__   s    z_InitVarMeta.__getitem__N)r   r   r   r   r   r   r   r   r      s   r   c               @   s   e Zd ZdS )r   N)r   r   r   r   r   r   r   r      s   )	metaclassc               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r   )
r   typedefaultdefault_factoryreprhashinitcomparemetadata_field_typec             C   sR   d | _ d | _|| _|| _|| _|| _|| _|| _|d kr<tnt	
|| _d | _d S )N)r   r!   r"   r#   r&   r$   r%   r'   _EMPTY_METADATAtypesMappingProxyTyper(   r)   )r   r"   r#   r&   r$   r%   r'   r(   r   r   r   r      s    zField.__init__c             C   sV   d| j d| jd| jd| jd| jd| jd| jd| jd	| jd
| j	 dS )NzField(name=z,type=z	,default=z,default_factory=z,init=z,repr=z,hash=z	,compare=z
,metadata=z,_field_type=))
r   r!   r"   r#   r&   r$   r%   r'   r(   r)   )r   r   r   r   r      s    zField.__repr__c             C   s(   t t| jdd }|r$|| j|| d S )N__set_name__)getattrr!   r"   )r   ownerr   funcr   r   r   r.     s    zField.__set_name__N)r   r   r   	__slots__r   r   r.   r   r   r   r   r      s   c               @   s    e Zd ZdZdd Zdd ZdS )_DataclassParams)r&   r$   eqorderunsafe_hashfrozenc             C   s(   || _ || _|| _|| _|| _|| _d S )N)r&   r$   r4   r5   r6   r7   )r   r&   r$   r4   r5   r6   r7   r   r   r   r     s    z_DataclassParams.__init__c             C   s6   d| j d| jd| jd| jd| jd| jdS )Nz_DataclassParams(init=z,repr=z,eq=z,order=z,unsafe_hash=z,frozen=r-   )r&   r$   r4   r5   r6   r7   )r   r   r   r   r   '  s    z_DataclassParams.__repr__N)r   r   r   r2   r   r   r   r   r   r   r3     s   r3   T)r"   r#   r&   r$   r%   r'   r(   c             C   s,   | t k	r|t k	rtdt| ||||||S )Nz/cannot specify both default and default_factory)r   
ValueErrorr   )r"   r#   r&   r$   r%   r'   r(   r   r   r   r   5  s    c                s(   |sdS dd  fdd|D  dS )Nz()(,c                s   g | ]}  d |j  qS ).)r   ).0f)obj_namer   r   
<listcomp>T  s    z_tuple_str.<locals>.<listcomp>z,))join)r>   r   r   )r>   r   
_tuple_strK  s    rA   c                s"   t   t fdd}|S )Nc          	      sD   t | t f}| krdS  | z| }W d  | X |S )Nz...)id_thread	get_identadddiscard)r   keyresult)repr_runninguser_functionr   r   wrapper^  s    
z _recursive_repr.<locals>.wrapper)set	functoolswraps)rJ   rK   r   )rI   rJ   r   _recursive_reprY  s    rO   )globalslocalsreturn_typec            C   s   |d kri }|d k	r$d|kr$t |d< d}|tk	r<||d< d}d|}ddd |D }d	|  d
| d| d| }t||| ||  S )N__builtins__ Z_return_typez->_return_typer:   
c             s   s   | ]}d | V  qdS ) Nr   )r<   br   r   r   	<genexpr>}  s    z_create_fn.<locals>.<genexpr>zdef r9   r-   z:
)builtinsr   r@   exec)r   argsZbodyrP   rQ   rR   Zreturn_annotationZtxtr   r   r   
_create_fnl  s    
r\   c             C   s0   | rd| d|d| dS | d| d| S )Nz __builtins__.object.__setattr__(r:   r-   r;   =r   )r7   r   value	self_namer   r   r   _field_assign  s    r`   c             C   s   d| j  }| jtk	rV| jr@| j||< | d| j  d| j  }q| j||< | d}n8| jr| jtkrn| j }q| jtk	r| j||< | j }nd S | jtkrd S t|| j ||S )NZ_dflt_z() if z is _HAS_DEFAULT_FACTORY else z())r   r#   r   r&   r"   r)   r   r`   )r=   r7   rP   r_   Zdefault_namer^   r   r   r   _field_init  s"    






ra   c             C   sV   | j tkr| jtkrd}n&| j tk	r2d| j }n| jtk	r@d}| j d| j | S )NrT   z=_dflt_z=_HAS_DEFAULT_FACTORYz:_type_)r"   r   r#   r   )r=   r"   r   r   r   _init_param  s    

rb   c             C   s   d}xB| D ]:}|j r
|jtkr(|jtks.d}q
|r
td|jdq
W ttd}g }x(| D ] }t||||}|r\|| q\W |rd	dd | D }	|| d	t
 d
|	 d |sdg}dd | D }
td|gdd | D  ||
|d dS )NFTznon-default argument z follows default argument)r   _HAS_DEFAULT_FACTORYr:   c             s   s   | ]}|j tkr|jV  qd S )N)r)   r   r   )r<   r=   r   r   r   rX     s    z_init_fn.<locals>.<genexpr>r;   r9   r-   passc             S   s   i | ]}|j d |j qS )Z_type_)r!   r   )r<   r=   r   r   r   
<dictcomp>  s    z_init_fn.<locals>.<dictcomp>r   c             S   s   g | ]}|j rt|qS r   )r&   rb   )r<   r=   r   r   r   r?     s    z_init_fn.<locals>.<listcomp>)rQ   rP   rR   )r&   r"   r   r#   	TypeErrorr   rc   ra   appendr@   _POST_INIT_NAMEr\   )r   r7   has_post_initr_   Zseen_defaultr=   rP   Z
body_lineslineZ
params_strrQ   r   r   r   _init_fn  s4    

rk   c             C   s.   t dddddd | D  d g}t|S )Nr   )r   z(return self.__class__.__qualname__ + f"(z, c             S   s    g | ]}|j  d |j  dqS )z={self.z!r})r   )r<   r=   r   r   r   r?     s   z_repr_fn.<locals>.<listcomp>z)")r\   r@   rO   )r   fnr   r   r   _repr_fn  s
    
rm   c             C   sl   | t d}|r,dddd |D  d }nd}tdd	d
| dddf|dtddd
| dddf|dfS )N)clsr   r9   r:   c             s   s   | ]}t |jV  qd S )N)r$   r   )r<   r=   r   r   r   rX     s    z'_frozen_get_del_attr.<locals>.<genexpr>z,)z()__setattr__)r   r   r^   z if type(self) is cls or name in :z> raise FrozenInstanceError(f"cannot assign to field {name!r}")z)super(cls, self).__setattr__(name, value))rP   __delattr__)r   r   z; raise FrozenInstanceError(f"cannot delete field {name!r}")z"super(cls, self).__delattr__(name))r   r@   r\   )rn   r   rP   Z
fields_strr   r   r   _frozen_get_del_attr  s"    

rr   c             C   s    t | ddd| | | dgS )N)r   otherz%if other.__class__ is self.__class__:z return zreturn NotImplemented)r\   )r   op
self_tupleother_tupler   r   r   _cmp_fn.  s
    rw   c             C   s    t d| }tddd| dgS )Nr   __hash__)r   zreturn hash(r-   )rA   r\   )r   ru   r   r   r   _hash_fn;  s    
ry   c             C   s$   | |j kp"t| |jko"| j|j kS )N)ClassVarr!   Z_GenericAliasZ
__origin__)a_typetypingr   r   r   _is_classvarB  s    
r}   c             C   s
   | |j kS )N)r   )r{   dataclassesr   r   r   _is_initvarJ  s    r   c       	      C   s   t | }|rd }|d}|s2tj|jj}n2tj|j}|rd|j||krdtj|jj}|r|||d|rdS dS )N      TF)_MODULE_IDENTIFIER_REmatchgroupsysmodulesgetr   __dict__)	Z
annotationrn   Za_moduler{   Zis_type_predicater   nsZmodule_namemoduler   r   r   _is_typeP  s    )

r   c             C   s8  t | |t}t|tr|}nt|tjr,t}t|d}||_||_t	|_
tjd}|rt||st|jtrt|j| ||jtrt|_
|j
t	krtjt }t||st|jtrt|j| ||jtrt|_
|j
ttfkr|jtk	rtd|j d|j
t	kr4t|jtttfr4tdt|j d|j d|S )N)r"   r|   zfield z cannot have a default factoryzmutable default z for field z$ is not allowed: use default_factory)r/   r   
isinstancer   r+   MemberDescriptorTyper   r   r!   r   r)   r   r   r   r}   strr   rz   r   r   r   r   r   r#   rf   r"   listdictrL   r8   )rn   Za_namer{   r"   r=   r|   r~   r   r   r   
_get_field  s:    






	 r   c             C   s   || j krdS t| || dS )NTF)r   setattr)rn   r   r^   r   r   r   _set_new_attribute  s    
r   c             C   s   d S )Nr   )rn   r   r   r   r   _hash_set_none  s    r   c             C   s   dd |D }t |S )Nc             S   s(   g | ] }|j d kr|jrn|j r|qS )N)r%   r'   )r<   r=   r   r   r   r?     s    z_hash_add.<locals>.<listcomp>)ry   )rn   r   fldsr   r   r   	_hash_add  s    r   c             C   s   t d| j d S )Nz-Cannot overwrite attribute __hash__ in class )rf   r   )rn   r   r   r   r   _hash_exception  s    r   ))FFFF)FFFT)FFTF)FFTT)FTFF)FTFT)FTTF)FTTT)TFFF)TFFT)TFTF)TFTT)TTFF)TTFT)TTTF)TTTTc          
      sx  i }t  tt|||||| d}d}	xX jddd D ]D}
t|
td }|r8d}	x| D ]}|||j< qZW t|
tjr8d}q8W  j	
di } fdd| D }xR|D ]J}|||j< tt |jd tr|jtkrt |j qt  |j|j qW x< j	 D ].\}}t|tr||krt|dqW |	rd|rP|sPtd	|sd|rdtd
t  t|  j	
dt}|tkp|d kod j	k }|r|std|rt t}dd | D }t dt|||d|krdnd dd | D }|r.dd |D }t dt| |rldd |D }td|}td|}t dtdd|| |rdd |D }td|}td|}xBdD ]:\}}t |t||||rtd| d j dqW |rx<t |D ].}t |j|rtd|j d j qW tt|t|t||f }|rJ| | _t dst jtt ! "dd  _# S ) NFr   T__annotations__c                s   g | ]\}}t  ||qS r   )r   )r<   r   r!   )rn   r   r   r?   A  s   z"_process_class.<locals>.<listcomp>z& is a field but has no type annotationz5cannot inherit non-frozen dataclass from a frozen onez5cannot inherit frozen dataclass from a non-frozen onerx   __eq__z eq must be true if order is truec             S   s   g | ]}|j ttfkr|qS r   )r)   r   r   )r<   r=   r   r   r   r?   ~  s    r   r   Z__dataclass_self__c             S   s   g | ]}|j tkr|qS r   )r)   r   )r<   r=   r   r   r   r?     s    c             S   s   g | ]}|j r|qS r   )r$   )r<   r=   r   r   r   r?     s    r   c             S   s   g | ]}|j r|qS r   )r'   )r<   r=   r   r   r   r?     s    rs   z==c             S   s   g | ]}|j r|qS r   )r'   )r<   r=   r   r   r   r?     s    ))__lt__<)__le__z<=)__gt__>)__ge__z>=zCannot overwrite attribute z
 in class z). Consider using functools.total_ordering__doc__z -> NonerT   )$r   _PARAMSr3   __mro__r/   _FIELDSvaluesr   r7   r   r   itemsr   r   r"   r   delattrrf   r8   hasattrrh   r   rk   rm   rA   rw   r   rr   _hash_actionboolrx   r   inspectZ	signaturer   r   )rn   r&   r$   r4   r5   r6   r7   r   Zany_frozen_baseZhas_dataclass_basesrW   Zbase_fieldsr=   Zcls_annotationsZ
cls_fieldsr   r^   Z
class_hashZhas_explicit_hashri   r   Z
field_listru   rv   rt   rl   Zhash_actionr   )rn   r   _process_class  s    











r   F)r&   r$   r4   r5   r6   r7   c               s*    fdd}| d kr"|S || S )Nc                s   t |  S )N)r   )rn   )r4   r7   r&   r5   r$   r6   r   r   wrap  s    zdataclass.<locals>.wrapr   )_clsr&   r$   r4   r5   r6   r7   r   r   )r4   r7   r&   r5   r$   r6   r   r     s    c             C   sB   yt | t}W n tk
r*   tdY nX tdd | D S )Nz0must be called with a dataclass type or instancec             s   s   | ]}|j tkr|V  qd S )N)r)   r   )r<   r=   r   r   r   rX     s    zfields.<locals>.<genexpr>)r/   r   AttributeErrorrf   tupler   )Zclass_or_instancer   r   r   r   r     s
    c             C   s   t | t ot| tS )N)r   r!   r   r   )objr   r   r   _is_dataclass_instance  s    r   c             C   s
   t | tS )N)r   r   )r   r   r   r   r     s    )dict_factoryc            C   s   t | stdt| |S )Nz0asdict() should be called on dataclass instances)r   rf   _asdict_inner)r   r   r   r   r   r	     s    c                s   t | rHg }x2t| D ]&}tt| |j }||j|f qW  |S t| trvt| drvt	|  fdd| D  S t| t
tfrt	|  fdd| D S t| trt	|  fdd|  D S t| S d S )N_fieldsc                s   g | ]}t | qS r   )r   )r<   v)r   r   r   r?   2  s    z!_asdict_inner.<locals>.<listcomp>c             3   s   | ]}t | V  qd S )N)r   )r<   r   )r   r   r   rX   7  s    z _asdict_inner.<locals>.<genexpr>c             3   s&   | ]\}}t | t | fV  qd S )N)r   )r<   kr   )r   r   r   rX   9  s   )r   r   r   r/   r   rg   r   r   r   r!   r   r   r   copydeepcopy)r   r   rH   r=   r^   r   )r   r   r     s    
r   )tuple_factoryc            C   s   t | stdt| |S )Nz1astuple() should be called on dataclass instances)r   rf   _astuple_inner)r   r   r   r   r   r
   @  s    c                s   t | rBg }x,t| D ] }tt| |j }|| qW  |S t| trpt| drpt	|  fdd| D  S t| t
tfrt	|  fdd| D S t| trt	|  fdd|  D S t| S d S )Nr   c                s   g | ]}t | qS r   )r   )r<   r   )r   r   r   r?   f  s    z"_astuple_inner.<locals>.<listcomp>c             3   s   | ]}t | V  qd S )N)r   )r<   r   )r   r   r   rX   k  s    z!_astuple_inner.<locals>.<genexpr>c             3   s&   | ]\}}t | t | fV  qd S )N)r   )r<   r   r   )r   r   r   rX   m  s   )r   r   r   r/   r   rg   r   r   r   r!   r   r   r   r   r   )r   r   rH   r=   r^   r   )r   r   r   X  s    
r   r   )bases	namespacer&   r$   r4   r5   r6   r7   c         	      s   d kri  n    t }
i }x|D ]}t|tr>|}d}nDt|dkrT|\}}n.t|dkrt|\}}}| |< ntd|t|tr| std|t|rtd|||
krtd||
	| |||< q&W | d< t
| |i  fd	d
}t|||||||	dS )Nz
typing.Anyr      zInvalid field: z&Field names must be valid identifers: z"Field names must not be keywords: zField name duplicated: r   c                s
   |   S )N)update)r   )r   r   r   <lambda>      z make_dataclass.<locals>.<lambda>)r&   r$   r4   r5   r6   r7   )r   rL   r   r   lenrf   isidentifierkeyword	iskeywordrE   r+   	new_classr   )Zcls_namer   r   r   r&   r$   r4   r5   r6   r7   seenZannsitemr   tpspecrn   r   )r   r   r   s  s6    






c             K   s   t | stdx~t| t D ]l}|jtkr0q |jsT|j|kr t	d|j dq |j|kr |jt
krzt	d|jdt| |j||j< q W | jf |S )Nz1replace() should be called on dataclass instanceszfield zC is declared with init=False, it cannot be specified with replace()zInitVar z! must be specified with replace())r   rf   r/   r   r   r)   r   r&   r   r8   r   	__class__)r   Zchangesr=   r   r   r   r     s    



)N)Brer   r   r+   r   r   rY   rM   rC   __all__r   r   r   rc   r   r   r,   r*   r   r   r   r   r   r   rh   compiler   r!   r   r   r   r3   r   rA   rO   r\   r`   ra   rb   rk   rm   rr   rw   ry   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r   r   r
   r   r   r   r   r   r   r   <module>   s    

:60
;R 4
)@