From 2e33ecd7c9b0cac3efc6fcbdd4547fd086b4e2d1 Mon Sep 17 00:00:00 2001 From: Joannah Nanjekye <33177550+nanjekyejoannah@users.noreply.github.com> Date: Tue, 28 May 2019 13:29:04 -0300 Subject: bpo-22640: Add silent mode to py_compile.compile() (GH-12976) --- Doc/library/py_compile.rst | 10 +++++++++ Doc/whatsnew/3.8.rst | 7 +++++++ Lib/py_compile.py | 24 ++++++++++++++-------- Lib/test/test_py_compile.py | 9 ++++++++ .../2019-04-26-22-13-26.bpo-22640.p3rheW.rst | 2 ++ 5 files changed, 43 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-04-26-22-13-26.bpo-22640.p3rheW.rst diff --git a/Doc/library/py_compile.rst b/Doc/library/py_compile.rst index 8cb5a4d..3824353 100644 --- a/Doc/library/py_compile.rst +++ b/Doc/library/py_compile.rst @@ -42,6 +42,13 @@ byte-code cache files in the directory containing the source code. is raised. This function returns the path to byte-compiled file, i.e. whatever *cfile* value was used. + The *doraise* and *quiet* arguments determine how errors are handled while + compiling file. If *quiet* is 0 or 1, and *doraise* is false, the default + behaviour is enabled: an error string is written to ``sys.stderr``, and the + function returns ``None`` instead of a path. If *doraise* is true, + a :exc:`PyCompileError` is raised instead. However if *quiet* is 2, + no message is written, and *doraise* has no effect. + If the path that *cfile* becomes (either explicitly specified or computed) is a symlink or non-regular file, :exc:`FileExistsError` will be raised. This is to act as a warning that import will turn those paths into regular @@ -82,6 +89,9 @@ byte-code cache files in the directory containing the source code. overrides the value of the *invalidation_mode* argument, and determines its default value instead. + .. versionchanged:: 3.8 + The *quiet* parameter was added. + .. class:: PycInvalidationMode diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index b32cec1..aaa6ffe 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -537,6 +537,13 @@ NSKeyedArchiver-encoded binary plists. (Contributed by Jon Janzen in :issue:`26707`.) +py_compile +---------- + +:func:`py_compile.compile` now supports silent mode. +(Contributed by Joannah Nanjekye in :issue:`22640`.) + + socket ------ diff --git a/Lib/py_compile.py b/Lib/py_compile.py index 8e9dd57..2173689 100644 --- a/Lib/py_compile.py +++ b/Lib/py_compile.py @@ -77,7 +77,7 @@ def _get_default_invalidation_mode(): def compile(file, cfile=None, dfile=None, doraise=False, optimize=-1, - invalidation_mode=None): + invalidation_mode=None, quiet=0): """Byte-compile one Python source file to Python bytecode. :param file: The source file name. @@ -95,6 +95,8 @@ def compile(file, cfile=None, dfile=None, doraise=False, optimize=-1, are -1, 0, 1 and 2. A value of -1 means to use the optimization level of the current interpreter, as given by -O command line options. :param invalidation_mode: + :param quiet: Return full output with False or 0, errors only with 1, + and no output with 2. :return: Path to the resulting byte compiled file. @@ -143,11 +145,12 @@ def compile(file, cfile=None, dfile=None, doraise=False, optimize=-1, _optimize=optimize) except Exception as err: py_exc = PyCompileError(err.__class__, err, dfile or file) - if doraise: - raise py_exc - else: - sys.stderr.write(py_exc.msg + '\n') - return + if quiet < 2: + if doraise: + raise py_exc + else: + sys.stderr.write(py_exc.msg + '\n') + return try: dirname = os.path.dirname(cfile) if dirname: @@ -194,10 +197,12 @@ def main(args=None): compile(filename, doraise=True) except PyCompileError as error: rv = 1 - sys.stderr.write("%s\n" % error.msg) + if quiet < 2: + sys.stderr.write("%s\n" % error.msg) except OSError as error: rv = 1 - sys.stderr.write("%s\n" % error) + if quiet < 2: + sys.stderr.write("%s\n" % error) else: for filename in args: try: @@ -205,7 +210,8 @@ def main(args=None): except PyCompileError as error: # return value to indicate at least one failure rv = 1 - sys.stderr.write("%s\n" % error.msg) + if quiet < 2: + sys.stderr.write("%s\n" % error.msg) return rv if __name__ == "__main__": diff --git a/Lib/test/test_py_compile.py b/Lib/test/test_py_compile.py index f86abe2..d6677ab 100644 --- a/Lib/test/test_py_compile.py +++ b/Lib/test/test_py_compile.py @@ -192,6 +192,15 @@ class PyCompileTestsBase: fp.read(), 'test', {}) self.assertEqual(flags, 0b1) + def test_quiet(self): + bad_coding = os.path.join(os.path.dirname(__file__), 'bad_coding2.py') + with support.captured_stderr() as stderr: + self.assertIsNone(py_compile.compile(bad_coding, doraise=False, quiet=2)) + self.assertIsNone(py_compile.compile(bad_coding, doraise=True, quiet=2)) + self.assertEqual(stderr.getvalue(), '') + with self.assertRaises(py_compile.PyCompileError): + py_compile.compile(bad_coding, doraise=True, quiet=1) + class PyCompileTestsWithSourceEpoch(PyCompileTestsBase, unittest.TestCase, diff --git a/Misc/NEWS.d/next/Library/2019-04-26-22-13-26.bpo-22640.p3rheW.rst b/Misc/NEWS.d/next/Library/2019-04-26-22-13-26.bpo-22640.p3rheW.rst new file mode 100644 index 0000000..8ac6be9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-04-26-22-13-26.bpo-22640.p3rheW.rst @@ -0,0 +1,2 @@ +:func:`py_compile.compile` now supports silent mode. +Patch by Joannah Nanjekye \ No newline at end of file -- cgit v0.12