U
    -e5                     @   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
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G dd deZejfd	d
Zdd Zdd ZG dd dejZdS )    N)AbstractFileSystem)compr)get_compression)
isfilelikestringify_pathzfsspec.localc                       s$  e Zd ZdZdZdZdZd? fdd	Zedd	 Z	d@d
dZ
dAddZdd ZdBddZ fddZdd Zdd Zdd ZdCddZdDddZdd  Zd!d" Zd#d$ Zed%d&d'Zd(d) ZdEd*d+Zd,d- ZdFd/d0ZdGd1d2Zd3d4 Zd5d6 Ze d7d8 Z!e d9d: Z"d;d< Z#d=d> Z$  Z%S )H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.
    /fileTFc                    s   t  jf | || _d S N)super__init__
auto_mkdir)selfr   kwargs	__class__ ]/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/fsspec/implementations/local.pyr   #   s    zLocalFileSystem.__init__c                 C   s   dS )Nlocalr   r   r   r   r   fsid'   s    zLocalFileSystem.fsidc                 K   sB   |  |}| |rt||r0| j|dd ntj|f| 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   4   s    
zLocalFileSystem.makedirsc                 C   s   |  |}t| d S r
   )r   r   rmdirr   r   r   r   r   r    8   s    
zLocalFileSystem.rmdirc              
      s\      |r@t  }fdd|D W  5 Q R  S Q R X n fddt D S d S )Nc                    s   g | ]}  |qS r   )info.0fr   r   r   
<listcomp>@   s     z&LocalFileSystem.ls.<locals>.<listcomp>c                    s   g | ]}t  |qS r   )	posixpathjoinr#   r   r   r   r&   B   s     )r   r   scandirlistdir)r   r   detailr   itr   )r   r   r   ls<   s
    
&zLocalFileSystem.lsc                    s   |  |}t j|f|S r
   )r   r   globr   r   r   r   r   r   r/   D   s    
zLocalFileSystem.globc           	      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k
r6   d|d< Y nX |S )NF)follow_symlinks	directoryr	   otherT)namesizetypecreatedislink)modeuidgidmtimeinoZnlinkZst_r8   destinationr5   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"   H   sF    

zLocalFileSystem.infoc                 K   s
   t |S r
   )osplexistsr0   r   r   r   rT   s   s    zLocalFileSystem.lexistsc                 K   sx   |  |d}|  |d}| jr:| j| |dd | |rRt|| n"| |rl| j	|dd nt
|d S )Nr   Tr   )r   rstripr   r   _parentisfileshutilcopyfileisdirZmkdirsFileNotFoundErrorr   path1path2r   r   r   r   cp_filev   s    

zLocalFileSystem.cp_fileNc              	   K   s@   t |r,t|d}t|| W 5 Q R X n| j||f|S d S )Nrb)r   openrX   copyfileobjr_   )r   r]   r^   callbackr   r%   r   r   r   get_file   s    zLocalFileSystem.get_filec                 K   s   | j ||f|S r
   )r_   )r   r]   r^   rc   r   r   r   r   put_file   s    zLocalFileSystem.put_filec                 K   s0   |  |d}|  |d}t|| d S )Nr   )r   rU   rX   mover\   r   r   r   mv_file   s    zLocalFileSystem.mv_filec                 K   s(   |  |}|  |}tj||f| d S r
   )r   r   rO   r   srcdstr   r   r   r   rO      s    

zLocalFileSystem.linkc                 K   s(   |  |}|  |}tj||f| d S r
   )r   r   symlinkrh   r   r   r   rk      s    

zLocalFileSystem.symlinkreturnc                 C   s   t j| |S r
   )r   r   r8   r   r!   r   r   r   r8      s    zLocalFileSystem.islinkc                 C   s   t | | d S r
   )r   remover   r!   r   r   r   rm_file   s    zLocalFileSystem.rm_filec                 C   st   t |ts|g}|D ]Z}| |d}| |rd|s>tdt|t	 krXtdt
| qt| qd S )Nr   z+Cannot delete directory, set recursive=Truez'Cannot delete current working directory)r?   listr   rU   rZ   
ValueErrorrS   abspathr   getcwdrX   rmtreern   )r   r   	recursiveZmaxdepthpr   r   r   rm   s    

zLocalFileSystem.rmc                 C   s   |  |}d| S )Nfile://)r   )r   r4   r   r   r   unstrip_protocol   s    
z LocalFileSystem.unstrip_protocolr`   c                 K   sB   |  |}| jr,d|kr,| j| |dd t||fd| i|S )NwTr   fs)r   r   r   rV   LocalFileOpener)r   r   r9   
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   rV   r   r   utimera   closetruncate)r   r   r   r   r   r   r   touch   s    

zLocalFileSystem.touchc                 C   s   | j |d}tj|d S )Nr)   r7   r"   datetimeutcfromtimestampr   r   r"   r   r   r   r7      s    zLocalFileSystem.createdc                 C   s   | j |d}tj|d S )Nr)   r<   r   r   r   r   r   modified   s    zLocalFileSystem.modifiedc                 C   s2   |  |d}d|kr(|ddd S | jS d S )Nr      r   )r   rU   rsplitroot_markerclsr   r   r   r   rV      s    zLocalFileSystem._parentc                 C   sJ   t |}|dr |dd  }n|dr6|dd  }t|dpH| jS )Nrx      zfile:   r   )r   
startswithmake_path_posixrU   r   r   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   r9   r   r   r   r      s    zLocalFileSystem.chmod)F)T)F)F)N)N)FN)r`   N)T)&__name__
__module____qualname____doc__r   protocol
local_filer   propertyr   r   r   r    r.   r/   r"   rT   r_   rd   re   rg   rO   rk   boolr8   ro   rw   ry   r~   r   r7   r   classmethodrV   r   r   r   __classcell__r   r   r   r   r      sD   


	

