
    i>                        % S r SSKJr  SSKrSSKrSSKrSSKJr  SSK	J
r
JrJrJrJrJrJrJrJrJrJrJr  \" \R,                  " S5      5      rS\S'   \" S	5      r\" S
5      r\" S5      r " S S\\\4   5      rg)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                  8  ^  \ rS rSr% SrS\S'    S     SS jjrSU 4S jjrSS jrS S jr	S!S	 jr
S"S
 jrS#S jrS$S jrS#S jrS%S jrS&S jrS'U 4S jjrS(S jrS)S jrS*S jrSS+S jjr S     S,S jjrS-S jrS-S jrS.S jrS/S jrS0S jrSrU =r$ )1SON3   zSON 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__keysc                    / U l         [        R                  U 5        U R                  U5        U R                  U5        g N)r   dict__init__update)selfdatakwargss      ?/home/ubuntu/wiki/venv/lib/python3.13/site-packages/bson/son.pyr   SON.__init__=   s/    
 dDF    c                >   > [         TU ]  " U /UQ70 UD6n/ Ul        U$ r   )super__new__r   )clsargsr    instance	__class__s       r!   r&   SON.__new__G   s'    7?3888r#   c                    / nU R                    H  nUR                  SU< SX   < S35        M!     SSR                  U5      -  $ )N(z, )z	SON([%s]))r   appendjoin)r   resultkeys      r!   __repr__SON.__repr__L   sF    ;;CMMAcWBtym156 TYYv...r#   c                    XR                   ;  a  U R                   R                  U5        [        R                  XU5        g r   )r   r/   r   __setitem__)r   r2   values      r!   r6   SON.__setitem__R   s.    kk!KKs#E*r#   c                d    U R                   R                  U5        [        R                  X5        g r   )r   remover   __delitem__r   r2   s     r!   r;   SON.__delitem__W   s"    3#r#   c                <    [        5       nUR                  U 5        U$ r   )r   r   r   others     r!   copySON.copy[   s    #&5Tr#   c              #  8   #    U R                    S h  vN   g  N7fr   )r   r   s    r!   __iter__SON.__iter__c   s     ;;s   c                R    [         R                  " S[        SS9  XR                  ;   $ )Nz8SON.has_key() is deprecated, use the in operator instead   
stacklevel)warningswarnDeprecationWarningr   r<   s     r!   has_keySON.has_keyf   s&    F	

 kk!!r#   c                V    [         R                  " S[        SS9  U R                  5       $ )Nz;SON.iterkeys() is deprecated, use the keys() method insteadrH   rI   )rK   rL   rM   rE   rD   s    r!   iterkeysSON.iterkeysn   s%    I	

 }}r#   c              #  z   #    [         R                  " S[        SS9  U R                  5        H	  u  pUv   M     g 7f)Nz?SON.itervalues() is deprecated, use the values() method insteadrH   rI   )rK   rL   rM   itemsr   _vs      r!   
itervaluesSON.itervaluesw   s3     M	

 JJLDAG !s   9;c                X    U R                  5        VVs/ s H  u  pUPM	     snn$ s  snnf r   )rT   rU   s      r!   values
