diff env/lib/python3.7/site-packages/schema_salad/metaschema.py @ 5:9b1c78e6ba9c draft default tip

"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author shellac
date Mon, 01 Jun 2020 08:59:25 -0400
parents 79f47841a781
children
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/schema_salad/metaschema.py	Thu May 14 16:47:39 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2822 +0,0 @@
-#
-# This file was autogenerated using schema-salad-tool --codegen=python
-# The code itself is released under the Apache 2.0 license and the help text is
-# subject to the license of the original schema.
-#
-import copy
-import os
-import re
-import uuid  # pylint: disable=unused-import # noqa: F401
-from typing import (
-    Any,
-    Dict,
-    List,
-    MutableMapping,
-    MutableSequence,
-    Optional,
-    Sequence,
-    Tuple,
-    Type,
-    Union,
-)
-
-from six import iteritems, string_types, text_type
-from six.moves import StringIO, urllib
-from typing_extensions import Text  # pylint: disable=unused-import
-
-from ruamel import yaml
-from ruamel.yaml.comments import CommentedMap
-from schema_salad.ref_resolver import Fetcher
-from schema_salad.sourceline import SourceLine, add_lc_filename
-from schema_salad.exceptions import SchemaSaladException, ValidationException
-
-# move to a regular typing import when Python 3.3-3.6 is no longer supported
-
-_vocab = {}  # type: Dict[Text, Text]
-_rvocab = {}  # type: Dict[Text, Text]
-
-
-class Savable(object):
-    @classmethod
-    def fromDoc(cls, _doc, baseuri, loadingOptions, docRoot=None):
-        # type: (Any, Text, LoadingOptions, Optional[Text]) -> Savable
-        pass
-
-    def save(self, top=False, base_url="", relative_uris=True):
-        # type: (bool, Text, bool) -> Dict[Text, Text]
-        pass
-
-
-class LoadingOptions(object):
-    def __init__(
-        self,
-        fetcher=None,  # type: Optional[Fetcher]
-        namespaces=None,  # type: Optional[Dict[Text, Text]]
-        fileuri=None,  # type: Optional[Text]
-        copyfrom=None,  # type: Optional[LoadingOptions]
-        schemas=None,  # type: Optional[List[Text]]
-        original_doc=None,  # type: Optional[Any]
-    ):  # type: (...) -> None
-        self.idx = {}  # type: Dict[Text, Text]
-        self.fileuri = fileuri  # type: Optional[Text]
-        self.namespaces = namespaces
-        self.schemas = schemas
-        self.original_doc = original_doc
-        if copyfrom is not None:
-            self.idx = copyfrom.idx
-            if fetcher is None:
-                fetcher = copyfrom.fetcher
-            if fileuri is None:
-                self.fileuri = copyfrom.fileuri
-            if namespaces is None:
-                self.namespaces = copyfrom.namespaces
-            if namespaces is None:
-                schemas = copyfrom.schemas
-
-        if fetcher is None:
-            import requests
-            from cachecontrol.wrapper import CacheControl
-            from cachecontrol.caches import FileCache
-            from schema_salad.ref_resolver import DefaultFetcher
-
-            if "HOME" in os.environ:
-                session = CacheControl(
-                    requests.Session(),
-                    cache=FileCache(
-                        os.path.join(os.environ["HOME"], ".cache", "salad")
-                    ),
-                )
-            elif "TMPDIR" in os.environ:
-                session = CacheControl(
-                    requests.Session(),
-                    cache=FileCache(
-                        os.path.join(os.environ["TMPDIR"], ".cache", "salad")
-                    ),
-                )
-            else:
-                session = CacheControl(
-                    requests.Session(), cache=FileCache("/tmp", ".cache", "salad")
-                )
-            self.fetcher = DefaultFetcher({}, session)  # type: Fetcher
-        else:
-            self.fetcher = fetcher
-
-        self.vocab = _vocab
-        self.rvocab = _rvocab
-
-        if namespaces is not None:
-            self.vocab = self.vocab.copy()
-            self.rvocab = self.rvocab.copy()
-            for k, v in iteritems(namespaces):
-                self.vocab[k] = v
-                self.rvocab[v] = k
-
-
-def load_field(val, fieldtype, baseuri, loadingOptions):
-    # type: (Union[Text, Dict[Text, Text]], _Loader, Text, LoadingOptions) -> Any
-    if isinstance(val, MutableMapping):
-        if "$import" in val:
-            if loadingOptions.fileuri is None:
-                raise SchemaSaladException("Cannot load $import without fileuri")
-            return _document_load_by_url(
-                fieldtype,
-                loadingOptions.fetcher.urljoin(loadingOptions.fileuri, val["$import"]),
-                loadingOptions,
-            )
-        elif "$include" in val:
-            if loadingOptions.fileuri is None:
-                raise SchemaSaladException("Cannot load $import without fileuri")
-            val = loadingOptions.fetcher.fetch_text(
-                loadingOptions.fetcher.urljoin(loadingOptions.fileuri, val["$include"])
-            )
-    return fieldtype.load(val, baseuri, loadingOptions)
-
-
-save_type = Union[
-    Dict[Text, Text], List[Union[Dict[Text, Text], List[Any], None]], None
-]
-
-
-def save(
-    val,  # type: Optional[Union[Savable, MutableSequence[Savable]]]
-    top=True,  # type: bool
-    base_url="",  # type: Text
-    relative_uris=True,  # type: bool
-):  # type: (...) -> save_type
-
-    if isinstance(val, Savable):
-        return val.save(top=top, base_url=base_url, relative_uris=relative_uris)
-    if isinstance(val, MutableSequence):
-        return [
-            save(v, top=False, base_url=base_url, relative_uris=relative_uris)
-            for v in val
-        ]
-    if isinstance(val, MutableMapping):
-        newdict = {}
-        for key in val:
-            newdict[key] = save(
-                val[key], top=False, base_url=base_url, relative_uris=relative_uris
-            )
-        return newdict
-    return val
-
-
-def expand_url(
-    url,  # type: Union[str, Text]
-    base_url,  # type: Union[str, Text]
-    loadingOptions,  # type: LoadingOptions
-    scoped_id=False,  # type: bool
-    vocab_term=False,  # type: bool
-    scoped_ref=None,  # type: Optional[int]
-):
-    # type: (...) -> Text
-
-    if not isinstance(url, string_types):
-        return url
-
-    url = Text(url)
-
-    if url in (u"@id", u"@type"):
-        return url
-
-    if vocab_term and url in loadingOptions.vocab:
-        return url
-
-    if bool(loadingOptions.vocab) and u":" in url:
-        prefix = url.split(u":")[0]
-        if prefix in loadingOptions.vocab:
-            url = loadingOptions.vocab[prefix] + url[len(prefix) + 1 :]
-
-    split = urllib.parse.urlsplit(url)
-
-    if (
-        (bool(split.scheme) and split.scheme in [u"http", u"https", u"file"])
-        or url.startswith(u"$(")
-        or url.startswith(u"${")
-    ):
-        pass
-    elif scoped_id and not bool(split.fragment):
-        splitbase = urllib.parse.urlsplit(base_url)
-        frg = u""
-        if bool(splitbase.fragment):
-            frg = splitbase.fragment + u"/" + split.path
-        else:
-            frg = split.path
-        pt = splitbase.path if splitbase.path != "" else "/"
-        url = urllib.parse.urlunsplit(
-            (splitbase.scheme, splitbase.netloc, pt, splitbase.query, frg)
-        )
-    elif scoped_ref is not None and not bool(split.fragment):
-        splitbase = urllib.parse.urlsplit(base_url)
-        sp = splitbase.fragment.split(u"/")
-        n = scoped_ref
-        while n > 0 and len(sp) > 0:
-            sp.pop()
-            n -= 1
-        sp.append(url)
-        url = urllib.parse.urlunsplit(
-            (
-                splitbase.scheme,
-                splitbase.netloc,
-                splitbase.path,
-                splitbase.query,
-                u"/".join(sp),
-            )
-        )
-    else:
-        url = loadingOptions.fetcher.urljoin(base_url, url)
-
-    if vocab_term:
-        split = urllib.parse.urlsplit(url)
-        if bool(split.scheme):
-            if url in loadingOptions.rvocab:
-                return loadingOptions.rvocab[url]
-        else:
-            raise ValidationException("Term '{}' not in vocabulary".format(url))
-
-    return url
-
-
-class _Loader(object):
-    def load(self, doc, baseuri, loadingOptions, docRoot=None):
-        # type: (Any, Text, LoadingOptions, Optional[Text]) -> Any
-        pass
-
-
-class _AnyLoader(_Loader):
-    def load(self, doc, baseuri, loadingOptions, docRoot=None):
-        # type: (Any, Text, LoadingOptions, Optional[Text]) -> Any
-        if doc is not None:
-            return doc
-        raise ValidationException("Expected non-null")
-
-
-class _PrimitiveLoader(_Loader):
-    def __init__(self, tp):
-        # type: (Union[type, Tuple[Type[Text], Type[Text]]]) -> None
-        self.tp = tp
-
-    def load(self, doc, baseuri, loadingOptions, docRoot=None):
-        # type: (Any, Text, LoadingOptions, Optional[Text]) -> Any
-        if not isinstance(doc, self.tp):
-            raise ValidationException(
-                "Expected a {} but got {}".format(
-                    self.tp.__class__.__name__, doc.__class__.__name__
-                )
-            )
-        return doc
-
-    def __repr__(self):  # type: () -> str
-        return str(self.tp)
-
-
-class _ArrayLoader(_Loader):
-    def __init__(self, items):
-        # type: (_Loader) -> None
-        self.items = items
-
-    def load(self, doc, baseuri, loadingOptions, docRoot=None):
-        # type: (Any, Text, LoadingOptions, Optional[Text]) -> Any
-        if not isinstance(doc, MutableSequence):
-            raise ValidationException("Expected a list")
-        r = []  # type: List[Any]
-        errors = []  # type: List[SchemaSaladException]
-        for i in range(0, len(doc)):
-            try:
-                lf = load_field(
-                    doc[i], _UnionLoader((self, self.items)), baseuri, loadingOptions
-                )
-                if isinstance(lf, MutableSequence):
-                    r.extend(lf)
-                else:
-                    r.append(lf)
-            except ValidationException as e:
-                errors.append(e.with_sourceline(SourceLine(doc, i, str)))
-        if errors:
-            raise ValidationException("", None, errors)
-        return r
-
-    def __repr__(self):  # type: () -> str
-        return "array<{}>".format(self.items)
-
-
-class _EnumLoader(_Loader):
-    def __init__(self, symbols):
-        # type: (Sequence[Text]) -> None
-        self.symbols = symbols
-
-    def load(self, doc, baseuri, loadingOptions, docRoot=None):
-        # type: (Any, Text, LoadingOptions, Optional[Text]) -> Any
-        if doc in self.symbols:
-            return doc
-        else:
-            raise ValidationException("Expected one of {}".format(self.symbols))
-
-
-class _RecordLoader(_Loader):
-    def __init__(self, classtype):
-        # type: (Type[Savable]) -> None
-        self.classtype = classtype
-
-    def load(self, doc, baseuri, loadingOptions, docRoot=None):
-        # type: (Any, Text, LoadingOptions, Optional[Text]) -> Any
-        if not isinstance(doc, MutableMapping):
-            raise ValidationException("Expected a dict")
-        return self.classtype.fromDoc(doc, baseuri, loadingOptions, docRoot=docRoot)
-
-    def __repr__(self):  # type: () -> str
-        return str(self.classtype)
-
-
-class _UnionLoader(_Loader):
-    def __init__(self, alternates):
-        # type: (Sequence[_Loader]) -> None
-        self.alternates = alternates
-
-    def load(self, doc, baseuri, loadingOptions, docRoot=None):
-        # type: (Any, Text, LoadingOptions, Optional[Text]) -> Any
-        errors = []
-        for t in self.alternates:
-            try:
-                return t.load(doc, baseuri, loadingOptions, docRoot=docRoot)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        u"tried {} but".format(t.__class__.__name__), None, [e]
-                    )
-                )
-        raise ValidationException("", None, errors, u"-")
-
-    def __repr__(self):  # type: () -> str
-        return " | ".join(str(a) for a in self.alternates)
-
-
-class _URILoader(_Loader):
-    def __init__(self, inner, scoped_id, vocab_term, scoped_ref):
-        # type: (_Loader, bool, bool, Union[int, None]) -> None
-        self.inner = inner
-        self.scoped_id = scoped_id
-        self.vocab_term = vocab_term
-        self.scoped_ref = scoped_ref
-
-    def load(self, doc, baseuri, loadingOptions, docRoot=None):
-        # type: (Any, Text, LoadingOptions, Optional[Text]) -> Any
-        if isinstance(doc, MutableSequence):
-            doc = [
-                expand_url(
-                    i,
-                    baseuri,
-                    loadingOptions,
-                    self.scoped_id,
-                    self.vocab_term,
-                    self.scoped_ref,
-                )
-                for i in doc
-            ]
-        if isinstance(doc, string_types):
-            doc = expand_url(
-                doc,
-                baseuri,
-                loadingOptions,
-                self.scoped_id,
-                self.vocab_term,
-                self.scoped_ref,
-            )
-        return self.inner.load(doc, baseuri, loadingOptions)
-
-
-class _TypeDSLLoader(_Loader):
-    typeDSLregex = re.compile(r"^([^[?]+)(\[\])?(\?)?$")
-
-    def __init__(self, inner, refScope):
-        # type: (_Loader, Union[int, None]) -> None
-        self.inner = inner
-        self.refScope = refScope
-
-    def resolve(self, doc, baseuri, loadingOptions):
-        # type: (Any, Text, LoadingOptions) -> Any
-        m = self.typeDSLregex.match(doc)
-        if m:
-            first = expand_url(
-                m.group(1), baseuri, loadingOptions, False, True, self.refScope
-            )
-            second = third = None
-            if bool(m.group(2)):
-                second = {"type": "array", "items": first}
-                # second = CommentedMap((("type", "array"),
-                #                       ("items", first)))
-                # second.lc.add_kv_line_col("type", lc)
-                # second.lc.add_kv_line_col("items", lc)
-                # second.lc.filename = filename
-            if bool(m.group(3)):
-                third = [u"null", second or first]
-                # third = CommentedSeq([u"null", second or first])
-                # third.lc.add_kv_line_col(0, lc)
-                # third.lc.add_kv_line_col(1, lc)
-                # third.lc.filename = filename
-            doc = third or second or first
-        return doc
-
-    def load(self, doc, baseuri, loadingOptions, docRoot=None):
-        # type: (Any, Text, LoadingOptions, Optional[Text]) -> Any
-        if isinstance(doc, MutableSequence):
-            r = []  # type: List[Any]
-            for d in doc:
-                if isinstance(d, string_types):
-                    resolved = self.resolve(d, baseuri, loadingOptions)
-                    if isinstance(resolved, MutableSequence):
-                        for i in resolved:
-                            if i not in r:
-                                r.append(i)
-                    else:
-                        if resolved not in r:
-                            r.append(resolved)
-                else:
-                    r.append(d)
-            doc = r
-        elif isinstance(doc, string_types):
-            doc = self.resolve(doc, baseuri, loadingOptions)
-
-        return self.inner.load(doc, baseuri, loadingOptions)
-
-
-class _IdMapLoader(_Loader):
-    def __init__(self, inner, mapSubject, mapPredicate):
-        # type: (_Loader, Text, Union[Text, None]) -> None
-        self.inner = inner
-        self.mapSubject = mapSubject
-        self.mapPredicate = mapPredicate
-
-    def load(self, doc, baseuri, loadingOptions, docRoot=None):
-        # type: (Any, Text, LoadingOptions, Optional[Text]) -> Any
-        if isinstance(doc, MutableMapping):
-            r = []  # type: List[Any]
-            for k in sorted(doc.keys()):
-                val = doc[k]
-                if isinstance(val, CommentedMap):
-                    v = copy.copy(val)
-                    v.lc.data = val.lc.data
-                    v.lc.filename = val.lc.filename
-                    v[self.mapSubject] = k
-                    r.append(v)
-                elif isinstance(val, MutableMapping):
-                    v2 = copy.copy(val)
-                    v2[self.mapSubject] = k
-                    r.append(v2)
-                else:
-                    if self.mapPredicate:
-                        v3 = {self.mapPredicate: val}
-                        v3[self.mapSubject] = k
-                        r.append(v3)
-                    else:
-                        raise ValidationException("No mapPredicate")
-            doc = r
-        return self.inner.load(doc, baseuri, loadingOptions)
-
-
-def _document_load(loader, doc, baseuri, loadingOptions):
-    # type: (_Loader, Any, Text, LoadingOptions) -> Any
-    if isinstance(doc, string_types):
-        return _document_load_by_url(
-            loader, loadingOptions.fetcher.urljoin(baseuri, doc), loadingOptions
-        )
-
-    if isinstance(doc, MutableMapping):
-        if "$namespaces" in doc:
-            loadingOptions = LoadingOptions(
-                copyfrom=loadingOptions, namespaces=doc["$namespaces"]
-            )
-            doc = {k: v for k, v in doc.items() if k != "$namespaces"}
-
-        if "$schemas" in doc:
-            loadingOptions = LoadingOptions(
-                copyfrom=loadingOptions, schemas=doc["$schemas"]
-            )
-            doc = {k: v for k, v in doc.items() if k != "$schemas"}
-
-        if "$base" in doc:
-            baseuri = doc["$base"]
-
-        if "$graph" in doc:
-            return loader.load(doc["$graph"], baseuri, loadingOptions)
-        else:
-            return loader.load(doc, baseuri, loadingOptions, docRoot=baseuri)
-
-    if isinstance(doc, MutableSequence):
-        return loader.load(doc, baseuri, loadingOptions)
-
-    raise ValidationException("Oops, we shouldn't be here!")
-
-
-def _document_load_by_url(loader, url, loadingOptions):
-    # type: (_Loader, Text, LoadingOptions) -> Any
-    if url in loadingOptions.idx:
-        return _document_load(loader, loadingOptions.idx[url], url, loadingOptions)
-
-    text = loadingOptions.fetcher.fetch_text(url)
-    if isinstance(text, bytes):
-        textIO = StringIO(text.decode("utf-8"))
-    else:
-        textIO = StringIO(text)
-    textIO.name = str(url)
-    result = yaml.round_trip_load(textIO, preserve_quotes=True)
-    add_lc_filename(result, url)
-
-    loadingOptions.idx[url] = result
-
-    loadingOptions = LoadingOptions(copyfrom=loadingOptions, fileuri=url)
-
-    return _document_load(loader, result, url, loadingOptions)
-
-
-def file_uri(path, split_frag=False):  # type: (str, bool) -> str
-    if path.startswith("file://"):
-        return path
-    if split_frag:
-        pathsp = path.split("#", 2)
-        frag = "#" + urllib.parse.quote(str(pathsp[1])) if len(pathsp) == 2 else ""
-        urlpath = urllib.request.pathname2url(str(pathsp[0]))
-    else:
-        urlpath = urllib.request.pathname2url(path)
-        frag = ""
-    if urlpath.startswith("//"):
-        return "file:{}{}".format(urlpath, frag)
-    else:
-        return "file://{}{}".format(urlpath, frag)
-
-
-def prefix_url(url, namespaces):  # type: (Text, Dict[Text, Text]) -> Text
-    for k, v in namespaces.items():
-        if url.startswith(v):
-            return k + ":" + url[len(v) :]
-    return url
-
-
-def save_relative_uri(uri, base_url, scoped_id, ref_scope, relative_uris):
-    # type: (Text, Text, bool, Optional[int], bool) -> Union[Text, List[Text]]
-    if not relative_uris:
-        return uri
-    if isinstance(uri, MutableSequence):
-        return [
-            save_relative_uri(u, base_url, scoped_id, ref_scope, relative_uris)
-            for u in uri
-        ]
-    elif isinstance(uri, text_type):
-        urisplit = urllib.parse.urlsplit(uri)
-        basesplit = urllib.parse.urlsplit(base_url)
-        if urisplit.scheme == basesplit.scheme and urisplit.netloc == basesplit.netloc:
-            if urisplit.path != basesplit.path:
-                p = os.path.relpath(urisplit.path, os.path.dirname(basesplit.path))
-                if urisplit.fragment:
-                    p = p + "#" + urisplit.fragment
-                return p
-
-            basefrag = basesplit.fragment + "/"
-            if ref_scope:
-                sp = basefrag.split("/")
-                i = 0
-                while i < ref_scope:
-                    sp.pop()
-                    i += 1
-                basefrag = "/".join(sp)
-
-            if urisplit.fragment.startswith(basefrag):
-                return urisplit.fragment[len(basefrag) :]
-            else:
-                return urisplit.fragment
-        return uri
-    else:
-        return save(uri, top=False, base_url=base_url)
-
-
-class Documented(Savable):
-    pass
-
-
-class RecordField(Documented):
-    """
-A field of a record.
-    """
-    def __init__(
-        self,
-        doc,  # type: Any
-        name,  # type: Any
-        type,  # type: Any
-        extension_fields=None,  # type: Optional[Dict[Text, Any]]
-        loadingOptions=None  # type: Optional[LoadingOptions]
-    ):  # type: (...) -> None
-
-        if extension_fields:
-            self.extension_fields = extension_fields
-        else:
-            self.extension_fields = yaml.comments.CommentedMap()
-        if loadingOptions:
-            self.loadingOptions = loadingOptions
-        else:
-            self.loadingOptions = LoadingOptions()
-        self.doc = doc
-        self.name = name
-        self.type = type
-
-    @classmethod
-    def fromDoc(cls, doc, baseuri, loadingOptions, docRoot=None):
-        # type: (Any, Text, LoadingOptions, Optional[Text]) -> RecordField
-
-        _doc = copy.copy(doc)
-        if hasattr(doc, 'lc'):
-            _doc.lc.data = doc.lc.data
-            _doc.lc.filename = doc.lc.filename
-        errors = []
-        if 'name' in _doc:
-            try:
-                name = load_field(_doc.get(
-                    'name'), uri_strtype_True_False_None, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `name` field is not valid because:",
-                        SourceLine(_doc, 'name', str),
-                        [e]
-                    )
-                )
-        else:
-            name = None
-
-        if name is None:
-            if docRoot is not None:
-                name = docRoot
-            else:
-                raise ValidationException("Missing name")
-        baseuri = name
-        if 'doc' in _doc:
-            try:
-                doc = load_field(_doc.get(
-                    'doc'), union_of_None_type_or_strtype_or_array_of_strtype, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `doc` field is not valid because:",
-                        SourceLine(_doc, 'doc', str),
-                        [e]
-                    )
-                )
-        else:
-            doc = None
-        try:
-            type = load_field(_doc.get(
-                'type'), typedsl_union_of_PrimitiveTypeLoader_or_RecordSchemaLoader_or_EnumSchemaLoader_or_ArraySchemaLoader_or_strtype_or_array_of_union_of_PrimitiveTypeLoader_or_RecordSchemaLoader_or_EnumSchemaLoader_or_ArraySchemaLoader_or_strtype_2, baseuri, loadingOptions)
-        except ValidationException as e:
-            errors.append(
-                ValidationException(
-                    "the `type` field is not valid because:",
-                    SourceLine(_doc, 'type', str),
-                    [e]
-                )
-            )
-
-        extension_fields = yaml.comments.CommentedMap()
-        for k in _doc.keys():
-            if k not in cls.attrs:
-                if ":" in k:
-                    ex = expand_url(k,
-                                    u"",
-                                    loadingOptions,
-                                    scoped_id=False,
-                                    vocab_term=False)
-                    extension_fields[ex] = _doc[k]
-                else:
-                    errors.append(
-                        ValidationException(
-                            "invalid field `%s`, expected one of: `doc`, `name`, `type`" % (k),
-                            SourceLine(_doc, k, str)
-                        )
-                    )
-                    break
-
-        if errors:
-            raise ValidationException("Trying 'RecordField'", None, errors)
-        loadingOptions = copy.deepcopy(loadingOptions)
-        loadingOptions.original_doc = _doc
-        return cls(doc, name, type, extension_fields=extension_fields, loadingOptions=loadingOptions)
-
-    def save(self, top=False, base_url="", relative_uris=True):
-        # type: (bool, Text, bool) -> Dict[Text, Any]
-        r = yaml.comments.CommentedMap()  # type: Dict[Text, Any]
-        for ef in self.extension_fields:
-            r[prefix_url(ef, self.loadingOptions.vocab)] = self.extension_fields[ef]
-
-        if self.name is not None:
-            u = save_relative_uri(
-                self.name,
-                base_url,
-                True,
-                None,
-                relative_uris)
-            if u:
-                r['name'] = u
-
-        if self.doc is not None:
-            r['doc'] = save(
-                self.doc,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if self.type is not None:
-            r['type'] = save(
-                self.type,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if top and self.loadingOptions.namespaces:
-            r["$namespaces"] = self.loadingOptions.namespaces
-
-        return r
-
-    attrs = frozenset(['doc', 'name', 'type'])
-
-
-class RecordSchema(Savable):
-    def __init__(
-        self,
-        fields,  # type: Any
-        type,  # type: Any
-        extension_fields=None,  # type: Optional[Dict[Text, Any]]
-        loadingOptions=None  # type: Optional[LoadingOptions]
-    ):  # type: (...) -> None
-
-        if extension_fields:
-            self.extension_fields = extension_fields
-        else:
-            self.extension_fields = yaml.comments.CommentedMap()
-        if loadingOptions:
-            self.loadingOptions = loadingOptions
-        else:
-            self.loadingOptions = LoadingOptions()
-        self.fields = fields
-        self.type = type
-
-    @classmethod
-    def fromDoc(cls, doc, baseuri, loadingOptions, docRoot=None):
-        # type: (Any, Text, LoadingOptions, Optional[Text]) -> RecordSchema
-
-        _doc = copy.copy(doc)
-        if hasattr(doc, 'lc'):
-            _doc.lc.data = doc.lc.data
-            _doc.lc.filename = doc.lc.filename
-        errors = []
-        if 'fields' in _doc:
-            try:
-                fields = load_field(_doc.get(
-                    'fields'), idmap_fields_union_of_None_type_or_array_of_RecordFieldLoader, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `fields` field is not valid because:",
-                        SourceLine(_doc, 'fields', str),
-                        [e]
-                    )
-                )
-        else:
-            fields = None
-        try:
-            type = load_field(_doc.get(
-                'type'), typedsl_enum_d9cba076fca539106791a4f46d198c7fcfbdb779Loader_2, baseuri, loadingOptions)
-        except ValidationException as e:
-            errors.append(
-                ValidationException(
-                    "the `type` field is not valid because:",
-                    SourceLine(_doc, 'type', str),
-                    [e]
-                )
-            )
-
-        extension_fields = yaml.comments.CommentedMap()
-        for k in _doc.keys():
-            if k not in cls.attrs:
-                if ":" in k:
-                    ex = expand_url(k,
-                                    u"",
-                                    loadingOptions,
-                                    scoped_id=False,
-                                    vocab_term=False)
-                    extension_fields[ex] = _doc[k]
-                else:
-                    errors.append(
-                        ValidationException(
-                            "invalid field `%s`, expected one of: `fields`, `type`" % (k),
-                            SourceLine(_doc, k, str)
-                        )
-                    )
-                    break
-
-        if errors:
-            raise ValidationException("Trying 'RecordSchema'", None, errors)
-        loadingOptions = copy.deepcopy(loadingOptions)
-        loadingOptions.original_doc = _doc
-        return cls(fields, type, extension_fields=extension_fields, loadingOptions=loadingOptions)
-
-    def save(self, top=False, base_url="", relative_uris=True):
-        # type: (bool, Text, bool) -> Dict[Text, Any]
-        r = yaml.comments.CommentedMap()  # type: Dict[Text, Any]
-        for ef in self.extension_fields:
-            r[prefix_url(ef, self.loadingOptions.vocab)] = self.extension_fields[ef]
-
-        if self.fields is not None:
-            r['fields'] = save(
-                self.fields,
-                top=False,
-                base_url=base_url,
-                relative_uris=relative_uris)
-
-        if self.type is not None:
-            r['type'] = save(
-                self.type,
-                top=False,
-                base_url=base_url,
-                relative_uris=relative_uris)
-
-        if top and self.loadingOptions.namespaces:
-            r["$namespaces"] = self.loadingOptions.namespaces
-
-        return r
-
-    attrs = frozenset(['fields', 'type'])
-
-
-class EnumSchema(Savable):
-    """
-Define an enumerated type.
-
-    """
-    def __init__(
-        self,
-        symbols,  # type: Any
-        type,  # type: Any
-        extension_fields=None,  # type: Optional[Dict[Text, Any]]
-        loadingOptions=None  # type: Optional[LoadingOptions]
-    ):  # type: (...) -> None
-
-        if extension_fields:
-            self.extension_fields = extension_fields
-        else:
-            self.extension_fields = yaml.comments.CommentedMap()
-        if loadingOptions:
-            self.loadingOptions = loadingOptions
-        else:
-            self.loadingOptions = LoadingOptions()
-        self.symbols = symbols
-        self.type = type
-
-    @classmethod
-    def fromDoc(cls, doc, baseuri, loadingOptions, docRoot=None):
-        # type: (Any, Text, LoadingOptions, Optional[Text]) -> EnumSchema
-
-        _doc = copy.copy(doc)
-        if hasattr(doc, 'lc'):
-            _doc.lc.data = doc.lc.data
-            _doc.lc.filename = doc.lc.filename
-        errors = []
-        try:
-            symbols = load_field(_doc.get(
-                'symbols'), uri_array_of_strtype_True_False_None, baseuri, loadingOptions)
-        except ValidationException as e:
-            errors.append(
-                ValidationException(
-                    "the `symbols` field is not valid because:",
-                    SourceLine(_doc, 'symbols', str),
-                    [e]
-                )
-            )
-        try:
-            type = load_field(_doc.get(
-                'type'), typedsl_enum_d961d79c225752b9fadb617367615ab176b47d77Loader_2, baseuri, loadingOptions)
-        except ValidationException as e:
-            errors.append(
-                ValidationException(
-                    "the `type` field is not valid because:",
-                    SourceLine(_doc, 'type', str),
-                    [e]
-                )
-            )
-
-        extension_fields = yaml.comments.CommentedMap()
-        for k in _doc.keys():
-            if k not in cls.attrs:
-                if ":" in k:
-                    ex = expand_url(k,
-                                    u"",
-                                    loadingOptions,
-                                    scoped_id=False,
-                                    vocab_term=False)
-                    extension_fields[ex] = _doc[k]
-                else:
-                    errors.append(
-                        ValidationException(
-                            "invalid field `%s`, expected one of: `symbols`, `type`" % (k),
-                            SourceLine(_doc, k, str)
-                        )
-                    )
-                    break
-
-        if errors:
-            raise ValidationException("Trying 'EnumSchema'", None, errors)
-        loadingOptions = copy.deepcopy(loadingOptions)
-        loadingOptions.original_doc = _doc
-        return cls(symbols, type, extension_fields=extension_fields, loadingOptions=loadingOptions)
-
-    def save(self, top=False, base_url="", relative_uris=True):
-        # type: (bool, Text, bool) -> Dict[Text, Any]
-        r = yaml.comments.CommentedMap()  # type: Dict[Text, Any]
-        for ef in self.extension_fields:
-            r[prefix_url(ef, self.loadingOptions.vocab)] = self.extension_fields[ef]
-
-        if self.symbols is not None:
-            u = save_relative_uri(
-                self.symbols,
-                base_url,
-                True,
-                None,
-                relative_uris)
-            if u:
-                r['symbols'] = u
-
-        if self.type is not None:
-            r['type'] = save(
-                self.type,
-                top=False,
-                base_url=base_url,
-                relative_uris=relative_uris)
-
-        if top and self.loadingOptions.namespaces:
-            r["$namespaces"] = self.loadingOptions.namespaces
-
-        return r
-
-    attrs = frozenset(['symbols', 'type'])
-
-
-class ArraySchema(Savable):
-    def __init__(
-        self,
-        items,  # type: Any
-        type,  # type: Any
-        extension_fields=None,  # type: Optional[Dict[Text, Any]]
-        loadingOptions=None  # type: Optional[LoadingOptions]
-    ):  # type: (...) -> None
-
-        if extension_fields:
-            self.extension_fields = extension_fields
-        else:
-            self.extension_fields = yaml.comments.CommentedMap()
-        if loadingOptions:
-            self.loadingOptions = loadingOptions
-        else:
-            self.loadingOptions = LoadingOptions()
-        self.items = items
-        self.type = type
-
-    @classmethod
-    def fromDoc(cls, doc, baseuri, loadingOptions, docRoot=None):
-        # type: (Any, Text, LoadingOptions, Optional[Text]) -> ArraySchema
-
-        _doc = copy.copy(doc)
-        if hasattr(doc, 'lc'):
-            _doc.lc.data = doc.lc.data
-            _doc.lc.filename = doc.lc.filename
-        errors = []
-        try:
-            items = load_field(_doc.get(
-                'items'), uri_union_of_PrimitiveTypeLoader_or_RecordSchemaLoader_or_EnumSchemaLoader_or_ArraySchemaLoader_or_strtype_or_array_of_union_of_PrimitiveTypeLoader_or_RecordSchemaLoader_or_EnumSchemaLoader_or_ArraySchemaLoader_or_strtype_False_True_2, baseuri, loadingOptions)
-        except ValidationException as e:
-            errors.append(
-                ValidationException(
-                    "the `items` field is not valid because:",
-                    SourceLine(_doc, 'items', str),
-                    [e]
-                )
-            )
-        try:
-            type = load_field(_doc.get(
-                'type'), typedsl_enum_d062602be0b4b8fd33e69e29a841317b6ab665bcLoader_2, baseuri, loadingOptions)
-        except ValidationException as e:
-            errors.append(
-                ValidationException(
-                    "the `type` field is not valid because:",
-                    SourceLine(_doc, 'type', str),
-                    [e]
-                )
-            )
-
-        extension_fields = yaml.comments.CommentedMap()
-        for k in _doc.keys():
-            if k not in cls.attrs:
-                if ":" in k:
-                    ex = expand_url(k,
-                                    u"",
-                                    loadingOptions,
-                                    scoped_id=False,
-                                    vocab_term=False)
-                    extension_fields[ex] = _doc[k]
-                else:
-                    errors.append(
-                        ValidationException(
-                            "invalid field `%s`, expected one of: `items`, `type`" % (k),
-                            SourceLine(_doc, k, str)
-                        )
-                    )
-                    break
-
-        if errors:
-            raise ValidationException("Trying 'ArraySchema'", None, errors)
-        loadingOptions = copy.deepcopy(loadingOptions)
-        loadingOptions.original_doc = _doc
-        return cls(items, type, extension_fields=extension_fields, loadingOptions=loadingOptions)
-
-    def save(self, top=False, base_url="", relative_uris=True):
-        # type: (bool, Text, bool) -> Dict[Text, Any]
-        r = yaml.comments.CommentedMap()  # type: Dict[Text, Any]
-        for ef in self.extension_fields:
-            r[prefix_url(ef, self.loadingOptions.vocab)] = self.extension_fields[ef]
-
-        if self.items is not None:
-            u = save_relative_uri(
-                self.items,
-                base_url,
-                False,
-                2,
-                relative_uris)
-            if u:
-                r['items'] = u
-
-        if self.type is not None:
-            r['type'] = save(
-                self.type,
-                top=False,
-                base_url=base_url,
-                relative_uris=relative_uris)
-
-        if top and self.loadingOptions.namespaces:
-            r["$namespaces"] = self.loadingOptions.namespaces
-
-        return r
-
-    attrs = frozenset(['items', 'type'])
-
-
-class JsonldPredicate(Savable):
-    """
-Attached to a record field to define how the parent record field is handled for
-URI resolution and JSON-LD context generation.
-
-    """
-    def __init__(
-        self,
-        _id,  # type: Any
-        _type,  # type: Any
-        _container,  # type: Any
-        identity,  # type: Any
-        noLinkCheck,  # type: Any
-        mapSubject,  # type: Any
-        mapPredicate,  # type: Any
-        refScope,  # type: Any
-        typeDSL,  # type: Any
-        secondaryFilesDSL,  # type: Any
-        subscope,  # type: Any
-        extension_fields=None,  # type: Optional[Dict[Text, Any]]
-        loadingOptions=None  # type: Optional[LoadingOptions]
-    ):  # type: (...) -> None
-
-        if extension_fields:
-            self.extension_fields = extension_fields
-        else:
-            self.extension_fields = yaml.comments.CommentedMap()
-        if loadingOptions:
-            self.loadingOptions = loadingOptions
-        else:
-            self.loadingOptions = LoadingOptions()
-        self._id = _id
-        self._type = _type
-        self._container = _container
-        self.identity = identity
-        self.noLinkCheck = noLinkCheck
-        self.mapSubject = mapSubject
-        self.mapPredicate = mapPredicate
-        self.refScope = refScope
-        self.typeDSL = typeDSL
-        self.secondaryFilesDSL = secondaryFilesDSL
-        self.subscope = subscope
-
-    @classmethod
-    def fromDoc(cls, doc, baseuri, loadingOptions, docRoot=None):
-        # type: (Any, Text, LoadingOptions, Optional[Text]) -> JsonldPredicate
-
-        _doc = copy.copy(doc)
-        if hasattr(doc, 'lc'):
-            _doc.lc.data = doc.lc.data
-            _doc.lc.filename = doc.lc.filename
-        errors = []
-        if '_id' in _doc:
-            try:
-                _id = load_field(_doc.get(
-                    '_id'), uri_union_of_None_type_or_strtype_True_False_None, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `_id` field is not valid because:",
-                        SourceLine(_doc, '_id', str),
-                        [e]
-                    )
-                )
-        else:
-            _id = None
-        if '_type' in _doc:
-            try:
-                _type = load_field(_doc.get(
-                    '_type'), union_of_None_type_or_strtype, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `_type` field is not valid because:",
-                        SourceLine(_doc, '_type', str),
-                        [e]
-                    )
-                )
-        else:
-            _type = None
-        if '_container' in _doc:
-            try:
-                _container = load_field(_doc.get(
-                    '_container'), union_of_None_type_or_strtype, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `_container` field is not valid because:",
-                        SourceLine(_doc, '_container', str),
-                        [e]
-                    )
-                )
-        else:
-            _container = None
-        if 'identity' in _doc:
-            try:
-                identity = load_field(_doc.get(
-                    'identity'), union_of_None_type_or_booltype, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `identity` field is not valid because:",
-                        SourceLine(_doc, 'identity', str),
-                        [e]
-                    )
-                )
-        else:
-            identity = None
-        if 'noLinkCheck' in _doc:
-            try:
-                noLinkCheck = load_field(_doc.get(
-                    'noLinkCheck'), union_of_None_type_or_booltype, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `noLinkCheck` field is not valid because:",
-                        SourceLine(_doc, 'noLinkCheck', str),
-                        [e]
-                    )
-                )
-        else:
-            noLinkCheck = None
-        if 'mapSubject' in _doc:
-            try:
-                mapSubject = load_field(_doc.get(
-                    'mapSubject'), union_of_None_type_or_strtype, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `mapSubject` field is not valid because:",
-                        SourceLine(_doc, 'mapSubject', str),
-                        [e]
-                    )
-                )
-        else:
-            mapSubject = None
-        if 'mapPredicate' in _doc:
-            try:
-                mapPredicate = load_field(_doc.get(
-                    'mapPredicate'), union_of_None_type_or_strtype, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `mapPredicate` field is not valid because:",
-                        SourceLine(_doc, 'mapPredicate', str),
-                        [e]
-                    )
-                )
-        else:
-            mapPredicate = None
-        if 'refScope' in _doc:
-            try:
-                refScope = load_field(_doc.get(
-                    'refScope'), union_of_None_type_or_inttype, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `refScope` field is not valid because:",
-                        SourceLine(_doc, 'refScope', str),
-                        [e]
-                    )
-                )
-        else:
-            refScope = None
-        if 'typeDSL' in _doc:
-            try:
-                typeDSL = load_field(_doc.get(
-                    'typeDSL'), union_of_None_type_or_booltype, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `typeDSL` field is not valid because:",
-                        SourceLine(_doc, 'typeDSL', str),
-                        [e]
-                    )
-                )
-        else:
-            typeDSL = None
-        if 'secondaryFilesDSL' in _doc:
-            try:
-                secondaryFilesDSL = load_field(_doc.get(
-                    'secondaryFilesDSL'), union_of_None_type_or_booltype, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `secondaryFilesDSL` field is not valid because:",
-                        SourceLine(_doc, 'secondaryFilesDSL', str),
-                        [e]
-                    )
-                )
-        else:
-            secondaryFilesDSL = None
-        if 'subscope' in _doc:
-            try:
-                subscope = load_field(_doc.get(
-                    'subscope'), union_of_None_type_or_strtype, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `subscope` field is not valid because:",
-                        SourceLine(_doc, 'subscope', str),
-                        [e]
-                    )
-                )
-        else:
-            subscope = None
-
-        extension_fields = yaml.comments.CommentedMap()
-        for k in _doc.keys():
-            if k not in cls.attrs:
-                if ":" in k:
-                    ex = expand_url(k,
-                                    u"",
-                                    loadingOptions,
-                                    scoped_id=False,
-                                    vocab_term=False)
-                    extension_fields[ex] = _doc[k]
-                else:
-                    errors.append(
-                        ValidationException(
-                            "invalid field `%s`, expected one of: `_id`, `_type`, `_container`, `identity`, `noLinkCheck`, `mapSubject`, `mapPredicate`, `refScope`, `typeDSL`, `secondaryFilesDSL`, `subscope`" % (k),
-                            SourceLine(_doc, k, str)
-                        )
-                    )
-                    break
-
-        if errors:
-            raise ValidationException("Trying 'JsonldPredicate'", None, errors)
-        loadingOptions = copy.deepcopy(loadingOptions)
-        loadingOptions.original_doc = _doc
-        return cls(_id, _type, _container, identity, noLinkCheck, mapSubject, mapPredicate, refScope, typeDSL, secondaryFilesDSL, subscope, extension_fields=extension_fields, loadingOptions=loadingOptions)
-
-    def save(self, top=False, base_url="", relative_uris=True):
-        # type: (bool, Text, bool) -> Dict[Text, Any]
-        r = yaml.comments.CommentedMap()  # type: Dict[Text, Any]
-        for ef in self.extension_fields:
-            r[prefix_url(ef, self.loadingOptions.vocab)] = self.extension_fields[ef]
-
-        if self._id is not None:
-            u = save_relative_uri(
-                self._id,
-                base_url,
-                True,
-                None,
-                relative_uris)
-            if u:
-                r['_id'] = u
-
-        if self._type is not None:
-            r['_type'] = save(
-                self._type,
-                top=False,
-                base_url=base_url,
-                relative_uris=relative_uris)
-
-        if self._container is not None:
-            r['_container'] = save(
-                self._container,
-                top=False,
-                base_url=base_url,
-                relative_uris=relative_uris)
-
-        if self.identity is not None:
-            r['identity'] = save(
-                self.identity,
-                top=False,
-                base_url=base_url,
-                relative_uris=relative_uris)
-
-        if self.noLinkCheck is not None:
-            r['noLinkCheck'] = save(
-                self.noLinkCheck,
-                top=False,
-                base_url=base_url,
-                relative_uris=relative_uris)
-
-        if self.mapSubject is not None:
-            r['mapSubject'] = save(
-                self.mapSubject,
-                top=False,
-                base_url=base_url,
-                relative_uris=relative_uris)
-
-        if self.mapPredicate is not None:
-            r['mapPredicate'] = save(
-                self.mapPredicate,
-                top=False,
-                base_url=base_url,
-                relative_uris=relative_uris)
-
-        if self.refScope is not None:
-            r['refScope'] = save(
-                self.refScope,
-                top=False,
-                base_url=base_url,
-                relative_uris=relative_uris)
-
-        if self.typeDSL is not None:
-            r['typeDSL'] = save(
-                self.typeDSL,
-                top=False,
-                base_url=base_url,
-                relative_uris=relative_uris)
-
-        if self.secondaryFilesDSL is not None:
-            r['secondaryFilesDSL'] = save(
-                self.secondaryFilesDSL,
-                top=False,
-                base_url=base_url,
-                relative_uris=relative_uris)
-
-        if self.subscope is not None:
-            r['subscope'] = save(
-                self.subscope,
-                top=False,
-                base_url=base_url,
-                relative_uris=relative_uris)
-
-        if top and self.loadingOptions.namespaces:
-            r["$namespaces"] = self.loadingOptions.namespaces
-
-        return r
-
-    attrs = frozenset(['_id', '_type', '_container', 'identity', 'noLinkCheck', 'mapSubject', 'mapPredicate', 'refScope', 'typeDSL', 'secondaryFilesDSL', 'subscope'])
-
-
-class SpecializeDef(Savable):
-    def __init__(
-        self,
-        specializeFrom,  # type: Any
-        specializeTo,  # type: Any
-        extension_fields=None,  # type: Optional[Dict[Text, Any]]
-        loadingOptions=None  # type: Optional[LoadingOptions]
-    ):  # type: (...) -> None
-
-        if extension_fields:
-            self.extension_fields = extension_fields
-        else:
-            self.extension_fields = yaml.comments.CommentedMap()
-        if loadingOptions:
-            self.loadingOptions = loadingOptions
-        else:
-            self.loadingOptions = LoadingOptions()
-        self.specializeFrom = specializeFrom
-        self.specializeTo = specializeTo
-
-    @classmethod
-    def fromDoc(cls, doc, baseuri, loadingOptions, docRoot=None):
-        # type: (Any, Text, LoadingOptions, Optional[Text]) -> SpecializeDef
-
-        _doc = copy.copy(doc)
-        if hasattr(doc, 'lc'):
-            _doc.lc.data = doc.lc.data
-            _doc.lc.filename = doc.lc.filename
-        errors = []
-        try:
-            specializeFrom = load_field(_doc.get(
-                'specializeFrom'), uri_strtype_False_False_1, baseuri, loadingOptions)
-        except ValidationException as e:
-            errors.append(
-                ValidationException(
-                    "the `specializeFrom` field is not valid because:",
-                    SourceLine(_doc, 'specializeFrom', str),
-                    [e]
-                )
-            )
-        try:
-            specializeTo = load_field(_doc.get(
-                'specializeTo'), uri_strtype_False_False_1, baseuri, loadingOptions)
-        except ValidationException as e:
-            errors.append(
-                ValidationException(
-                    "the `specializeTo` field is not valid because:",
-                    SourceLine(_doc, 'specializeTo', str),
-                    [e]
-                )
-            )
-
-        extension_fields = yaml.comments.CommentedMap()
-        for k in _doc.keys():
-            if k not in cls.attrs:
-                if ":" in k:
-                    ex = expand_url(k,
-                                    u"",
-                                    loadingOptions,
-                                    scoped_id=False,
-                                    vocab_term=False)
-                    extension_fields[ex] = _doc[k]
-                else:
-                    errors.append(
-                        ValidationException(
-                            "invalid field `%s`, expected one of: `specializeFrom`, `specializeTo`" % (k),
-                            SourceLine(_doc, k, str)
-                        )
-                    )
-                    break
-
-        if errors:
-            raise ValidationException("Trying 'SpecializeDef'", None, errors)
-        loadingOptions = copy.deepcopy(loadingOptions)
-        loadingOptions.original_doc = _doc
-        return cls(specializeFrom, specializeTo, extension_fields=extension_fields, loadingOptions=loadingOptions)
-
-    def save(self, top=False, base_url="", relative_uris=True):
-        # type: (bool, Text, bool) -> Dict[Text, Any]
-        r = yaml.comments.CommentedMap()  # type: Dict[Text, Any]
-        for ef in self.extension_fields:
-            r[prefix_url(ef, self.loadingOptions.vocab)] = self.extension_fields[ef]
-
-        if self.specializeFrom is not None:
-            u = save_relative_uri(
-                self.specializeFrom,
-                base_url,
-                False,
-                1,
-                relative_uris)
-            if u:
-                r['specializeFrom'] = u
-
-        if self.specializeTo is not None:
-            u = save_relative_uri(
-                self.specializeTo,
-                base_url,
-                False,
-                1,
-                relative_uris)
-            if u:
-                r['specializeTo'] = u
-
-        if top and self.loadingOptions.namespaces:
-            r["$namespaces"] = self.loadingOptions.namespaces
-
-        return r
-
-    attrs = frozenset(['specializeFrom', 'specializeTo'])
-
-
-class NamedType(Savable):
-    pass
-
-
-class DocType(Documented):
-    pass
-
-
-class SchemaDefinedType(DocType):
-    """
-Abstract base for schema-defined types.
-
-    """
-    pass
-
-
-class SaladRecordField(RecordField):
-    """
-A field of a record.
-    """
-    def __init__(
-        self,
-        doc,  # type: Any
-        name,  # type: Any
-        type,  # type: Any
-        jsonldPredicate,  # type: Any
-        default,  # type: Any
-        extension_fields=None,  # type: Optional[Dict[Text, Any]]
-        loadingOptions=None  # type: Optional[LoadingOptions]
-    ):  # type: (...) -> None
-
-        if extension_fields:
-            self.extension_fields = extension_fields
-        else:
-            self.extension_fields = yaml.comments.CommentedMap()
-        if loadingOptions:
-            self.loadingOptions = loadingOptions
-        else:
-            self.loadingOptions = LoadingOptions()
-        self.doc = doc
-        self.name = name
-        self.type = type
-        self.jsonldPredicate = jsonldPredicate
-        self.default = default
-
-    @classmethod
-    def fromDoc(cls, doc, baseuri, loadingOptions, docRoot=None):
-        # type: (Any, Text, LoadingOptions, Optional[Text]) -> SaladRecordField
-
-        _doc = copy.copy(doc)
-        if hasattr(doc, 'lc'):
-            _doc.lc.data = doc.lc.data
-            _doc.lc.filename = doc.lc.filename
-        errors = []
-        if 'name' in _doc:
-            try:
-                name = load_field(_doc.get(
-                    'name'), uri_strtype_True_False_None, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `name` field is not valid because:",
-                        SourceLine(_doc, 'name', str),
-                        [e]
-                    )
-                )
-        else:
-            name = None
-
-        if name is None:
-            if docRoot is not None:
-                name = docRoot
-            else:
-                raise ValidationException("Missing name")
-        baseuri = name
-        if 'doc' in _doc:
-            try:
-                doc = load_field(_doc.get(
-                    'doc'), union_of_None_type_or_strtype_or_array_of_strtype, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `doc` field is not valid because:",
-                        SourceLine(_doc, 'doc', str),
-                        [e]
-                    )
-                )
-        else:
-            doc = None
-        try:
-            type = load_field(_doc.get(
-                'type'), typedsl_union_of_PrimitiveTypeLoader_or_RecordSchemaLoader_or_EnumSchemaLoader_or_ArraySchemaLoader_or_strtype_or_array_of_union_of_PrimitiveTypeLoader_or_RecordSchemaLoader_or_EnumSchemaLoader_or_ArraySchemaLoader_or_strtype_2, baseuri, loadingOptions)
-        except ValidationException as e:
-            errors.append(
-                ValidationException(
-                    "the `type` field is not valid because:",
-                    SourceLine(_doc, 'type', str),
-                    [e]
-                )
-            )
-        if 'jsonldPredicate' in _doc:
-            try:
-                jsonldPredicate = load_field(_doc.get(
-                    'jsonldPredicate'), union_of_None_type_or_strtype_or_JsonldPredicateLoader, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `jsonldPredicate` field is not valid because:",
-                        SourceLine(_doc, 'jsonldPredicate', str),
-                        [e]
-                    )
-                )
-        else:
-            jsonldPredicate = None
-        if 'default' in _doc:
-            try:
-                default = load_field(_doc.get(
-                    'default'), union_of_None_type_or_Any_type, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `default` field is not valid because:",
-                        SourceLine(_doc, 'default', str),
-                        [e]
-                    )
-                )
-        else:
-            default = None
-
-        extension_fields = yaml.comments.CommentedMap()
-        for k in _doc.keys():
-            if k not in cls.attrs:
-                if ":" in k:
-                    ex = expand_url(k,
-                                    u"",
-                                    loadingOptions,
-                                    scoped_id=False,
-                                    vocab_term=False)
-                    extension_fields[ex] = _doc[k]
-                else:
-                    errors.append(
-                        ValidationException(
-                            "invalid field `%s`, expected one of: `doc`, `name`, `type`, `jsonldPredicate`, `default`" % (k),
-                            SourceLine(_doc, k, str)
-                        )
-                    )
-                    break
-
-        if errors:
-            raise ValidationException("Trying 'SaladRecordField'", None, errors)
-        loadingOptions = copy.deepcopy(loadingOptions)
-        loadingOptions.original_doc = _doc
-        return cls(doc, name, type, jsonldPredicate, default, extension_fields=extension_fields, loadingOptions=loadingOptions)
-
-    def save(self, top=False, base_url="", relative_uris=True):
-        # type: (bool, Text, bool) -> Dict[Text, Any]
-        r = yaml.comments.CommentedMap()  # type: Dict[Text, Any]
-        for ef in self.extension_fields:
-            r[prefix_url(ef, self.loadingOptions.vocab)] = self.extension_fields[ef]
-
-        if self.name is not None:
-            u = save_relative_uri(
-                self.name,
-                base_url,
-                True,
-                None,
-                relative_uris)
-            if u:
-                r['name'] = u
-
-        if self.doc is not None:
-            r['doc'] = save(
-                self.doc,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if self.type is not None:
-            r['type'] = save(
-                self.type,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if self.jsonldPredicate is not None:
-            r['jsonldPredicate'] = save(
-                self.jsonldPredicate,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if self.default is not None:
-            r['default'] = save(
-                self.default,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if top and self.loadingOptions.namespaces:
-            r["$namespaces"] = self.loadingOptions.namespaces
-
-        return r
-
-    attrs = frozenset(['doc', 'name', 'type', 'jsonldPredicate', 'default'])
-
-
-class SaladRecordSchema(NamedType, RecordSchema, SchemaDefinedType):
-    def __init__(
-        self,
-        name,  # type: Any
-        inVocab,  # type: Any
-        fields,  # type: Any
-        type,  # type: Any
-        doc,  # type: Any
-        docParent,  # type: Any
-        docChild,  # type: Any
-        docAfter,  # type: Any
-        jsonldPredicate,  # type: Any
-        documentRoot,  # type: Any
-        abstract,  # type: Any
-        extends,  # type: Any
-        specialize,  # type: Any
-        extension_fields=None,  # type: Optional[Dict[Text, Any]]
-        loadingOptions=None  # type: Optional[LoadingOptions]
-    ):  # type: (...) -> None
-
-        if extension_fields:
-            self.extension_fields = extension_fields
-        else:
-            self.extension_fields = yaml.comments.CommentedMap()
-        if loadingOptions:
-            self.loadingOptions = loadingOptions
-        else:
-            self.loadingOptions = LoadingOptions()
-        self.name = name
-        self.inVocab = inVocab
-        self.fields = fields
-        self.type = type
-        self.doc = doc
-        self.docParent = docParent
-        self.docChild = docChild
-        self.docAfter = docAfter
-        self.jsonldPredicate = jsonldPredicate
-        self.documentRoot = documentRoot
-        self.abstract = abstract
-        self.extends = extends
-        self.specialize = specialize
-
-    @classmethod
-    def fromDoc(cls, doc, baseuri, loadingOptions, docRoot=None):
-        # type: (Any, Text, LoadingOptions, Optional[Text]) -> SaladRecordSchema
-
-        _doc = copy.copy(doc)
-        if hasattr(doc, 'lc'):
-            _doc.lc.data = doc.lc.data
-            _doc.lc.filename = doc.lc.filename
-        errors = []
-        if 'name' in _doc:
-            try:
-                name = load_field(_doc.get(
-                    'name'), uri_strtype_True_False_None, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `name` field is not valid because:",
-                        SourceLine(_doc, 'name', str),
-                        [e]
-                    )
-                )
-        else:
-            name = None
-
-        if name is None:
-            if docRoot is not None:
-                name = docRoot
-            else:
-                raise ValidationException("Missing name")
-        baseuri = name
-        if 'inVocab' in _doc:
-            try:
-                inVocab = load_field(_doc.get(
-                    'inVocab'), union_of_None_type_or_booltype, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `inVocab` field is not valid because:",
-                        SourceLine(_doc, 'inVocab', str),
-                        [e]
-                    )
-                )
-        else:
-            inVocab = None
-        if 'fields' in _doc:
-            try:
-                fields = load_field(_doc.get(
-                    'fields'), idmap_fields_union_of_None_type_or_array_of_SaladRecordFieldLoader, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `fields` field is not valid because:",
-                        SourceLine(_doc, 'fields', str),
-                        [e]
-                    )
-                )
-        else:
-            fields = None
-        try:
-            type = load_field(_doc.get(
-                'type'), typedsl_enum_d9cba076fca539106791a4f46d198c7fcfbdb779Loader_2, baseuri, loadingOptions)
-        except ValidationException as e:
-            errors.append(
-                ValidationException(
-                    "the `type` field is not valid because:",
-                    SourceLine(_doc, 'type', str),
-                    [e]
-                )
-            )
-        if 'doc' in _doc:
-            try:
-                doc = load_field(_doc.get(
-                    'doc'), union_of_None_type_or_strtype_or_array_of_strtype, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `doc` field is not valid because:",
-                        SourceLine(_doc, 'doc', str),
-                        [e]
-                    )
-                )
-        else:
-            doc = None
-        if 'docParent' in _doc:
-            try:
-                docParent = load_field(_doc.get(
-                    'docParent'), uri_union_of_None_type_or_strtype_False_False_None, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `docParent` field is not valid because:",
-                        SourceLine(_doc, 'docParent', str),
-                        [e]
-                    )
-                )
-        else:
-            docParent = None
-        if 'docChild' in _doc:
-            try:
-                docChild = load_field(_doc.get(
-                    'docChild'), uri_union_of_None_type_or_strtype_or_array_of_strtype_False_False_None, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `docChild` field is not valid because:",
-                        SourceLine(_doc, 'docChild', str),
-                        [e]
-                    )
-                )
-        else:
-            docChild = None
-        if 'docAfter' in _doc:
-            try:
-                docAfter = load_field(_doc.get(
-                    'docAfter'), uri_union_of_None_type_or_strtype_False_False_None, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `docAfter` field is not valid because:",
-                        SourceLine(_doc, 'docAfter', str),
-                        [e]
-                    )
-                )
-        else:
-            docAfter = None
-        if 'jsonldPredicate' in _doc:
-            try:
-                jsonldPredicate = load_field(_doc.get(
-                    'jsonldPredicate'), union_of_None_type_or_strtype_or_JsonldPredicateLoader, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `jsonldPredicate` field is not valid because:",
-                        SourceLine(_doc, 'jsonldPredicate', str),
-                        [e]
-                    )
-                )
-        else:
-            jsonldPredicate = None
-        if 'documentRoot' in _doc:
-            try:
-                documentRoot = load_field(_doc.get(
-                    'documentRoot'), union_of_None_type_or_booltype, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `documentRoot` field is not valid because:",
-                        SourceLine(_doc, 'documentRoot', str),
-                        [e]
-                    )
-                )
-        else:
-            documentRoot = None
-        if 'abstract' in _doc:
-            try:
-                abstract = load_field(_doc.get(
-                    'abstract'), union_of_None_type_or_booltype, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `abstract` field is not valid because:",
-                        SourceLine(_doc, 'abstract', str),
-                        [e]
-                    )
-                )
-        else:
-            abstract = None
-        if 'extends' in _doc:
-            try:
-                extends = load_field(_doc.get(
-                    'extends'), uri_union_of_None_type_or_strtype_or_array_of_strtype_False_False_1, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `extends` field is not valid because:",
-                        SourceLine(_doc, 'extends', str),
-                        [e]
-                    )
-                )
-        else:
-            extends = None
-        if 'specialize' in _doc:
-            try:
-                specialize = load_field(_doc.get(
-                    'specialize'), idmap_specialize_union_of_None_type_or_array_of_SpecializeDefLoader, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `specialize` field is not valid because:",
-                        SourceLine(_doc, 'specialize', str),
-                        [e]
-                    )
-                )
-        else:
-            specialize = None
-
-        extension_fields = yaml.comments.CommentedMap()
-        for k in _doc.keys():
-            if k not in cls.attrs:
-                if ":" in k:
-                    ex = expand_url(k,
-                                    u"",
-                                    loadingOptions,
-                                    scoped_id=False,
-                                    vocab_term=False)
-                    extension_fields[ex] = _doc[k]
-                else:
-                    errors.append(
-                        ValidationException(
-                            "invalid field `%s`, expected one of: `name`, `inVocab`, `fields`, `type`, `doc`, `docParent`, `docChild`, `docAfter`, `jsonldPredicate`, `documentRoot`, `abstract`, `extends`, `specialize`" % (k),
-                            SourceLine(_doc, k, str)
-                        )
-                    )
-                    break
-
-        if errors:
-            raise ValidationException("Trying 'SaladRecordSchema'", None, errors)
-        loadingOptions = copy.deepcopy(loadingOptions)
-        loadingOptions.original_doc = _doc
-        return cls(name, inVocab, fields, type, doc, docParent, docChild, docAfter, jsonldPredicate, documentRoot, abstract, extends, specialize, extension_fields=extension_fields, loadingOptions=loadingOptions)
-
-    def save(self, top=False, base_url="", relative_uris=True):
-        # type: (bool, Text, bool) -> Dict[Text, Any]
-        r = yaml.comments.CommentedMap()  # type: Dict[Text, Any]
-        for ef in self.extension_fields:
-            r[prefix_url(ef, self.loadingOptions.vocab)] = self.extension_fields[ef]
-
-        if self.name is not None:
-            u = save_relative_uri(
-                self.name,
-                base_url,
-                True,
-                None,
-                relative_uris)
-            if u:
-                r['name'] = u
-
-        if self.inVocab is not None:
-            r['inVocab'] = save(
-                self.inVocab,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if self.fields is not None:
-            r['fields'] = save(
-                self.fields,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if self.type is not None:
-            r['type'] = save(
-                self.type,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if self.doc is not None:
-            r['doc'] = save(
-                self.doc,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if self.docParent is not None:
-            u = save_relative_uri(
-                self.docParent,
-                self.name,
-                False,
-                None,
-                relative_uris)
-            if u:
-                r['docParent'] = u
-
-        if self.docChild is not None:
-            u = save_relative_uri(
-                self.docChild,
-                self.name,
-                False,
-                None,
-                relative_uris)
-            if u:
-                r['docChild'] = u
-
-        if self.docAfter is not None:
-            u = save_relative_uri(
-                self.docAfter,
-                self.name,
-                False,
-                None,
-                relative_uris)
-            if u:
-                r['docAfter'] = u
-
-        if self.jsonldPredicate is not None:
-            r['jsonldPredicate'] = save(
-                self.jsonldPredicate,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if self.documentRoot is not None:
-            r['documentRoot'] = save(
-                self.documentRoot,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if self.abstract is not None:
-            r['abstract'] = save(
-                self.abstract,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if self.extends is not None:
-            u = save_relative_uri(
-                self.extends,
-                self.name,
-                False,
-                1,
-                relative_uris)
-            if u:
-                r['extends'] = u
-
-        if self.specialize is not None:
-            r['specialize'] = save(
-                self.specialize,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if top and self.loadingOptions.namespaces:
-            r["$namespaces"] = self.loadingOptions.namespaces
-
-        return r
-
-    attrs = frozenset(['name', 'inVocab', 'fields', 'type', 'doc', 'docParent', 'docChild', 'docAfter', 'jsonldPredicate', 'documentRoot', 'abstract', 'extends', 'specialize'])
-
-
-class SaladEnumSchema(NamedType, EnumSchema, SchemaDefinedType):
-    """
-Define an enumerated type.
-
-    """
-    def __init__(
-        self,
-        name,  # type: Any
-        inVocab,  # type: Any
-        symbols,  # type: Any
-        type,  # type: Any
-        doc,  # type: Any
-        docParent,  # type: Any
-        docChild,  # type: Any
-        docAfter,  # type: Any
-        jsonldPredicate,  # type: Any
-        documentRoot,  # type: Any
-        extends,  # type: Any
-        extension_fields=None,  # type: Optional[Dict[Text, Any]]
-        loadingOptions=None  # type: Optional[LoadingOptions]
-    ):  # type: (...) -> None
-
-        if extension_fields:
-            self.extension_fields = extension_fields
-        else:
-            self.extension_fields = yaml.comments.CommentedMap()
-        if loadingOptions:
-            self.loadingOptions = loadingOptions
-        else:
-            self.loadingOptions = LoadingOptions()
-        self.name = name
-        self.inVocab = inVocab
-        self.symbols = symbols
-        self.type = type
-        self.doc = doc
-        self.docParent = docParent
-        self.docChild = docChild
-        self.docAfter = docAfter
-        self.jsonldPredicate = jsonldPredicate
-        self.documentRoot = documentRoot
-        self.extends = extends
-
-    @classmethod
-    def fromDoc(cls, doc, baseuri, loadingOptions, docRoot=None):
-        # type: (Any, Text, LoadingOptions, Optional[Text]) -> SaladEnumSchema
-
-        _doc = copy.copy(doc)
-        if hasattr(doc, 'lc'):
-            _doc.lc.data = doc.lc.data
-            _doc.lc.filename = doc.lc.filename
-        errors = []
-        if 'name' in _doc:
-            try:
-                name = load_field(_doc.get(
-                    'name'), uri_strtype_True_False_None, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `name` field is not valid because:",
-                        SourceLine(_doc, 'name', str),
-                        [e]
-                    )
-                )
-        else:
-            name = None
-
-        if name is None:
-            if docRoot is not None:
-                name = docRoot
-            else:
-                raise ValidationException("Missing name")
-        baseuri = name
-        if 'inVocab' in _doc:
-            try:
-                inVocab = load_field(_doc.get(
-                    'inVocab'), union_of_None_type_or_booltype, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `inVocab` field is not valid because:",
-                        SourceLine(_doc, 'inVocab', str),
-                        [e]
-                    )
-                )
-        else:
-            inVocab = None
-        try:
-            symbols = load_field(_doc.get(
-                'symbols'), uri_array_of_strtype_True_False_None, baseuri, loadingOptions)
-        except ValidationException as e:
-            errors.append(
-                ValidationException(
-                    "the `symbols` field is not valid because:",
-                    SourceLine(_doc, 'symbols', str),
-                    [e]
-                )
-            )
-        try:
-            type = load_field(_doc.get(
-                'type'), typedsl_enum_d961d79c225752b9fadb617367615ab176b47d77Loader_2, baseuri, loadingOptions)
-        except ValidationException as e:
-            errors.append(
-                ValidationException(
-                    "the `type` field is not valid because:",
-                    SourceLine(_doc, 'type', str),
-                    [e]
-                )
-            )
-        if 'doc' in _doc:
-            try:
-                doc = load_field(_doc.get(
-                    'doc'), union_of_None_type_or_strtype_or_array_of_strtype, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `doc` field is not valid because:",
-                        SourceLine(_doc, 'doc', str),
-                        [e]
-                    )
-                )
-        else:
-            doc = None
-        if 'docParent' in _doc:
-            try:
-                docParent = load_field(_doc.get(
-                    'docParent'), uri_union_of_None_type_or_strtype_False_False_None, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `docParent` field is not valid because:",
-                        SourceLine(_doc, 'docParent', str),
-                        [e]
-                    )
-                )
-        else:
-            docParent = None
-        if 'docChild' in _doc:
-            try:
-                docChild = load_field(_doc.get(
-                    'docChild'), uri_union_of_None_type_or_strtype_or_array_of_strtype_False_False_None, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `docChild` field is not valid because:",
-                        SourceLine(_doc, 'docChild', str),
-                        [e]
-                    )
-                )
-        else:
-            docChild = None
-        if 'docAfter' in _doc:
-            try:
-                docAfter = load_field(_doc.get(
-                    'docAfter'), uri_union_of_None_type_or_strtype_False_False_None, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `docAfter` field is not valid because:",
-                        SourceLine(_doc, 'docAfter', str),
-                        [e]
-                    )
-                )
-        else:
-            docAfter = None
-        if 'jsonldPredicate' in _doc:
-            try:
-                jsonldPredicate = load_field(_doc.get(
-                    'jsonldPredicate'), union_of_None_type_or_strtype_or_JsonldPredicateLoader, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `jsonldPredicate` field is not valid because:",
-                        SourceLine(_doc, 'jsonldPredicate', str),
-                        [e]
-                    )
-                )
-        else:
-            jsonldPredicate = None
-        if 'documentRoot' in _doc:
-            try:
-                documentRoot = load_field(_doc.get(
-                    'documentRoot'), union_of_None_type_or_booltype, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `documentRoot` field is not valid because:",
-                        SourceLine(_doc, 'documentRoot', str),
-                        [e]
-                    )
-                )
-        else:
-            documentRoot = None
-        if 'extends' in _doc:
-            try:
-                extends = load_field(_doc.get(
-                    'extends'), uri_union_of_None_type_or_strtype_or_array_of_strtype_False_False_1, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `extends` field is not valid because:",
-                        SourceLine(_doc, 'extends', str),
-                        [e]
-                    )
-                )
-        else:
-            extends = None
-
-        extension_fields = yaml.comments.CommentedMap()
-        for k in _doc.keys():
-            if k not in cls.attrs:
-                if ":" in k:
-                    ex = expand_url(k,
-                                    u"",
-                                    loadingOptions,
-                                    scoped_id=False,
-                                    vocab_term=False)
-                    extension_fields[ex] = _doc[k]
-                else:
-                    errors.append(
-                        ValidationException(
-                            "invalid field `%s`, expected one of: `name`, `inVocab`, `symbols`, `type`, `doc`, `docParent`, `docChild`, `docAfter`, `jsonldPredicate`, `documentRoot`, `extends`" % (k),
-                            SourceLine(_doc, k, str)
-                        )
-                    )
-                    break
-
-        if errors:
-            raise ValidationException("Trying 'SaladEnumSchema'", None, errors)
-        loadingOptions = copy.deepcopy(loadingOptions)
-        loadingOptions.original_doc = _doc
-        return cls(name, inVocab, symbols, type, doc, docParent, docChild, docAfter, jsonldPredicate, documentRoot, extends, extension_fields=extension_fields, loadingOptions=loadingOptions)
-
-    def save(self, top=False, base_url="", relative_uris=True):
-        # type: (bool, Text, bool) -> Dict[Text, Any]
-        r = yaml.comments.CommentedMap()  # type: Dict[Text, Any]
-        for ef in self.extension_fields:
-            r[prefix_url(ef, self.loadingOptions.vocab)] = self.extension_fields[ef]
-
-        if self.name is not None:
-            u = save_relative_uri(
-                self.name,
-                base_url,
-                True,
-                None,
-                relative_uris)
-            if u:
-                r['name'] = u
-
-        if self.inVocab is not None:
-            r['inVocab'] = save(
-                self.inVocab,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if self.symbols is not None:
-            u = save_relative_uri(
-                self.symbols,
-                self.name,
-                True,
-                None,
-                relative_uris)
-            if u:
-                r['symbols'] = u
-
-        if self.type is not None:
-            r['type'] = save(
-                self.type,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if self.doc is not None:
-            r['doc'] = save(
-                self.doc,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if self.docParent is not None:
-            u = save_relative_uri(
-                self.docParent,
-                self.name,
-                False,
-                None,
-                relative_uris)
-            if u:
-                r['docParent'] = u
-
-        if self.docChild is not None:
-            u = save_relative_uri(
-                self.docChild,
-                self.name,
-                False,
-                None,
-                relative_uris)
-            if u:
-                r['docChild'] = u
-
-        if self.docAfter is not None:
-            u = save_relative_uri(
-                self.docAfter,
-                self.name,
-                False,
-                None,
-                relative_uris)
-            if u:
-                r['docAfter'] = u
-
-        if self.jsonldPredicate is not None:
-            r['jsonldPredicate'] = save(
-                self.jsonldPredicate,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if self.documentRoot is not None:
-            r['documentRoot'] = save(
-                self.documentRoot,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if self.extends is not None:
-            u = save_relative_uri(
-                self.extends,
-                self.name,
-                False,
-                1,
-                relative_uris)
-            if u:
-                r['extends'] = u
-
-        if top and self.loadingOptions.namespaces:
-            r["$namespaces"] = self.loadingOptions.namespaces
-
-        return r
-
-    attrs = frozenset(['name', 'inVocab', 'symbols', 'type', 'doc', 'docParent', 'docChild', 'docAfter', 'jsonldPredicate', 'documentRoot', 'extends'])
-
-
-class Documentation(NamedType, DocType):
-    """
-A documentation section.  This type exists to facilitate self-documenting
-schemas but has no role in formal validation.
-
-    """
-    def __init__(
-        self,
-        name,  # type: Any
-        inVocab,  # type: Any
-        doc,  # type: Any
-        docParent,  # type: Any
-        docChild,  # type: Any
-        docAfter,  # type: Any
-        type,  # type: Any
-        extension_fields=None,  # type: Optional[Dict[Text, Any]]
-        loadingOptions=None  # type: Optional[LoadingOptions]
-    ):  # type: (...) -> None
-
-        if extension_fields:
-            self.extension_fields = extension_fields
-        else:
-            self.extension_fields = yaml.comments.CommentedMap()
-        if loadingOptions:
-            self.loadingOptions = loadingOptions
-        else:
-            self.loadingOptions = LoadingOptions()
-        self.name = name
-        self.inVocab = inVocab
-        self.doc = doc
-        self.docParent = docParent
-        self.docChild = docChild
-        self.docAfter = docAfter
-        self.type = type
-
-    @classmethod
-    def fromDoc(cls, doc, baseuri, loadingOptions, docRoot=None):
-        # type: (Any, Text, LoadingOptions, Optional[Text]) -> Documentation
-
-        _doc = copy.copy(doc)
-        if hasattr(doc, 'lc'):
-            _doc.lc.data = doc.lc.data
-            _doc.lc.filename = doc.lc.filename
-        errors = []
-        if 'name' in _doc:
-            try:
-                name = load_field(_doc.get(
-                    'name'), uri_strtype_True_False_None, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `name` field is not valid because:",
-                        SourceLine(_doc, 'name', str),
-                        [e]
-                    )
-                )
-        else:
-            name = None
-
-        if name is None:
-            if docRoot is not None:
-                name = docRoot
-            else:
-                raise ValidationException("Missing name")
-        baseuri = name
-        if 'inVocab' in _doc:
-            try:
-                inVocab = load_field(_doc.get(
-                    'inVocab'), union_of_None_type_or_booltype, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `inVocab` field is not valid because:",
-                        SourceLine(_doc, 'inVocab', str),
-                        [e]
-                    )
-                )
-        else:
-            inVocab = None
-        if 'doc' in _doc:
-            try:
-                doc = load_field(_doc.get(
-                    'doc'), union_of_None_type_or_strtype_or_array_of_strtype, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `doc` field is not valid because:",
-                        SourceLine(_doc, 'doc', str),
-                        [e]
-                    )
-                )
-        else:
-            doc = None
-        if 'docParent' in _doc:
-            try:
-                docParent = load_field(_doc.get(
-                    'docParent'), uri_union_of_None_type_or_strtype_False_False_None, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `docParent` field is not valid because:",
-                        SourceLine(_doc, 'docParent', str),
-                        [e]
-                    )
-                )
-        else:
-            docParent = None
-        if 'docChild' in _doc:
-            try:
-                docChild = load_field(_doc.get(
-                    'docChild'), uri_union_of_None_type_or_strtype_or_array_of_strtype_False_False_None, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `docChild` field is not valid because:",
-                        SourceLine(_doc, 'docChild', str),
-                        [e]
-                    )
-                )
-        else:
-            docChild = None
-        if 'docAfter' in _doc:
-            try:
-                docAfter = load_field(_doc.get(
-                    'docAfter'), uri_union_of_None_type_or_strtype_False_False_None, baseuri, loadingOptions)
-            except ValidationException as e:
-                errors.append(
-                    ValidationException(
-                        "the `docAfter` field is not valid because:",
-                        SourceLine(_doc, 'docAfter', str),
-                        [e]
-                    )
-                )
-        else:
-            docAfter = None
-        try:
-            type = load_field(_doc.get(
-                'type'), typedsl_enum_056429f0e9355680bd9b2411dc96a69c7ff2e76bLoader_2, baseuri, loadingOptions)
-        except ValidationException as e:
-            errors.append(
-                ValidationException(
-                    "the `type` field is not valid because:",
-                    SourceLine(_doc, 'type', str),
-                    [e]
-                )
-            )
-
-        extension_fields = yaml.comments.CommentedMap()
-        for k in _doc.keys():
-            if k not in cls.attrs:
-                if ":" in k:
-                    ex = expand_url(k,
-                                    u"",
-                                    loadingOptions,
-                                    scoped_id=False,
-                                    vocab_term=False)
-                    extension_fields[ex] = _doc[k]
-                else:
-                    errors.append(
-                        ValidationException(
-                            "invalid field `%s`, expected one of: `name`, `inVocab`, `doc`, `docParent`, `docChild`, `docAfter`, `type`" % (k),
-                            SourceLine(_doc, k, str)
-                        )
-                    )
-                    break
-
-        if errors:
-            raise ValidationException("Trying 'Documentation'", None, errors)
-        loadingOptions = copy.deepcopy(loadingOptions)
-        loadingOptions.original_doc = _doc
-        return cls(name, inVocab, doc, docParent, docChild, docAfter, type, extension_fields=extension_fields, loadingOptions=loadingOptions)
-
-    def save(self, top=False, base_url="", relative_uris=True):
-        # type: (bool, Text, bool) -> Dict[Text, Any]
-        r = yaml.comments.CommentedMap()  # type: Dict[Text, Any]
-        for ef in self.extension_fields:
-            r[prefix_url(ef, self.loadingOptions.vocab)] = self.extension_fields[ef]
-
-        if self.name is not None:
-            u = save_relative_uri(
-                self.name,
-                base_url,
-                True,
-                None,
-                relative_uris)
-            if u:
-                r['name'] = u
-
-        if self.inVocab is not None:
-            r['inVocab'] = save(
-                self.inVocab,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if self.doc is not None:
-            r['doc'] = save(
-                self.doc,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if self.docParent is not None:
-            u = save_relative_uri(
-                self.docParent,
-                self.name,
-                False,
-                None,
-                relative_uris)
-            if u:
-                r['docParent'] = u
-
-        if self.docChild is not None:
-            u = save_relative_uri(
-                self.docChild,
-                self.name,
-                False,
-                None,
-                relative_uris)
-            if u:
-                r['docChild'] = u
-
-        if self.docAfter is not None:
-            u = save_relative_uri(
-                self.docAfter,
-                self.name,
-                False,
-                None,
-                relative_uris)
-            if u:
-                r['docAfter'] = u
-
-        if self.type is not None:
-            r['type'] = save(
-                self.type,
-                top=False,
-                base_url=self.name,
-                relative_uris=relative_uris)
-
-        if top and self.loadingOptions.namespaces:
-            r["$namespaces"] = self.loadingOptions.namespaces
-
-        return r
-
-    attrs = frozenset(['name', 'inVocab', 'doc', 'docParent', 'docChild', 'docAfter', 'type'])
-
-
-_vocab = {
-    "Any": "https://w3id.org/cwl/salad#Any",
-    "ArraySchema": "https://w3id.org/cwl/salad#ArraySchema",
-    "DocType": "https://w3id.org/cwl/salad#DocType",
-    "Documentation": "https://w3id.org/cwl/salad#Documentation",
-    "Documented": "https://w3id.org/cwl/salad#Documented",
-    "EnumSchema": "https://w3id.org/cwl/salad#EnumSchema",
-    "JsonldPredicate": "https://w3id.org/cwl/salad#JsonldPredicate",
-    "NamedType": "https://w3id.org/cwl/salad#NamedType",
-    "PrimitiveType": "https://w3id.org/cwl/salad#PrimitiveType",
-    "RecordField": "https://w3id.org/cwl/salad#RecordField",
-    "RecordSchema": "https://w3id.org/cwl/salad#RecordSchema",
-    "SaladEnumSchema": "https://w3id.org/cwl/salad#SaladEnumSchema",
-    "SaladRecordField": "https://w3id.org/cwl/salad#SaladRecordField",
-    "SaladRecordSchema": "https://w3id.org/cwl/salad#SaladRecordSchema",
-    "SchemaDefinedType": "https://w3id.org/cwl/salad#SchemaDefinedType",
-    "SpecializeDef": "https://w3id.org/cwl/salad#SpecializeDef",
-    "array": "https://w3id.org/cwl/salad#array",
-    "boolean": "http://www.w3.org/2001/XMLSchema#boolean",
-    "documentation": "https://w3id.org/cwl/salad#documentation",
-    "double": "http://www.w3.org/2001/XMLSchema#double",
-    "enum": "https://w3id.org/cwl/salad#enum",
-    "float": "http://www.w3.org/2001/XMLSchema#float",
-    "int": "http://www.w3.org/2001/XMLSchema#int",
-    "long": "http://www.w3.org/2001/XMLSchema#long",
-    "null": "https://w3id.org/cwl/salad#null",
-    "record": "https://w3id.org/cwl/salad#record",
-    "string": "http://www.w3.org/2001/XMLSchema#string",
-}
-_rvocab = {
-    "https://w3id.org/cwl/salad#Any": "Any",
-    "https://w3id.org/cwl/salad#ArraySchema": "ArraySchema",
-    "https://w3id.org/cwl/salad#DocType": "DocType",
-    "https://w3id.org/cwl/salad#Documentation": "Documentation",
-    "https://w3id.org/cwl/salad#Documented": "Documented",
-    "https://w3id.org/cwl/salad#EnumSchema": "EnumSchema",
-    "https://w3id.org/cwl/salad#JsonldPredicate": "JsonldPredicate",
-    "https://w3id.org/cwl/salad#NamedType": "NamedType",
-    "https://w3id.org/cwl/salad#PrimitiveType": "PrimitiveType",
-    "https://w3id.org/cwl/salad#RecordField": "RecordField",
-    "https://w3id.org/cwl/salad#RecordSchema": "RecordSchema",
-    "https://w3id.org/cwl/salad#SaladEnumSchema": "SaladEnumSchema",
-    "https://w3id.org/cwl/salad#SaladRecordField": "SaladRecordField",
-    "https://w3id.org/cwl/salad#SaladRecordSchema": "SaladRecordSchema",
-    "https://w3id.org/cwl/salad#SchemaDefinedType": "SchemaDefinedType",
-    "https://w3id.org/cwl/salad#SpecializeDef": "SpecializeDef",
-    "https://w3id.org/cwl/salad#array": "array",
-    "http://www.w3.org/2001/XMLSchema#boolean": "boolean",
-    "https://w3id.org/cwl/salad#documentation": "documentation",
-    "http://www.w3.org/2001/XMLSchema#double": "double",
-    "https://w3id.org/cwl/salad#enum": "enum",
-    "http://www.w3.org/2001/XMLSchema#float": "float",
-    "http://www.w3.org/2001/XMLSchema#int": "int",
-    "http://www.w3.org/2001/XMLSchema#long": "long",
-    "https://w3id.org/cwl/salad#null": "null",
-    "https://w3id.org/cwl/salad#record": "record",
-    "http://www.w3.org/2001/XMLSchema#string": "string",
-}
-
-strtype = _PrimitiveLoader((str, text_type))
-inttype = _PrimitiveLoader(int)
-floattype = _PrimitiveLoader(float)
-booltype = _PrimitiveLoader(bool)
-None_type = _PrimitiveLoader(type(None))
-Any_type = _AnyLoader()
-DocumentedLoader = _RecordLoader(Documented)
-PrimitiveTypeLoader = _EnumLoader(("null", "boolean", "int", "long", "float", "double", "string",))
-AnyLoader = _EnumLoader(("Any",))
-RecordFieldLoader = _RecordLoader(RecordField)
-RecordSchemaLoader = _RecordLoader(RecordSchema)
-EnumSchemaLoader = _RecordLoader(EnumSchema)
-ArraySchemaLoader = _RecordLoader(ArraySchema)
-JsonldPredicateLoader = _RecordLoader(JsonldPredicate)
-SpecializeDefLoader = _RecordLoader(SpecializeDef)
-NamedTypeLoader = _RecordLoader(NamedType)
-DocTypeLoader = _RecordLoader(DocType)
-SchemaDefinedTypeLoader = _RecordLoader(SchemaDefinedType)
-SaladRecordFieldLoader = _RecordLoader(SaladRecordField)
-SaladRecordSchemaLoader = _RecordLoader(SaladRecordSchema)
-SaladEnumSchemaLoader = _RecordLoader(SaladEnumSchema)
-DocumentationLoader = _RecordLoader(Documentation)
-array_of_strtype = _ArrayLoader(strtype)
-union_of_None_type_or_strtype_or_array_of_strtype = _UnionLoader((None_type, strtype, array_of_strtype,))
-uri_strtype_True_False_None = _URILoader(strtype, True, False, None)
-union_of_PrimitiveTypeLoader_or_RecordSchemaLoader_or_EnumSchemaLoader_or_ArraySchemaLoader_or_strtype = _UnionLoader((PrimitiveTypeLoader, RecordSchemaLoader, EnumSchemaLoader, ArraySchemaLoader, strtype,))
-array_of_union_of_PrimitiveTypeLoader_or_RecordSchemaLoader_or_EnumSchemaLoader_or_ArraySchemaLoader_or_strtype = _ArrayLoader(union_of_PrimitiveTypeLoader_or_RecordSchemaLoader_or_EnumSchemaLoader_or_ArraySchemaLoader_or_strtype)
-union_of_PrimitiveTypeLoader_or_RecordSchemaLoader_or_EnumSchemaLoader_or_ArraySchemaLoader_or_strtype_or_array_of_union_of_PrimitiveTypeLoader_or_RecordSchemaLoader_or_EnumSchemaLoader_or_ArraySchemaLoader_or_strtype = _UnionLoader((PrimitiveTypeLoader, RecordSchemaLoader, EnumSchemaLoader, ArraySchemaLoader, strtype, array_of_union_of_PrimitiveTypeLoader_or_RecordSchemaLoader_or_EnumSchemaLoader_or_ArraySchemaLoader_or_strtype,))
-typedsl_union_of_PrimitiveTypeLoader_or_RecordSchemaLoader_or_EnumSchemaLoader_or_ArraySchemaLoader_or_strtype_or_array_of_union_of_PrimitiveTypeLoader_or_RecordSchemaLoader_or_EnumSchemaLoader_or_ArraySchemaLoader_or_strtype_2 = _TypeDSLLoader(union_of_PrimitiveTypeLoader_or_RecordSchemaLoader_or_EnumSchemaLoader_or_ArraySchemaLoader_or_strtype_or_array_of_union_of_PrimitiveTypeLoader_or_RecordSchemaLoader_or_EnumSchemaLoader_or_ArraySchemaLoader_or_strtype, 2)
-array_of_RecordFieldLoader = _ArrayLoader(RecordFieldLoader)
-union_of_None_type_or_array_of_RecordFieldLoader = _UnionLoader((None_type, array_of_RecordFieldLoader,))
-idmap_fields_union_of_None_type_or_array_of_RecordFieldLoader = _IdMapLoader(union_of_None_type_or_array_of_RecordFieldLoader, 'name', 'type')
-enum_d9cba076fca539106791a4f46d198c7fcfbdb779Loader = _EnumLoader(("record",))
-typedsl_enum_d9cba076fca539106791a4f46d198c7fcfbdb779Loader_2 = _TypeDSLLoader(enum_d9cba076fca539106791a4f46d198c7fcfbdb779Loader, 2)
-uri_array_of_strtype_True_False_None = _URILoader(array_of_strtype, True, False, None)
-enum_d961d79c225752b9fadb617367615ab176b47d77Loader = _EnumLoader(("enum",))
-typedsl_enum_d961d79c225752b9fadb617367615ab176b47d77Loader_2 = _TypeDSLLoader(enum_d961d79c225752b9fadb617367615ab176b47d77Loader, 2)
-uri_union_of_PrimitiveTypeLoader_or_RecordSchemaLoader_or_EnumSchemaLoader_or_ArraySchemaLoader_or_strtype_or_array_of_union_of_PrimitiveTypeLoader_or_RecordSchemaLoader_or_EnumSchemaLoader_or_ArraySchemaLoader_or_strtype_False_True_2 = _URILoader(union_of_PrimitiveTypeLoader_or_RecordSchemaLoader_or_EnumSchemaLoader_or_ArraySchemaLoader_or_strtype_or_array_of_union_of_PrimitiveTypeLoader_or_RecordSchemaLoader_or_EnumSchemaLoader_or_ArraySchemaLoader_or_strtype, False, True, 2)
-enum_d062602be0b4b8fd33e69e29a841317b6ab665bcLoader = _EnumLoader(("array",))
-typedsl_enum_d062602be0b4b8fd33e69e29a841317b6ab665bcLoader_2 = _TypeDSLLoader(enum_d062602be0b4b8fd33e69e29a841317b6ab665bcLoader, 2)
-union_of_None_type_or_strtype = _UnionLoader((None_type, strtype,))
-uri_union_of_None_type_or_strtype_True_False_None = _URILoader(union_of_None_type_or_strtype, True, False, None)
-union_of_None_type_or_booltype = _UnionLoader((None_type, booltype,))
-union_of_None_type_or_inttype = _UnionLoader((None_type, inttype,))
-uri_strtype_False_False_1 = _URILoader(strtype, False, False, 1)
-uri_union_of_None_type_or_strtype_False_False_None = _URILoader(union_of_None_type_or_strtype, False, False, None)
-uri_union_of_None_type_or_strtype_or_array_of_strtype_False_False_None = _URILoader(union_of_None_type_or_strtype_or_array_of_strtype, False, False, None)
-union_of_None_type_or_strtype_or_JsonldPredicateLoader = _UnionLoader((None_type, strtype, JsonldPredicateLoader,))
-union_of_None_type_or_Any_type = _UnionLoader((None_type, Any_type,))
-array_of_SaladRecordFieldLoader = _ArrayLoader(SaladRecordFieldLoader)
-union_of_None_type_or_array_of_SaladRecordFieldLoader = _UnionLoader((None_type, array_of_SaladRecordFieldLoader,))
-idmap_fields_union_of_None_type_or_array_of_SaladRecordFieldLoader = _IdMapLoader(union_of_None_type_or_array_of_SaladRecordFieldLoader, 'name', 'type')
-uri_union_of_None_type_or_strtype_or_array_of_strtype_False_False_1 = _URILoader(union_of_None_type_or_strtype_or_array_of_strtype, False, False, 1)
-array_of_SpecializeDefLoader = _ArrayLoader(SpecializeDefLoader)
-union_of_None_type_or_array_of_SpecializeDefLoader = _UnionLoader((None_type, array_of_SpecializeDefLoader,))
-idmap_specialize_union_of_None_type_or_array_of_SpecializeDefLoader = _IdMapLoader(union_of_None_type_or_array_of_SpecializeDefLoader, 'specializeFrom', 'specializeTo')
-enum_056429f0e9355680bd9b2411dc96a69c7ff2e76bLoader = _EnumLoader(("documentation",))
-typedsl_enum_056429f0e9355680bd9b2411dc96a69c7ff2e76bLoader_2 = _TypeDSLLoader(enum_056429f0e9355680bd9b2411dc96a69c7ff2e76bLoader, 2)
-union_of_SaladRecordSchemaLoader_or_SaladEnumSchemaLoader_or_DocumentationLoader = _UnionLoader((SaladRecordSchemaLoader, SaladEnumSchemaLoader, DocumentationLoader,))
-array_of_union_of_SaladRecordSchemaLoader_or_SaladEnumSchemaLoader_or_DocumentationLoader = _ArrayLoader(union_of_SaladRecordSchemaLoader_or_SaladEnumSchemaLoader_or_DocumentationLoader)
-union_of_SaladRecordSchemaLoader_or_SaladEnumSchemaLoader_or_DocumentationLoader_or_array_of_union_of_SaladRecordSchemaLoader_or_SaladEnumSchemaLoader_or_DocumentationLoader = _UnionLoader((SaladRecordSchemaLoader, SaladEnumSchemaLoader, DocumentationLoader, array_of_union_of_SaladRecordSchemaLoader_or_SaladEnumSchemaLoader_or_DocumentationLoader,))
-
-
-def load_document(doc, baseuri=None, loadingOptions=None):
-    # type: (Any, Optional[Text], Optional[LoadingOptions]) -> Any
-    if baseuri is None:
-        baseuri = file_uri(os.getcwd()) + "/"
-    if loadingOptions is None:
-        loadingOptions = LoadingOptions()
-    return _document_load(union_of_SaladRecordSchemaLoader_or_SaladEnumSchemaLoader_or_DocumentationLoader_or_array_of_union_of_SaladRecordSchemaLoader_or_SaladEnumSchemaLoader_or_DocumentationLoader, doc, baseuri, loadingOptions)
-
-
-def load_document_by_string(string, uri, loadingOptions=None):
-    # type: (Any, Text, Optional[LoadingOptions]) -> Any
-    result = yaml.round_trip_load(string, preserve_quotes=True)
-    add_lc_filename(result, uri)
-
-    if loadingOptions is None:
-        loadingOptions = LoadingOptions(fileuri=uri)
-    loadingOptions.idx[uri] = result
-
-    return _document_load(union_of_SaladRecordSchemaLoader_or_SaladEnumSchemaLoader_or_DocumentationLoader_or_array_of_union_of_SaladRecordSchemaLoader_or_SaladEnumSchemaLoader_or_DocumentationLoader, result, uri, loadingOptions)