B
    X[\E
                 @   s   d dl mZmZmZ d dlZd dlZyd dlmZmZ W n$ e	k
r\   d dl
mZmZ Y nX ddlmZ dd Zdd	 ZG d
d deZdS )    )absolute_importdivisionprint_functionN)quoteunquote   )ZictBasec             C   s   t | ddS )z;
    Escape key so as to be usable on all filesystems.
     )Zsafe)r   )key r   (lib/python3.7/site-packages/zict/file.py	_safe_key   s    r   c             C   s   t | S )z0
    Undo the escaping done by _safe_key().
    )r   )r
   r   r   r   _unsafe_key   s    r   c               @   sZ   e Zd ZdZdddZdd ZeZdd Zd	d
 Zdd Z	dd Z
e
Zdd Zdd ZdS )Filea   Mutable Mapping interface to a directory

    Keys must be strings, values must be bytes

    Note this shouldn't be used for interprocess persistence, as keys
    are cached in memory.

    Parameters
    ----------
    directory: string
    mode: string, ('r', 'w', 'a'), defaults to 'a'

    Examples
    --------
    >>> z = File('myfile')  # doctest: +SKIP
    >>> z['x'] = b'123'  # doctest: +SKIP
    >>> z['x']  # doctest: +SKIP
    b'123'

    Also supports writing lists of bytes objects

    >>> z['y'] = [b'123', b'4567']  # doctest: +SKIP
    >>> z['y']  # doctest: +SKIP
    b'1234567'

    Or anything that can be used with file.write, like a memoryview

    >>> z['data'] = np.ones(5).data  # doctest: +SKIP
    ac             C   sZ   || _ || _t | _tj| j s0t| j  n&x$t| j D ]}| j	t
| q>W d S )N)	directorymodeset_keysospathexistsmkdirlistdiraddr   )selfr   r   nr   r   r   __init__:   s    zFile.__init__c             C   s   d| j | jt| f S )Nz"<File: %s, mode="%s", %d elements>)r   r   len)r   r   r   r   __str__D   s    zFile.__str__c          	   C   s@   || j krt|ttj| jt|d
}| S Q R X d S )Nrb)	r   KeyErroropenr   r   joinr   r   read)r   r
   fr   r   r   __getitem__I   s    
zFile.__getitem__c          	   C   sh   t tj| jt|d8}t|ttfrDx"|D ]}|	| q0W n
|	| W d Q R X | j
| d S )Nwb)r"   r   r   r#   r   r   
isinstancetuplelistwriter   r   )r   r
   valuer%   vr   r   r   __setitem__O   s    
zFile.__setitem__c             C   s
   || j kS )N)r   )r   r
   r   r   r   __contains__X   s    zFile.__contains__c             C   s
   t | jS )N)iterr   )r   r   r   r   keys[   s    z	File.keysc             C   s<   || j krt|ttj| jt| | j | d S )N)r   r!   r   remover   r#   r   r   )r   r
   r   r   r   __delitem__`   s    
zFile.__delitem__c             C   s
   t | jS )N)r   r   )r   r   r   r   __len__f   s    zFile.__len__N)r   )__name__
__module____qualname____doc__r   r   __repr__r&   r.   r/   r1   __iter__r3   r4   r   r   r   r   r      s   

	r   )Z
__future__r   r   r   errnor   Zurllib.parser   r   ImportErrorZurllibcommonr   r   r   r   r   r   r   r   <module>   s   