o
    j=                     @   s   d dl Z e e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mZmZmZmZmZmZmZmZ d dlmZ edZd	d
 Zdd ZG dd deZdS )    N)deque)defaultdict)six)ValidationError)		ByteArrayStringFileComplexModelBaseArraySimpleModelAnyAnyDictUnicode)DictDocumentz\[([0-9]+)]c                 C   sP   d}|   D ]\}}||kr| |  d7  < q||kr|}q|d | |< |d S )a  
    Sparse to contiguous mapping inserter.

    >>> m1={3:0, 4:1, 7:2}
    >>> _s2cmi(m1, 5); m1
    1
    {3: 0, 4: 1, 5: 2, 7: 3}
    >>> _s2cmi(m1, 0); m1
    0
    {0: 0, 3: 1, 4: 2, 5: 3, 7: 4}
    >>> _s2cmi(m1, 8); m1
    4
    {0: 0, 3: 1, 4: 2, 5: 3, 7: 4, 8: 5}
       )items)mnidxnviv r   ]/var/www/html/LicenciasMiG/venv/lib/python3.10/site-packages/spyne/protocol/dictdoc/simple.py_s2cmi(   s   r   c                 C   s@   |  | }| df}| D ]\}}|jjdkrd|| |< qdS )zThis function initializes the frequencies dict with null values. If this
    is not done, it won't be possible to catch missing elements when validating
    the incoming document.
    r   N)get_flat_type_infor   
Attributes
min_occurs)
inst_classfrequencies
ctype_info	cfreq_keykr   r   r   r   _fillA   s   
r#   c                	       s\   e Zd ZdZdddddedddf	 fdd	Zdd	 Zdd
dZdddd dfddZ  Z	S )SimpleDictDocumentzThis protocol contains logic for protocols that serialize and deserialize
    flat dictionaries. The only example as of now is Http.
    NFT.c
           
   	      s.   t t| j|||||||d || _|	| _d S )N)app	validator	mime_typeignore_uncapignore_wrappers
complex_asordered)superr$   __init__
hier_delimstrict_arrays)
selfr&   r'   r(   r)   r*   r+   r,   r/   r0   	__class__r   r   r.   T   s   
zSimpleDictDocument.__init__c                 C   s  g }|D ]}	|	d ur;|d ur;t |jts;t |jtr;t|	tjs;z|	|}	W n ty: }
 zt	|	d|
 d }
~
ww z|| j
u rO|j|j|	sOt	||	gW n ty]   t	||	gw | |j}| ||	}	t |jtrt|	tjry|	}nD| |j|	| j}n:t |jtr| |j|	| j}n*z	| |j|	}W n  t	y }
 zd| | f }t	|
jd||f d }
~
ww | ||}|| j
u r|j|j|st	||	g|| q|S )Nz%r while decoding %%rz%s.%sz Validation failed for %s.%s: %%s)
issubclasstyper   r   
isinstancer   	text_typedecodeUnicodeDecodeErrorr   SOFT_VALIDATIONvalidate_string	TypeErrorget_cls_attrs_parser   Valuefrom_unicodebinary_encodingr   get_namespaceget_type_namefaultstring	_sanitizevalidate_nativeappend)r1   clsmemberorig_kr"   r   req_encr'   valuev2e	cls_attrs	native_v2nsr   r   r   _to_native_values_   sf   







z$SimpleDictDocument._to_native_valuesc           (   
   C   sF  t |ttfr	|S t |tstdtdd }|| ju r"t|| t |tr-|	g }n|
