U
    Teo                     @  s&  d dl m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 e ZG dd de	ZG dd de	ZdddddZ dS )    )annotationsN)Any)Iterator)decode)_CustomDict)merge_dicts)KeyAlreadyPresent)NonExistentKey)TOMLKitError)AoT)Comment)Item)Key)Null)	SingleKey)Table)Trivia)
Whitespace)itemc                      s  e Zd ZdZd~dddddZedd	d
dZdd	ddZedd	ddZdddddZ	dddd dddZ
ddddddZdd	d d!Zdd"dd#d$d%Zdd'ddd d(d)d*Zd+dddd,d-Zddd.d/d0Zd1d d#d2d3Zd1d1d4d d5d6d7Zdd1d4d d8d9d:Zd1dd#d;d<Zdd	d=d>Zd?d	d@dAZdddBdCd?dDdEdFZddGdHZddBdCd?dIdJdKZddLdMZdd	dNdOZdPd	dQdRZd1dSd#dTdUZd1d4dddVdWZd1dd#dXdYZd1d4d4dZ fd[d\Z d1d1ddd]d^d_Z!d`d1dddadbdcZ"d?d	dddeZ#d?d	dfdgZ$dhddidjdkZ%dldm Z&dndo Z'dpdq Z(drds Z)d d	dtduZ*d d	dvdwZ+de,ffdxdyd.dzd{Z-de,ffdxdd.d|d}Z.  Z/S )	Containerz
    A container for items within a TOMLDocument.

    This class implements the `dict` interface with copy/deepcopy protocol.
    FboolNone)parsedreturnc                 C  s   i | _ g | _|| _g | _d S N)_map_body_parsed_table_keys)selfr    r    d/mounts/lovelace/software/anaconda3/envs/rescript-2/lib/python3.8/site-packages/tomlkit/container.py__init__$   s    zContainer.__init__zlist[tuple[Key | None, Item]]r   c                 C  s   | j S r   r   r   r    r    r!   body*   s    zContainer.bodyzdict[str, Any]c                 C  sf   i }|   D ]T\}}|dkrqt|tr.|j}t|dr@| }||krXt|| | q|||< q|S )z#Returns as pure python object (ppo)Nunwrap)items
isinstancer   keyhasattrr'   r   )r   Z	unwrappedkvr    r    r!   r'   .   s    


zContainer.unwrapc                 C  s^   i }| j D ]N\}}|dkrq
|j}|j}t|tr8|j}||krPt|| | q
|||< q
|S )zThe wrapped dict valueN)r   r*   valuer)   r   r   )r   dr,   r-   r    r    r!   r.   B   s    

zContainer.value)parsingr   c                 C  sT   || _ | jD ]B\}}t|tr,|j| qt|tr|jD ]}|j| q<qd S r   )r   r   r)   r   r.   r0   r   r&   )r   r0   _r-   tr    r    r!   r0   W   s    


zContainer.parsingNzKey | Item | strzItem | Noner*   r   r   c                 C  s4   |dkr(t |ttfstdd| }}| ||S )z
        Adds an item to the current Container.

        :Example:

        >>> # add a key-value pair
        >>> doc.add('key', 'value')
        >>> # add a comment or whitespace or newline
        >>> doc.add(comment('# comment'))
        Nz8Non comment/whitespace items must have an associated key)r)   r   r   
ValueErrorappendr   r*   r   r    r    r!   adda   s    
zContainer.addr   r   )r*   r.   r   c           
      C  s   t |ttfrtd|^}}}d|_ttdt ddd }}|D ]0}d|_ttdt ddd}	|||	 |	}qF|j|_||| | || d S )Nz!Can't add a table to a dotted keyTF)is_super_table)	r)   r   r   r
   Z_dottedr   r   r5   sep)
