3
[_ð]v  ã               @   s6   d Z ddlZddlZddlmZ G dd„ dejƒZdS )zDNS name dictionaryé    Né   )Úxrangec                   sj   e Zd ZdZdddg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‡  ZS )ÚNameDictz·A dictionary whose keys are dns.name.Name objects.

    In addition to being like a regular Python dictionary, this
    dictionary can also get the deepest match for a given key.
    Ú	max_depthÚmax_depth_itemsZ__storec                s6   t t| ƒjƒ  tƒ | _d| _d| _| jt||Žƒ d S )Nr   )Úsuperr   Ú__init__ÚdictÚ_NameDict__storer   r   Úupdate)ÚselfÚargsÚkwargs)Ú	__class__© ú1/tmp/pip-build-yz_zf6az/dnspython/dns/namedict.pyr   ,   s
    zNameDict.__init__c             C   s>   t |ƒ| jkr| jd | _nt |ƒ| jkr:t |ƒ| _d| _d S )Nr   )Úlenr   r   )r   Úkeyr   r   r   Z__update_max_depth5   s
    
zNameDict.__update_max_depthc             C   s
   | j | S )N)r
   )r   r   r   r   r   Ú__getitem__<   s    zNameDict.__getitem__c             C   s.   t |tjjƒstdƒ‚|| j|< | j|ƒ d S )NzNameDict key must be a name)Ú
isinstanceÚdnsÚnameÚNameÚ
ValueErrorr
   Ú_NameDict__update_max_depth)r   r   Úvaluer   r   r   Ú__setitem__?   s    
zNameDict.__setitem__c             C   sT   | j j|ƒ}t|ƒ| jkr&| jd | _| jdkrPd| _x| j D ]}| j|ƒ q>W d S )Nr   r   )r
   Úpopr   r   r   r   )r   r   r   Úkr   r   r   Ú__delitem__E   s    
zNameDict.__delitem__c             C   s
   t | jƒS )N)Úiterr
   )r   r   r   r   Ú__iter__N   s    zNameDict.__iter__c             C   s
   t | jƒS )N)r   r
   )r   r   r   r   Ú__len__Q   s    zNameDict.__len__c             C   s
   || j kS )N)r
   )r   r   r   r   r   Úhas_keyT   s    zNameDict.has_keyc             C   sn   t |ƒ}|| jkr| j}x<t| dƒD ],}tjj||d… ƒ}|| kr&|| | fS q&W | tjj }tjj|fS )a¬  Find the deepest match to *fname* in the dictionary.

        The deepest match is the longest name in the dictionary which is
        a superdomain of *name*.  Note that *superdomain* includes matching
        *name* itself.

        *name*, a ``dns.name.Name``, the name to find.

        Returns a ``(key, value)`` where *key* is the deepest
        ``dns.name.Name``, and *value* is the value associated with *key*.
        r   N)r   r   r   r   r   r   Úempty)r   r   ÚdepthÚiÚnÚvr   r   r   Úget_deepest_matchW   s    
zNameDict.get_deepest_match)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r   r   r   r   r   r!   r"   r#   r)   Ú__classcell__r   r   )r   r   r   #   s   
		r   )r-   ÚcollectionsZdns.namer   Ú_compatr   ÚMutableMappingr   r   r   r   r   Ú<module>   s   