
    [ja                       U d Z ddlmZ ddlZddlZddlmZ ddlm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZ  e ej        d                    Zded<    ed	          Z ed
          Z ed          Z G d de
eef                   ZdS )zTools for creating and manipulating SON, the Serialized Ocument Notation.

Regular dictionaries can be used instead of SON objects, but not when the order
of keys is important. A SON object can be used just like a normal Python
dictionary.
    )annotationsN)Mapping)AnyDictIterableIteratorr   OptionalPatternTupleTypeTypeVarUnioncast zType[Pattern[Any]]RE_TYPE_Key_Value_Tc                       e Zd ZU dZded<   	 d9d:dZd; fdZd<dZd=dZd>dZ	d?dZ
d@dZdAdZd@dZdBd ZdCd"ZdD fd#ZdEd%ZdFd'ZdGd)Zd9dHd,Zd9dId/ZdJd0ZdJd1ZdKd3ZdLd5ZdMd8Z xZS )NSONzSON data.

    A subclass of dict that maintains ordering of keys and provides a
    few extra niceties for dealing with SON. SON provides an API
    similar to collections.OrderedDict.
    z	list[Any]
_SON__keysNdataEOptional[Union[Mapping[_Key, _Value], Iterable[Tuple[_Key, _Value]]]]kwargsr   returnNonec                    g | _         t                              |            |                     |           |                     |           d S N)r   dict__init__update)selfr   r   s      L/var/www/app.qaans.com/backend/venv/lib/python3.11/site-packages/bson/son.pyr    zSON.__init__<   sG    
 dDF    clsType[SON[_Key, _Value]]argsSON[_Key, _Value]c                P     t                      j        | g|R i |}g |_        |S r   )super__new__r   )r%   r'   r   instance	__class__s       r#   r+   zSON.__new__F   s4    "577?3888888r$   strc                    g }| j         D ]$}|                    d|d| |         d           %dd                    |          z  S )N(z, )z	SON([%s]))r   appendjoin)r"   resultkeys      r#   __repr__zSON.__repr__K   s\    ; 	7 	7CMM5c55tCy5556666TYYv....r$   r5   r   valuer   c                    || j         vr| j                             |           t                              | ||           d S r   )r   r2   r   __setitem__)r"   r5   r7   s      r#   r9   zSON.__setitem__Q   sC    dk!!Ks###sE*****r$   c                p    | j                             |           t                              | |           d S r   )r   remover   __delitem__r"   r5   s     r#   r<   zSON.__delitem__V   s4    3s#####r$   c                L    t                      }|                    |            |S r   )r   r!   r"   others     r#   copyzSON.copyZ   s"    #&55Tr$   Iterator[_Key]c              #  $   K   | j         E d {V  d S r   r   r"   s    r#   __iter__zSON.__iter__b   s&      ;r$   boolc                    || j         v S r   rD   r=   s     r#   has_keyzSON.has_keye   s    dk!!r$   c                *    |                                  S r   )rF   rE   s    r#   iterkeyszSON.iterkeysh   s    }}r$   Iterator[_Value]c              #  F   K   |                                  D ]	\  }}|V  
d S r   items)r"   _vs      r#   
itervalueszSON.itervaluesl   s6      JJLL 	 	DAqGGGG	 	r$   list[_Value]c                >    d |                                  D             S )Nc                    g | ]\  }}|S  rV   ).0rP   rQ   s      r#   
<listcomp>zSON.values.<locals>.<listcomp>q   s    +++da+++r$   rN   rE   s    r#   valuesz
SON.valuesp   s    ++djjll++++r$   c                V    g | _         t                                                       d S r   )r   r*   clear)r"   r-   s    r#   r[   z	SON.clears   s    r$   defaultc                B    	 | |         S # t           $ r || |<   Y nw xY w|S r   KeyErrorr"   r5   r\   s      r#   
setdefaultzSON.setdefaultw   s>    	 9 	  	  	 DIII	 s   
 Union[_Value, _T]c           	         t          |          dk    r/t          dt          dt          |          z             z             	 | |         }n# t          $ r |r
