3
Oษ6b  ใ               @   sF   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 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d6d!d"Zd#d$ Zd%d& Zd7d'd(Zd8d)d*Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Z  ZS )9ฺ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j|  | j| | j| d S )N)ฺ
_SON__keysฺdictฺ__init__ฺupdate)ฺselfฺdataฺkwargsฉ r   ๚G/var/www/html/sandeepIITI/myenv/lib/python3.6/site-packages/bson/son.pyr   (   s    

zSON.__init__c                s"   t t| j| f||}g |_|S )N)ฺsuperr   ฺ__new__r   )ฺclsฺargsr   ฺinstance)ฺ	__class__r   r   r   .   s    zSON.__new__c             C   s8   g }x$| j D ]}|jd|| | f  qW ddj| 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 kr| j j| tj| || d S )N)r   r   r   ฺ__setitem__)r
   r   ฺvaluer   r   r   r   9   s    
zSON.__setitem__c             C   s   | j j| tj| | d S )N)r   ฺremover   ฺ__delitem__)r
   r   r   r   r   r   >   s    zSON.__delitem__c             C   s
   t | jS )N)ฺlistr   )r
   r   r   r   ฺkeysB   s    zSON.keysc             C   s   t  }|j|  |S )N)r   r	   )r
   ฺotherr   r   r   ฺcopyE   s    
zSON.copyc             c   s   x| j D ]
}|V  qW d S )N)r   )r
   ฺkr   r   r   ฺ__iter__M   s    zSON.__iter__c             C   s
   || j kS )N)r   )r
   r   r   r   r   ฺhas_keyQ   s    zSON.has_keyc             c   s    x| D ]}|| | fV  qW d S )Nr   )r
   r"   r   r   r   r   U   s    
zSON.iteritemsc             C   s   | j  S )N)r#   )r
   r   r   r   ฺiterkeysY   s    zSON.iterkeysc             c   s    x| j  D ]\}}|V  q
W d S )N)r   )r
   ฺ_ฺvr   r   r   ฺ
itervalues]   s    zSON.itervaluesc             C   s   dd | j  D S )Nc             S   s   g | ]\}}|qS r   r   )ฺ.0r&   r'   r   r   r   ๚
<listcomp>b   s    zSON.values.<locals>.<listcomp>)r   )r
   r   r   r   ฺvaluesa   s    z
SON.valuesc                s    fdd D S )Nc                s   g | ]}| | fqS r   r   )r)   r   )r
   r   r   r*   e   s    zSON.items.<locals>.<listcomp>r   )r
   r   )r
   r   ฺitemsd   s    z	SON.itemsc                s   g | _ tt| j  d S )N)r   r   r   ฺclear)r
   )r   r   r   r-   g   s    z	SON.clearc             C   s*   y| | S  t k
r$   || |< Y nX |S )N)ฺKeyError)r
   r   ฺdefaultr   r   r   ฺ
setdefaultk   s
    zSON.setdefaultc             G   s^   t |dkr$tdtdt |  y| | }W n" tk
rR   |rL|d S  Y nX | |= |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@   yt | j \}}W n tk
r0   tdY nX | |= ||fS )Nzcontainer is empty)ฺnextr   ฺStopIterationr.   )r
   r"   r'   r   r   r   ฺpopitem   s    zSON.popitemc             K   s   |d kr
nnt |dr4xb|j D ]\}}|| |< qW nDt |dr^x8|j D ]}|| | |< qHW nx|D ]\}}|| |< qdW |r| j| d S )Nr   r   )ฺhasattrr   r   r	   )r
   r    r   r"   r'   r   r   r   r	      s    

z
SON.updatec             C   s"   y| | S  t k
r   |S X d S )N)r.   )r
   r   r/   r   r   r   ฺget   s    zSON.getc             C   s6   t |tr*t| t|ko(| 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   r2   r,   ฺto_dict)r
   r    r   r   r   ฺ__eq__   s    
 z
SON.__eq__c             C   s
   | |k S )Nr   )r
   r    r   r   r   ฺ__ne__ฅ   s    z
SON.__ne__c             C   s
   t | jS )N)r2   r   )r
   r   r   r   ฺ__len__จ   s    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                sJ   t | tr fdd| D S t | tjrBt fddt| D S | S d S )Nc                s   g | ]} |qS r   r   )r)   r'   )ฺtransform_valuer   r   r*   ด   s    z8SON.to_dict.<locals>.transform_value.<locals>.<listcomp>c                s   g | ]\}}| |fqS r   r   )r)   r"   r'   )r@   r   r   r*   ท   s   )r;   r   r   ฺMappingr   r   )r   )r@   r   r   r@   ฒ   s    

z$SON.to_dict.<locals>.transform_value)r   )r
   r   )r@   r   r<   ซ   s    
zSON.to_dictc             C   s`   t  }t| }||kr |j|S |||< x2| j D ]&\}}t|tsPtj||}|||< q2W |S )N)r   ฺidr:   r   r;   ฺRE_TYPEr!   ฺdeepcopy)r
   ฺmemoฺoutZval_idr"   r'   r   r   r   ฺ__deepcopy__พ   s    

zSON.__deepcopy__)N)N)N)N)ฺ__name__ฺ
__module__ฺ__qualname__ฺ__doc__r   r   r   r   r   r   r!   r#   r$   r   r%   r(   r+   r,   r-   r0   r5   r8   r	   r:   r=   r>   r?   r<   rG   ฺ__classcell__r   r   )r   r   r       s4   



r   )rK   r!   ฺreZbson.py3compatr   r   ฺtypeฺcompilerC   r   r   r   r   r   r   ฺ<module>   s
   