o
    i2                     @   s   d Z ddlmZ 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 dd	lmZ dd
lmZ G dd deZeeeejejhZG dd deZG dd deZdS )zThe ``spyne.protocol.msgpack`` module contains implementations for protocols
that use MessagePack as serializer.

Initially released in 2.8.0-rc.

    )absolute_importNValidationError)six)Fault)Double)Boolean)Integer)HierDictDocumentc                       s"   e Zd ZdZd fdd	Z  ZS )MessagePackDecodeErrorzClient.MessagePackDecodeErrorNc                    s   t t| | j| d S N)superr   __init__CODE)selfdata	__class__ V/var/www/html/LicenciasMIG/venv/lib/python3.10/site-packages/spyne/protocol/msgpack.pyr   .   s   zMessagePackDecodeError.__init__r   )__name__
__module____qualname__r   r   __classcell__r   r   r   r   r   +   s    r   c                       s   e Zd ZdZdZdZeejZe	d dZ
ejZejZdZdZdddddedddejejdddf fd	d
	Zdd Zdd Zdd Zdd ZdddZdd ZdddZ fddZ fddZ  ZS )MessagePackDocumentz.An integration class for the msgpack protocol.application/x-msgpackFmsgpackzUTF-8TNutf8c                    s  t t| |||||||||		 |
| _|| _|s| j| _|r"| j| _t|| _t|| _	| | jd< | j	d< | | jd< | j	d< || jd< | j
| jt< | j| jt< | j| jt< | j
| jt< | j| jt< | j| jt< | j
| jt< | j| jt< | j| jt< | j
| jt< | j| jt< | j| jt< d S )Nrawuse_listuse_bin_type)r   r   r   	mw_packermw_unpackerfrom_unicodefrom_serstrdictkwargs_packerkwargs_unpacker_ret_number_from_bytes_handlersr   	_ret_boolr   integer_from_bytesr	   _from_unicode_handlers_to_bytes_handlersinteger_to_bytes_to_unicode_handlers)r   app	validator	mime_typeignore_uncapignore_wrappers
complex_asorderedpolymorphickey_encodingr!   r"   r   r   r    kwargsr   r   r   r   G   s8   



zMessagePackDocument.__init__c                 C   s   |S r   r   r   _valuer   r   r   _ret{   s   zMessagePackDocument._retc                 C   s&   t |tr	t||dv rt|S |S N)TF)
isinstanceNON_NUMBER_TYPESr   intr:   r   r   r   r(   ~   s
   
zMessagePackDocument._ret_numberc                 C   s   |d u s|dv r
|S t |r>   r   r:   r   r   r   r*      s   zMessagePackDocument._ret_boolc                 C   s(   |  }tjst|ts|| j}|S r   )get_type_namer   PY2r?   bytesencodedefault_string_encoding)r   cls
class_namer   r   r   get_class_name   s
   
z"MessagePackDocument.get_class_namec              
   C   s   t |jttfr4t|jdkr4t |jd tr4| jdi | j}||jd  t	dd |D |_
dS ztd|j|_
W dS  tyU } ztd|jd}~ww )	Sets ``ctx.in_document``,  using ``ctx.in_string``.

        :param ctx: The MethodContext object
        :param in_string_encoding: MessagePack is a binary protocol. So this
            argument is ignored.
           r   c                 s   s    | ]}|V  qd S r   r   ).0xr   r   r   	<genexpr>   s    z9MessagePackDocument.create_in_document.<locals>.<genexpr>     Nr   )r?   	in_stringlisttuplelen
memoryviewr"   r'   feednextin_documentr   unpackbjoin
ValueErrorr   args)r   ctxin_string_encodingunpackerer   r   r   create_in_document   s   
z&MessagePackDocument.create_in_documentc                 C   s<   |j  \}tjst|tr|| j}d| jj	
 |f S )zUses information in context object to return a method_request_string.

        Returns a string in the form of "{namespaces}method name".
        {%s}%s)in_body_dockeysr   rC   r?   rD   decoder8   r0   	interfaceget_tns)r   r]   mrsr   r   r   gen_method_request_string   s   z-MessagePackDocument.gen_method_request_stringc                 C      dd |j D |_d S )Nc                 s       | ]}t |V  qd S r   r   packbrL   or   r   r   rN          z8MessagePackDocument.create_out_string.<locals>.<genexpr>out_document
