U
    Te	                     @  sB  d dl mZ 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m
Z
 d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm Z  d dlm!Z! d dlm"Z" d dlm#Z# d dlm$Z$ d dlm%Z% d dlm&Z& d d lm'Z' d d!lm(Z( d d"lm)Z) d d#lm*Z* d d$lm+Z+ d d%lm,Z, d d&lm-Z- d d'lm.Z. d d(lm/Z/ d d)lm0Z0 d d*l1m2Z2 d d+l3m4Z4 d d,l5m6Z6 d-Z7d.Z8d/Z9d0Z:d1Z;G d2d3 d3Z<dS )4    )annotationsN)decode)RFC_3339_LOOSE)_escaped)parse_rfc3339)	Container)EmptyKeyError)EmptyTableNameError)InternalParserError)InvalidCharInStringError)InvalidControlChar)InvalidDateError)InvalidDateTimeError)InvalidNumberError)InvalidTimeError)InvalidUnicodeValueError)
ParseError)UnexpectedCharError)UnexpectedEofError)AoT)Array)Bool)BoolType)Comment)Date)DateTime)Float)InlineTable)Integer)Item)Key)KeyType)Null)	SingleKey)String)
StringType)Table)Time)Trivia)
Whitespace)Source)TOMLChar)TOMLDocument	   
            c                   @  s(  e Zd ZdZdddddZedd Zed	d
 Zedd Zedd Z	ddddZ
d|dddddZd}ddddddZd~dd Zddd!d"Zddd#d$Zefd%d&Zd'dd(d)Zd*d+dd,d-d.Zd/d/dd0d1d2Zd3dd4d5Zddd7d8d9d:Zddd<d=d>d?Zd/dd@dAZd/ddBdCZd/ddDdEZd*ddFdGZdHdI ZdJdK ZdLdMdNdOdPZdQddRdSZdTddUdVZ ddWdXdYdZd[Z!d\dd]d^Z"d\dd_d`Z#dadb Z$dcd\dddedfZ%ddgdhdidjdkdlZ&dmddndoZ'dpd/dqdrdsdtZ(dddudvdwZ)ddxdydzd{Z*dS )Parserz$
    Parser for TOML documents.
    zstr | bytesNone)stringreturnc                 C  s   t t|| _g | _d S N)r*   r   _src
_aot_stack)selfr4    r:   m/mounts/lovelace/software/anaconda3/envs/qiime2-amplicon-2024.2/lib/python3.8/site-packages/tomlkit/parser.py__init__?   s    zParser.__init__c                 C  s   | j jS r6   )r7   stater9   r:   r:   r;   _stateE   s    zParser._statec                 C  s   | j jS r6   )r7   idxr>   r:   r:   r;   _idxI   s    zParser._idxc                 C  s   | j jS r6   )r7   currentr>   r:   r:   r;   _currentM   s    zParser._currentc                 C  s   | j jS r6   )r7   markerr>   r:   r:   r;   _markerQ   s    zParser._markerstr)r5   c                 C  s
   | j  S )z=
        Extracts the value between marker and index
        )r7   extractr>   r:   r:   r;   rG   U   s    zParser.extractNztype[ParseError] | Nonebool)	exceptionr5   c                 C  s   | j j|dS )z
        Increments the parser if the end of the input has not been reached.
        Returns whether or not it was able to advance.
        rI   )r7   inc)r9   rI   r:   r:   r;   rK   [   s    z
Parser.incint)nrI   r5   c                 C  s   | j j||dS )zm
        Increments the parser by n characters
        if the end of the input has not been reached.
        )rM   rI   )r7   inc_n)r9   rM   rI   r:   r:   r;   rN   b   s    zParser.inc_nr   c                 C  s   | j j|||dS )zD
        Consume chars until min/max is satisfied is valid.
        )charsminmax)r7   consume)r9   rP   rQ   rR   r:   r:   r;   rS   i   s    zParser.consumec                 C  s
   | j  S )zN
        Returns True if the parser has reached the end of the input.
        )r7   endr>   r:   r:   r;   rT   o   s    z
Parser.endc                 C  s   | j   dS )zA
        Sets the marker to the index's current position
        N)r7   markr>   r:   r:   r;   rU   u   s    zParser.markc                 O  s   | j j|f||S )zJ
        Creates a generic "parse error" at the current position.
        )r7   parse_error)r9   rI   argskwargsr:   r:   r;   rV   {   s    zParser.parse_errorr,   c              
   C  s*  t d}|  s| jdkrq|  }|s*q|\}}|d k	rB| sN| ||sz||| W n4 tk
r } z| t	t
||W 5 d }~X Y nX |   q|  s|  \}}t|tr| r| ||}z||| W q tk
r } z| t	t
||W 5 d }~X Y qX q|d |S )NT[F)r,   rT   rC   _parse_itemis_multi	_merge_wsappend	ExceptionrV   r   rF   rU   _parse_table
isinstancer&   is_aot_element
_parse_aotparsing)r9   bodyitemkeyvalueer:   r:   r;   parse   s0    
$

&
zParser.parser   r   )re   	containerr5   c                 C  sn   |  }|sdS t|tr$t|ts(dS | jt|jt|j  }|jd d t| j|| j f|jd< dS )z
        Merges the given Item with the last one currently in the given Container if
        both are whitespace items.

        Returns True if the items were merged.
        FrO   r   T)	last_itemr`   r)   rA   lensrd   r7   )r9   re   rj   laststartr:   r:   r;   r\      s    
