U
    xÊ¹j·<  ã                   @   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G dd„ deƒ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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!d;d<„ ƒZ#d=d>„ Z$d?d@„ Z%‡  Z&S )JÚ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 |Ž || _d S ©N)ÚsuperÚ__init__Ú
auto_mkdir)Úselfr   Úkwargs©Ú	__class__© ú[/var/www/html/bwave/python/venv/lib/python3.8/site-packages/fsspec/implementations/local.pyr   !   s    zLocalFileSystem.__init__c                 C   s   dS )Nr
   r   ©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   2   s    
zLocalFileSystem.makedirsc                 C   s   |   |¡}t |¡ d S r   )r   r   Úrmdir©r   r    r   r   r   r!   6   s    
zLocalFileSystem.rmdirc           	   
   K   sœ   |   |¡}|  |¡}g }|d dkr„t |¡�N}|D ]B}z(|rH|  |¡n
|   |j¡}| |¡ W q4 tk
rt   Y q4X q4W 5 Q R X n|rŽ|gn|d g}|S )NÚtypeÚ	directoryÚname)r   Úinfor   Úscandirr    ÚappendÚFileNotFoundError)	r   r    Údetailr   Z	path_infoÚinfosÚitÚfr&   r   r   r   Úls:   s    

zLocalFileSystem.lsc           
      K   s>  t |tjƒr�|jdd�}| ¡ }|jdd�r2d}n|jdd�rDd}nd}|j}|r‚z|jdd�}|j}W n tk
r€   d}Y nX |  	|j
¡}nd|  	|¡}tj|dd�}t |j¡}|rÆtj|dd�}|j}t |j¡rÞd}nt |j¡rðd}nd}||||j|dœ}d	D ]}	t|d
|	› �ƒ||	< �q
|�r:t |¡|d< |S )NF)Úfollow_symlinksr$   r	   ÚotherTr   )r%   Úsizer#   ÚcreatedÚislink)ÚmodeÚuidÚgidÚmtimeÚinoZnlinkZst_Z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Útr1   Zout2ÚresultÚfieldr   r   r   r&   M   sL    


ûzLocalFileSystem.infoc                 K   s
   t  |¡S r   )ÚospÚlexists)r   r    r   r   r   r   rN   |   s    zLocalFileSystem.lexistsc                 K   sl   |   |¡}|   |¡}| jr.| j|  |¡dd� |  |¡rFt ||¡ n"|  |¡r`| j|dd� nt	|ƒ‚d S r   )
r   r   r   Ú_parentÚisfileÚshutilÚcopyfileÚisdirZmkdirsr)   ©r   Úpath1Úpath2r   r   r   r   Úcp_file   s    



zLocalFileSystem.cp_filec                 C   s   |   |¡}tj |¡S r   )r   r   r    rP   r"   r   r   r   rP   ‹   s    
zLocalFileSystem.isfilec                 C   s   |   |¡}tj |¡S r   )r   r   r    rS   r"   r   r   r   rS   �   s    
zLocalFileSystem.isdirNc              	   K   s@   t |ƒr,t|dƒ�}t ||¡ W 5 Q R X n| j||f|ŽS d S )NÚrb)r   ÚopenrQ   ÚcopyfileobjrW   )r   rU   rV   Úcallbackr   r-   r   r   r   Úget_file“   s    zLocalFileSystem.get_filec                 K   s   | j ||f|ŽS r   )rW   )r   rU   rV   r[   r   r   r   r   Úput_fileš   s    zLocalFileSystem.put_filec                 K   s$   |   |¡}|   |¡}t ||¡ d S r   )r   rQ   ÚmoverT   r   r   r   Úmv�   s    

zLocalFileSystem.mvc                 K   s(   |   |¡}|   |¡}tj||f|Ž d S r   )r   r   rI   ©r   ÚsrcÚdstr   r   r   r   rI   ¢   s    

