B
    ËP•\–  ã               @   s¬   d dl mZ d dlZd dlZd dlZd dlZd dlZddlmZ d dl	Z	ddl
mZ G dd„ deƒZdd	„ Zd
ej ej ejj Zdd„ Zdd„ Zeƒ Zejdd„ ƒZdS )é    )Úabsolute_importNé   )Ú	Interface)Úignoringc               @   sn   e Zd Zddd„Zdd„ Zdd„ Zdd
d„Zddd„Zddd„Zddd„Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )ÚFileNc          	   C   sz   |s$t jd|d}t |¡ d| _nd| _|| _tj |¡sZtt	ƒ t 
|¡ W d Q R X t |  d¡¡| _t | ¡ d S )Nz.partd)ÚsuffixÚdirFTz.lock)ÚtempfileZmkdtempÚcleanup_filesÚappendÚ_explicitly_given_pathÚpathÚosÚexistsr   ÚOSErrorÚmakedirsÚlocketZ	lock_fileÚfilenameÚlockr   Ú__init__)Úselfr   r   © r   ú)lib/python3.7/site-packages/partd/file.pyr      s    

zFile.__init__c             C   s
   d| j iS )Nr   )r   )r   r   r   r   Ú__getstate__   s    zFile.__getstate__c             C   s    t  | |¡ t | |d ¡ d S )Nr   )r   Ú__setstate__r   r   )r   Ústater   r   r   r       s    zFile.__setstate__TFc       	   
   K   sœ   |r| j  ¡  zxxr| ¡ D ]f\}}|  |¡}tj tj |¡¡sRt tj |¡¡ t	|dƒ}| 
|¡ |rvt |¡ W d Q R X qW W d |r–| j  ¡  X d S )NZab)r   ÚacquireÚitemsr   r   r   r   Údirnamer   ÚopenÚwriteÚfsyncÚrelease)	r   Údatar   r!   ÚkwargsÚkÚvÚfnÚfr   r   r   r   $   s     


 zFile.appendc          
   K   sœ   t |tttfƒst‚|r"| j ¡  zdg }xZ|D ]R}y.t|  |¡dƒ}| 	| 
¡ ¡ W d Q R X W q. tk
r~   | 	d¡ Y q.X q.W W d |r–| j ¡  X |S )NÚrbó    )Ú
isinstanceÚlistÚtupleÚsetÚAssertionErrorr   r   r   r   r   ÚreadÚIOErrorr"   )r   Úkeysr   r$   ÚresultÚkeyr(   r   r   r   Ú_get2   s    

z	File._getc          	   C   s~   |   |¡}tj tj |¡¡s0t tj |¡¡ |r>| j ¡  z*t|   |¡dƒ}| 	|¡ W dQ R X W d|rx| j 
¡  X dS )z Idempotent set ÚwbN)r   r   r   r   r   r   r   r   r   r    r"   )r   r4   Úvaluer   r'   r(   r   r   r   Ú_isetC   s    

z
File._isetc             C   sX   |r| j  ¡  z4x.|D ]&}t| j|ƒ}tj |¡rt |¡ qW W d |rR| j  ¡  X d S )N)r   r   r   r   r   r   Úremover"   )r   r2   r   r4   r   r   r   r   Ú_deleteQ   s    

zFile._deletec             C   s4   t j | j¡rt | j¡ | j ¡  t  | j¡ d S )N)r   r   r   ÚshutilÚrmtreeZ
_iset_seenÚclearÚmkdir)r   r   r   r   Údrop]   s    
z	File.dropc             C   s   t | j|ƒS )N)r   r   )r   r4   r   r   r   r   c   s    zFile.filenamec             G   s   |   ¡  t | j¡ d S )N)r?   r   Úrmdirr   )r   Úargsr   r   r   Ú__exit__f   s    zFile.__exit__c             C   s   | j s|  ¡  t | j¡ d S )N)r   r?   r   r@   r   )r   r   r   r   Ú__del__j   s    zFile.__del__)NN)TF)T)T)T)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r5   r8   r:   r?   r   rB   rC   r   r   r   r   r      s   




r   c             C   s   t j | tt|ƒƒ¡S )N)r   r   ÚjoinÚescape_filenameÚtoken)r   r4   r   r   r   r   p   s    r   z-_.() c             C   s   d  ttj| ƒ¡S )zc Escape text so that it is a valid filename

    >>> escape_filename('Foo!bar?')
    'Foobar'

    Ú )rG   ÚfilterÚvalid_charsÚ__contains__)r'   r   r   r   rH   x   s    rH   c             C   s6   t | tƒr| S t | tƒr*tjjtt| ƒŽ S t| ƒS dS )zo

    >>> token('hello')
    'hello'
    >>> token(('hello', 'world'))  # doctest: +SKIP
    'hello/world'
    N)r+   Ústrr-   r   r   rG   ÚmaprI   )r4   r   r   r   rI   ƒ   s
    

rI   c              C   s(   x"t D ]} tj | ¡rt | ¡ qW d S )N)r
   r   r   r   r;   r<   )r'   r   r   r   Úcleanup•   s    
rP   )Z
__future__r   Úatexitr   r;   Ústringr	   Zcorer   r   Zutilsr   r   r   Zascii_lettersZdigitsr   ÚseprL   rH   rI   r,   r
   ÚregisterrP   r   r   r   r   Ú<module>   s   b