U
    @f'                     @  s   d dl mZ d dlZd dlmZmZ d dlmZ d dlmZ d dl	m
Z
mZ d dlmZmZ d dlmZ d d	lmZ d d
lmZ edZG dd deZG dd deZdS )    )annotationsN)datetimetimezone)	ENOTEMPTY)BytesIO)PurePathPureWindowsPath)AnyClassVar)AbstractFileSystem)LocalFileSystem)stringify_pathzfsspec.memoryfsc                   @  s   e Zd ZU dZi Zded< dgZdZdZe	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dZdd Zd+ddZdd  Zd!d" Zd#d$ Zd,d%d&ZdS )-MemoryFileSystemzA filesystem based on a dict of BytesIO objects

    This is a global filesystem so instances of this class all point to the same
    in memory filesystem.
    zClassVar[dict[str, Any]]store Zmemory/c                 C  sz   t |tr&t |trt|S t|}|dr@|tdd  }d|ksPd|krZ|dS |	dd}|rvd| S dS )Nz	memory://z::z://r   r   )

isinstancer   r   r   _strip_protocolr   
startswithlenrstriplstrip)clspath r   A/tmp/pip-unpacked-wheel-yjyh6wby/fsspec/implementations/memory.pyr      s    




z MemoryFileSystem._strip_protocolTc           	      K  s  |  |}|| jkrB|s|gS || j| jd| j| j dgS t }|d }g }t| jD ]}||r^d|t|d  kr|	|| j| jd| j| j d q^t|t|kr^||t|d  
ddd  }||kr^|pg }|	|ddd || q^| jD ]}||rd|t|d  kr\||kr|	|ddd || nF||t|d  
ddd  }||kr|	|ddd || q|s|| jkrg S t||r|S tdd	 |D S )
Nfilenamesizetypecreatedr      r   	directoryr   r   r    c                 S  s   g | ]}|d  qS )r   r   ).0fr   r   r   
<listcomp>j   s     z'MemoryFileSystem.ls.<locals>.<listcomp>)r   r   r   r!   	timestampsettupler   r   appendsplitaddpseudo_dirsFileNotFoundErrorsorted)	selfr   ZdetailkwargspathsZstarteroutp2Zppathr   r   r   ls,   sf    




 

 
zMemoryFileSystem.lsc                 K  s   |  |}|| jks|| jkr&t|| |drT| | |rTt| ||r| |drz| j| ||f| W n tk
r   Y nX |r|| jkr| j	| d S )Nr   )
r   r   r.   FileExistsError_parentstripisfileNotADirectoryErrormkdirr+   )r1   r   create_parentsr2   r   r   r   r<   l   s    
 zMemoryFileSystem.mkdirFc                 C  s2   z| j |dd W n tk
r,   |s( Y nX d S )NT)r=   )r<   r7   )r1   r   exist_okr   r   r   makedirsz   s
    zMemoryFileSystem.makedirsc                 K  s   | j |d|d dS )zSSet the bytes of given file

        Avoids copies of the data if possible
        wb)dataN)open)r1   r   valuer2   r   r   r   	pipe_file   s    zMemoryFileSystem.pipe_filec                 C  sR   |  |}|dkrd S || jkrF| |s8| j| qNttd|nt|d S )Nr   zDirectory not empty)r   r.   r6   removeOSErrorr   r/   r1   r   r   r   r   rmdir   s    


zMemoryFileSystem.rmdirc                   s   t d  |    | jksBt fddt| j| j D rN dddS  | jkrz| j  } |jdt|dd d	S t	 d S )
Nzinfo: %sc                 3  s   | ]}|  d  V  qdS )r   N)r   r%   pr   r   r   	<genexpr>   s    z(MemoryFileSystem.info.<locals>.<genexpr>r   r#   r$   r   r!   r   )
loggerdebugr   r.   anylistr   r   getattrr/   )r1   r   r2   Zfileliker   rK   r   info   s"    



zMemoryFileSystem.inforbNc                 K  s   |  |}|| jkrt||}t|dkrJ| |}| |r t|q |dkr|| jkr| j| }|dkr||dd n
|d |S t	|nH|dkrt
| ||d}	| js|	  |	S | jj}
td|
 d	|d S )
