
    FCfo                        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y)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<   	 d	 	 	 	 	 ddZd fdZddZddZddZ	d d	Z
d!d
Zd"dZd!dZd#dZd$dZd% fdZd&dZd'dZd(dZdd)dZ	 d	 	 	 	 	 d*dZd+dZd+dZd,dZd-dZd.dZ xZS )/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__keysc                    g | _         t        j                  |        | j                  |       | j                  |       y N)r   dict__init__update)selfdatakwargss      H/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/bson/son.pyr   zSON.__init__<   s/    
 dDF    c                <    t        |   | g|i |}g |_        |S r   )super__new__r   )clsargsr   instance	__class__s       r    r$   zSON.__new__F   s'    7?3888r!   c                    g }| j                   D ]  }|j                  d|d| |   d        ddj                  |      z  S )N(z, )z	SON([%s]))r   appendjoin)r   resultkeys      r    __repr__zSON.__repr__K   sM    ;; 	7CMMAcWBtCym156	7TYYv...r!   c                    || j                   vr| j                   j                  |       t        j                  | ||       y r   )r   r,   r   __setitem__)r   r/   values      r    r2   zSON.__setitem__Q   s2    dkk!KKs#sE*r!   c                f    | j                   j                  |       t        j                  | |       y r   )r   remover   __delitem__r   r/   s     r    r6   zSON.__delitem__V   s$    3s#r!   c                <    t               }|j                  |        |S r   )r   r   r   others     r    copyzSON.copyZ   s    #&5Tr!   c              #  8   K   | j                   E d {    y 7 wr   r   r   s    r    __iter__zSON.__iter__b   s     ;;s   c                    || j                   v S r   r=   r7   s     r    has_keyzSON.has_keye   s    dkk!!r!   c                "    | j                         S r   )r?   r>   s    r    iterkeyszSON.iterkeysh   s    }}r!   c              #  D   K   | j                         D ]	  \  }}|  y wr   itemsr   _vs      r    
itervalueszSON.itervaluesl   s$     JJL 	DAqG	s    c                T    | j                         D cg c]  \  }}|	 c}}S c c}}w r   rE   rG   s      r    valuesz
SON.valuesp   s     "jjl+da+++s   $c                0    g | _         t        | 	          y r   )r   r#   clear)r   r(   s    r    rN   z	SON.clears   s    r!   c                8    	 | |   S # t         $ r	 || |<   Y |S w xY wr   KeyErrorr   r/   defaults      r    
setdefaultzSON.setdefaultw   s.    	 9 	 DI	 s    c           	         t        |      dkD  r#t        dt        dt        |      z         z         	 | |   }| |= |S # t        $ r |r|d   cY S  w xY w)N   z&pop expected at most 2 arguments, got r   )len	TypeErrorreprrQ   )r   r/   r&   r3   s       r    popzSON.pop~   sj    t9q=DtAPSTXPYMGZZ[[	IE
 I  	Aw	s   = AAc                    	 t        t        | j                                     \  }}| |= ||fS # t        $ r t	        d      d w xY w)Nzcontainer is empty)nextiterrF   StopIterationrQ   )r   krI   s      r    popitemzSON.popitem   sQ    	;TZZ\*+DAq G1v  	;/0d:	;s	   %. Ac                    |nUt        |d      r|j                         D ]
  \  }}|| |<    n+t        |d      r|D ]
  }||   | |<    n|D ]
  \  }}|| |<    |r| j                  |       y y )NrF   keys)hasattrrF   r   )r   r:   r   r_   rI   s        r    r   z
SON.update   s    =UG$ 1QUF# #(Q#  1QKK r!   c                0    	 | |   S # t         $ r |cY S w xY wr   rP   rR   s      r    getzSON.get   s%    	9 	N	s    c                    t        |t              rLt        |       t        |      k(  xr3 t        | j	                               t        |j	                               k(  S t        t        | j                         |k(        S )z|Comparison to another SON is order-sensitive while comparison to a
        regular dictionary is order-insensitive.
        )
isinstancer   rW   listrF   r   boolto_dictr9   s     r    __eq__z
SON.__eq__   sY     eS!t9E
*XtDJJL/AT%++-EX/XXD$,,.E122r!   c                    | |k(   S r    r9   s     r    __ne__z
SON.__ne__   s    5=  r!   c                ,    t        | j                        S r   )rW   r   r>   s    r    __len__zSON.__len__   s    4;;r!   c                F    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.
        c                    t        | t              r| D cg c]
  } |       c}S t        | t              r*| j                         D ci c]  \  }}| |       c}}S | S c c}w c c}}w r   )rg   rh   _MappingrF   )r3   rI   r_   transform_values      r    rt   z$SON.to_dict.<locals>.transform_value   s_    %&49:q*::E8,:?++-H$!Q?1--HH	 ;Hs   A$A)dict[_Key, _Value])r3   r   returnr   )r   r   )r   rt   s    @r    rj   zSON.to_dict   s!    	 (/$t**EFFr!   c                    t               }t        |       }||v r||   S |||<   | j                         D ]0  \  }}t        |t              st        j                  ||      }|||<   2 |S r   )r   idrF   rg   r   r;   deepcopy)r   memooutval_idr_   rI   s         r    __deepcopy__zSON.__deepcopy__   so    !$DT><VJJL 	DAqa)MM!T*CF	 
r!   r   )r   zEOptional[Union[Mapping[_Key, _Value], Iterable[Tuple[_Key, _Value]]]]r   r   rv   None)r%   zType[SON[_Key, _Value]]r&   r   r   r   rv   SON[_Key, _Value])rv   str)r/   r   r3   r   rv   r~   )r/   r   rv   r~   )rv   r   )rv   zIterator[_Key])r/   r   rv   ri   )rv   zIterator[_Value])rv   zlist[_Value])rv   r~   )r/   r   rS   r   rv   r   )r/   r   r&   Union[_Value, _T]rv   r   )rv   zTuple[_Key, _Value])r:   zOptional[Any]r   r   rv   r~   )r/   r   rS   zOptional[Union[_Value, _T]]rv   zUnion[_Value, _T, None])r:   r   rv   ri   )rv   int)rv   ru   )rz   zdict[int, SON[_Key, _Value]]rv   r   )__name__
__module____qualname____doc____annotations__r   r$   r0   r2   r6   r;   r?   rA   rC   rJ   rL   rN   rT   rZ   r`   r   re   rk   rn   rp   rj   r}   __classcell__)r(   s   @r    r   r   2   s      W[S  
	
/+
$",
 " AE"=	 3! G"
r!   r   )r   
__future__r   r;   recollections.abcr   rs   typingr   r   r   r   r	   r
   r   r   r   r   r   typecompiler   r   r   r   r   r   rm   r!   r    <module>r      s{    #  	 /   " #:2::b>2	 2v		T]a$tV|
 ar!   