PHP 7.4.33
Preview: zipp.py Size: 6.75 KB
//usr/lib/python3/dist-packages/zipp.py
# coding: utf-8

from __future__ import division

import io
import sys
import posixpath
import zipfile
import functools
import itertools
import re

import more_itertools

__metaclass__ = type


def _parents(path):
    """
    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(''))
    []
    """
    return itertools.islice(_ancestry(path), 1, None)


def _ancestry(path):
    """
    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(''))
    []
    """
    path = path.rstrip(posixpath.sep)
    while path and path != posixpath.sep:
        yield path
        path, tail = posixpath.split(path)

class SanitizedNames:
    """
    ZipFile mix-in to ensure names are sanitized.
    """

    def namelist(self):
        return list(map(self._sanitize, super().namelist()))

    @staticmethod
    def _sanitize(name):
        r"""
        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
        """

        def allowed(part):
            return part and part not in {'..', '.'}

        # Remove the drive letter.
        # Don't use ntpath.splitdrive, because that also strips UNC paths
        bare = re.sub('^([A-Z]):', r'\1', name, flags=re.IGNORECASE)
        clean = bare.replace('\\', '/')
        parts = clean.split('/')
        joined = '/'.join(filter(allowed, parts))
        if not joined:
            raise ValueError("Empty filename")
        return joined + '/' * name.endswith('/')
    
class Path:
    """
    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'
    """

    __repr = "{self.__class__.__name__}({self.root.filename!r}, {self.at!r})"

    def __init__(self, root, at=""):
        self.root = (
            root
            if isinstance(root, zipfile.ZipFile)
            else zipfile.ZipFile(self._pathlib_compat(root))
        )
        self.at = at

    @staticmethod
    def _pathlib_compat(path):
        """
        For path-like objects, convert to a filename for compatibility
        on Python 3.6.1 and earlier.
        """
        try:
            return path.__fspath__()
        except AttributeError:
            return str(path)

    @property
    def open(self):
        return functools.partial(self.root.open, self.at)

    @property
    def name(self):
        return posixpath.basename(self.at.rstrip("/"))

    def read_text(self, *args, **kwargs):
        with self.open() as strm:
            return io.TextIOWrapper(strm, *args, **kwargs).read()

    def read_bytes(self):
        with self.open() as strm:
            return strm.read()

    def _is_child(self, path):
        return posixpath.dirname(path.at.rstrip("/")) == self.at.rstrip("/")

    def _next(self, at):
        return Path(self.root, at)

    def is_dir(self):
        return not self.at or self.at.endswith("/")

    def is_file(self):
        return not self.is_dir()

    def exists(self):
        return self.at in self._names()

    def iterdir(self):
        if not self.is_dir():
            raise ValueError("Can't listdir a file")
        subs = map(self._next, self._names())
        return filter(self._is_child, subs)

    def __str__(self):
        return posixpath.join(self.root.filename, self.at)

    def __repr__(self):
        return self.__repr.format(self=self)

    def joinpath(self, add):
        add = self._pathlib_compat(add)
        next = posixpath.join(self.at, add)
        next_dir = posixpath.join(self.at, add, "")
        names = self._names()
        return self._next(next_dir if next not in names and next_dir in names else next)

    __truediv__ = joinpath

    @staticmethod
    def _implied_dirs(names):
        return more_itertools.unique_everseen(
            parent + "/"
            for name in names
            for parent in _parents(name)
            if parent + "/" not in names
        )

    @classmethod
    def _add_implied_dirs(cls, names):
        return names + list(cls._implied_dirs(names))

    @property
    def parent(self):
        parent_at = posixpath.dirname(self.at.rstrip('/'))
        if parent_at:
            parent_at += '/'
        return self._next(parent_at)

    def _names(self):
        return self._add_implied_dirs(list(map(SanitizedNames._sanitize, self.root.namelist())))

    if sys.version_info < (3,):
        __div__ = __truediv__

Directory Contents

