U
    ꥡc                     @   sr  d dl Z d dlZd dlmZ d dlZd dlZd dlmZ ejdk rHe	Z
neZeZ
eZeZdd Zdd Zd	d
 ZzeZW n ek
r   eZY nX edZG dd deZedZG dd deZdd Ze dfddZ!edZ"e dfddZ#dd Z$dd Z%ddddd d!d"gZ&d#d$d%d&d'd(d"gZ'e e(e&e'Z)d)d* Z*G d+d, d,eZ+G d-d. d.eZ,G d/d0 d0e,Z-dS )1    N)linesep)TomlTz)   c                 C   s&   dt jkr"dd l}t| |jr"dS dS )N)r      r   TF)sysversion_infopathlib
isinstancePurePath)pr    r   0/tmp/pip-unpacked-wheel-j_bpjey7/toml/decoder.py_detect_pathlib_path   s
    
r   c                 C   s   t | ttfrdS t| S )NT)r	   bytes
basestringr   )r   r   r   r   _ispath   s    r   c                 C   s0   dt jkrdd l}|| S t| r,t| S | S )N)r      r   )r   r   osfspathr   str)r   r   r   r   r   _getpath    s    

r   z1([0-9]{2}):([0-9]{2}):([0-9]{2})(\.([0-9]{3,6}))?c                   @   s   e Zd ZdZdd ZdS )TomlDecodeErrorzBase toml Exception / Error.c                 C   sb   | dd|d }||dd| }d||||}t| | || _|| _|| _|| _|| _	d S )N
r      z{} (line {} column {} char {}))
countrfindformat
ValueError__init__msgdocposlinenocolno)selfr   r    r!   r"   r#   emsgr   r   r   r   5   s    zTomlDecodeError.__init__N)__name__
__module____qualname____doc__r   r   r   r   r   r   2   s   r   z([0-9])(_([0-9]))*c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
CommentValuec                 C   s&   || _ |rdnd}|| | _|| _d S )Nr    )valcomment_dict)r$   r,   r-   	beginliner.   	separatorr   r   r   r   F   s    
zCommentValue.__init__c                 C   s
   | j | S Nr,   )r$   keyr   r   r   __getitem__L   s    zCommentValue.__getitem__c                 C   s   || j |< d S r1   r2   )r$   r3   valuer   r   r   __setitem__O   s    zCommentValue.__setitem__c                 C   s<   || j }t| j | jr*| jd t| S t|| j S d S )Nr   )r,   r	   r.   r-   unicode)r$   Zdump_value_funcretstrr   r   r   dumpR   s    
zCommentValue.dumpN)r&   r'   r(   r   r4   r6   r9   r   r   r   r   r*   E   s   r*   c                 C   s   |   } | sdS | d dkr dS | d dkr0dS d| ks@d| krDdS t| dkrTdS | d d	krp| d d
krpdS | d dks| d dkr| dd  } t| dkr| d d	kr| d dkrdS d| krdS dS )NFr   _z_.z._r   T0).obx+-r=   __)striplen)nr   r   r   _strictly_valid_numZ   s(    $rG   c              
      s  t | r@tjt| dd}t| ||W  5 Q R  S Q R X nt| trddlm	  ddl
m}  fdd| D sd}|t7 }|d	7 }t||d
krt|}| }| D ]*} |r|t||| q|d q|S zt|  ||W S  tk
r   tdY nX d
S )ac  Parses named file or files as toml and returns a dictionary

    Args:
        f: Path to the file to open, array of files to read into single dict
           or a file descriptor
        _dict: (optional) Specifies the class of the returned toml dictionary
        decoder: The decoder to use

    Returns:
        Parsed toml file represented as a dictionary

    Raises:
        TypeError -- When f is invalid type
        TomlDecodeError: Error while decoding toml
        IOError / FileNotFoundError -- When an array with no valid (existing)
        (Python 2 / Python 3)          file paths is passed
    zutf-8)encodingr   )path)warnc                    s   g | ]}  |r|qS r   )exists).0rI   opr   r   
<listcomp>   s     
 zload.<locals>.<listcomp>z.Load expects a list to contain filenames only.zAThe list needs to contain the path of at least one existing file.Nz>Non-existent filename in list with at least one valid filenamez5You can only load a file descriptor, filename or list)r   ioopenr   loadsreadr	   listr   rI   warningsrJ   r   FNFErrorTomlDecoderget_empty_tablerK   updateloadAttributeError	TypeError)fr.   decoderffilerJ   	error_msgdlr   rM   r   rZ   q   s.    $


