a
    %Df7                     @   s   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Zd dl	Z	d dl
mZ d dlmZ d dlmZ d dlmZmZ edZeeddd	ZG d
d deZdddZdd ZG dd dejZdS )    N)AbstractFileSystem)compr)get_compression)
isfilelikestringify_pathzfsspec.localtextprefixc                 C   s   |  |r| t|d  S | S N)
startswithlenr    r   i/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/fsspec/implementations/local.py_remove_prefix   s    
r   c                       s*  e Zd ZdZdZdZdZdA fdd	Zedd	 Z	dBd
dZ
dCddZdd ZdDddZdd Zdd Zdd Zdd Zdd ZdEddZdFdd Zd!d" Zd#d$ Zd%d& Zed'd(d)Zd*d+ ZdGd,d-Zd.d/ ZdHd1d2ZdId3d4Zd5d6 Zd7d8 Z e!d9d: Z"e!dJd;d<Z#d=d> Z$d?d@ Z%  Z&S )KLocalFileSystema   Interface to files on local storage

    Parameters
    ----------
    auto_mkdir: bool
        Whether, when opening a file, the directory containing it should
        be created (if it doesn't already exist). This is assumed by pyarrow
        code.
    /)filelocalTFc                    s   t  jf i | || _d S r
   )super__init__
auto_mkdir)selfr   kwargs	__class__r   r   r   '   s    zLocalFileSystem.__init__c                 C   s   dS )Nr   r   r   r   r   r   fsid+   s    zLocalFileSystem.fsidc                 K   sF   |  |}| |rt||r0| j|dd ntj|fi | d S )NTexist_ok)_strip_protocolexistsFileExistsErrormakedirsosmkdir)r   pathZcreate_parentsr   r   r   r   r$   /   s    

zLocalFileSystem.mkdirc                 C   s   |  |}tj||d d S )Nr   )r   r#   r"   )r   r%   r   r   r   r   r"   8   s    
zLocalFileSystem.makedirsc                 C   s   |  |}t| d S r
   )r   r#   rmdirr   r%   r   r   r   r&   <   s    
zLocalFileSystem.rmdirc                    sz     |} |}|d dkr^t|"} fdd|D }W d    qd1 sR0    Y  n|g}|svdd |D S |S )Ntype	directoryc                    s   g | ]}  |qS r   )info).0fr   r   r   
<listcomp>E       z&LocalFileSystem.ls.<locals>.<listcomp>c                 S   s   g | ]}|d  qS )namer   )r+   ir   r   r   r-   J   r.   )r   r*   r#   scandir)r   r%   Zdetailr   r*   itinfosr   r   r   ls@   s    

2zLocalFileSystem.lsc           	      K   s<  t |tjrV|jdd}| }|jddr2d}n|jddrDd}nd}| |j}n^| |}tj|dd}t	|j
}|rtj|dd}t|j
rd}nt|j
rd}nd}||j||j|d}dD ]}t|d	| ||< q|d
 r8t||d< ztj|dd}|j|d< W n ty6   d|d< Y n0 |S )NF)follow_symlinksr)   r   otherT)r/   sizer(   createdislink)modeuidgidmtimeinoZnlinkZst_r9   Zdestinationr7   r   )
isinstancer#   DirEntrystat
is_symlinkis_diris_filer   r%   S_ISLNKst_modeS_ISDIRS_ISREGst_sizest_ctimegetattrreadlinkOSError)	r   r%   r   outlinktresultfieldZout2r   r   r   r*   M   sF    

zLocalFileSystem.infoc                 K   s
   t |S r
   )osplexists)r   r%   r   r   r   r   rT   x   s    zLocalFileSystem.lexistsc                 K   st   | j |dd}| j |dd}| jr6| j| |dd | |rNt|| n"| |rh| j|dd nt	|d S )NTremove_trailing_slashr   )
r   r   r"   _parentisfileshutilcopyfileisdirZmkdirsFileNotFoundErrorr   path1path2r   r   r   r   cp_file{   s    

zLocalFileSystem.cp_filec                 C   s   |  |}tj|S r
   )r   r#   r%   rX   r'   r   r   r   rX      s    
zLocalFileSystem.isfilec                 C   s   |  |}tj|S r
   )r   r#   r%   r[   r'   r   r   r   r[      s    
zLocalFileSystem.isdirNc                 K   sX   t |r@t|d}t|| W d    qT1 s40    Y  n| j||fi |S d S )Nrb)r   openrY   copyfileobjr`   )r   r^   r_   callbackr   r,   r   r   r   get_file   s    ,zLocalFileSystem.get_filec                 K   s   | j ||fi |S r
   )r`   )r   r^   r_   rd   r   r   r   r   put_file   s    zLocalFileSystem.put_filec                 K   s,   | j |dd}| j |dd}t|| d S )NTrU   )r   rY   mover]   r   r   r   mv_file   s    zLocalFileSystem.mv_filec                 K   s,   |  |}|  |}tj||fi | d S r
   )r   r#   rO   r   srcdstr   r   r   r   rO      s    

