
:>"^/                 @   s   d  Z  d d l m Z d d l m Z d d l m Z d d l m	 Z	 Gd d   d e
  Z d d	 d
 d d  Z d d   Z Gd d   d e	  Z Gd d   d e j  Z d S)z5Code for calling and parsing ScanProsite from ExPASy.    )urlopen)	urlencode)handler)ExpatParserc               @   s"   e  Z d  Z d Z d d   Z d S)RecordzRepresents search results returned by ScanProsite.

    This record is a list containing the search results returned by
    ScanProsite. The record also contains the data members n_match,
    n_seq, capped, and warning.
    c             C   s(   d |  _  d |  _ d |  _ d |  _ d S)zInitialize the class.N)n_matchn_seqZcappedwarning)self r   ;/tmp/pip-build-ww9dw3qa/biopython/Bio/ExPASy/ScanProsite.py__init__   s    			zRecord.__init__N)__name__
__module____qualname____doc__r   r   r   r   r   r      s   r    zhttps://www.expasy.orgxmlc       
      K   sq   d |  d | i } x0 | j    D]" \ } } | d k	 r | | | <q Wt |  } d | | f } t |  }	 |	 S)a  Execute a ScanProsite search.

    Arguments:
     - mirror:   The ScanProsite mirror to be used
                 (default: https://www.expasy.org).
     - seq:      The query sequence, or UniProtKB (Swiss-Prot,
                 TrEMBL) accession
     - output:   Format of the search results
                 (default: xml)

    Further search parameters can be passed as keywords; see the
    documentation for programmatic access to ScanProsite at
    https://www.expasy.org/tools/scanprosite/ScanPrositeREST.html
    for a description of such parameters.

    This function returns a handle to the search results returned by
    ScanProsite. Search results in the XML format can be parsed into a
    Python object, by using the Bio.ExPASy.ScanProsite.read function.

    seqoutputNz %s/cgi-bin/prosite/PSScan.cgi?%s)items
_urlencode_urlopen)
r   Zmirrorr   keywords
parameterskeyvaluecommandurlhandler   r   r   scan    s    r    c             C   s9   t    } t   } | j |  | j |   | j } | S)zBParse search results returned by ScanProsite into a Python object.)ContentHandlerParsersetContentHandlerparserecord)r   Zcontent_handlerZ	saxparserr%   r   r   r   read?   s    			r&   c               @   s1   e  Z d  Z d Z d d   Z d d d  Z d S)r"   z7Process the result from a ScanProsite search (PRIVATE).c             C   s   t  j |   d |  _ d S)zInitialize the class.TN)r   r   	firsttime)r
   r   r   r   r   O   s    zParser.__init__r   c             C   sP   |  j  r4 | d d  j d  d k r4 t |   d |  _  t j |  | |  S)zRaise an Error if plain text is received in the data.

        This is to show the Error messages returned by ScanProsite.
        N   zutf-8z<?xmlF)r'   decode
ValueErrorr   feed)r
   dataZisFinalr   r   r   r+   T   s
    
		zParser.feedN)r   r   r   r   r   r+   r   r   r   r   r"   L   s   r"   c               @   sR   e  Z d  Z d Z d Z d Z d
 d   Z d d   Z d d   Z d d   Z	 d S)r!   zAProcess and fill in the records, results of the search (PRIVATE).startstopsequence_acsequence_idsequence_dbsignature_aclevel	level_tagc             C   s   g  |  _  d S)zInitialize the class.N)element)r
   r   r   r   r   r   s    zContentHandler.__init__c             C   s   |  j  j |  d |  _ |  j  d g k rf t   |  _ t | d  |  j _ t | d  |  j _ n+ |  j  d d g k r i  } |  j j |  d S)z>Define the beginning of a record and stores the search record.r   matchsetr   r   matchN)r5   appendcontentr   r%   intr   r   )r
   nameattrsr7   r   r   r   startElementv   s    	zContentHandler.startElementc             C   s   | |  j  j   k s t  t |  } |  j  d d g k r |  j d } | t j k rn t |  j  | | <n, | t j	 k r |  j | | <n |  j | | <d S)z$Define the end of the search record.r6   r7      N)
r5   popAssertionErrorstrr%   r!   integersr:   r9   strings)r
   r;   r7   r   r   r   
endElement   s    zContentHandler.endElementc             C   s   |  j  | 7_  d S)zStore the record content.N)r9   )r
   r9   r   r   r   
characters   s    zContentHandler.charactersN)zstartzstop)r/   r0   r1   r2   zlevelr4   )
r   r   r   r   rC   rD   r   r=   rE   rF   r   r   r   r   r!   e   s        r!   N)r   Z	Bio._py3kr   r   r   r   Zxml.saxr   Zxml.sax.expatreaderr   listr   r    r&   r"   r!   r   r   r   r   <module>   s   