zParser._merge_wsr    )parentchildr5   c                 C  s0   t |}t |}||krdS ||dt| kS )z
        Returns whether a key is strictly a child of another key.
        AoT siblings are not considered children of one another.
        FN)tuplerl   )r9   rp   rq   Zparent_partschild_partsr:   r:   r;   	_is_child   s
    zParser._is_childztuple[Key | None, Item] | Nonec              
   C  s   |    | j}| j}|dkrB|   dt|  fW  5 Q R  S |dkrp|  sdt|  fW  5 Q R  S q|dkr|  }|  \}}}dtt||||fW  5 Q R  S |dkrW 5 Q R  dS d|_	qqW 5 Q R X | 
dS )zw
        Attempts to parse the next item and returns it, along with its key
        if the item is value-like.
        
N 	#rY   T)rU   r?   rC   rK   r)   rG   _parse_comment_trailr   r(   restore_parse_key_value)r9   r=   cindentcwscommenttrailr:   r:   r;   rZ      s$    "zParser._parse_itemTztuple[str, str, str])parse_trailr5   c                 C  sL  |   rdS d}d}|   | j}|dkr.qn|dkr|  }|   |   |   s| j st| j}|tks|tkr|t	kr| 
t|d|  sNqqN|  }|   qn|dkr|   n| 
t||   rqqd}|rB| j r|  rq| jdkr|   | jdkr |   | j| jks:| j rB|  }|||fS )z
        Returns (comment_ws, comment, trail)
        If there is no comment, comment_ws and comment will
        simply be empty.
        ) r   r   r   ru   rw   commentsrv   )rT   rU   rC   rG   rK   Zis_nlordCHR_DELCTRL_CHAR_LIMITCTRL_IrV   r   r   	is_spacesrA   rE   is_ws)r9   r   r~   
comment_wsr{   coder   r:   r:   r;   rx      sJ    

zParser._parse_comment_trailFztuple[Key, Item])parse_commentr5   c           
      C  s   |    | j r|  rq|  }|  }|    | jdk}| j rr|  rr| jdkr>|rl| tdq>d}q>|s| t| j|j	s|  |_	n| j	|  7  _	| 
 }|r|  \}}}|j}	|	js||	_||	_||	_nd|j_||j_||fS )N=Tr   )rU   rC   r   rK   rG   
_parse_keyZ	is_kv_seprV   r   sep_parse_valuerx   triviar   r~   r   r|   )
r9   r   r|   rf   Zfound_equalsvalr}   r~   r   metar:   r:   r;   rz   -  s8    

zParser._parse_key_valuec                 C  s:   |    | j r|  rq| jdkr.|  S |  S dS )zz
        Parses a Key at the current position;
        WS before the key must be exhausted first at the callsite.
        z"'N)rU   rC   r   rK   _parse_quoted_key_parse_bare_keyr>   r:   r:   r;   r   \  s    
zParser._parse_keyc                   s   |   }| j t fddtD d}|dkr6td| |tjkrJtjntj	}|j
 rl| t|j
