o
    vi|                     @  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Z!dS )     )annotationsN)Iterator)Any)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Zed~d
dZdddZedddZdddZ	ddddZ
dddZdd!d"Zddd$d%Z	&ddd)d*Zdd,d-Zdd/d0Zdd2d3Zdd6d7Zdd8d9Zdd:d;Zdd<d=Zdd?d@ZdddEdFZddGdHZdddIdJZddKdLZddMdNZddPdQZddSdTZddUdVZddWdXZd fdZd[Z dd]d^Z!dd`daZ"ddbdcZ#ddddeZ$ddhdiZ%djdk Z&dldm Z'dndo Z(dpdq Z)ddrdsZ*ddtduZ+de,ffddxdyZ-de,ffddzd{Z.  Z/S )	Containerz
    A container for items within a TOMLDocument.

    This class implements the `dict` interface with copy/deepcopy protocol.
    FparsedboolreturnNonec                 C  s   i | _ g | _|| _g | _d S N)_map_body_parsed_table_keys)selfr    r!   H/home/app/Keep/.python/lib/python3.10/site-packages/tomlkit/container.py__init__$   s   
zContainer.__init__list[tuple[Key | None, Item]]c                 C  s   | j S r   r   r    r!   r!   r"   body*   s   zContainer.bodydict[str, Any]c                 C  sf   i }|   D ]*\}}|du rqt|tr|j}t|dr | }||v r,t|| | 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 ]'\}}|du rq|j}|j}t|tr|j}||v r(t|| | q|||< q|S )zThe wrapped dict valueN)r   r,   valuer+   r   r   )r    dr.   r/   r!   r!   r"   r0   B   s   

zContainer.valueparsingc                 C  sT   || _ | jD ]!\}}t|tr|j| qt|tr'|jD ]}|j| qqd S r   )r   r   r+   r   r0   r2   r   r'   )r    r2   _r/   tr!   r!   r"   r2   W   s   


zContainer.parsingNr,   Key | Item | strr   Item | Nonec                 C  s4   |du 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   r0   r   c           
      C  s   t |ttfrtd|^}}}d|_ttdt ddd }}|D ]}d|_ttdt ddd}	|||	 |	}q#|j|_||| | || d S )Nz!Can't add a table to a dotted keyTF)is_super_table)	r+   r   r   r
   Z_dottedr   r   r8   sep)
r    r,   r0   namemidlasttablecurrent_nameZ	new_tabler!   r!   r"   _handle_dotted_keyv   s   zContainer._handle_dotted_keyintc                 C  sh   d}t | jD ](\}\}}t|trqt|tr| sqt|ttfr-| s- |d S |}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_tableSingleKey | Nonec                 C  sb   |d u r| j D ]}|d usJ | | qd S || j vs$t| j | ts&d S t| | j |  d S r   )r   _validate_out_of_order_tabler+   tupleOutOfOrderTableProxyvalidate)r    r,   r.   r!   r!   r"   rN      s   
z&Container._validate_out_of_order_tableTKey | str | NonerQ   c                 C  s@  t |ts|durt|}t |tst|}|dur&| r&| || | S t |ttfr6|j	du r6|j
|_	|  }t |tpBt|}t |trc| jsO|  | jrc| jsc|jjsc|sc| scd|j_t |tr| jr| js|  |rd|d jjv s|sd|d jj |d j_|dur|| v r| j| }t |tr| j|d  }n| j| }|d }t |trt |ttfst|| rt |tst||g| jd}| ||| | S || | S | r| st||| | S | r| rt| s|d  s| jd |d krH| r#| js#|  }	nt| j}	|	t| jk r8| |	|| n|  || |rF| !| | S t"#|}|j$j%D ]\}
}||
| qQ|d |f| jt |trp|d < | S |< | S |d  rt&dn,| st|n"t |trt |tst||j%D ]}|| q| S t|t |ttf}|dur| jr| js|r| r|  }|t| jk r| j| d }t |tsd|jjv sd|jj |j_| |||S | jd d }t |tst|sd|jj'v s|j j'd7  _'|  || | S )z<Similar to :meth:`add` but both key and value must be given.N
r   rF   rG   )r   z!Redefinition of an existing table)(r+   r   r   r   _itemZis_multirC   r   r   r=   r,   _previous_itemr   ends_with_whitespacer   invalidate_display_namer   triviaindentrI   r   rO   r   is_aot_element_replacer8   Zis_aotr;   r   rL   len
_insert_at_raw_appendrN   copydeepcopyr0   r'   r
   trail)r    r,   r   rQ   prevZprev_wscurrent_idxZcurrent_body_elementrA   idxr.   r/   r@   is_tablerJ   Z