r   r*   r.   namemidlasttablecurrent_name	new_tabler    r    r!   _handle_dotted_keyv   s    zContainer._handle_dotted_keyintc                 C  sb   d}t | jD ]J\}\}}t|tr&qt|tr:| s:qt|ttfrT| sT qZ|}q|d S N   )		enumerater   r)   r   r   Zis_fixedr   r   	is_dotted)r   
last_indexir,   r-   r    r    r!   _get_last_index_before_table   s    
z&Container._get_last_index_before_tablezSingleKey | Noner*   r   c                 C  s`   |d kr.| j D ]}|d k	st| | qd S || j ksHt| j | tsLd S t| | j |  d S r   )r   AssertionError_validate_out_of_order_tabler)   tupleOutOfOrderTableProxy)r   r*   r,   r    r    r!   rM      s    
z&Container._validate_out_of_order_tableTzKey | str | None)r*   r   validater   c                 C  s  t |ts|dk	rt|}t |ts,t|}|dk	rL| rL| || | S t |ttfrl|j	dkrl|j
|_	|  }t |tpt|}t |tr| js|  | jr| js|jjs|s| sd|j_t |tr | jr | js |  |r d|d jjks |s d|d jj |d j_|dk	rj|| krj| j| }t |trZ| j|d  }n
| j| }|d }t |tr&t |ttfst|| rt |tst||g| jd}| ||| n
|| | S | r | st||| | S | r| r| jd |d ks@| s@|d  r| r\| js\|  }	n
t| j}	|	t| jk r| |	|| n|  || |r| !| | S t"#|}|j$j%D ]\}
}||
| q|d |f| jt |tr|d n|< | S |d  r$t&dn| sjt|nDt |trbt |tsFt||j%D ]}|| qL| S t|t |ttf}|dk	r
| jr
| js
|r| r
|  }|t| jk r| |||S | jd d }t |ts
t|s
d|jj'ks
|j j'd7  _'|  || | S )z<Similar to :meth:`add` but both key and value must be given.N
r   rD   rE   )r   z!Redefinition of an existing table)(r)   r   r   r   _itemZis_multirA   r   r   r:   r*   _previous_itemr   ends_with_whitespacer   invalidate_display_namer   triviaindentrG   r   rN   r   is_aot_element_replacer5   Zis_aotr8   r   rJ   len
_insert_at_raw_appendrM   copydeepcopyr.   r&   r
   trail)r   r*   r   rP   prevZprev_wscurrent_idxZcurrent_body_elementr>   idxr,   r-   r=   is_tablerH   previous_itemr    r    r!   r5      s    






















zContainer.appendz
Key | Nonec                 C  s   || j krh| j | }t|ts$|f}| j|d  d }|d k	rPt|tsPt||t| jf | j |< n|d k	rt| j| j |< | j||f | r| j	| |d k	rt
| |j|j | S rC   )r   r)   rN   r   r   r   rZ   r5   rc   r   dict__setitem__r*   r.   )r   r*   r   ra   r>   r    r    r!   r\   /  s     


zContainer._raw_append)rb   r   c                 C  s   | j | d }| j|}|d kr*t|d t f| j |< t|trt|}|| t	|dkrl|
 }nt|}|| j|< nt| |j | j
| d S )Nr   rE   )r   r   getr	   r   r)   rN   listremoverZ   popre   __delitem__r*   )r   rb   r*   indexr    r    r!   
_remove_atF  s    


zContainer._remove_at	Key | strc                 C  sx   t |tst|}| j|d}|dkr0t|t |trV|D ]}dt f| j|< q>ndt f| j|< t	
| |j | S )z Remove a key from the container.N)r)   r   r   r   rj   r	   rN   r   r   re   rk   r*   )r   r*   rb   rI   r    r    r!   ri   Y  s    

zContainer.remover   )r*   	other_keyr   r   c           
      C  sB  |d krt d|| kr t|t|ts2t|}t|tsDt|}t|}| j| }t|trht|}| j	| d }d|j
jkr|j
 jd7  _| j D ]`\}}t|trg }|D ]}	|	|kr|	d }	||	 qt|| j|< q||kr|d | j|< q|d | j|< | j	|d ||f |d k	r>t| |j|j | S )Nz$Key cannot be null in insert_after()rE   rQ   )r4   r	   r)   r   r   rR   r   rN   maxr   rV   r_   r(   r5   insertre   rf   r*   r.   )
