o
    i~P                     @   s   d dl mZ d dlZeeZd dlZed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mZmZmZmZmZmZmZmZ d dlmZ G dd deZ dS )    )print_functionNz\[([0-9]+)\])mmap)defaultdict)six)Iterable)ValidationError)ResourceNotFoundError)		ByteArrayFileFaultComplexModelBaseArrayAnyAnyDictUuidUnicode)DictDocumentc                   @   s   e Zd ZdZejejeee	fZ
ejZejZdd Zdd Zdd Zdd	d
Zdd Zdd Zdd ZdddZdddZdd ZdddZdd Zdd Zdd ZdS ) HierDictDocumentzThis protocol contains logic for protocols that serialize and deserialize
    hierarchical dictionaries. Examples include: Json, MessagePack and Yaml.

    Implement ``create_in_document()`` and ``create_out_string()`` to use this.
    c                 C   s&   |  }tjst|tr|d}|S )Nutf8)get_type_namer   PY2
isinstancebytesdecode)selfcls
class_name r   [/var/www/html/LicenciasMIG/venv/lib/python3.10/site-packages/spyne/protocol/dictdoc/hier.pyget_class_name8   s
   

zHierDictDocument.get_class_namec                 C   s   |j d u r| j S |j S N)
complex_as)r   attrr   r   r   get_complex_as@   s   
zHierDictDocument.get_complex_asc                 C   s   || j | jfv s
J | jd| |jd u rt|j|| j u r%|jj}n|| ju r/|jj}nt	||rY|j
}td| | |}| jrL||d }| |||| j}||_ng |_| jd| d S )Nbefore_deserializezRequest: %rafter_deserialize)REQUESTRESPONSEevent_manager
fire_event
descriptorr   method_request_string
in_messageout_message
ValueErrorin_body_docloggerdebugr   ignore_wrappersget_doc_to_object	validator	in_object)r   ctxmessage
body_classdocr   result_messager   r   r   deserializeE   s*   







zHierDictDocument.deserializeNc                 C   s^   |d u rt }| jtu r||j|| gS | jtu r&t |j|| g}t|S t |j|| gS r    )r   r!   listto_list	__class__tupleto_dict)r   instr   fault_as_listr   r   r   _fault_to_doch   s   

zHierDictDocument._fault_to_docc           
      C   s  || j | jfv s
J | jd| |jd ur| |j|_d S || j u r)|jj}n|| ju r3|jj	}nJ |d u r;d S |j
 rE|j\}n%||}| }t| D ]\}\}}| |}	|||j| ||	 qS| ||t f|_td|j | jd| d S )Nbefore_serializeFzResponse: %rafter_serialize)r&   r'   r(   r)   	out_errorrD   out_documentr*   r,   r-   is_out_bare
out_objectget_flat_type_info	enumerateitemsget_cls_attrs	_safe_set_object_to_docsetr0   r1   )
r   r7   r8   out_typeout_instanceout_type_infoikvattrsr   r   r   	serializev   s,   








zHierDictDocument.serializec                 C   sB   |d u r|  |jrd S t|trt|| jst||gd S d S r    )rN   nullable
issubclassr   r   VALID_UNICODE_SOURCESr   )r   keyr   rB   r   r   r   validate   s   zHierDictDocument.validatec           
      C   s   || j u r| ||| | |}| |}|tu s|tu r#ttf}n|}t|trLt||rC|j	p3|}| 
||}| ||||}	n| ||| j}	n| 
||}t|ttfr\|}	nt|trj| ||||}	n|jrs|dv rsd }|| j u rt|tjr|||st||gt|ttfr| ||| j}	nSt|trt|trtj||jpd|jd}	n<t|tr| j|jpd|jd}	n)t|t rt d d  j|j|jd}	nt|tj!r| "||}	n	|}	n| ||}	|| j u r|#||	st||	g|	S )N)     ascii)encodingerrors)rc   )$SOFT_VALIDATIONr^   rN   r#   r=   r@   r[   r
   r   type_parser4   from_serstrbinary_encodingr   r   r   empty_is_noner   string_typesvalidate_stringr   r	   r   r   	bytearray	text_typerb   unicode_errors
memoryviewtobytesr   r   binary_typeunicode_from_bytesvalidate_native)
r   r7   r]   r   rB   r5   	cls_attrsr!   check_complex_asretvalr   r   r   _from_dict_value   sf   















z!HierDictDocument._from_dict_valuec                    s  |d u rg S t |tr  ||}|S t |trL  ||}g }|j \}t|ts5t	|t
|D ]\}}| ||||| q9|S  |}	 js|	jst|tsat	|dt|dkrid S t|dkrtt	|d| }
| \\}}tjst|tr|d}| |kr|
d urt|
dkr|
D ]
}| |kr n
qt	|d|    ||st	|d|  |}||}||}|d u rtd| t|tt}z| }W n3 ty   zt  fd	d
| D |}W n ty } zt!d|| t	|d }~ww Y nw |D ]\}} j"d ur@t|tr@z| j"}W n t#y?   t	|w |$|d }|d u r]|j%$|d |f\}}|d u r]q |}|j&rhq|j'}|dkrt(||d }|d u r}g }|D ]}| ||||| qn	 |||||}|)|||| ||  d7  < q |}| j*u r|j+r ,||| |S )NzWrapper documents must be dictsr      z-There can be only one entry in a wrapper dictr   z4Class name %%r is not registered as a subclass of %rz&Class name %%r is not a subclass of %rz#No flat_type_info found for type %rc                    s    g | ]\}}  |js|qS r   )rN   exc.0rV   rW   r   r   r   
<listcomp>>  s    

