o
    3IhA                     @   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 d dlmZmZ edZG dd	 d	eZd
d Zdd ZeddddedefddZG dd dejZdS )    N)	lru_cache)AbstractFileSystem)compr)get_compression)
isfilelikestringify_pathzfsspec.localc                       s0  e Zd ZdZdZdZdZdB fdd	Zedd	 Z	dCd
dZ
dBddZdd ZdBddZdd Zdd Zdd Zdd Zdd ZdDddZdDdd ZdCd!efd"d#Zd$d% Zd&d' Zd(efd)d*Zd+d, ZdEd-d.Zd/d0 ZdFd2d3ZdCd4d5Zd6d7 Zd8d9 Z e!d:d; Z"e!d<d= Z#d>d? Z$d@dA Z%  Z&S )G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di | || _d S )N )super__init__
auto_mkdir)selfr   kwargs	__class__r   \/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/fsspec/implementations/local.pyr   "   s   
zLocalFileSystem.__init__c                 C      dS )Nr   r   r   r   r   r   fsid&   s   zLocalFileSystem.fsidc                 K   sH   |  |}| |rt||r| j|dd d S tj|fi | d S NTexist_ok)_strip_protocolexistsFileExistsErrormakedirsosmkdir)r   path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   3   s   
zLocalFileSystem.makedirsc                 C   s   |  |}t| d S N)r   r   rmdirr   r!   r   r   r   r$   7   s   
zLocalFileSystem.rmdirc           	   
   K   s   |  |}| |}g }|d dkrLt|+}|D ]}z|r$| |n|  |j}|| W q ty9   Y qw W d    |S 1 sEw   Y  |S |rQ|gn|d g}|S )Ntype	directoryname)r   infor   scandirr!   appendFileNotFoundError)	r   r!   detailr   	path_infoinfositfr)   r   r   r   ls;   s&   


zLocalFileSystem.lsc           
      K   s8  t |tjrG|jdd}| }|jddrd}n|jddr"d}nd}|j}|r@z|jdd}|j}W n ty?   d}Y nw | 	|j
}n2| 	|}tj|dd}t|j}|rbtj|dd}|j}t|jrnd}nt|jrwd}nd}||||j|d}d	D ]}	t|d
|	 ||	< q|rt||d< |S )NF)follow_symlinksr'   r
   otherTr   )r(   sizer&   createdislink)modeuidgidmtimeinonlinkst_destination)
isinstancer   DirEntrystat
is_symlinkis_diris_filest_sizeOSErrorr   r!   S_ISLNKst_modeS_ISDIRS_ISREGst_ctimegetattrreadlink)
r   r!   r   outlinktr5   out2resultfieldr   r   r   r)   N   sN   

zLocalFileSystem.infoc                 K   s
   t |S r#   )osplexists)r   r!   r   r   r   r   rV   }      
zLocalFileSystem.lexistsc                 K   sl   |  |}|  |}| jr| j| |dd | |r$t|| d S | |r2| j|dd d S t	|r   )
r   r   r   _parentisfileshutilcopyfileisdirmkdirsr,   )r   path1path2r   r   r   r   cp_file   s   



zLocalFileSystem.cp_filec                 C      |  |}tj|S r#   )r   r   r!   rY   r%   r   r   r   rY         
zLocalFileSystem.isfilec                 C   ra   r#   )r   r   r!   r\   r%   r   r   r   r\      rb   zLocalFileSystem.isdirNc                 K   sX   t |r"t|d}t|| W d    d S 1 sw   Y  d S | j||fi |S )Nrb)r   openrZ   copyfileobjr`   )r   r^   r_   callbackr   r1   r   r   r   get_file   s
   "zLocalFileSystem.get_filec                 K   s   | j ||fi |S r#   )r`   )r   r^   r_   rf   r   r   r   r   put_file      zLocalFileSystem.put_file	recursivec                 K   s$   |  |}|  |}t|| dS )zMove files/directories
        For the specific case of local, all ops on directories are recursive and
        the recursive= kwarg is ignored.
        N)r   rZ   move)r   r^   r_   rj   r   r   r   r   mv   s   

zLocalFileSystem.mvc                 K   ,   |  |}|  |}tj||fi | d S r#   )r   r   rP   r   srcdstr   r   r   r   rP         

