[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