bpo-29901: Improve support of path-like objects in zipapp. (#815)

Now general path-like objects are supported, not just pathlib.Path.
This commit is contained in:
Serhiy Storchaka 2017-03-25 13:05:23 +02:00 committed by GitHub
parent 3c749fc867
commit 4aec9a8be2
3 changed files with 11 additions and 11 deletions

View File

@ -103,11 +103,11 @@ The module defines two convenience functions:
Create an application archive from *source*. The source can be any Create an application archive from *source*. The source can be any
of the following: of the following:
* The name of a directory, or a :class:`pathlib.Path` object referring * The name of a directory, or a :term:`path-like object` referring
to a directory, in which case a new application archive will be to a directory, in which case a new application archive will be
created from the content of that directory. created from the content of that directory.
* The name of an existing application archive file, or a :class:`pathlib.Path` * The name of an existing application archive file, or a :term:`path-like object`
object referring to such a file, in which case the file is copied to referring to such a file, in which case the file is copied to
the target (modifying it to reflect the value given for the *interpreter* the target (modifying it to reflect the value given for the *interpreter*
argument). The file name should include the ``.pyz`` extension, if required. argument). The file name should include the ``.pyz`` extension, if required.
* A file object open for reading in bytes mode. The content of the * A file object open for reading in bytes mode. The content of the
@ -117,7 +117,7 @@ The module defines two convenience functions:
The *target* argument determines where the resulting archive will be The *target* argument determines where the resulting archive will be
written: written:
* If it is the name of a file, or a :class:`pathlb.Path` object, * If it is the name of a file, or a :term:`path-like object`,
the archive will be written to that file. the archive will be written to that file.
* If it is an open file object, the archive will be written to that * If it is an open file object, the archive will be written to that
file object, which must be open for writing in bytes mode. file object, which must be open for writing in bytes mode.

View File

@ -36,9 +36,7 @@ class ZipAppError(ValueError):
@contextlib.contextmanager @contextlib.contextmanager
def _maybe_open(archive, mode): def _maybe_open(archive, mode):
if isinstance(archive, pathlib.Path): if isinstance(archive, (str, os.PathLike)):
archive = str(archive)
if isinstance(archive, str):
with open(archive, mode) as f: with open(archive, mode) as f:
yield f yield f
else: else:
@ -135,10 +133,9 @@ def create_archive(source, target=None, interpreter=None, main=None):
with _maybe_open(target, 'wb') as fd: with _maybe_open(target, 'wb') as fd:
_write_file_prefix(fd, interpreter) _write_file_prefix(fd, interpreter)
with zipfile.ZipFile(fd, 'w') as z: with zipfile.ZipFile(fd, 'w') as z:
root = pathlib.Path(source) for child in source.rglob('*'):
for child in root.rglob('*'): arcname = child.relative_to(source).as_posix()
arcname = str(child.relative_to(root)) z.write(child, arcname)
z.write(str(child), arcname)
if main_py: if main_py:
z.writestr('__main__.py', main_py.encode('utf-8')) z.writestr('__main__.py', main_py.encode('utf-8'))

View File

@ -291,6 +291,9 @@ Extension Modules
Library Library
------- -------
- bpo-29901: The zipapp module now supports general path-like objects, not
just pathlib.Path.
- bpo-25803: Avoid incorrect errors raised by Path.mkdir(exist_ok=True) - bpo-25803: Avoid incorrect errors raised by Path.mkdir(exist_ok=True)
when the OS gives priority to errors such as EACCES over EEXIST. when the OS gives priority to errors such as EACCES over EEXIST.