r   r*   ro   r   rb   Zcurrent_itemr,   r-   new_indicesv_r    r    r!   _insert_afterl  s<    





zContainer._insert_after)rb   r*   r   r   c           
      C  sh  |t | jd kr td| t|ts2t|}t|}|dkr| j|d  d }t|tst|st|t	t
fsd|jjks|j jd7  _| j D ]`\}}t|trg }|D ]}||kr|d }|| qt|| j|< q||kr|d | j|< q|| jkr6| j| }	t|	ts$|	f}	|	|f | j|< n
|| j|< | j|||f t| |j|j | S )NrE   zUnable to insert at position r   rQ   )rZ   r   r4   r)   r   r   rR   r   rT   r   r   rV   r_   r   r(   rN   r5   rq   re   rf   r*   r.   )
r   rb   r*   r   rd   r,   r-   rr   rs   ra   r    r    r!   r[     sF    




zContainer._insert_atc                 C  sP   t |tst|}| j|}|dkr.t|t |trBt| |S | j| d S )zGet an item for the given key.NrE   )	r)   r   r   r   rg   r	   rN   rO   r   )r   r*   rb   r    r    r!   r     s    


zContainer.itemc                 C  s   | j r| j d d S dS )zGet the last item.rD   rE   Nr$   r%   r    r    r!   	last_item  s    zContainer.last_itemstrc                 C  sz   d}| j D ]j\}}|dk	rdt|tr6|| ||7 }qtt|trR|| ||7 }qt|| ||7 }q
|| ||7 }q
|S )zRender as TOML string. N)r   r)   r   _render_tabler   _render_aot_render_simple_item)r   sr,   r-   r    r    r!   	as_string  s    

zContainer.as_stringr   z
str | None)r*   r=   prefixr   c              	   C  s  d}|j d k	r|j }n| }|d k	r2|d | }| rXtdd |jjD r| sd\}}| rpd\}}d|jj	krt
|jdkrdnd}||jj | t| | |jj t|jj |jj	 | 7 }n|jjdkr||jj7 }|jjD ]\}	}
t|
trd|
 rN|	 r8| s8|| |	|
7 }n|| j|	|
|d	7 }n|| j|	|
|d	7 }qt|
tr|| j|	|
|d	7 }q|| j|	|
| r|nd d	7 }q|S )
Nrw   .c                 s  s&   | ]\}}t |ttttf V  qd S r   )r)   r   r   r   r   ).0r1   r-   r    r    r!   	<genexpr>  s   z*Container._render_table.<locals>.<genexpr>)[]z[[z]]rQ   r   r}   )display_namer|   r8   anyr.   r&   rG   rX   rV   r_   rZ   rW   r   
comment_wscommentr)   r   rx   r   ry   rz   )r   r*   r=   r}   cur_keyopen_closeZnewline_in_table_triviar,   r-   r    r    r!   rx     sL    
 :

  
zContainer._render_tablec                 C  sJ   |  }|d k	r|d | }d}t|}|jD ]}|| j||d7 }q.|S )Nr~   rw   r   )r|   r   r&   _render_aot_table)r   r*   aotr}   r   r   r=   r    r    r!   ry   (  s    
zContainer._render_aot)r=   r}   r   c           	      C  s   d}|p
d}d\}}||j j | t| | |j j t|j j |j j 7 }|jjD ]\}}t|t	r|
 r| r|| ||7 }q|| j|||d7 }q|| j|||d7 }qXt|tr|| j|||d7 }qX|| ||7 }qX|S )Nrw   r   r   )rV   rW   r   r   r   r_   r.   r&   r)   r   r8   rG   rx   r   ry   rz   )	r   r=   r}   r   r   r   r   r,   r-   r    r    r!   r   4  s"    6


zContainer._render_aot_tablec                 C  sn   |d kr|  S |  }|d k	r,|d | }|jj t| |j t|   |jj t|jj |jj S )Nr~   )r|   rV   rW   r   r9   r   r   r_   )r   r*   r   r}   r   r    r    r!   rz   T  s    @zContainer._render_simple_itemc                 C  s
   t | S r   re   __len__r%   r    r    r!   r   f  s    zContainer.__len__Iterator[str]c                 C  s   t t| S r   iterre   keysr%   r    r    r!   __iter__i  s    zContainer.__iter__zItem | Containerc                 C  s&   |  |}t|tr"| r"|jS |S r   )r   r)   r   
is_booleanr.   r6   r    r    r!   __getitem__m  s    
zContainer.__getitem__c                   sH    d k	r8 | kr8t t fdd| j}| | | n|  | d S )Nc                   s   |  kS r   r    )r,   r*   r    r!   <lambda>v      z'Container.__setitem__.<locals>.<lambda>)nextfilterr   rY   r5   )r   r*   r.   old_keyr    r   r!   rf   t  s    zContainer.__setitem__c                 C  s   |  | d S r   )ri   r   r*   r    r    r!   rk   {  s    zContainer.__delitem__r*   defaultr   c                   s   t  j||d | | S N)r   super
setdefaultr   r*   r   	__class__r    r!   r   ~  s    zContainer.setdefault)r*   new_keyr.   r   c                 C  s@   t |tst|}| j|}|d kr.t|| ||| d S r   )r)   r   r   r   rg   r	   _replace_at)r   r*   r   r.   rb   r    r    r!   rY     s    
zContainer._replacezint | tuple[int])rb   r   r.   r   c                 C  sf  t |}t|tr<|dd  D ]}d t f| j|< q|d }| j| \}}t|tst|ttft|ttfksz||jkrt	|}n|}| j
|= || j
|< ||krt| | t|ttft|ttfkr.| | t|t| jD ]4}t| j| d ttfr| ||| |} qqd}| || nbt|ttfs|jj|j_|jjpZ|jj|j_|jjpp|jj|j_|jj|j_||f| j|< t|dr|  t|trb|  \}}|dk r|n|}t|}	t|to |jjo t|jjd d t}
||k o"t| j|d  d t}||k s4|
rP|sP|	sP|d td t| |j|j d S )NrE   r   rD   rU   rQ   )rR   r)   rN   r   r   r   r   r   r*   r   r   re   rk   ri   rangerZ   r[   r5   r   rV   rW   r   r   r_   r+   rU   _previous_item_with_indexrT   r.   r&   rf   )r   rb   r   r.   rI   r,   r-   r<   r1   Zhas_wsZreplace_has_wsZnext_wsr    r    r!   r     s^    




"zContainer._replace_atc                 C  s
   t | jS r   )rv   r.   r%   r    r    r!   __str__  s    zContainer.__str__c                 C  s
   t | jS r   )reprr.   r%   r    r    r!   __repr__  s    zContainer.__repr__re   )otherr   c                 C  s   t |tstS | j|kS r   )r)   re   NotImplementedr.   )r   r   r    r    r!   __eq__  s    
zContainer.__eq__c                 C  s   | j fS r   )r   r   protocolr    r    r!   	_getstate  s    zContainer._getstatec                 C  s
   |  dS )N   )__reduce_ex__r%   r    r    r!   
__reduce__  s    zContainer.__reduce__c                 C  s"   | j | || j| j| j| jffS r   )r   r   r   r   r   r   r   r    r    r!   r     s    zContainer.__reduce_ex__c                 C  sV   |d | _ |d | _|d | _|d | _| jD ]"\}}|d k	r.t| |j|j q.d S )Nr   rE   r      )r   r   r   r   re   rf   r*   r.   )r   stater*   r   r    r    r!   __setstate__  s    



zContainer.__setstate__c                 C  s
   t  | S r   )r]   r%   r    r    r!   r]     s    zContainer.copyc                 C  sP   |  | j}t| D ]\}}t||| q| j| j7  _|j| j |S r   )	r   r   re   r(   rf   r   r&   r   update)r   cr,   r-   r    r    r!   __copy__  s    zContainer.__copy__z
int | Noneztuple[int, Item] | Nonec                 C  s^   |dks|t | jkr t | j}t|d ddD ](}| j| d }t||s0||f  S q0dS )z5Find the immediate previous item before index ``idx``NrE   rD   )rZ   r   r   r)   )r   rb   ignorerI   r-   r    r    r!   r      s    

z#Container._previous_item_with_indexc                 C  s   |  ||}|r|d S dS )z{Find the immediate previous item before index ``idx``.
        If ``idx`` is not given, the last item is returned.
        rD   N)r   )r   rb   r   r`   r    r    r!   rS     s    zContainer._previous_item)F)N)N)T)N)N)N)N)0__name__