rZ   z^[A-Za-z0-9_-]+$c           -      C   s  g }|dkrt |}| }|}t| ts2tdt| tsF| d} | }t| }d}d}	d}
d}d}d}d}d}d}d}d}d}t|D ]b\}}|d	kr||d  d
krd||< q|rX||7 }|d
krt	d|||	r.||
krd}d}||kr|||  dkr| }|d7 }q|sd}d}	d}
qn|dkr|
 rJd}qnf|dkr\d}qnT| s|dks|dkrzqn6|r||d  dkr|dks|dkrd}	|}
qnj|dkr|
 r|r||d  }|
 s|dkrd}q|dkrd}||d  }|
 s|dkrd}q|dkrDd}|dd  }d}d}nt	d| d |||dkr|
dkrd}z0|||  dkr|d7 }|dkrrqqrW n tk
r   Y nX |dkr| }|}	n|	 }	|	rd}
nd}
|dkr|
dkrd}d}d}zr|||  dkr6|d7 }|dkrd}q6q|dksP|dkrt|rt|||  dkrt| }|d7 }qPW n tk
r   Y nX |s|r| }|}	n|	 }	|	rd}
nd}
|dkrH|	sH|sH|sH|}d}z2|| d
kr|| | 7 }d||< |d7 }qW n tk
r0   Y  qY nX |sH||||| |dkr|	s|s|s|rt||d kr||d  dkrd}nd}n|d7 }|dkr|	s|rd}n&|r||d  dkrd}n|d8 }|d
kr|	s|r|st	d||||d  dks0||d  dkr||d  ||d  kr||d  ||< ||d  ||d  krd||d < n|rd||< nd}|d7 }q|r|| dkr|| dkrd}|s|s|| dkrt	d||d}||7 }q|rt	d|t| |	rt	d |t| d|} | d
} d}d}d}d}t| D ]R\}} |dkrt|t| |d  d 7 }||| |r|sd
|kr|  } | dkr|rH|rqH|r|r|| 7 }n|| 7 }d}d}!|d dkr| d dk}!nBt| dkr<| d |d ko:| d! |d ko:| d" |d k}!|!rz||\}"}#W n4 tk
r }$ zt	t|$||W 5 d}$~$X Y nX |"||< d}d}nRt|d }|dkr|| dkr| }|d8 }q|r|dd }n|d
7 }qH| d dkrd}t| dkrt	d#||| d dkrBd}| dd } d$}%n| dd } d}%d}|| }&d}'|&D ]0}(|'s|%|(kr q||(|%7 }|' }'qh| |%|} t| |d k s| d  dkrt	d%|||%| dd d})d}|t|)k 
r|)|  |)|< t|)| dk	r|)| d dk	sF|)| d dk	r|)| }*|d }|*d |*d k	rvt|*dk	r|d7 }|t|)d k	rt	d&|* d' d( ||d|)||  }*	qV|*dd |)|< g |)|d |< n(t|)| 
st	d&|)|  d) |||d7 }q|}tt|)D ]}|)| }+|+dk
rLt	d*||z|||+  |t|)d k
r|+|k
r||+ |
rt	d+||n6|
r||+ |  nt	d,|+ d- t| ||W n tk
r"   |d }|+|kr| ||+< |t|)d kr|r| g||+< Y nd tk
r   |t|)d krN||+ | ||+< |t|)d kr|r| g||+< Y nX ||+ }|
r(z|d }W n tk
r   Y nX 
q(n| d d.kr2| d d/krt	d0||z|| ||| W n4 tk
r. }$ zt	t|$||W 5 d}$~$X Y nX nhd| krHz| | |||},W n4 tk
r }$ zt	t|$||W 5 d}$~$X Y nX |,dk	rH|,\}}}qH|S )1aD  Parses string as toml

    Args:
        s: String to be parsed
        _dict: (optional) Specifies the class of the returned toml dictionary

    Returns:
        Parsed toml file represented as a dictionary

    Raises:
        TypeError: When a non-string is passed
        TomlDecodeError: Error while decoding toml
    Nz!Expecting something like a stringutf8r   F Tr   r   r+   z2Key name found without value. Reached end of line.\   r=   r:   rB   "'=r;   z&Found invalid character in key name: 'z'. Try quoting the key name.r   #[]zUnbalanced quotes	zFound empty keyname. z2Key name found without value. Reached end of file.z/Unterminated string found. Reached end of file.z,Opening key group bracket on line by itself.z]]z"Key group not on a line by itself.zInvalid group name 'z' Something zwent wrong.z'. Try quoting it.z(Can't have a keygroup with an empty namez-An implicitly defined table can't be an arrayzWhat? z already exists?{}z,Line breaks are not allowed in inlineobjects)!rW   rX   r	   r   r\   r7   decoderT   	enumerater   isspaceisalnumrstrip
