o
    h>xd                     @   s  d Z ddlmZmZmZmZmZmZmZ ddl	m
Z
mZ e
  ddlm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mZmZ ddlmZm Z m!Z!m"Z"m#Z# ddl$m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) zddl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 W n e6y   d Z+ Z, Z- Z. Z/ Z0 Z1 Z2 Z3 Z4Z5Y nw G dd de7Z8e#j9j8:e8 G dd de;Z<e#j9j<:e< G dd dej=Z>e#j9j>:e> dddZ?dS )zI
This module defines the building blocks of a `serial` based data model.
    )nested_scopes
generatorsdivisionabsolute_importwith_statementprint_functionunicode_literals   )backportBACKWARDS_COMPATIBILITY_IMPORTS)
native_strN)urljoin)deepcopy)IOBase)chain)Number)qualified_namecollections	Generator)
propertiesmetaerrorshooksabc)marshal	unmarshal	serializedetect_formatvalidateUNMARSHALLABLE_TYPES)UnionDictAnyAnyStrIOSequenceMappingCallableTupleOptionalSetc                       s   e Zd ZdZdZdZ	d!ddZdd Z fddZdd	 Z	 f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d Z  ZS )#ObjectNc                 C   s  d | _ d | _d | _d | _d | _d }|d ur[t|trt|}t| |ur/t	| t
| t|}t| |urCt	| t
| |j D ]E}zt| |t|| W qH ty } z,dtt| |f }|jrtt||jd  f|jdd  |_||t| f|_|d }~ww nt|trt|dr|j}nt|drtd|j}t|\}}t|tr| D ];\}}	|	d u rtj}	z|	| |< W q t y } z|jrt!|jdkrdtt| |jd t"|f f|_|d }~ww n3|d u rtdd	 t#|D }
t$| j%j D ]}||
v rt| t|| qntd
t"| |d ur2t&| | |d ur=t| | t'| d u rKt'| d t(| d u r]t(| d d S d S d S )N
 - %s.%s: r   r	   urlnamefile:z	%s.%s: %sc                 s   s     | ]}|d  dkr|V  qdS )r   _N ).0property_namer1   r1   4D:\rfid_django\env\Lib\site-packages\serial/model.py	<genexpr>   s    z"Object.__init__.<locals>.<genexpr>zMThe `_` parameter must be a string, file-like object, or dictionary, not `%s`# ))_meta_hooks_url_xpath_pointer
isinstancer+   r   readwriter   r   r   keyssetattrgetattr	TypeErrorr   typeargstupler   r   r   hasattrr-   r   r.   r   dictitemsNULLKeyErrorlenreprdirwritable	__class__format_pointerxpath)selfr0   r-   instance_metainstance_hooksr3   errorlabelrQ   valueZ_dirr1   r1   r4   __init__A   s   











SzObject.__init__c                 C      t | S NidrT   r1   r1   r4   __hash__      zObject.__hash__c              
      sV  d }|}|d dkrt | }|r|jr|| ||\}}z
t| j| }W n ty:   tdtt| |f w |d urt|t	rHt
|}z||}W nB ttfy } z4dtt| |f }|jrt|jd trt
t||jd  f|jdd  |_||t| f|_|d }~ww t || |r|jr|| || d S d S d S )Nr   r0   z`%s` has no attribute "%s".r,   r	   )r   r>   Zbefore_setattrr   r   rK   r   rD   r=   r   rF   r   rC   
ValueErrorrE   strr   rM   super__setattr__Zafter_setattr)rT   r3   rY   rV   unmarshalled_valueproperty_definitionrW   messagerP   r1   r4   re      sT   


	


zObject.__setattr__c                 C   s   t | }|r|jr|| ||\}}t| }||jv r |}n%d }|j D ]\}}||jkr4|} nq'|d u rEtdtt	| |f t
| || |rY|jr[|| || d S d S d S Nz,`%s` has no property mapped to the name "%s")r   r>   before_setitemr   r   rI   r.   rK   r   rD   rA   after_setitem)rT   keyrY   rV   rU   r3   Zpotential_property_namepropertyr1   r1   r4   __setitem__   s.   






zObject.__setitem__c                    s4   t | }||jv rt| |d  d S t | d S r\   )r   r>   r   rA   rd   __delattr__)rT   rm   rU   ri   r1   r4   rp   
  s   

zObject.__delattr__c                 C   sv   t | }||jv r|}n)d }d }|j D ]\}}||jkr%|}|} nq|d u r6tdtt| |f t| |S rj   )	r   r>   r   rI   r.   rK   r   rD   rB   )rT   rm   rU   r3   rg   Zpnpdr1   r1   r4   __getitem__  s&   