after_itemprevious_itemr!   r!   r"   r8      s   



















	zContainer.append
Key | Nonec                 C  s   || j v r6| j | }t|ts|f}| j|d  d }|d ur(t|ts(t|g |t| jR | j |< n|d urBt| j| j |< | j||f | rT| j	| |d urct
| |j|j d S d S rE   )r   r+   rO   r   r   r   r\   r8   re   r   dict__setitem__r,   r0   )r    r,   r   rc   rA   r!   r!   r"   r^   7  s    


zContainer._raw_appendrd   c                 C  s   | j | d }| j|}|d u rt|d t f| j |< t|trAt|}|| t	|dkr6|
 }nt|}|| j|< d S t| |j | j
| d S )Nr   rG   )r   r   getr	   r   r+   rO   listremover\   poprh   __delitem__r,   )r    rd   r,   indexr!   r!   r"   
_remove_atL  s   


zContainer._remove_at	Key | strc                 C  sx   t |ts	t|}| j|d}|du rt|t |tr+|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   rm   r	   rO   r   r   rh   rn   r,   )r    r,   rd   rK   r!   r!   r"   rl   _  s   

zContainer.remove	other_keyr   c           
      C  s@  |d u rt d|| vrt|t|tst|}t|ts"t|}t|}| j| }t|tr4t|}| j	| d }d|j
jvrI|j
 jd7  _| j D ]0\}}t|trsg }|D ]}	|	|kre|	d }	||	 q[t|| j|< qN||kr~|d | j|< qN|d | j|< | j	|d ||f |d urt| |j|j | S )Nz$Key cannot be null in insert_after()rG   rS   )r7   r	   r+   r   r   rT   r   rO   maxr   rX   ra   r*   r8   insertrh   ri   r,   r0   )
r    r,   rr   r   rd   Zcurrent_itemr.   r/   new_indicesv_r!   r!   r"   _insert_afterr  s>   




zContainer._insert_afterc           
      C  sh  |t | jd krtd| t|tst|}t|}|dkrH| j|d  d }t|tsHt|sHt|t	t
fsHd|jjv sH|j jd7  _| j D ]0\}}t|trrg }|D ]}||krd|d }|| qZt|| j|< qM||kr}|d | j|< qM|| jv r| j| }	t|	ts|	f}	g |	|R | j|< n|| j|< | j|||f t| |j|j | S )NrG   zUnable to insert at position r   rS   )r\   r   r7   r+   r   r   rT   r   rV   r   r   rX   ra   r   r*   rO   r8   rt   rh   ri   r,   r0   )
r    rd   r,   r   rf   r.   r/   ru   rv   rc   r!   r!   r"   r]     sF   





zContainer._insert_atc                 C  sP   t |ts	t|}| j|}|du rt|t |tr!t| |S | j| d S )zGet an item for the given key.NrG   )	r+   r   r   r   rj   r	   rO   rP   r   )r    r,   rd   r!   r!   r"   r     s   


zContainer.itemc                 C  s   | j r
| j d d S dS )zGet the last item.rF   rG   Nr%   r&   r!   r!   r"   	last_item  s   zContainer.last_itemstrc                 C  s   d}| j D ]c\}}|dur`t|tr2|dr)|dds)d|jjvr)|d7 }|| ||7 }qt|trW|drN|ddsNd|jjvrN|d7 }|| 	||7 }q|| 
||7 }q|| 
||7 }q|S )zRender as TOML string. N rS   )r   r+   r   stripendswithrX   rY   _render_tabler   _render_aot_render_simple_item)r    sr.   r/   r!   r!   r"   	as_string  s,   

