File: //lib/python3/dist-packages/__pycache__/zipp.cpython-310.pyc
o
    ��f  �                   @   s�   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	e
Zdd� Zdd� Z
G dd� d�ZG d	d
� d
�ZdS )�    )�divisionNc                 C   s   t �t| �dd�S )a2  
    Given a path with elements separated by
    posixpath.sep, generate all parents of that path.
    >>> list(_parents('b/d'))
    ['b']
    >>> list(_parents('/b/d/'))
    ['/b']
    >>> list(_parents('b/d/f/'))
    ['b/d', 'b']
    >>> list(_parents('b'))
    []
    >>> list(_parents(''))
    []
    �   N)�	itertools�islice�	_ancestry��path� r	   �&/usr/lib/python3/dist-packages/zipp.py�_parents   s   r   c                 c   sN   � | � tj�} | r!| tjkr%| V  t�| �\} }| r#| tjksdS dS dS dS )aR  
    Given a path with elements separated by
    posixpath.sep, generate all elements of that path
    >>> list(_ancestry('b/d'))
    ['b/d', 'b']
    >>> list(_ancestry('/b/d/'))
    ['/b/d', '/b']
    >>> list(_ancestry('b/d/f/'))
    ['b/d/f', 'b/d', 'b']
    >>> list(_ancestry('b'))
    ['b']
    >>> list(_ancestry(''))
    []
    N)�rstrip�	posixpath�sep�split)r   �tailr	   r	   r
   r   %   s   ��r   c                       s,   e Zd ZdZ� fdd�Zedd� �Z�  ZS )�SanitizedNamesz7
    ZipFile mix-in to ensure names are sanitized.
    c                    s   t t| jt� �� ��S �N)�list�map�	_sanitize�super�namelist��self��	__class__r	   r
   r   ?   s   zSanitizedNames.namelistc                 C   s`   dd� }t jdd| t jd�}|�dd�}|�d�}d�t||��}|s'td��|d| �d�  S )	a]  
        Ensure a relative path with posix separators and no dot names.
        Modeled after
        https://github.com/python/cpython/blob/bcc1be39cb1d04ad9fc0bd1b9193d3972835a57c/Lib/zipfile/__init__.py#L1799-L1813
        but provides consistent cross-platform behavior.
        >>> san = SanitizedNames._sanitize
        >>> san('/foo/bar')
        'foo/bar'
        >>> san('//foo.txt')
        'foo.txt'
        >>> san('foo/.././bar.txt')
        'foo/bar.txt'
        >>> san('foo../.bar.txt')
        'foo../.bar.txt'
        >>> san('\\foo\\bar.txt')
        'foo/bar.txt'
        >>> san('D:\\foo.txt')
        'D/foo.txt'
        >>> san('\\\\server\\share\\file.txt')
        'server/share/file.txt'
        >>> san('\\\\?\\GLOBALROOT\\Volume3')
        '?/GLOBALROOT/Volume3'
        >>> san('\\\\.\\PhysicalDrive1\\root')
        'PhysicalDrive1/root'
        Retain any trailing slash.
        >>> san('abc/')
        'abc/'
        Raises a ValueError if the result is empty.
        >>> san('../..')
        Traceback (most recent call last):
        ...
        ValueError: Empty filename
        c                 S   s   | o| dvS )N>   �..�.r	   )�partr	   r	   r
   �allowedf   �   z)SanitizedNames._sanitize.<locals>.allowedz	^([A-Z]):z\1)�flags�\�/zEmpty filename)	�re�sub�
IGNORECASE�replacer   �join�filter�
ValueError�endswith)�namer   �bare�clean�parts�joinedr	   r	   r
   r   B   s   $
zSanitizedNames._sanitize)�__name__�
__module__�__qualname__�__doc__r   �staticmethodr   �
__classcell__r	   r	   r   r
   r   :   s
    r   c                   @   s�   e Zd ZdZdZd,dd�Zedd� �Zedd	� �Z	ed
d� �Z
dd
� Zdd� Zdd� Z
dd� Zdd� Zdd� Zdd� Zdd� Zdd� Zdd� Zd d!� ZeZed"d#� �Zed$d%� �Zed&d'� �Zd(d)� Zejd*k rleZd+S d+S )-�Pathu�  
    A pathlib-compatible interface for zip files.
    Consider a zip file with this structure::
        .
        ├── a.txt
        └── b
            ├── c.txt
            └── d
                └── e.txt
    >>> data = io.BytesIO()
    >>> zf = zipfile.ZipFile(data, 'w')
    >>> zf.writestr('a.txt', 'content of a')
    >>> zf.writestr('b/c.txt', 'content of c')
    >>> zf.writestr('b/d/e.txt', 'content of e')
    >>> zf.filename = 'abcde.zip'
    Path accepts the zipfile object itself or a filename
    >>> root = Path(zf)
    From there, several path operations are available.
    Directory iteration (including the zip file itself):
    >>> a, b = root.iterdir()
    >>> a
    Path('abcde.zip', 'a.txt')
    >>> b
    Path('abcde.zip', 'b/')
    name property:
    >>> b.name
    'b'
    join with divide operator:
    >>> c = b / 'c.txt'
    >>> c
    Path('abcde.zip', 'b/c.txt')
    >>> c.name
    'c.txt'
    Read text:
    >>> c.read_text()
    'content of c'
    existence:
    >>> c.exists()
    True
    >>> (b / 'missing.txt').exists()
    False
    Coercion to string:
    >>> str(c)
    'abcde.zip/b/c.txt'
    z>{self.__class__.__name__}({self.root.filename!r}, {self.at!r})� c                 C   s,   t |tj�r|nt�| �|��| _|| _d S r   )�
isinstance�zipfile�ZipFile�_pathlib_compat�root�at)r   r=   r>