]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #21650: Add an `--sort-keys` option to json.tool CLI.
authorBerker Peksag <berker.peksag@gmail.com>
Mon, 10 Nov 2014 07:56:54 +0000 (09:56 +0200)
committerBerker Peksag <berker.peksag@gmail.com>
Mon, 10 Nov 2014 07:56:54 +0000 (09:56 +0200)
Doc/library/json.rst
Doc/whatsnew/3.5.rst
Lib/json/tool.py
Lib/test/test_json/test_tool.py
Misc/NEWS

index cff0c727c95d34fcf12d986a2608ec35a7b644a6..edbc5e0bd5a80ef8c0d12d05766b3c662a7c9ad9 100644 (file)
@@ -567,6 +567,7 @@ the last name-value pair for a given name::
 The *object_pairs_hook* parameter can be used to alter this behavior.
 
 .. highlight:: bash
+.. module:: json.tool
 
 .. _json-commandline:
 
@@ -586,6 +587,10 @@ specified, :attr:`sys.stdin` and :attr:`sys.stdout` will be used respectively::
     $ echo '{1.2:3.4}' | python -m json.tool
     Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
 
+.. versionchanged:: 3.5
+   The output is now in the same order as the input. Use the
+   :option:`--sort-keys` option to sort the output of dictionaries
+   alphabetically by key.
 
 Command line options
 ^^^^^^^^^^^^^^^^^^^^
@@ -613,6 +618,12 @@ Command line options
    Write the output of the *infile* to the given *outfile*. Otherwise, write it
    to :attr:`sys.stdout`.
 
+.. cmdoption:: --sort-keys
+
+   Sort the output of dictionaries alphabetically by key.
+
+   .. versionadded:: 3.5
+
 .. cmdoption:: -h, --help
 
    Show the help message.
index 51fcb593d43f9b7e49931a4f708d6ce2b1b267b2..502ac44030b23ecf9d5e1b9b51fc3ec3a26f49a3 100644 (file)
@@ -211,6 +211,14 @@ ipaddress
   network objects from existing addresses.  (Contributed by Peter Moody
   and Antoine Pitrou in :issue:`16531`.)
 
+json
+----
+
+* The output of :mod:`json.tool` command line interface is now in the same
+  order as the input. Use the :option:`--sort-keys` option to sort the output
+  of dictionaries alphabetically by key.  (Contributed by Berker Peksag in
+  :issue:`21650`.)
+
 os
 --
 
index cd57e4f5ae0a33cfaadcf681a69774e83acda283..4f3182c0c1e7f11396e252f435fd6e63c4975a0d 100644 (file)
@@ -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')
 
 
index 5484a8a7ca105fb820433416c2ebdb2d30174a28..bd63e2b311194141d311b05a772bfd9c6bbec243 100644 (file)
@@ -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'')
index 914f4671baf3ebc32389dcc65d526920607f4af3..53040b264992289622205a3664d1d7a0dd389192 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -183,6 +183,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #21650: Add an `--sort-keys` option to json.tool CLI.
+
 - Issues #814253, #9179: Group references and conditional group references now
   work in lookbehind assertions in regular expressions.