o
    j-                     @   s   d dl mZ d dlZee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 d dlmZ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 d dl m!Z! G dd deZ"G dd deeZ#dS )    )print_functionN)isgenerator)etree)LxmlSyntaxError)ProtocolContextBODY_STYLE_WRAPPED	ByteArrayFileArray)Break	coroutine)ProtocolMixin)ToParentMixin)ToClothMixin)BytesIO)RB)tlistc                       s   e Zd Zd fdd	Z  ZS )XmlClothProtocolContextNc                    s6   t t| ||| tg t| _tg t| _d| _d S )NF)	superr   __init__r   tuple
inst_stackr   
prot_stackdoctype_written)selfparent	transporttype	__class__ Z/var/www/html/LicenciasMiG/venv/lib/python3.10/site-packages/spyne/protocol/cloth/_base.pyr   *   s   
z XmlClothProtocolContext.__init__N)__name__
__module____qualname__r   __classcell__r!   r!   r   r"   r   )   s    r   c                       s   e Zd ZdZdZ				d' fdd	Zdd	 Zd
d Zd(ddZe	dd Z
dd Zdd Zd(ddZedd Zedd Zdd Ze	d)ddZdd  Zed!d" Zd#d$ Zd%d& Z  ZS )*XmlClothztext/xmlNutf8FTc                    sP   t t| j|||||	d | |||
 d| _|| _d| _|| _|| _|| _	d S )N)app	mime_typeignore_uncapignore_wrapperspolymorphicFxml)
r   r(   r   _init_clothdeveloper_modeencodingdefault_methoddoctypeuse_nsskip_root_tag)r   r*   r2   r4   r+   r,   r-   clothcloth_parserr.   strip_commentsr5   r6   r   r!   r"   r   6   s   
zXmlCloth.__init__c                 C   s
   t ||S r#   )r   )r   r   r   r!   r!   r"   get_contextG   s   
zXmlCloth.get_contextc                 C   s  || j | jfv s
J | jd| |jdu r%t |_td|jt|j |j	durg|j	}|j
}| }| jrD|f|_| ||||}n| j|j| jd}| |||||}W d   n1 saw   Y  n_|| ju snJ |jj}| }|jjtkr| jr|jd }	|jjrt|jdkr|j \}|jjrt|jdksn| }	t|j D ]\}
}t|	||j|
  qn|j\}	| |||	|}| jd| |S )zUses ``ctx.out_object``, ``ctx.out_header`` or ``ctx.out_error`` to
        set ``ctx.out_body_doc``, ``ctx.out_header_doc`` and
        ``ctx.out_document`` as an ``lxml.etree._Element instance``.

        Not meant to be overridden.
        before_serializeNz%r %dr2   r      after_serialize)REQUESTRESPONSEevent_manager
fire_event
out_streamr   loggerdebugid	out_errorr    get_type_namer1   
out_object_incgendocfiler2   	to_parent
descriptorout_message
body_styler   r-   
Attributes_wrapperlen
_type_infovalues	enumeratekeyssetattr)r   ctxmessageinstclsnameretvalxfresult_classresult_insti	attr_namer!   r!   r"   	serializeJ   sL   


zXmlCloth.serializec                 C   s"   t |jtr|j g|_dS dS )a  Sets an iterable of string fragments to ctx.out_string if the output
        is a StringIO object, which means we're run by a sync framework. Async
        frameworks have the out_stream write directly to the output stream so
        out_string should not be used.
        N)
isinstancerC   r   getvalue
out_string)r   rX   charsetr!   r!   r"   create_out_string   s   zXmlCloth.create_out_stringc           
      c   s"   |du r	|  }zm| j|j| jdY}d|j_tg t|j_	| 
|||||}t|rZz
	 dV }|| q. tyY } zz|| W n	 tyN   Y nw W Y d}~nd}~ww W d   W dS W d   W dS 1 sow   Y  W dS  ty }	 z|	jdkrn W Y d}	~	dS d}	~	ww )zhEntry point to the (stack of) XmlCloth-based protocols.

        Not supposed to be overridden.
        Nr<   FTzno content written)rH   rK   rC   r2   outprot_ctxr   r   r   protocolr   subserializer   sendr   throwStopIterationr   msg)
