U
    ~d                     @   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) z8ddl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 W nB e6k
r`   d Z+ Z, Z- Z. Z/ Z0 Z1 Z2 Z3 Z4Z5Y nX 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 k	rt|tr0t|}t| |k	r`t	| t
| t|}t| |k	rt	| t
| |j D ]}zt| |t|| W q tk
r( } z\dtt| |f }|jrtt||jd  f|jdd  |_n|t| f|_|W 5 d }~X Y qX qndt|trht|drP|j}nt|drhtd|j}t|\}}t|tr| D ]\}}	|	d krtj}	z|	| |< W nd t k
r } zD|jrt!|jdkrdtt| |jd t"|f f|_|W 5 d }~X Y nX qnf|d krntdd	 t#|D }
t$| j%j D ] }||
krJt| t|| qJntd
t"| |d k	rt&| | |d k	rt| | t'| d krt'| d t(| d krt(| d 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   I/var/www/html/myproject/myenv/lib/python3.8/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~    







zObject.__init__c                 C   s   t | S NidrT   r1   r1   r4   __hash__   s    zObject.__hash__c              
      sj  d }|}|d dkr<t | }|r<|jr<|| ||\}}zt| j| }W n, tk
r|   tdtt| |f Y nX |d k	r<t|t	rt
|}z||}W n ttfk
r: } zndtt| |f }|jrt|jd trt
t||jd  f|jdd  |_n|t| f|_|W 5 d }~X Y nX t || |rf|jrf|| || 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   rc      sJ    






	zObject.__setattr__c                 C   s   t | }|r&|jr&|| ||\}}t| }||jkr@|}nJd }|j D ]\}}||jkrN|} qjqN|d krtdtt	| |f t
| || |r|jr|| || 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                    s2   t | }||jkr"t| |d  nt | d S r[   )r   r>   r   rA   rb   __delattr__)rT   rk   rU   rg   r1   r4   rn   
  s    

zObject.__delattr__c                 C   sv   t | }||jkr|}nRd }d }|j D ]\}}||jkr,|}|} qLq,|d krltdtt| |f t| |S rh   )	r   r>   r   rI   r.   rK   r   rD   rB   )rT   rk   rU   r3   re   Zpnpdr1   r1   r4   __getitem__  s$    



zObject.__getitem__c                 C   s
   |  | S r[   rg   r^   r1   r1   r4   __copy__2  s    zObject.__copy__c                 C   sX  |   }t| }tt| }||kr.|}nt|t|| |}t| }tt| }||k	rvt|t|| |d k	rT|j D ]}zFt	| |}	t
|	trt|	}	|	d k	rt|	st|	|}	t|||	 W q tk
rP }
 z\dtt| |f }|
jr,tt||
jd  f|
jdd  |
_n|t|  f|
_|
W 5 d }
~
X Y qX q|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  sB    





zObject.__deepcopy__c           	      C   s   | }t |}|d k	r*|jd k	r*||}t }t|}|j D ]2\}}t||}|d k	rF|j	ph|}|
|||< qF|d k	r|jd k	r||}|S r[   )r   r>   before_marshalr   OrderedDictr   r   rI   rB   r.   r   after_marshal)	rT   object_rV   datarU   r3   rl   rY   rk   r1   r1   r4   _marshaln  s    





zObject._marshalc                 C   s   t | S r[   r   r^   r1   r1   r4   __str__  s    zObject.__str__c           	      C   s   dt t|  g}t| }|j D ]}t| |}|d k	r&t|trNt |nt|}|	d}t
|dkr|d g}|dd  D ]}|d|  qd|}|d||f  q&|d t
|dkrd|S d	|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__  s.    








zObject.__repr__c           	      C   s   t | t |k	rdS t| }t|}t|j }t|j }||krPdS ||@ D ]&}t| |}t||}||krX dS qXd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   s   | |krdS dS r   r1   rT   r   r1   r1   r4   __ne__  s    zObject.__ne__c                 c   s.   t | }|j D ]\}}|jp$|V  qd S r[   )r   r>   r   rI   r.   )rT   rU   r3   rl   r1   r1   r4   __iter__  s    
zObject.__iter__Tc                 C   s8  g }| }t | }|d k	r.|jd k	r.||}t|}|j D ]\}}t||}|d krt|jrt||}	n|j}	|	r|	d|t
t|t|f  qB|tjkr:|j}
t|
r|
|}
|
d k	rt|
krttk	rt|
krttdd |
D  }
tj|
kr|	dt
t||f dddd |
D    qBzHt||jdd	}|rd
}|D ]}dd|  | ||< qZ|| W qB tjk
r } zPdt
t||f }|jrtt|jd
 | f|jdd  |_n|f|_W 5 d }~X Y qBX qB|d k	r|jd k	r|| |r4|r4td||S )Nz*The property `%s` is required for `%s`:
