U
    H4f]                     @   s   d Z ddlZddlmZ ddlmZmZmZ ddlm	Z	 ddl
mZ ejrVddlmZ dd	d
dZdejejdddZdejejej dddZdejejdddZdejejdddZdejejdddZdS )z*
    zeep.wsdl.parse
    ~~~~~~~~~~~~~~~

    N)etree)IncompleteMessageLookupErrorNamespaceError)
qname_attr)definitions)
Definitionz http://schemas.xmlsoap.org/wsdl/z)http://www.w3.org/2006/05/addressing/wsdlz-http://www.w3.org/2007/05/addressing/metadata)wsdlwsawwsamr   )r	   
xmlelementreturnc              
   C   s   | j }t|d|}|stdg }|jdtdD ]}|d}t|d}t|d}z,|dk	rh| j|}|dk	r|| j|}W n* t	t
fk
r   td|j|f Y nX t||}	|||	f q0t|}
|D ]\}}|
|| q|
S )	a[  Create an AbstractMessage object from a xml element.

    Definition::

        <definitions .... >
            <message name="nmtoken"> *
                <part name="nmtoken" element="qname"? type="qname"?/> *
            </message>
        </definitions>

    :param wsdl: The parent definition instance
    :param xmlelement: The XML node

    namez2Message element is missing required name attributez	wsdl:part
namespaceselementtypeNzSThe wsdl:message for %r contains an invalid part (%r): invalid xsd type or elements)target_namespacer   r   findallNSMAPgettypesZget_elementget_typer   r   textr   ZMessagePartappendAbstractMessageZadd_part)r	   r   ZtnsZmessage_namepartspartZ	part_nameZpart_elementZ	part_typemessage_partmsgZ
part_value r    3/tmp/pip-unpacked-wheel-04z2hmy8/zeep/wsdl/parse.pyparse_abstract_message   s4    




r"   c           
   	   C   s  | d}di i}|D ]}t|jj}|dkr2qt|d| j}| d}|sZtd| z|  d|j}W n t	k
r   Y  dS X |dkr||d	< | tt
d
 d}	|	s| tt
d d}	|	r|	|d< q|dkr||d< q||d |< q||d< | d|d< tjf |S )a
  Create an AbstractOperation object from a xml element.

    This is called from the parse_port_type function since the abstract
    operations are part of the port type element.

    Definition::

        <wsdl:operation name="nmtoken">*
           <wsdl:documentation .... /> ?
           <wsdl:input name="nmtoken"? message="qname">?
               <wsdl:documentation .... /> ?
           </wsdl:input>
           <wsdl:output name="nmtoken"? message="qname">?
               <wsdl:documentation .... /> ?
           </wsdl:output>
           <wsdl:fault name="nmtoken" message="qname"> *
               <wsdl:documentation .... /> ?
           </wsdl:fault>
        </wsdl:operation>

    :param wsdl: The parent definition instance
    :param xmlelement: The XML node

    r   Zfault_messages)inputoutputfaultmessagez7Operation/%s element is missing required name attributemessagesNr#   Zinput_messager   Actionr
   
wsa_actionr$   Zoutput_messageZparameterOrderZparameter_order)r   r   QNametag	localnamer   r   r   r   
IndexErrorr   r   AbstractOperation)
r	   r   r   kwargsZmsg_nodeZtag_nameZ	param_msg
param_nameZparam_valuer)   r    r    r!   parse_abstract_operationN   s:    




r1   c                 C   sV   t |d| j}|dk	sti }|jdtdD ]}t| |}|r,|||j< q,t||S )aX  Create a PortType object from a xml element.

    Definition::

        <wsdl:definitions .... >
            <wsdl:portType name="nmtoken">
                <wsdl:operation name="nmtoken" .... /> *
            </wsdl:portType>
        </wsdl:definitions>

    :param wsdl: The parent definition instance
    :param xmlelement: The XML node

    r   Nzwsdl:operationr   )	r   r   AssertionErrorr   r   r1   r   r   PortType)r	   r   r   
operationselm	operationr    r    r!   parse_port_type   s    
r7   c                 C   s(   | d}t|d| j}tj|||dS )a  Create a Port object from a xml element.

    This is called via the parse_service function since ports are part of the
    service xml elements.

    Definition::

        <wsdl:port name="nmtoken" binding="qname"> *
           <wsdl:documentation .... /> ?
           <-- extensibility element -->
        </wsdl:port>

    :param wsdl: The parent definition instance
    :param xmlelement: The XML node

    r   binding)binding_namer   )r   r   r   r   Port)r	   r   r   r9   r    r    r!   
parse_port   s    
r;   c                 C   s\   | d}g }|jdtdD ]}t| |}|r|| qt|}|D ]}|| qH|S )a  

    Definition::

        <wsdl:service name="nmtoken"> *
            <wsdl:documentation .... />?
            <wsdl:port name="nmtoken" binding="qname"> *
               <wsdl:documentation .... /> ?
               <-- extensibility element -->
            </wsdl:port>
            <-- extensibility element -->
        </wsdl:service>

    Example::

          <service name="StockQuoteService">
            <documentation>My first service</documentation>
            <port name="StockQuotePort" binding="tns:StockQuoteBinding">
              <soap:address location="http://example.com/stockquote"/>
            </port>
          </service>

    :param wsdl: The parent definition instance
    :param xmlelement: The XML node

    r   z	wsdl:portr   )r   r   r   r;   r   r   ServiceZadd_port)r	   r   r   ZportsZ	port_nodeportobjr    r    r!   parse_service   s    


r?   )__doc__typinglxmlr   Zzeep.exceptionsr   r   r   Z
zeep.utilsr   Z	zeep.wsdlr   TYPE_CHECKINGZzeep.wsdl.wsdlr   r   Z_Elementr   r"   Optionalr.   r1   r3   r7   r:   r;   r<   r?   r    r    r    r!   <module>   s8    7 
B  