U
    h                     @   s8   d dl Z d dlZd dlZd dlmZ G dd deZdS )    N)AbstractArchiveFileSystemc                       s   e Zd ZdZdZdZdZddddejddf fdd		Z	e
 fd
dZdd Zdd Zdd Zdd ZdddZdddZ  ZS )ZipFileSystemzRead/Write contents of ZIP archive as a file-system

    Keeps file object open while instance lives.

    This class is pickleable, but not necessarily thread-safe
     zipFrNTc           
         s   t  j| f| |tdkr,td| d|| _t|ttjfrt|dkrPd}	n|d }	t	j
|f|	|d|pni }|| _|| _| | _tj| j||||d| _d	| _d	S )
a  
        Parameters
        ----------
        fo: str or file-like
            Contains ZIP, and must exist. If a str, will fetch file using
            :meth:`~fsspec.open_files`, which must return one file exactly.
        mode: str
            Accept: "r", "w", "a"
        target_protocol: str (optional)
            If ``fo`` is a string, this value can be used to override the
            FS protocol inferred from a URL
        target_options: dict (optional)
            Kwargs passed when instantiating the target FS, if ``fo`` is
            a string.
        compression, allowZip64, compresslevel: passed to ZipFile
            Only relevant when creating a ZIP
        Zrwazmode 'z' no understoodazr+bb)modeprotocol)r	   compression
allowZip64compresslevelN)super__init__set
ValueErrorr	   
isinstancestrosPathLikefsspecopenforce_zip_64Zof	__enter__fozipfileZipFiler   	dir_cache)
selfr   r	   Ztarget_protocolZtarget_optionsr   r   r   kwargsm	__class__ L/var/www/html/venv/lib/python3.8/site-packages/fsspec/implementations/zip.pyr      s6     
zZipFileSystem.__init__c                    s   t  |dS )N/)r   _strip_protocollstrip)clspathr!   r#   r$   r&   H   s    zZipFileSystem._strip_protocolc                 C   s   t | dr|   | `d S )Nr   )hasattrcloser   r   r#   r#   r$   __del__M   s    
zZipFileSystem.__del__c                 C   s   | j   dS )z;Commits any write changes to the file. Done on ``del`` too.N)r   r+   r,   r#   r#   r$   r+   R   s    zZipFileSystem.closec                    s   | j d ks| jtdkr| j }dd | | j D | _ |D ]P  fddtjj	D }|
 jd j  rzdndd || j |d	 < qBd S )
Nwac                 S   s&   i | ]}| d | d dddqS )r%   r   	directorynamesizetype)rstrip).0dirnamer#   r#   r$   
<dictcomp>[   s   z+ZipFileSystem._get_dirs.<locals>.<dictcomp>c                    s   i | ]}|t  |d qS N)getattr)r5   szr#   r$   r7   d   s      r%   r/   filer0   r1   )r   r	   r   r   infolistZ_all_dirnamesnamelistr   ZipInfo	__slots__updatefilenamer4   	file_sizeis_dir)r   filesfr#   r;   r$   	_get_dirsV   s    

zZipFileSystem._get_dirsc                 K   s   | j j||f| d S r8   )r   writestr)r   r)   valuer   r#   r#   r$   	pipe_filen   s    zZipFileSystem.pipe_filerbc           	      K   s   |  |}d|kr:| jtdkr:| |r2tdt|d| jkrTd|krTtd| jj||d| j	d}d|kr| 
|}|d |_|d |_|S )	Nr   r.   z7ZipFS can only be open for reading or writing, not bothwr   )force_zip64r2   r1   )r&   r	   r   existsOSErrorFileNotFoundErrorr   r   stripr   infor2   r1   )	r   r)   r	   
block_sizeZ
autocommitZcache_optionsr   outrS   r#   r#   r$   _openr   s    	




zZipFileSystem._openc           
         s*   d k	r dk rt d|d}ttdd |dfdd}|   i }|| jkr| j| d d	kr| j| ||< |r|S |gS | j D ]Z\}}	|d
ks||sq|	d dkr|r||kr|	||d< q||kr|r|	nd ||< q r|	d fdd| D }|r"|S t
|S )N   zmaxdepth must be at least 1r%   c                 S   s   t | S r8   boolr:   r#   r#   r$   <lambda>       z$ZipFileSystem.find.<locals>.<lambda>c                    s,   t dd | d}tdd t |D S )Nc                 S   s   t | S r8   rX   rZ   r#   r#   r$   r[      r\   z>ZipFileSystem.find.<locals>._matching_starts.<locals>.<lambda>r%   c                 s   s   | ]\}}||kV  qd S r8   r#   )r5   r   r   r#   r#   r$   	<genexpr>   s     z?ZipFileSystem.find.<locals>._matching_starts.<locals>.<genexpr>)filtersplitallr   )	file_pathZ
file_parts)
path_partsr#   r$   _matching_starts   s    z,ZipFileSystem.find.<locals>._matching_startsr3   r=   r   r/   c                    s(   i | ] \}}| d   k r||qS )r%   )count)r5   kv)maxdepth
path_depthr#   r$   r7      s      z&ZipFileSystem.find.<locals>.<dictcomp>)r   r'   listr^   r_   rH   r   itemsrR   rd   sorted)
r   r)   rg   Zwithdirsdetailr   rc   resultra   	file_infor#   )rg   rh   rb   r$   find   s4    

zZipFileSystem.find)rL   NTN)NFF)__name__
__module____qualname____doc__Zroot_markerr
   Zcachabler   
ZIP_STOREDr   classmethodr&   r-   r+   rH   rK   rV   ro   __classcell__r#   r#   r!   r$   r      s0   4    
r   )r   r   r   Zfsspec.archiver   r   r#   r#   r#   r$   <module>   s   