IndexErrorpreserve_commentrE   joinsplitembed_commentsrD   
load_valuer   r   _get_split_on_quotesr   _groupname_rematch_rangeremoveappendKeyErrorload_inline_object	load_line)-sr.   r^   implicitgroupsretvalcurrentleveloriginalslopenarr
openstringopenstrcharmultilinestrarrayoftablesr/   keygroup	dottedkeykeynamer3   Zprev_keyline_noiitemoddbackslashknextitem	tripquotejr-   multikeymultibackslashr!   idxlineclosedr5   vtypeerrsplitstrquotesplitsquoted
quotesplitgroupsgroupstrgroupretr   r   r   rR      s   


 







 


$
$


  



" 

$ $
  
 

  

 
$

"
rR   c                 C   s  d}d }zt | dkr| d dkr| d  dkrD| dd }d}nl| dd  }d|kr||d}|d | }||d  }n4d|kr|d}|d | }||d  }nd }|}|d k	rt|}tt|d	d
t |   }nt| dd  }W n tk
r
   d }Y nX d| dd  kr"d S zt | d	krftt| d d t| dd t| dd	 }n`tt| d d t| dd t| dd	 t| dd t| dd t| dd ||}W n tk
r   Y d S X |S )Nr      r=   r;   Z   rA   rB   
   r   r   r                           )rE   upperindexr   intr   datetimedate)r,   microsecondtzsubsecondvaltzvalsubsecondvalandtz
splitpointra   r   r   r   
_load_date  sb    


      r   c                 C   s(  d}t | d }|dkr4| | dkr4| }|d8 }q|D ]}|rd}t |d }|dkrt|| dkrt| }|d8 }qP| |7 } | |7 } q8d}d}d}|dkrd	}d||||   }|d
rtd| |d dkr|d drtd| d | tt|d7 } | t|t |d  7 } q8| S )NFr   r;   rf   rd   r   r   \Ur   0123456789abcdefzInvalid escape sequence: ra   01234567z). Only scalar unicode points are allowed.r   )rE   rz   lowerrD   r   unichrr   r7   )vhexbytesprefixskipr   hxhxbhxblenr   r   r   _load_unicode_escapes7  s<    


r   r<   r?   r]   rF   rtrh    r   re   rn   c                 C   s   d}d}|t | k r|rd}| | tkrV| d|d  t| |   | |d d  } q| | dkr| d|d  | |d  } q| | dks| | dkr|d7 }qtdqn| | dkrd	}|d7 }q| S )
z%Unescape characters in a TOML string.r   FNr   rf   uUReserved escape sequence usedT)rE   _escapes_escape_to_escapedcharsr   )r   r   	backslashr   r   r   	_unescapea  s"    .

r   c                   @   s   e Zd ZdZdS )InlineTableDictz,Sentinel subclass of dict for inline tables.Nr&   r'   r(   r)   r   r   r   r   r   w  s   r   c                   @   s|   e Zd ZefddZdd Zdd Zddd	Zd
d Zdd Z	dd Z
dddZdd Zdd Zdd Zdd Zdd ZdS ) rW   c                 C   s
   || _ d S r1   r.   r$   r.   r   r   r   r   }  s    zTomlDecoder.__init__c                 C   s   |   S r1   r   )r$   r   r   r   rX     s    zTomlDecoder.get_empty_tablec                 C   s   G dd d| j t}| S )Nc                   @   s   e Zd ZdZdS )zBTomlDecoder.get_empty_inline_table.<locals>.DynamicInlineTableDictzConcrete sentinel subclass for inline tables.
            It is a subclass of _dict which is passed in dynamically at load
            time

            It is also a subclass of InlineTableDict
            Nr   r   r   r   r   DynamicInlineTableDict  s   r   )r.   r   )r$   r   r   r   r   get_empty_inline_table  s    z"TomlDecoder.get_empty_inline_tableFc                 C   sR  |dd  d}g }t|dkr6|d  s6|  t|dkr"|d}z| dd\}}	W n tk
r~   tdY nX |	 }	|	d |	d kr|	d dks|	d dks|	d	ks|	d d
kr|	d dks|	d dkr|	d dkr|| q6t|dkr|d |d  |d< q6tdq6|D ]&}
| |
|||}|d k	r& qNq&d S )Nr   r;   ,r   rj   z Invalid inline table encountered)rh   ri   z-0123456789)truefalserl   rm   rq   rr   z&Invalid inline table value encountered)r{   rE   rD   popr   r   r   )r$   r   r   r   r   candidate_groupsr   candidate_groupr:   r5   r   statusr   r   r   r     sH    









