15
15
yaml = ruamel .yaml .YAML (typ = "safe" )
16
16
17
17
18
+ class _UnsetType :
19
+ pass
20
+
21
+
22
+ _UNSET = _UnsetType ()
23
+
24
+
18
25
def _run_load_callback (schema_location : str , callback : t .Callable ) -> dict :
19
26
try :
20
27
schema = callback ()
@@ -31,6 +38,7 @@ def __init__(self, filename: str) -> None:
31
38
self .path = filename2path (filename )
32
39
self .filename = str (self .path )
33
40
self .parsers = ParserSet ()
41
+ self ._parsed_schema : dict | _UnsetType = _UNSET
34
42
35
43
def get_retrieval_uri (self ) -> str | None :
36
44
return self .path .as_uri ()
@@ -39,21 +47,26 @@ def _read_impl(self) -> t.Any:
39
47
return self .parsers .parse_file (self .path , default_filetype = "json" )
40
48
41
49
def read_schema (self ) -> dict :
42
- return _run_load_callback (self .filename , self ._read_impl )
50
+ if self ._parsed_schema is _UNSET :
51
+ self ._parsed_schema = _run_load_callback (self .filename , self ._read_impl )
52
+ return self ._parsed_schema
43
53
44
54
45
55
class StdinSchemaReader :
46
56
def __init__ (self ) -> None :
47
57
self .parsers = ParserSet ()
58
+ self ._parsed_schema : dict | _UnsetType = _UNSET
48
59
49
60
def get_retrieval_uri (self ) -> str | None :
50
61
return None
51
62
52
63
def read_schema (self ) -> dict :
53
- try :
54
- return json .load (sys .stdin )
55
- except ValueError as e :
56
- raise ParseError ("Failed to parse JSON from stdin" ) from e
64
+ if self ._parsed_schema is _UNSET :
65
+ try :
66
+ self ._parsed_schema = json .load (sys .stdin )
67
+ except ValueError as e :
68
+ raise ParseError ("Failed to parse JSON from stdin" ) from e
69
+ return self ._parsed_schema
57
70
58
71
59
72
class HttpSchemaReader :
@@ -71,14 +84,12 @@ def __init__(
71
84
disable_cache = disable_cache ,
72
85
validation_callback = self ._parse ,
73
86
)
74
- self ._parsed_schema : t . Any | None = None
87
+ self ._parsed_schema : dict | _UnsetType = _UNSET
75
88
76
89
def _parse (self , schema_bytes : bytes ) -> t .Any :
77
- if self ._parsed_schema is None :
78
- self ._parsed_schema = self .parsers .parse_data_with_path (
79
- io .BytesIO (schema_bytes ), self .url , default_filetype = "json"
80
- )
81
- return self ._parsed_schema
90
+ return self .parsers .parse_data_with_path (
91
+ io .BytesIO (schema_bytes ), self .url , default_filetype = "json"
92
+ )
82
93
83
94
def get_retrieval_uri (self ) -> str | None :
84
95
return self .url
@@ -88,4 +99,6 @@ def _read_impl(self) -> t.Any:
88
99
return self ._parse (fp .read ())
89
100
90
101
def read_schema (self ) -> dict :
91
- return _run_load_callback (self .url , self ._read_impl )
102
+ if self ._parsed_schema is _UNSET :
103
+ self ._parsed_schema = _run_load_callback (self .url , self ._read_impl )
104
+ return self ._parsed_schema
0 commit comments