zObject.__getitem__c                 C   
   |  | S r\   ri   r_   r1   r1   r4   __copy__2     
zObject.__copy__c                 C   sH  |   }t| }tt| }||u r|}nt|t|| |}t| }tt| }||ur;t|t|| |d ur|j D ]]}z#t	| |}	t
|	trUt|	}	|	d urht|	sbt|	|}	t|||	 W qD ty }
 z,dtt| |f }|
jrtt||
jd  f|
jdd  |
_|
|t|  f|
_|
d }
~
ww |S )Nz%s.%s: r   r	   )rP   r   r>   rD   r?   r   r   r   r@   rB   r=   r   rF   callablerA   rC   r   rE   r   r   )rT   memonew_instancerU   Z
class_metaZmeta_rV   Zclass_hooksr3   rY   rW   rX   r1   r1   r4   __deepcopy__6  sJ   




	zObject.__deepcopy__c           	      C   s   | }t |}|d ur|jd ur||}t }t|}|j D ]\}}t||}|d ur<|j	p4|}|
|||< q#|d urK|jd urK||}|S r\   )r   r>   before_marshalr   OrderedDictr   r   rI   rB   r.   r   after_marshal)	rT   object_rV   datarU   r3   rn   rY   rm   r1   r1   r4   _marshaln  s   





zObject._marshalc                 C   r[   r\   r   r_   r1   r1   r4   __str__  s   zObject.__str__c           	      C   s   dt t|  g}t| }|j D ]F}t| |}|d urYt|tr't |nt|}|	d}t
|dkrP|d g}|dd  D ]	}|d|  qAd|}|d||f  q|d t
|dkrjd|S d	|S )
Nz%s(
   r   r	       z
    %s=%s,)r7   )r   rD   r   r>   r   r@   rB   r=   rM   splitrL   appendjoin)	rT   representationrU   r3   rY   Z
repr_valueZrepr_value_linesrvsrvlr1   r1   r4   __repr__  s0   









zObject.__repr__c           	      C   s   t | t |ur
dS t| }t|}t|j }t|j }||kr(dS ||@ D ]}t| |}t||}||kr? dS q,dS NFT)rD   r   r>   setr   r@   rB   )	rT   otherrU   omZself_propertiesZother_propertiesr3   rY   ovr1   r1   r4   __eq__  s   



zObject.__eq__c                 C      | |krdS dS r   r1   rT   r   r1   r1   r4   __ne__  s   zObject.__ne__c                 c   s0    t | }|j D ]
\}}|jp|V  qd S r\   )r   r>   r   rI   r.   )rT   rU   r3   rn   r1   r1   r4   __iter__  s
   
zObject.__iter__Tc                 C   s(  g }| }t | }|d ur|jd ur||}t|}|j D ]\}}t||}|d u rOt|jr9||}	n|j}	|	rN|	d|t
t|t|f  q!|tju r|j}
t|
r_|
|}
|
d urt|
v rztturzt|
vrzttdd |
D  }
tj|
vr|	dt
t||f dddd |
D    q!z"t||jdd	}|rd
}|D ]}dd|  | ||< q|| W q! tjy } z+dt
t||f }|jrtt|jd
 | f|jdd  |_n|f|_W Y d }~q!d }~ww |d ur|jd ur|| |r|rtd||S )Nz*The property `%s` is required for `%s`:
%sc                 s   s&    | ]}|t u r|tfn|fV  qd S r\   )rc   r   r2   type_r1   r1   r4   r5     s
    
z#Object._validate.<locals>.<genexpr>z(Null values are not allowed in `%s.%s`, zpermitted types include: %s., c                 s   s    | ]	}d t | V  qdS )z`%s`N)r   r   r1   r1   r4   r5     s    
Fraise_errorsr   zError encountered z-while attempting to validate property `%s`:

z%s.%s:
r	   r   )r   r>   before_validater   r   rI   rB   rv   requiredr   r   rD   rc   rJ   typesr   rF   r   ZNullr   r   extendr   ValidationErrorrE   after_validate)rT   r   validation_errorsr}   rV   rU   r3   rn   rY   r   r   Zvalue_validation_error_messagesindexerror_messagerW   rh   r1   r1   r4   	_validate  s   






	