Dirs: 167 × Files: 38
Name Size Perms Modified Actions
acme DIR
- drwxr-xr-x 2024-03-05 04:28:32
Edit Download
- drwxr-xr-x 2024-03-05 04:28:01
Edit Download
apport DIR
- drwxr-xr-x 2025-08-06 06:56:20
Edit Download
apt DIR
- drwxr-xr-x 2025-12-11 06:41:58
Edit Download
- drwxr-xr-x 2025-12-11 06:41:58
Edit Download
- drwxr-xr-x 2025-12-11 06:41:58
Edit Download
- drwxr-xr-x 2025-12-11 06:41:58
Edit Download
attr DIR
- drwxr-xr-x 2022-08-09 11:56:57
Edit Download
- drwxr-xr-x 2022-08-09 11:56:44
Edit Download
automat DIR
- drwxr-xr-x 2022-08-09 11:58:22
Edit Download
- drwxr-xr-x 2022-08-09 11:58:19
Edit Download
babel DIR
- drwxr-xr-x 2022-08-09 11:56:59
Edit Download
- drwxr-xr-x 2022-08-09 11:56:44
Edit Download
bcrypt DIR
- drwxr-xr-x 2022-08-09 11:58:22
Edit Download
- drwxr-xr-x 2022-08-09 11:58:18
Edit Download
blinker DIR
- drwxr-xr-x 2022-08-09 11:56:56
Edit Download
certbot DIR
- drwxr-xr-x 2023-04-05 06:35:49
Edit Download
- drwxr-xr-x 2023-04-05 06:35:48
Edit Download
- drwxr-xr-x 2023-04-05 06:35:50
Edit Download
- drwxr-xr-x 2023-04-05 06:35:48
Edit Download
certifi DIR
- drwxr-xr-x 2022-08-09 11:56:53
Edit Download
- drwxr-xr-x 2022-08-09 11:56:44
Edit Download
chardet DIR
- drwxr-xr-x 2022-08-09 11:58:56
Edit Download
- drwxr-xr-x 2022-08-09 11:58:56
Edit Download
click DIR
- drwxr-xr-x 2022-08-09 11:57:00
Edit Download
- drwxr-xr-x 2022-08-09 11:56:38
Edit Download
cloudinit DIR
- drwxr-xr-x 2025-08-01 06:35:22
Edit Download
- drwxr-xr-x 2025-08-01 06:35:21
Edit Download
colorama DIR
- drwxr-xr-x 2022-08-09 11:56:59
Edit Download
- drwxr-xr-x 2022-08-09 11:56:38
Edit Download
- drwxr-xr-x 2022-08-09 11:58:08
Edit Download
- drwxr-xr-x 2023-04-05 06:35:47
Edit Download
- drwxr-xr-x 2024-10-09 06:35:29
Edit Download
- drwxr-xr-x 2022-08-09 11:58:23
Edit Download
- drwxr-xr-x 2022-08-09 11:58:19
Edit Download
- drwxr-xr-x 2026-03-21 06:19:41
Edit Download
- drwxr-xr-x 2026-03-21 06:19:41
Edit Download
dbus DIR
- drwxr-xr-x 2022-08-09 11:56:57
Edit Download
- drwxr-xr-x 2022-08-09 11:56:40
Edit Download
debian DIR
- drwxr-xr-x 2024-03-05 04:28:23
Edit Download
- drwxr-xr-x 2024-03-05 04:28:23
Edit Download
distro DIR
- drwxr-xr-x 2022-08-09 11:56:57
Edit Download
- drwxr-xr-x 2022-08-09 11:56:41
Edit Download
- drwxr-xr-x 2024-03-05 04:27:41
Edit Download
- drwxr-xr-x 2024-03-05 04:28:42
Edit Download
gi DIR
- drwxr-xr-x 2022-08-09 11:56:53
Edit Download
gyp DIR
- drwxr-xr-x 2023-12-27 11:26:22
Edit Download
- drwxr-xr-x 2023-12-27 11:26:12
Edit Download
hamcrest DIR
- drwxr-xr-x 2022-08-09 11:58:22
Edit Download
httplib2 DIR
- drwxr-xr-x 2022-08-09 11:56:55
Edit Download
- drwxr-xr-x 2022-08-09 11:56:41
Edit Download
- drwxr-xr-x 2024-03-05 04:28:42
Edit Download
hyperlink DIR
- drwxr-xr-x 2022-08-09 11:58:23
Edit Download
- drwxr-xr-x 2022-08-09 11:58:19
Edit Download
icu DIR
- drwxr-xr-x 2023-04-05 06:35:48
Edit Download
idna DIR
- drwxr-xr-x 2024-05-23 06:17:20
Edit Download
- drwxr-xr-x 2024-05-23 06:17:20
Edit Download
- drwxr-xr-x 2022-08-09 11:57:02
Edit Download
- drwxr-xr-x 2022-08-09 11:56:38
Edit Download
- drwxr-xr-x 2022-08-09 11:58:22
Edit Download
- drwxr-xr-x 2022-08-09 11:58:19
Edit Download
janitor DIR
- drwxr-xr-x 2024-03-05 04:28:42
Edit Download
jeepney DIR
- drwxr-xr-x 2022-08-09 11:56:54
Edit Download
- drwxr-xr-x 2022-08-09 11:56:41
Edit Download
jinja2 DIR
- drwxr-xr-x 2025-03-28 10:49:42
Edit Download
- drwxr-xr-x 2025-03-28 10:49:42
Edit Download
josepy DIR
- drwxr-xr-x 2023-04-05 06:35:49
Edit Download
- drwxr-xr-x 2023-04-05 06:35:47
Edit Download
- drwxr-xr-x 2022-08-09 11:56:44
Edit Download
- drwxr-xr-x 2022-08-09 11:56:44
Edit Download
- drwxr-xr-x 2022-08-09 11:57:03
Edit Download
- drwxr-xr-x 2022-08-09 11:56:44
Edit Download
jwt DIR
- drwxr-xr-x 2026-04-01 06:52:17
Edit Download
keyring DIR
- drwxr-xr-x 2022-08-09 11:58:58
Edit Download
- drwxr-xr-x 2022-08-09 11:58:58
Edit Download
landscape DIR
- drwxr-xr-x 2022-08-09 11:58:27
Edit Download
- drwxr-xr-x 2022-08-09 11:57:04
Edit Download
- drwxr-xr-x 2022-08-09 11:56:41
Edit Download
lazr DIR
- drwxr-xr-x 2022-08-09 11:56:41
Edit Download
- drwxr-xr-x 2022-08-09 11:56:41
Edit Download
- drwxr-xr-x 2022-08-09 11:56:41
Edit Download
magic DIR
- drwxr-xr-x 2023-03-05 04:21:43
Edit Download
- drwxr-xr-x 2022-08-09 11:56:52
Edit Download
- drwxr-xr-x 2022-08-09 11:56:44
Edit Download
- drwxr-xr-x 2022-08-09 11:56:56
Edit Download
- drwxr-xr-x 2022-08-09 11:56:38
Edit Download
- drwxr-xr-x 2022-08-09 11:56:39
Edit Download
- drwxr-xr-x 2024-11-01 06:42:55
Edit Download
oauthlib DIR
- drwxr-xr-x 2023-03-05 04:16:40
Edit Download
- drwxr-xr-x 2023-03-05 04:16:39
Edit Download
OpenSSL DIR
- drwxr-xr-x 2026-03-26 06:11:47
Edit Download
- drwxr-xr-x 2023-04-05 06:35:48
Edit Download
- drwxr-xr-x 2023-04-05 06:35:47
Edit Download
pexpect DIR
- drwxr-xr-x 2022-08-09 11:58:24
Edit Download
pip DIR
- drwxr-xr-x 2025-09-26 06:49:52
Edit Download
- drwxr-xr-x 2025-09-26 06:49:52
Edit Download
- drwxr-xr-x 2025-05-30 06:09:10
Edit Download
- drwxr-xr-x 2022-08-09 11:58:23
Edit Download
- drwxr-xr-x 2022-08-09 11:58:20
Edit Download
pyasn1 DIR
- drwxr-xr-x 2026-04-01 06:52:27
Edit Download
- drwxr-xr-x 2026-04-01 06:52:27
Edit Download
- drwxr-xr-x 2022-08-09 11:58:24
Edit Download
- drwxr-xr-x 2022-08-09 11:56:40
Edit Download
- drwxr-xr-x 2022-08-09 11:56:53
Edit Download
- drwxr-xr-x 2022-08-09 11:58:18
Edit Download
- drwxr-xr-x 2023-04-05 06:35:48
Edit Download
- drwxr-xr-x 2026-04-01 06:52:17
Edit Download
- drwxr-xr-x 2026-03-26 06:11:46
Edit Download
- drwxr-xr-x 2022-08-09 11:56:41
Edit Download
pyrfc3339 DIR
- drwxr-xr-x 2023-04-05 06:35:49
Edit Download
- drwxr-xr-x 2023-04-05 06:35:47
Edit Download
- drwxr-xr-x 2022-08-09 11:56:55
Edit Download
- drwxr-xr-x 2022-08-09 11:56:44
Edit Download
- drwxr-xr-x 2022-08-09 11:56:44
Edit Download
- drwxr-xr-x 2025-12-11 06:41:58
Edit Download
- drwxr-xr-x 2024-03-05 04:27:41
Edit Download
- drwxr-xr-x 2023-03-05 04:21:39
Edit Download
pytz DIR
- drwxr-xr-x 2024-03-05 04:28:20
Edit Download
- drwxr-xr-x 2024-03-05 04:28:01
Edit Download
- drwxr-xr-x 2022-08-09 11:56:39
Edit Download
Quirks DIR
- drwxr-xr-x 2024-11-01 06:42:55
Edit Download
requests DIR
- drwxr-xr-x 2025-06-17 06:21:23
Edit Download
- drwxr-xr-x 2025-06-17 06:21:23
Edit Download
- drwxr-xr-x 2023-04-05 06:35:48
Edit Download
- drwxr-xr-x 2023-04-05 06:35:47
Edit Download
- drwxr-xr-x 2022-08-09 11:57:03
Edit Download
- drwxr-xr-x 2022-08-09 11:56:41
Edit Download
serial DIR
- drwxr-xr-x 2022-08-09 11:56:52
Edit Download
- drwxr-xr-x 2022-08-09 11:58:24
Edit Download
- drwxr-xr-x 2022-08-09 11:58:19
Edit Download
- drwxr-xr-x 2025-05-30 06:09:10
Edit Download
- drwxr-xr-x 2025-05-30 06:09:10
Edit Download
- drwxr-xr-x 2022-08-09 11:56:41
Edit Download
- drwxr-xr-x 2024-03-05 04:28:32
Edit Download
sos DIR
- drwxr-xr-x 2024-03-05 04:28:24
Edit Download
- drwxr-xr-x 2024-03-05 04:28:02
Edit Download
- drwxr-xr-x 2022-08-09 11:58:58
Edit Download
- drwxr-xr-x 2022-08-09 11:58:58
Edit Download
- drwxr-xr-x 2023-09-26 09:34:57
Edit Download
- drwxr-xr-x 2023-09-26 09:34:57
Edit Download
systemd DIR
- drwxr-xr-x 2022-08-09 11:56:55
Edit Download
twisted DIR
- drwxr-xr-x 2024-11-29 06:13:54
Edit Download
- drwxr-xr-x 2024-11-29 06:13:54
Edit Download
uaclient DIR
- drwxr-xr-x 2023-03-05 04:21:49
Edit Download
- drwxr-xr-x 2024-11-01 06:42:55
Edit Download
- drwxr-xr-x 2023-03-05 04:21:35
Edit Download
- drwxr-xr-x 2024-11-01 06:42:55
Edit Download
ufw DIR
- drwxr-xr-x 2024-03-05 04:28:30
Edit Download
- drwxr-xr-x 2022-08-09 11:58:58
Edit Download
- drwxr-xr-x 2024-03-05 04:28:42
Edit Download
urllib3 DIR
- drwxr-xr-x 2026-01-21 06:39:44
Edit Download
- drwxr-xr-x 2026-01-21 06:39:44
Edit Download
wadllib DIR
- drwxr-xr-x 2022-08-09 11:57:02
Edit Download
- drwxr-xr-x 2022-08-09 11:56:41
Edit Download
wheel DIR
- drwxr-xr-x 2024-11-18 06:17:30
Edit Download
- drwxr-xr-x 2024-11-18 06:17:29
Edit Download
xkit DIR
- drwxr-xr-x 2022-08-09 11:56:55
Edit Download
yaml DIR
- drwxr-xr-x 2022-08-09 11:57:00
Edit Download
- drwxr-xr-x 2024-07-24 06:36:38
Edit Download
zope DIR
- drwxr-xr-x 2023-04-05 06:35:47
Edit Download
- drwxr-xr-x 2023-04-05 06:35:47
Edit Download
- drwxr-xr-x 2023-04-05 06:35:47
Edit Download
- drwxr-xr-x 2023-04-05 06:35:47
Edit Download
- drwxr-xr-x 2022-08-09 11:58:19
Edit Download
- drwxr-xr-x 2025-05-30 06:09:10
Edit Download
_yaml DIR
- drwxr-xr-x 2022-08-09 11:57:00
Edit Download
- drwxr-xr-x 2025-08-06 06:56:20
Edit Download
7.87 KB lrw-r--r-- 2024-07-10 11:56:21
Edit Download
58.66 KB lrw-r--r-- 2025-12-05 17:18:12
Edit Download
338.96 KB lrw-r--r-- 2025-12-05 17:18:12
Edit Download
23.00 KB lrw-r--r-- 2014-08-31 17:18:32
Edit Download
3.81 KB lrw-r--r-- 2021-10-25 17:42:40
Edit Download
189 B lrw-r--r-- 2021-12-08 10:53:19
Edit Download
48.71 KB lrw-r--r-- 2021-10-03 00:15:57
Edit Download
87.51 KB lrw-r--r-- 2024-09-20 11:44:09
Edit Download
273 B lrw-r--r-- 2022-01-16 08:42:45
Edit Download
6.61 KB lrw-r--r-- 2022-02-20 14:42:49
Edit Download
12.23 KB lrw-r--r-- 2023-11-28 12:16:46
Edit Download
28.14 KB lrw-r--r-- 2021-03-13 19:14:39
Edit Download
9.57 KB lrw-r--r-- 2018-01-16 15:18:26
Edit Download
14.55 KB lrw-r--r-- 2019-08-25 21:11:20
Edit Download
22.69 KB lrw-r--r-- 2022-03-24 16:20:50
Edit Download
2.23 KB lrw-r--r-- 2021-08-09 10:01:12
Edit Download
26.24 KB lrw-r--r-- 2024-07-10 11:56:21
Edit Download
36.67 KB lrw-r--r-- 2022-03-17 19:43:33
Edit Download
1.68 KB lrw-r--r-- 2020-04-05 00:09:23
Edit Download
266.96 KB lrw-r--r-- 2020-03-31 02:48:57
Edit Download
238 B lrw-r--r-- 2019-10-17 02:17:14
Edit Download
33.74 KB lrw-r--r-- 2021-05-05 14:17:58
Edit Download
30.40 KB lrw-r--r-- 2022-03-17 19:30:58
Edit Download
586 B lrw-r--r-- 2022-03-17 20:07:36
Edit Download
263 B lrw-r--r-- 2023-07-17 13:55:25
Edit Download
46.14 KB lrw-r--r-- 2024-09-20 11:44:09
Edit Download
266 B lrw-r--r-- 2022-03-24 08:20:37
Edit Download
6.75 KB lrw-r--r-- 2024-07-21 14:26:39
Edit Download
529 B lrw-r--r-- 2019-09-21 12:28:11
Edit Download
529 B lrw-r--r-- 2020-06-14 21:11:35
Edit Download
529 B lrw-r--r-- 2022-03-17 20:18:09
Edit Download
529 B lrw-r--r-- 2022-03-17 17:51:23
Edit Download
189.91 KB lrw-r--r-- 2022-03-25 09:57:34
Edit Download
164.21 KB lrw-r--r-- 2022-03-17 17:50:41
Edit Download
22.50 KB lrw-r--r-- 2022-03-17 17:50:41
Edit Download
23 B lrw-r--r-- 2022-01-14 19:50:00
Edit Download
46.77 KB lrw-r--r-- 2022-03-17 19:30:58
Edit Download
21 B lrw-r--r-- 2014-08-26 01:11:36
Edit Download
If ZipArchive is unavailable, a .tar will be created (no compression).