| from __future__ import print_function |
| |
| import argparse |
| import sys |
| |
| # Versions older than Python 2.6 will need to install ordereddict, |
| # but newer versions will import from the built-in collections module. |
| try: |
| from collections import OrderedDict |
| except ImportError: |
| from ordereddict import OrderedDict |
| |
| import simplejson |
| |
| |
| def _get_pretty_format(contents, indent, sort_keys=True): |
| return simplejson.dumps( |
| simplejson.loads(contents, |
| object_pairs_hook=None if sort_keys else OrderedDict), |
| sort_keys=sort_keys, |
| indent=indent |
| ) + "\n" # dumps don't end with a newline |
| |
| |
| def _autofix(filename, new_contents): |
| print("Fixing file {0}".format(filename)) |
| with open(filename, 'w') as f: |
| f.write(new_contents) |
| |
| |
| def pretty_format_json(argv=None): |
| parser = argparse.ArgumentParser() |
| parser.add_argument( |
| '--autofix', |
| action='store_true', |
| dest='autofix', |
| help='Automatically fixes encountered not-pretty-formatted files' |
| ) |
| parser.add_argument( |
| '--indent', |
| type=int, |
| default=2, |
| help='Number of indent spaces used to pretty-format files' |
| ) |
| parser.add_argument( |
| '--no-sort-keys', |
| action='store_true', |
| dest='no_sort_keys', |
| default=False, |
| help='Keep JSON nodes in the same order' |
| ) |
| |
| parser.add_argument('filenames', nargs='*', help='Filenames to fix') |
| args = parser.parse_args(argv) |
| |
| status = 0 |
| |
| for json_file in args.filenames: |
| try: |
| f = open(json_file, 'r') |
| contents = f.read() |
| f.close() |
| |
| pretty_contents = _get_pretty_format(contents, args.indent, (not args.no_sort_keys)) |
| |
| if contents != pretty_contents: |
| print("File {0} is not pretty-formatted".format(json_file)) |
| |
| if args.autofix: |
| _autofix(json_file, pretty_contents) |
| |
| status = 1 |
| |
| except simplejson.JSONDecodeError: |
| print( |
| "Input File {0} is not a valid JSON, consider using check-json" |
| .format(json_file) |
| ) |
| return 1 |
| |
| return status |
| |
| |
| if __name__ == '__main__': |
| sys.exit(pretty_format_json()) |