zContainer.as_stringr@   r   prefix
str | Nonec              	   C  s  d}|j d ur|j }n| }|d ur|d | }| r;tdd |jjD r,| r;tdd |jjD ry| syd\}}| rGd\}}d|jj	vrVt
|jd	krVd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r|d
r|d
dsd|
jjvr|d7 }|
 r|	 r| s|| |	|
7 }q|| j|	|
|d7 }q|| j|	|
|d7 }qt|
tr|d
r|d
dsd|
jjvr|d7 }|| j|	|
|d7 }q|| j|	|
| r|nd d7 }q|S )Nrz   .c                 s  s(    | ]\}}t |ttttf V  qd S r   )r+   r   r   r   r   .0r3   r/   r!   r!   r"   	<genexpr>  s
    
z*Container._render_table.<locals>.<genexpr>c                 s  s&    | ]\}}t |tr| V  qd S r   )r+   r   rI   )r   r.   r/   r!   r!   r"   r     s   $ )[]z[[z]]rS   r   r{   r   )Zdisplay_namer   r;   anyr0   r'   rI   rZ   rX   ra   r\   rY   r   
comment_wscommentr+   r   r|   r}   r~   r   r   r   )r    r,   r@   r   cur_keyopen_closeZnewline_in_table_triviar.   r/   r!   r!   r"   r~     s   

 




zContainer._render_tablec                 C  sJ   |  }|d ur|d | }d}t|}|jD ]}|| j||d7 }q|S )Nr   rz   r   )r   r   r'   _render_aot_table)r    r,   Zaotr   r   r   r@   r!   r!   r"   r   M  s   
zContainer._render_aotc           	      C  s   d}|pd}d\}}||j j | t| | |j j t|j j |j j 7 }|jjD ]H\}}t|t	r\|
 rQ| rF|| ||7 }q,|| j|||d7 }q,|| j|||d7 }q,t|trl|| j|||d7 }q,|| ||7 }q,|S )Nrz   r   r   )rX   rY   r   r   r   ra   r0   r'   r+   r   r;   rI   r~   r   r   r   )	r    r@   r   r   r   r   r   r.   r/   r!   r!   r"   r   Y  s:   



zContainer._render_aot_tablec                 C  sn   |d u r|  S |  }|d ur|d | }|jj t| |j t|   |jj t|jj |jj S )Nr   )r   rX   rY   r   r<   r   r   ra   )r    r,   r   r   r   r!   r!   r"   r   y  s&   

zContainer._render_simple_itemc                 C  
   t | S r   rh   __len__r&   r!   r!   r"   r        
zContainer.__len__Iterator[str]c                 C     t t| S r   iterrh   keysr&   r!   r!   r"   __iter__     zContainer.__iter__Item | Containerc                 C  s&   |  |}t|tr| r|jS |S r   )r   r+   r   Z
is_booleanr0   r9   r!   r!   r"   __getitem__  s   
zContainer.__getitem__c                   sJ    d ur | v rt t fdd| j}| | | d S |  | d S )Nc                   s   |  kS r   r!   )r.   r,   r!   r"   <lambda>  s    z'Container.__setitem__.<locals>.<lambda>)nextfilterr   r[   r8   )r    r,   r0   old_keyr!   r   r"   ri     s   zContainer.__setitem__c                 C  s   |  | d S r   )rl   r    r,   r!   r!   r"   rn     r   zContainer.__delitem__defaultc                      t  j||d | | S N)r   super
setdefaultr    r,   r   	__class__r!   r"   r        zContainer.setdefaultnew_keyc                 C  s@   t |ts	t|}| j|}|d u rt|| ||| d S r   )r+   r   r   r   rj   r	   _replace_at)r    r,   r   r0   rd   r!   r!   r"   r[     s   
zContainer._replaceint | tuple[int]c                 C  sX  t |}t|tr|dd  D ]
}d t f| j|< q|d }| j| \}}t|tsDt|ttft|ttfks=||jkrBt	|}n|}| j
|= || j
|< ||krWt| | t|ttft|ttfkr| | t|t| jD ]}t| j| d ttfr| ||| |} n	qrd}| || n.t|ttfs|jj|j_|jjp|jj|j_|jjp|jj|j_|jj|j_||f| j|< t|dr|  t|tr*|  \}}|dk r|n|}t|}	t|to|jjot|jjd d t}
||k ot| j|d  d t}||k s|
r|s|	s|d td t| |j|j d S d S )NrG   r   rF   rW   rS   )rT   r+   rO   r   r   r   r   r   r,   r   r   rh   rn   rl   ranger\   r]   r8   r   rX   rY   r   r   ra   r-   rW   _previous_item_with_indexrV   r0   r'   ri   )r    rd   r   r0   rK   r.   r/   r?   r3   Zhas_wsZreplace_has_wsZnext_wsr!   r!   r"   r     s`   