Nr"   )rS   abzr+brT   r      r@   rA   zunsupported file mode for z: )r   r.   IsADirectoryErrorr   r8   r:   r7   r   seekr/   
MemoryFilegetZ_intranscommit	__class____name__
ValueError)r1   r   mode
block_sizeZ
autocommitZcache_optionsr2   parentr&   mr   r   r   r   _open   s.    	








zMemoryFileSystem._openc                 K  sj   |  |}|  |}| |r<t| || j|  | j|< n*| |r^|| jkrf| j| nt|d S N)	r   r:   rX   r   getvalueisdirr.   r+   r/   )r1   path1path2r2   r   r   r   cp_file   s    


  

zMemoryFileSystem.cp_filec                 K  sT   t d| | |}zt| j|  || W S  tk
rN   t|Y nX d S )Nzcat: %s)rM   rN   r   bytesr   	getbufferKeyErrorr/   )r1   r   startendr2   r   r   r   cat_file   s    
zMemoryFileSystem.cat_filec              
   C  sH   |  |}z| j|= W n, tk
rB } zt||W 5 d }~X Y nX d S rc   )r   r   rk   r/   )r1   r   er   r   r   _rm   s
    
zMemoryFileSystem._rmc                 C  s:   |  |}z| j| jW S  tk
r4   t|Y nX d S rc   )r   r   modifiedrk   r/   rG   r   r   r   rq      s
    
zMemoryFileSystem.modifiedc                 C  s:   |  |}z| j| jW S  tk
r4   t|Y nX d S rc   )r   r   r!   rk   r/   rG   r   r   r   r!      s
    
zMemoryFileSystem.createdc                   sv   t |tr |}n fdd|D } j|||d}t|D ]0} |sPq@ |rf | q@ | q@d S )Nc                   s   g | ]}  |qS r   )r   rI   r1   r   r   r'      s     z'MemoryFileSystem.rm.<locals>.<listcomp>)	recursivemaxdepth)	r   strr   Zexpand_pathreversedexistsr:   Zrm_filerH   )r1   r   rs   rt   r3   rJ   r   rr   r   rm   s    


zMemoryFileSystem.rm)T)T)F)rS   NTN)NN)FN)r\   
__module____qualname____doc__r   __annotations__r.   protocolZroot_markerclassmethodr   r6   r<   r?   rD   rH   rR   rb   rh   rn   rp   rq   r!   rx   r   r   r   r   r      s0   


@

    
&
r   c                      sN   e Zd ZdZd fdd	Zedd Zdd Zd	d
 Zdd Z	dd Z
  ZS )rX   zA BytesIO which can't close and works as a context manager

    Can initialise with data. Each path should only be active once at any moment.

    No need to provide fs, path if auto-committing (default)
    Nc                   sV   t d| || _|| _tjtjd| _tjtjd| _	|rRt
 | | d d S )Nzopen file %stzr   )rM   rN   fsr   r   nowr   utcr!   rq   super__init__rW   )r1   r   r   rA   r[   r   r   r     s    zMemoryFile.__init__c                 C  s
   |   jS rc   )rj   nbytesrr   r   r   r   r      s    zMemoryFile.sizec                 C  s   | S rc   r   rr   r   r   r   	__enter__$  s    zMemoryFile.__enter__c                 C  s   d S rc   r   rr   r   r   r   close'  s    zMemoryFile.closec                 C  s   d S rc   r   rr   r   r   r   discard*  s    zMemoryFile.discardc                 C  s"   | | j j| j< tjtjd| _d S )Nr   )r   r   r   r   r   r   r   rq   rr   r   r   r   rZ   -  s    zMemoryFile.commit)NNN)r\   ry   rz   r{   r   propertyr   r   r   r   rZ   __classcell__r   r   r   r   rX     s   

rX   )
__future__r   loggingr   r   errnor   ior   pathlibr   r   typingr	   r
   Zfsspecr   Zfsspec.implementations.localr   Zfsspec.utilsr   	getLoggerrM   r   rX   r   r   r   r   <module>   s   
 ~