j|| 7 }|   | j r|  rq||   7 }tt||d|d}| jdkr|   ||  }|S )zJ
        Parses a key enclosed in either single or double quotes.
        c                 3  s   | ]}|j  kr|V  qd S r6   )rg   ).0tZquote_styler:   r;   	<genexpr>q  s     
 z+Parser._parse_quoted_key.<locals>.<genexpr>Nz+Should not have entered _parse_quoted_key()r   )r   r   original.)rG   rC   nextr!   RuntimeError_parse_stringBasicr%   SLBSLL_tis_multilinerV   r   rg   	as_stringrU   r   rK   r#   rF   concatr   )r9   r   key_typekey_strrf   r:   r   r;   r   j  s(    

zParser._parse_quoted_keyc                 C  s   | j  s| j  r|  rq |  }| }|s<| td|krX| td| dt	|t
jd|}| j dkr|   ||  }|S )z$
        Parses a bare key.
         zInvalid key ""r   r   )rC   Zis_bare_key_charr   rK   rG   striprV   r   r   r#   r!   Barer   r   )r9   r   rf   r:   r:   r;   r     s$    

zParser._parse_bare_keyc                 C  s<  |    | j}t }|tjjkr(|  S |tjjkr<|  S |t	j
jd krT|  S |t	jjd krl|  S |dkr||  S |dkr|  S |dks| ddkr| jdkr|  rq|  }| ||}|dk	r|S | tnT|tjkr,| jdkr
|  r
 q|  }t|}|r|d	r|d
rzFt|}t|tjsVtt|j |j!|j"|j#|j$|j%|j&|j'||
W S  t(k
r   | t)Y nX |d	rzt|}t|tj*stt+|j |j!|j"||}|    | jdkr|  rq|  }|, }	|t-|	d |_.|	s0|W S t||	 }t|tjsNtt|j |j!|j"|j#|j$|j%|j&|j'|||	 
W S  t(k
r   | t/Y nX |d
rz:t|}
t|
tj0stt1|
j#|
j$|
j%|
j&|
j'||W S  t(k
r   | t2Y nX | ||}|dk	r |S | tn| t3|dS )zD
        Attempts to parse a value at the current position.
        r   rY   {z+-   >   nan+nan-inf-naninf+inf 	
#,]}N      z	
#,]})4rU   rC   r(   r%   r   rg   _parse_basic_stringr   _parse_literal_stringr   TRUE_parse_trueFALSE_parse_false_parse_array_parse_inline_table_peekrK   rG   _parse_numberrV   r   r4   digitsr   matchgroupr   r`   datetimeAssertionErrorr   yearmonthdayhourminutesecondmicrosecondtzinfo
ValueErrorr   dater   rstriprl   r   r   timer'   r   r   )r9   r{   r   rawre   mdtr   Ztime_rawZ	time_partr   r:   r:   r;   r     s    	
	
zParser._parse_valuec                 C  s   |  tjS r6   )_parse_boolr   r   r>   r:   r:   r;   r     s    zParser._parse_truec                 C  s   |  tjS r6   )r   r   r   r>   r:   r:   r;   r   !  s    zParser._parse_falser   r   )styler5   c              
   C  sL   | j < t|}|D ]}| j|ddd qt|t W  5 Q R  S Q R X d S )Nr   )rQ   rR   )r?   r   rS   r   r(   )r9   r   r{   r:   r:   r;   r   $  s
    zParser._parse_boolr   c           
      C  sj  | j td g }d }| j}| tjtj  | j|| j }ttjt|@ }|rb|	t