zLocalFileSystem.linkc                 K   rm   r#   )r   r   symlinkrn   r   r   r   rr      rq   zLocalFileSystem.symlinkreturnc                 C   s   t j| |S r#   )r   r!   r7   r   r%   r   r   r   r7         zLocalFileSystem.islinkc                 C   s   t | | d S r#   )r   remover   r%   r   r   r   rm_file   ri   zLocalFileSystem.rm_filec                 C   sn   t |ts|g}|D ]*}| |}| |r/|stdt|t kr)tdt	
| q
t| q
d S )Nz+Cannot delete directory, set recursive=Truez'Cannot delete current working directory)r@   listr   r\   
ValueErrorrU   abspathr   getcwdrZ   rmtreeru   )r   r!   rj   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_protocolrc   c                 K   sB   |  |}| jrd|v r| j| |dd t||fd| i|S )NwTr   fs)r   r   r   rX   LocalFileOpener)r   r!   r8   
block_sizer   r   r   r   _open   s   
zLocalFileSystem._openc                 K   sb   |  |}| jr| j| |dd | |rt|d  nt|d  |r/t	|d d S d S )NTr   ar   )
r   r   r   rX   r   r   utimerd   closetruncate)r   r!   r   r   r   r   r   touch   s   

zLocalFileSystem.touchc                 C   $   | j |d}tjj|d tjjdS )Nr!   r6   tzr)   datetimefromtimestamptimezoneutcr   r!   r)   r   r   r   r6      s   zLocalFileSystem.createdc                 C   r   )Nr   r;   r   r   r   r   r   r   modified   s   zLocalFileSystem.modifiedc                 C   sd   |  |}tjdkr|ddd pdS |ddd }t|dkr0|dd dkr0|d d S |S )Nr	      r         ::/)r   r   seprsplitlen)clsr!   path_r   r   r   rX      s   

zLocalFileSystem._parentc                 C   s4  t |}|dr|dd  }n#|dr|dd  }n|dr(|dd  }n|dr3|dd  }t|}tjd	kr|d
d dkrR|d d |dd  }}n4|d d dkr|d	d }dksp|d	|d
  }dkrv|d}}n|d | ||d  }}nd}|d	p| j}|| S |d	p| jS )Nr      zfile:   zlocal://   zlocal:   r	   r   r   r   // )r   
startswithmake_path_posixr   r   findrstriproot_marker)r   r!   driveindex1index2r   r   r   r      s0   