zObject._validater\   T)__name__
__module____qualname___formatr8   r9   rZ   r`   re   ro   rp   rr   rt   ry   r   r   r   r   r   r   r   __classcell__r1   r1   ri   r4   r+   ;   s(    
c?$
8r+   c                       s   e Zd ZdZdZdZ		dddZdd Z fddZ fdd	Z	d
d Z
dddZdd Z	dddZdd Zdd Zdd Zdd Z  ZS )ArrayNc                 C   s(  d | _ d | _d | _d | _d | _d }t|tr*t|dr|j}nt|dr*t	d|j
}t|\}}|d u rNt|trMt|}t| |urMt| t| n|t| _|d ur||D ]}| | qZt| d u rot| d t| d u r|t| d |d urt| | |d urt| | d S d S )Nr-   r.   r/   r6   r7   )r8   r9   r:   r;   r<   r=   r   rG   r-   r   r.   r   r   r   r>   r?   r   rO   
item_typesr   rR   rS   rQ   )rT   rI   r   r-   rQ   mitemr1   r1   r4   rZ   &  s>   




zArray.__init__c                 C   r[   r\   r]   r_   r1   r1   r4   r`   L  ra   zArray.__hash__c                    s   t | }|r|jr|| ||\}}t| }|d u rd }n|j}t||d}t || |r=|jr?|| || d S d S d S Nr   )	r   r>   rk   r   r   r   rd   ro   rl   )rT   r   rY   rV   r   r   ri   r1   r4   ro   O  s   



zArray.__setitem__c                    s   t |ts
t|t| }|r|jr|| |}t| }|d u r&d }n|j}t	||d}t
 | |rB|jrD|| | d S d S d S r   )r=   r   r   ZUnmarshalTypeErrorr   r>   Zbefore_appendr   r   r   rd   r   Zafter_append)rT   rY   rV   rU   r   ri   r1   r4   r   f  s   





zArray.appendc                 C   rs   r\   ri   r_   r1   r1   r4   rt   ~  ru   zArray.__copy__c                 C   s   |   }t| }tt| }||urt|t||d t| }tt| }||ur8t|t||d | D ]}|t||d q:|S N)rw   )rP   r   r>   rD   r?   r   r   r   )rT   rw   rx   imcmihchir1   r1   r4   ry     s   

zArray.__deepcopy__c                    sj   | }t |}|d ur|jd ur||}t| t fdd|D }|d ur3|jd ur3||}|S )Nc                 3   s*    | ]}t | d u rd n jdV  qd S r   )r   r   )r2   r   r   r1   r4   r5     s    
z!Array._marshal.<locals>.<genexpr>)r   r>   rz   r   rF   r|   )rT   ahr1   r   r4   r     s   



zArray._marshalTc                 C   s   g }| }t |}|d ur|jd ur||}t|}|jd ur1|D ]}|t||jdd q#|d ur?|jd ur?|| |rK|rKt	d
||S )NFr   r   )r   r>   r   r   r   r   r   r   r   r   r   )rT   r   r   r   r   r   r   r1   r1   r4   r     s   




zArray._validatec           
      C   s  t t| d g}t| dkru|d | D ]8}t|tr!t |nt|}|d}t|dkrG|d g}|dd |dd  D 7 }d|}|d|  qt	| }t	t| }||u rad n|}|d	|d u so|j
d u rqd
nd  t	| }t	t| }||ur|j
r|d |j
D ]A}	t|	trt |	nt|	}|d}t|dkr|d g}|dd |dd D 7 }|d|d   d|}|d|  qt	| }t|j
dkr|d d d |d< |d |d t|dkrd|S d
|S )N(r       [r   r	   c                 S      g | ]}d | qS         r1   r2   r   r1   r1   r4   
<listcomp>      z"Array.__repr__.<locals>.<listcomp>        %s,    ]r7   ,z    item_types=(r   c                 S   r   r   r1   r   r1   r1   r4   r     r   r       )r   )r   rD   rL   r   r=   rM   r   r   r   r>   r   )
rT   r   r   riZrilsZrisr   r   r   itr1   r1   r4   r     st   
















zArray.__repr__c                 C   sT   t | t |ur
dS t| }|t|krdS t|D ]}| | || kr' dS qdS r   )rD   rL   range)rT   r   lengthr   r1   r1   r4   r     s   zArray.__eq__c                 C   r   r   r1   r   r1   r1   r4   r        zArray.__ne__c                 C   r[   r\   r   r_   r1   r1   r4   r     ra   zArray.__str__NNr\   r   )r   r   r   r   r9   r8   rZ   r`   ro   r   rt   ry   r   r   r   r   r   r   r   r1   r1   ri   r4   r      s&    
&