zLocalFileSystem.linkc                 K   s(   |   |¡}|   |¡}tj||f|Ž d S r   )r   r   Úsymlinkr`   r   r   r   rc   §   s    

zLocalFileSystem.symlink©Úreturnc                 C   s   t j |  |¡¡S r   )r   r    r3   r   r"   r   r   r   r3   ¬   s    zLocalFileSystem.islinkc                 C   s   t  |  |¡¡ d S r   )r   Úremover   r"   r   r   r   Úrm_file¯   s    zLocalFileSystem.rm_filec                 C   sn   t |tƒs|g}|D ]T}|  |¡}|  |¡r^|s8tdƒ‚t |¡t ¡ krRtdƒ‚t	 
|¡ qt |¡ qd S )Nz+Cannot delete directory, set recursive=Truez'Cannot delete current working directory)r9   Úlistr   rS   Ú
ValueErrorrM   Úabspathr   ÚgetcwdrQ   Úrmtreerf   )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_protocolrX   c                 K   sB   |   |¡}| jr,d|kr,| j|  |¡dd� t||fd| i|—ŽS )NÚwTr   Úfs)r   r   r   rO   ÚLocalFileOpener)r   r    r4   Ú
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   rO   r   r   ÚutimerY   ÚcloseÚtruncate)r   r    rz   r   r   r   r   ÚtouchË   s    

zLocalFileSystem.touchc                 C   s$   | j |d�}tjj|d tjjd�S )N©r    r2   ©Útz©r&   ÚdatetimeÚfromtimestampÚtimezoneÚutc©r   r    r&   r   r   r   r2   Ö   s
     ÿzLocalFileSystem.createdc                 C   s$   | j |d�}tjj|d tjjd�S )Nr|   r7   r}   r   r„   r   r   r   ÚmodifiedÜ   s    zLocalFileSystem.modifiedc                 C   sh   |   |¡}tjdkr(| dd¡d p&dS | dd¡d }t|ƒdkr`|dd… dkr`|d d S |S d S )Nr   é   r   é   é   ú:ú:/)r   r   ÚsepÚrsplitÚlen)Úclsr    Zpath_r   r   r   rO   à   s    

zLocalFileSystem._parentc                 C   s@  t |ƒ}| d¡r |dd … }nF| d¡r8|dd … }n.| d¡rP|dd … }n| d¡rf|dd … }t|ƒ}tjd	k�r*|d
d… dkr¦|d d… |dd …  }}nj|d d… dk�r| d	d¡ }dksä| d	|d
 ¡ }dkrð|d }}n|d |… ||d …  }}nd}| d	¡�p | j}|| S | d	¡�p:| jS d S )Nrp   é   zfile:é   zlocal://é   zlocal:é   r   r†   rˆ   r‰   ú//éÿÿÿÿÚ )r   Ú
startswithÚmake_path_posixr   r‹   ÚfindÚrstripÚroot_marker)rŽ   r    ÚdriveZindex1Úindex2r   r   r   r   ð   s0    



þ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    r4   r   r   r   rŸ     s    zLocalFileSystem.chmod)F)T)F)F)N)N)FN)rX   N)T)'Ú__name__Ú
__module__Ú__qualname__Ú__doc__rš   ÚprotocolÚ
local_filer   Úpropertyr   r   r   r!   r.   r&   rN   rW   rP   rS   r\   r]   r_   rI   rc   Úboolr3   rg   ro   rq   rv   r{   r2   r…   ÚclassmethodrO   r   rž   rŸ   Ú__classcell__r   r   r   r   r      sF   


	

/






&r   c                 C   sà  t | tƒsRt | tttfƒr0t| ƒdd„ | D ƒƒS t| ƒ} t | tƒsRtd| ›d�ƒ‚tj	dkr´|  
d¡rj| S |  
d¡r~t | ¡S |  
d¡r–| dd	… } n| d
kr¢d} t ¡ › d| › �S | dd… dkrà| dd… dkrà| dd	… } | dd… dk�rt| ƒdk�r| d d S |  dd¡} | S | dd… dk�r<tt | ¡ƒS |  
d¡�r`d| dd	…  dd¡ S |  
d¡�r’|  dd¡} t t ¡ ¡d › | › �S |  dd¡} |  
d¡�r¸| dd	… } n| d
k�rÆd} tt ¡ ƒ› d| › �S d	S )z-Make path generic and absolute for current OSc                 s   s   | ]}t |ƒV  qd S r   )r—   )Ú.0rn   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   )r9   Ústrrh   ÚsetÚtupler#   r   Ú	TypeErrorr   r‹   r–   rM   Ú
expanduserrk   r�   Úreplacer—   Ú
splitdriver|   r   r   r   r—   "  sH    






 
r—   c                 C   s"   |   tj¡p tjdk	o |   tj¡S )z±Return 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_sepU  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 )8rt   TNc                 K   sJ   t  d|¡ || _|| _|| _d | _|| _t||ƒ| _t	j
| _|  ¡  d S )Nzopen file: %s)ÚloggerÚdebugr    r4   rs   r-   Ú
autocommitr   ÚcompressionÚioÚDEFAULT_BUFFER_SIZEÚ	blocksizerv   )r   r    r4   r»   rs   r¼   r   r   r   r   r   b  s    zLocalFileOpener.__init__c                 C   s¸   | j d ks| j jr´| js"d| jkrXt| j| jd�| _ | jr„t| j }|| j | jd�| _ n,t 	¡ \}}t
 |¡ || _t|| jd�| _ d| jkr´| j  dd¡| _| j  d¡ | j| j _d S )Nrr   ©r4   r   rˆ   )r-   Úclosedr»   r4   rY   r    r¼   r   ÚtempfileÚmkstempr   ry   ÚtempÚseekr1   )r   ÚcompressÚir%   r   r   r   rv   o  s    