|}|j|| | jd}td|  tt}	t| dd dD ]\}
}td|
}||d	}|d	u rntd
|  qQ|jr|dgkrwqQt |jtsJ t |jtrg }n| |jjdkrg }n|j
|g}n| |||
||||}|}||}| |}| ||}d\}}|jd }||f}tt|
}|jd	d D ]}d}|| t ||d	}}| |}t |tr|j!" \}| |}|j}|dkrt#|dkr
d}nt$|% }|d	u rg }|&|||| | j'rjt#|dkr>|
|}|(| || |  d7  < |t#|krLt)|
d| |t#|kre|(|
| || |  d7  < || }n/|	t*| }||d	}|d	u rt+||}|
|}|,|| || |  d7  < || }|d	usJ |n|d	u r|
|}|&|||| || |  d7  < |}|||f }|}||}q|| |jd   t#|7  < | |j}|jdkr t ||jd d	} d}!| d	u r|&|jd ||j|}!n| -| |!rdnd}"td|"|j||f  qQ|&|jd |d |j|}!|!r3dnd}"td|"|j||d f  qQ|| ju rtd| | D ];\}}#t.|d	dd D ]\}$}%| |%}&|&j/s|td|d	|$d    nqa|d }%td| | 0|%|# qTt |tr|j! \}'t ||'}|S )zConverts a flat dict to a native python object.

        See :func:`spyne.model.complex.ComplexModelBase.get_flat_type_info`.
        zInterestingly, deserializing non complex types is not yet implemented. You can use a ComplexModel to wrap that field. Otherwise, patches are welcome.c                   S   s   t tS N)r   intr   r   r   r   <lambda>       z:SimpleDictDocument.simple_dict_to_object.<locals>.<lambda>)r/   zSimple type info key: %rc                 S   s   | d S )Nr   r   )_kr   r   r   rU      rV   )key Nz	discarding field %remptyr   )r   r   r   r   z%%r Invalid array index %d.Tzset SKIPz	%s arr %r(%r) = %rz	%s val %r(%r) = %rz	validate_freq: 
%r   z		skip validate_freq: %rz		do validate_freq: %r)1r4   r   r   r	   NotImplementedErrorr   r:   r#   r
   get_serialization_instanceget_deserialization_instanceget_simple_type_info_with_protr/   loggerdebugkeysdictsortedr   RE_HTTP_ARRAY_INDEXsubgetcan_be_emptyr5   r=   
max_occursrR   r   _castpathr   findallgetattr
_type_infovalueslenrT   popleft	_safe_setr0   rG   r   idr   insertextend	enumeratevalidate_freq_check_freq_dict)(r1   ctxdocrH   r'   rK   r   retvalsimple_type_infoidxmaprJ   r   r"   rI   rL   cinstr    	ccls_attridxr   pkeyr!   indexesnclsninstnattrs
ncls_attrsmonewval_mcidxmember_attrs_vis_setset_skipdr   path_clsattrs
array_namer   r   r   simple_dict_to_object   s   

























z(SimpleDictDocument.simple_dict_to_objectc                 C   s   |S rS   r   )protr   tr   r   r   rU   K  s    zSimpleDictDocument.<lambda>c              
   C   s  |du ri }|du rg }|du r|  |jdkr|S |du r&tt|g}nt||v r.|S t|tr||}| D ]\}}	t|}
|  |	}|j	}|du rR|}|

| t||d}t|	tsh|	jjdkr|durt|	trx|	j \}n|	}t|tr| j|
}g }|D ]}|
|| || q|||< q<|
d }d}t|D ]\}}d||f |
d< | j||||
||d q|dkr| j|
}d||< q<| j|	|||
||d q<|S | j|}||v rtd|||| f || ||||< |S )	zConverts a native python object to a flat dict.

        See :func:`spyne.model.complex.ComplexModelBase.get_flat_type_info`.
        Nr   r   r   z%s[%d])subinst_eatertagsrZ   z&%r.%s conflicts with previous value %r)r=   r   setru   r4   r	   r   r   listsub_namerG   ro   r
   r   rk   rp   rq   r   r/   joinrx   object_to_simple_dict
ValueError)r1   rH   instr}   prefixr   r   ftir"   r   
new_prefixrO   r   subinstsubtyperX   lssvlast_prefixr   r   r   r   r   J  sl   






z(SimpleDictDocument.object_to_simple_dict)NN)
__name__
__module____qualname____doc__re   r.   rR   r   r   __classcell__r   r   r2   r   r$   O   s    
8 4
r$   )logging	getLoggerr   rb   recollectionsr   r   
spyne.utilr   spyne.errorr   spyne.modelr   r   r   r	   r
   r   r   r   r   spyne.protocol.dictdocr   compilerg   r   r#   r$   r   r   r   r   <module>   s   
,