zLocalFileSystem._strip_protocolc                 C   r   NTr   r   r   r   r   _isfilestore  s   zLocalFileSystem._isfilestorec                 C   s   t |}t||S r#   )r   r   chmod)r   r!   r8   r   r   r   r   "  s   zLocalFileSystem.chmod)F)Tr#   )FN)rc   N)'__name__
__module____qualname____doc__r   protocol
local_filer   propertyr   r    r   r$   r2   r)   rV   r`   rY   r\   rg   rh   boolrl   rP   rr   r7   rv   r~   r   r   r   r6   r   classmethodrX   r   r   r   __classcell__r   r   r   r   r      sH    



	
/

	




&r   c                 C   s  t | ts)t | tttfrt| dd | D S t| } t | ts)td| dtj	dkrZ| 
dr5| S | 
dr?t| S | 
drK| dd	 } n| d
krQd} t  d|  S | dd dkrp| dd dkrp| dd	 } | dd dkrt| dkr| d d S | dd} | S | dd dkrtt| S | 
drd| dd	 dd S | 
dr| dd} tt d  |  S | dd} | 
dr| dd	 } n| d
krd} tt  d|  S )z-Make path generic and absolute for current OSc                 s   s    | ]}t |V  qd S r#   )r   ).0r}   r   r   r   	<genexpr>+  s    z"make_path_posix.<locals>.<genexpr>zcould not convert z
 to stringr	   ~z./r   N.r   r   r   r   r   r   \)z\\r   r   )r   r	   )r@   strrw   settupler&   r   	TypeErrorr   r   r   rU   
expanduserrz   r   replacer   
splitdriver   r   r   r   r   '  sH   






 


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_sepZ  s   "	r   r   )maxsize  maskrs   c                 C   s   t | }t | |S )zGet the current umask.

    Follows https://stackoverflow.com/a/44130549 to get the umask.
    Temporarily sets the umask to the given value, and then resets it to the
    original value.
    )r   umask)r   valuer   r   r   	get_umaskf  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	de
fddZde
f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d7defd&d'Zed(d) Zd*d+ Zd8d,d-Zd.d/ Zd0d1 Zd2d3 Zd4d5 ZdS )9r   TNc                 K   sJ   t d| || _|| _|| _d | _|| _t||| _t	j
| _|   d S )Nzopen file: %s)loggerdebugr!   r8   r   r1   
autocommitr   compressionioDEFAULT_BUFFER_SIZE	blocksizer   )r   r!   r8   r   r   r   r   r   r   r   r   t  s   zLocalFileOpener.__init__c                 C   s   | j d u s	| j jr\| jsd| jvr,t| j| jd| _ | jr+t| j }|| j | jd| _ nt	 \}}t
| || _t|| jd| _ d| jvr^| j dd| _| j d | j| j _d S d S d S )Nr   r8   r   r   )r1   closedr   r8   rd   r!   r   r   tempfilemkstempr   r   tempseekr5   )r   compressir(   r   r   r   r     s"   


zLocalFileOpener._openc                 C   s2   d| j vrt|   | j| | j|| S Nr)r8   rx   r   r1   r   read)r   startendr   r   r   _fetch_range  s
   
zLocalFileOpener._fetch_rangec                 C   sL   d | _ |dd }| j| d|d v r$d | _ |   | j | d S d S )Nlocr   r8   )r1   pop__dict__updater   r   )r   stater   r   r   r   __setstate__  s   zLocalFileOpener.__setstate__c                 C   sD   | j  }|d d| jv r| j |d< |S | jjs td|S )Nr1   r   r   z+Cannot serialise open write-mode local file)r   copyr   r8   r1   tellr   rx   )r   dr   r   r   __getstate__  s   


zLocalFileOpener.__getstate__c              
   C   s   | j rtdz
t| j| j W n ty- } ztj| js"|W Y d }~d S d }~ww zd}t	| j|t
| @  W d S  tyI   Y d S w )Nz0Can only commit if not already set to autocommitr   )r   RuntimeErrorrZ   rk   r   r!   PermissionErrorr   r   r   r   )r   er   r   r   r   commit  s    	zLocalFileOpener.commitc                 C   s   | j rtdt| j d S )Nz#Cannot discard if set to autocommit)r   r   r   ru   r   r   r   r   r   discard  s   zLocalFileOpener.discardrs   c                 C   r   r   r   r   r   r   r   readable  s   zLocalFileOpener.readablec                 C   s
   d| j vS r   r   r   r   r   r   writable  rW   zLocalFileOpener.writablec                 O      | j j|i |S r#   )r1   r   r   argsr   r   r   r   r     rt   zLocalFileOpener.readc                 O   r   r#   )r1   writer   r   r   r   r     rt   zLocalFileOpener.writec                 O   r   r#   )r1   r   r   r   r   r   r     rt   zLocalFileOpener.tellc                 O   r   r#   )r1   r   r   r   r   r   r     rt   zLocalFileOpener.seekc                 O   r   r#   )r1   seekabler   r   r   r   r     rt   zLocalFileOpener.seekablec                 O   r   r#   )r1   readliner   r   r   r   r     rt   zLocalFileOpener.readlinec                 O   r   r#   )r1   	readlinesr   r   r   r   r     rt   zLocalFileOpener.readlinesc                 C   
   | j  S r#   )r1   r   r   r   r   r   r     rW   zLocalFileOpener.closec                 C   s   | j |S r#   )r1   r   )r   r5   r   r   r   r        zLocalFileOpener.truncatec                 C   s   | j jS r#   )r1   r   r   r   r   r   r     s   zLocalFileOpener.closedc                 C   r   r#   )rawfilenor   r   r   r   r    rW   zLocalFileOpener.filenoc                 C   s   | j   d S r#   )r1   flushr   r   r   r   r    s   zLocalFileOpener.flushc                 C   r   r#   )r1   __iter__r   r   r   r   r    rW   zLocalFileOpener.__iter__c                 C   s   t | j|S r#   )rM   r1   )r   itemr   r   r   __getattr__  r   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  r1   __exit__)r   exc_type	exc_value	tracebackr   r   r   r    s   zLocalFileOpener.__exit__)TNNr#   )rs   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   s  s8    
	


r   )r   )r   r   loggingr   os.pathr!   rU   rZ   rB   r   	functoolsr   fsspecr   fsspec.compressionr   fsspec.corer   fsspec.utilsr   r   	getLoggerr   r   r   r   r  r   IOBaser   r   r   r   r   <module>   s,    
  3