%sc                 s   s$   | ]}|t kr|tfn|fV  qd S r[   )ra   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   rr   requiredr   r   rD   ra   rJ   typesr   rF   r   ZNullr   r   extendr   ValidationErrorrE   after_validate)rT   r   validation_errorsry   rV   rU   r3   rl   rY   r   r   Zvalue_validation_error_messagesindexerror_messagerW   rf   r1   r1   r4   	_validate  s    





	



 



zObject._validate)N)T)__name__
__module____qualname___formatr8   r9   rZ   r_   rc   rm   rn   rp   rq   ru   r{   r}   r   r   r   r   r   __classcell__r1   r1   rg   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rTt|dr>|j}nt|drTt	d|j
}t|\}}|d krt|trt|}t| |k	rt| t| n|t| _|d k	r|D ]}| | qt| d krt| d t| d krt| d |d k	rt| | |d k	r$t| | 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   s   t | S r[   r\   r^   r1   r1   r4   r_   L  s    zArray.__hash__c                    sz   t | }|r&|jr&|| ||\}}t| }|d kr>d }n|j}t||d}t || |rv|jrv|| || d S Nr   )	r   r>   ri   r   r   r   rb   rm   rj   )rT   r   rY   rV   r   r   rg   r1   r4   rm   O  s    



zArray.__setitem__c                    s   t |tst|t| }|r4|jr4|| |}t| }|d krLd }n|j}t	||d}t
 | |r|jr|| | d S r   )r=   r   r   ZUnmarshalTypeErrorr   r>   Zbefore_appendr   r   r   rb   r   Zafter_append)rT   rY   rV   rU   r   rg   r1   r4   r   f  s    





zArray.appendc                 C   s
   |  | S r[   rg   r^   r1   r1   r4   rq   ~  s    zArray.__copy__c                 C   s   |   }t| }tt| }||k	r<t|t||d t| }tt| }||k	rpt|t||d | D ]}|t||d qt|S N)rs   )rP   r   r>   rD   r?   r   r   r   )rT   rs   rt   imcmihchir1   r1   r4   ru     s    

zArray.__deepcopy__c                    sj   | }t |}|d k	r*|jd k	r*||}t| t fdd|D }|d k	rf|jd k	rf||}|S )Nc                 3   s(   | ] }t | d k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>   rv   r   rF   rx   )rT   ahr1   r   r4   r{     s    



zArray._marshalTc                 C   s   g }| }t |}|d k	r.|jd k	r.||}t|}|jd k	rb|D ]}|t||jdd qF|d k	r~|jd k	r~|| |r|rt	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r|d | D ]p}t|trBt |nt|}|d}t|dkr|d g}|dd |dd  D 7 }d|}|d|  q,t	| }t	t| }||krd n|}|d	|d ks|j
d krd
nd  t	| }t	t| }||k	r|j
r|d |j
D ]}	t|	tr<t |	nt|	}|d}t|dkr|d g}|dd |dd D 7 }|d|d   d|}|d|  q$t	| }t|j
dkr|d d d |d< |d |d t|dkrd|S d
|S d S )N(r       [r~   r	   c                 S   s   g | ]}d | qS         r1   r2   r   r1   r1   r4   
<listcomp>  s   z"Array.__repr__.<locals>.<listcomp>        %s,    ]r7   ,z    item_types=(r   c                 S   s   g | ]}d | qS r   r1   r   r1   r1   r4   r     s   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 |k	rdS t| }|t|kr,dS t|D ]}| | || kr4 dS q4dS r   )rD   rL   range)rT   r   lengthr   r1   r1   r4   r     s    zArray.__eq__c                 C   s   | |krdS dS d S r   r1   r   r1   r1   r4   r     s    zArray.__ne__c                 C   s   t | S r[   r|   r^   r1   r1   r4   r}     s    zArray.__str__)NN)N)T)r   r   r   r   r9   r8   rZ   r_   rm   r   rq   ru   r{   r   r   r   r   r}   r   r1   r1   rg   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                    sh  d | _ d | _d | _d | _d | _d }t|trTt|dr>|j}nt|drTt	d|j
}t|\}}|d krt|trt|}t| |k	rt| t| n|t| _|d krt   n|t|tjtfr| }nt|trt| dd d}t | t| d krt| d t| d kr8t| d |d k	rNt| | |d k	rdt| | d S )	Nr-   r.   r/   c                 S   s   | S r[   r1   )kvr1   r1   r4   <lambda>H      z%Dictionary.__init__.<locals>.<lambda>)rk   r6   r7   )r8   r9   r:   r;   r<   r=   r   rG   r-   r   r.   r   r   r   r>   r?   r   rO   value_typesrb   rZ   r   rw   rI   rH   sortedrR   rS   rQ   )rT   rI   r   r-   rQ   r   rg   r1   r4   rZ     sB    








zDictionary.__init__c                 C   s   t | S r[   r\   r^   r1   r1   r4   r_   X  s    zDictionary.__hash__c           	   
      s  t | }|r&|jr&|| ||\}}t| }|d kr>d }n|j}zt||d}W n tk