>r   c                       s   e Zd ZdZdZdZ		d fdd	Zdd Z fddZdd	 Z	dd
dZ
dd ZdddZdd Zdd Zdd Zdd Z  ZS )
DictionaryNc                    sd  d | _ d | _d | _d | _d | _d }t|tr*t|dr|j}nt|dr*t	d|j
}t|\}}|d u rNt|trMt|}t| |urMt| t| n|t| _|d u r^t   n<t|tjtfrk| }nt|trzt| dd d}t | t| d u rt| d t| d u rt| d |d urt| | |d urt| | d S d S )	Nr-   r.   r/   c                 S   s   | S r\   r1   )kvr1   r1   r4   <lambda>H  s    z%Dictionary.__init__.<locals>.<lambda>)rm   r6   r7   )r8   r9   r:   r;   r<   r=   r   rG   r-   r   r.   r   r   r   r>   r?   r   rO   value_typesrd   rZ   r   r{   rI   rH   sortedrR   rS   rQ   )rT   rI   r   r-   rQ   r   ri   r1   r4   rZ     sF   






zDictionary.__init__c                 C   r[   r\   r]   r_   r1   r1   r4   r`   X  ra   zDictionary.__hash__c           	   
      s  t | }|r|jr|| ||\}}t| }|d u rd }n|j}zt||d}W n@ tyj } z4dtt| |f }|j	r\t
|j	d tr\tt||j	d  f|j	dd  |_	||t| f|_	|d }~ww |d u rst|t || |r|jr|| || d S d S d S )Nr   z
 - %s['%s']: r   r	   )r   r>   rk   r   r   r   rC   r   rD   rE   r=   rc   rF   r   rM   RuntimeErrorrd   ro   rl   )	rT   rm   rY   rV   rU   r   rf   rW   rh   ri   r1   r4   ro   [  sL   





zDictionary.__setitem__c                 C   s~   |   }t| }tt| }||urt|| t| }tt| }||ur0t|| |  D ]\}}|||< q4|S r\   )rP   r   r>   rD   r?   r   rI   )rT   rx   r   r   r   r   kvr1   r1   r4   rt     s   


zDictionary.__copy__c           	      C   s   |   }t| }tt| }||urt|t||d t| }tt| }||ur8t|t||d |  D ]\}}t||d||< q<|S r   )rP   r   r>   rD   r?   r   r   rI   )	rT   rw   rx   r   r   r   r   r   r   r1   r1   r4   ry     s   

zDictionary.__deepcopy__c                    s   | }t |}|dur|jdur||}t|}|du r!d n|j t fdd| D }|dur@|jdur@||}|S )z
        This method marshals an instance of `Dictionary` as built-in type `OrderedDict` which can be serialized into
        JSON/YAML/XML.
        Nc                    s    g | ]\}}|t | d fqS )r   )r   )r2   r   r   r   r1   r4   r     s    
z'Dictionary._marshal.<locals>.<listcomp>)	r   r>   rz   r   r   r   r{   rI   r|   )rT   r~   rV   rU   Zunmarshalled_datar1   r   r4   r     s    





zDictionary._marshalTc           
      C   s   g }| }|j pt|j }|dur|jdur||}t|}|du r&d}n|j}|durB| D ]\}}t||dd}	||	 q1|durP|j	durP|	| |r\|r\t
d||S )z&
        Recursively validate
        NFr   r   )r9   rD   r   r   r>   r   rI   r   r   r   r   r   r   )
rT   r   r   dr   r   r   r   r   Zvalue_validation_errorsr1   r1   r4   r     s$   


zDictionary._validatec                 C   s  t t| d g}t|  }t|dkr|d |D ]P\}}t|tr)t |nt|}|d}t|dkra|d g}|dd  D ]	}|d|  qCd	|}|ddt| d	| d
g7 }q|dt||f  q|d d d |d< || j
d u s| j
jd u rdnd tt| }	t| }
|	|
ur| j
jr|d |
jD ]8}t|trt |nt|}|d}t|dkr|d g}|dd |dd  D 7 }d	|}|d|  qt| j
jdkr|d d d |d< |d |d t|dkrd	|S d	|S )Nr   r   r   r   r	   z            z	        (z            %s,z            %sz
        ),z        (%s, %s),r   r   z    ],z    value_types=(c                 S   r   r   r1   r   r1   r1   r4   r   2  r   z'Dictionary.__repr__.<locals>.<listcomp>r   r   r   r   r7   )r   rD   rF   rI   rL   r   r=   rM   r   r   r8   r   r   r>   )rT   r   rI   r   r   rvZrvlsr   r   r   r   vtr1   r1   r4   r      st   















zDictionary.__repr__c                 C   s\   t | t |ur
dS t|  }t| }||krdS |D ]}| | || kr+ dS qdS r   )rD   rF   r@   )rT   r   r@   Z
other_keysr   r1   r1   r4   r   A  s   zDictionary.__eq__c                 C   r   r   r1   r   r1   r1   r4   r   N  r   zDictionary.__ne__c                 C   r[   r\   r   r_   r1   r1   r4   r   U  ra   zDictionary.__str__r   r\   r   )r   r   r   r   r9   r8   rZ   r`   ro   rt   ry   r   r   r   r   r   r   r   r1   r1   ri   r4   r     s"    =9

