U
    H4f#                     @   s   d dl Z d dlmZ d dlmZmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZ e eZd	d
gZG dd	 d	eZG dd
 d
eZdS )    N)etree)
exceptionsns)
qname_attr)NotSetxsi_ns)Base)max_occurs_iter)	AnyObjectAnyAnyAttributec                       s   e Zd ZdZd fdd	Zdd Zdd	 Zd
d Zd ddZdd Z	d!ddZ
d"ddZdd Zdd Zdd Zdd Zd#ddZ  ZS )$r   N   strictc                    s:   t    || _|| _|| _|| _ddlm} | | _dS )a  

        :param process_contents: Specifies how the XML processor should handle
                                 validation against the elements specified by
                                 this any element
        :type process_contents: str (strict, lax, skip)

        r   )AnyTypeN)	super__init__
max_occurs
min_occursrestrictprocess_contentszeep.xsdr   type)selfr   r   r   r   r   	__class__ 9/tmp/pip-unpacked-wheel-04z2hmy8/zeep/xsd/elements/any.pyr      s    
zAny.__init__c                 C   s   |S Nr   )r   Z
any_objectr   r   r   __call__+   s    zAny.__call__c                 C   s   d| j j| jf S )Nz<%s(name=%r)>)r   __name__namer   r   r   r   __repr__.   s    zAny.__repr__c                 C   s   dS )NTr   )r   valuer   r   r   accept1   s    z
Any.acceptc           	   	   C   s  | j dkr|S t|j}|r|jr|jD ]}|j|jr*|} qq*|jD ]:}z|t	|d }|W   S  t
k
r   Y qLY qLX qLt|td}|d k	r||}|j|||dS | jr| jj|||dS z||j}|j|||dW S  tjtj
fk
r   | Y S X d S )Nskipr   r   context)r   r   QNametagZschemasZ	documentsZhas_schema_document_for_ns	namespaceZdeserializelistLookupErrorr   r   get_typeZparse_xmlelementr   Zget_elementparser   ZNamespaceError)	r   
xmlelementschemar'   qnameZcontext_schemadataZxsd_typeelementr   r   r   r.   4   s2    





z	Any.parsec                 C   s&   ||kr"| | || }||iS i S r   )remove)r   kwargsr    Zavailable_kwargsr#   r   r   r   parse_kwargsX   s
    
zAny.parse_kwargsc           	      C   sb   g }t | jD ]8}|rB| }| j|||d}|dk	rF|| q qHq| js^|rZ|d nd}|S )a  Consume matching xmlelements and call parse() on each of them

        :param xmlelements: Dequeue of XML element objects
        :type xmlelements: collections.deque of lxml.etree._Element
        :param schema: The parent XML schema
        :type schema: zeep.xsd.Schema
        :param name: The name of the parent element
        :type name: str
        :param context: Optional parsing context (for inline schemas)
        :type context: zeep.xsd.context.XmlParserContext
        :return: dict or None

        r&   Nr   )r	   r   popleftr.   appendaccepts_multiple)	r   Zxmlelementsr0   r    r'   resultZ_unusedr/   itemr   r   r   parse_xmlelements_   s    zAny.parse_xmlelementsc                 C   s   |d k	st | || | jrt|trddlm} t| j|rz|D ]2}t	|d}|
td| jj | ||| qDq| jr|D ]"}t	|| jj}| ||| qq|D ]}| ||| qn| ||| d S )Nr   )AnySimpleTyper;   r   )AssertionErrorvalidater9   
isinstancer+   r   r=   r   r   
SubElementsetr   r1   _render_value_itemr    )r   parentr#   render_pathr=   valnoder   r   r   render|   s     z
Any.renderc                 C   s   |d t fkrd S t|tjr(|| n| jrnt|trX|D ]}| jj||d |d q<q| jj||d |d n@t|jtr|jD ]}|j	j|||d qn|j	j||j|d d S )N)rE   )
r   r@   r   _Elementr8   r   r+   rH   r#   Zxsd_elm)r   rD   r#   rE   rF   r   r   r   rC      s    

zAny._render_value_itemc                 C   s   | j rzt|trzt|| jk r.td| j | jdkrbt| jtrbt|| jkrbtd| j |D ]}| 	|| qfn(| j
s|d tfkrtd| 	|| d S )Nz,Expected at least %d items (minOccurs check)Z	unboundedz+Expected at most %d items (maxOccurs check)zMissing element for Any)r9   r@   r+   lenr   r   ValidationErrorr   int_validate_itemis_optionalr   )r   r#   rE   rF   r   r   r   r?      s&    

zAny.validatec                 C   s   |d krd S | j r&tjtg| j j }ntjttg}|d tfkrZ| jstj	d| j
 |dnFt|t|sdd |D }dt|jd|f }td|dfd S )	NzMissing element %s)pathc                 S   s   g | ]}d |j |jf qS )z%s.%s)
__module__r   ).0tr   r   r   
<listcomp>   s     z&Any._validate_item.<locals>.<listcomp>z3Any element received object of type %r, expected %sz or 
z^See http://docs.python-zeep.org/en/master/datastructures.html#any-objects for more information)r   r   rI   dictZaccepted_typesr
   r   rN   r   rK   r    r@   tupler   r   join	TypeError)r   r#   rE   Zexpected_types
type_namesZerr_messager   r   r   rM      s0     zAny._validate_itemc                 C   s   | S r   r   r!   r   r   r   resolve   s    zAny.resolveTc                 C   s&   | j r| j j}nd}| jr"d| S |S )NANYz%s[])r   r    r9   )r   r0   
standalonebaser   r   r   	signature   s    
zAny.signature)r   r   r   N)N)NN)N)NT)r   rP   __qualname__r    r   r   r"   r$   r.   r6   r<   rH   rC   r?   rM   rZ   r^   __classcell__r   r   r   r   r      s$          
$

"c                   @   sP   e Zd ZdZeejdgZdddZ	dddZ
dd	 Zdd
dZdddZdS )r   Nr   r   c                 C   s   d | _ || _d S r   )r1   r   )r   r   r   r   r   r      s    zAnyAttribute.__init__c                 C   s,   i }|  D ]\}}|| jkr|||< q|S r   )items_ignore_attributes)r   
attributesr'   r:   keyr#   r   r   r   r.      s
    

zAnyAttribute.parsec                 C   s   | S r   r   r!   r   r   r   rZ      s    zAnyAttribute.resolvec                 C   s2   |d t fkrd S | D ]\}}||| qd S r   )r   ra   rB   )r   rD   r#   rE   r    rF   r   r   r   rH     s    zAnyAttribute.renderTc                 C   s   dS )Nz{}r   )r   r0   r\   r   r   r   r^   
  s    zAnyAttribute.signature)r   )N)N)NT)r   rP   r_   r    r   r(   r   ZXSIrb   r   r.   rZ   rH   r^   r   r   r   r   r      s   


)logginglxmlr   Zzeepr   r   Z
zeep.utilsr   Zzeep.xsd.constr   r   Zzeep.xsd.elements.baser   Zzeep.xsd.utilsr	   Zzeep.xsd.valueobjectsr
   	getLoggerr   logger__all__r   r   r   r   r   r   <module>   s   
 _