diff options
author | Berker Peksag <berker.peksag@gmail.com> | 2014-11-10 07:56:54 (GMT) |
---|---|---|
committer | Berker Peksag <berker.peksag@gmail.com> | 2014-11-10 07:56:54 (GMT) |
commit | 39e4c4d873927b902c53aeb0e2e15c12d2678e1b (patch) | |
tree | 8fc68f205c657f36ec637d658cc1b1a1aeae38fd /Lib | |
parent | ffd842e1d6736d48d45e741e2006a181c9ad4272 (diff) | |
download | cpython-39e4c4d873927b902c53aeb0e2e15c12d2678e1b.zip cpython-39e4c4d873927b902c53aeb0e2e15c12d2678e1b.tar.gz cpython-39e4c4d873927b902c53aeb0e2e15c12d2678e1b.tar.bz2 |
Issue #21650: Add an `--sort-keys` option to json.tool CLI.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/json/tool.py | 12 | ||||
-rw-r--r-- | Lib/test/test_json/test_tool.py | 33 |
2 files changed, 42 insertions, 3 deletions
diff --git a/Lib/json/tool.py b/Lib/json/tool.py index cd57e4f..4f3182c 100644 --- a/Lib/json/tool.py +++ b/Lib/json/tool.py @@ -11,6 +11,7 @@ Usage:: """ import argparse +import collections import json import sys @@ -24,17 +25,24 @@ def main(): help='a JSON file to be validated or pretty-printed') parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'), help='write the output of infile to outfile') + parser.add_argument('--sort-keys', action='store_true', default=False, + help='sort the output of dictionaries alphabetically by key') options = parser.parse_args() infile = options.infile or sys.stdin outfile = options.outfile or sys.stdout + sort_keys = options.sort_keys with infile: try: - obj = json.load(infile) + if sort_keys: + obj = json.load(infile) + else: + obj = json.load(infile, + object_pairs_hook=collections.OrderedDict) except ValueError as e: raise SystemExit(e) with outfile: - json.dump(obj, outfile, sort_keys=True, indent=4) + json.dump(obj, outfile, sort_keys=sort_keys, indent=4) outfile.write('\n') diff --git a/Lib/test/test_json/test_tool.py b/Lib/test/test_json/test_tool.py index 5484a8a..bd63e2b 100644 --- a/Lib/test/test_json/test_tool.py +++ b/Lib/test/test_json/test_tool.py @@ -6,6 +6,7 @@ import subprocess from test import support from test.script_helper import assert_python_ok + class TestTool(unittest.TestCase): data = """ @@ -15,7 +16,7 @@ class TestTool(unittest.TestCase): :"yes"} ] """ - expect = textwrap.dedent("""\ + expect_without_sort_keys = textwrap.dedent("""\ [ [ "blorpie" @@ -37,6 +38,28 @@ class TestTool(unittest.TestCase): ] """) + expect = textwrap.dedent("""\ + [ + [ + "blorpie" + ], + [ + "whoops" + ], + [], + "d-shtaeou", + "d-nthiouh", + "i-vhbjkhnth", + { + "nifty": 87 + }, + { + "morefield": false, + "field": "yes" + } + ] + """) + def test_stdin_stdout(self): with subprocess.Popen( (sys.executable, '-m', 'json.tool'), @@ -75,3 +98,11 @@ class TestTool(unittest.TestCase): self.assertEqual(rc, 0) self.assertTrue(out.startswith(b'usage: ')) self.assertEqual(err, b'') + + def test_sort_keys_flag(self): + infile = self._create_infile() + rc, out, err = assert_python_ok('-m', 'json.tool', '--sort-keys', infile) + self.assertEqual(rc, 0) + self.assertEqual(out.splitlines(), + self.expect_without_sort_keys.encode().splitlines()) + self.assertEqual(err, b'') |