+






r   c                 C   s  t | tttfr&t| dd | D S d| kr8t| } |dkrt| drN| S | drd| dd } t	 d |  S || krd| ks|dkr| dr|dkrd	| kr| d
stj
dkrtt| S t	 d |  S | dr| dd } td| r| dd dddd} | d
r0| ddS td| rX| dddddS | drd| ddddd S | S )zMake path genericc                 s   s   | ]}t |V  qd S r
   )r   )r$   rv   r   r   r   	<genexpr>   s     z"make_path_posix.<locals>.<genexpr>~r   z./   N\:z\\rx   r   z
/[A-Za-z]:r   z//z	[A-Za-z]:)r?   rp   settupler6   rS   
expanduserr   r   rs   sepr   rr   rematchreplacelstrip)r   r   r   r   r   r      sL    




r   c                 C   s"   |  tjp tjdk	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                 C   s6   |  tjtjd fp4tjdk	o4|  tjtjd fS )zReturn True if the path ends with a path separator and optionally an
    asterisk.

    A forward slash is always considered a path separator, even on Operating
    Systems that normally use a backslash.
    *Nr   r)   r   r   r   trailing_sep_maybe_asterisk   s    
r   c                   @   s   e Zd Zd4d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ed&d' Zd(d) Zddd*d+Zd,d- Zd.d/ Zd0d1 Zd2d3 ZdS )5r|   TNc                 K   sJ   t d| || _|| _|| _d | _|| _t||| _t	j
| _|   d S )Nzopen file: %s)loggerdebugr   r9   r{   r%   
autocommitr   compressionioDEFAULT_BUFFER_SIZE	blocksizer~   )r   r   r9   r   r{   r   r   r   r   r   r   0  s    zLocalFileOpener.__init__c                 C   s   | j d ks| j jr| js"d| jkrXt| j| jd| _ | jrt| j }|| j | jd| _ n,t	 \}}t
| || _t|| jd| _ d| jkr| j dd| _| j d | j| j _d S )Nrz   r9   r   r   )r%   closedr   r9   ra   r   r   r   tempfilemkstempr   r   tempseekr5   )r   compressir4   r   r   r   r~   =  s    


zLocalFileOpener._openc                 C   s2   d| j krt|   | j| | j|| S Nr)r9   rq   r~   r%   r   read)r   startendr   r   r   _fetch_rangeO  s
    
zLocalFileOpener._fetch_rangec                 C   sH   d | _ |dd }| j| d|d krDd | _ |   | j | d S )Nlocr   r9   )r%   pop__dict__updater~   r   )r   stater   r   r   r   __setstate__W  s    zLocalFileOpener.__setstate__c                 C   sB   | j  }|d d| jkr.| j |d< n| jjs>td|S )Nr%   r   r   z+Cannot serialise open write-mode local file)r   copyr   r9   r%   tellr   rq   )r   dr   r   r   __getstate__`  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   RuntimeErrorrX   rf   r   r   r   r   r   r   commitj  s    zLocalFileOpener.commitc                 C   s   | j rtdt| j d S )Nz#Cannot discard if set to autocommit)r   r   r   rn   r   r   r   r   r   discardo  s    zLocalFileOpener.discardrl   c                 C   s   dS r   r   r   r   r   r   readablet  s    zLocalFileOpener.readablec                 C   s
   d| j kS r   r   r   r   r   r   writablew  s    zLocalFileOpener.writablec                 O   s   | j j||S r
   )r%   r   r   argsr   r   r   r   r   z  s    zLocalFileOpener.readc                 O   s   | j j||S r
   )r%   writer   r   r   r   r   }  s    zLocalFileOpener.writec                 O   s   | j j||S r
   )r%   r   r   r   r   r   r     s    zLocalFileOpener.tellc                 O   s   | j j||S r
   )r%   r   r   r   r   r   r     s    zLocalFileOpener.seekc                 O   s   | j j||S r
   )r%   seekabler   r   r   r   r     s    zLocalFileOpener.seekablec                 O   s   | j j||S r
   )r%   readliner   r   r   r   r     s    zLocalFileOpener.readlinec                 O   s   | j j||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 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)r   r   r   r   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r|   /  s8        
	

r|   )r   r   loggingr   os.pathr   rS   r'   r   rX   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(   
 V+