| q| jdkr| jdd\}}}|	tt|||| q|r|	t
| q|sz|	|   d}W qW n tk
r   Y nX |r| jdkr| j td |	t
d d}q| jdkr*|    q:| t| jqzt|t }	W n tk
r`   Y nX |	S d S )NrJ   rw   F)r   T,])rK   r   rA   rS   r+   SPACESNLr7   setr]   r)   rC   rx   r   r(   r   r   rV   r   r   )
r9   elems
prev_valuerU   r|   newliner}   r~   r   resr:   r:   r;   r   /  sL    
zParser._parse_arrayr   c                 C  s*  | j td td}d }| j}| tj | j|| j }|rL|t	| |s| j
dkrf|    q|dks|d kr| j
dkr| t| j
n"| j
dks| j
dkr| t| j
| d\}}||| | j}| tj | j|| j }|r|t	| | j
dk}|r| j td qt|t S )NrJ   T}Fr   )rK   r   r   rA   rS   r+   r   r7   addr)   rC   rV   r   rz   r   r(   )r9   r   Ztrailing_commarU   r   rf   r   r:   r:   r;   r   i  s@    

zParser._parse_inline_tabler(   zItem | None)r   r   r5   c                 C  sz  d}| dr"|d }|dd  }t|dkrT| drB| drP|rT| drTd S | drf|rfd S d	}d
}| drd}d}n&| drd}d}n| drd}d}td| d| dd| }d|krd S |ds| ds|ddd drd S ztt|| |||| W S  t	k
rt   zt
t|| ||| W  Y S  t	k
rn   Y Y d S X Y nX d S )Nr   )+-r   r   0)z0.0o0x0bZ0er   )r   r   r   z[0-9]r.   r   z[01]   r   z[0-7]   r   z[0-9a-f]   z(?i)(?<=z)_(?=)_rh   )
startswithrl   resublowerendswithsplitr   rL   r   r   float)r9   r   r   signr   basecleanr:   r:   r;   r     sX    



 zParser._parse_numberr$   c              
   C  s*   | j  | tjW  5 Q R  S Q R X d S r6   )r?   r   r%   r   r>   r:   r:   r;   r     s    zParser._parse_literal_stringc              
   C  s*   | j  | tjW  5 Q R  S Q R X d S r6   )r?   r   r%   r   r>   r:   r:   r;   r     s    zParser._parse_basic_stringc                 C  s   |rP| j  rPd}| j  r6|| j 7 }| jtd qqd|krL| t| j dS | j tkrtt| j  }| jtd |S | j dkr| | j dk\}}|d k	r| t	|d  |S | t
| t| j d S )Nr   rJ   ru      uUr   r   )rC   r   rK   r   rV   r   r   _peek_unicoderN   rl   r   )r9   	multilinetmpr{   r   Zuer:   r:   r;   _parse_escaped_char  s(    





zParser._parse_escaped_charr%   )delimr5   c              	   C  s  | j |jkr| td| | jtd | j |jkrn|  rJ| j |jkrZt|ddt S | jtd | }| 	  d}|
 r| j dkr| jtd nF| j }| jdd |  r|| j 7 }W 5 Q R X |dkr| jdtd d	}t| j }| r|s|tksP|tkr|tksP|
 r`|s`|tksP|tkr`|tttfkr`| t|d
q|sL| j |jkrL|  }d}|
 r4d}| j |jkr|| j 7 }|   qt|dk r||7 }qt|dkrt|||t S t|dkr| t| j ||d d 7 }||d d 7 }t|||t S |   t|||t S | rt|rt|| |
 7 }d	}q| r| j dkrd}| jtd q|| j 7 }| jtd qd S )Nz"Invalid character for string type rJ   r   ru   Try   z
r   Fstrings      \)rC   unitrV   r
   rK   r   r$   r(   togglerU   r   r?   rN   r   is_singleliner   r   r   CTRL_JCTRL_Mr   rG   rl   r   is_basicr   )r9   r   rg   curescapedr   r   closer:   r:   r;   r     s    

	



zParser._parse_stringz
Key | NonezTable | Noneztuple[Key, Table | AoT])parent_namerp   r5   c                 C  s  | j dkr| td|  }|   |  r8| td}| j dkr\|  sX| td}z|  }W n  tk
r   | t	dY nX |  r| tn| j dkr| t
| j d|_|}t|}tdd	 |D r| td
|  dd}|rt|}	nd}	t|t|	d kr$d}|t|	d }td}
|   |rR|   |  \}}}t }t|
t||||||r|d jn|j| dd}t|dkr|rttdtd||||o|d | jkd|d jd}|}|d }t|dd D ]\}}||ttdt|||||o6|t|d k|t|d k |j|t|d krb| ndd}|r|t|d kr||t|g|jdd n||| |}|j}
q n|r|d }|  s|  }|r|\}}| ||
s||| n| j dkr|   \}}| !||r| "||\}}||| |  s|   \}}| !||spq| "||\}}||| qHqn| tdq|j#  t$|tr|}|r| jr|| jd kr| %||}||fS )z)
        Parses a table element.
        rY   z/_parse_table() called on non-bracket character.FTNr   r   c                 s  s$   | ]}d |j  ko| V  qdS )r   N)rf   r   is_bare)r   partr:   r:   r;   r     s     z&Parser._parse_table.<locals>.<genexpr>zInvalid table name "r   r:   r   r   )namedisplay_nameis_super_table)r  r  r   )r  r  r  )r  parsedz7_parse_item() returned None on a non-bracket character.rO   )&rC   rV   r
   rG   rK   rT   r   r   r   r	   r   r   rr   anyr   r   rl   r   rx   r"   r&   r(   rf   r8   	enumerateget
raw_appendr   r  rg   rZ   r\   _peek_tablert   r_   _validate_out_of_order_tabler`   rb   )r9   r  rp   r|   is_aotrf   Zfull_key
name_partsZmissing_tableZparent_name_partsvaluesr}   r~   r   resulttablei_namerq   re   _keyr   Zkey_nextZ
table_nextr:   r:   r;   r_   w  s    
 



 
	


