U
    Ο_&                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZ ejdkr>eZ	dddZ
dddZd	d
 Zdd Zdd ZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZdS )    N)Decimal)InlineTableDict   c                 C   s(   |j stdt| |d}| | |S )a  Writes out dict as toml to a file

    Args:
        o: Object to dump into toml
        f: File descriptor where the toml should be stored
        encoder: The ``TomlEncoder`` to use for constructing the output string

    Returns:
        String containing the toml corresponding to dictionary

    Raises:
        TypeError: When anything other than file descriptor is passed
    z0You can only dump an object to a file descriptor)encoder)write	TypeErrordumps)ofr   d r   +lib/python3.8/site-packages/toml/encoder.pydump   s
    
r   c                 C   s  d}|dkrt | j}|| d\}}||7 }t| g}|rdd | D }|D ]}||krRtdqR||7 }| }|D ]z}	|||	 |	\}}
|s|s|
s|r|dd dkr|d7 }|d	|	 d
 7 }|r||7 }|
D ]}|
| ||	d | < qq||}q8|S )a  Stringifies input dict as toml

    Args:
        o: Object to dump into toml
        encoder: The ``TomlEncoder`` to use for constructing the output string

    Returns:
        String containing the toml corresponding to dict

    Examples:
        ```python
        >>> import toml
        >>> output = {
        ... 'a': "I'm a string",
        ... 'b': ["I'm", "a", "list"],
        ... 'c': 2400
        ... }
        >>> toml.dumps(output)
        'a = "I'm a string"
b = [ "I'm", "a", "list",]
c = 2400
'
        ```
     Nc                 S   s   g | ]}t |qS r   )id).0sectionr   r   r   
<listcomp>@   s     zdumps.<locals>.<listcomp>zCircular reference detectedz


[]
.)TomlEncoder	__class__dump_sectionsr   values
ValueErrorget_empty_table)r
   r   retvalZaddtoretvalZsectionsZ
