B
    b                 @   s|   d 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
dddZdd ZG dd deZG d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cappedZwarning)self r
   5lib/python3.7/site-packages/Bio/ExPASy/ScanProsite.py__init__   s    zRecord.__init__N)__name__
__module____qualname____doc__r   r
   r
   r
   r   r      s   r    https://www.expasy.orgxmlc       
      K   sP   | |d}x$|  D ]\}}|dk	r|||< qW t|}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)itemsr   r   )
r   Zmirrorr   keywordsZ
parameterskeyvalueZcommandZurlhandler
   r
   r   scan    s    
r   c             C   s*   t  }t }|| ||  |j}|S )zBParse search results returned by ScanProsite into a Python object.)ContentHandlerParserZsetContentHandlerparserecord)r   Zcontent_handlerZ	saxparserr   r
   r
   r   read?   s    

r    c               @   s"   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 |  d| _dS )zInitialize the class.TN)r   r   	firsttime)r	   r
   r
   r   r   O   s    
zParser.__init__r   c             C   s8   | j r$|dd ddkr$t|d| _ t| ||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   r   L   s   r   c               @   s8   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)Zsequence_acZsequence_idZsequence_dbZsignature_aclevelZ	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   sj   | j | d| _| j dgkrHt | _t|d | j_t|d | j_n| j ddgkrfi }| j| dS )z>Define the beginning of a record and stores the search record.r   matchsetr   r   matchN)r*   appendcontentr   r   intr   r   )r	   nameZattrsr,   r
   r
   r   startElementv   s    zContentHandler.startElementc             C   sh   || j  kst| j ddgkrd| jd }|tjkrDt| j||< n |tjkrZ| j||< n
| j||< dS )z$Define the end of the search record.r+   r,   N)	r*   popAssertionErrorr   r   integersr/   r.   strings)r	   r0   r,   r
   r
   r   
endElement   s    


zContentHandler.endElementc             C   s   |  j |7  _ dS )zStore the record content.N)r.   )r	   r.   r
   r
   r   
characters   s    zContentHandler.charactersN)
r   r   r   r   r5   r6   r   r1   r7   r8   r
   r
   r
   r   r   e   s   r   N)r   r   r   )r   Zurllib.requestr   Zurllib.parser   Zxml.saxr   Zxml.sax.expatreaderr   listr   r   r    r   r   r
   r
   r
   r   <module>   s   
