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:
parent
3c749fc867
commit
4aec9a8be2
|
@ -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.
|
||||||
|
|
|
@ -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'))
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue