o
    'hU                     @  s   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dZded< ed	Zed
ZedZG d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                      s  e Zd ZU dZded< 	dOdPddZdQ fddZdRddZdSddZdTddZ	dUddZ
dVd!d"ZdWd$d%ZdVd&d'ZdXd)d*ZdYd,d-ZdZ fd.d/Zd[d1d2Zd\d4d5Zd]d7d8ZdOd^d;d<Z	dOd_d?d@Zd`dAdBZd`dCdDZdadFdGZdbdIdJZdcdMdNZ  ZS )d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                 K  s(   g | _ t|  | | | | d S N)r   dict__init__update)selfr   r    r    D/var/www/html/olx_land/venv/lib/python3.10/site-packages/bson/son.pyr   <   s   

zSON.__init__clsType[SON[_Key, _Value]]argsSON[_Key, _Value]c                   s$   t  j| g|R i |}g |_|S r   )super__new__r   )r"   r$   r   instance	__class__r    r!   r'   F   s   zSON.__new__strc                 C  s:   g }| j D ]}|d|d| | d qdd| S )N(z, )z	SON([%s]))r   appendjoin)r   resultkeyr    r    r!   __repr__K   s   
zSON.__repr__r1   r   valuer   c                 C  s(   || j vr| j | t| || d S r   )r   r.   r   __setitem__)r   r1   r3   r    r    r!   r4   Q   s   
zSON.__setitem__c                 C  s   | j | t| | d S r   )r   remover   __delitem__r   r1   r    r    r!   r6   V   s   zSON.__delitem__c                 C  s   t  }||  |S r   )r   r   r   otherr    r    r!   copyZ   s   
zSON.copyIterator[_Key]c                 c  s    | j E d H  d S r   r   r   r    r    r!   __iter__b   s   zSON.__iter__boolc                 C  s
   || j v S r   r<   r7   r    r    r!   has_keye      
zSON.has_keyc                 C  s   |   S r   )r>   r=   r    r    r!   iterkeysh   s   zSON.iterkeysIterator[_Value]c                 c  s    |   D ]\}}|V  qd S r   items)r   _vr    r    r!   
itervaluesl   s   zSON.itervalueslist[_Value]c                 C  s   dd |   D S )Nc                 S  s   g | ]\}}|qS r    r    ).0rF   rG   r    r    r!   
<listcomp>q       zSON.values.<locals>.<listcomp>rD   r=   r    r    r!   valuesp   s   z
SON.valuesc                   s   g | _ t   d S r   )r   r&   clearr=   r)   r    r!   rN   s   s   z	SON.cleardefaultc                 C  s(   z| | W S  t y   || |< Y |S w r   KeyErrorr   r1   rO   r    r    r!   
setdefaultw   s   

zSON.setdefaultUnion[_Value, _T]c                 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reprrQ   )r   r1   r$   r3   r    r    r!   pop~   s   zSON.popTuple[_Key, _Value]c                 C  s@   zt t|  \}}W n ty   tdd w | |= ||fS )Nzcontainer is empty)nextiterrE   StopIterationrQ   )r   krG   r    r    r!   popitem   s   
zSON.popitemr9   Optional[Any]c                 K  s~   |d u rn/t |dr| D ]\}}|| |< qnt |dr)|D ]}|| | |< qn|D ]\}}|| |< q+|r=| | d S d S )NrE   keys)hasattrrE   r   )r   r9   r   r^   rG   r    r    r!   r      s   



z
SON.updateOptional[Union[_Value, _T]]Union[_Value, _T, None]c                 C  s"   z| | W S  t y   | Y S w r   rP   rR   r    r    r!   get   s
   
zSON.getc                 C  sD   t |trt| t|kot|  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   rV   listrE   r   r?   to_dictr8   r    r    r!   __eq__   s   
(z
SON.__eq__c                 C  s
   | |k S r   r    r8   r    r    r!   __ne__   rA   z
SON.__ne__intc                 C  s
   t | jS r   )rV   r   r=   r    r    r!   __len__   rA   zSON.__len__dict[_Key, _Value]c                   s    d fd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.
        r3   r   r   c                   s@   t | tr fdd| D S t | tr fdd|  D S | S )Nc                   s   g | ]} |qS r    r    )rJ   rG   transform_valuer    r!   rK      rL   z8SON.to_dict.<locals>.transform_value.<locals>.<listcomp>c                   s   i | ]	\}}| |qS r    r    )rJ   r^   rG   rn   r    r!   
<dictcomp>   s    z8SON.to_dict.<locals>.transform_value.<locals>.<dictcomp>)rf   rg   _MappingrE   )r3   rn   r    r!   ro      s
   

z$SON.to_dict.<locals>.transform_valuerm   N)r3   r   r   r   )r   r   r=   r    rn   r!   rh      s   zSON.to_dictmemodict[int, SON[_Key, _Value]]c                 C  sZ   t  }t| }||v r|| S |||< |  D ]\}}t|ts&t||}|||< q|S r   )r   idrE   rf   r   r:   deepcopy)r   rr   outval_idr^   rG   r    r    r!   __deepcopy__   s   

zSON.__deepcopy__r   )r   r   r   r   r   r   )r"   r#   r$   r   r   r   r   r%   )r   r+   )r1   r   r3   r   r   r   )r1   r   r   r   )r   r%   )r   r;   )r1   r   r   r?   )r   rC   )r   rI   )r   r   )r1   r   rO   r   r   r   )r1   r   r$   rT   r   rT   )r   rZ   )r9   r`   r   r   r   r   )r1   r   rO   rc   r   rd   )r9   r   r   r?   )r   rk   )r   rm   )rr   rs   r   r%   )__name__
__module____qualname____doc____annotations__r   r'   r2   r4   r6   r:   r>   r@   rB   rH   rM   rN   rS   rY   r_   r   re   ri   rj   rl   rh   rx   __classcell__r    r    r)   r!   r   2   s6   
 
















r   )r|   
__future__r   r:   recollections.abcr   rq   typingr   r   r   r   r   r	   r
   r   r   r   r   typecompiler   r}   r   r   r   r   r    r    r    r!   <module>   s   8