[Python-checkins] cpython (3.6): Issue #28226: compileall now supports pathlib
berker.peksag
python-checkins at python.org
Fri Sep 30 17:52:47 EDT 2016
https://hg.python.org/cpython/rev/a6f0cc1820f4
changeset: 104191:a6f0cc1820f4
branch: 3.6
parent: 104189:c729a62d4ec5
user: Berker Peksag <berker.peksag at gmail.com>
date: Sat Oct 01 00:54:18 2016 +0300
summary:
Issue #28226: compileall now supports pathlib
files:
Doc/library/compileall.rst | 6 ++++++
Lib/compileall.py | 4 ++++
Lib/test/test_compileall.py | 23 +++++++++++++++++++++++
Misc/NEWS | 2 ++
4 files changed, 35 insertions(+), 0 deletions(-)
diff --git a/Doc/library/compileall.rst b/Doc/library/compileall.rst
--- a/Doc/library/compileall.rst
+++ b/Doc/library/compileall.rst
@@ -153,6 +153,9 @@
The *legacy* parameter only writes out ``.pyc`` files, not ``.pyo`` files
no matter what the value of *optimize* is.
+ .. versionchanged:: 3.6
+ Accepts a :term:`path-like object`.
+
.. function:: compile_file(fullname, ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1)
Compile the file with path *fullname*. Return a true value if the file
@@ -221,6 +224,9 @@
import re
compileall.compile_dir('Lib/', rx=re.compile(r'[/\\][.]svn'), force=True)
+ # pathlib.Path objects can also be used.
+ import pathlib
+ compileall.compile_dir(pathlib.Path('Lib/'), force=True)
.. seealso::
diff --git a/Lib/compileall.py b/Lib/compileall.py
--- a/Lib/compileall.py
+++ b/Lib/compileall.py
@@ -25,6 +25,8 @@
__all__ = ["compile_dir","compile_file","compile_path"]
def _walk_dir(dir, ddir=None, maxlevels=10, quiet=0):
+ if quiet < 2 and isinstance(dir, os.PathLike):
+ dir = os.fspath(dir)
if not quiet:
print('Listing {!r}...'.format(dir))
try:
@@ -105,6 +107,8 @@
optimize: optimization level or -1 for level of the interpreter
"""
success = True
+ if quiet < 2 and isinstance(fullname, os.PathLike):
+ fullname = os.fspath(fullname)
name = os.path.basename(fullname)
if ddir is not None:
dfile = os.path.join(ddir, name)
diff --git a/Lib/test/test_compileall.py b/Lib/test/test_compileall.py
--- a/Lib/test/test_compileall.py
+++ b/Lib/test/test_compileall.py
@@ -102,6 +102,22 @@
self.assertFalse(compileall.compile_dir(self.directory,
force=False, quiet=2))
+ def test_compile_file_pathlike(self):
+ self.assertFalse(os.path.isfile(self.bc_path))
+ # we should also test the output
+ with support.captured_stdout() as stdout:
+ self.assertTrue(compileall.compile_file(pathlib.Path(self.source_path)))
+ self.assertEqual(stdout.getvalue(),
+ "Compiling '{}'...\n".format(self.source_path))
+ self.assertTrue(os.path.isfile(self.bc_path))
+
+ def test_compile_file_pathlike_ddir(self):
+ self.assertFalse(os.path.isfile(self.bc_path))
+ self.assertTrue(compileall.compile_file(pathlib.Path(self.source_path),
+ ddir=pathlib.Path('ddir_path'),
+ quiet=2))
+ self.assertTrue(os.path.isfile(self.bc_path))
+
def test_compile_path(self):
with test.test_importlib.util.import_state(path=[self.directory]):
self.assertTrue(compileall.compile_path(quiet=2))
@@ -138,6 +154,13 @@
optimization=opt)
self.assertTrue(os.path.isfile(cached3))
+ def test_compile_dir_pathlike(self):
+ self.assertFalse(os.path.isfile(self.bc_path))
+ with support.captured_stdout() as stdout:
+ compileall.compile_dir(pathlib.Path(self.directory))
+ self.assertIn("Listing '{}'...".format(self.directory), stdout.getvalue())
+ self.assertTrue(os.path.isfile(self.bc_path))
+
@mock.patch('compileall.ProcessPoolExecutor')
def test_compile_pool_called(self, pool_mock):
compileall.compile_dir(self.directory, quiet=True, workers=5)
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -46,6 +46,8 @@
Library
-------
+- Issue #28226: compileall now supports pathlib.
+
- Issue #28314: Fix function declaration (C flags) for the getiterator() method
of xml.etree.ElementTree.Element.
--
Repository URL: https://hg.python.org/cpython
More information about the Python-checkins
mailing list