← Back
Editing: zipp.cpython-311.pyc
� )h � � � d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl Z e Zd� Zd� Z G d� d� � Z G d� d� � ZdS ) � )�divisionNc �H � t j 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��paths �&/usr/lib/python3/dist-packages/zipp.py�_parentsr s � � ��I�d�O�O�Q��5�5�5� c # �� K � | � t j � � } | r?| t j k r3| V � t j | � � \ } }| r| t j k �-dS 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 �tails r r r % s� � � � � �;�;�y�}�%�%�D� � +�4�9�=�(�(�� � � ��_�T�*�*� ��d� � +�4�9�=�(�(�(�(� +� +� +� +�(�(r c �8 � � e Zd ZdZ� fd�Zed� � � Z� xZS )�SanitizedNamesz7 ZipFile mix-in to ensure names are sanitized. c � �� t t | j t � � � � � � � � � S �N)�list�map� _sanitize�super�namelist)�self� __class__s �r r zSanitizedNames.namelist? s- �� ��C������(8�(8�(:�(:�;�;�<�<�<r c �@ � d� }t j dd| t j �� � }|� dd� � }|� d� � }d� t ||� � � � }|st d� � �|d| � d� � z z 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 � � | o| dvS )N> �..�.� )�parts r �allowedz)SanitizedNames._sanitize.<locals>.allowedf s � ��3�D��3�3r z ^([A-Z]):z\1)�flags�\�/zEmpty filename) �re�sub� IGNORECASE�replacer �join�filter� ValueError�endswith)�namer% �bare�clean�parts�joineds r r zSanitizedNames._sanitizeB s� � �H 4� 4� 4� �v�k�5�$�b�m�D�D�D�����T�3�'�'�����C� � �����&��%�0�0�1�1��� /��-�.�.�.���d�m�m�C�0�0�0�0�0r )�__name__� __module__�__qualname__�__doc__r �staticmethodr � __classcell__)r s @r r r : s] �� � � � � �� �=� =� =� =� =� �.1� .1� �\�.1� .1� .1� .1� .1r r c � � e Zd ZdZdZdd�Zed� � � Zed� � � Z ed� � � Z d� Zd � Zd � Z d� Zd� Zd � Zd� Zd� Zd� Zd� Zd� ZeZed� � � Zed� � � Zed� � � Zd� Zej dk reZdS dS )�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 � � t |t j � � r|n&t j | � |� � � � | _ || _ d S r )� isinstance�zipfile�ZipFile�_pathlib_compat�root�at)r rD rE s r �__init__z Path.__init__� sK � � �$���0�0� =�D�D����!5�!5�d�!;�!;�<�<� � � ����r c �j � | � � � S # t $ r t | � � cY S w xY w)zu For path-like objects, convert to a filename for compatibility on Python 3.6.1 and earlier. )� __fspath__�AttributeError�strr s r rC zPath._pathlib_compat� sD � � ��?�?�$�$�$��� � � ��t�9�9���� ���s � �2�2c �J � t j | j j | j � � S r )� functools�partialrD �openrE �r s r rN z Path.open� s � �� ������9�9�9r c �Z � t j | j � d� � � � S �Nr( )r �basenamerE r rO s r r1 z Path.name� s! � ��!�$�'�.�.��"5�"5�6�6�6r c � � | � � � 5 }t j |g|�R i |��� � � cd d d � � S # 1 swxY w Y d S r )rN �io� TextIOWrapper�read)r �args�kwargs�strms r � read_textzPath.read_text� s� � � �Y�Y�[�[� B�D��#�D�:�4�:�:�:�6�:�:�?�?�A�A� B� B� B� B� B� B� B� B� B� B� B� B���� B� B� B� B� B� Bs �'A � A �A c � � | � � � 5 }|� � � cd d d � � S # 1 swxY w Y d S r )rN rV )r rY s r � read_byteszPath.read_bytes� s| � � �Y�Y�[�[� �D��9�9�;�;� � � � � � � � � � � � ���� � � � � � s �6�:�:c � � t j |j � d� � � � | j � d� � k S rQ )r �dirnamerE r )r r s r � _is_childzPath._is_child� s4 � �� ������!4�!4�5�5������9L�9L�L�Lr c �, � t | j |� � S r )r= rD )r rE s r �_nextz Path._next� s � ��D�I�r�"�"�"r c �F � | j p| j � d� � S rQ )rE r0 rO s r �is_dirzPath.is_dir� s! � ��7�{�3�d�g�.�.�s�3�3�3r c �, � | � � � S r )rc rO s r �is_filezPath.is_file� s � ��;�;�=�=� � r c �8 � | j | � � � v S r )rE �_namesrO s r �existszPath.exists� s � ��w�$�+�+�-�-�'�'r c � � | � � � st d� � �t | j | � � � � � }t | j |� � S )NzCan't listdir a file)rc r/ r ra rg r. r_ )r �subss r �iterdirzPath.iterdir� sL � ��{�{�}�}� 5��3�4�4�4��4�:�t�{�{�}�}�-�-���d�n�d�+�+�+r c �J � t j | j j | j � � S r )r r- rD �filenamerE rO s r �__str__zPath.__str__� s � ��~�d�i�0�$�'�:�:�:r c �8 � | j � | �� � S )NrO )�_Path__repr�formatrO s r �__repr__z Path.__repr__� s � ��{�!�!�t�!�,�,�,r c � � | � |� � }t j | j |� � }t j | j |d� � }| � � � }| � ||vr||v r|n|� � S )Nr>