From 1e17d4aaff5c7ca972bab437949d2bb51c5b30f7 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Tue, 30 Jan 2018 09:03:12 -0800 Subject: [PATCH] compare with difflib not diff(1) (GH-5450) --- Lib/lib2to3/tests/test_parser.py | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/Lib/lib2to3/tests/test_parser.py b/Lib/lib2to3/tests/test_parser.py index 15f5b63f1f1..0cbba26bec0 100644 --- a/Lib/lib2to3/tests/test_parser.py +++ b/Lib/lib2to3/tests/test_parser.py @@ -12,6 +12,7 @@ from .support import driver, driver_no_print_statement from test.support import verbose # Python imports +import difflib import importlib import operator import os @@ -429,8 +430,8 @@ class TestParserIdempotency(support.TestCase): except ParseError as err: self.fail('ParseError on file %s (%s)' % (filepath, err)) new = str(tree) - x = diff(filepath, new, encoding=encoding) - if x: + if new != source: + print(diff_texts(source, new, filepath)) self.fail("Idempotency failed: %s" % filepath) def test_extended_unpacking(self): @@ -480,17 +481,12 @@ class TestGeneratorExpressions(GrammarTest): self.validate("set(x for x in [],)") -def diff(fn, result, encoding='utf-8'): - try: - with open('@', 'w', encoding=encoding, newline='\n') as f: - f.write(str(result)) - fn = fn.replace('"', '\\"') - return subprocess.call(['diff', '-u', fn, '@'], stdout=(subprocess.DEVNULL if verbose < 1 else None)) - finally: - try: - os.remove("@") - except OSError: - pass +def diff_texts(a, b, filename): + a = a.splitlines() + b = b.splitlines() + return difflib.unified_diff(a, b, filename, filename, + "(original)", "(reserialized)", + lineterm="") if __name__ == '__main__':