11import csv
2+ import functools
23import json
34import os
45import pathlib
56from collections import OrderedDict
67from copy import deepcopy
78
89import 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 )
920
1021
1122class CompileToJsonSchema :
@@ -15,6 +26,7 @@ def __init__(
1526 set_additional_properties_false_everywhere = False ,
1627 codelist_base_directory = None ,
1728 input_schema = None ,
29+ load_urn_schema_filenames = [],
1830 ):
1931 if not isinstance (input_schema , dict ) and not input_filename :
2032 raise Exception ("Must pass input_filename or input_schema" )
@@ -27,19 +39,35 @@ def __init__(
2739 self .codelist_base_directory = os .path .expanduser (codelist_base_directory )
2840 else :
2941 self .codelist_base_directory = os .getcwd ()
42+ self .load_urn_schema_filenames = load_urn_schema_filenames
3043
3144 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+
3254 if self .input_filename :
3355 with open (self .input_filename ) as fp :
3456 resolved = jsonref .load (
3557 fp ,
58+ loader = functools .partial (
59+ _jsonref_loader , urn_registry = urn_registry
60+ ),
3661 object_pairs_hook = OrderedDict ,
3762 base_uri = pathlib .Path (
3863 os .path .realpath (self .input_filename )
3964 ).as_uri (),
4065 )
4166 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+ )
4371 else :
4472 raise Exception ("Must pass input_filename or input_schema" )
4573
0 commit comments