o
    ?8¾\œ  ã                   @   sF   d Z ddlZddlZddlmZmZ ee d¡ƒZG dd„ de	ƒZ
dS )zïTools 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                       sì   e Zd ZdZd5dd„Z‡ f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d„ Zdd„ Zdd„ Zdd„ Z‡ fdd „Zd5d!d"„Zd#d$„ Zd%d&„ Zd5d'd(„Zd5d)d*„Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Z‡  ZS )6ÚSONzÏSON 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+.
    Nc                 K   s(   g | _ t | ¡ |  |¡ |  |¡ d S ©N)Ú
_SON__keysÚdictÚ__init__Úupdate)ÚselfÚdataÚkwargs© r   ú:/var/www/html/env/lib/python3.10/site-packages/bson/son.pyr	   (   s   

zSON.__init__c                    s(   t t| ƒj| g|¢R i |¤Ž}g |_|S r   )Úsuperr   Ú__new__r   )ÚclsÚargsr   Úinstance©Ú	__class__r   r   r   .   s   zSON.__new__c                 C   s4   g }| j D ]}| d|| | f ¡ qdd |¡ S )Nz(%r, %r)z	SON([%s])z, )r   ÚappendÚjoin)r   ÚresultÚkeyr   r   r   Ú__repr__3   s   
zSON.__repr__c                 C   s(   || j vr| j  |¡ t | ||¡ d S r   )r   r   r   Ú__setitem__)r   r   Úvaluer   r   r   r   9   s   
zSON.__setitem__c                 C   s   | j  |¡ t | |¡ d S r   )r   Úremover   Ú__delitem__©r   r   r   r   r   r   >   s   zSON.__delitem__c                 C   ó
   t | jƒS r   )Úlistr   ©r   r   r   r   ÚkeysB   ó   
zSON.keysc                 C   s   t ƒ }| | ¡ |S r   )r   r
   ©r   Úotherr   r   r   ÚcopyE   s   
zSON.copyc                 c   s   � | j D ]}|V  qd S r   ©r   ©r   Úkr   r   r   Ú__iter__M   s   €
ÿzSON.__iter__c                 C   s
   || j v S r   r)   r    r   r   r   Úhas_keyQ   r%   zSON.has_keyc                 c   s   � | D ]	}|| | fV  qd S r   r   r*   r   r   r   r   U   s   €ÿzSON.iteritemsc                 C   s   |   ¡ S r   )r,   r#   r   r   r   ÚiterkeysY   s   zSON.iterkeysc                 c   s   � |   ¡ D ]\}}|V  qd S r   ©r   )r   Ú_Úvr   r   r   Ú
itervalues]   s   €ÿzSON.itervaluesc                 C   s   dd„ |   ¡ D ƒS )Nc                 S   s   g | ]\}}|‘qS r   r   )Ú.0r0   r1   r   r   r   Ú
<listcomp>b   ó    zSON.values.<locals>.<listcomp>r/   r#   r   r   r   Úvaluesa   ó   z
SON.valuesc                    s   ‡ fdd„ˆ D ƒS )Nc                    s   g | ]}|ˆ | f‘qS r   r   )r3   r   r#   r   r   r4   e   s    zSON.items.<locals>.<listcomp>r   r#   r   r#   r   Úitemsd   r7   z	SON.itemsc                    s   g | _ tt| ƒ ¡  d S r   )r   r   r   Úclearr#   r   r   r   r9   g   s   z	SON.clearc                 C   s(   z| | W S  t y   || |< Y |S w r   ©ÚKeyError©r   r   Údefaultr   r   r   Ú
setdefaultk   s   

þzSON.setdefaultc                 G   s\   t |ƒdkrtdtdt |ƒ ƒ ƒ‚z| | }W n ty(   |r'|d  Y S ‚ w | |= |S )Né   z&pop expected at most 2 arguments, got r   )ÚlenÚ	TypeErrorÚreprr;   )r   r   r   r   r   r   r   Úpopr   s   ÿýzSON.popc                 C   s:   z
t |  ¡ ƒ\}}W n ty   tdƒ‚w | |= ||fS )Nzcontainer is empty)Únextr   ÚStopIterationr;   )r   r+   r1   r   r   r   Úpopitem   s   ÿzSON.popitemc                 K   s‚   |d u rn1t |dƒr| ¡ D ]\}}|| |< qnt |dƒr+| ¡ D ]}|| | |< q!n|D ]\}}|| |< q-|r?|  |¡ d S d S )Nr   r$   )Úhasattrr   r$   r
   )r   r'   r   r+   r1   r   r   r   r
   ‡   s   

ÿ
ÿ
ÿz
SON.updatec                 C   s"   z| | W S  t y   | Y S w r   r:   r<   r   r   r   Úget—   s
   
ÿzSON.getc                 C   s6   t |tƒrt| ƒt|ƒko|  ¡ | ¡ kS |  ¡ |kS )z|Comparison to another SON is order-sensitive while comparison to a
        regular dictionary is order-insensitive.
        )Ú
isinstancer   r@   r8   Úto_dictr&   r   r   r   Ú__eq__�   s   
 z
SON.__eq__c                 C   s
   | |k S r   r   r&   r   r   r   Ú__ne__¥   r%   z
SON.__ne__c                 C   r!   r   )r@   r   r#   r   r   r   Ú__len__¨   r%   zSON.__len__c                    s   ‡ fdd„‰ ˆ t | ƒƒS )z¡Convert a SON document to a normal Python dictionary instance.

        This is trickier than just *dict(...)* because it needs to be
        recursive.
        c                    sF   t | tƒr‡ fdd„| D ƒS t | tjƒr!t‡ fdd„t| ƒD ƒƒS | S )Nc                    s   g | ]}ˆ |ƒ‘qS r   r   )r3   r1   ©Útransform_valuer   r   r4   ´   r5   z8SON.to_dict.<locals>.transform_value.<locals>.<listcomp>c                    s   g | ]
\}}|ˆ |ƒf‘qS r   r   )r3   r+   r1   rN   r   r   r4   ¶   s    
ÿÿ)rI   r"   r   ÚMappingr   r   )r   rN   r   r   rO   ²   s   
þz$SON.to_dict.<locals>.transform_value)r   r#   r   rN   r   rJ   «   s   
zSON.to_dictc                 C   s\   t ƒ }t| ƒ}||v r| |¡S |||< |  ¡ D ]\}}t|tƒs't ||¡}|||< q|S r   )r   ÚidrH   r   rI   ÚRE_TYPEr(   Údeepcopy)r   ÚmemoÚoutÚval_idr+   r1   r   r   r   Ú__deepcopy__¾   s   


zSON.__deepcopy__r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r   r   r   r   r$   r(   r,   r-   r   r.   r2   r6   r8   r9   r>   rC   rF   r
   rH   rK   rL   rM   rJ   rW   Ú__classcell__r   r   r   r   r       s6    



r   )r[   r(   ÚreÚbson.py3compatr   r   ÚtypeÚcompilerR   r   r   r   r   r   r   Ú<module>   s   