zLocalFileOpener._openc                 C   s2   d| j krt‚|  ¡  | j |¡ | j || ¡S ©NÚr)r4   ri   rv   r-   rÅ   Úread)r   ÚstartÚendr   r   r   Ú_fetch_range�  s
    
zLocalFileOpener._fetch_rangec                 C   sH   d | _ | dd ¡}| j |¡ d|d krDd | _ |  ¡  | j  |¡ d S )NÚlocrÉ   r4   )r-   ÚpopÚ__dict__Úupdaterv   rÅ   )r   ÚstaterÎ   r   r   r   Ú__setstate__‰  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Ï   r4   r-   ÚtellrÁ   ri   )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»   ÚRuntimeErrorrQ   r^   rÄ   r    r   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   rf   rÄ   r   r   r   r   Údiscard¡  s    zLocalFileOpener.discardrd   c                 C   s   dS r�   r   r   r   r   r   Úreadable¦  s    zLocalFileOpener.readablec                 C   s
   d| j kS rÈ   rÀ   r   r   r   r   Úwritable©  s    zLocalFileOpener.writablec                 O   s   | j j||ŽS r   )r-   rÊ   ©r   Úargsr   r   r   r   rÊ   ¬  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-   ry   r   r   r   r   ry   Á  s    zLocalFileOpener.closec                 C   s   | j  |¡S r   )r-   rz   )r   r1   r   r   r   rz   Ä  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   )rF   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   rv   rÍ   rÓ   r×   rÙ   rÚ   r§   rÛ   rÜ   rÊ   rß   rÕ   rÅ   rà   rá   râ   ry   Úintrz   r¦   rÁ   rä   rå   ræ   rè   rê   rë   r   r   r   r   rt   a  s:        ÿ
	

rt   )r€   r½   Úloggingr   Úos.pathr    rM   rQ   r;   rÂ   Zfsspecr   Zfsspec.compressionr   Zfsspec.corer   Zfsspec.utilsr   r   Ú	getLoggerr¹   r   r—   r¸   ÚIOBasert   r   r   r   r   Ú<module>   s$   
  3