diff env/lib/python3.7/site-packages/schema_salad/main.py @ 2:6af9afd405e9 draft

"planemo upload commit 0a63dd5f4d38a1f6944587f52a8cd79874177fc1"
author shellac
date Thu, 14 May 2020 14:56:58 -0400
parents 26e78fe6e8c4
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/env/lib/python3.7/site-packages/schema_salad/main.py	Thu May 14 14:56:58 2020 -0400
@@ -0,0 +1,397 @@
+"""Command line interface to schema-salad."""
+from __future__ import absolute_import, print_function
+
+import argparse
+import logging
+import os
+import sys
+from typing import Any, Dict, List, Mapping, MutableSequence, Optional, Union, cast
+
+import pkg_resources  # part of setuptools
+import six
+from rdflib.parser import Parser
+from rdflib.plugin import register
+from six.moves import urllib
+from typing_extensions import Text  # pylint: disable=unused-import
+
+from ruamel.yaml.comments import CommentedSeq
+
+from . import codegen, jsonld_context, schema
+from .avro.schema import SchemaParseException
+from .exceptions import ValidationException, to_one_line_messages
+from .makedoc import makedoc
+from .ref_resolver import Loader, file_uri
+from .utils import json_dumps
+
+# move to a regular typing import when Python 3.3-3.6 is no longer supported
+
+
+register("json-ld", Parser, "rdflib_jsonld.parser", "JsonLDParser")
+_logger = logging.getLogger("salad")
+
+
+def printrdf(
+    workflow,  # type: str
+    wf,  # type: Union[List[Dict[Text, Any]], Dict[Text, Any]]
+    ctx,  # type: Dict[Text, Any]
+    sr,  # type: str
+):
+    # type: (...) -> None
+    g = jsonld_context.makerdf(workflow, wf, ctx)
+    print(g.serialize(format=sr, encoding="utf-8").decode("utf-8"))
+
+
+def main(argsl=None):  # type: (Optional[List[str]]) -> int
+    if argsl is None:
+        argsl = sys.argv[1:]
+
+    parser = argparse.ArgumentParser()
+    parser.add_argument(
+        "--rdf-serializer",
+        help="Output RDF serialization format used by --print-rdf"
+        "(one of turtle (default), n3, nt, xml)",
+        default="turtle",
+    )
+
+    parser.add_argument(
+        "--skip-schemas",
+        action="store_true",
+        default=False,
+        help="If specified, ignore $schemas sections.",
+    )
+    parser.add_argument(
+        "--strict-foreign-properties",
+        action="store_true",
+        help="Strict checking of foreign properties",
+        default=False,
+    )
+
+    exgroup = parser.add_mutually_exclusive_group()
+    exgroup.add_argument(
+        "--print-jsonld-context",
+        action="store_true",
+        help="Print JSON-LD context for schema",
+    )
+    exgroup.add_argument("--print-rdfs", action="store_true", help="Print RDF schema")
+    exgroup.add_argument("--print-avro", action="store_true", help="Print Avro schema")
+
+    exgroup.add_argument(
+        "--print-rdf",
+        action="store_true",
+        help="Print corresponding RDF graph for document",
+    )
+    exgroup.add_argument(
+        "--print-pre", action="store_true", help="Print document after preprocessing"
+    )
+    exgroup.add_argument("--print-index", action="store_true", help="Print node index")
+    exgroup.add_argument(
+        "--print-metadata", action="store_true", help="Print document metadata"
+    )
+    exgroup.add_argument(
+        "--print-inheritance-dot",
+        action="store_true",
+        help="Print graphviz file of inheritance",
+    )
+    exgroup.add_argument(
+        "--print-fieldrefs-dot",
+        action="store_true",
+        help="Print graphviz file of field refs",
+    )
+
+    exgroup.add_argument(
+        "--codegen",
+        type=str,
+        metavar="language",
+        help="Generate classes in target language, currently supported: python, java",
+    )
+
+    parser.add_argument(
+        "--codegen-target",
+        type=str,
+        default=None,
+        help="Defaults to sys.stdout for python and ./ for Java",
+    )
+
+    parser.add_argument(
+        "--codegen-examples",
+        type=str,
+        metavar="directory",
+        default=None,
+        help="Directory of example documents for test case generation (Java only).",
+    )
+
+    exgroup.add_argument(
+        "--print-oneline",
+        action="store_true",
+        help="Print each error message in oneline",
+    )
+
+    exgroup.add_argument(
+        "--print-doc", action="store_true", help="Print HTML schema documentation page"
+    )
+
+    exgroup = parser.add_mutually_exclusive_group()
+    exgroup.add_argument(
+        "--strict",
+        action="store_true",
+        help="Strict validation (unrecognized or out of place fields are error)",
+        default=True,
+        dest="strict",
+    )
+    exgroup.add_argument(
+        "--non-strict",
+        action="store_false",
+        help="Lenient validation (ignore unrecognized fields)",
+        default=True,
+        dest="strict",
+    )
+
+    exgroup = parser.add_mutually_exclusive_group()
+    exgroup.add_argument("--verbose", action="store_true", help="Default logging")
+    exgroup.add_argument(
+        "--quiet", action="store_true", help="Only print warnings and errors."
+    )
+    exgroup.add_argument("--debug", action="store_true", help="Print even more logging")
+
+    parser.add_argument(
+        "--only",
+        action="append",
+        help="Use with --print-doc, document only listed types",
+    )
+    parser.add_argument(
+        "--redirect",
+        action="append",
+        help="Use with --print-doc, override default link for type",
+    )
+    parser.add_argument(
+        "--brand", help="Use with --print-doc, set the 'brand' text in nav bar"
+    )
+    parser.add_argument(
+        "--brandlink", help="Use with --print-doc, set the link for 'brand' in nav bar"
+    )
+    parser.add_argument(
+        "--primtype",
+        default="#PrimitiveType",
+        help="Use with --print-doc, link to use for primitive types (string, int etc)",
+    )
+
+    parser.add_argument("schema", type=str, nargs="?", default=None)
+    parser.add_argument("document", type=str, nargs="?", default=None)
+    parser.add_argument(
+        "--version", "-v", action="store_true", help="Print version", default=None
+    )
+
+    args = parser.parse_args(argsl)
+
+    if args.version is None and args.schema is None:
+        print("{}: error: too few arguments".format(sys.argv[0]))
+        return 1
+
+    if args.quiet:
+        _logger.setLevel(logging.WARN)
+    if args.debug:
+        _logger.setLevel(logging.DEBUG)
+
+    pkg = pkg_resources.require("schema_salad")
+    if pkg:
+        if args.version:
+            print("{} Current version: {}".format(sys.argv[0], pkg[0].version))
+            return 0
+        else:
+            _logger.info("%s Current version: %s", sys.argv[0], pkg[0].version)
+
+    # Get the metaschema to validate the schema
+    metaschema_names, metaschema_doc, metaschema_loader = schema.get_metaschema()
+
+    # Load schema document and resolve refs
+
+    schema_uri = args.schema
+    if not (
+        urllib.parse.urlparse(schema_uri)[0]
+        and urllib.parse.urlparse(schema_uri)[0] in [u"http", u"https", u"file"]
+    ):
+        schema_uri = file_uri(os.path.abspath(schema_uri))
+    schema_raw_doc = metaschema_loader.fetch(schema_uri)
+
+    try:
+        schema_doc, schema_metadata = metaschema_loader.resolve_all(
+            schema_raw_doc, schema_uri
+        )
+    except ValidationException as e:
+        _logger.error(
+            "Schema `%s` failed link checking:\n%s",
+            args.schema,
+            Text(e),
+            exc_info=(True if args.debug else False),
+        )
+        _logger.debug("Index is %s", list(metaschema_loader.idx.keys()))
+        _logger.debug("Vocabulary is %s", list(metaschema_loader.vocab.keys()))
+        return 1
+    except (RuntimeError) as e:
+        _logger.error(
+            "Schema `%s` read error:\n%s",
+            args.schema,
+            Text(e),
+            exc_info=(True if args.debug else False),
+        )
+        return 1
+
+    if args.print_doc:
+        makedoc(args)
+        return 0
+
+    # Optionally print the schema after ref resolution
+    if not args.document and args.print_pre:
+        print(json_dumps(schema_doc, indent=4))
+        return 0
+
+    if not args.document and args.print_index:
+        print(json_dumps(list(metaschema_loader.idx.keys()), indent=4))
+        return 0
+
+    # Validate the schema document against the metaschema
+    try:
+        schema.validate_doc(
+            metaschema_names, schema_doc, metaschema_loader, args.strict
+        )
+    except ValidationException as e:
+        _logger.error("While validating schema `%s`:\n%s", args.schema, Text(e))
+        return 1
+
+    # Get the json-ld context and RDFS representation from the schema
+    metactx = schema.collect_namespaces(schema_metadata)
+    if "$base" in schema_metadata:
+        metactx["@base"] = schema_metadata["$base"]
+    if isinstance(schema_doc, CommentedSeq):
+        (schema_ctx, rdfs) = jsonld_context.salad_to_jsonld_context(schema_doc, metactx)
+    else:
+        raise ValidationException(
+            "Expected a CommentedSeq, got {}: {}.".format(type(schema_doc), schema_doc)
+        )
+
+    # Create the loader that will be used to load the target document.
+    document_loader = Loader(schema_ctx, skip_schemas=args.skip_schemas)
+
+    if args.codegen:
+        codegen.codegen(
+            args.codegen,
+            cast(List[Dict[Text, Any]], schema_doc),
+            schema_metadata,
+            document_loader,
+            target=args.codegen_target,
+            examples=args.codegen_examples,
+        )
+        return 0
+
+    # Make the Avro validation that will be used to validate the target
+    # document
+    if isinstance(schema_doc, MutableSequence):
+        avsc_obj = schema.make_avro(schema_doc, document_loader)
+        try:
+            avsc_names = schema.make_avro_schema_from_avro(avsc_obj)
+        except SchemaParseException as err:
+            _logger.error(
+                "Schema `%s` error:\n%s",
+                args.schema,
+                Text(err),
+                exc_info=((type(err), err, None) if args.debug else None),
+            )
+            if args.print_avro:
+                print(json_dumps(avsc_obj, indent=4))
+            return 1
+    else:
+        _logger.error("Schema `%s` must be a list.", args.schema)
+        return 1
+
+    # Optionally print Avro-compatible schema from schema
+    if args.print_avro:
+        print(json_dumps(avsc_obj, indent=4))
+        return 0
+
+    # Optionally print the json-ld context from the schema
+    if args.print_jsonld_context:
+        j = {"@context": schema_ctx}
+        print(json_dumps(j, indent=4, sort_keys=True))
+        return 0
+
+    # Optionally print the RDFS graph from the schema
+    if args.print_rdfs:
+        print(rdfs.serialize(format=args.rdf_serializer).decode("utf-8"))
+        return 0
+
+    if args.print_metadata and not args.document:
+        print(json_dumps(schema_metadata, indent=4))
+        return 0
+
+    if args.print_inheritance_dot:
+        schema.print_inheritance(schema_doc, sys.stdout)
+        return 0
+
+    if args.print_fieldrefs_dot:
+        schema.print_fieldrefs(schema_doc, document_loader, sys.stdout)
+        return 0
+
+    # If no document specified, all done.
+    if not args.document:
+        print("Schema `{}` is valid".format(args.schema))
+        return 0
+
+    # Load target document and resolve refs
+    try:
+        uri = args.document
+        document, doc_metadata = document_loader.resolve_ref(
+            uri, strict_foreign_properties=args.strict_foreign_properties
+        )
+    except ValidationException as e:
+        msg = to_one_line_messages(e) if args.print_oneline else six.text_type(e)
+        _logger.error(
+            "Document `%s` failed validation:\n%s",
+            args.document,
+            msg,
+            exc_info=args.debug,
+        )
+        return 1
+
+    # Optionally print the document after ref resolution
+    if args.print_pre:
+        print(json_dumps(document, indent=4))
+        return 0
+
+    if args.print_index:
+        print(json_dumps(list(document_loader.idx.keys()), indent=4))
+        return 0
+
+    # Validate the user document against the schema
+    try:
+        schema.validate_doc(
+            avsc_names,
+            document,
+            document_loader,
+            args.strict,
+            strict_foreign_properties=args.strict_foreign_properties,
+        )
+    except ValidationException as e:
+        msg = to_one_line_messages(e) if args.print_oneline else six.text_type(e)
+        _logger.error("While validating document `%s`:\n%s" % (args.document, msg))
+        return 1
+
+    # Optionally convert the document to RDF
+    if args.print_rdf:
+        if isinstance(document, (Mapping, MutableSequence)):
+            printrdf(args.document, document, schema_ctx, args.rdf_serializer)
+            return 0
+        else:
+            print("Document must be a dictionary or list.")
+            return 1
+
+    if args.print_metadata:
+        print(json_dumps(doc_metadata, indent=4))
+        return 0
+
+    print("Document `{}` is valid".format(args.document))
+
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main(sys.argv[1:]))