B
    HVvgv  ã               @   sŠ   d dl Z d dlZd dlmZ d dlmZ e dej¡Ze d¡Z	dd„ Z
dd	„ Zd
d„ Zddd„Zdd„ Zeddd„ƒZeddd„ƒZdS )é    N)Údeque)ÚcontextmanageraZ  
(
 (?:                     # Start of non-capturing group
  (?:\r\n|\r|\n)      |  # Match any single newline, or
  [^\r\n'"]+          |  # Match any character series without quotes or
                         # newlines, or
  "(?:[^"\\]|\\.)*"   |  # Match double-quoted strings, or
  '(?:[^'\\]|\\.)*'      # Match single quoted strings
 )
)
z(\r\n|\r|\n)c             C   sX   t | ƒ}t |¡}dg}x:|D ]2}|s*qqt |¡r@| d¡ q|d  |7  < qW |S )z™Split a string on all unquoted newlines.

    Unlike str.splitlines(), this will ignore CR/LF/CR+LF if the requisite
    character is inside of a string.Ú éÿÿÿÿ)ÚstrÚSPLIT_REGEXÚsplitÚ
LINE_MATCHÚmatchÚappend)ZstmtÚtextÚlinesZoutputlinesÚline© r   ú4/tmp/pip-install-o3oxmrkh/sqlparse/sqlparse/utils.pyÚsplit_unquoted_newlines$   s    


r   c             C   s8   | dkrdS | d dkr4| d | d kr4| dd… } | S )z4Helper that removes surrounding quotes from strings.Nr   )ú"ú'ú`r   é   r   )Úvalr   r   r   Úremove_quotes6   s
    r   c                 s   ‡ fdd„}|S )zqFunction decorator to help with recursion

    :param cls: Classes to not recurse over
    :return: function
    c                s   ‡‡ ‡fdd„‰ˆS )Nc                s0   x"|   ¡ D ]}t|ˆ ƒs
ˆ|ƒ q
W ˆ| ƒ d S )N)Zget_sublistsÚ
isinstance)ZtlistZsgroup)ÚclsÚfÚ	wrapped_fr   r   r   F   s    
z(recurse.<locals>.wrap.<locals>.wrapped_fr   )r   )r   )r   r   r   ÚwrapE   s    zrecurse.<locals>.wrapr   )r   r   r   )r   r   Úrecurse?   s    	r   c                s–   |}|rt |tƒs|gn|}|r0t |tƒs0|gn|}ˆ dkr@dS |rRt ˆ |ƒrRdS |rpt‡ fdd„|D ƒƒrpdS |rŽt‡ fdd„|D ƒƒrŽdS dS dS )a  Helper function to simplify comparisons Instance, Match and TokenType
    :param token:
    :param i: Class or Tuple/List of Classes
    :param m: Tuple of TokenType & Value. Can be list of Tuple for multiple
    :param t: TokenType or Tuple/List of TokenTypes
    :return:  bool
    NFTc             3   s   | ]}ˆ j |Ž V  qd S )N)r
   )Ú.0Úpattern)Útokenr   r   ú	<genexpr>a   s    zimt.<locals>.<genexpr>c             3   s   | ]}ˆ j |kV  qd S )N)Úttype)r   r"   )r    r   r   r!   c   s    )r   ÚlistÚany)r    ÚiÚmÚtZclssÚtypesZ	mpatternsr   )r    r   ÚimtQ   s    r)   c             C   s   t t | |¡dd� dS )zCAdvance the iterator n-steps ahead. If n is none, consume entirely.r   )ÚmaxlenN)r   Ú	itertoolsÚislice)ÚiteratorÚnr   r   r   Úconsumei   s    r/   c             c   s&   |  j |7  _ d V  |  j |8  _ d S )N)Úoffset)Úfilter_r.   r   r   r   r0   n   s    r0   r   c             c   s&   |  j |7  _ d V  |  j |8  _ d S )N)Úindent)r1   r.   r   r   r   r2   u   s    r2   )NNN)r   )r   )r+   ÚreÚcollectionsr   Ú
contextlibr   ÚcompileÚVERBOSEr   r	   r   r   r   r)   r/   r0   r2   r   r   r   r   Ú<module>   s   



	
