o
    5ti                     @   s0   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  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i | |tdvrtd| d|| _t|tr9|dkr'd}	n|d }	tj|f|	|d|p6i }|| _	|
 | _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
        rwazmode 'z' no understoodazr+bb)modeprotocol)r
   compression
allowZip64compresslevelN)super__init__set
ValueErrorr
   
isinstancestrfsspecopenof	__enter__fozipfileZipFiler   	dir_cache)
selfr   r
   target_protocoltarget_optionsr   r   r   kwargsm	__class__ N/home/ubuntu/.local/lib/python3.10/site-packages/fsspec/implementations/zip.pyr      s2   


zZipFileSystem.__init__c                    s   t  |dS )N/)r   _strip_protocollstrip)clspathr"   r$   r%   r'   F   s   zZipFileSystem._strip_protocolc                 C   s   t | dr|   | `d S d S )Nr   )hasattrcloser   r   r$   r$   r%   __del__K   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,   P   s   zZipFileSystem.closec                    s   | j d u s| jtdv rJ| j }dd | | j D | _ |D ]*  fddtjj	D }|
 jd j  r=dndd || j |d	 < q!d S d 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>Y   s    z+ZipFileSystem._get_dirs.<locals>.<dictcomp>c                    s   i | ]	}|t  |d qS N)getattr)r6   szr$   r%   r8   b   s    r&   r0   filer1   r2   )r   r
   r   r   infolist_all_dirnamesnamelistr   ZipInfo	__slots__updatefilenamer5   	file_sizeis_dir)r   filesfr$   r<   r%   	_get_dirsT   s    

zZipFileSystem._get_dirsc                 K   s   | j j||fi | d S r9   )r   writestr)r   r*   valuer    r$   r$   r%   	pipe_filel   s   zZipFileSystem.pipe_filerbc           	      K   s   |  |}d|v r| jtdv r| |rtdt|d| jv r*d|v r*td| j||d}d|v rG| 	|}|d |_
|d |_|S )Nr   r/   z7ZipFS can only be open for reading or writing, not bothwr	   r3   r2   )r'   r
   r   existsOSErrorFileNotFoundErrorr   r   stripinfor3   r2   )	r   r*   r
   
block_size
autocommitcache_optionsr    outrT   r$   r$   r%   _openp   s   
	



zZipFileSystem._open)rN   NTN)__name__
__module____qualname____doc__root_markerr   cachabler   
ZIP_STOREDr   classmethodr'   r.   r,   rJ   rM   rY   __classcell__r$   r$   r"   r%   r      s0    3r   )r   r   fsspec.archiver   r   r$   r$   r$   r%   <module>   s    