zLocalFileSystem.linkc                 K   s,   |  |}|  |}tj||fi | d S r
   )r   r#   symlinkri   r   r   r   rl      s    

zLocalFileSystem.symlinkreturnc                 C   s   t j| |S r
   )r#   r%   r9   r   r'   r   r   r   r9      s    zLocalFileSystem.islinkc                 C   s   t | | d S r
   )r#   remover   r'   r   r   r   rm_file   s    zLocalFileSystem.rm_filec                 C   sr   t |ts|g}|D ]X}| j|dd}| |rb|s<tdt|t krVtdt	
| qt| qd S )NTrU   z+Cannot delete directory, set recursive=Truez'Cannot delete current working directory)r?   listr   r[   
ValueErrorrS   abspathr#   getcwdrY   rmtreero   )r   r%   	recursiveZmaxdepthpr   r   r   rm   s    

zLocalFileSystem.rmc                 C   s   |  |}d| S )Nfile://)r   )r   r/   r   r   r   unstrip_protocol   s    
z LocalFileSystem.unstrip_protocolra   c                 K   sB   |  |}| jr,d|v r,| j| |dd t||fd| i|S )NwTr   fs)r   r   r"   rW   LocalFileOpener)r   r%   r:   
block_sizer   r   r   r   _open   s    
zLocalFileSystem._openc                 K   s^   |  |}| jr$| j| |dd | |r<t|d  nt|d  |rZt	|d d S )NTr   ar   )
r   r   r"   rW   r    r#   utimerb   closetruncate)r   r%   r   r   r   r   r   touch   s    

zLocalFileSystem.touchc                 C   s$   | j |d}tjj|d tjjdS )Nr%   r8   tzr*   datetimefromtimestamptimezoneutcr   r%   r*   r   r   r   r8      s    zLocalFileSystem.createdc                 C   s$   | j |d}tjj|d tjjdS )Nr   r=   r   r   r   r   r   r   modified   s    zLocalFileSystem.modifiedc                 C   sl   | j |dd}tjdkr,|ddd p*dS |ddd }t|dkrd|dd dkrd|d d	 S |S d S )
NTrU   r      r         ::/)r   r#   seprsplitr   )clsr%   Zpath_r   r   r   rW      s    
zLocalFileSystem._parentc                 C   sp   t |}|dr8tt|dd}tjdkrf|d}n.|drftt|dd}tjdkrf|d}t||S )Nzfile:ry   \r   zlocal:zlocal://)r   r   r   r#   r   lstripmake_path_posix)r   r%   rV   r   r   r   r      s    




zLocalFileSystem._strip_protocolc                 C   s   dS NTr   r   r   r   r   _isfilestore   s    zLocalFileSystem._isfilestorec                 C   s   t |}t||S r
   )r   r#   chmod)r   r%   r:   r   r   r   r      s    zLocalFileSystem.chmod)F)T)F)F)N)N)FN)ra   N)T)F)'__name__
__module____qualname____doc__Zroot_markerprotocol
local_filer   propertyr   r$   r"   r&   r4   r*   rT   r`   rX   r[   re   rf   rh   rO   rl   boolr9   rp   rx   rz   r   r   r8   r   classmethodrW   r   r   r   __classcell__r   r   r   r   r      sF   


	

+





r   Fc                    s  t | ts@t | tttfr4t|  fdd| D S tt| } tjdkr| 	drj rf| 
dphdS | S | 	drtt|  S | 	dr| dd } t  d|  }  r| 
dpdS | S t  d|  S t| dkr| d d	kr2t| d
kr
| d d S | dddd}  r.| 
dS | S | d dkrPtt|  S | 	drd| dd dddd }  r| 
dS | S tt|  S dS )z Make path generic for current OSc                 3   s   | ]}t | V  qd S r
   )r   )r+   rw   rU   r   r   	<genexpr>  r.   z"make_path_posix.<locals>.<genexpr>r   ~z./r   Nr   r   r   r   r   r   //)z\\r   )r?   strrq   settupler(   r   r#   r   r   rstripr   rS   
expanduserrt   r   replacers   )r%   rV   r   rU   r   r     s4    




 r   c                 C   s"   |  tjp tjduo |  tjS )zReturn True if the path ends with a path separator.

    A forward slash is always considered a path separator, even on Operating
    Systems that normally use a backslash.
    N)endswithr#   r   altsepr   r   r   r   trailing_sep*  s    	r   c                   @   s   e Zd Zd6ddZdd Zdd Zd	d
 Zdd Zdd Zdd Z	e