"zContainer._replace_atc                 C  
   t | jS r   )ry   r0   r&   r!   r!   r"   __str__  r   zContainer.__str__c                 C  r   r   )reprr0   r&   r!   r!   r"   __repr__  r   zContainer.__repr__otherrh   c                 C  s   t |tstS | j|kS r   )r+   rh   NotImplementedr0   )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__  r   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 ur(t| |j|j qd S )Nr   rG   r      )r   r   r   r   rh   ri   r,   r0   )r    stater,   r   r!   r!   r"   __setstate__  s   



zContainer.__setstate__c                 C  s
   t  | S r   )r_   r&   r!   r!   r"   r_     r   zContainer.copyc                 C  sP   |  | j}t| D ]\}}t||| q| j| j7  _|j| j |S r   )	r   r   rh   r*   ri   r   r'   r   update)r    cr.   r/   r!   r!   r"   __copy__  s   zContainer.__copy__
int | Nonetuple[int, Item] | Nonec                 C  s^   |du s|t | jkrt | j}t|d ddD ]}| j| d }t||s,||f  S qdS )z5Find the immediate previous item before index ``idx``NrG   rF   )r\   r   r   r+   )r    rd   ignorerK   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.
        rF   N)r   )r    rd   r   rb   r!   r!   r"   rU   1  s   zContainer._previous_item)F)r   r   r   r   )r   r$   )r   r(   )r2   r   r   r   r   )r,   r5   r   r6   r   r   )r,   r   r0   r   r   r   r   rD   )r,   rM   r   r   )T)r,   rR   r   r   rQ   r   r   r   )r,   rg   r   r   r   r   )rd   rD   r   r   )r,   rq   r   r   )r,   rq   rr   rq   r   r   r   r   )rd   rD   r,   rq   r   r   r   r   )r,   rq   r   r   )r   r6   r   ry   )r,   r   r@   r   r   r   r   ry   )r@   r   r   r   r   ry   r   r   )r,   rq   r   r   r,   rq   r0   r   r   r   r,   rq   r   r   r,   rq   r   r   r   r   )r,   rq   r   rq   r0   r   r   r   )rd   r   r   rq   r0   r   r   r   )r   rh   r   r   )r   r   )rd   r   r   r   )rd   r   r   r6   )0__name__
__module____qualname____doc__r#   propertyr'   r)   r0   r2   r:   rC   rL   rN   r8   r^   rp   rl   rw   r]   r   rx   r   r~   r   r   r   r   r   r   ri   rn   r   r[   r   r   r   r   r   r   r   r   r_   r   r   r   rU   __classcell__r!   r!   r   r"   r      s`    




 




/
.


L
 








D