SON.values   s"    "jjl+ldal+++s   &c                0   > / U l         [        TU ]	  5         g r   )r   r%   clear)r   r*   s    r!   r^   	SON.clear   s    r#   c                6     X   $ ! [          a    X U'    U$ f = fr   KeyErrorr   r2   defaults      r!   
setdefaultSON.setdefault   s*    	 9 	 I	 s    c           	         [        U5      S:  a#  [        S[        S[        U5      -   5      -   5      e X   nX	 U$ ! [         a    U(       a  US   s $ e f = f)N   z&pop expected at most 2 arguments, got r   )len	TypeErrorreprrb   )r   r2   r(   r7   s       r!   popSON.pop   sf    t9q=DtAPSTXPYMGZZ[[	IE
 I  	Aw	s   < AAc                     [        [        U R                  5       5      5      u  pX	 X4$ ! [         a    [	        S5      S ef = f)Nzcontainer is empty)nextiterrT   StopIterationrb   )r   krW   s      r!   popitemSON.popitem   sK    	;TZZ\*+DA Gv  	;/0d:	;s	   $+ Ac                    Uc  O_[        US5      (       a  UR                  5        H	  u  p4X@U'   M     O0[        US5      (       a  U H	  nX   X'   M     OU H	  u  p4X@U'   M     U(       a  U R                  U5        g g )NrT   keys)hasattrrT   r   )r   r@   r    rr   rW   s        r!   r   
SON.update   sy    =UG$$Q &UF##(  Q KK r#   c                0     X   $ ! [          a    Us $ f = fr   ra   rc   s      r!   getSON.get   s#    	9 	N	s    c                   [        U[        5      (       aQ  [        U 5      [        U5      :H  =(       a3    [        U R	                  5       5      [        UR	                  5       5      :H  $ [        [        U R                  5       U:H  5      $ )zlComparison to another SON is order-sensitive while comparison to a
regular dictionary is order-insensitive.
)
isinstancer   ri   listrT   r   boolto_dictr?   s     r!   __eq__
SON.__eq__   s\     eS!!t9E
*XtDJJL/AT%++-EX/XXD$,,.E122r#   c                    X:X  + $ r    r?   s     r!   __ne__
SON.__ne__   s      r#   c                ,    [        U R                  5      $ r   )ri   r   rD   s    r!   __len__SON.__len__   s    4;;r#   c                J   ^ SU4S jjm[        ST" [        U 5      5      5      $ )zConvert a SON document to a normal Python dictionary instance.

This is trickier than just *dict(...)* because it needs to be
recursive.
c                   > [        U [        5      (       a  U  Vs/ s H  nT" U5      PM     sn$ [        U [        5      (       a,  U R                  5        VVs0 s H  u  p!UT" U5      _M     snn$ U $ s  snf s  snnf r   )r}   r~   _MappingrT   )r7   rW   rr   transform_values      r!   r   $SON.to_dict.<locals>.transform_value   sk    %&&49:Eq*E::E8,,:?++-H-$!?1---HH	 ;Hs   A3A8dict[_Key, _Value])r7   r   returnr   )r   r   )r   r   s    @r!   r   SON.to_dict   s!    	 (/$t**EFFr#   c                    [        5       n[        U 5      nX1;   a  X   $ X!U'   U R                  5        H4  u  pE[        U[        5      (       d  [
        R                  " XQ5      nXRU'   M6     U$ r   )r   idrT   r}   r   rA   deepcopy)r   memooutval_idrr   rW   s         r!   __deepcopy__SON.__deepcopy__   sa    !$D><VJJLDAa))MM!*F ! 
r#   )__keysr   )r   zEOptional[Union[Mapping[_Key, _Value], Iterable[Tuple[_Key, _Value]]]]r    r   r   None)r'   zType[SON[_Key, _Value]]r(   r   r    r   r   SON[_Key, _Value])r   str)r2   r   r7   r   r   r   )r2   r   r   r   )r   r   )r   zIterator[_Key])r2   r   r   r   )r   zIterator[_Value])r   zlist[_Value])r   r   )r2   r   rd   r   r   r   )r2   r   r(   Union[_Value, _T]r   r   )r   zTuple[_Key, _Value])r@   zOptional[Any]r    r   r   r   )r2   r   rd   zOptional[Union[_Value, _T]]r   zUnion[_Value, _T, None])r@   r   r   r   )r   int)r   r   )r   zdict[int, SON[_Key, _Value]]r   r   )__name__
__module____qualname____firstlineno____doc____annotations__r   r&   r3   r6   r;   rA   rE   rN   rQ   rX   r[   r^   re   rl   rs   r   rz   r   r   r   r   r   __static_attributes____classcell__)r*   s   @r!   r   r   3   s      W[S  
	
/+
$",
 " AE"=	 3! G"
 
r#   r   )r   
__future__r   rA   rerK   collections.abcr   r   typingr   r   r   r   r	   r
   r   r   r   r   r   typecompiler   r   r   r   r   r   r   r#   r!   <module>r      s|    #  	  /   " #2::b>2	 2v		T]p$tV|
 pr#   