summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Himmelstein <daniel.himmelstein@gmail.com>2019-12-07 14:14:40 (GMT)
committerInada Naoki <songofacandy@gmail.com>2019-12-07 14:14:40 (GMT)
commit15fb7fa88187f5841088721a43609bffe64a8dc7 (patch)
treedf7fccd740a6002f7dcffdeed1ecff9c910c9582
parent4443450fdaf248427cf4a00a6ee36229e6402ec6 (diff)
downloadcpython-15fb7fa88187f5841088721a43609bffe64a8dc7.zip
cpython-15fb7fa88187f5841088721a43609bffe64a8dc7.tar.gz
cpython-15fb7fa88187f5841088721a43609bffe64a8dc7.tar.bz2
bpo-29636: json.tool: Add document for indentation options. (GH-17482)
And updated test to use subprocess.run
-rw-r--r--Doc/library/json.rst6
-rw-r--r--Lib/json/tool.py3
-rw-r--r--Lib/test/test_json/test_tool.py60
3 files changed, 35 insertions, 34 deletions
diff --git a/Doc/library/json.rst b/Doc/library/json.rst
index 573ec1c..cfe68c9 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 5542ce4..6d7d9a0 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 54800ae..c9a969b 100644
--- a/Lib/test/test_json/test_tool.py
+++ b/Lib/test/test_json/test_tool.py
@@ -2,7 +2,7 @@ import os
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 @@ class TestTool(unittest.TestCase):
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 @@ class TestTool(unittest.TestCase):
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":"💩"}')