| #!/usr/bin/env python |
| # Copyright 2015 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| import argparse |
| import json |
| import os |
| import sys |
| |
| |
| def GetFormattedJSONString(file_path): |
| with open(file_path, 'r') as f: |
| json_obj = json.load(f) |
| file_content = f.read() |
| return json.dumps( |
| json_obj, indent=2, sort_keys=True, separators=(',', ': ')) |
| |
| |
| def ValidateJSONFormat(file_path): |
| with open(file_path, 'r') as f: |
| file_content = f.read() |
| if file_content != GetFormattedJSONString(file_path): |
| raise Exception( |
| 'Reformat your JSON file by running: %s --format %s' % |
| (__file__, file_path)) |
| print >> sys.stdout, ('%s passes the JSON format validation' % file_path) |
| |
| |
| def Format(file_path): |
| formatted_JSON_string = GetFormattedJSONString(file_path) |
| with open(file_path, 'w') as f: |
| f.write(formatted_JSON_string) |
| |
| |
| def Main(args): |
| description = """A JSON formatting tool. |
| |
| This is a tool that validate and reformats JSON file so that it complies with |
| a certain style. The JSON style imposed by this tool is: |
| * JSON array elements and object members are indented with 2 spaces. |
| * Dictionaries objects are sorted by key. |
| * Items are sperated by ', ' and ': '. |
| """ |
| parser = argparse.ArgumentParser( |
| description=description, formatter_class=argparse.RawTextHelpFormatter) |
| parser.add_argument('file_path', type=str, help='The path to JSON file.') |
| parser.add_argument('--format', action='store_true', default=False, |
| help='Format the JSON file.') |
| options = parser.parse_args(args) |
| if options.format: |
| Format(options.file_path) |
| return 0 |
| ValidateJSONFormat(options.file_path) |
| return 0 |
| |
| |
| if __name__ == '__main__': |
| sys.exit(Main(sys.argv[1:])) |