r   c                      s   e Zd Zed'ddZd'd	d
Zd(ddZedd Zd)ddZ	d*ddZ
d+ddZd,ddZd-dd Zd.d"d#Zd/ fd%d&Z  ZS )0rP   	containerr   indicestuple[int, ...]r   r   c                 C  sX   t d}|D ]}| j| \}}t|tr%|jjD ]\}}|j||dd qq|  dS )z3Validate out of order tables in the given containerTF)rQ   N)r   r   r+   r   r0   r'   r8   rN   )r   r   Ztemp_containerrK   r3   r   r.   r/   r!   r!   r"   rQ   :  s   
zOutOfOrderTableProxy.validatec           	      C  s   || _ td| _g | _i | _|D ]H}| j j| \}}t|trX| j| t	| jd }|j
jD ]'\}}| j|| | j|g }||vrK|| |d urWt| |j| q0q| j  d S )NTrG   )
_containerr   _internal_container_tables_tables_mapr   r+   r   r8   r\   r0   r'   r^   r   rh   ri   r,   rN   )	r    r   r   rK   r3   r   Z	table_idxr.   r/   r!   r!   r"   r#   H  s$   


zOutOfOrderTableProxy.__init__ry   c                 C  s
   | j  S r   )r   r)   r&   r!   r!   r"   r)   ^  r   zOutOfOrderTableProxy.unwrapc                 C  s   | j jS r   )r   r0   r&   r!   r!   r"   r0   a  s   zOutOfOrderTableProxy.valuer,   rq   r   c                 C  s   || j vr	t|| j | S r   )r   r	   r   r!   r!   r"   r   e  s   

z OutOfOrderTableProxy.__getitem__r0   c                   sJ  ddl m dfdd || jv r\| j| }t|dkr/| j|  }| | t|dks| j|d	  | } |rR |sR| j|d	  |= | j|= || |< d S || j|d	  |< n5| jr |s| jD ]}t fd
d|  D r{|||<  nqf|| jd	 |< n|| jd	 |< n|| j|< || j	|< |d urt
| || d S d S )NrG   r   itr   r   r   c                   s   t  | ttfS r   )r+   r   r   r   r   r!   r"   _is_table_or_aotn  s   z:OutOfOrderTableProxy.__setitem__.<locals>._is_table_or_aotr   c                 3  s    | ]
\}} | V  qd S r   r!   r   )r   r!   r"   r     s    z3OutOfOrderTableProxy.__setitem__.<locals>.<genexpr>r   r   r   r   )r*   r   r   r\   r   rm   _remove_tabler   r   r   rh   ri   )r    r,   r0   r   r@   	old_valuer!   )r   r   r"   ri   k  s<   





z OutOfOrderTableProxy.__setitem__r@   r   c                 C  sD   | j | t| jjD ]\}}|d |u r| j|  dS qdS )z&Remove table from the parent containerrG   N)r   rl   rH   r   r   rp   )r    r@   rd   r   r!   r!   r"   r     s   z"OutOfOrderTableProxy._remove_tablec                 C  s~   || j vr	t|t| j | D ]}| j| }||= |s(t| jdkr(| | q| j |= | j|= |d ur=t| | d S d S )NrG   )	r   r	   reversedr   r\   r   r   rh   rn   )r    r,   rK   r@   r!   r!   r"   rn     s   


z OutOfOrderTableProxy.__delitem__r   c                 C  r   r   r   r&   r!   r!   r"   r     r   zOutOfOrderTableProxy.__iter__rD   c                 C  r   r   r   r&   r!   r!   r"   r     r   zOutOfOrderTableProxy.__len__r   c                   r   r   r   r   r   r!   r"   r     r   zOutOfOrderTableProxy.setdefault)r   r   r   r   r   r   r   )r,   rq   r   r   r   )r@   r   r   r   r   r   r   r   )r   r   r   staticmethodrQ   r#   r)   r   r0   r   ri   r   rn   r   r   r   r   r!   r!   r   r"   rP   9  s    





&


rP   r   r   r   r   c                 C  s>   t | to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   rF   )r+   r   r0   rU   r   r   r\   r   r!   r!   r"   rV     s   "rV   r   )"
__future__r   r_   collections.abcr   typingr   Ztomlkit._compatr   Ztomlkit._typesr   Ztomlkit._utilsr   Ztomlkit.exceptionsr   r	   r
   Ztomlkit.itemsr   r   r   r   r   r   r   r   r   r   rT   objectZ_NOT_SETr   rP   rV   r!   r!   r!   r"   <module>   s<          "z