outer_objsZsection_idsZ	outer_objZnewsectionsr   Zaddtosectionssr   r   r   r	   "   s8    


 r	   c                 C   sX  t jdk r(t| dr(t| tr(| d} d|  } | d dkrH| dd  } | d}|s`| d	rl| dd
 } |r| dd} | d	d} | d} t	| dkrDd
}| d s| dd  } | d dd| d< | d | dk}| d d | r| d | dkr| }|d8 }q|rd}nd}| d | | d  g| dd   } qt
d	| d  d	 S )Nr   decodezutf-8z%rr   u   '"z\'z\"z\xz\\\xZu00   )sysversion_infohasattr
isinstancestrr"   
startswithreplacesplitlenunicode)vZsinglequoteiZjoinxZjoinerr   r   r   	_dump_strV   s4    


$
$r7   c                 C   s   d | ddddS )N{}ze+0ze+ze-0ze-)formatr1   r5   r   r   r   _dump_floatu   s    r;   c                 C   s(   |   }|d kr|  S |  d d S )Ni)	utcoffset	isoformat)r5   r<   r   r   r   
_dump_timey   s    r>   c                   @   sB   e Zd ZedfddZdd Zdd Zdd	 Zd
d Zdd Z	dS )r   Fc                 C   sV   || _ || _ttttt| jtdd tdd t	t
tt
tjdd tjttjdd i
| _d S )Nc                 S   s   t |  S N)r4   lowerr:   r   r   r   <lambda>       z&TomlEncoder.__init__.<locals>.<lambda>c                 S   s   | S r?   r   r:   r   r   r   rA      rB   c                 S   s   |   ddS )Nz+00:00Z)r=   r1   r:   r   r   r   rA      rB   c                 S   s   |   S r?   )r=   r:   r   r   r   rA      rB   )_dictpreserver/   r7   r4   list	dump_listboolintfloatr;   r   datetimetimer>   date
dump_funcs)selfrD   rE   r   r   r   __init__   s.              zTomlEncoder.__init__c                 C   s   |   S r?   )rD   rO   r   r   r   r      s    zTomlEncoder.get_empty_tablec                 C   s4   d}|D ]}|dt | | d 7 }q|d7 }|S )Nr    ,])r4   
dump_value)rO   r5   r    r#   r   r   r   rG      s
    zTomlEncoder.dump_listc                 C   sl   d}t |trZg }| D ]$\}}| |}||d |  q|dd| d 7 }|S t| |S dS )zPreserve inline table in its compact syntax instead of expanding
        into subsection.

        https://github.com/toml-lang/toml#user-content-inline-table
        r    = z{ z, z }
N)r.   dictitemsdump_inline_tableappendjoinr4   rU   )rO   r   r    Zval_listkr5   valr   r   r   rY      s    

zTomlEncoder.dump_inline_tablec                 C   sJ   | j t|}|d kr,t|dr,| j t }|d k	r<||S | j t |S )N__iter__)rN   gettyper-   rF   r/   )rO   r5   Zdump_fnr   r   r   rU      s    
zTomlEncoder.dump_valuec                 C   s  d}|dkr |d dkr |d7 }|   }d}|D ]}t|}|}td|sVt|}t|| tsd}t|| tr|| D ]}	t|	trd}q|r|| D ]}	d}
|d| | d	 7 }| |	|| \}}|r|d
 dkr|
|7 }
n||7 }|r~|   }|D ]p}| || || d | \}}|rT|
d| | d | d 7 }
|
|7 }
|D ]}|| ||d | < qXq|}q||
7 }qn0|| d k	r||d t| 	||  d 7 }q0| j
rt|| tr||d | ||  7 }q0|| ||< q0||7 }||fS )Nr   r'   r   z^[A-Za-z0-9_-]+$FTr   z[[z]]
r   r   r   rV   )rD   r4   rematchr7   r.   rW   rF   r   rU   rE   r   rY   )rO   r
   supZretstrZretdictZarraystrr   ZqsectionZarrayoftablesaZarraytabstrr!   r   ZnewdZdsecs1Zd1r   r   r   r      sz    



zTomlEncoder.dump_sectionsN)
__name__
__module____qualname__rW   rP   r   rG   rY   rU   r   r   r   r   r   r      s   r   c                       s    e Zd Zef fdd	Z  ZS )TomlPreserveInlineDictEncoderc                    s   t t| |d d S )NT)superri   rP   )rO   rD   r   r   r   rP      s    z&TomlPreserveInlineDictEncoder.__init__rf   rg   rh   rW   rP   __classcell__r   r   rk   r   ri      s   ri   c                       s,   e Zd Zeddf fdd	Zdd Z  ZS )TomlArraySeparatorEncoderFrS   c                    sD   t t| || | dkr(d| }n|dr:td|| _d S )Nr   rS   z 	
,zInvalid separator for arrays)rj   rn   rP   stripr   	separator)rO   rD   rE   rp   rk   r   r   rP      s    

z"TomlArraySeparatorEncoder.__init__c                 C   s   g }d}|D ]}| | | q|g krtg }|D ]:}t|trV|D ]}| | qDq2|dt| | j 7 }q2|}q"|d7 }|S )Nr   rR   rT   )rZ   rU   r.   rF   r4   rp   )rO   r5   tr    r#   r!   rr   r   r   rG      s    
z#TomlArraySeparatorEncoder.dump_list)rf   rg   rh   rW   rP   rG   rm   r   r   rk   r   rn      s   rn   c                       s*   e Zd Zedf fdd	Zdd Z  ZS )TomlNumpyEncoderFc                    sl   dd l }tt| || t| j|j< t| j|j< t| j|j< | j	| j|j
< | j	| j|j< | j	| j|j< d S )Nr   )Znumpyrj   rs   rP   r;   rN   Zfloat16Zfloat32Zfloat64	_dump_intZint16Zint32Zint64)rO   rD   rE   Znprk   r   r   rP     s    zTomlNumpyEncoder.__init__c                 C   s   d t|S )Nr8   )r9   rI   rO   r5   r   r   r   rt     s    zTomlNumpyEncoder._dump_int)rf   rg   rh   rW   rP   rt   rm   r   r   rk   r   rs     s   
rs   c                       s"   e Zd Zedf fdd	Z  ZS )TomlPreserveCommentEncoderFc                    s4   ddl m} tt ||  fdd j|< d S )Nr   )CommentValuec                    s   |   jS r?   )r   rU   r:   rQ   r   r   rA   #  rB   z5TomlPreserveCommentEncoder.__init__.<locals>.<lambda>)toml.decoderrw   rj   rv   rP   rN   )rO   rD   rE   rw   rk   rQ   r   rP      s    z#TomlPreserveCommentEncoder.__init__rl   r   r   rk   r   rv     s   rv   c                       s$   e Zd Zdd Z fddZ  ZS )TomlPathlibEncoderc                 C   s   t t|S r?   )r7   r/   ru   r   r   r   _dump_pathlib_path(  s    z%TomlPathlibEncoder._dump_pathlib_pathc                    s6   dt jkr&dd l}t||jr&t|}tt| |S )N)r      r   )	r+   r,   pathlibr.   ZPurePathr/   rj   ry   rU   )rO   r5   r|   rk   r   r   rU   +  s
    
zTomlPathlibEncoder.dump_value)rf   rg   rh   rz   rU   rm   r   r   rk   r   ry   &  s   ry   )N)N)rK   ra   r+   decimalr   rx   r   r,   r/   r4   r   r	   r7   r;   r>   objectr   ri   rn   rs   rv   ry   r   r   r   r   <module>   s"   


4k