Commit 4aec9a8b authored by Serhiy Storchaka's avatar Serhiy Storchaka Committed by GitHub

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

Now general path-like objects are supported, not just pathlib.Path.
parent 3c749fc8
...@@ -103,11 +103,11 @@ The module defines two convenience functions: ...@@ -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: ...@@ -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.
......
...@@ -36,9 +36,7 @@ class ZipAppError(ValueError): ...@@ -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): ...@@ -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'))
......
...@@ -291,6 +291,9 @@ Extension Modules ...@@ -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.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment