def resolve_all( self, document: ResolveType, base_url: str, file_base: Optional[str] = None, checklinks: bool = True, strict_foreign_properties: bool = False, ) -> ResolvedRefType: loader = self metadata = CommentedMap() if file_base is None: file_base = base_url if isinstance(document, CommentedMap): # Handle $import and $include if "$import" in document or "$include" in document: return self.resolve_ref( document, base_url=file_base, checklinks=checklinks, strict_foreign_properties=strict_foreign_properties, ) elif "$mixin" in document: return self.resolve_ref( document, base_url=base_url, checklinks=checklinks, strict_foreign_properties=strict_foreign_properties, ) elif isinstance(document, CommentedSeq): pass elif isinstance(document, (list, dict)): raise ValidationException( "Expected CommentedMap or CommentedSeq, got {}: `{}`".format( type(document), document)) else: return (document, metadata) newctx = None # type: Optional["Loader"] if isinstance(document, CommentedMap): # Handle $base, $profile, $namespaces, $schemas and $graph if "$base" in document: base_url = document["$base"] if "$profile" in document: if newctx is None: newctx = SubLoader(self) newctx.add_namespaces( document.get("$namespaces", CommentedMap())) newctx.add_schemas(document.get("$schemas", []), document["$profile"]) if "$namespaces" in document: if newctx is None: newctx = SubLoader(self) newctx.add_namespaces(document["$namespaces"]) if "$schemas" in document: if newctx is None: newctx = SubLoader(self) newctx.add_schemas(document["$schemas"], file_base) if newctx is not None: loader = newctx for identifer in loader.identity_links: if identifer in document: if isinstance(document[identifer], str): document[identifer] = loader.expand_url( document[identifer], base_url, scoped_id=True) loader.idx[document[identifer]] = document metadata = document if "$graph" in document: document = document["$graph"] if isinstance(document, CommentedMap): self._normalize_fields(document, loader) self._resolve_idmap(document, loader) self._resolve_dsl(document, loader) base_url = self._resolve_identifier(document, loader, base_url) self._resolve_identity(document, loader, base_url) self._resolve_uris(document, loader, base_url) try: for key, val in document.items(): subscope = "" # type: str if key in loader.subscopes: subscope = "/" + loader.subscopes[key] document[key], _ = loader.resolve_all(val, base_url + subscope, file_base=file_base, checklinks=False) except ValidationException as v: _logger.warning("loader is %s", id(loader), exc_info=True) raise ValidationException( "({}) ({}) Validation error in field {}:".format( id(loader), file_base, key), None, [v], ) from v elif isinstance(document, CommentedSeq): i = 0 try: while i < len(document): val = document[i] if isinstance(val, CommentedMap) and ("$import" in val or "$mixin" in val): l, import_metadata = loader.resolve_ref( val, base_url=file_base, checklinks=False) metadata.setdefault("$import_metadata", {}) for identifier in loader.identifiers: if identifier in import_metadata: metadata["$import_metadata"][import_metadata[ identifier]] = import_metadata if isinstance(l, CommentedSeq): lc = document.lc.data[i] del document[i] llen = len(l) for j in range(len(document) + llen, i + llen, -1): document.lc.data[j - 1] = document.lc.data[j - llen] for item in l: cast(CommentedSeq, document).insert(i, item) document.lc.data[i] = lc i += 1 else: document[i] = l i += 1 else: document[i], _ = loader.resolve_all( val, base_url, file_base=file_base, checklinks=False) i += 1 except ValidationException as v: _logger.warning("failed", exc_info=True) raise ValidationException( "({}) ({}) Validation error in position {}:".format( id(loader), file_base, i), None, [v], ) from v if checklinks: all_doc_ids = {} # type: Dict[str, str] loader.validate_links( document, "", all_doc_ids, strict_foreign_properties=strict_foreign_properties, ) return document, metadata