__module____qualname____doc__r"   propertyr&   r'   r.   r0   r7   rA   rJ   rM   r5   r\   rm   ri   rt   r[   r   ru   r|   rx   ry   r   rz   r   r   r   rf   rk   r   rY   r   r   r   r   r   r   r   r   r]   r   r   r   rS   __classcell__r    r    r   r!   r      s`   
  /.9
 

D
 r   c                      s   e Zd ZddddddZddd	d
Zedd ZdddddZddddddZdddddZ	dddddZ
ddddZdddd Zdddd! fd"d#Z  ZS )$rO   r   z
tuple[int]r   )	containerindicesr   c           	      C  s   || _ td| _g | _i | _|D ]~}| j j| \}}t|tr | j| t	| jd }|j
jD ]<\}}| jj||dd || j|< |d k	r`t| |j| q`q | j  d S )NTrE   F)rP   )
_containerr   _internal_container_tables_tables_mapr   r)   r   r5   rZ   r.   r&   re   rf   r*   rM   )	r   r   r   rI   r1   r   Z	table_idxr,   r-   r    r    r!   r"     s    


zOutOfOrderTableProxy.__init__rv   r#   c                 C  s
   | j  S r   )r   r'   r%   r    r    r!   r'   )  s    zOutOfOrderTableProxy.unwrapc                 C  s   | j jS r   )r   r.   r%   r    r    r!   r.   ,  s    zOutOfOrderTableProxy.valuern   r   rK   c                 C  s   || j krt|| j | S r   )r   r	   r   r    r    r!   r   0  s    