zTomlDecoder.load_inline_objectc                 C   s   | d}d}g }t|dkrd|d kr|d  d}|dd  }t|d dkrt|r|d  d|d  7  < |dd  }d|d krD|d d |d  d }qD||7 }|D ](}|r|| q|| d7 }| }q|S )Nrh   Fr   ri   r   rg   r;   )r{   rE   r   )r$   r   doublequotesplitsr   r   singlequotesplitsdoublequotesplitr   r   r   r~     s(    

z TomlDecoder._get_split_on_quotesc                 C   s(  d}|  |}d}|D ](}|s*d|kr* q@||d7 }| }q|d|}	t|	d }
t|	d rz|	d dd|	d< t|	d r|	d d dkr|	d d d	kr|	d d d
kr|	d d dkr|	d d dkr|	d d dkr|	d  dkr|	d  dkrzt	|	d  W qW n t
k
rD   Y nX t|	d d k	r\qt|	d rpq|d7 }|	d }|d|}	||	d krt
d|
rzt|	d }
qzd|	d d  |	d  g}	d|	d krd|	d ks d
|	d krT|  |	d }d}g }|D ]6}|r0|| n|dd |dD 7 }| }qn|	d d}|d dkr|d d }qb|d d D ]2}|dkrq||kr|  ||< || }q|d  |	d< nV|	d d dks|	d d d
kr(|	d d |	d d kr(t|	d dd |	d< | |	d \}}|dkr|dkrv|	d ||  dkrv| }|d8 }qD|r|	d d d }n|	d d }|	d }n| |	d |
\}}z||	d   t
dW nR tk
r   t
dY n6 tk
r"   |r|||f Y S |||	d < Y nX d S )Nr   Frj   r;   r:   rd   r   r+   rn   ri   rh   rl   rq   r   r   zInvalid date or numberr=   c                 S   s   g | ]}|  qS r   rD   )rL   levelr   r   r   rO     s     z)TomlDecoder.load_line.<locals>.<listcomp>rf   r   zDuplicate keys!)r~   r   r{   rG   _number_with_underscoresr   replacerE   rD   floatr   r   TIME_RErz   r   rX   r   _load_line_multiline_strr}   r\   r   )r$   r   r   r   r   r   r   r   r   pairstrictly_validprev_vallevelsr   r   Zkoffsetr   r5   r   r   r   r   r     s    
2
"

$
 
zTomlDecoder.load_linec                 C   sh  d}t |dk rd|fS |d dkr| d dkr| |r|dd   d}t |dkr|d d dkr|d d d	kr|d d
 |d
 d |d  g }qT|d }t |t | }|}|d dkr|d d	krd|fS |d |d ks|d |d krd|fS t |dkrX|d |d krX|d
 |d krX|d |d krXd|fS t |d |fS )Nr   r   r;   rl   rm   r   r   rh   ri   ro   rg   r   rp   )rE   rD   _load_array_isstrarrayr{   )r$   r   ZpoffsetZnewpr   r   r   r     s&    ,$$Dz$TomlDecoder._load_line_multiline_strTc              	   C   sr  |st d|dkrdS | dkr0t dn>|dkr<dS | dkrTt dn|d dksn|d d	kr|d }|d
d  |}d}d}t|d
kr|d dkr|d
 dkr|dd  }d}d}|D ]}|dkr|r|d
7 }nd}qd}	z4d}
||
 }|dkr"|	 }	|
d
8 }
||
 } qW n tk
