diff --git a/Doc/library/json.rst b/Doc/library/json.rst index 573ec1cb77dd6e..cfe68c9dd91d07 100644 --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -744,6 +744,12 @@ Command line options .. versionadded:: 3.8 +.. cmdoption:: --indent, --tab, --no-indent, --compact + + Mutually exclusive options for whitespace control + + .. versionadded:: 3.9 + .. cmdoption:: -h, --help Show the help message. diff --git a/Lib/json/tool.py b/Lib/json/tool.py index 5542ce48c38023..6d7d9a002e5c24 100644 --- a/Lib/json/tool.py +++ b/Lib/json/tool.py @@ -33,7 +33,8 @@ def main(): parser.add_argument('--no-ensure-ascii', dest='ensure_ascii', action='store_false', help='disable escaping of non-ASCII characters') parser.add_argument('--json-lines', action='store_true', default=False, - help='parse input using the jsonlines format') + help='parse input using the JSON Lines format. ' + 'Use with --no-indent or --compact to produce valid JSON Lines output.') group = parser.add_mutually_exclusive_group() group.add_argument('--indent', default=4, type=int, help='separate items with newlines and use this number ' diff --git a/Lib/test/test_json/test_tool.py b/Lib/test/test_json/test_tool.py index 54800ae840c64c..c9a969b303398e 100644 --- a/Lib/test/test_json/test_tool.py +++ b/Lib/test/test_json/test_tool.py @@ -2,7 +2,7 @@ import sys import textwrap import unittest -from subprocess import Popen, PIPE +import subprocess from test import support from test.support.script_helper import assert_python_ok @@ -84,10 +84,9 @@ class TestTool(unittest.TestCase): def test_stdin_stdout(self): args = sys.executable, '-m', 'json.tool' - with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: - out, err = proc.communicate(self.data.encode()) - self.assertEqual(out.splitlines(), self.expect.encode().splitlines()) - self.assertEqual(err, b'') + process = subprocess.run(args, input=self.data, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, self.expect) + self.assertEqual(process.stderr, '') def _create_infile(self, data=None): infile = support.TESTFN @@ -131,10 +130,9 @@ def test_infile_outfile(self): def test_jsonlines(self): args = sys.executable, '-m', 'json.tool', '--json-lines' - with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: - out, err = proc.communicate(self.jsonlines_raw.encode()) - self.assertEqual(out.splitlines(), self.jsonlines_expect.encode().splitlines()) - self.assertEqual(err, b'') + process = subprocess.run(args, input=self.jsonlines_raw, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, self.jsonlines_expect) + self.assertEqual(process.stderr, '') def test_help_flag(self): rc, out, err = assert_python_ok('-m', 'json.tool', '-h') @@ -151,45 +149,41 @@ def test_sort_keys_flag(self): self.assertEqual(err, b'') def test_indent(self): - json_stdin = b'[1, 2]' + input_ = '[1, 2]' expect = textwrap.dedent('''\ [ 1, 2 ] - ''').encode() + ''') args = sys.executable, '-m', 'json.tool', '--indent', '2' - with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: - json_stdout, err = proc.communicate(json_stdin) - self.assertEqual(expect.splitlines(), json_stdout.splitlines()) - self.assertEqual(err, b'') + process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, expect) + self.assertEqual(process.stderr, '') def test_no_indent(self): - json_stdin = b'[1,\n2]' - expect = b'[1, 2]' + input_ = '[1,\n2]' + expect = '[1, 2]\n' args = sys.executable, '-m', 'json.tool', '--no-indent' - with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: - json_stdout, err = proc.communicate(json_stdin) - self.assertEqual(expect.splitlines(), json_stdout.splitlines()) - self.assertEqual(err, b'') + process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, expect) + self.assertEqual(process.stderr, '') def test_tab(self): - json_stdin = b'[1, 2]' - expect = b'[\n\t1,\n\t2\n]\n' + input_ = '[1, 2]' + expect = '[\n\t1,\n\t2\n]\n' args = sys.executable, '-m', 'json.tool', '--tab' - with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: - json_stdout, err = proc.communicate(json_stdin) - self.assertEqual(expect.splitlines(), json_stdout.splitlines()) - self.assertEqual(err, b'') + process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, expect) + self.assertEqual(process.stderr, '') def test_compact(self): - json_stdin = b'[ 1 ,\n 2]' - expect = b'[1,2]' + input_ = '[ 1 ,\n 2]' + expect = '[1,2]\n' args = sys.executable, '-m', 'json.tool', '--compact' - with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: - json_stdout, err = proc.communicate(json_stdin) - self.assertEqual(expect.splitlines(), json_stdout.splitlines()) - self.assertEqual(err, b'') + process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, expect) + self.assertEqual(process.stderr, '') def test_no_ensure_ascii_flag(self): infile = self._create_infile('{"key":"💩"}')