*$Ar   c              	      s   fdd |durd|v r| dd}|d}td}|D ]}td|}|r3t|t| }qd	} g }|D ]\}d||d  }t|d
krtd| }	t|	}
td||
d }d}|D ]"}t|t| |
 d
krw||7 }qd||	|  |	 sdn|}qd|r||	|  q:|| q:d
dg| dg }t|tjrd|  g}|dur|| |d nkt|tjrd|  g}|dur|| |d nQt|tjr#d|  g}|dur|| |g d7 }|j D ]\}}|d| |f  q|d |j D ]}|d||f  q|d nt|d
|}td|  d}d
g d}d||f }t|| ||  }||_|du rjztdjdd}W n ttfyi   Y nw |durr||_||_|S )a  
    Constructs an `Object`, `Array`, or `Dictionary` sub-class from an instance of `serial.meta.Meta`.

    Arguments:

        - name (str): The name of the class.

        - class_meta (serial.meta.Meta)

        - module (str): Specify the value for the class definition's `__module__` property. The invoking module will be
          used if this is not specified (if possible).

        - docstring (str): A docstring to associate with the class definition.
    c                    s  t | tr| tttttfv r| j}|S t| }|S t | t	j
r#d}|S t | t	jr-d}|S t | t	jr7d}|S t | t	jrAd}|S t | t	jrMtt}|S t | t	jrWd}|S t | t	jrad}|S t | t	jrd }| jrt| jdkrdd	 fd
d| jD  }n | jd }d|rd|  }|S d }|S t | t	jrd }| jrt| jdkrdd	 fdd| jD  }n | jd }|rd| }|S d}|S | jrt| jdkrdd	 fdd| jD  }|S  | jd }|S d}|S )Ndatetimedatebytesintboolrc   r	   z	Union[%s]r   c                 3       | ]} |V  qd S r\   r1   )r2   r   typing_from_propertyr1   r4   r5     
    
z:from_meta.<locals>.typing_from_property.<locals>.<genexpr>r   r%   z[%s]r7   c                 3   r   r\   r1   )r2   r   r   r1   r4   r5     r   zDict[str, %s]rH   c                 3   r   r\   r1   )r2   tr   r1   r4   r5     s    
r"   )r=   rD   r    r!   r"   r%   r$   r   r   r   DateTimeDateBytesIntegerr   BooleanStringr   r   rL   r   r   r   r   )pZ	type_hintr   r   r   r1   r4   r   m  s   

<:86420.,
z'from_meta.<locals>.typing_from_propertyN	r   r   infz^[ ]+r   x   z^[ ]*z([\w]*[\w,/"\'.;\-?`])r7   z    """z"class %s(serial.model.Dictionary):z	
    passzclass %s(serial.model.Array):zclass %s(serial.model.Object):)r7   z    def __init__(z        self,zH        _=None,  # type: Optional[Union[str, bytes, dict, Sequence, IO]]z&        %s=None,  # type: Optional[%s]z    ):z        self.%s = %sz        super().__init__(_)

zfrom_meta_%s)r   )zimport serialr7   z)serial.utilities.compatibility.backport()ztry:z5    from typing import Union, Dict, Any, Sequence, IOzexcept ImportError:z-    Union = Dict = Any = Sequence = IO = Nonez%s


%sr	   r   __main__)replacer   floatrematchminrL   groupr   stripr   r=   r   r   r   r+   r   rI   r@   rb   rH   exec_sourcesys	_getframe	f_globalsgetAttributeErrorr   r8   )r.   metadatamodule	docstringlinesZindentation_lengthliner   wrapped_linesindentZliwordswrapped_linewordoutnr   Zclass_definition	namespaceZimportssourceresultr1   r   r4   	from_meta\  s   C











r  r   )@__doc__
__future__r   r   r   r   r   r   r   Zutilities.compatibilityr
   r   Zfuture.utilsr   r   r   urllib.parser   copyr   ior   	itertoolsr   numbersr   Z	utilitiesr   r   r   r7   r   r   r   r   r   r   r   r   r   r   r   typingr    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   ImportErrorobjectr+   modelregisterlistr   r{   r   r  r1   r1   r1   r4   <module>   sB    $
 80   e s  F