r:   Y nX |	s|rPt dq|r`|d
krfd}qd}q|dkr,|dd
d  }d}|D ]Z}
|
dkr| }nB|
d tkr|
d dkr|
d dkr|st d|rd}qdD ]2}||kr||}t|d |d
d  |}qt|}t|d
krt|d
 |krtt|dk sh|d
 |d krt|dd }|d
d dfS |d dkr| |dfS |d dkr| 	 }| 
|| |dfS t|r t| \}}}}}tt|t|t||rt|nd}|dfS t|}|d k	r:|dfS |sHt dd }d}|d d!krpd}|d
d  }n|d d"kr|d
d  }|d#d}| }d$|ksd%|krd&|ksd'|krd$|kr|d$d
d
 dkrt d(|d d)krt d*t|}d+}n.t|dkr@|d,ks4|d-kr@t|}d+}|d krTt|d}|rfd| |fS ||fS d S ).NzEmpty value is invalidr   )Tboolz#Only all lowercase booleans allowedr   )Fr   r   rh   ri   r   Frd   rg   Tr;   rf   z1Found tokens after a closed string. Invalid TOML.r   r   r   )z\ur   r   ro   r   rl   arrayrq   inline_objecttimer   z<Weirdness with leading zeroes or underscores in your number.r   rB   rA   r:   r=   r@   eEz,This float is missing digits after the point
0123456789z'This float doesn't have a leading digitr   infnan)r   r   r{   rE   rx   r   r   r   
load_arrayr   r   r   r   r   r   r   r   r   r   r   )r$   r   r   	quotechartestvtriplequotetriplequotecountr   tvr   r   r   
escapeseqsr   r   r   r   hmr   r:   msr   parsed_dateitypeneglowervr   r   r   r}   *  s    $







**
( "

zTomlDecoder.load_valuec                 C   sb   t |dkrdS |d |d kr$dS d}d}t || dkr\|| dkr\| }|d8 }q,q\q,| S )Nr   Tr;   Fro   rf   r   )rE   )r$   r   r   r   r   r   r   bounded_string  s    
zTomlDecoder.bounded_stringc                 C   s8   |dd   }|dkr4|d dks0|d dkr4dS dS )	Nr   r;   rd   r   rh   ri   TFr   )r$   ar   r   r   r     s     z"TomlDecoder._load_array_isstrarrayc                 C   s  d }g }|  }d|dd ks@d|dd dd   kr| |}|dd   dsv|dd d}nNg }d}d}|| dkrdnd}d	}	|t|dd  k r|| d
ks|| dkr|	r|d }
|
dkr||
 dkr|	 }	|
d8 }
q|	 }	|	s|| dkr|d7 }|	s.|| dkr:|d7 }qn*|| dkrd|dkrd|d8 }|d7 }q|d7 }||||  |d }|t|dd  k r|| dkr|d7 }q|d }q|}d}|r||t|d k r|||   }| |rRt|dkr|d |d   kr*|d krn n|d |d kr|d |d kr|| d ||d   ||< ||   }|t|d k r|d |d  ||d d   }n|d |d  }q|d7 }qnt|dd }g }d}d}tt|D ]j}|| dkr|d7 }nL|| dkr,|d8 }n4|| dkr|s|d	|||  |d }q|d	||d   tt|D ]^}||   ||< || dkr| 
|| \}}|r||krtdn|}|| q|S )Nrl   r   r;   rd   r   rq   r   rg   Frh   ri   rf   rr   ro   rp   rm   zNot a homogeneous array)rD   r{   r   
startswithrE   r   r  rT   r   rz   r}   r   )r$   r  atyper   strarraynew_astart_group_indexend_group_indexZopen_bracket_countin_strbackslash_indexr?   abalr   r   r   nvalntyper   r   r   r    s    0





 
"



zTomlDecoder.load_arrayc                 C   s   d S r1   r   r$   r   r3   r-   r/   r   r   r   ry     s    zTomlDecoder.preserve_commentc                 C   s   d S r1   r   )r$   r   r   r   r   r   r|     s    zTomlDecoder.embed_commentsN)FF)T)r&   r'   r(   dictr   rX   r   r   r~   r   r   r}   r  r   r  ry   r|   r   r   r   r   rW   {  s     
T
q[rW   c                       s0   e Zd Zef fdd	Zdd Zdd Z  ZS )TomlPreserveCommentDecoderc                    s   i | _ tt| | d S r1   )saved_commentssuperr   r   r   	__class__r   r   r     s    z#TomlPreserveCommentDecoder.__init__c                 C   s   |||f| j |< d S r1   )r!  r  r   r   r   ry     s    z+TomlPreserveCommentDecoder.preserve_commentc                 C   s:   || j krd S | j | \}}}t|| ||| j||< d S r1   )r!  r*   r.   )r$   r   r   r3   r-   r/   r   r   r   r|     s    
z)TomlPreserveCommentDecoder.embed_comments)r&   r'   r(   r  r   ry   r|   __classcell__r   r   r#  r   r     s   r   ).r   rP   r   r   rer   toml.tzr   r   xranger   r   r7   ranger   chrr   r   r   r   FileNotFoundErrorrV   	NameErrorIOErrorcompiler   r   r   r   objectr*   rG   r  rZ   r   rR   r   r   r   _escapedcharszipr   r   r   rW   r   r   r   r   r   <module>   sP   
	


1
  e/#   