|d         cY S  w xY w| |= |S )N   z&pop expected at most 2 arguments, got r   )len	TypeErrorreprr_   )r"   r5   r'   r7   s       r#   popzSON.pop~   s    t99q==DtAPSTXPYPYMGZGZZ[[[	IEE 	 	 	 Aw	 Is   A A%#A%Tuple[_Key, _Value]c                    	 t          t          |                                                     \  }}n# t          $ r t	          d          d w xY w| |= ||fS )Nzcontainer is empty)nextiterrO   StopIterationr_   )r"   krQ   s      r#   popitemzSON.popitem   sf    	;TZZ\\**++DAqq 	; 	; 	;/00d:	;G1vs	   14 Ar@   Optional[Any]c                    |n^t          |d          r |                                D ]
\  }}|| |<   n.t          |d          r|D ]}||         | |<   n|D ]
\  }}|| |<   |r|                     |           d S d S )NrO   keys)hasattrrO   r!   )r"   r@   r   rn   rQ   s        r#   r!   z
SON.update   s    =UG$$ 	  1QUF## 	 # #(Q#   1Q 	 KK	  	 r$   Optional[Union[_Value, _T]]Union[_Value, _T, None]c                8    	 | |         S # t           $ r |cY S w xY wr   r^   r`   s      r#   getzSON.get   s5    	9 	 	 	NNN	s   
 c                J   t          |t                    rdt          |           t          |          k    oCt          |                                           t          |                                          k    S t          t          |                                 |k              S )z|Comparison to another SON is order-sensitive while comparison to a
        regular dictionary is order-insensitive.
        )
isinstancer   re   listrO   r   rG   to_dictr?   s     r#   __eq__z
SON.__eq__   su     eS!! 	Yt99E

*XtDJJLL/A/AT%++--EXEX/XXD$,,..E1222r$   c                    | |k     S r   rV   r?   s     r#   __ne__z
SON.__ne__   s    5=  r$   intc                *    t          | j                  S r   )re   r   rE   s    r#   __len__zSON.__len__   s    4;r$   dict[_Key, _Value]c                \    dfdt          d t          |                               S )zConvert a SON document to a normal Python dictionary instance.

        This is trickier than just *dict(...)* because it needs to be
        recursive.
        r7   r   r   c                    t          | t                    rfd| D             S t          | t                    r fd|                                 D             S | S )Nc                &    g | ]} |          S rV   rV   )rW   rQ   transform_values     r#   rX   z8SON.to_dict.<locals>.transform_value.<locals>.<listcomp>   s#    :::q**:::r$   c                .    i | ]\  }}| |          S rV   rV   )rW   rn   rQ   r   s      r#   
<dictcomp>z8SON.to_dict.<locals>.transform_value.<locals>.<dictcomp>   s)    HHH$!Q??1--HHHr$   )ry   rz   _MappingrO   )r7   r   s    r#   r   z$SON.to_dict.<locals>.transform_value   sh    %&& ::::E::::E8,, HHHH%++--HHHHr$   r   )r7   r   r   r   )r   r   )r"   r   s    @r#   r{   zSON.to_dict   sD    	 	 	 	 	 	 (//$t***E*EFFFr$   memodict[int, SON[_Key, _Value]]c                    t                      }t          |           }||v r||         S |||<   |                                 D ]4\  }}t          |t                    st          j        ||          }|||<   5|S r   )r   idrO   ry   r   rA   deepcopy)r"   r   outval_idrn   rQ   s         r#   __deepcopy__zSON.__deepcopy__   s    !$DT>><VJJLL 	 	DAqa)) +M!T**CFF
r$   r   )r   r   r   r   r   r   )r%   r&   r'   r   r   r   r   r(   )r   r.   )r5   r   r7   r   r   r   )r5   r   r   r   )r   r(   )r   rB   )r5   r   r   rG   )r   rL   )r   rS   )r   r   )r5   r   r\   r   r   r   )r5   r   r'   rb   r   rb   )r   ri   )r@   rp   r   r   r   r   )r5   r   r\   rt   r   ru   )r@   r   r   rG   )r   r   )r   r   )r   r   r   r(   )__name__
__module____qualname____doc____annotations__r    r+   r6   r9   r<   rA   rF   rI   rK   rR   rY   r[   ra   rh   ro   r!   rw   r|   r~   r   r{   r   __classcell__)r-   s   @r#   r   r   2   s           W[         
/ / / /+ + + +
$ $ $ $      " " " "      , , , ,        
 
 
 
                 3 3 3 3! ! ! !       G G G G"
 
 
 
 
 
 
 
r$   r   )r   
__future__r   rA   recollections.abcr   r   typingr   r   r   r   r	   r
   r   r   r   r   r   typecompiler   r   r   r   r   r   rV   r$   r#   <module>r      so     # " " " " "  				 / / / / / /                           " #d:2:b>>22 2 2 2 2wv			WT]]_ _ _ _ _$tV|
 _ _ _ _ _r$   