@@ -103,7 +103,7 @@ def __init__(self, ctx, schemagraph=None, foreign_properties=None,
103
103
self .vocab = {} # type: Dict[unicode, Any]
104
104
self .rvocab = {} # type: Dict[unicode, Any]
105
105
self .idmap = None # type: Dict[unicode, Any]
106
- self .mapPredicate = None # type: Dict[unicode, Any ]
106
+ self .mapPredicate = None # type: Dict[unicode, unicode ]
107
107
108
108
self .add_context (ctx )
109
109
@@ -240,10 +240,10 @@ def add_context(self, newcontext, baseuri=""):
240
240
_logger .debug ("vocab is %s" , self .vocab )
241
241
242
242
def resolve_ref (self , ref , base_url = None , checklinks = True ):
243
- # type: (Union[Dict[str , Any], str, unicode], Union[str, unicode], bool) -> Tuple[Union[Dict[str , Any], str, unicode], Dict[str, Any]]
243
+ # type: (Union[Dict[unicode , Any], str, unicode], Union[str, unicode], bool) -> Tuple[Union[Dict[unicode , Any], str, unicode], Dict[str, Any]]
244
244
base_url = base_url or 'file://%s/' % os .path .abspath ('.' )
245
245
246
- obj = None # type: Dict[str , Any]
246
+ obj = None # type: Dict[unicode , Any]
247
247
inc = False
248
248
249
249
# If `ref` is a dict, look for special directives.
@@ -324,41 +324,53 @@ def resolve_ref(self, ref, base_url=None, checklinks=True):
324
324
325
325
326
326
def _resolve_idmap (self , document , loader ):
327
+ # type: (Dict[unicode, Union[Dict[unicode, Dict[unicode, unicode]], List[Dict[unicode, Any]]]], Loader) -> None
327
328
# Convert fields with mapSubject into lists
328
329
# use mapPredicate if the mapped value isn't a dict.
329
330
for idmapField in loader .idmap :
330
- if (idmapField in document and isinstance (document [idmapField ], dict ) and
331
- "$import" not in document [idmapField ] and
332
- "$include" not in document [idmapField ]):
333
- ls = []
334
- for k in sorted (document [idmapField ].keys ()):
335
- v = document [idmapField ][k ]
336
- if not isinstance (v , dict ):
337
- if idmapField in loader .mapPredicate :
338
- v = {loader .mapPredicate [idmapField ]: v }
331
+ if (idmapField in document ):
332
+ idmapFieldValue = document [idmapField ]
333
+ if (isinstance (idmapFieldValue , dict )
334
+ and "$import" not in idmapFieldValue
335
+ and "$include" not in idmapFieldValue ):
336
+ ls = []
337
+ for k in sorted (idmapFieldValue .keys ()):
338
+ val = idmapFieldValue [k ]
339
+ v = None # type: Dict[unicode, Any]
340
+ if not isinstance (v , dict ):
341
+ if idmapField in loader .mapPredicate :
342
+ v = {loader .mapPredicate [idmapField ]: val }
343
+ else :
344
+ raise validate .ValidationException (
345
+ "mapSubject '%s' value '%s' is not a dict"
346
+ "and does not have a mapPredicate" , k , v )
339
347
else :
340
- raise validate .ValidationException (
341
- "mapSubject '%s' value '%s' is not a dict and does not have a mapPredicate" , k , v )
342
- v [loader .idmap [idmapField ]] = k
343
- ls .append (v )
344
- document [idmapField ] = ls
348
+ v = val
349
+ v [loader .idmap [idmapField ]] = k
350
+ ls .append (v )
351
+ document [idmapField ] = ls
345
352
346
353
def _resolve_identifier (self , document , loader , base_url ):
354
+ # type: (Dict[unicode, unicode], Loader, unicode) -> unicode
347
355
# Expand identifier field (usually 'id') to resolve scope
348
356
for identifer in loader .identifiers :
349
357
if identifer in document :
350
358
if isinstance (document [identifer ], basestring ):
351
359
document [identifer ] = loader .expand_url (
352
360
document [identifer ], base_url , scoped = True )
353
- if document [identifer ] not in loader .idx or isinstance (loader .idx [document [identifer ]], basestring ):
361
+ if (document [identifer ] not in loader .idx
362
+ or isinstance (
363
+ loader .idx [document [identifer ]], basestring )):
354
364
loader .idx [document [identifer ]] = document
355
365
base_url = document [identifer ]
356
366
else :
357
367
raise validate .ValidationException (
358
- "identifier field '%s' must be a string" % (document [identifer ]))
368
+ "identifier field '%s' must be a string"
369
+ % (document [identifer ]))
359
370
return base_url
360
371
361
372
def _resolve_identity (self , document , loader , base_url ):
373
+ # type: (Dict[unicode, List[unicode]], Loader, unicode) -> None
362
374
# Resolve scope for identity fields (fields where the value is the
363
375
# identity of a standalone node, such as enum symbols)
364
376
for identifer in loader .identity_links :
@@ -372,6 +384,7 @@ def _resolve_identity(self, document, loader, base_url):
372
384
n ]] = document [identifer ][n ]
373
385
374
386
def _normalize_fields (self , document , loader ):
387
+ # type: (Dict[unicode, unicode], Loader) -> None
375
388
# Normalize fields which are prefixed or full URIn to vocabulary terms
376
389
for d in document :
377
390
d2 = loader .expand_url (d , "" , scoped = False , vocab_term = True )
@@ -380,25 +393,28 @@ def _normalize_fields(self, document, loader):
380
393
del document [d ]
381
394
382
395
def _resolve_uris (self , document , loader , base_url ):
396
+ # type: (Dict[unicode, Union[unicode, List[unicode]]], Loader, unicode) -> None
383
397
# Resolve remaining URLs based on document base
384
398
for d in loader .url_fields :
385
399
if d in self .scoped_ref_fields :
386
400
continue
387
401
if d in document :
388
- if isinstance (document [d ], basestring ):
402
+ datum = document [d ]
403
+ if isinstance (datum , (str , unicode )):
389
404
document [d ] = loader .expand_url (
390
- document [d ], base_url , scoped = False , vocab_term = (d in loader .vocab_fields ))
391
- elif isinstance (document [d ], list ):
405
+ datum , base_url , scoped = False ,
406
+ vocab_term = (d in loader .vocab_fields ))
407
+ elif isinstance (datum , list ):
392
408
document [d ] = [
393
409
loader .expand_url (
394
410
url , base_url , scoped = False ,
395
411
vocab_term = (d in loader .vocab_fields ))
396
- if isinstance (url , (str , unicode ))
397
- else url for url in document [ d ] ]
412
+ if isinstance (url , (str , unicode )) else url
413
+ for url in datum ]
398
414
399
415
400
416
def resolve_all (self , document , base_url , file_base = None , checklinks = True ):
401
- # type: (Any, Union[str, unicode], Union[str, unicode], bool) -> Tuple[Any, Dict[str, Any]]
417
+ # type: (Union[Dict[unicode, Any], List[Union[unicode, Dict]]] , Union[str, unicode], Union[str, unicode], bool) -> Tuple[Any, Dict[str, Any]]
402
418
loader = self
403
419
metadata = {} # type: Dict[str, Any]
404
420
if file_base is None :
@@ -468,7 +484,7 @@ def resolve_all(self, document, base_url, file_base=None, checklinks=True):
468
484
val = document [i ]
469
485
if isinstance (val , dict ) and "$import" in val :
470
486
l , _ = loader .resolve_ref (val , base_url = file_base , checklinks = False )
471
- if isinstance (l , list ):
487
+ if isinstance (l , list ): # never true?
472
488
del document [i ]
473
489
for item in aslist (l ):
474
490
document .insert (i , item )
0 commit comments