z OutOfOrderTableProxy.__getitem__r3   c                 C  sl   || j kr$| j| j |  }|||< n$| jr>| jd }|||< n
|| j|< || j|< |d k	rht| || d S )Nr   )r   r   r   r   re   rf   )r   r*   r   r=   r    r    r!   rf   6  s    





z OutOfOrderTableProxy.__setitem__r   )r=   r   c                 C  sB   | j | t| jjD ]$\}}|d |kr| j|  q>qdS )z&Remove table from the parent containerrE   N)r   ri   rF   r   r   rm   )r   r=   rb   r   r    r    r!   _remove_tableD  s
    z"OutOfOrderTableProxy._remove_tablec                 C  sn   || j krF| j| j |  }||= |s<t| jdkr<| | | j |= nt|| j|= |d k	rjt| | d S )NrE   )r   r   rZ   r   r	   r   re   rk   )r   r*   r=   r    r    r!   rk   L  s    


z OutOfOrderTableProxy.__delitem__r   c                 C  s   t t| S r   r   r%   r    r    r!   r   Z  s    zOutOfOrderTableProxy.__iter__rB   c                 C  s
   t | S r   r   r%   r    r    r!   r   ]  s    zOutOfOrderTableProxy.__len__r   c                   s   t  j||d | | S r   r   r   r   r    r!   r   `  s    zOutOfOrderTableProxy.setdefault)r   r   r   r"   r'   r   r.   r   rf   r   rk   r   r   r   r   r    r    r   r!   rO     s   
rO   r   r   )itr   c                 C  s>   t | trt | j tp<t | to<t| dko<t | d tS )zqReturns ``True`` if the given item ``it`` is a ``Table`` or ``AoT`` object
    ending with a ``Whitespace``.
    r   rD   )r)   r   r.   rS   r   r   rZ   )r   r    r    r!   rT   e  s    "rT   )!
__future__r   r]   typingr   r   tomlkit._compatr   Ztomlkit._typesr   tomlkit._utilsr   tomlkit.exceptionsr   r	   r
   tomlkit.itemsr   r   r   r   r   r   r   r   r   r   rR   objectZ_NOT_SETr   rO   rT   r    r    r    r!   <module>   s8        |Q