#!/usr/bin/env python3 """A tiny JSON pretty-printer.""" import argparse import json import sys from pathlib import Path from typing import Any, Sequence def pretty_json(text: str, indent: int = 2) -> str: """Parse JSON text and return a consistently formatted version.""" value: Any = json.loads(text) return json.dumps(value, indent=indent, ensure_ascii=False) + "\n" def _run_tests() -> None: assert pretty_json('{"name":"Ada","active":true}') == ( '{\n "name": "Ada",\n "active": true\n}\n' ) assert pretty_json("[1,[2,3]]", indent=4) == ( "[\n 1,\n [\n 2,\n 3\n ]\n]\n" ) def main(argv: Sequence[str] | None = None) -> int: parser = argparse.ArgumentParser(description="Pretty-print JSON.") parser.add_argument("file", nargs="?", type=Path, help="JSON file; defaults to stdin") parser.add_argument("-i", "--indent", type=int, default=2, help="indent width") parser.add_argument("--test", action="store_true", help="run built-in tests") args = parser.parse_args(argv) if args.test: _run_tests() return 0 if args.indent < 0: parser.error("--indent must be non-negative") try: text = args.file.read_text(encoding="utf-8") if args.file else sys.stdin.read() sys.stdout.write(pretty_json(text, args.indent)) except (OSError, UnicodeError, json.JSONDecodeError) as error: print(f"error: {error}", file=sys.stderr) return 1 return 0 if __name__ == "__main__": raise SystemExit(main())