
    ̒ge6                     >    d dl Z d dlZd dlmZ  G d de          ZdS )    N)AbstractArchiveFileSystemc                        e Zd ZdZdZdZdZddddej        ddf fd	Z	e
 fd	            Zd
 Zd Zd Zd Z	 	 	 	 ddZ x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                     t                      j        | fi | |t          d          vrt          d| d          || _        t          |t                    rt          j        |f|dz   |d|pi }|| _	        |
                                | _        t          j        | j        ||||          | _        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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	__class__s
            :lib/python3.11/site-packages/fsspec/implementations/zip.pyr   zZipFileSystem.__init__   s    8 	(((((s5zz!!;d;;;<<<	b# 	o BPBVTV B ,,..?G#!'
 
 
     c                 l    t                                          |                              d          S )N/)r   _strip_protocollstrip)clspathr#   s     r$   r(   zZipFileSystem._strip_protocolB   s+     ww&&t,,33C888r%   c                 V    t          | d          r|                                  | `d S d S )Nr   )hasattrcloser   r   s    r$   __del__zZipFileSystem.__del__G   s4    4 	JJLLL	 	r%   c                 8    | j                                          dS )z;Commits any write changes to the file. Done on ``del`` too.N)r   r.   r/   s    r$   r.   zZipFileSystem.closeL   s    r%   c                    | j         | j        t          d          v r| j                                        }d |                     | j                                                  D             | _         |D ]jfdt          j        j	        D             }|
                    j        j                                        rdndd           || j         |d         <   id S d S )Nwac                 (    i | ]}|d z   |d z   dddS )r'   r   	directorynamesizetype ).0dirnames     r$   
<dictcomp>z+ZipFileSystem._get_dirs.<locals>.<dictcomp>U   s<        ##q+VV  r%   c                 4    i | ]}|t          |d           S N)getattr)r;   szs     r$   r=   z+ZipFileSystem._get_dirs.<locals>.<dictcomp>Z   s'    OOOQ1d++OOOr%   r5   filer6   r7   )r   r   r   r   infolist_all_dirnamesnamelistr   ZipInfo	__slots__updatefilename	file_sizeis_dir)r   filesfrB   s      @r$   	_get_dirszZipFileSystem._get_dirsP   s   >!TY#d))%;%; H%%''E #11$(2C2C2E2EFF  DN  	. 	.OOOOW_5NOOO !
 !01

!F    -.qy))# &<%;	. 	.r%   c                 .     | j         j        ||fi | d S r?   )r   writestr)r   r+   valuer"   s       r$   	pipe_filezZipFileSystem.pipe_filed   s'    $0000000r%   rbc                    |                      |          }d|v rI| j        t          d          v r3|                     |          rt	          d          t          |          d| j        v rd|v rt	          d          | j                            ||                    d                    }d|v r/| 	                    |          }|d         |_
        |d         |_        |S )Nr   r3   z7ZipFS can only be open for reading or writing, not bothwr   r8   r7   )r(   r   r   existsOSErrorFileNotFoundErrorr   r   stripinfor8   r7   )	r   r+   r   
block_size
autocommitcache_optionsr"   outr[   s	            r$   _openzZipFileSystem._openh   s     ##D))$;;49D		11{{4   YWXXX#D)))$)tSTTThmmD$**S//22$;;99T??DF|CHF|CH
r%   )rT   NTN)__name__
__module____qualname____doc__root_markerr   cachabler   
ZIP_STOREDr   classmethodr(   r0   r.   rO   rS   r`   __classcell__)r#   s   @r$   r   r      s          KHH &- - - - - -^ 9 9 9 9 [9  
  . . .(1 1 1        r%   r   )r   r   fsspec.archiver   r   r:   r%   r$   <module>rk      sh      4 4 4 4 4 4v v v v v- v v v v vr%   