|
15 | 15 | import pprint
|
16 | 16 | from StringIO import StringIO
|
17 | 17 | from .aslist import aslist
|
| 18 | +from .flatten import flatten |
18 | 19 | import rdflib
|
19 | 20 | from rdflib.namespace import RDF, RDFS, OWL
|
20 | 21 | from rdflib.plugins.parsers.notation3 import BadSyntax
|
@@ -103,6 +104,7 @@ def __init__(self, ctx, schemagraph=None, foreign_properties=None,
|
103 | 104 | self.rvocab = {} # type: Dict[unicode, Any]
|
104 | 105 | self.idmap = None # type: Dict[unicode, Any]
|
105 | 106 | self.mapPredicate = None # type: Dict[unicode, Any]
|
| 107 | + self.type_dsl_fields = None # type: Set[str] |
106 | 108 |
|
107 | 109 | self.add_context(ctx)
|
108 | 110 |
|
@@ -337,6 +339,32 @@ def _resolve_idmap(self, document, loader):
|
337 | 339 | ls.append(v)
|
338 | 340 | document[idmapField] = ls
|
339 | 341 |
|
| 342 | + def _type_dsl(self, t): |
| 343 | + r = t |
| 344 | + if "[]" in t: |
| 345 | + r = {"type": "array", |
| 346 | + "items": t.replace("[]", "").replace("?", "")} |
| 347 | + if t.endswith("?"): |
| 348 | + r = ["null", r] |
| 349 | + return r |
| 350 | + |
| 351 | + def _resolve_type_dsl(self, document, loader): |
| 352 | + for d in loader.type_dsl_fields: |
| 353 | + if d in document: |
| 354 | + if isinstance(document[d], basestring): |
| 355 | + document[d] = self._type_dsl(document[d]) |
| 356 | + elif isinstance(document[d], list): |
| 357 | + document[d] = [self._type_dsl(t) for t in document[d]] |
| 358 | + if isinstance(document[d], list): |
| 359 | + document[d] = flatten(document[d]) |
| 360 | + seen = set() |
| 361 | + uniq = [] |
| 362 | + for item in document[d]: |
| 363 | + if item not in seen: |
| 364 | + uniq.append(item) |
| 365 | + seen.add(item) |
| 366 | + document[d] = uniq |
| 367 | + |
340 | 368 | def _resolve_identifier(self, document, loader, base_url):
|
341 | 369 | # Expand identifier field (usually 'id') to resolve scope
|
342 | 370 | for identifer in loader.identifiers:
|
@@ -439,10 +467,11 @@ def resolve_all(self, document, base_url, file_base=None):
|
439 | 467 |
|
440 | 468 | if isinstance(document, dict):
|
441 | 469 |
|
| 470 | + self._normalize_fields(document, loader) |
442 | 471 | self._resolve_idmap(document, loader)
|
| 472 | + self._type_dsl(document, loader) |
443 | 473 | base_url = self._resolve_identifier(document, loader, base_url)
|
444 | 474 | self._resolve_identity(document, loader, base_url)
|
445 |
| - self._normalize_fields(document, loader) |
446 | 475 | self._resolve_uris(document, loader, base_url)
|
447 | 476 |
|
448 | 477 | try:
|
|
0 commit comments