Coverage for /run/media/veganeco/water/status600.com/pypi/reptilian_climates/modules_series_2/ships/fields/gardens_pip/rich/json.py: 45%
42 statements
« prev ^ index » next coverage.py v7.4.0, created at 2024-01-22 16:04 -0800
« prev ^ index » next coverage.py v7.4.0, created at 2024-01-22 16:04 -0800
1from pathlib import Path
2from json import loads, dumps
3from typing import Any, Callable, Optional, Union
5from .text import Text
6from .highlighter import JSONHighlighter, NullHighlighter
9class JSON:
10 """A renderable which pretty prints JSON.
12 Args:
13 json (str): JSON encoded data.
14 indent (Union[None, int, str], optional): Number of characters to indent by. Defaults to 2.
15 highlight (bool, optional): Enable highlighting. Defaults to True.
16 skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False.
17 ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False.
18 check_circular (bool, optional): Check for circular references. Defaults to True.
19 allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True.
20 default (Callable, optional): A callable that converts values that can not be encoded
21 in to something that can be JSON encoded. Defaults to None.
22 sort_keys (bool, optional): Sort dictionary keys. Defaults to False.
23 """
25 def __init__(
26 self,
27 json: str,
28 indent: Union[None, int, str] = 2,
29 highlight: bool = True,
30 skip_keys: bool = False,
31 ensure_ascii: bool = False,
32 check_circular: bool = True,
33 allow_nan: bool = True,
34 default: Optional[Callable[[Any], Any]] = None,
35 sort_keys: bool = False,
36 ) -> None:
37 data = loads(json)
38 json = dumps(
39 data,
40 indent=indent,
41 skipkeys=skip_keys,
42 ensure_ascii=ensure_ascii,
43 check_circular=check_circular,
44 allow_nan=allow_nan,
45 default=default,
46 sort_keys=sort_keys,
47 )
48 highlighter = JSONHighlighter() if highlight else NullHighlighter()
49 self.text = highlighter(json)
50 self.text.no_wrap = True
51 self.text.overflow = None
53 @classmethod
54 def from_data(
55 cls,
56 data: Any,
57 indent: Union[None, int, str] = 2,
58 highlight: bool = True,
59 skip_keys: bool = False,
60 ensure_ascii: bool = False,
61 check_circular: bool = True,
62 allow_nan: bool = True,
63 default: Optional[Callable[[Any], Any]] = None,
64 sort_keys: bool = False,
65 ) -> "JSON":
66 """Encodes a JSON object from arbitrary data.
68 Args:
69 data (Any): An object that may be encoded in to JSON
70 indent (Union[None, int, str], optional): Number of characters to indent by. Defaults to 2.
71 highlight (bool, optional): Enable highlighting. Defaults to True.
72 default (Callable, optional): Optional callable which will be called for objects that cannot be serialized. Defaults to None.
73 skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False.
74 ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False.
75 check_circular (bool, optional): Check for circular references. Defaults to True.
76 allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True.
77 default (Callable, optional): A callable that converts values that can not be encoded
78 in to something that can be JSON encoded. Defaults to None.
79 sort_keys (bool, optional): Sort dictionary keys. Defaults to False.
81 Returns:
82 JSON: New JSON object from the given data.
83 """
84 json_instance: "JSON" = cls.__new__(cls)
85 json = dumps(
86 data,
87 indent=indent,
88 skipkeys=skip_keys,
89 ensure_ascii=ensure_ascii,
90 check_circular=check_circular,
91 allow_nan=allow_nan,
92 default=default,
93 sort_keys=sort_keys,
94 )
95 highlighter = JSONHighlighter() if highlight else NullHighlighter()
96 json_instance.text = highlighter(json)
97 json_instance.text.no_wrap = True
98 json_instance.text.overflow = None
99 return json_instance
101 def __rich__(self) -> Text:
102 return self.text
105if __name__ == "__main__":
106 import argparse
107 import sys
109 parser = argparse.ArgumentParser(description="Pretty print json")
110 parser.add_argument(
111 "path",
112 metavar="PATH",
113 help="path to file, or - for stdin",
114 )
115 parser.add_argument(
116 "-i",
117 "--indent",
118 metavar="SPACES",
119 type=int,
120 help="Number of spaces in an indent",
121 default=2,
122 )
123 args = parser.parse_args()
125 from rich.console import Console
127 console = Console()
128 error_console = Console(stderr=True)
130 try:
131 if args.path == "-":
132 json_data = sys.stdin.read()
133 else:
134 json_data = Path(args.path).read_text()
135 except Exception as error:
136 error_console.print(f"Unable to read {args.path!r}; {error}")
137 sys.exit(-1)
139 console.print(JSON(json_data, indent=args.indent), soft_wrap=True)