1
1
import csv
2
+ import functools
2
3
import json
3
4
import os
4
5
import pathlib
5
6
from collections import OrderedDict
6
7
from copy import deepcopy
7
8
8
9
import jsonref
10
+ import referencing
11
+
12
+
13
+ def _jsonref_loader (uri , urn_registry = None ):
14
+ if uri .startswith ("urn:" ):
15
+ if urn_registry and uri in urn_registry :
16
+ return urn_registry .contents (uri )
17
+ else :
18
+ raise Exception ("URN {} not found" .format (uri ))
19
+ return jsonref .jsonloader (uri )
9
20
10
21
11
22
class CompileToJsonSchema :
@@ -15,6 +26,7 @@ def __init__(
15
26
set_additional_properties_false_everywhere = False ,
16
27
codelist_base_directory = None ,
17
28
input_schema = None ,
29
+ load_urn_schema_filenames = [],
18
30
):
19
31
if not isinstance (input_schema , dict ) and not input_filename :
20
32
raise Exception ("Must pass input_filename or input_schema" )
@@ -27,19 +39,35 @@ def __init__(
27
39
self .codelist_base_directory = os .path .expanduser (codelist_base_directory )
28
40
else :
29
41
self .codelist_base_directory = os .getcwd ()
42
+ self .load_urn_schema_filenames = load_urn_schema_filenames
30
43
31
44
def get (self ):
45
+ urn_registry = None
46
+ if self .load_urn_schema_filenames :
47
+ urn_registry = referencing .Registry ()
48
+ for urn_schema_filename in self .load_urn_schema_filenames :
49
+ with open (urn_schema_filename ) as fp :
50
+ urn_schema_json = json .load (fp )
51
+ urn_schema_obj = referencing .Resource .from_contents (urn_schema_json )
52
+ urn_registry = urn_schema_obj @ urn_registry
53
+
32
54
if self .input_filename :
33
55
with open (self .input_filename ) as fp :
34
56
resolved = jsonref .load (
35
57
fp ,
58
+ loader = functools .partial (
59
+ _jsonref_loader , urn_registry = urn_registry
60
+ ),
36
61
object_pairs_hook = OrderedDict ,
37
62
base_uri = pathlib .Path (
38
63
os .path .realpath (self .input_filename )
39
64
).as_uri (),
40
65
)
41
66
elif isinstance (self .input_schema , dict ):
42
- resolved = jsonref .JsonRef .replace_refs (self .input_schema )
67
+ resolved = jsonref .JsonRef .replace_refs (
68
+ self .input_schema ,
69
+ loader = functools .partial (_jsonref_loader , urn_registry = urn_registry ),
70
+ )
43
71
else :
44
72
raise Exception ("Must pass input_filename or input_schema" )
45
73
0 commit comments