Skip to content

Commit 6e71f35

Browse files
committed
Merge remote-tracking branch 'origin/master' into type_dsl
2 parents e298bdc + e554b2b commit 6e71f35

File tree

3 files changed

+46
-31
lines changed

3 files changed

+46
-31
lines changed

schema_salad/makedoc.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ def extendsfrom(item, ex):
383383

384384

385385
def avrold_doc(j, outdoc, renderlist, redirects, brand, brandlink):
386-
# type: (List[Dict[str, Any]], IO[Any], str, Dict, str, str) -> None
386+
# type: (List[Dict[unicode, Any]], IO[Any], str, Dict, str, str) -> None
387387
toc = ToC()
388388
toc.start_numbering = False
389389

@@ -475,7 +475,7 @@ def avrold_doc(j, outdoc, renderlist, redirects, brand, brandlink):
475475

476476
args = parser.parse_args()
477477

478-
s = [] # type: List[Dict[str, Any]]
478+
s = [] # type: List[Dict[unicode, Any]]
479479
a = args.schema
480480
with open(a) as f:
481481
if a.endswith("md"):

schema_salad/ref_resolver.py

Lines changed: 42 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -105,13 +105,13 @@ def __init__(self, ctx, schemagraph=None, foreign_properties=None,
105105
self.vocab = {} # type: Dict[unicode, Any]
106106
self.rvocab = {} # type: Dict[unicode, Any]
107107
self.idmap = None # type: Dict[unicode, Any]
108-
self.mapPredicate = None # type: Dict[unicode, Any]
108+
self.mapPredicate = None # type: Dict[unicode, unicode]
109109
self.type_dsl_fields = None # type: Set[str]
110110

111111
self.add_context(ctx)
112112

113113
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]
115115
if url in ("@id", "@type"):
116116
return url
117117

@@ -249,10 +249,10 @@ def add_context(self, newcontext, baseuri=""):
249249
_logger.debug("vocab is %s", self.vocab)
250250

251251
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]]
253253
base_url = base_url or 'file://%s/' % os.path.abspath('.')
254254

255-
obj = None # type: Dict[str, Any]
255+
obj = None # type: Dict[unicode, Any]
256256
inc = False
257257

258258
# If `ref` is a dict, look for special directives.
@@ -333,24 +333,31 @@ def resolve_ref(self, ref, base_url=None, checklinks=True):
333333

334334

335335
def _resolve_idmap(self, document, loader):
336+
# type: (Dict[unicode, Union[Dict[unicode, Dict[unicode, unicode]], List[Dict[unicode, Any]]]], Loader) -> None
336337
# Convert fields with mapSubject into lists
337338
# use mapPredicate if the mapped value isn't a dict.
338339
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)
348356
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
354361

355362
typeDSLregex = re.compile(r"^([^[?]+)(\[\])?(\?)?$")
356363

@@ -389,21 +396,26 @@ def _resolve_type_dsl(self, document, loader):
389396
document[d] = uniq
390397

391398
def _resolve_identifier(self, document, loader, base_url):
399+
# type: (Dict[unicode, unicode], Loader, unicode) -> unicode
392400
# Expand identifier field (usually 'id') to resolve scope
393401
for identifer in loader.identifiers:
394402
if identifer in document:
395403
if isinstance(document[identifer], basestring):
396404
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)):
399409
loader.idx[document[identifer]] = document
400410
base_url = document[identifer]
401411
else:
402412
raise validate.ValidationException(
403-
"identifier field '%s' must be a string" % (document[identifer]))
413+
"identifier field '%s' must be a string"
414+
% (document[identifer]))
404415
return base_url
405416

406417
def _resolve_identity(self, document, loader, base_url):
418+
# type: (Dict[unicode, List[unicode]], Loader, unicode) -> None
407419
# Resolve scope for identity fields (fields where the value is the
408420
# identity of a standalone node, such as enum symbols)
409421
for identifer in loader.identity_links:
@@ -417,6 +429,7 @@ def _resolve_identity(self, document, loader, base_url):
417429
n]] = document[identifer][n]
418430

419431
def _normalize_fields(self, document, loader):
432+
# type: (Dict[unicode, unicode], Loader) -> None
420433
# Normalize fields which are prefixed or full URIn to vocabulary terms
421434
for d in document:
422435
d2 = loader.expand_url(d, "", scoped_id=False, vocab_term=True)
@@ -425,26 +438,28 @@ def _normalize_fields(self, document, loader):
425438
del document[d]
426439

427440
def _resolve_uris(self, document, loader, base_url):
441+
# type: (Dict[unicode, Union[unicode, List[unicode]]], Loader, unicode) -> None
428442
# Resolve remaining URLs based on document base
429443
for d in loader.url_fields:
430444
if d in document:
431-
if isinstance(document[d], basestring):
445+
datum = document[d]
446+
if isinstance(datum, (str, unicode)):
432447
document[d] = loader.expand_url(
433-
document[d], base_url, scoped_id=False,
448+
datum, base_url, scoped_id=False,
434449
vocab_term=(d in loader.vocab_fields),
435450
scoped_ref=self.scoped_ref_fields.get(d))
436-
elif isinstance(document[d], list):
451+
elif isinstance(datum, list):
437452
document[d] = [
438453
loader.expand_url(
439454
url, base_url, scoped_id=False,
440455
vocab_term=(d in loader.vocab_fields),
441456
scoped_ref=self.scoped_ref_fields.get(d))
442457
if isinstance(url, (str, unicode))
443-
else url for url in document[d]]
458+
else url for url in datum]
444459

445460

446461
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]]
448463
loader = self
449464
metadata = {} # type: Dict[str, Any]
450465
if file_base is None:
@@ -515,7 +530,7 @@ def resolve_all(self, document, base_url, file_base=None, checklinks=True):
515530
val = document[i]
516531
if isinstance(val, dict) and "$import" in val:
517532
l, _ = loader.resolve_ref(val, base_url=file_base, checklinks=False)
518-
if isinstance(l, list):
533+
if isinstance(l, list): # never true?
519534
del document[i]
520535
for item in aslist(l):
521536
document.insert(i, item)

schema_salad/schema.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ def get_metaschema():
168168

169169

170170
def load_schema(schema_ref, cache=None):
171-
# type: (Union[unicode, Dict[str, Any]], Dict) -> Tuple[ref_resolver.Loader, Union[avro.schema.Names, avro.schema.SchemaParseException], Dict[unicode, Any], ref_resolver.Loader]
171+
# type: (Union[unicode, Dict[unicode, Any]], Dict) -> Tuple[ref_resolver.Loader, Union[avro.schema.Names, avro.schema.SchemaParseException], Dict[unicode, Any], ref_resolver.Loader]
172172
metaschema_names, metaschema_doc, metaschema_loader = get_metaschema()
173173
if cache is not None:
174174
metaschema_loader.cache = cache
@@ -204,7 +204,7 @@ def load_and_validate(document_loader, avsc_names, document, strict):
204204

205205

206206
def validate_doc(schema_names, doc, loader, strict):
207-
# type: (avro.schema.Names, Union[Dict[str, Any], List[Dict[str, Any]], str, unicode], ref_resolver.Loader, bool) -> None
207+
# type: (avro.schema.Names, Union[Dict[unicode, Any], List[Dict[unicode, Any]], str, unicode], ref_resolver.Loader, bool) -> None
208208
has_root = False
209209
for r in schema_names.names.values():
210210
if ((hasattr(r, 'get_prop') and r.get_prop("documentRoot")) or (

0 commit comments

Comments
 (0)