r   rX   r[   rZ   r\   r^   retsv2ber!   r!   r"   rJ      sB   
& 
zXmlCloth._incgenc                 O   s   t d|| tj|i |S )NzStarting file with %r %r)rD   rE   r   xmlfile)r   argskwargsr!   r!   r"   rK      s   zXmlCloth.docfilec                 C   sX   | j d ur| j S |d ur| jj S | jd ur| j jj S | jd ur*| j jj S d S r#   )r4   getroottreedocinfo_root_cloth_cloth)r   r7   r!   r!   r"   _get_doctype   s   


zXmlCloth._get_doctypec                 C   s8   |  |}|d u rd S || d|j_td| d S )NTzDoctype written as: '%s')r{   write_doctyperi   r   rD   rE   )r   rX   r   r7   dtr!   r!   r"   r|      s   

zXmlCloth.write_doctypec                 C      | j jS r#   )rP   
_xml_clothr[   r!   r!   r"   get_class_cloth      zXmlCloth.get_class_clothc                 C   r~   r#   )rP   _xml_root_clothr   r!   r!   r"   get_class_root_cloth   r   zXmlCloth.get_class_root_clothc           	      K   s   |  |}t|jdg }|d ur<t|dkr<|d |ur<|jjs'| ||| td d| j	||||||fi |fS | 
|}|d ure|jjsP| ||| td d| j||||||fi |fS dS )Neltstackr   zto object root clothTzto object cloth)FN)r   getattrrj   rR   ri   r   r|   rD   rE   to_root_clothr   to_parent_cloth)	r   rX   r[   rZ   r   r\   rv   cr   r!   r!   r"   check_class_cloths   s$   
 


zXmlCloth.check_class_cloths c                 k   s   |j j}||  tdtd| t| d}| |}	|	dur4td|  | 	||||	||}
nK| j
durOtd|  | |||| j
||}
d}n0| jdurjtd|  | 	|||| j||}
d}ntd	|  | j|||||fi |}
t|
rz
	 dV }|
| q ty } z)zz|
| W n	 ty   Y nw W | ||| n| ||| w W Y d}~nd}~ww | ||| |  td
td| t| dS )zbBridge between multiple XmlCloth-based protocols.

        Not supposed to be overridden.
        z%s push prot %r. newlen: %d%FNzto object cloth for %szto root cloth for %sTzto parent protocol cloth for %szto parent for %sz%s pop prot  %r. newlen: %d)rj   r   appendrD   rE   r   rR   r   rH   r   ry   r   rz   start_to_parentr   rl   r   rm   rn   _finalize_protocolpopr   )r   rX   r[   rZ   r   r\   rv   pstack
have_cloth	cls_clothrp   rq   rr   r!   r!   r"   rk      sT   




,zXmlCloth.subserializec                 C   sL   |r
|  || d S t|jjdkr"t|jjdkr$|  || d S d S d S )Nr=   r   )_close_clothrR   rj   r   r   )r   rX   r   r   r!   r!   r"   r     s    zXmlCloth._finalize_protocolc                 C   s   | d ur
d| |f }|S )Nz{%s}%sr!   )nsr\   r!   r!   r"   _gen_tagname%  s   zXmlCloth._gen_tagnamec           
      C   s   i }|j  D ]F\}}|j}|d u r|jj}|jj}|d u r |}t||d }| ||}t|j	t
tfr>| |j	|| j}	n| |j	|}	|	d urM|	||< q|S r#   )attrsitems_nsrP   sub_nssub_namer   r   
issubclassr   r   r	   
to_unicodebinary_encoding)
r   rZ   ftir   
field_name
field_typer   r   valvalstrr!   r!   r"   _gen_attrib_dict+  s&   
zXmlCloth._gen_attrib_dictc                 C   s   t d)Nz This is an output-only protocol.)NotImplementedError)r   rX   rY   r!   r!   r"   decompose_incoming_envelopeE  s   z$XmlCloth.decompose_incoming_envelope)Nr)   NNFFNNTTNFr#   )r   )r$   r%   r&   r+   HtmlMicroFormatr   r:   rc   rh   r   rJ   rK   r{   r|   staticmethodr   r   r   rk   r   r   r   r   r'   r!   r!   r   r"   r(   2   s8    
;

!
	

4	
r(   )$
__future__r   logging	getLoggerr$   rD   inspectr   lxmlr   
lxml.etreer   spyner   r   r   r	   r
   
spyne.utilr   r   spyne.protocolr   spyne.protocol.cloth.to_parentr   spyne.protocol.cloth.to_clothr   spyne.util.sixr   spyne.util.colorr   r   spyne.util.tlistr   r   r(   r!   r!   r!   r"   <module>   s    
	