
    h                     n    d Z ddlZddlZddlmZmZ  e ej                  d            Z G d de	      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.    N)abc	iteritems c                        e Zd ZdZddZ fdZd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Z fdZddZd Zd ZddZddZd Zd Zd Zd Z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 from Python 2.7+.
    c                     g | _         t        j                  |        | j                  |       | j                  |       y N)
_SON__keysdict__init__update)selfdatakwargss      K/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/bson/son.pyr   zSON.__init__(   s-    dDF    c                 D    t        t        | 
  | g|i |}g |_        |S r	   )superr   __new__r
   )clsargsr   instance	__class__s       r   r   zSON.__new__.   s*    c*3@@@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__3   sC    ;; 	9CMMT#Y78	9TYYv...r   c                     || j                   vr| j                   j                  |       t        j                  | ||       y r	   )r
   r   r   __setitem__)r   r    values      r   r#   zSON.__setitem__9   s2    dkk!KKs#sE*r   c                 f    | j                   j                  |       t        j                  | |       y r	   )r
   remover   __delitem__r   r    s     r   r'   zSON.__delitem__>   s$    3s#r   c                 ,    t        | j                        S r	   )listr
   r   s    r   keyszSON.keysB   s    DKK  r   c                 <    t               }|j                  |        |S r	   )r   r   r   others     r   copyzSON.copyE   s    Tr   c              #   6   K   | j                   D ]  }|  y wr	   r
   r   ks     r   __iter__zSON.__iter__M   s      	AG	s   c                     || j                   v S r	   r2   r(   s     r   has_keyzSON.has_keyQ   s    dkk!!r   c              #   ,   K   | D ]  }|| |   f  y wr	    r3   s     r   r   zSON.iteritemsU   s#      	Ad1g,	s   c                 "    | j                         S r	   )r5   r+   s    r   iterkeyszSON.iterkeysY   s    }}r   c              #   D   K   | j                         D ]	  \  }}|  y wr	   r   r   _vs      r   
itervalueszSON.itervalues]   s%     NN$ 	DAqG	s    c                 T    | j                         D cg c]  \  }}|	 c}}S c c}}w r	   r=   r>   s      r   valuesz
SON.valuesa   s!    "nn./da///s   $c                 6    | D cg c]	  }|| |   f c}S c c}w r	   r9   r(   s     r   itemsz	SON.itemsd   s    ,01Sd3i 111s   c                 8    g | _         t        t        |           y r	   )r
   r   r   clear)r   r   s    r   rG   z	SON.clearg   s    c4 r   c                 8    	 | |   S # t         $ r	 || |<   Y |S w xY wr	   KeyErrorr   r    defaults      r   
setdefaultzSON.setdefaultk   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reprrJ   )r   r    r   r$   s       r   popzSON.popr   sn    t9q=D"&q3t9}"56 7 7	IE
 I  	Aw	s   = AAc                 z    	 t        | j                               \  }}| |= ||fS # t        $ r t        d      w xY w)Nzcontainer is empty)nextr   StopIterationrJ   )r   r4   r@   s      r   popitemzSON.popitem   sK    	1()DAq G1v  	1/00	1s   % :c                     |nct        |d      r|j                         D ]
  \  }}|| |<    n9t        |d      r|j                         D ]
  }||   | |<    n|D ]
  \  }}|| |<    |r| j                  |       y y )Nr   r,   )hasattrr   r,   r   )r   r/   r   r4   r@   s        r   r   z
SON.update   s    =UK() 1QUF#ZZ\ #(Q#  1QKK r   c                 0    	 | |   S # t         $ r |cY S w xY wr	   rI   rK   s      r   getzSON.get   s%    	9 	N	s    c                     t        |t              r:t        |       t        |      k(  xr! | j                         |j                         k(  S | j	                         |k(  S )z|Comparison to another SON is order-sensitive while comparison to a
        regular dictionary is order-insensitive.
        )
isinstancer   rP   rE   to_dictr.   s     r   __eq__z
SON.__eq__   sH     eS!t9E
*Ltzz|u{{}/LL||~&&r   c                     | |k(   S r	   r9   r.   s     r   __ne__z
SON.__ne__   s    5=  r   c                 ,    t        | j                        S r	   )rP   r
   r+   s    r   __len__zSON.__len__   s    4;;r   c                 0    f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        j                        r/t	        t        |       D cg c]  \  }}| |      f c}}      S | S c c}w c c}}w r	   )r]   r*   r   Mappingr   r   )r$   r@   r4   transform_values      r   rg   z$SON.to_dict.<locals>.transform_value   sx    %&49:q*::E3;;/ )% 021 *+2 3 3  ;2s   A3A8
)r   )r   rg   s    @r   r^   zSON.to_dict   s    	 tDz**r   c                     t               }t        |       }||v r|j                  |      S |||<   | j                         D ]0  \  }}t	        |t
              st        j                  ||      }|||<   2 |S r	   )r   idr[   r   r]   RE_TYPEr0   deepcopy)r   memooutval_idr4   r@   s         r   __deepcopy__zSON.__deepcopy__   su    eDT>88F##VNN$ 	DAqa)MM!T*CF	 
r   r	   )__name__
__module____qualname____doc__r   r   r!   r#   r'   r,   r0   r5   r7   r   r;   rA   rC   rE   rG   rM   rS   rW   r   r[   r_   ra   rc   r^   ro   __classcell__)r   s   @r   r   r       s    
/+
$!"02!  '! +&
r   r   )rs   r0   rebson.py3compatr   r   typecompilerj   r   r   r9   r   r   <module>ry      s9     	 )
 zrzz"~
h$ hr   