zParser._parse_tableztuple[bool, Key]c              
   C  s   | j dddz | jdkr&| td|   d}| jdkrH|   d}z||  fW W  5 Q R  S  tk
r   | tdY nX W 5 Q R X dS )z
        Peeks ahead non-intrusively by cloning then restoring the
        initial state of the parser.

        Returns the name of the table about to be parsed,
        as well as whether it is part of an AoT.
        TZsave_markerry   rY   z._peek_table() entered on non-bracket characterFN)r?   rC   rV   r
   rK   r   r   r	   )r9   r  r:   r:   r;   r    s    	

zParser._peek_tabler&   r   )first
name_firstr5   c                 C  sf   |g}| j | |  sP|  \}}|rP||krP| |\}}|| qqPq| j   t|ddS )zg
        Parses all siblings of the provided table first and bundles them into
        an AoT.
        T)r  )r8   r]   rT   r  r_   popr   )r9   r$  r%  payloadZis_aot_nextZ	name_nextr   r  r:   r:   r;   rb   -  s    
zParser._parse_aot)rM   r5   c              
   C  sd   | j ddN d}t|D ].}| jd| jj krD|| j7 }|   q qJq|W  5 Q R  S Q R X dS )zk
        Peeks ahead n characters.

        n is the max number of characters that will be peeked.
        Tr   r   r   N)r?   rangerC   r7   ZEOFrK   )r9   rM   bufr   r:   r:   r;   r   @  s    
zParser._peekztuple[str | None, str | None])is_longr5   c              
   C  s   | j ddd | jdkr&| td|   |   |r@d}nd}| |sXd\}}nd|  }|d  d	kr|d
 	drW 5 Q R  dS zt
t|d}W n ttfk
r   d}Y nX ||fW  5 Q R  S Q R X dS )z
        Peeks ahead non-intrusively by cloning then restoring the
        initial state of the parser.

        Returns the unicode value is it's a valid one else None.
        Tr#  r   z,_peek_unicode() entered on non-unicode valuer   r   )NNr   dr   01234567r   N)r?   rC   rV   r
   rK   rU   rN   rG   r   r   chrrL   r   OverflowError)r9   r*  rP   rg   Z	extractedr:   r:   r;   r   R  s*    
 


zParser._peek_unicode)N)N)r   rO   )T)F)NN)+__name__
__module____qualname____doc__r<   propertyr?   rA   rC   rE   rG   rK   rN   rS   rT   rU   r   rV   ri   r\   rt   rZ   rx   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r_   r  rb   r   r   r:   r:   r:   r;   r2   :   sZ   




($=/|:53-r    r2   )=
__future__r   r   r   r4   tomlkit._compatr   tomlkit._utilsr   r   r   tomlkit.containerr   tomlkit.exceptionsr   r	   r
   r   r   r   r   r   r   r   r   r   r   tomlkit.itemsr   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   Ztomlkit.sourcer*   Ztomlkit.toml_charr+   tomlkit.toml_documentr,   r   r  r	  r   r   r2   r:   r:   r:   r;   <module>   sf   