dddZe
d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d7edd&d'Zed(d) Zd*d+ Zddd,d-Zd.d/ Zd0d1 Zd2d3 Zd4d5 ZdS )8r}   TNc                 K   sJ   t d| || _|| _|| _d | _|| _t||| _t	j
| _|   d S )Nzopen file: %s)loggerdebugr%   r:   r|   r,   
autocommitr   compressionioDEFAULT_BUFFER_SIZE	blocksizer   )r   r%   r:   r   r|   r   r   r   r   r   r   7  s    zLocalFileOpener.__init__c                 C   s   | j d u s| j jr| js"d| jvrXt| j| jd| _ | jrt| j }|| j | jd| _ n,t	 \}}t
| || _t|| jd| _ d| jvr| j dd| _| j d | j| j _d S )Nr{   r:   r   r   )r,   closedr   r:   rb   r%   r   r   tempfilemkstempr#   r   tempseekr7   )r   compressr0   r/   r   r   r   r   D  s    


zLocalFileOpener._openc                 C   s2   d| j vrt|   | j| | j|| S Nr)r:   rr   r   r,   r   read)r   startendr   r   r   _fetch_rangeV  s
    
zLocalFileOpener._fetch_rangec                 C   sH   d | _ |dd }| j| d|d v rDd | _ |   | j | d S )Nlocr   r:   )r,   pop__dict__updater   r   )r   stater   r   r   r   __setstate__^  s    zLocalFileOpener.__setstate__c                 C   sB   | j  }|d d| jv r.| j |d< n| jjs>td|S )Nr,   r   r   z+Cannot serialise open write-mode local file)r   copyr   r:   r,   tellr   rr   )r   dr   r   r   __getstate__g  s    


zLocalFileOpener.__getstate__c                 C   s"   | j rtdt| j| j d S )Nz0Can only commit if not already set to autocommit)r   RuntimeErrorrY   rg   r   r%   r   r   r   r   commitq  s    zLocalFileOpener.commitc                 C   s   | j rtdt| j d S )Nz#Cannot discard if set to autocommit)r   r   r#   ro   r   r   r   r   r   discardv  s    zLocalFileOpener.discardrm   c                 C   s   dS r   r   r   r   r   r   readable{  s    zLocalFileOpener.readablec                 C   s
   d| j vS r   r   r   r   r   r   writable~  s    zLocalFileOpener.writablec                 O   s   | j j|i |S r
   )r,   r   r   argsr   r   r   r   r     s    zLocalFileOpener.readc                 O   s   | j j|i |S r
   )r,   writer   r   r   r   r     s    zLocalFileOpener.writec                 O   s   | j j|i |S r
   )r,   r   r   r   r   r   r     s    zLocalFileOpener.tellc                 O   s   | j j|i |S r
   )r,   r   r   r   r   r   r     s    zLocalFileOpener.seekc                 O   s   | j j|i |S r
   )r,   seekabler   r   r   r   r     s    zLocalFileOpener.seekablec                 O   s   | j j|i |S r
   )r,   readliner   r   r   r   r     s    zLocalFileOpener.readlinec                 O   s   | j j|i |S r
   )r,   	readlinesr   r   r   r   r     s    zLocalFileOpener.readlinesc                 C   s
   | j  S r
   )r,   r   r   r   r   r   r     s    zLocalFileOpener.closec                 C   s   | j |S r
   )r,   r   )r   r7   r   r   r   r     s    zLocalFileOpener.truncatec                 C   s   | j jS r
   )r,   r   r   r   r   r   r     s    zLocalFileOpener.closedc                 C   s
   | j  S r
   )rawfilenor   r   r   r   r     s    zLocalFileOpener.filenoc                 C   s   | j   d S r
   )r,   flushr   r   r   r   r     s    zLocalFileOpener.flushc                 C   s
   | j  S r
   )r,   __iter__r   r   r   r   r     s    zLocalFileOpener.__iter__c                 C   s   t | j|S r
   )rK   r,   )r   itemr   r   r   __getattr__  s    zLocalFileOpener.__getattr__c                 C   s
   d| _ | S r   )
_incontextr   r   r   r   	__enter__  s    zLocalFileOpener.__enter__c                 C   s   d| _ | j||| d S )NF)r   r,   __exit__)r   exc_type	exc_value	tracebackr   r   r   r     s    zLocalFileOpener.__exit__)TNN)N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   intr   r   r   r   r   r   r   r   r   r   r   r   r   r}   6  s6    
	

r}   )F)r   r   loggingr#   os.pathr%   rS   rY   rA   r   Zfsspecr   Zfsspec.compressionr   Zfsspec.corer   Zfsspec.utilsr   r   	getLoggerr   r   r   r   r   r   IOBaser}   r   r   r   r   <module>   s$   
 m
&