U
    _-                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	Z	e	
dZe	eZe	 Zee	j ee ee e dZdZedd	d
 edD 7 Zeed7 ZG dd dejZe ZdddZdddZdS )    N)urllib)	constants)AttributeStringErrorz)%(asctime)s - %(levelname)s - %(message)sz\w+=z
	%;=&, c                 C   s   g | ]}t |qS  )chr).0ir   r   .lib/python3.8/site-packages/gffutils/parser.py
<listcomp>9   s     r          c                   @   s   e Zd Zdd ZdS )Quoterc                 C   s(   |t krdt|}n|}|| |< |S )Nz%{:02X})	_to_quoteformatord)selfbresr   r   r
   __missing__A   s
    zQuoter.__missing__N)__name__
__module____qualname__r   r   r   r   r
   r   @   s   r   Fc                    s   s
t  | sdS g }tjs( d dkr.| }nFi }|  D ]8\}}g ||< |D ]"}|| ddd |D  qNq: d rg }	| D ]>\}
}t|dkr|D ]}|	|
|gf qq|	|
|f qnt| }	 fdd	}|r|	j|d
 |	D ]\}
}|rR|rt	|} d |}|rL d r8d| } d |
|g}n|
}n& d dkrt d |
dg}n|
}|| q d |} d r|d7 }|S )a  
    Reconstructs the original attributes string according to the dialect.

    Parameters
    ==========
    keyvals : dict
        Attributes from a GFF/GTF feature

    dialect : dict
        Dialect containing info on how to reconstruct a string version of the
        attributes

    keep_order : bool
        If True, then perform sorting of attribute keys to ensure they are in
        the same order as those provided in the original file.  Default is
        False, which saves time especially on large data sets.

    sort_attribute_values : bool
        If True, then sort values to ensure they will always be in the same
        order.  Mostly only useful for testing; default is False.
    r   fmtgff3c                 S   s   g | ]}t | qS r   )quoter)r   jr   r   r
   r   q   s     z _reconstruct.<locals>.<listcomp>repeated keys   c                    s0   z d  | d W S  tk
r*   Y dS X d S )Norderr   g    .A)index
ValueError)xdialectr   r
   sort_key   s    z_reconstruct.<locals>.sort_key)keyzmultival separatorquoted GFF2 valuesz"%s"keyval separatorgtfz""field separatortrailing semicolon;)
r   r   ignore_url_escape_charactersitemsappendjoinlenlistsortsorted)Zkeyvalsr$   Z
keep_orderZsort_attribute_valuespartsZ
attributeskvr	   r.   r&   valr%   Zval_strpartZ	parts_strr   r#   r
   _reconstructL   sR    "

r:   c              	      sd  dd }d}|dkr$t  tj}d}ddlm} | }| sD||fS |s@|d r\| d	} | |d
 }|d  |d rg }|D ]B}|r|d d	kr|dd }||	   dd |D }	q|d dkr fdd|D }	n\|d }
g }t
|D ]F\}}|dkr|
r|dd }||	   dd |D }	q|d }|	D ]}t|dkrj|\}}n:t|dkr|d }d}n|d }|d |dd }z||  W n tk
r   g ||< Y nX |rt|dkr|d dkr|d dkr|dd }|rN|d}|| | qN|||}||fS g |d< | d d	krj| dd } d|d< dD ],}| |}t|dkrn||d
<  qqnt|d rdd |D }	d|d< d|d< nbd|d< g }|D ]B}|r|d d	kr|dd }d|d< ||	 d qdd |D }	|	D ]}t|dkrN|\}}n:t|dkrj|d }d}n|d }|d |dd }||krd|d < ng ||< t|dkr|d dkr|d dkr|dd }d|d< |r |d}t|dkr|d  rtd!|| | |d | q2|d dkrR|d rRd"|d< |||}||fS )#a  
    Given the string attributes field of a GFF-like line, split it into an
    attributes dictionary and a "dialect" dictionary which contains information
    needed to reconstruct the original string.

    Lots of logic here to handle all the corner cases.

    If `dialect` is None, then do all the logic to infer a dialect from this
    attribute string.

    Otherwise, use the provided dialect (and return it at the end).
    c                 S   s>   t js:|d dkr:|  D ]\}}dd |D }|| |< q| S )z
        Handles the unquoting (decoding) of percent-encoded characters.

        See notes on encoding/decoding above.
        r   r   c                 S   s   g | ]}t j|qS r   )r   parseZunquote)r   r7   r   r   r
   r      s     z:_split_keyvals.<locals>._unquote_quals.<locals>.<listcomp>)r   r-   r.   )qualsr$   r&   valsZunquotedr   r   r
   _unquote_quals   s
    
z&_split_keyvals.<locals>._unquote_qualsFNTr   )featurer+   r,   r*   r(   zleading semicolonr   c                 S   s&   g | ]}|d  d |dd fqS r    r   Nr0   r   pr   r   r
   r      s     z"_split_keyvals.<locals>.<listcomp>r   r   c                    s   g | ]}|  qS r   splitrC   Zkvsepr   r
   r      s     c                 S   s&   g | ]}|d  d |dd fqS r@   rB   rC   r   r   r
   r      s     r'      r   ",r   )z ; z; r,   c                 S   s   g | ]}| d qS )=rE   rC   r   r   r
   r   )  s     rL   rA   c                 S   s&   g | ]}|d  d |dd fqS r@   rB   rC   r   r   r
   r   7  s     r   zTInternally inconsistent attributes formatting: some have repeated keys, some do not.r)   )copyr   r$   gffutilsr?   Z
dict_classrstriprF   r/   strip	enumerater1   r0   KeyErrorextendgff3_kw_patmatchr   )Z
keyval_strr$   r>   Zinfer_dialectr?   r<   r5   piecesrD   Zkey_valsZleadingsemicolonr	   Zquoteditemr&   r8   r=   sepr   rG   r
   _split_keyvals   s    

*







*


rY   )FF)N) rerM   collectionsZ	six.movesr   rN   r   Zgffutils.exceptionsr   ZloggingZ	Formatter	formatterZ	getLoggerr   loggerZStreamHandlerZchZsetLevelINFOZsetFormatterZ
addHandlercompilerT   r   r0   ranger   defaultdictr   r   r:   rY   r   r   r   r
   <module>   s,   




%	  
e