out_stringr   r]   out_string_encodingr   r   r   create_out_string      z%MessagePackDocument.create_out_stringc                    s(   t |tjtjfrtt| ||S |S r   )r?   r   	text_typebinary_typer   r   r+   )r   rG   r<   r   r   r   r+      s
   z&MessagePackDocument.integer_from_bytesc                    s*   d|  krdk r|S  t t| ||S )Nl         l            )r   r   r.   )r   rG   r<   r;   r   r   r   r.      s   z$MessagePackDocument.integer_to_bytesr   r   ) r   r   r   __doc__r2   
text_basedsetr
   typeaddrF   
from_bytesr$   to_bytes	to_serstr_decimal_as_string_huge_numbers_as_stringr%   r   PackerUnpackerr   r=   r(   r*   rI   ra   ri   rv   r+   r.   r   r   r   r   r   r   6   sB    

4

r   c                   @   sP   e Zd ZdZdZdZdZdZdZddd	Z	dddZ
dd Zdd Zdd Zd
S )MessagePackRpcz2An integration class for the msgpack-rpc protocol.r   r   rK         r   c                 C   rj   )Nc                 s   rk   r   rl   rn   r   r   r   rN      rp   z3MessagePackRpc.create_out_string.<locals>.<genexpr>rq   rt   r   r   r   rv      rw   z MessagePackRpc.create_out_stringNc              
   C   s   zt jd|jfi | j|_W n ty% } ztd|jd}~ww zt	|j W n t
y8   tdw dt	|j  krIdksNtd tddS )rJ   rO    NzInput must be a sequence.r      z.Length of input iterable must be either 3 or 4)r   rY   rZ   rQ   r'   rX   r[   r   r\   rT   	TypeError)r   r]   r^   r`   r   r   r   ra      s$   	z!MessagePackRpc.create_in_documentc                 C   s   g }t |jdkr|j\}}}n|j\}}}}tjs%t|tr%|| j}|tj	kr2|tj
ks1J n|tjkr?|tjks>J n|tjkrGt td| d| jj |f |_d |_t|trg|rg||_d S ||_d S )Nr   zUnknown message type %rrb   )rT   rX   r   rC   r?   rD   re   rF   r   MSGPACK_REQUESTREQUESTMSGPACK_RESPONSERESPONSEMSGPACK_NOTIFYNotImplementedErrorr   r0   rf   rg   method_request_stringin_header_docr%   in_errorrc   )r   r]   message	msgparamsmsgtypemsgidmsgname_or_errorr   r   r   decompose_incoming_envelope   s.   





z*MessagePackRpc.decompose_incoming_envelopec                 C   s   || j | jfv s
J | jd| |jd u rtdd|j || j u r(|jj}n|| ju r2|jj}nt	d|j
rCtdi |j
|_
n|rQ| |||j| j|_ng |_| jd| d S )Nbefore_deserializeClientzMethod %r not found.what?after_deserializer   )r   r   event_manager
fire_event
descriptorr   r   
in_messageout_message	Exceptionr   _doc_to_objectrc   r1   	in_object)r   r]   r   
body_classr   r   r   deserialize  s&   





zMessagePackRpc.deserializec                    s>  |j jfv s
J jd| |jd ur(tjdt|jj	|jgg|_
d S |j u r9|jj tj}|jj}n|ju rH|jj tj}d }ntd d u rRd S  j}  }t| D ]\}\}}	|	}
|||j| |	|
 q^ jjdkr fdd|D }n |t }|d||gg|_
jd| d S )Nbefore_serializer   r   rK   c                 3   s     | ]}  |t V  qd S r   )_to_dict_valuer}   )rL   instout_typer   r   r   rN   _  s    z+MessagePackRpc.serialize.<locals>.<genexpr>after_serialize)r   r   r   r   	out_errorr   MSGPACK_ERRORr   to_dictr   rr   r   r   r   operation_namer   r   r   
_type_info	enumerateitemsget_cls_attrs	_safe_set
out_object
Attributes
max_occursr   r}   )r   r]   r   r   method_name_or_errorout_type_infoout_instanceikvattrsparamsr   r   r   	serialize6  s>   




zMessagePackRpc.serializerz   r   )r   r   r   r{   r2   r   r   r   r   rv   ra   r   r   r   r   r   r   r   r      s    

,r   )r{   
__future__r   logging	getLoggerr   loggerr   spyner   
spyne.utilr   spyne.model.faultr   spyne.model.primitiver   r   r	   spyne.protocol.dictdocr
   r   rS   rR   r%   rx   ry   r@   r   r   r   r   r   r   <module>   s"   
 