r } zjdtt| |f }|j	rt
|j	d trtt||j	d  f|j	dd  |_	n|t| f|_	|W 5 d }~X Y nX |d krt|t || |r|jr|| || d S )Nr   z
 - %s['%s']: r   r	   )r   r>   ri   r   r   r   rC   r   rD   rE   r=   ra   rF   r   rM   RuntimeErrorrb   rm   rj   )	rT   rk   rY   rV   rU   r   rd   rW   rf   rg   r1   r4   rm   [  sD    




	zDictionary.__setitem__c                 C   s~   |   }t| }tt| }||k	r4t|| t| }tt| }||k	r`t|| |  D ]\}}|||< qh|S r[   )rP   r   r>   rD   r?   r   rI   )rT   rt   r   r   r   r   kvr1   r1   r4   rq     s    


zDictionary.__copy__c           	      C   s   |   }t| }tt| }||k	r<t|t||d t| }tt| }||k	rpt|t||d |  D ]\}}t||d||< qx|S r   )rP   r   r>   rD   r?   r   r   rI   )	rT   rs   rt   r   r   r   r   r   r   r1   r1   r4   ru     s    

zDictionary.__deepcopy__c                    s   | }t |}|dk	r*|jdk	r*||}t|}|dkrBd n|j t fdd| D }|dk	r|jdk	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>   rv   r   r   r   rw   rI   rx   )rT   rz   rV   rU   Zunmarshalled_datar1   r   r4   r{     s     





zDictionary._marshalTc           
      C   s   g }| }|j pt|j }|dk	r4|jdk	r4||}t|}|dkrLd}n|j}|dk	r| D ] \}}t||dd}	||	 qb|dk	r|j	dk	r|	| |r|rt
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 ]\}}t|trTt |nt|}|d}t|dkr|d g}|dd  D ]}|d|  qd	|}|ddt| d	| d
g7 }q:|dt||f  q:|d d d |d< || j
d ks| j
jd krdnd tt| }	t| }
|	|
k	r| j
jr|d |
jD ]v}t|trlt |nt|}|d}t|dkr|d g}|dd |dd  D 7 }d	|}|d|  qTt| j
jdkr|d d d |d< |d |d t|dkrd	|S 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   s   g | ]}d | qS r   r1   r   r1   r1   r4   r   2  s   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 |k	rdS t|  }t| }||kr8d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   s   | |krdS dS d S r   r1   r   r1   r1   r4   r   N  s    zDictionary.__ne__c                 C   s   t | S r[   r|   r^   r1   r1   r4   r}   U  s    zDictionary.__str__)NN)N)T)r   r   r   r   r9   r8   rZ   r_   rm   rq   ru   r{   r   r   r   r   r}   r   r1   r1   rg   r4   r     s      =9
*
$Ar   c              	      s   fdd |dk	rPd|kr*| dd}|d}td}|D ]0}td|}|rht|t| }q@d	} qrq@g }|D ]}d||d  }t|d
kr.td| }	t|	}
td||
d }d}|D ]F}t|t| |
 d
kr||7 }q||	|  |	 sdn|}q|r8||	|  qz|| qzd
dg| dg }t|tjrd|  g}|dk	r||| |d nt|tjrd|  g}|dk	r|| |d nt|tjrbd|  g}|dk	r|| |ddddg7 }|j D ] \}}|d| |f  q|d |j D ]}|d||f  q<|d nt|d
|}td|  d}d
dddddd d!g}d"||f }t|| ||  }||_|dkrztd#jd$d%}W n ttfk
r   Y nX |dk	r||_||_|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r0| tttttfkr$| j}nt| }nt | t	j
rDd}nt | t	jrXd}nt | t	jrld}n|t | t	jrd}nht | t	jrtt}nPt | t	jrd}n<t | t	jrd}n(t | t	jr0d }| jrt| jdkr
dd	 fd
d| jD  }n | jd }d|r(d| nd }nt | t	jrd }| jrt| jdkrzdd	 fdd| jD  }n | jd }|rd| nd}nL| jrt| jdkrdd	 fdd| jD  }n | jd }nd}|S )Ndatetimedatebytesintboolra   r	   z	Union[%s]r   c                 3   s   | ]} |V  qd S r[   r1   )r2   r   typing_from_propertyr1   r4   r5     s   z:from_meta.<locals>.typing_from_property.<locals>.<genexpr>r   r%   z[%s]r7   c                 3   s   | ]} |V  qd S r[   r1   )r2   r   r   r1   r4   r5     s   zDict[str, %s]rH   c                 3   s   | ]} |V  qd S 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  sz    
    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):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 serialz)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@   r`   rH   exec_sourcesys	_getframe	f_globalsgetAttributeErrorr   r8   )r.   metadatamoduleZ	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   )NN)@__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   rw   r   r   r1   r1   r1   r4   <module>   s>   $
 82   e s  F