Anthony Sottile | 8f61529 | 2022-01-15 19:24:05 -0500 | [diff] [blame] | 1 | from __future__ import annotations |
| 2 | |
Anthony Sottile | 243fe50 | 2014-08-19 16:03:48 -0700 | [diff] [blame] | 3 | import argparse |
Anthony Sottile | dc50b7f | 2017-03-20 10:42:48 -0700 | [diff] [blame] | 4 | import json |
Aditya Khursale | fe37451 | 2021-02-17 02:08:57 +0530 | [diff] [blame] | 5 | from typing import Any |
Anthony Sottile | 030bfac | 2019-01-31 19:19:10 -0800 | [diff] [blame] | 6 | from typing import Sequence |
Aditya Khursale | fe37451 | 2021-02-17 02:08:57 +0530 | [diff] [blame] | 7 | |
| 8 | |
| 9 | def raise_duplicate_keys( |
Anthony Sottile | 8f61529 | 2022-01-15 19:24:05 -0500 | [diff] [blame] | 10 | ordered_pairs: list[tuple[str, Any]], |
| 11 | ) -> dict[str, Any]: |
Aditya Khursale | fe37451 | 2021-02-17 02:08:57 +0530 | [diff] [blame] | 12 | d = {} |
| 13 | for key, val in ordered_pairs: |
| 14 | if key in d: |
| 15 | raise ValueError(f'Duplicate key: {key}') |
| 16 | else: |
| 17 | d[key] = val |
| 18 | return d |
Anthony Sottile | b08f834 | 2015-01-04 16:05:20 -0800 | [diff] [blame] | 19 | |
Anthony Sottile | 243fe50 | 2014-08-19 16:03:48 -0700 | [diff] [blame] | 20 | |
Anthony Sottile | 8f61529 | 2022-01-15 19:24:05 -0500 | [diff] [blame] | 21 | def main(argv: Sequence[str] | None = None) -> int: |
Anthony Sottile | 243fe50 | 2014-08-19 16:03:48 -0700 | [diff] [blame] | 22 | parser = argparse.ArgumentParser() |
Anthony Sottile | 4575652 | 2019-02-11 19:56:15 -0800 | [diff] [blame] | 23 | parser.add_argument('filenames', nargs='*', help='Filenames to check.') |
Anthony Sottile | 243fe50 | 2014-08-19 16:03:48 -0700 | [diff] [blame] | 24 | args = parser.parse_args(argv) |
| 25 | |
| 26 | retval = 0 |
| 27 | for filename in args.filenames: |
Anthony Sottile | f5c42a0 | 2020-02-05 11:10:42 -0800 | [diff] [blame] | 28 | with open(filename, 'rb') as f: |
| 29 | try: |
Aditya Khursale | fe37451 | 2021-02-17 02:08:57 +0530 | [diff] [blame] | 30 | json.load(f, object_pairs_hook=raise_duplicate_keys) |
Anthony Sottile | c11c548 | 2020-05-14 16:29:55 -0700 | [diff] [blame] | 31 | except ValueError as exc: |
Anthony Sottile | f5c42a0 | 2020-02-05 11:10:42 -0800 | [diff] [blame] | 32 | print(f'{filename}: Failed to json decode ({exc})') |
| 33 | retval = 1 |
Anthony Sottile | 243fe50 | 2014-08-19 16:03:48 -0700 | [diff] [blame] | 34 | return retval |
| 35 | |
| 36 | |
| 37 | if __name__ == '__main__': |
Anthony Sottile | 39ab2ed | 2021-10-23 13:23:50 -0400 | [diff] [blame] | 38 | raise SystemExit(main()) |