z3HierDictDocument._doc_to_object.<locals>.<listcomp>zInvalid document %r for %r)-r[   r   _castrN   r   
_type_infovaluesr   AbcIterabler   rL   appendrw   r2   not_wrappeddictlenget_subclassesrM   r   r   r   r   r   get_deserialization_instancerK   r0   critical	TypeErrorr   intAttributeErrorziperrorkey_encodingUnicodeDecodeErrorr3   altry   
max_occursgetattrrO   rd   validate_freq_check_freq_dict)r   r7   r   r:   r5   rv   
serializerrU   childrt   
subclassesr   subclsrB   flat_type_infofrequenciesrM   erV   rW   membermember_attrsmosubinstarX   r   r|   r   r4      s   















zHierDictDocument._doc_to_objectc              	   C   s  |d u rd S |d u rt  }d }t|tr+d }t|}||vr)| ||}|| |S | |}|jr5d S d }|jd urB|}|j}n
|j	d urL|}|j	}| j
rt|di }|jjrt|dkr| \}	t|tsot||	d }| \}t|di }|jjrt|dks_|jjdkr|d urg }|D ]!}
t|
|v rtdt|
  d S || j||
||p|d q|S | j||||p|d}|S )Nr   rx   z.Throwing the whole array away because found %d)cls_orig)rQ   r   r   idrD   addrN   ry   rR   re   r2   r   
Attributes_wrapperr   keysr[   r   r   r   r0   r1   r   _to_dict_value)r   r   rB   tagsrv   inst_idrt   r   tir]   r   r   r   r   rP   n  s`   










zHierDictDocument._object_to_docc                 c   s.   t |}|t|hB }t ||ksJ d| | |D ]w\}}| |}|jr*qzt||d }W n tyO }	 ztd||	f  d }W Y d }	~	nd }	~	ww |d u rX|j	}nt||v r_qt
ddt | || | |||}
|j}| |}|
d us|dks|tu r|j}|d u r|}||
fV  qd S )NzOffending instance: %rzError getting %r: %rz%s%r type is %rz  r   )r   r   sort_fieldsrN   ry   r   	Exceptionr0   r   defaultr1   rP   
min_occursr#   r=   sub_name)r   r   rB   r   old_lenrV   rW   subattrr   r   valmin_or!   r   r   r   r   _get_member_pairs  s<   


z"HierDictDocument._get_member_pairsc                 C   s  |d u r|}|  ||\}}| |}| ||}t|trO| |}t||js1| ||| jS | 	|j||}| 
|}	|	tu rM| jsMtt| }|S t|ttfrX|S t|trj|j \}
| |
||S t|trv| 	|||S t|ttfr| ||| jS | ||S r    )get_polymorphic_targetrN   	_sanitizer[   r
   r   re   	to_serstrrh   _complex_to_docr#   r   r2   nextiterr   r   r   r   r   rP   r   r	   r   )r   r   rB   r   r   switchedrt   cls_orig_attrsrv   r!   str   r   r   r     s0   





zHierDictDocument._to_dict_valuec           
      C   s   |  |}|j}|d ur)||| }t||d }td| || | ||S |  |}| |}	|	t	u s@t|j
ddt	u rIt	| |||S | |||S )Nz:Render complex object %s to the value %r of its field '%s'serialize_asF)rN   simple_fieldrK   r   r0   r1   r   
to_unicoder#   r=   r   _complex_to_list_complex_to_dict)
r   r   rB   r   rt   sfr   r   cls_attrr!   r   r   r   r     s   



z HierDictDocument._complex_to_docc                    s  | |} |} |} jd u r?| |||} js#|jr*t|js*|S t	|jt
jt
jfr9|j|iS | |iS | fdd |||D } jsU|jr\t|js\|S t	|jt
jrl|j j|iS t	|jt
jrx|j|iS |  j|iS )Nc                 3   s$    | ]\}}|  j|fV  qd S r    )encoder   rz   r|   r   r   	<genexpr>*  s   " z4HierDictDocument._complex_to_dict.<locals>.<genexpr>)get_serialization_instancerN   r#   r   r   r2   r   boolwrapperr   r   rm   rq   r   r   )r   r   rB   r   r   r!   dr   r|   r   r     s4   






z!HierDictDocument._complex_to_dictc                 c   s.    | |}| |||D ]\}}|V  qd S r    )r   r   )r   r   rB   r   rV   rW   r   r   r   r   9  s
   
z!HierDictDocument._complex_to_listr    )__name__
__module____qualname____doc__r   rm   rq   ro   r   rl   r\   r   from_unicoderg   r   r   r   r#   r<   rD   rY   r^   rw   r4   rP   r   r   r   r   r   r   r   r   r   r   +   s*    

#)
M
zJ
&$"r   )!
__future__r   logging	getLoggerr   r0   recompileRE_HTTP_ARRAY_INDEXr   collectionsr   
spyne.utilr   $spyne.util.six.moves.collections_abcr   r   spyne.errorr   r   spyne.modelr	   r
   r   r   r   r   r   r   r   spyne.protocol.dictdocr   r   r   r   r   r   <module>   s   

,