@@ -105,13 +105,13 @@ def __init__(self, ctx, schemagraph=None, foreign_properties=None,
105
105
self .vocab = {} # type: Dict[unicode, Any]
106
106
self .rvocab = {} # type: Dict[unicode, Any]
107
107
self .idmap = None # type: Dict[unicode, Any]
108
- self .mapPredicate = None # type: Dict[unicode, Any ]
108
+ self .mapPredicate = None # type: Dict[unicode, unicode ]
109
109
self .type_dsl_fields = None # type: Set[str]
110
110
111
111
self .add_context (ctx )
112
112
113
113
def expand_url (self , url , base_url , scoped_id = False , vocab_term = False , scoped_ref = None ):
114
- # type: (Union[str, unicode], Union[str, unicode], bool, bool) -> Union[str, unicode]
114
+ # type: (Union[str, unicode], Union[str, unicode], bool, bool, bool ) -> Union[str, unicode]
115
115
if url in ("@id" , "@type" ):
116
116
return url
117
117
@@ -249,10 +249,10 @@ def add_context(self, newcontext, baseuri=""):
249
249
_logger .debug ("vocab is %s" , self .vocab )
250
250
251
251
def resolve_ref (self , ref , base_url = None , checklinks = True ):
252
- # type: (Union[Dict[str , Any], str, unicode], Union[str, unicode], bool) -> Tuple[Union[Dict[str , Any], str, unicode], Dict[str, Any]]
252
+ # type: (Union[Dict[unicode , Any], str, unicode], Union[str, unicode], bool) -> Tuple[Union[Dict[unicode , Any], str, unicode], Dict[str, Any]]
253
253
base_url = base_url or 'file://%s/' % os .path .abspath ('.' )
254
254
255
- obj = None # type: Dict[str , Any]
255
+ obj = None # type: Dict[unicode , Any]
256
256
inc = False
257
257
258
258
# If `ref` is a dict, look for special directives.
@@ -333,24 +333,31 @@ def resolve_ref(self, ref, base_url=None, checklinks=True):
333
333
334
334
335
335
def _resolve_idmap (self , document , loader ):
336
+ # type: (Dict[unicode, Union[Dict[unicode, Dict[unicode, unicode]], List[Dict[unicode, Any]]]], Loader) -> None
336
337
# Convert fields with mapSubject into lists
337
338
# use mapPredicate if the mapped value isn't a dict.
338
339
for idmapField in loader .idmap :
339
- if (idmapField in document and isinstance (document [idmapField ], dict ) and
340
- "$import" not in document [idmapField ] and
341
- "$include" not in document [idmapField ]):
342
- ls = []
343
- for k in sorted (document [idmapField ].keys ()):
344
- v = document [idmapField ][k ]
345
- if not isinstance (v , dict ):
346
- if idmapField in loader .mapPredicate :
347
- v = {loader .mapPredicate [idmapField ]: v }
340
+ if (idmapField in document ):
341
+ idmapFieldValue = document [idmapField ]
342
+ if (isinstance (idmapFieldValue , dict )
343
+ and "$import" not in idmapFieldValue
344
+ and "$include" not in idmapFieldValue ):
345
+ ls = []
346
+ for k in sorted (idmapFieldValue .keys ()):
347
+ val = idmapFieldValue [k ]
348
+ v = None # type: Dict[unicode, Any]
349
+ if not isinstance (val , dict ):
350
+ if idmapField in loader .mapPredicate :
351
+ v = {loader .mapPredicate [idmapField ]: val }
352
+ else :
353
+ raise validate .ValidationException (
354
+ "mapSubject '%s' value '%s' is not a dict"
355
+ "and does not have a mapPredicate" , k , v )
348
356
else :
349
- raise validate .ValidationException (
350
- "mapSubject '%s' value '%s' is not a dict and does not have a mapPredicate" , k , v )
351
- v [loader .idmap [idmapField ]] = k
352
- ls .append (v )
353
- document [idmapField ] = ls
357
+ v = val
358
+ v [loader .idmap [idmapField ]] = k
359
+ ls .append (v )
360
+ document [idmapField ] = ls
354
361
355
362
typeDSLregex = re .compile (r"^([^[?]+)(\[\])?(\?)?$" )
356
363
@@ -389,21 +396,26 @@ def _resolve_type_dsl(self, document, loader):
389
396
document [d ] = uniq
390
397
391
398
def _resolve_identifier (self , document , loader , base_url ):
399
+ # type: (Dict[unicode, unicode], Loader, unicode) -> unicode
392
400
# Expand identifier field (usually 'id') to resolve scope
393
401
for identifer in loader .identifiers :
394
402
if identifer in document :
395
403
if isinstance (document [identifer ], basestring ):
396
404
document [identifer ] = loader .expand_url (
397
- document [identifer ], base_url , scoped_id = True )
398
- if document [identifer ] not in loader .idx or isinstance (loader .idx [document [identifer ]], basestring ):
405
+ document [identifer ], base_url , scoped = True )
406
+ if (document [identifer ] not in loader .idx
407
+ or isinstance (
408
+ loader .idx [document [identifer ]], basestring )):
399
409
loader .idx [document [identifer ]] = document
400
410
base_url = document [identifer ]
401
411
else :
402
412
raise validate .ValidationException (
403
- "identifier field '%s' must be a string" % (document [identifer ]))
413
+ "identifier field '%s' must be a string"
414
+ % (document [identifer ]))
404
415
return base_url
405
416
406
417
def _resolve_identity (self , document , loader , base_url ):
418
+ # type: (Dict[unicode, List[unicode]], Loader, unicode) -> None
407
419
# Resolve scope for identity fields (fields where the value is the
408
420
# identity of a standalone node, such as enum symbols)
409
421
for identifer in loader .identity_links :
@@ -417,6 +429,7 @@ def _resolve_identity(self, document, loader, base_url):
417
429
n ]] = document [identifer ][n ]
418
430
419
431
def _normalize_fields (self , document , loader ):
432
+ # type: (Dict[unicode, unicode], Loader) -> None
420
433
# Normalize fields which are prefixed or full URIn to vocabulary terms
421
434
for d in document :
422
435
d2 = loader .expand_url (d , "" , scoped_id = False , vocab_term = True )
@@ -425,26 +438,28 @@ def _normalize_fields(self, document, loader):
425
438
del document [d ]
426
439
427
440
def _resolve_uris (self , document , loader , base_url ):
441
+ # type: (Dict[unicode, Union[unicode, List[unicode]]], Loader, unicode) -> None
428
442
# Resolve remaining URLs based on document base
429
443
for d in loader .url_fields :
430
444
if d in document :
431
- if isinstance (document [d ], basestring ):
445
+ datum = document [d ]
446
+ if isinstance (datum , (str , unicode )):
432
447
document [d ] = loader .expand_url (
433
- document [ d ] , base_url , scoped_id = False ,
448
+ datum , base_url , scoped_id = False ,
434
449
vocab_term = (d in loader .vocab_fields ),
435
450
scoped_ref = self .scoped_ref_fields .get (d ))
436
- elif isinstance (document [ d ] , list ):
451
+ elif isinstance (datum , list ):
437
452
document [d ] = [
438
453
loader .expand_url (
439
454
url , base_url , scoped_id = False ,
440
455
vocab_term = (d in loader .vocab_fields ),
441
456
scoped_ref = self .scoped_ref_fields .get (d ))
442
457
if isinstance (url , (str , unicode ))
443
- else url for url in document [ d ] ]
458
+ else url for url in datum ]
444
459
445
460
446
461
def resolve_all (self , document , base_url , file_base = None , checklinks = True ):
447
- # type: (Any, Union[str, unicode], Union[str, unicode], bool) -> Tuple[Any, Dict[str, Any]]
462
+ # type: (Union[Dict[unicode, Any], List[Union[unicode, Dict]]] , Union[str, unicode], Union[str, unicode], bool) -> Tuple[Any, Dict[str, Any]]
448
463
loader = self
449
464
metadata = {} # type: Dict[str, Any]
450
465
if file_base is None :
@@ -515,7 +530,7 @@ def resolve_all(self, document, base_url, file_base=None, checklinks=True):
515
530
val = document [i ]
516
531
if isinstance (val , dict ) and "$import" in val :
517
532
l , _ = loader .resolve_ref (val , base_url = file_base , checklinks = False )
518
- if isinstance (l , list ):
533
+ if isinstance (l , list ): # never true?
519
534
del document [i ]
520
535
for item in aslist (l ):
521
536
document .insert (i , item )
0 commit comments